1use std::borrow::Cow;
69use std::convert::TryFrom;
70use std::fmt;
71
72use buffered_reader::{BufferedReader, Dup, EOF, Memory};
73
74use crate::Fingerprint;
75use crate::KeyID;
76use crate::Result;
77use crate::armor;
78use crate::cert::Cert;
79use crate::packet::Header;
80use crate::packet::Key;
81use crate::packet::Packet;
82use crate::packet::Tag;
83use crate::packet::UserID;
84use crate::packet::header::BodyLength;
85use crate::packet::header::CTB;
86use crate::packet::key;
87use crate::parse::Cookie;
88use crate::parse::PacketParser;
89use crate::parse::Parse;
90use crate::parse::RECOVERY_THRESHOLD;
91
92use super::TRACE;
93
94mod iter;
95pub use iter::KeyIter;
96
97#[derive(Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
148pub struct RawPacket<'a> {
149 tag: Tag,
150 header_len: usize,
151 data: &'a [u8],
152}
153assert_send_and_sync!(RawPacket<'_>);
154
155impl fmt::Debug for RawPacket<'_> {
156 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
157 f.debug_struct("RawPacket")
158 .field("tag", &self.tag)
159 .field("data (bytes)", &self.data.len())
160 .finish()
161 }
162}
163
164impl<'a> RawPacket<'a> {
165 fn new(tag: Tag, header_len: usize, bytes: &'a [u8]) -> Self {
166 Self {
167 tag,
168 header_len,
169 data: bytes,
170 }
171 }
172
173 pub fn tag(&self) -> Tag {
175 self.tag
176 }
177
178 pub fn as_bytes(&self) -> &[u8] {
180 self.data
181 }
182
183 pub fn body(&self) -> &[u8] {
185 &self.data[self.header_len..]
186 }
187}
188
189impl<'a> TryFrom<RawPacket<'a>> for Packet {
190 type Error = anyhow::Error;
191
192 fn try_from(p: RawPacket<'a>) -> Result<Self> {
193 Packet::from_bytes(p.as_bytes())
194 }
195}
196
197impl<'a> crate::seal::Sealed for RawPacket<'a> {}
198impl<'a> crate::serialize::Marshal for RawPacket<'a> {
199 fn serialize(&self, o: &mut dyn std::io::Write) -> Result<()> {
200 o.write_all(self.as_bytes())?;
201 Ok(())
202 }
203}
204
205#[derive(Clone)]
220pub struct RawCert<'a> {
221 data: Cow<'a, [u8]>,
222
223 primary_key: Key<key::PublicParts, key::PrimaryRole>,
224
225 packets: Vec<(Tag, usize, usize)>,
228}
229assert_send_and_sync!(RawCert<'_>);
230
231impl<'a> fmt::Debug for RawCert<'a> {
232 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
233 f.debug_struct("RawCert")
234 .field("fingerprint", &self.fingerprint())
235 .field("packets",
236 &self.packets
237 .iter()
238 .map(|p| format!("{} (offset: {})", p.0, p.1))
239 .collect::<Vec<String>>()
240 .join(", "))
241 .field("data (bytes)", &self.data.as_ref().len())
242 .finish()
243 }
244}
245
246impl<'a> PartialEq for RawCert<'a> {
247 fn eq(&self, other: &Self) -> bool {
248 self.data == other.data
249 }
250}
251
252impl<'a> Eq for RawCert<'a> {
253}
254
255impl<'a> RawCert<'a> {
256 pub fn as_bytes(&'a self) -> &'a [u8] {
262 self.data.as_ref()
263 }
264
265 pub fn fingerprint(&self) -> Fingerprint {
267 self.primary_key.fingerprint()
268 }
269
270 pub fn keyid(&self) -> KeyID {
272 KeyID::from(self.fingerprint())
273 }
274
275 pub fn packet(&self, i: usize) -> Option<RawPacket<'_>> {
277 let data: &[u8] = self.data.as_ref();
278
279 let &(tag, header_len, start) = self.packets.get(i)?;
280 let following = self.packets
281 .get(i + 1)
282 .map(|&(_, _, offset)| offset)
283 .unwrap_or(data.len());
284
285 Some(RawPacket::new(tag, header_len, &data[start..following]))
286 }
287
288 pub fn packets(&self) -> impl Iterator<Item=RawPacket<'_>> {
290 let data: &[u8] = self.data.as_ref();
291
292 let count = self.packets.len();
293 (0..count)
294 .map(move |i| {
295 let (tag, header_len, start) = self.packets[i];
296 let following = self.packets
297 .get(i + 1)
298 .map(|&(_, _, offset)| offset)
299 .unwrap_or(data.len());
300
301 RawPacket::new(tag, header_len, &data[start..following])
302 })
303 }
304
305 pub fn count(&self) -> usize {
307 self.packets.len()
308 }
309
310 pub fn keys(&self) -> KeyIter<'_, key::PublicParts, key::UnspecifiedRole> {
374 KeyIter::new(self)
375 }
376
377 fn keys_internal(&self)
382 -> impl Iterator<Item=Key<key::PublicParts, key::UnspecifiedRole>> + '_
383 {
384 std::iter::once(self.primary_key().clone().role_into_unspecified())
385 .chain(self.packets()
386 .filter(|p| matches!(p.tag(),
387 Tag::PublicKey | Tag::PublicSubkey
388 | Tag::SecretKey | Tag::SecretSubkey))
389 .skip(1) .filter_map(|p| Key::from_bytes(p.body())
391 .ok()
392 .map(|k| k.parts_into_public())))
393 }
394
395 pub fn primary_key(&self) -> Key<key::PublicParts, key::PrimaryRole> {
406 self.primary_key.clone()
407 }
408
409 pub fn userids(&self) -> impl Iterator<Item=UserID> + '_
421 {
422 self.packets()
423 .filter_map(|p| {
424 if p.tag() == Tag::UserID {
425 UserID::try_from(p.body()).ok()
426 } else {
427 None
428 }
429 })
430 }
431
432 pub fn into_owned(self) -> RawCert<'static> {
470 match self.data {
471 Cow::Owned(data) => {
472 RawCert {
473 data: Cow::Owned(data),
474 primary_key: self.primary_key,
475 packets: self.packets,
476 }
477 }
478 Cow::Borrowed(data) => {
479 RawCert {
480 data: Cow::Owned(data.to_vec()),
481 primary_key: self.primary_key,
482 packets: self.packets,
483 }
484 }
485 }
486 }
487}
488
489impl<'a> TryFrom<&RawCert<'a>> for Cert {
490 type Error = anyhow::Error;
491
492 fn try_from(c: &RawCert) -> Result<Self> {
493 Cert::from_bytes(c.as_bytes())
494 }
495}
496
497impl<'a> TryFrom<RawCert<'a>> for Cert {
498 type Error = anyhow::Error;
499
500 fn try_from(c: RawCert) -> Result<Self> {
501 Cert::try_from(&c)
502 }
503}
504
505impl<'a> Parse<'a, RawCert<'a>> for RawCert<'a> {
506 fn from_buffered_reader<R>(reader: R) -> Result<RawCert<'a>>
510 where
511 R: BufferedReader<Cookie> + 'a
512 {
513 fn parse<'a>(reader: Box<dyn BufferedReader<Cookie> + 'a>) -> Result<RawCert<'a>> {
514 let mut parser = RawCertParser::from_buffered_reader(reader)?;
515 if let Some(cert_result) = parser.next() {
516 if parser.next().is_some() {
517 Err(crate::Error::MalformedCert(
518 "Additional packets found, is this a keyring?".into()
519 ).into())
520 } else {
521 cert_result
522 }
523 } else {
524 Err(crate::Error::MalformedCert("No data".into()).into())
525 }
526 }
527
528 parse(reader.into_boxed())
529 }
530}
531
532impl<'a> crate::seal::Sealed for RawCert<'a> {}
533impl<'a> crate::serialize::Marshal for RawCert<'a> {
534 fn serialize(&self, o: &mut dyn std::io::Write) -> Result<()> {
535 o.write_all(self.as_bytes())?;
536 Ok(())
537 }
538}
539
540pub struct RawCertParser<'a>
614{
615 slice: Option<&'a [u8]>,
618
619 reader: Box<dyn BufferedReader<Cookie> + 'a>,
624
625 dearmor: bool,
627
628 bytes_read: usize,
630
631 pending_error: Option<anyhow::Error>,
633
634 done: bool,
636}
637assert_send_and_sync!(RawCertParser<'_>);
638
639impl<'a> RawCertParser<'a> {
640 fn new(reader: Box<dyn BufferedReader<Cookie> + 'a>) -> Result<Self>
641 {
642 let mut dearmor = false;
647 let mut dup = Dup::with_cookie(reader, Default::default());
648 if ! dup.eof() {
649 match Header::parse(&mut dup) {
650 Ok(header) => {
651 let tag = header.ctb().tag();
652 if matches!(tag, Tag::Unknown(_) | Tag::Private(_)) {
653 return Err(crate::Error::MalformedCert(
654 format!("A certificate must start with a \
655 public key or a secret key packet, \
656 got a {}",
657 tag))
658 .into());
659 }
660 }
661 Err(_err) => {
662 dearmor = true;
665 }
666 }
667 }
668
669 let mut reader = dup.into_boxed().into_inner().expect("inner");
671
672 if dearmor {
673 reader = armor::Reader::from_cookie_reader(
674 reader, armor::ReaderMode::Tolerant(None),
675 Default::default()).into_boxed();
676
677 let mut dup = Dup::with_cookie(reader, Default::default());
678 match Header::parse(&mut dup) {
679 Ok(header) => {
680 let tag = header.ctb().tag();
681 if matches!(tag, Tag::Unknown(_) | Tag::Private(_)) {
682 return Err(crate::Error::MalformedCert(
683 format!("A certificate must start with a \
684 public key or a secret key packet, \
685 got a {}",
686 tag))
687 .into());
688 }
689 }
690 Err(err) => {
691 return Err(err);
692 }
693 }
694
695 reader = dup.into_boxed().into_inner().expect("inner");
696 }
697
698 Ok(RawCertParser {
699 slice: None,
700 reader,
701 dearmor,
702 bytes_read: 0,
703 pending_error: None,
704 done: false,
705 })
706 }
707}
708
709impl<'a> Parse<'a, RawCertParser<'a>> for RawCertParser<'a>
710{
711 fn from_buffered_reader<R>(reader: R) -> Result<RawCertParser<'a>>
713 where
714 R: BufferedReader<Cookie> + 'a
715 {
716 RawCertParser::new(reader.into_boxed())
717 }
718
719 fn from_bytes<D: AsRef<[u8]> + ?Sized + Send + Sync>(data: &'a D) -> Result<Self> {
721 let data = data.as_ref();
722 let mut p = RawCertParser::new(
723 Memory::with_cookie(data, Default::default()).into_boxed())?;
724
725 if ! p.dearmor {
728 p.slice = Some(data);
729 }
730 Ok(p)
731 }
732}
733
734impl<'a> crate::seal::Sealed for RawCertParser<'a> {}
735
736impl<'a> Iterator for RawCertParser<'a>
737{
738 type Item = Result<RawCert<'a>>;
739
740 fn next(&mut self) -> Option<Self::Item> {
741 tracer!(TRACE, "RawCertParser::next", 0);
742
743 if let Some(err) = self.pending_error.take() {
745 t!("Returning the queued error: {}", err);
746 return Some(Err(err));
747 }
748
749 if self.done {
750 return None;
751 }
752
753 if self.reader.eof() && self.dearmor {
754 let reader = std::mem::replace(
759 &mut self.reader,
760 EOF::with_cookie(Default::default()).into_boxed());
761
762 let reader = reader.into_inner().expect("the armor reader");
764
765 self.reader = armor::Reader::from_cookie_reader(
767 reader, armor::ReaderMode::Tolerant(None),
768 Default::default()).into_boxed();
769 }
770
771 if self.reader.eof() {
772 return None;
773 }
774
775 let mut reader = Dup::with_cookie(
776 std::mem::replace(&mut self.reader,
777 Box::new(EOF::with_cookie(Default::default()))),
778 Default::default());
779
780 let cert_start_absolute = self.bytes_read;
782
783 let mut processed = 0;
789
790 let mut cert_start = 0;
794 let mut cert_end = 0;
795
796 let mut packets: Vec<(Tag, usize, usize)> = Vec::new();
798 let mut primary_key = None;
799
800 let mut pending_error = None;
801 'packet_parser: loop {
802 if reader.eof() {
803 break;
804 }
805
806 let packet_start = reader.total_out();
807 processed = packet_start;
808
809 let mut skip = 0;
810 let mut header_len = 0;
811 let header = loop {
812 match Header::parse(&mut reader) {
813 Err(err) => {
814 if skip == 0 {
815 t!("Reading the next packet's header: {}", err);
816 }
817
818 if skip >= RECOVERY_THRESHOLD {
819 pending_error = Some(err.context(
820 format!("Splitting keyring at offset {}",
821 self.bytes_read + packet_start)));
822 processed = reader.total_out();
823
824 self.done = true;
827
828 break 'packet_parser;
829 } else if reader.eof() {
830 t!("EOF while trying to recover");
831 break Header::new(CTB::new(Tag::Reserved),
832 BodyLength::Full(skip as u32));
833 } else {
834 skip += 1;
835 reader.rewind();
836 reader.consume(packet_start + skip);
837 }
838 }
839 Ok(header) if skip > 0 => {
840 if PacketParser::plausible_cert(&mut reader, &header)
841 .is_ok()
842 {
843 t!("Found a valid header after {} bytes \
847 of junk: {:?}",
848 skip, header);
849
850 break Header::new(CTB::new(Tag::Reserved),
851 BodyLength::Full(skip as u32));
852 } else {
853 skip += 1;
854 reader.rewind();
855 reader.consume(packet_start + skip);
856 }
857 }
858 Ok(header) => {
859 header_len = reader.total_out() - packet_start;
860 break header;
861 }
862 }
863 };
864
865 if skip > 0 {
866 t!("Recovered after {} bytes of junk", skip);
868
869 pending_error = Some(crate::Error::MalformedPacket(
870 format!("Encountered {} bytes of junk at offset {}",
871 skip, self.bytes_read)).into());
872
873 processed += skip;
876
877 break;
878 }
879
880 let tag = header.ctb().tag();
881 t!("Found a {:?}, length: {:?}",
882 tag, header.length());
883
884 if packet_start > cert_start
885 && (tag == Tag::PublicKey || tag == Tag::SecretKey)
886 {
887 t!("Stopping: found the start of a new cert ({})", tag);
892 break;
893 }
894
895 match header.length() {
896 BodyLength::Full(l) => {
897 let l = *l as usize;
898
899 match reader.data_consume_hard(l) {
900 Err(err) => {
901 t!("Stopping: reading {}'s body: {}", tag, err);
902
903 if err.kind() == std::io::ErrorKind::UnexpectedEof {
906 t!("Got an unexpected EOF, done.");
907 self.done = true;
908 }
909
910 pending_error = Some(
911 anyhow::Error::from(err).context(format!(
912 "While reading {}'s body", tag)));
913
914 break;
915 }
916 Ok(data) => {
917 if tag == Tag::PublicKey
918 || tag == Tag::SecretKey
919 {
920 let data = &data[..l];
921 match Key::from_bytes(data) {
922 Err(err) => {
923 t!("Stopping: parsing public key: {}",
924 err);
925 primary_key = Some(Err(err));
926 }
927 Ok(key) => primary_key = Some(
928 Ok(key.parts_into_public()
929 .role_into_primary())),
930 }
931 }
932 }
933 }
934 }
935 BodyLength::Partial(_) => {
936 t!("Stopping: Partial body length not allowed \
937 for {} packets",
938 tag);
939 pending_error = Some(
940 crate::Error::MalformedPacket(
941 format!("Packet {} uses partial body length \
942 encoding, which is not allowed in \
943 certificates",
944 tag))
945 .into());
946 self.done = true;
947 break;
948 }
949 BodyLength::Indeterminate => {
950 t!("Stopping: Indeterminate length not allowed \
951 for {} packets",
952 tag);
953 pending_error = Some(
954 crate::Error::MalformedPacket(
955 format!("Packet {} uses intedeterminite length \
956 encoding, which is not allowed in \
957 certificates",
958 tag))
959 .into());
960 self.done = true;
961 break;
962 }
963 }
964
965 let end = reader.total_out();
966 processed = end;
967
968 let r = if packet_start == cert_start {
969 if tag == Tag::Marker {
970 cert_start = end;
973 Ok(())
974 } else {
975 packets.push((tag, header_len, packet_start));
976 Cert::valid_start(tag)
977 }
978 } else {
979 packets.push((tag, header_len, packet_start));
980 Cert::valid_packet(tag)
981 };
982 if let Err(err) = r {
983 t!("Stopping: {:?} => not a certificate: {}", header, err);
984 pending_error = Some(err);
985
986 if self.bytes_read == 0 && packet_start == cert_start
987 && matches!(tag, Tag::Unknown(_) | Tag::Private(_))
988 {
989 self.done = true;
992 }
993
994 break;
995 }
996
997 cert_end = end;
998 }
999
1000 t!("{} bytes processed; RawCert @ offset {}, {} bytes",
1001 processed,
1002 self.bytes_read + cert_start, cert_end - cert_start);
1003
1004 assert!(cert_start <= cert_end);
1005 assert!(cert_end <= processed);
1006 self.bytes_read += processed;
1007
1008 self.reader = Box::new(reader).into_inner()
1010 .expect("just put it there");
1011
1012 let cert_data = &self.reader
1014 .data_consume_hard(processed)
1015 .expect("just read it")[cert_start..cert_end];
1016
1017 if let Some(err) = pending_error.take() {
1018 if cert_start == cert_end {
1019 t!("Directly returning the error");
1021 return Some(Err(err));
1022 } else {
1023 t!("Queuing the error");
1024 self.pending_error = Some(err);
1025 }
1026 }
1027
1028 if cert_start == cert_end {
1029 t!("No data.");
1030 return None;
1031 }
1032
1033 match primary_key.expect("set") {
1034 Ok(primary_key) => Some(Ok(RawCert {
1035 data: if let Some(slice) = self.slice.as_ref() {
1036 let data = &slice[cert_start_absolute + cert_start
1037 ..cert_start_absolute + cert_end];
1038 assert_eq!(data, cert_data);
1039 Cow::Borrowed(data)
1040 } else {
1041 Cow::Owned(cert_data.to_vec())
1042 },
1043 primary_key,
1044 packets,
1045 })),
1046 Err(err) =>
1047 Some(Err(Error::UnsupportedCert(err, cert_data.into()).into())),
1048 }
1049 }
1050}
1051
1052#[non_exhaustive]
1054#[derive(thiserror::Error, Debug)]
1055pub enum Error {
1056 #[error("Unsupported Cert: {0}")]
1062 UnsupportedCert(anyhow::Error, Vec<u8>),
1063}
1064
1065#[cfg(test)]
1066mod test {
1067 use super::*;
1068
1069 use crate::cert::CertParser;
1070 use crate::cert::CertBuilder;
1071 use crate::packet::Literal;
1072 use crate::parse::RECOVERY_THRESHOLD;
1073 use crate::parse::PacketParserResult;
1074 use crate::serialize::Serialize;
1075 use crate::types::DataFormat;
1076 use crate::packet::Unknown;
1077 use crate::packet::CompressedData;
1078
1079 fn cert_cmp(a: Cert, b: Cert)
1080 {
1081 if a == b {
1082 return;
1083 }
1084
1085 let a = a.into_tsk().into_packets().collect::<Vec<_>>();
1086 let b = b.into_tsk().into_packets().collect::<Vec<_>>();
1087
1088 for (i, (a, b)) in a.iter().zip(b.iter()).enumerate() {
1089 if a != b {
1090 panic!("Differ at element #{}:\n {:?}\n {:?}",
1091 i, a, b);
1092 }
1093 }
1094 if a.len() > b.len() {
1095 eprintln!("Left has more packets:");
1096 for p in &a[b.len()..] {
1097 eprintln!(" - {}", p.tag());
1098 }
1099 }
1100 if b.len() > a.len() {
1101 eprintln!("Right has more packets:");
1102 for p in &b[a.len()..] {
1103 eprintln!(" - {}", p.tag());
1104 }
1105 }
1106 if a.len() != b.len() {
1107 panic!("Different lengths (common prefix identical): {} vs. {}",
1108 a.len(), b.len());
1109 }
1110 }
1111
1112 fn compare_parse(bytes: &[u8]) -> Vec<RawCert<'_>> {
1115 let mut result = Vec::new();
1116
1117 for &from_bytes in [true, false].iter() {
1122 let cp = CertParser::from_bytes(bytes);
1123 let rp = if from_bytes {
1124 eprintln!("=== RawCertParser::from_bytes");
1125 RawCertParser::from_bytes(bytes)
1126 } else {
1127 eprintln!("=== RawCertParser::from_reader");
1128 RawCertParser::from_reader(std::io::Cursor::new(bytes))
1129 };
1130
1131 assert_eq!(cp.is_err(), rp.is_err(),
1132 "CertParser: {:?}; RawCertParser: {:?}",
1133 cp.map(|_| "Parsed"),
1134 rp.map(|_| "Parsed"));
1135 if cp.is_err() && rp.is_err() {
1136 return Vec::new();
1137 }
1138
1139 let mut cp = cp.expect("valid");
1140 let mut rp = rp.expect("valid");
1141
1142 let mut raw_certs = Vec::new();
1143 loop {
1144 eprintln!("=== NEXT CERTPARSER");
1145 let c = cp.next();
1146 eprintln!("=== END CERTPARSER");
1147 eprintln!("=== NEXT RAWCERTPARSER");
1148 let r = rp.next();
1149 eprintln!("=== END RAWCERTPARSER");
1150
1151 let (c, r) = match (c, r) {
1152 (Some(Ok(c)), Some(Ok(r))) => (c, r),
1154 (Some(Err(_)), Some(Err(_))) => continue,
1156 (None, None) => break,
1158 (c, r) => {
1159 panic!("\n\
1160 CertParser returned: {:?}\n\
1161 RawCertParser returned: {:?}",
1162 c, r);
1163 }
1164 };
1165
1166 assert_eq!(c.fingerprint(), r.fingerprint());
1167
1168 eprintln!("CertParser says:");
1169 for (i, p) in c.clone().into_tsk().into_packets().enumerate() {
1170 eprintln!(" - {}. {}", i, p.tag());
1171 }
1172
1173 let rp = Cert::from_bytes(r.as_bytes()).unwrap();
1174 eprintln!("RawCertParser says:");
1175 for (i, p) in rp.clone().into_tsk().into_packets().enumerate() {
1176 eprintln!(" - {}. {}", i, p.tag());
1177 }
1178
1179 cert_cmp(c.clone(), rp);
1180
1181 raw_certs.push(r);
1182 }
1183
1184 result = raw_certs;
1185 }
1186 result
1187 }
1188
1189 #[test]
1190 fn empty() {
1191 let bytes = &[];
1192
1193 let certs = compare_parse(bytes);
1194 assert_eq!(certs.len(), 0);
1195 }
1196
1197 #[test]
1198 fn a_cert() {
1199 let testy = crate::tests::key("testy.pgp");
1200
1201 let bytes = testy;
1202
1203 let certs = compare_parse(bytes);
1204 assert_eq!(certs.len(), 1);
1205 let cert = &certs[0];
1206 assert_eq!(cert.as_bytes(), testy);
1207
1208 let tags = &[ Tag::PublicKey,
1209 Tag::UserID, Tag::Signature,
1210 Tag::PublicSubkey, Tag::Signature
1211 ];
1212 assert_eq!(
1213 &cert.packets().map(|p| p.tag()).collect::<Vec<Tag>>()[..],
1214 tags);
1215
1216 for (p, tag) in cert.packets().zip(tags.iter()) {
1219 let ppr = PacketParser::from_bytes(p.as_bytes()).expect("valid");
1220 if let PacketParserResult::Some(pp) = ppr {
1221 let (p, pp) = pp.next().expect("valid");
1222 assert_eq!(p.tag(), *tag);
1223 assert!(matches!(pp, PacketParserResult::EOF(_)));
1224 } else {
1225 panic!("Unexpected EOF");
1226 }
1227 }
1228 }
1229
1230 #[test]
1231 fn two_certs() {
1232 let testy = crate::tests::key("testy.pgp");
1233
1234 let mut bytes = testy.to_vec();
1235 bytes.extend_from_slice(testy);
1236
1237 let certs = compare_parse(&bytes[..]);
1238 assert_eq!(certs.len(), 2);
1239 for cert in certs.into_iter() {
1240 assert_eq!(cert.as_bytes(), testy);
1241 assert_eq!(
1242 &cert.packets().map(|p| p.tag()).collect::<Vec<Tag>>()[..],
1243 &[ Tag::PublicKey,
1244 Tag::UserID, Tag::Signature,
1245 Tag::PublicSubkey, Tag::Signature
1246 ]);
1247 }
1248 }
1249
1250 #[test]
1251 fn marker_packet_ignored() {
1252 use crate::serialize::Serialize;
1253
1254 let mut marker = Vec::new();
1256 Packet::Marker(Default::default())
1257 .serialize(&mut marker).unwrap();
1258 compare_parse(&marker[..]);
1259
1260 let mut testy_with_marker = Vec::new();
1262 Packet::Marker(Default::default())
1263 .serialize(&mut testy_with_marker).unwrap();
1264 testy_with_marker.extend_from_slice(crate::tests::key("testy.pgp"));
1265 compare_parse(&testy_with_marker[..]);
1266
1267 let mut testy_with_marker = Vec::new();
1269 testy_with_marker.extend_from_slice(crate::tests::key("testy.pgp"));
1270 Packet::Marker(Default::default())
1271 .serialize(&mut testy_with_marker).unwrap();
1272 compare_parse(&testy_with_marker[..]);
1273 }
1274
1275 #[test]
1276 fn invalid_packets() -> Result<()> {
1277 tracer!(TRACE, "invalid_packets", 0);
1278
1279 let (cert, _) =
1280 CertBuilder::general_purpose(Some("alice@example.org"))
1281 .generate()?;
1282 let cert = cert.into_packets().collect::<Vec<_>>();
1283
1284 let userid : Packet = cert.clone()
1286 .into_iter()
1287 .filter(|p| p.tag() == Tag::UserID)
1288 .next()
1289 .unwrap();
1290
1291 let tag = Tag::Private(61);
1293 let unknown : Packet
1294 = Unknown::new(tag, crate::Error::UnsupportedPacketType(tag).into())
1295 .into();
1296
1297 let mut lit = Literal::new(DataFormat::Unicode);
1299 lit.set_body(b"test".to_vec());
1300 let lit = Packet::from(lit);
1301
1302 let cd = {
1305 use crate::types::CompressionAlgorithm;
1306 use crate::packet;
1307 use crate::PacketPile;
1308 use crate::serialize::Serialize;
1309 use crate::parse::Parse;
1310
1311 let mut cd = CompressedData::new(
1312 CompressionAlgorithm::Uncompressed);
1313 let mut body = Vec::new();
1314 lit.serialize(&mut body)?;
1315 cd.set_body(packet::Body::Processed(body));
1316 let cd = Packet::from(cd);
1317
1318 let mut bytes = Vec::new();
1321 cd.serialize(&mut bytes)?;
1322
1323 let pp = PacketPile::from_bytes(&bytes[..])?;
1324
1325 assert_eq!(pp.descendants().count(), 2);
1326 assert_eq!(pp.path_ref(&[ 0 ]).unwrap().tag(),
1327 packet::Tag::CompressedData);
1328 assert_eq!(pp.path_ref(&[ 0, 0 ]), Some(&lit));
1329
1330 cd
1331 };
1332
1333 fn check(input: impl Iterator<Item=Packet>) {
1334 let mut bytes = Vec::new();
1335 for p in input {
1336 p.serialize(&mut bytes).unwrap();
1337 }
1338
1339 compare_parse(&bytes[..]);
1340 }
1341
1342 fn interleave(cert: &Vec<Packet>, p: &Packet) {
1343 t!("A certificate, a {}.", p.tag());
1344 check(
1345 cert.clone().into_iter()
1346 .chain(p.clone()));
1347
1348 t!("A certificate, two {}.", p.tag());
1349 check(
1350 cert.clone().into_iter()
1351 .chain(p.clone())
1352 .chain(p.clone()));
1353
1354 t!("A {}, a certificate.", p.tag());
1355 check(
1356 p.clone().into_iter()
1357 .chain(cert.clone()));
1358
1359 t!("Two {}, a certificate.", p.tag());
1360 check(
1361 p.clone().into_iter()
1362 .chain(p.clone())
1363 .chain(cert.clone()));
1364
1365 t!("Two {}, a certificate, two {}.", p.tag(), p.tag());
1366 check(
1367 p.clone().into_iter()
1368 .chain(p.clone())
1369 .chain(cert.clone())
1370 .chain(p.clone())
1371 .chain(p.clone()));
1372
1373 t!("Two {}, two certificates, two {}, a certificate.");
1374 check(
1375 p.clone().into_iter()
1376 .chain(p.clone())
1377 .chain(cert.clone())
1378 .chain(cert.clone())
1379 .chain(p.clone())
1380 .chain(p.clone())
1381 .chain(cert.clone()));
1382 }
1383
1384 interleave(&cert, &lit);
1385
1386 interleave(&cert, &cd);
1390
1391
1392 let mut cert_plus = cert.clone();
1395 cert_plus.push(unknown.clone());
1396
1397 t!("A certificate, an unknown.");
1398 check(
1399 cert.clone().into_iter()
1400 .chain(unknown.clone()));
1401
1402 t!("An unknown, a certificate.");
1403 check(
1404 unknown.clone().into_iter()
1405 .chain(cert.clone()));
1406
1407 t!("A certificate, two unknowns.");
1408 check(
1409 cert.clone().into_iter()
1410 .chain(unknown.clone())
1411 .chain(unknown.clone()));
1412
1413 t!("A certificate, an unknown, a certificate.");
1414 check(
1415 cert.clone().into_iter()
1416 .chain(unknown.clone())
1417 .chain(cert.clone()));
1418
1419 t!("A Literal, two User IDs");
1420 check(
1421 lit.clone().into_iter()
1422 .chain(userid.clone())
1423 .chain(userid.clone()));
1424
1425 t!("A User ID, a certificate");
1426 check(
1427 userid.clone().into_iter()
1428 .chain(cert.clone()));
1429
1430 t!("Two User IDs, a certificate");
1431 check(
1432 userid.clone().into_iter()
1433 .chain(userid.clone())
1434 .chain(cert.clone()));
1435
1436 Ok(())
1437 }
1438
1439 fn parse_test(n: usize, literal: bool, bad: usize) -> Result<()> {
1440 tracer!(TRACE, "t", 0);
1441
1442 let nulls = vec![ 0; bad ];
1450
1451 t!("n: {}, literals: {}, bad data: {}",
1452 n, literal, bad);
1453
1454 let mut data = Vec::new();
1455
1456 let mut certs_orig = vec![];
1457 for i in 0..n {
1458 let (cert, _) =
1459 CertBuilder::general_purpose(
1460 Some(format!("{}@example.org", i)))
1461 .generate()?;
1462
1463 cert.as_tsk().serialize(&mut data)?;
1464 certs_orig.push(cert);
1465
1466 if literal {
1467 let mut lit = Literal::new(DataFormat::Unicode);
1468 lit.set_body(b"data".to_vec());
1469
1470 Packet::from(lit).serialize(&mut data)?;
1471 }
1472 data.extend(&nulls[..bad]);
1474 }
1475 if n == 0 {
1476 data.extend(&nulls[..bad]);
1478 }
1479 assert_eq!(certs_orig.len(), n);
1480
1481 t!("Start of data: {} {}",
1482 if let Some(x) = data.get(0) {
1483 format!("{:02X}", x)
1484 } else {
1485 "XX".into()
1486 },
1487 if let Some(x) = data.get(1) {
1488 format!("{:02X}", x)
1489 } else {
1490 "XX".into()
1491 });
1492
1493 compare_parse(&data);
1494
1495 Ok(())
1496 }
1497
1498 #[test]
1499 fn parse_keyring_simple() -> Result<()> {
1500 for n in [1, 100, 0].iter() {
1501 parse_test(*n, false, 0)?;
1502 }
1503
1504 Ok(())
1505 }
1506
1507 #[test]
1508 fn parse_keyring_interleaved_literals() -> Result<()> {
1509 for n in [1, 100, 0].iter() {
1510 parse_test(*n, true, 0)?;
1511 }
1512
1513 Ok(())
1514 }
1515
1516 #[test]
1517 fn parse_keyring_interleaved_small_junk() -> Result<()> {
1518 for n in [1, 100, 0].iter() {
1519 parse_test(*n, false, 1)?;
1520 }
1521
1522 Ok(())
1523 }
1524
1525 #[test]
1526 fn parse_keyring_interleaved_unrecoverable_junk() -> Result<()> {
1527 for n in [1, 100, 0].iter() {
1533 parse_test(*n, false, 2 * RECOVERY_THRESHOLD)?;
1534 }
1535
1536 Ok(())
1537 }
1538
1539 #[test]
1540 fn parse_keyring_interleaved_literal_and_small_junk() -> Result<()> {
1541 for n in [1, 100, 0].iter() {
1542 parse_test(*n, true, 1)?;
1543 }
1544
1545 Ok(())
1546 }
1547
1548 #[test]
1549 fn parse_keyring_interleaved_literal_and_unrecoverable_junk() -> Result<()> {
1550 for n in [1, 100, 0].iter() {
1551 parse_test(*n, true, 2 * RECOVERY_THRESHOLD)?;
1552 }
1553
1554 Ok(())
1555 }
1556
1557 #[test]
1558 fn parse_keyring_no_public_key() -> Result<()> {
1559 tracer!(TRACE, "parse_keyring_no_public_key", 0);
1560
1561 let (cert_1, _) =
1567 CertBuilder::general_purpose(
1568 Some("a@example.org"))
1569 .generate()?;
1570 let cert_1_packets: Vec<Packet>
1571 = cert_1.into_packets().collect();
1572
1573 let (cert_2, _) =
1574 CertBuilder::general_purpose(
1575 Some("b@example.org"))
1576 .generate()?;
1577
1578 for n in 1..cert_1_packets.len() {
1579 t!("n: {}", n);
1580
1581 let mut data = Vec::new();
1582
1583 for i in n..cert_1_packets.len() {
1584 cert_1_packets[i].serialize(&mut data)?;
1585 }
1586
1587 cert_2.as_tsk().serialize(&mut data)?;
1588
1589 compare_parse(&data);
1590 }
1591
1592 Ok(())
1593 }
1594
1595 #[test]
1596 fn accessors() {
1597 let testy = crate::tests::key("testy.pgp");
1598
1599 let certs = RawCertParser::from_bytes(testy)
1600 .expect("valid")
1601 .collect::<Result<Vec<RawCert>>>()
1602 .expect("valid");
1603 assert_eq!(certs.len(), 1);
1604 let cert = &certs[0];
1605 assert_eq!(cert.as_bytes(), testy);
1606
1607 assert_eq!(cert.primary_key().fingerprint(),
1608 "3E8877C877274692975189F5D03F6F865226FE8B"
1609 .parse().expect("valid"));
1610 assert_eq!(cert.keys().map(|k| k.fingerprint()).collect::<Vec<_>>(),
1611 vec![
1612 "3E8877C877274692975189F5D03F6F865226FE8B"
1613 .parse().expect("valid"),
1614 "01F187575BD45644046564C149E2118166C92632"
1615 .parse().expect("valid")
1616 ]);
1617 assert_eq!(cert.keys().subkeys()
1618 .map(|k| k.fingerprint()).collect::<Vec<_>>(),
1619 vec![
1620 "01F187575BD45644046564C149E2118166C92632"
1621 .parse().expect("valid")
1622 ]);
1623 assert_eq!(
1624 cert.userids()
1625 .map(|u| {
1626 String::from_utf8_lossy(u.value()).into_owned()
1627 })
1628 .collect::<Vec<_>>(),
1629 vec![ "Testy McTestface <testy@example.org>" ]);
1630 }
1631
1632 #[test]
1634 fn raw_cert_parser_impl() {
1635 let testy = crate::tests::key("testy.pgp");
1637
1638 let raw = RawCert::from_bytes(testy).expect("valid");
1639 let cert = Cert::from_bytes(testy).expect("valid");
1640
1641 assert_eq!(
1642 raw.keys().map(|k| k.fingerprint()).collect::<Vec<_>>(),
1643 cert.keys().map(|k| k.key().fingerprint()).collect::<Vec<_>>());
1644
1645 assert_eq!(
1646 raw.userids().collect::<Vec<_>>(),
1647 cert.userids().map(|ua| ua.userid().clone()).collect::<Vec<_>>());
1648
1649 eprintln!("Parsing 0 bytes");
1651 let raw = RawCert::from_bytes(b"");
1652 match &raw {
1653 Ok(_) => eprintln!("raw: Ok"),
1654 Err(err) => eprintln!("raw: {}", err),
1655 }
1656 let cert = Cert::from_bytes(b"");
1657 match &cert {
1658 Ok(_) => eprintln!("cert: Ok"),
1659 Err(err) => eprintln!("cert: {}", err),
1660 }
1661
1662 assert!(
1663 matches!(cert.map_err(|e| e.downcast::<crate::Error>()),
1664 Err(Ok(crate::Error::MalformedCert(_)))));
1665 assert!(
1666 matches!(raw.map_err(|e| e.downcast::<crate::Error>()),
1667 Err(Ok(crate::Error::MalformedCert(_)))));
1668
1669 let mut bytes = Vec::new();
1671 bytes.extend(testy);
1672 bytes.extend(testy);
1673
1674 let parser = CertParser::from_bytes(&bytes).expect("valid");
1675 assert_eq!(parser.count(), 2);
1676
1677 eprintln!("Parsing two certificates");
1678 let raw = RawCert::from_bytes(&bytes);
1679 match &raw {
1680 Ok(_) => eprintln!("raw: Ok"),
1681 Err(err) => eprintln!("raw: {}", err),
1682 }
1683 let cert = Cert::from_bytes(&bytes);
1684 match &cert {
1685 Ok(_) => eprintln!("cert: Ok"),
1686 Err(err) => eprintln!("cert: {}", err),
1687 }
1688
1689 assert!(
1690 matches!(cert.map_err(|e| e.downcast::<crate::Error>()),
1691 Err(Ok(crate::Error::MalformedCert(_)))));
1692 assert!(
1693 matches!(raw.map_err(|e| e.downcast::<crate::Error>()),
1694 Err(Ok(crate::Error::MalformedCert(_)))));
1695 }
1696
1697 #[test]
1698 fn issue_1244() {
1699 let input = &[
1702 0xc6, 0x02, 0x2b, 0x6d, 0x71, 0x8d, 0xa7, 0x01,
1703 0xfd, 0xfc, 0x01, 0x5c, 0x89, 0x10, 0x0e, 0x53,
1704 0xb4, 0x7a, 0xdc, 0xa3, 0x5a, 0xa7, 0xbb, 0x3b,
1705 0xed, 0x89, 0x94, 0x24, 0x81, 0xcd, 0x73, 0xa8,
1706 0xab,
1707 ];
1708
1709 eprintln!("Testing malformed certificate");
1710 let mut parser = RawCertParser::from_bytes(input)
1711 .expect("parser initializes on this malformed input");
1712
1713 parser.next().expect("result").expect_err("Unsupported certificate");
1715 parser.next().expect("result").expect_err("Malformed packet");
1716 assert!(parser.next().is_none());
1717
1718 eprintln!("Testing malformed certificate followed by valid certificate");
1719 let testy = crate::tests::key("testy.pgp");
1720 let mut input = input.to_vec();
1721 input.extend(testy);
1722
1723 let mut parser = RawCertParser::from_bytes(&input)
1724 .expect("parser initializes on this malformed input");
1725
1726 parser.next().expect("result").expect_err("Unsupported certificate");
1729 parser.next().expect("result").expect_err("Malformed packet");
1730 parser.next().expect("result").expect("certificate");
1731 assert!(parser.next().is_none());
1732 }
1733
1734 #[test]
1735 fn concatenated_armored_certs() -> Result<()> {
1736 let mut keyring = Vec::new();
1737 keyring.extend_from_slice(b"some\ntext\n");
1738 keyring.extend_from_slice(crate::tests::key("testy.asc"));
1739 keyring.extend_from_slice(crate::tests::key("testy.asc"));
1740 keyring.extend_from_slice(b"some\ntext\n");
1741 keyring.extend_from_slice(crate::tests::key("testy.asc"));
1742 keyring.extend_from_slice(b"some\ntext\n");
1743 let certs = RawCertParser::from_bytes(&keyring)?.collect::<Vec<_>>();
1744 assert_eq!(certs.len(), 3);
1745 assert!(certs.iter().all(|c| c.is_ok()));
1746 Ok(())
1747 }
1748}