1use std::io;
2use std::mem;
3use std::vec;
4
5use buffered_reader::BufferedReader;
6use lalrpop_util::ParseError;
7
8use crate::{
9 Error,
10 KeyHandle,
11 packet::Tag,
12 Packet,
13 parse::{
14 Cookie,
15 Parse,
16 PacketParserResult,
17 PacketParser
18 },
19 Result,
20 cert::bundle::ComponentBundle,
21 Cert,
22};
23
24mod low_level;
25use low_level::{
26 Lexer,
27 CertParser as CertLowLevelParser,
28 CertParserError,
29 Token,
30 parse_error_downcast,
31};
32
33const TRACE : bool = false;
34
35#[derive(Debug)]
39pub(crate) enum KeyringValidity {
40 Keyring,
42 KeyringPrefix,
44 Error(anyhow::Error),
46}
47
48#[allow(unused)]
49impl KeyringValidity {
50 pub fn is_keyring(&self) -> bool {
55 matches!(self, KeyringValidity::Keyring)
56 }
57
58 pub fn is_keyring_prefix(&self) -> bool {
63 matches!(self, KeyringValidity::KeyringPrefix)
64 }
65
66 pub fn is_err(&self) -> bool {
69 matches!(self, KeyringValidity::Error(_))
70 }
71}
72
73#[derive(Debug)]
75pub(crate) struct KeyringValidator {
76 tokens: Vec<Token>,
77 n_keys: usize,
78 n_packets: usize,
79 finished: bool,
80
81 error: Option<CertParserError>,
83}
84
85impl Default for KeyringValidator {
86 fn default() -> Self {
87 KeyringValidator::new()
88 }
89}
90
91#[allow(unused)]
92impl KeyringValidator {
93 pub fn new() -> Self {
95 KeyringValidator {
96 tokens: vec![],
97 n_keys: 0,
98 n_packets: 0,
99 finished: false,
100 error: None,
101 }
102 }
103
104 pub fn is_keyring(&self) -> bool {
109 self.check().is_keyring()
110 }
111
112 pub fn is_keyring_prefix(&self) -> bool {
118 self.check().is_keyring_prefix()
119 }
120
121 pub fn is_err(&self) -> bool {
124 self.check().is_err()
125 }
126
127 pub fn push_token(&mut self, token: Token) {
129 assert!(!self.finished);
130
131 if self.error.is_some() {
132 return;
133 }
134
135 if let Token::PublicKey(_) | Token::SecretKey(_) = token {
136 self.tokens.clear();
137 self.n_keys += 1;
138 }
139
140 self.n_packets += 1;
141 match (&token, self.tokens.last()) {
142 (Token::Signature(None), Some(Token::Signature(None))) => {
143 },
146 _ => self.tokens.push(token),
147 }
148 }
149
150 pub fn push(&mut self, tag: Tag) {
152 let token = match tag {
153 Tag::PublicKey => Token::PublicKey(None),
154 Tag::SecretKey => Token::SecretKey(None),
155 Tag::PublicSubkey => Token::PublicSubkey(None),
156 Tag::SecretSubkey => Token::SecretSubkey(None),
157 Tag::UserID => Token::UserID(None),
158 Tag::UserAttribute => Token::UserAttribute(None),
159 Tag::Signature => Token::Signature(None),
160 Tag::Trust => Token::Trust(None),
161 Tag::Marker => {
162 return;
166 },
167 Tag::Unknown(_) => Token::Unknown(tag, None),
168 Tag::Private(_) => Token::Unknown(tag, None),
169 _ => {
170 self.error = Some(CertParserError::OpenPGP(
172 Error::MalformedMessage(
173 format!("Invalid Cert: {:?} packet (#{}) not expected",
174 tag, self.n_packets))));
175 self.tokens.clear();
176 return;
177 }
178 };
179
180 self.push_token(token)
181 }
182
183 pub fn finish(&mut self) {
190 assert!(!self.finished);
191 self.finished = true;
192 }
193
194 pub fn check(&self) -> KeyringValidity {
211 if let Some(ref err) = self.error {
212 return KeyringValidity::Error((*err).clone().into());
213 }
214
215 let r = CertLowLevelParser::new().parse(
216 Lexer::from_tokens(&self.tokens));
217
218 if self.finished {
219 match r {
220 Ok(_) => KeyringValidity::Keyring,
221 Err(err) =>
222 KeyringValidity::Error(
223 CertParserError::Parser(parse_error_downcast(err)).into()),
224 }
225 } else {
226 match r {
227 Ok(_) => KeyringValidity::KeyringPrefix,
228 Err(ParseError::UnrecognizedEof { .. }) =>
229 KeyringValidity::KeyringPrefix,
230 Err(err) =>
231 KeyringValidity::Error(
232 CertParserError::Parser(parse_error_downcast(err)).into()),
233 }
234 }
235 }
236}
237
238#[derive(Debug)]
240#[allow(unused)]
241pub(crate) enum CertValidity {
242 Cert,
244 CertPrefix,
246 Error(anyhow::Error),
248}
249
250#[allow(unused)]
251impl CertValidity {
252 pub fn is_cert(&self) -> bool {
257 matches!(self, CertValidity::Cert)
258 }
259
260 pub fn is_cert_prefix(&self) -> bool {
265 matches!(self, CertValidity::CertPrefix)
266 }
267
268 pub fn is_err(&self) -> bool {
271 matches!(self, CertValidity::Error(_))
272 }
273}
274
275#[derive(Debug)]
277pub(crate) struct CertValidator(KeyringValidator);
278
279impl Default for CertValidator {
280 fn default() -> Self {
281 CertValidator::new()
282 }
283}
284
285impl CertValidator {
286 pub fn new() -> Self {
288 CertValidator(Default::default())
289 }
290
291 #[cfg(test)]
293 pub fn push_token(&mut self, token: Token) {
294 self.0.push_token(token)
295 }
296
297 pub fn push(&mut self, tag: Tag) {
299 self.0.push(tag)
300 }
301
302 pub fn finish(&mut self) {
309 self.0.finish()
310 }
311
312 pub fn check(&self) -> CertValidity {
327 if self.0.n_keys > 1 {
328 return CertValidity::Error(Error::MalformedMessage(
329 "More than one key found, this is a keyring".into()).into());
330 }
331
332 match self.0.check() {
333 KeyringValidity::Keyring => CertValidity::Cert,
334 KeyringValidity::KeyringPrefix => CertValidity::CertPrefix,
335 KeyringValidity::Error(e) => CertValidity::Error(e),
336 }
337 }
338}
339
340#[derive(Default)]
500pub struct CertParser<'a> {
501 source: Option<Box<dyn Iterator<Item=Result<Packet>> + 'a + Send + Sync>>,
502 packets: Vec<Packet>,
503 queued_error: Option<anyhow::Error>,
504 filter: Vec<Box<dyn Send + Sync + Fn(&Cert, bool) -> bool + 'a>>,
505}
506assert_send_and_sync!(CertParser<'_>);
507
508impl<'a> From<PacketParserResult<'a>> for CertParser<'a>
512{
513 fn from(ppr: PacketParserResult<'a>) -> Self {
515 use std::io::ErrorKind::UnexpectedEof;
516 let mut parser : Self = Default::default();
517 if let PacketParserResult::Some(pp) = ppr {
518 let mut ppp : Box<Option<PacketParser>> = Box::new(Some(pp));
519 let mut retry_with_reader = Box::new(None);
520 parser.source = Some(
521 Box::new(std::iter::from_fn(move || {
522 tracer!(TRACE, "PacketParserResult::next", 0);
523 if let Some(reader) = retry_with_reader.take() {
524 match PacketParser::from_cookie_reader(reader) {
526 Ok(PacketParserResult::Some(pp)) => {
527 *ppp = Some(pp);
530 },
531 Ok(PacketParserResult::EOF(_)) =>
532 (), Err(err) => {
534 if let Some(e) = err.downcast_ref::<io::Error>()
536 {
537 if e.kind() == UnexpectedEof {
538 return None;
539 }
540 }
541 return Some(Err(err));
542 },
543 }
544 }
545
546 if let Some(mut pp) = ppp.take() {
547 if let Packet::Unknown(_) = pp.packet {
548 if let Err(e) = pp.buffer_unread_content() {
552 return Some(Err(e));
553 }
554 }
555
556 match pp.next() {
557 Ok((packet, ppr)) => {
558 match ppr {
559 PacketParserResult::Some(pp) =>
560 *ppp = Some(pp),
561 PacketParserResult::EOF(eof) =>
562 *retry_with_reader =
563 Some(eof.into_reader()),
564 }
565 t!("PacketParser::next yielded a {}",
566 packet.tag());
567 Some(Ok(packet))
568 },
569 Err(err) => {
570 t!("PacketParser::next returned an error: {}.",
571 err);
572 Some(Err(err))
573 }
574 }
575 } else {
576 None
577 }
578 })));
579 }
580 parser
581 }
582}
583
584impl<'a> From<Vec<Result<Packet>>> for CertParser<'a> {
585 fn from(p: Vec<Result<Packet>>) -> CertParser<'a> {
586 CertParser::from_iter(p)
587 }
588}
589
590impl<'a> From<Vec<Packet>> for CertParser<'a> {
591 fn from(p: Vec<Packet>) -> CertParser<'a> {
592 CertParser::from_iter(p)
593 }
594}
595
596impl<'a> Parse<'a, CertParser<'a>> for CertParser<'a>
597{
598 fn from_buffered_reader<R>(reader: R) -> Result<CertParser<'a>>
600 where
601 R: BufferedReader<Cookie> + 'a,
602 {
603 Ok(Self::from(PacketParser::from_buffered_reader(reader.into_boxed())?))
604 }
605}
606
607impl<'a> crate::seal::Sealed for CertParser<'a> {}
608
609impl<'a> CertParser<'a> {
610 pub fn from_iter<I, J>(iter: I) -> Self
664 where I: 'a + IntoIterator<Item=J>,
665 J: 'a + Into<Result<Packet>>,
666 <I as IntoIterator>::IntoIter: Send + Sync,
667 {
668 Self {
669 source: Some(Box::new(iter.into_iter().map(Into::into))),
670 ..Default::default()
671 }
672 }
673
674 pub fn unvalidated_cert_filter<F>(mut self, filter: F) -> Self
743 where F: 'a + Send + Sync + Fn(&Cert, bool) -> bool
744 {
745 self.filter.push(Box::new(filter));
746 self
747 }
748
749 fn parse(&mut self, p: Packet) -> Result<Option<Cert>> {
754 tracer!(TRACE, "CertParser::parse", 0);
755 match p {
756 Packet::Marker(_) => {
757 return Ok(None);
761 },
762 Packet::Padding(_) => {
763 return Ok(None);
766 },
767 p if Cert::valid_packet(&p).is_err()
768 && ! p.tag().is_critical() =>
769 {
770 return Ok(None);
773 },
774 _ => {},
775 }
776
777 if !self.packets.is_empty() {
778 if self.packets.len() == 1 {
779 if let Err(err) = Cert::valid_start(&self.packets[0]) {
780 t!("{}", err);
781 return self.cert(Some(p));
782 }
783 }
784
785 if Cert::valid_start(&p).is_ok() {
786 t!("Encountered the start of a new certificate ({}), \
787 finishing buffered certificate", p.tag());
788 return self.cert(Some(p));
789 } else if let Err(err) = Cert::valid_packet(&p) {
790 t!("Encountered an invalid packet ({}), \
791 finishing buffered certificate: {}",
792 p.tag(), err);
793 return self.cert(Some(p));
794 }
795 }
796
797 self.packets.push(p);
798 Ok(None)
799 }
800
801 fn reset(&mut self) -> Self {
805 let mut orig = mem::take(self);
807 self.source = orig.source.take();
808 mem::swap(&mut self.filter, &mut orig.filter);
809 orig
810 }
811
812 fn cert(&mut self, pk: Option<Packet>) -> Result<Option<Cert>> {
817 tracer!(TRACE, "CertParser::cert", 0);
818 let orig = self.reset();
819
820 if let Some(pk) = pk {
821 self.packets.push(pk);
822 }
823
824 let n_packets = orig.packets.len();
825 t!("Finalizing certificate with {} packets", n_packets);
826
827 let mut failed = false;
829 let mut packets: Vec<Packet> = Vec::with_capacity(0);
830 let mut tokens: Vec<Token> = Vec::with_capacity(n_packets);
831 for p in orig.packets {
832 if failed {
833 packets.push(p);
835 } else {
836 match p.try_into() {
837 Ok(t) => tokens.push(t),
838 Err(p) => {
839 packets.reserve(n_packets);
841 for t in tokens.drain(..) {
842 packets.push({
843 let p: Option<Packet> = t.into();
844 p.expect("token created with packet")
845 });
846 }
847 packets.push(p);
848 failed = true;
849 },
850 }
851 }
852 }
853
854 if failed {
855 let err = Error::UnsupportedCert(
858 "Packet sequence includes non-Cert packets.".into(),
859 packets);
860 t!("Invalid certificate: {}", err);
861 return Err(err.into());
862 }
863 t!("{} tokens: {:?}", tokens.len(), tokens);
864
865 let certo = match CertLowLevelParser::new()
866 .parse(Lexer::from_tokens(&tokens))
867 {
868 Ok(certo) => certo,
869 Err(err) => {
870 let err = low_level::parse_error_to_openpgp_error(
871 low_level::parse_error_downcast(err));
872 t!("Low level parser: {}", err);
873 return Err(err.into());
874 }
875 }.and_then(|cert| {
876 for filter in &self.filter {
877 if !filter(&cert, true) {
878 t!("Rejected by filter");
879 return None;
880 }
881 }
882
883 Some(cert)
884 }).and_then(|mut cert| {
885 let primary_fp: KeyHandle = cert.key_handle();
886
887 split_sigs(&primary_fp, &mut cert.primary);
891
892 for b in cert.userids.iter_mut() {
893 split_sigs(&primary_fp, b);
894 }
895 for b in cert.user_attributes.iter_mut() {
896 split_sigs(&primary_fp, b);
897 }
898 for b in cert.subkeys.iter_mut() {
899 split_sigs(&primary_fp, b);
900 }
901
902 let cert = cert.canonicalize();
903
904 for filter in &self.filter {
906 if !filter(&cert, true) {
907 t!("Rejected by filter");
908 return None;
909 }
910 }
911
912 Some(cert)
913 });
914
915 t!("Returning {:?}, constructed from {} packets",
916 certo.as_ref().map(|c| c.fingerprint()),
917 n_packets);
918
919 Ok(certo)
920 }
921}
922
923fn split_sigs<C>(primary: &KeyHandle, b: &mut ComponentBundle<C>)
926{
927 debug_assert!(b.self_signatures.is_empty());
928 debug_assert!(b.self_revocations.is_empty());
929 debug_assert!(b.other_revocations.is_empty());
930
931 for sig in mem::replace(&mut b.certifications, Vec::with_capacity(0)) {
932 let typ = sig.typ();
933
934 let issuers = sig.get_issuers();
935 let is_selfsig =
936 issuers.is_empty()
937 || issuers.iter().any(|kh| kh.aliases(primary));
938
939 use crate::SignatureType::*;
940 if typ == CertificationApproval {
941 b.attestations.push(sig);
942 } else if typ == KeyRevocation
943 || typ == SubkeyRevocation
944 || typ == CertificationRevocation
945 {
946 if is_selfsig {
947 b.self_revocations.push(sig);
948 } else {
949 b.other_revocations.push(sig);
950 }
951 } else if is_selfsig {
952 b.self_signatures.push(sig);
953 } else {
954 b.certifications.push(sig);
955 }
956 }
957}
958
959impl<'a> Iterator for CertParser<'a> {
960 type Item = Result<Cert>;
961
962 fn next(&mut self) -> Option<Self::Item> {
963 tracer!(TRACE, "CertParser::next", 0);
964 if let Some(err) = self.queued_error.take() {
965 t!("Returning queued error: {}", err);
966 return Some(Err(err));
967 }
968
969 loop {
970 match self.source.take() {
971 None => {
972 t!("EOF.");
973
974 if self.packets.is_empty() {
975 return None;
976 }
977 match self.cert(None) {
978 Ok(Some(cert)) => return Some(Ok(cert)),
979 Ok(None) => return None,
980 Err(err) => return Some(Err(err)),
981 }
982 },
983 Some(mut iter) => {
984 let r = match iter.next() {
985 Some(Ok(packet)) => {
986 t!("Got packet #{} ({}{})",
987 self.packets.len(), packet.tag(),
988 match &packet {
989 Packet::PublicKey(k) =>
990 Some(k.fingerprint().to_hex()),
991 Packet::SecretKey(k) =>
992 Some(k.fingerprint().to_hex()),
993 Packet::PublicSubkey(k) =>
994 Some(k.fingerprint().to_hex()),
995 Packet::SecretSubkey(k) =>
996 Some(k.fingerprint().to_hex()),
997 Packet::UserID(u) =>
998 Some(String::from_utf8_lossy(u.value())
999 .into()),
1000 Packet::Signature(s) =>
1001 Some(format!("{}", s.typ())),
1002 _ => None,
1003 }
1004 .map(|s| format!(", {}", s))
1005 .unwrap_or_else(|| "".into())
1006 );
1007 self.source = Some(iter);
1008 self.parse(packet)
1009 }
1010 Some(Err(err)) => {
1011 self.source = Some(iter);
1012
1013 t!("Error getting packet: {}", err);
1014
1015 if ! self.packets.is_empty() {
1016 match self.cert(None) {
1018 Ok(Some(cert)) => {
1019 self.queued_error = Some(err);
1020 return Some(Ok(cert));
1021 }
1022 Ok(None) => {
1023 return Some(Err(err));
1024 }
1025 Err(err2) => {
1026 self.queued_error = Some(err2);
1029 return Some(Err(err));
1030 }
1031 }
1032 } else {
1033 return Some(Err(err));
1034 }
1035 }
1036 None if self.packets.is_empty() => {
1037 t!("Packet iterator was empty");
1038 Ok(None)
1039 }
1040 None => {
1041 t!("Packet iterator exhausted after {} packets",
1042 self.packets.len());
1043 self.cert(None)
1044 }
1045 };
1046
1047 match r {
1048 Ok(Some(cert)) => {
1049 t!(" => {}", cert.fingerprint());
1050 return Some(Ok(cert));
1051 }
1052 Ok(None) => (),
1053 Err(err) => return Some(Err(err)),
1054 }
1055 },
1056 }
1057 }
1058 }
1059}
1060
1061#[cfg(test)]
1062mod test {
1063 use super::*;
1064
1065 use std::collections::HashSet;
1066 use std::iter::FromIterator;
1067
1068 use crate::Fingerprint;
1069 use crate::cert::prelude::*;
1070 use crate::packet::prelude::*;
1071 use crate::parse::Dearmor;
1072 use crate::parse::PacketParserBuilder;
1073 use crate::parse::RECOVERY_THRESHOLD;
1074 use crate::serialize::Serialize;
1075 use crate::types::DataFormat;
1076
1077 use crate::tests;
1078
1079 #[test]
1080 fn push_tokens() {
1081 use crate::cert::parser::low_level::lexer::{Token, Lexer};
1082 use crate::cert::parser::low_level::lexer::Token::*;
1083 use crate::cert::parser::low_level::CertParser;
1084
1085 struct TestVector<'a> {
1086 s: &'a [Token],
1087 result: bool,
1088 }
1089
1090 let test_vectors = [
1091 TestVector {
1092 s: &[ PublicKey(None) ],
1093 result: true,
1094 },
1095 TestVector {
1096 s: &[ SecretKey(None) ],
1097 result: true,
1098 },
1099 TestVector {
1100 s: &[ PublicKey(None), Signature(None) ],
1101 result: true,
1102 },
1103 TestVector {
1104 s: &[ PublicKey(None), Signature(None), Signature(None) ],
1105 result: true,
1106 },
1107
1108 TestVector {
1109 s: &[ PublicKey(None), Signature(None), Signature(None),
1110 UserID(None) ],
1111 result: true,
1112 },
1113 TestVector {
1114 s: &[ PublicKey(None), Signature(None), Signature(None),
1115 UserID(None), Signature(None) ],
1116 result: true,
1117 },
1118 TestVector {
1119 s: &[ PublicKey(None), Signature(None), Signature(None),
1120 UserAttribute(None) ],
1121 result: true,
1122 },
1123 TestVector {
1124 s: &[ PublicKey(None), Signature(None), Signature(None),
1125 UserAttribute(None), Signature(None) ],
1126 result: true,
1127 },
1128 TestVector {
1129 s: &[ PublicKey(None), Signature(None), Signature(None),
1130 PublicSubkey(None) ],
1131 result: true,
1132 },
1133 TestVector {
1134 s: &[ PublicKey(None), Signature(None), Signature(None),
1135 PublicSubkey(None), Signature(None) ],
1136 result: true,
1137 },
1138 TestVector {
1139 s: &[ PublicKey(None), Signature(None), Signature(None),
1140 SecretSubkey(None) ],
1141 result: true,
1142 },
1143 TestVector {
1144 s: &[ PublicKey(None), Signature(None), Signature(None),
1145 SecretSubkey(None), Signature(None) ],
1146 result: true,
1147 },
1148
1149 TestVector {
1150 s: &[ PublicKey(None), Signature(None), Signature(None),
1151 SecretSubkey(None), Signature(None),
1152 SecretSubkey(None), Signature(None),
1153 SecretSubkey(None), Signature(None),
1154 SecretSubkey(None), Signature(None),
1155 SecretSubkey(None), Signature(None),
1156 UserID(None), Signature(None),
1157 Signature(None), Signature(None),
1158 SecretSubkey(None), Signature(None),
1159 UserAttribute(None), Signature(None),
1160 Signature(None), Signature(None),
1161 SecretSubkey(None), Signature(None),
1162 UserID(None),
1163 UserAttribute(None), Signature(None),
1164 Signature(None), Signature(None),
1165 ],
1166 result: true,
1167 },
1168
1169 TestVector {
1170 s: &[ PublicKey(None), Signature(None), Signature(None),
1171 PublicKey(None), Signature(None), Signature(None),
1172 ],
1173 result: false,
1174 },
1175 TestVector {
1176 s: &[ PublicKey(None), Signature(None), Signature(None),
1177 SecretKey(None), Signature(None), Signature(None),
1178 ],
1179 result: false,
1180 },
1181 TestVector {
1182 s: &[ SecretKey(None), Signature(None), Signature(None),
1183 SecretKey(None), Signature(None), Signature(None),
1184 ],
1185 result: false,
1186 },
1187 TestVector {
1188 s: &[ SecretKey(None), Signature(None), Signature(None),
1189 PublicKey(None), Signature(None), Signature(None),
1190 ],
1191 result: false,
1192 },
1193 TestVector {
1194 s: &[ SecretSubkey(None), Signature(None), Signature(None),
1195 PublicSubkey(None), Signature(None), Signature(None),
1196 ],
1197 result: false,
1198 },
1199 TestVector {
1200 s: &[ SecretKey(None), Signature(None),
1201 UserID(None), Signature(None),
1202 SecretSubkey(None), Signature(None),
1203 SecretSubkey(None), Signature(None),
1204 Unknown(Tag::Private(61), None),
1205 ],
1206 result: true,
1207 },
1208 ];
1209
1210 for v in &test_vectors {
1211 if v.result {
1212 let mut l = CertValidator::new();
1213 for token in v.s.into_iter() {
1214 l.push_token((*token).clone());
1215 assert_match!(CertValidity::CertPrefix = l.check());
1216 }
1217
1218 l.finish();
1219 assert_match!(CertValidity::Cert = l.check());
1220 }
1221
1222 match CertParser::new().parse(Lexer::from_tokens(v.s)) {
1223 Ok(r) => assert!(v.result, "Parsing: {:?} => {:?}", v.s, r),
1224 Err(e) => assert!(! v.result, "Parsing: {:?} => {:?}", v.s, e),
1225 }
1226 }
1227 }
1228
1229 #[test]
1230 fn push_tags() {
1231 use Tag::*;
1232
1233 struct TestVector<'a> {
1234 s: &'a [Tag],
1235 result: bool,
1236 }
1237
1238 let test_vectors = [
1239 TestVector {
1240 s: &[ PublicKey ],
1241 result: true,
1242 },
1243 TestVector {
1244 s: &[ SecretKey, Signature,
1245 UserID, Signature,
1246 SecretSubkey, Signature,
1247 SecretSubkey, Signature,
1248 Tag::Private(61),
1249 ],
1250 result: true,
1251 },
1252 TestVector {
1253 s: &[ SecretKey, Signature,
1254 UserID, Signature,
1255 SecretSubkey, Signature,
1256 SecretSubkey, Signature,
1257 Tag::Unknown(61),
1258 ],
1259 result: true,
1260 },
1261 TestVector {
1262 s: &[ SecretKey, Signature,
1263 UserID, Signature,
1264 SecretSubkey, Signature,
1265 SecretSubkey, Signature,
1266 Tag::Unknown(61),
1267 SecretKey, Signature,
1268 UserID, Signature,
1269 SecretSubkey, Signature,
1270 SecretSubkey, Signature,
1271 ],
1272 result: false,
1274 },
1275 ];
1276
1277 for v in &test_vectors {
1278 if v.result {
1279 let mut l = CertValidator::new();
1280 for &tag in v.s.into_iter() {
1281 l.push(tag.clone());
1282 assert_match!(CertValidity::CertPrefix = l.check());
1283 }
1284
1285 l.finish();
1286 assert_match!(CertValidity::Cert = l.check());
1287 }
1288 }
1289 }
1290
1291 #[test]
1292 fn marker_packet_ignored() {
1293 use crate::serialize::Serialize;
1294 let mut testy_with_marker = Vec::new();
1295 Packet::Marker(Default::default())
1296 .serialize(&mut testy_with_marker).unwrap();
1297 testy_with_marker.extend_from_slice(crate::tests::key("testy.pgp"));
1298 CertParser::from(
1299 PacketParser::from_bytes(&testy_with_marker).unwrap())
1300 .next().unwrap().unwrap();
1301
1302 let mut testy_with_marker = Vec::new();
1303 testy_with_marker.extend_from_slice(crate::tests::key("testy.pgp"));
1304 Packet::Marker(Default::default())
1305 .serialize(&mut testy_with_marker).unwrap();
1306 CertParser::from(
1307 PacketParser::from_bytes(&testy_with_marker).unwrap())
1308 .next().unwrap().unwrap();
1309 }
1310
1311 #[test]
1312 fn invalid_packets() -> Result<()> {
1313 tracer!(TRACE, "invalid_packets", 0);
1314
1315 fn cert_cmp(a: &Result<Cert>, b: &Vec<Packet>)
1316 {
1317 let a =
1318 a.as_ref().unwrap().clone().into_packets().collect::<Vec<_>>();
1319
1320 for (i, (a, b)) in a.iter().zip(b).enumerate() {
1321 if a != b {
1322 panic!("Differ at element #{}:\n {:?}\n {:?}",
1323 i, a, b);
1324 }
1325 }
1326 if a.len() != b.len() {
1327 panic!("Different lengths (common prefix identical): {} vs. {}",
1328 a.len(), b.len());
1329 }
1330 }
1331
1332 let (cert, _) =
1333 CertBuilder::general_purpose(Some("alice@example.org"))
1334 .generate()?;
1335 let cert = cert.into_packets().collect::<Vec<_>>();
1336
1337 let userid : Packet = cert.clone()
1339 .into_iter()
1340 .filter(|p| p.tag() == Tag::UserID)
1341 .next()
1342 .unwrap();
1343
1344 let tag = Tag::Private(61);
1346 let unknown : Packet
1347 = Unknown::new(tag, Error::UnsupportedPacketType(tag).into())
1348 .into();
1349
1350 let mut lit = Literal::new(DataFormat::Unicode);
1352 lit.set_body(b"test".to_vec());
1353 let lit = Packet::from(lit);
1354
1355 let cd = {
1358 use crate::types::CompressionAlgorithm;
1359 use crate::packet;
1360 use crate::PacketPile;
1361 use crate::serialize::Serialize;
1362 use crate::parse::Parse;
1363
1364 let mut cd = CompressedData::new(
1365 CompressionAlgorithm::Uncompressed);
1366 let mut body = Vec::new();
1367 lit.serialize(&mut body)?;
1368 cd.set_body(packet::Body::Processed(body));
1369 let cd = Packet::from(cd);
1370
1371 let mut bytes = Vec::new();
1374 cd.serialize(&mut bytes)?;
1375
1376 let pp = PacketPile::from_bytes(&bytes[..])?;
1377
1378 assert_eq!(pp.descendants().count(), 2);
1379 assert_eq!(pp.path_ref(&[ 0 ]).unwrap().tag(),
1380 packet::Tag::CompressedData);
1381 assert_eq!(pp.path_ref(&[ 0, 0 ]), Some(&lit));
1382
1383 cd
1384 };
1385
1386 t!("A single cert.");
1387 let cp = CertParser::from_iter(cert.clone()).collect::<Vec<_>>();
1388 assert_eq!(cp.len(), 1);
1389 cert_cmp(&cp[0], &cert);
1390
1391 t!("Two certificates.");
1392 let cp = CertParser::from_iter(
1393 cert.clone().into_iter().chain(cert.clone())).collect::<Vec<_>>();
1394 assert_eq!(cp.len(), 2);
1395 cert_cmp(&cp[0], &cert);
1396 cert_cmp(&cp[1], &cert);
1397
1398 fn interleave(cert: &Vec<Packet>, p: &Packet) {
1399 t!("A certificate, a {}.", p.tag());
1400 let cp = CertParser::from_iter(
1401 cert.clone().into_iter()
1402 .chain(p.clone()))
1403 .collect::<Vec<_>>();
1404 assert_eq!(cp.len(), 2);
1405 cert_cmp(&cp[0], cert);
1406 assert!(cp[1].is_err());
1407
1408 t!("A certificate, two {}.", p.tag());
1409 let cp = CertParser::from_iter(
1410 cert.clone().into_iter()
1411 .chain(p.clone())
1412 .chain(p.clone()))
1413 .collect::<Vec<_>>();
1414 assert_eq!(cp.len(), 3);
1415 cert_cmp(&cp[0], cert);
1416 assert!(cp[1].is_err());
1417 assert!(cp[2].is_err());
1418
1419 t!("A {}, a certificate.", p.tag());
1420 let cp = CertParser::from_iter(
1421 p.clone().into_iter()
1422 .chain(cert.clone()))
1423 .collect::<Vec<_>>();
1424 assert_eq!(cp.len(), 2);
1425 assert!(cp[0].is_err());
1426 cert_cmp(&cp[1], cert);
1427
1428 t!("Two {}, a certificate.", p.tag());
1429 let cp = CertParser::from_iter(
1430 p.clone().into_iter()
1431 .chain(p.clone())
1432 .chain(cert.clone()))
1433 .collect::<Vec<_>>();
1434 assert_eq!(cp.len(), 3);
1435 assert!(cp[0].is_err());
1436 assert!(cp[1].is_err());
1437 cert_cmp(&cp[2], cert);
1438
1439 t!("Two {}, a certificate, two {}.", p.tag(), p.tag());
1440 let cp = CertParser::from_iter(
1441 p.clone().into_iter()
1442 .chain(p.clone())
1443 .chain(cert.clone())
1444 .chain(p.clone())
1445 .chain(p.clone()))
1446 .collect::<Vec<_>>();
1447 assert_eq!(cp.len(), 5);
1448 assert!(cp[0].is_err());
1449 assert!(cp[1].is_err());
1450 cert_cmp(&cp[2], cert);
1451 assert!(cp[3].is_err());
1452 assert!(cp[4].is_err());
1453
1454 t!("Two {}, two certificates, two {}, a certificate.");
1455 let cp = CertParser::from_iter(
1456 p.clone().into_iter()
1457 .chain(p.clone())
1458 .chain(cert.clone())
1459 .chain(cert.clone())
1460 .chain(p.clone())
1461 .chain(p.clone())
1462 .chain(cert.clone()))
1463 .collect::<Vec<_>>();
1464 assert_eq!(cp.len(), 7);
1465 assert!(cp[0].is_err());
1466 assert!(cp[1].is_err());
1467 cert_cmp(&cp[2], cert);
1468 cert_cmp(&cp[3], cert);
1469 assert!(cp[4].is_err());
1470 assert!(cp[5].is_err());
1471 cert_cmp(&cp[6], cert);
1472 }
1473
1474 interleave(&cert, &lit);
1475 interleave(&cert, &cd);
1479
1480
1481 let mut cert_plus = cert.clone();
1484 cert_plus.push(unknown.clone());
1485
1486 t!("A certificate, an unknown.");
1487 let cp = CertParser::from_iter(
1488 cert.clone().into_iter()
1489 .chain(unknown.clone()))
1490 .collect::<Vec<_>>();
1491 assert_eq!(cp.len(), 1);
1492 cert_cmp(&cp[0], &cert_plus);
1493
1494 t!("An unknown, a certificate.");
1495 let cp = CertParser::from_iter(
1496 unknown.clone().into_iter()
1497 .chain(cert.clone()))
1498 .collect::<Vec<_>>();
1499 assert_eq!(cp.len(), 2);
1500 assert!(cp[0].is_err());
1501 cert_cmp(&cp[1], &cert);
1502
1503 t!("A certificate, two unknowns.");
1504 let cp = CertParser::from_iter(
1505 cert.clone().into_iter()
1506 .chain(unknown.clone())
1507 .chain(unknown.clone()))
1508 .collect::<Vec<_>>();
1509 assert_eq!(cp.len(), 1);
1510 cert_cmp(&cp[0], &cert_plus);
1511
1512 t!("A certificate, an unknown, a certificate.");
1513 let cp = CertParser::from_iter(
1514 cert.clone().into_iter()
1515 .chain(unknown.clone())
1516 .chain(cert.clone()))
1517 .collect::<Vec<_>>();
1518 assert_eq!(cp.len(), 2);
1519 cert_cmp(&cp[0], &cert_plus);
1520 cert_cmp(&cp[1], &cert);
1521
1522
1523 t!("A Literal, two User IDs");
1524 let cp = CertParser::from_iter(
1525 lit.clone().into_iter()
1526 .chain(userid.clone())
1527 .chain(userid.clone()))
1528 .collect::<Vec<_>>();
1529 assert_eq!(cp.len(), 3);
1530 assert!(cp[0].is_err());
1531 assert!(cp[1].is_err());
1532 assert!(cp[2].is_err());
1533
1534 t!("A User ID, a certificate");
1535 let cp = CertParser::from_iter(
1536 userid.clone().into_iter()
1537 .chain(cert.clone()))
1538 .collect::<Vec<_>>();
1539 assert_eq!(cp.len(), 2);
1540 assert!(cp[0].is_err());
1541 cert_cmp(&cp[1], &cert);
1542
1543 t!("Two User IDs, a certificate");
1544 let cp = CertParser::from_iter(
1545 userid.clone().into_iter()
1546 .chain(userid.clone())
1547 .chain(cert.clone()))
1548 .collect::<Vec<_>>();
1549 assert_eq!(cp.len(), 3);
1550 assert!(cp[0].is_err());
1551 assert!(cp[1].is_err());
1552 cert_cmp(&cp[2], &cert);
1553
1554 Ok(())
1555 }
1556
1557 #[test]
1558 fn concatenated_armored_certs() -> Result<()> {
1559 let mut keyring = Vec::new();
1560 keyring.extend_from_slice(b"some\ntext\n");
1561 keyring.extend_from_slice(crate::tests::key("testy.asc"));
1562 keyring.extend_from_slice(crate::tests::key("testy.asc"));
1563 keyring.extend_from_slice(b"some\ntext\n");
1564 keyring.extend_from_slice(crate::tests::key("testy.asc"));
1565 keyring.extend_from_slice(b"some\ntext\n");
1566 let certs = CertParser::from_bytes(&keyring)?.collect::<Vec<_>>();
1567 assert_eq!(certs.len(), 3);
1568 assert!(certs.iter().all(|c| c.is_ok()));
1569 Ok(())
1570 }
1571
1572 fn parse_test(n: usize, literal: bool, bad: usize) -> Result<()> {
1573 tracer!(TRACE, "t", 0);
1574
1575 let nulls = vec![ 0; bad ];
1583
1584 t!("n: {}, literals: {}, bad data: {}",
1585 n, literal, bad);
1586
1587 let mut data = Vec::new();
1588
1589 let mut certs_orig = vec![];
1590 for i in 0..n {
1591 let (cert, _) =
1592 CertBuilder::general_purpose(
1593 Some(format!("{}@example.org", i)))
1594 .generate()?;
1595
1596 cert.as_tsk().serialize(&mut data)?;
1597 certs_orig.push(cert);
1598
1599 if literal {
1600 let mut lit = Literal::new(DataFormat::Unicode);
1601 lit.set_body(b"data".to_vec());
1602
1603 Packet::from(lit).serialize(&mut data)?;
1604 }
1605 data.extend(&nulls[..bad]);
1607 }
1608 if n == 0 {
1609 data.extend(&nulls[..bad]);
1611 }
1612 assert_eq!(certs_orig.len(), n);
1613
1614 t!("Start of data: {} {}",
1615 if let Some(x) = data.get(0) {
1616 format!("{:02X}", x)
1617 } else {
1618 "XX".into()
1619 },
1620 if let Some(x) = data.get(1) {
1621 format!("{:02X}", x)
1622 } else {
1623 "XX".into()
1624 });
1625
1626 let certs_parsed = CertParser::from_bytes(&data);
1627
1628 let certs_parsed = if n == 0 && bad > 0 {
1629 assert!(certs_parsed.is_err());
1632 return Ok(());
1633 } else {
1634 certs_parsed.expect("Valid init")
1635 };
1636 let certs_parsed: Vec<_> = certs_parsed.collect();
1637
1638 certs_parsed.iter().enumerate().for_each(|(i, r)| {
1639 t!("{}. {}",
1640 i,
1641 match r {
1642 Ok(c) => c.fingerprint().to_string(),
1643 Err(err) => err.to_string(),
1644 });
1645 });
1646
1647 let n = if bad > RECOVERY_THRESHOLD {
1648 certs_orig.drain(1..);
1650 std::cmp::min(n, 1)
1651 } else {
1652 n
1653 };
1654
1655 let modulus = if literal && bad > 0 {
1656 3
1657 } else {
1658 2
1659 };
1660 let certs_parsed: Vec<Cert> = certs_parsed.into_iter()
1661 .enumerate()
1662 .filter_map(|(i, c)| {
1663 if literal && i % modulus == 1 {
1664 assert!(c.is_err());
1666 None
1667 } else if bad > 0 && n == 0 && i == 0 {
1668 assert!(c.is_err());
1671 None
1672 } else if bad > 0 && i % modulus == modulus - 1 {
1673 assert!(c.is_err());
1677 None
1678 } else {
1679 Some(c.unwrap())
1680 }
1681 })
1682 .collect();
1683
1684 assert_eq!(certs_orig.len(), certs_parsed.len(),
1685 "number of parsed certificates: expected vs. got");
1686
1687 let fpr_orig = certs_orig.iter()
1688 .map(|c| {
1689 c.fingerprint()
1690 })
1691 .collect::<Vec<_>>();
1692 let fpr_parsed = certs_parsed.iter()
1693 .map(|c| {
1694 c.fingerprint()
1695 })
1696 .collect::<Vec<_>>();
1697 if fpr_orig != fpr_parsed {
1698 t!("{} certificates in orig; {} is parsed",
1699 fpr_orig.len(), fpr_parsed.len());
1700
1701 let fpr_set_orig: HashSet<&Fingerprint>
1702 = HashSet::from_iter(fpr_orig.iter());
1703 let fpr_set_parsed = HashSet::from_iter(fpr_parsed.iter());
1704 t!("Only in orig:\n {}",
1705 fpr_set_orig.difference(&fpr_set_parsed)
1706 .map(|f| f.to_string())
1707 .collect::<Vec<_>>()
1708 .join(",\n "));
1709 t!("Only in parsed:\n {}",
1710 fpr_set_parsed.difference(&fpr_set_orig)
1711 .map(|f| f.to_string())
1712 .collect::<Vec<_>>()
1713 .join(",\n "));
1714
1715 assert_eq!(fpr_orig, fpr_parsed);
1716 }
1717
1718 for (i, (c_orig, c_parsed)) in
1721 certs_orig
1722 .into_iter()
1723 .zip(certs_parsed.into_iter())
1724 .enumerate()
1725 {
1726 let ps_orig: Vec<Packet> =
1727 c_orig.as_tsk().into_packets().collect();
1728 let ps_parsed: Vec<Packet> =
1729 c_parsed.as_tsk().into_packets().collect();
1730 assert_eq!(ps_orig.len(), ps_parsed.len(),
1731 "number of packets: expected vs. got");
1732
1733 for (j, (p_orig, p_parsed)) in
1734 ps_orig
1735 .into_iter()
1736 .zip(ps_parsed.into_iter())
1737 .enumerate()
1738 {
1739 assert_eq!(p_orig, p_parsed,
1740 "Cert {}, packet: {}", i, j);
1741 }
1742 }
1743
1744 Ok(())
1745 }
1746
1747 #[test]
1748 fn parse_keyring_simple() -> Result<()> {
1749 for n in [1, 100, 0].iter() {
1750 parse_test(*n, false, 0)?;
1751 }
1752
1753 Ok(())
1754 }
1755
1756 #[test]
1757 fn parse_keyring_interleaved_literals() -> Result<()> {
1758 for n in [1, 100, 0].iter() {
1759 parse_test(*n, true, 0)?;
1760 }
1761
1762 Ok(())
1763 }
1764
1765 #[test]
1766 fn parse_keyring_interleaved_small_junk() -> Result<()> {
1767 for n in [1, 100, 0].iter() {
1768 parse_test(*n, false, 1)?;
1769 }
1770
1771 Ok(())
1772 }
1773
1774 #[test]
1775 fn parse_keyring_interleaved_unrecoverable_junk() -> Result<()> {
1776 for n in [1, 100, 0].iter() {
1782 parse_test(*n, false, 2 * RECOVERY_THRESHOLD)?;
1783 }
1784
1785 Ok(())
1786 }
1787
1788 #[test]
1789 fn parse_keyring_interleaved_literal_and_small_junk() -> Result<()> {
1790 for n in [1, 100, 0].iter() {
1791 parse_test(*n, true, 1)?;
1792 }
1793
1794 Ok(())
1795 }
1796
1797 #[test]
1798 fn parse_keyring_interleaved_literal_and_unrecoverable_junk() -> Result<()> {
1799 for n in [1, 100, 0].iter() {
1800 parse_test(*n, true, 2 * RECOVERY_THRESHOLD)?;
1801 }
1802
1803 Ok(())
1804 }
1805
1806 #[test]
1807 fn parse_keyring_no_public_key() -> Result<()> {
1808 tracer!(TRACE, "parse_keyring_no_public_key", 0);
1809
1810 let (cert_1, _) =
1816 CertBuilder::general_purpose(
1817 Some("ea@example.org"))
1818 .generate()?;
1819 let cert_1_packets: Vec<Packet>
1820 = cert_1.into_packets().collect();
1821
1822 let (cert_2, _) =
1823 CertBuilder::general_purpose(
1824 Some("eb@example.org"))
1825 .generate()?;
1826
1827 for n in 1..cert_1_packets.len() {
1828 t!("n: {}", n);
1829
1830 let mut data = Vec::new();
1831
1832 for i in n..cert_1_packets.len() {
1833 cert_1_packets[i].serialize(&mut data)?;
1834 }
1835
1836 cert_2.as_tsk().serialize(&mut data)?;
1837
1838
1839 let certs_parsed = CertParser::from_bytes(&data)
1840 .expect("Valid parse");
1841
1842 let mut iter = certs_parsed;
1843 for _ in n..cert_1_packets.len() {
1844 assert!(iter.next().unwrap().is_err());
1845 }
1846 assert_eq!(iter.next().unwrap().as_ref().unwrap(), &cert_2);
1847 assert!(iter.next().is_none());
1848 assert!(iter.next().is_none());
1849 }
1850
1851 Ok(())
1852 }
1853
1854 #[test]
1855 fn filter() {
1856 let fp = Fingerprint::from_hex(
1857 "CBCD8F030588653EEDD7E2659B7DD433F254904A",
1858 ).unwrap();
1859
1860 let cp = CertParser::from_bytes(tests::key("bad-subkey-keyring.pgp"))
1861 .unwrap()
1862 .unvalidated_cert_filter(|cert, _| {
1863 cert.fingerprint() == fp
1864 });
1865 let certs = cp.collect::<Result<Vec<Cert>>>().unwrap();
1866 assert_eq!(certs.len(), 1);
1867 assert!(certs[0].fingerprint() == fp);
1868 }
1869
1870 #[test]
1871 fn packet_source_includes_an_error() -> Result<()> {
1872 let mut ppr
1873 = PacketParser::from_bytes(crate::tests::key("testy.pgp"))?;
1874 let mut testy = Vec::new();
1875 while let PacketParserResult::Some(pp) = ppr {
1876 let (packet, ppr_) = pp.next()?;
1877 testy.push(packet);
1878 ppr = ppr_;
1879 }
1880
1881 let mut packets: Vec<Result<Packet>> = Vec::new();
1883 for p in testy.iter() {
1884 packets.push(Ok(p.clone()));
1885 }
1886 packets.push(Err(anyhow::anyhow!("An error")));
1887 packets.push(Err(anyhow::anyhow!("Another error")));
1888 for p in testy.iter() {
1889 packets.push(Ok(p.clone()));
1890 }
1891
1892 let certs = CertParser::from(packets).collect::<Vec<Result<Cert>>>();
1893 assert_eq!(certs.len(), 4);
1894 assert!(certs[0].is_ok());
1895 assert!(certs[1].is_err());
1896 assert!(certs[2].is_err());
1897 assert!(certs[3].is_ok());
1898
1899 Ok(())
1900 }
1901
1902 #[test]
1903 fn issue_1244() {
1904 let input = &[
1907 0xc6, 0x02, 0x2b, 0x6d, 0x71, 0x8d, 0xa7, 0x01,
1908 0xfd, 0xfc, 0x01, 0x5c, 0x89, 0x10, 0x0e, 0x53,
1909 0xb4, 0x7a, 0xdc, 0xa3, 0x5a, 0xa7, 0xbb, 0x3b,
1910 0xed, 0x89, 0x94, 0x24, 0x81, 0xcd, 0x73, 0xa8,
1911 0xab,
1912 ];
1913
1914 eprintln!("Testing malformed certificate");
1915 let pp = PacketParserBuilder::from_bytes(input)
1916 .expect("can create PacketParserBuilder")
1917 .dearmor(Dearmor::Disabled)
1918 .build()
1919 .expect("can build PacketParser");
1920 let mut parser = CertParser::from(pp);
1921
1922 parser.next().expect("result").expect_err("Unsupported certificate");
1924 parser.next().expect("result").expect_err("Malformed packet");
1925 assert!(parser.next().is_none());
1926
1927 eprintln!("Testing malformed certificate followed by valid certificate");
1928 let testy = crate::tests::key("testy.pgp");
1929 let mut input = input.to_vec();
1930 input.extend(testy);
1931
1932 eprintln!("Testing malformed certificate");
1933 let pp = PacketParserBuilder::from_bytes(&input)
1934 .expect("can create PacketParserBuilder")
1935 .dearmor(Dearmor::Disabled)
1936 .build()
1937 .expect("can build PacketParser");
1938 let mut parser = CertParser::from(pp);
1939
1940 parser.next().expect("result").expect_err("Unsupported certificate");
1943 parser.next().expect("result").expect_err("Malformed packet");
1944 parser.next().expect("result").expect("certificate");
1945 assert!(parser.next().is_none());
1946 }
1947}