diff options
author | Neal H. Walfield <neal@pep.foundation> | 2019-05-11 17:23:57 +0200 |
---|---|---|
committer | Neal H. Walfield <neal@pep.foundation> | 2019-05-11 17:23:57 +0200 |
commit | e363549906b457bb829d51593c6da7b0767abc8f (patch) | |
tree | 9a632c760904093c73ae5f0bd1a8256859055b21 /openpgp/src | |
parent | e70ffd5c4fbe72c4fc7d9b465d786e6306e6d045 (diff) |
openpgp: Allow trust packets in TPKs
- Change the KeyringValidator to allow trust packets anywhere a
signature packet is allowed.
- This is needed to parse GnuPG Keyrings.
Diffstat (limited to 'openpgp/src')
-rw-r--r-- | openpgp/src/tpk/grammar.lalrpop | 7 | ||||
-rw-r--r-- | openpgp/src/tpk/lexer.rs | 7 | ||||
-rw-r--r-- | openpgp/src/tpk/mod.rs | 1 |
3 files changed, 14 insertions, 1 deletions
diff --git a/openpgp/src/tpk/grammar.lalrpop b/openpgp/src/tpk/grammar.lalrpop index 92ee318b..374fd242 100644 --- a/openpgp/src/tpk/grammar.lalrpop +++ b/openpgp/src/tpk/grammar.lalrpop @@ -116,7 +116,11 @@ OptionalSignatures: Option<Vec<Signature>> = { Token::Signature(None) => return None, tok => unreachable!("Expected signature token, got {:?}", tok), } - } + }, + + // A trust packet can go whereever a signature can go, but they + // are ignored. + <OptionalSignatures> TRUST, } OptionalComponents: Option<Vec<Component>> = { @@ -270,6 +274,7 @@ extern { USERID => lexer::Token::UserID(_), USER_ATTRIBUTE => lexer::Token::UserAttribute(_), SIGNATURE => lexer::Token::Signature(_), + TRUST => lexer::Token::Trust(_), UNKNOWN => lexer::Token::Unknown(_, _), } } diff --git a/openpgp/src/tpk/lexer.rs b/openpgp/src/tpk/lexer.rs index 9bae3b47..50e2f547 100644 --- a/openpgp/src/tpk/lexer.rs +++ b/openpgp/src/tpk/lexer.rs @@ -36,6 +36,9 @@ pub enum Token { /// A `Signature` packet. Signature(Option<Packet>), + /// A `Trust` packet + Trust(Option<Packet>), + /// An `Unknown` packet. Unknown(Tag, Option<Packet>), } @@ -62,6 +65,7 @@ impl<'a> From<&'a Token> for Tag { &Token::UserID(_) => Tag::UserID, &Token::UserAttribute(_) => Tag::UserAttribute, &Token::Signature(_) => Tag::Signature, + &Token::Trust(_) => Tag::Trust, &Token::Unknown(tag, _) => tag, } } @@ -83,6 +87,7 @@ impl From<Token> for Option<Packet> { Token::UserID(p @ Some(_)) => p, Token::UserAttribute(p @ Some(_)) => p, Token::Signature(p @ Some(_)) => p, + Token::Trust(p @ Some(_)) => p, Token::Unknown(_, p @ Some(_)) => p, Token::PublicKey(None) @@ -92,6 +97,7 @@ impl From<Token> for Option<Packet> { | Token::UserID(None) | Token::UserAttribute(None) | Token::Signature(None) + | Token::Trust(None) | Token::Unknown(_, None) => None, } @@ -108,6 +114,7 @@ impl From<Packet> for Option<Token> { p @ Packet::UserID(_) => Some(Token::UserID(Some(p))), p @ Packet::UserAttribute(_) => Some(Token::UserAttribute(Some(p))), p @ Packet::Signature(_) => Some(Token::Signature(Some(p))), + p @ Packet::Trust(_) => Some(Token::Trust(Some(p))), p @ Packet::Unknown(_) => Some(Token::Unknown(p.tag(), Some(p))), _ => None, } diff --git a/openpgp/src/tpk/mod.rs b/openpgp/src/tpk/mod.rs index 0b8e7c3e..c00d6775 100644 --- a/openpgp/src/tpk/mod.rs +++ b/openpgp/src/tpk/mod.rs @@ -248,6 +248,7 @@ impl KeyringValidator { Tag::UserID => Token::UserID(None), Tag::UserAttribute => Token::UserAttribute(None), Tag::Signature => Token::Signature(None), + Tag::Trust => Token::Trust(None), _ => { // Unknown token. self.error = Some(TPKParserError::OpenPGP( |