summaryrefslogtreecommitdiffstats
path: root/openpgp
diff options
context:
space:
mode:
authorNeal H. Walfield <neal@pep.foundation>2019-05-11 17:23:57 +0200
committerNeal H. Walfield <neal@pep.foundation>2019-05-11 17:23:57 +0200
commite363549906b457bb829d51593c6da7b0767abc8f (patch)
tree9a632c760904093c73ae5f0bd1a8256859055b21 /openpgp
parente70ffd5c4fbe72c4fc7d9b465d786e6306e6d045 (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')
-rw-r--r--openpgp/src/tpk/grammar.lalrpop7
-rw-r--r--openpgp/src/tpk/lexer.rs7
-rw-r--r--openpgp/src/tpk/mod.rs1
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(