1use std::convert::TryFrom;
25use std::fmt;
26
27use buffered_reader::BufferedReader;
28
29use crate::Result;
30use crate::Error;
31use crate::Packet;
32use crate::PacketPile;
33use crate::packet::Literal;
34use crate::packet::Tag;
35use crate::parse::{Cookie, Parse};
36
37mod lexer;
38lalrpop_util::lalrpop_mod!(#[allow(clippy::all)] grammar, "/message/grammar.rs");
39
40use self::lexer::{Lexer, LexicalError};
41pub(crate) use self::lexer::Token;
42
43use lalrpop_util::ParseError;
44
45use self::grammar::MessageParser;
46
47#[non_exhaustive]
49#[derive(Debug, Clone)]
50pub (crate) enum MessageParserError {
51 Parser(ParseError<usize, Token, LexicalError>),
53 OpenPGP(Error),
55}
56assert_send_and_sync!(MessageParserError);
57
58impl From<MessageParserError> for anyhow::Error {
59 fn from(err: MessageParserError) -> Self {
60 match err {
61 MessageParserError::Parser(p) => p.into(),
62 MessageParserError::OpenPGP(p) => p.into(),
63 }
64 }
65}
66
67
68#[derive(Debug)]
70pub(crate) enum MessageValidity {
71 Message,
73 MessagePrefix,
77 Error(anyhow::Error),
79}
80
81#[allow(unused)]
82impl MessageValidity {
83 pub fn is_message(&self) -> bool {
88 matches!(self, MessageValidity::Message)
89 }
90
91 pub fn is_message_prefix(&self) -> bool {
97 matches!(self, MessageValidity::MessagePrefix)
98 }
99
100 pub fn is_err(&self) -> bool {
103 matches!(self, MessageValidity::Error(_))
104 }
105}
106
107#[derive(Debug)]
109pub(crate) struct MessageValidator {
110 tokens: Vec<Token>,
111 finished: bool,
112 depth: Option<isize>,
115
116 error: Option<MessageParserError>,
118}
119
120impl Default for MessageValidator {
121 fn default() -> Self {
122 MessageValidator::new()
123 }
124}
125
126impl MessageValidator {
127 pub fn new() -> Self {
129 MessageValidator {
130 tokens: vec![],
131 finished: false,
132 depth: Some(0),
133 error: None,
134 }
135 }
136
137 #[cfg(test)]
139 pub(crate) fn push_raw(&mut self, token: Token) {
140 assert!(!self.finished);
141
142 if self.error.is_some() {
143 return;
144 }
145
146 self.depth = None;
147 self.tokens.push(token);
148 }
149
150 pub fn push_token(&mut self, token: Token, path: &[usize]) {
161 assert!(!self.finished);
162 assert!(self.depth.is_some());
163 assert!(token != Token::Pop);
164 assert!(!path.is_empty());
165
166 if self.error.is_some() {
167 return;
168 }
169
170 let depth = path.len() as isize - 1;
172 if self.depth.unwrap() > depth {
173 for _ in 1..self.depth.unwrap() - depth + 1 {
174 self.tokens.push(Token::Pop);
175 }
176 }
177 self.depth = Some(depth);
178
179 self.tokens.push(token);
180 }
181
182 pub fn push(&mut self, tag: Tag, version: Option<u8>, path: &[usize]) {
192 if self.error.is_some() {
193 return;
194 }
195
196 let token = match tag {
197 Tag::Literal => Token::Literal,
198 Tag::CompressedData => Token::CompressedData,
199 Tag::SKESK => Token::SKESK,
200 Tag::PKESK => Token::PKESK,
201 Tag::SEIP if version == Some(1) => Token::SEIPv1,
202 Tag::SEIP if version == Some(2) => Token::SEIPv2,
203 Tag::MDC => Token::MDC,
204 Tag::AED => Token::AED,
205 Tag::OnePassSig => Token::OPS,
206 Tag::Signature => Token::SIG,
207 Tag::Marker => {
208 return;
211 },
212 Tag::Padding => {
213 return;
216 },
217 t if ! t.is_critical() => {
218 return;
221 },
222 _ => {
223 self.error = Some(MessageParserError::OpenPGP(
225 Error::MalformedMessage(
226 format!("Invalid OpenPGP message: \
227 {:?} packet (at {:?}) not expected",
228 tag, path))));
229 self.tokens.clear();
230 return;
231 }
232 };
233
234 self.push_token(token, path)
235 }
236
237 pub fn finish(&mut self) {
239 assert!(!self.finished);
240
241 if let Some(depth) = self.depth {
242 for _ in 0..depth {
244 self.tokens.push(Token::Pop);
245 }
246 }
247
248 self.finished = true;
249 }
250
251 pub fn check(&self) -> MessageValidity {
265 if let Some(ref err) = self.error {
266 return MessageValidity::Error((*err).clone().into());
267 }
268
269 let r = MessageParser::new().parse(
270 Lexer::from_tokens(&self.tokens[..]));
271
272 if self.finished {
273 match r {
274 Ok(_) => MessageValidity::Message,
275 Err(ref err) =>
276 MessageValidity::Error(
277 MessageParserError::Parser((*err).clone()).into()),
278 }
279 } else {
280 match r {
281 Ok(_) => MessageValidity::MessagePrefix,
282 Err(ParseError::UnrecognizedEof { .. }) =>
283 MessageValidity::MessagePrefix,
284 Err(ref err) =>
285 MessageValidity::Error(
286 MessageParserError::Parser((*err).clone()).into()),
287 }
288 }
289 }
290}
291
292#[derive(PartialEq)]
336pub struct Message {
337 pile: PacketPile,
339}
340assert_send_and_sync!(Message);
341
342impl fmt::Debug for Message {
343 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
344 f.debug_struct("Message")
345 .field("pile", &self.pile)
346 .finish()
347 }
348}
349
350impl<'a> Parse<'a, Message> for Message {
351 fn from_buffered_reader<R>(reader: R) -> Result<Message>
357 where
358 R: BufferedReader<Cookie> + 'a,
359 {
360 Self::try_from(PacketPile::from_buffered_reader(reader.into_boxed())?)
361 }
362}
363
364impl std::str::FromStr for Message {
365 type Err = anyhow::Error;
366
367 fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
368 Self::from_bytes(s.as_bytes())
369 }
370}
371
372impl Message {
373 pub fn body(&self) -> Option<&Literal> {
403 for packet in self.pile.descendants() {
404 if let Packet::Literal(ref l) = packet {
405 return Some(l);
406 }
407 }
408
409 None
411 }
412
413 pub fn packets(&self) -> &PacketPile {
415 &self.pile
416 }
417}
418
419impl TryFrom<PacketPile> for Message {
420 type Error = anyhow::Error;
421
422 fn try_from(pile: PacketPile) -> Result<Self> {
435 let mut v = MessageValidator::new();
436 for (mut path, packet) in pile.descendants().paths() {
437 match packet {
438 Packet::Unknown(ref u) =>
439 return Err(MessageParserError::OpenPGP(
440 Error::MalformedMessage(
441 format!("Invalid OpenPGP message: \
442 {:?} packet (at {:?}) not expected: {}",
443 u.tag(), path, u.error())))
444 .into()),
445 _ => v.push(packet.tag(), packet.version(), &path),
446 }
447
448 match packet {
449 Packet::CompressedData(_) | Packet::SEIP(_) =>
450 {
451 path.push(0);
455 if packet.children().is_none() {
456 v.push_token(Token::OpaqueContent, &path);
457 }
458 }
459 _ => {}
460 }
461 }
462 v.finish();
463
464 match v.check() {
465 MessageValidity::Message => Ok(Message { pile }),
466 MessageValidity::MessagePrefix => unreachable!(),
467 MessageValidity::Error(e) => Err(e),
471 }
472 }
473}
474
475impl TryFrom<Vec<Packet>> for Message {
476 type Error = anyhow::Error;
477
478 fn try_from(packets: Vec<Packet>) -> Result<Self> {
484 Self::try_from(PacketPile::from(packets))
485 }
486}
487
488impl From<Message> for PacketPile {
489 fn from(m: Message) -> Self {
490 m.pile
491 }
492}
493
494#[cfg(test)]
495mod tests {
496 use super::*;
497
498 use crate::types::DataFormat::Unicode;
499 use crate::HashAlgorithm;
500 use crate::types::CompressionAlgorithm;
501 use crate::SymmetricAlgorithm;
502 use crate::PublicKeyAlgorithm;
503 use crate::SignatureType;
504 use crate::crypto::S2K;
505 use crate::crypto::mpi::{Ciphertext, MPI};
506 use crate::packet::prelude::*;
507
508 #[test]
509 fn tokens() {
510 use self::lexer::{Token, Lexer};
511 use self::lexer::Token::*;
512 use self::grammar::MessageParser;
513
514 struct TestVector<'a> {
515 s: &'a [Token],
516 result: bool,
517 }
518
519 let test_vectors = [
520 TestVector {
521 s: &[Literal][..],
522 result: true,
523 },
524 TestVector {
525 s: &[CompressedData, Literal, Pop],
526 result: true,
527 },
528 TestVector {
529 s: &[CompressedData, CompressedData, Literal,
530 Pop, Pop],
531 result: true,
532 },
533 TestVector {
534 s: &[SEIPv1, Literal, MDC, Pop],
535 result: true,
536 },
537 TestVector {
538 s: &[CompressedData, SEIPv1, Literal, MDC, Pop, Pop],
539 result: true,
540 },
541 TestVector {
542 s: &[CompressedData, SEIPv1, CompressedData, Literal,
543 Pop, MDC, Pop, Pop],
544 result: true,
545 },
546 TestVector {
547 s: &[SEIPv1, MDC, Pop],
548 result: false,
549 },
550 TestVector {
551 s: &[SKESK, SEIPv1, Literal, MDC, Pop],
552 result: true,
553 },
554 TestVector {
555 s: &[PKESK, SEIPv1, Literal, MDC, Pop],
556 result: true,
557 },
558 TestVector {
559 s: &[SKESK, SKESK, SEIPv1, Literal, MDC, Pop],
560 result: true,
561 },
562
563 TestVector {
564 s: &[SEIPv2, Literal, Pop],
565 result: true,
566 },
567 TestVector {
568 s: &[CompressedData, SEIPv2, Literal, Pop, Pop],
569 result: true,
570 },
571 TestVector {
572 s: &[CompressedData, SEIPv2, CompressedData, Literal,
573 Pop, Pop, Pop],
574 result: true,
575 },
576 TestVector {
577 s: &[SEIPv2, Pop],
578 result: false,
579 },
580 TestVector {
581 s: &[SKESK, SEIPv2, Literal, Pop],
582 result: true,
583 },
584 TestVector {
585 s: &[PKESK, SEIPv2, Literal, Pop],
586 result: true,
587 },
588 TestVector {
589 s: &[SKESK, SKESK, SEIPv2, Literal, Pop],
590 result: true,
591 },
592
593 TestVector {
594 s: &[OPS, Literal, SIG],
595 result: true,
596 },
597 TestVector {
598 s: &[OPS, OPS, Literal, SIG, SIG],
599 result: true,
600 },
601 TestVector {
602 s: &[OPS, OPS, Literal, SIG],
603 result: false,
604 },
605 TestVector {
606 s: &[OPS, OPS, SEIPv1, OPS, SEIPv1, Literal, MDC, Pop,
607 SIG, MDC, Pop, SIG, SIG],
608 result: true,
609 },
610
611 TestVector {
612 s: &[CompressedData, OpaqueContent],
613 result: false,
614 },
615 TestVector {
616 s: &[CompressedData, OpaqueContent, Pop],
617 result: true,
618 },
619 TestVector {
620 s: &[CompressedData, CompressedData, OpaqueContent, Pop, Pop],
621 result: true,
622 },
623 TestVector {
624 s: &[SEIPv1, CompressedData, OpaqueContent, Pop, MDC, Pop],
625 result: true,
626 },
627 TestVector {
628 s: &[SEIPv1, OpaqueContent, Pop],
629 result: true,
630 },
631 ];
632
633 for v in &test_vectors {
634 if v.result {
635 let mut l = MessageValidator::new();
636 for token in v.s.iter() {
637 l.push_raw(*token);
638 assert_match!(MessageValidity::MessagePrefix = l.check());
639 }
640
641 l.finish();
642 assert_match!(MessageValidity::Message = l.check());
643 }
644
645 match MessageParser::new().parse(Lexer::from_tokens(v.s)) {
646 Ok(r) => assert!(v.result, "Parsing: {:?} => {:?}", v.s, r),
647 Err(e) => assert!(! v.result, "Parsing: {:?} => {:?}", v.s, e),
648 }
649 }
650 }
651
652 #[test]
653 fn tags() {
654 use crate::packet::Tag::*;
655
656 struct TestVector<'a> {
657 s: &'a [(Tag, Option<u8>, isize)],
658 result: bool,
659 }
660
661 let test_vectors = [
662 TestVector {
663 s: &[(Literal, None, 0)][..],
664 result: true,
665 },
666 TestVector {
667 s: &[(CompressedData, None, 0), (Literal, None, 1)],
668 result: true,
669 },
670 TestVector {
671 s: &[(CompressedData, None, 0), (CompressedData, None, 1),
672 (Literal, None, 2)],
673 result: true,
674 },
675 TestVector {
676 s: &[(SEIP, Some(1), 0), (Literal, None, 1), (MDC, None, 1)],
677 result: true,
678 },
679 TestVector {
680 s: &[(CompressedData, None, 0), (SEIP, Some(1), 1),
681 (Literal, None, 2), (MDC, None, 2)],
682 result: true,
683 },
684 TestVector {
685 s: &[(CompressedData, None, 0), (SEIP, Some(1), 1),
686 (CompressedData, None, 2), (Literal, None, 3),
687 (MDC, None, 2)],
688 result: true,
689 },
690 TestVector {
691 s: &[(CompressedData, None, 0), (SEIP, Some(1), 1),
692 (CompressedData, None, 2), (Literal, None, 3),
693 (MDC, None, 3)],
694 result: false,
695 },
696 TestVector {
697 s: &[(SEIP, Some(1), 0), (MDC, None, 0)],
698 result: false,
699 },
700 TestVector {
701 s: &[(SKESK, None, 0), (SEIP, Some(1), 0), (Literal, None, 1),
702 (MDC, None, 1)],
703 result: true,
704 },
705 TestVector {
706 s: &[(PKESK, None, 0), (SEIP, Some(1), 0), (Literal, None, 1),
707 (MDC, None, 1)],
708 result: true,
709 },
710 TestVector {
711 s: &[(PKESK, None, 0), (SEIP, Some(1), 0),
712 (CompressedData, None, 1), (Literal, None, 2),
713 (MDC, None, 1)],
714 result: true,
715 },
716 TestVector {
717 s: &[(SKESK, None, 0), (SKESK, None, 0), (SEIP, Some(1), 0),
718 (Literal, None, 1), (MDC, None, 1)],
719 result: true,
720 },
721
722 TestVector {
723 s: &[(OnePassSig, None, 0), (Literal, None, 0),
724 (Signature, None, 0)],
725 result: true,
726 },
727 TestVector {
728 s: &[(OnePassSig, None, 0), (CompressedData, None, 0),
729 (Literal, None, 1),
730 (Signature, None, 0)],
731 result: true,
732 },
733 TestVector {
734 s: &[(OnePassSig, None, 0), (OnePassSig, None, 0),
735 (Literal, None, 0),
736 (Signature, None, 0), (Signature, None, 0)],
737 result: true,
738 },
739 TestVector {
740 s: &[(OnePassSig, None, 0), (OnePassSig, None, 0),
741 (Literal, None, 0),
742 (Signature, None, 0)],
743 result: false,
744 },
745 TestVector {
746 s: &[(OnePassSig, None, 0), (OnePassSig, None, 0),
747 (SEIP, Some(1), 0),
748 (OnePassSig, None, 1), (SEIP, Some(1), 1),
749 (Literal, None, 2), (MDC, None, 2),
750 (Signature, None, 1), (MDC, None, 1), (Signature, None, 0),
751 (Signature, None, 0)],
752 result: true,
753 },
754
755 TestVector {
761 s: &[(Marker, None, 0),
762 (OnePassSig, None, 0), (Literal, None, 0),
763 (Signature, None, 0)],
764 result: true,
765 },
766 TestVector {
767 s: &[(OnePassSig, None, 0), (Literal, None, 0),
768 (Signature, None, 0),
769 (Marker, None, 0)],
770 result: true,
771 },
772 ];
773
774 for v in &test_vectors {
775 let mut l = MessageValidator::new();
776 for (token, version, depth) in v.s.iter() {
777 l.push(*token,
778 *version,
779 &(0..1 + *depth)
780 .map(|x| x as usize)
781 .collect::<Vec<_>>()[..]);
782 if v.result {
783 assert_match!(MessageValidity::MessagePrefix = l.check());
784 }
785 }
786
787 l.finish();
788
789 if v.result {
790 assert_match!(MessageValidity::Message = l.check());
791 } else {
792 assert_match!(MessageValidity::Error(_) = l.check());
793 }
794 }
795 }
796
797 #[test]
798 fn basic() {
799 let message = Message::try_from(vec![]);
802 assert!(message.is_err(), "{:?}", message);
803
804 let mut packets = Vec::new();
807 let mut lit = Literal::new(Unicode);
808 lit.set_body(b"data".to_vec());
809 packets.push(lit.into());
810
811 let message = Message::try_from(packets);
812 assert!(message.is_ok(), "{:?}", message);
813 }
814
815 #[test]
816 fn compressed_part() {
817 let mut lit = Literal::new(Unicode);
818 lit.set_body(b"data".to_vec());
819
820 let mut packets = Vec::new();
824 packets.push(
825 CompressedData::new(CompressionAlgorithm::Uncompressed)
826 .push(lit.clone().into())
827 .into());
828
829 let message = Message::try_from(packets);
830 assert!(message.is_ok(), "{:?}", message);
831
832 let mut packets = Vec::new();
837 packets.push(
838 CompressedData::new(CompressionAlgorithm::Uncompressed)
839 .push(lit.clone().into())
840 .push(lit.clone().into())
841 .into());
842
843 let message = Message::try_from(packets);
844 assert!(message.is_err(), "{:?}", message);
845
846 let mut packets = Vec::new();
851 packets.push(
852 CompressedData::new(CompressionAlgorithm::Uncompressed)
853 .push(lit.clone().into())
854 .into());
855 packets.push(lit.clone().into());
856
857 let message = Message::try_from(packets);
858 assert!(message.is_err(), "{:?}", message);
859
860 let mut packets = Vec::new();
865 packets.push(
866 CompressedData::new(CompressionAlgorithm::Uncompressed)
867 .push(CompressedData::new(CompressionAlgorithm::Uncompressed)
868 .push(lit.clone()
869 .into())
870 .into())
871 .into());
872
873 let message = Message::try_from(packets);
874 assert!(message.is_ok(), "{:?}", message);
875 }
876
877 #[test]
878 fn one_pass_sig_part() {
879 let mut lit = Literal::new(Unicode);
880 lit.set_body(b"data".to_vec());
881
882 let hash = crate::types::HashAlgorithm::SHA512;
883 let key: key::SecretKey =
884 crate::packet::key::Key6::generate_ecc(true, crate::types::Curve::Ed25519)
885 .unwrap().into();
886 let mut pair = key.clone().into_keypair().unwrap();
887 let ctx =
888 hash.context().unwrap().for_signature(pair.public().version());
889 let sig = crate::packet::signature::SignatureBuilder::new(SignatureType::Binary)
890 .sign_hash(&mut pair, ctx).unwrap();
891
892 let mut packets : Vec<Packet> = Vec::new();
895 packets.push(OnePassSig3::new(SignatureType::Binary).into());
896
897 let message = Message::try_from(packets);
898 assert!(message.is_err(), "{:?}", message);
899
900 let mut packets : Vec<Packet> = Vec::new();
904 packets.push(OnePassSig3::new(SignatureType::Binary).into());
905 packets.push(lit.clone().into());
906
907 let message = Message::try_from(packets);
908 assert!(message.is_err(), "{:?}", message);
909
910 let mut packets : Vec<Packet> = Vec::new();
915 packets.push(OnePassSig3::new(SignatureType::Binary).into());
916 packets.push(lit.clone().into());
917 packets.push(sig.clone().into());
918
919 let message = Message::try_from(packets);
920 assert!(message.is_ok(), "{:?}", message);
921
922 let mut packets : Vec<Packet> = Vec::new();
928 packets.push(OnePassSig3::new(SignatureType::Binary).into());
929 packets.push(lit.clone().into());
930 packets.push(sig.clone().into());
931 packets.push(sig.clone().into());
932
933 let message = Message::try_from(packets);
934 assert!(message.is_err(), "{:?}", message);
935
936 let mut packets : Vec<Packet> = Vec::new();
943 packets.push(OnePassSig3::new(SignatureType::Binary).into());
944 packets.push(OnePassSig3::new(SignatureType::Binary).into());
945 packets.push(lit.clone().into());
946 packets.push(sig.clone().into());
947 packets.push(sig.clone().into());
948
949 let message = Message::try_from(packets);
950 assert!(message.is_ok(), "{:?}", message);
951
952 let mut packets : Vec<Packet> = Vec::new();
960 packets.push(OnePassSig3::new(SignatureType::Binary).into());
961 packets.push(OnePassSig3::new(SignatureType::Binary).into());
962 packets.push(lit.clone().into());
963 packets.push(lit.clone().into());
964 packets.push(sig.clone().into());
965 packets.push(sig.clone().into());
966
967 let message = Message::try_from(packets);
968 assert!(message.is_err(), "{:?}", message);
969
970 let mut packets : Vec<Packet> = Vec::new();
978 packets.push(OnePassSig3::new(SignatureType::Binary).into());
979 packets.push(OnePassSig3::new(SignatureType::Binary).into());
980 packets.push(
981 CompressedData::new(CompressionAlgorithm::Uncompressed)
982 .push(lit.clone().into())
983 .into());
984 packets.push(sig.clone().into());
985 packets.push(sig.clone().into());
986
987 let message = Message::try_from(packets);
988 assert!(message.is_ok(), "{:?}", message);
989 }
990
991 #[test]
992 fn signature_part() {
993 let mut lit = Literal::new(Unicode);
994 lit.set_body(b"data".to_vec());
995
996 let hash = crate::types::HashAlgorithm::SHA512;
997 let key: key::SecretKey =
998 crate::packet::key::Key6::generate_ecc(true, crate::types::Curve::Ed25519)
999 .unwrap().into();
1000 let mut pair = key.clone().into_keypair().unwrap();
1001 let ctx =
1002 hash.context().unwrap().for_signature(pair.public().version());
1003 let sig = crate::packet::signature::SignatureBuilder::new(SignatureType::Binary)
1004 .sign_hash(&mut pair, ctx).unwrap();
1005
1006 let mut packets : Vec<Packet> = Vec::new();
1009 packets.push(sig.clone().into());
1010
1011 let message = Message::try_from(packets);
1012 assert!(message.is_err(), "{:?}", message);
1013
1014 let mut packets : Vec<Packet> = Vec::new();
1018 packets.push(sig.clone().into());
1019 packets.push(lit.clone().into());
1020
1021 let message = Message::try_from(packets);
1022 assert!(message.is_ok(), "{:?}", message);
1023
1024 let mut packets : Vec<Packet> = Vec::new();
1029 packets.push(sig.clone().into());
1030 packets.push(sig.clone().into());
1031 packets.push(lit.clone().into());
1032
1033 let message = Message::try_from(packets);
1034 assert!(message.is_ok(), "{:?}", message);
1035 }
1036
1037 #[test]
1038 fn encrypted_part() {
1039 let mut lit = Literal::new(Unicode);
1046 lit.set_body(b"data".to_vec());
1047
1048 let mut packets : Vec<Packet> = Vec::new();
1051 let cipher = SymmetricAlgorithm::AES256;
1052 let sk =
1053 crate::crypto::SessionKey::new(cipher.key_size().unwrap()).unwrap();
1054 #[allow(deprecated)]
1055 packets.push(SKESK4::with_password(
1056 cipher,
1057 cipher,
1058 S2K::Simple { hash: HashAlgorithm::SHA256 },
1059 &sk,
1060 &"12345678".into()).unwrap().into());
1061 let message = Message::try_from(packets.clone());
1062 assert!(message.is_err(), "{:?}", message);
1063
1064 packets.push(lit.clone().into());
1068
1069 assert!(packets.iter().map(|p| p.tag()).collect::<Vec<Tag>>()
1070 == [ Tag::SKESK, Tag::Literal ]);
1071
1072 let message = Message::try_from(packets.clone());
1073 assert!(message.is_err(), "{:?}", message);
1074
1075 let mut seip = SEIP1::new();
1081 seip.container_mut().children_mut().unwrap().push(
1082 lit.clone().into());
1083 seip.container_mut().children_mut().unwrap().push(
1084 MDC::from([0u8; 20]).into());
1085 packets[1] = seip.into();
1086
1087 assert!(packets.iter().map(|p| p.tag()).collect::<Vec<Tag>>()
1088 == [ Tag::SKESK, Tag::SEIP ]);
1089
1090 let message = Message::try_from(packets.clone());
1091 assert!(message.is_ok(), "{:#?}", message);
1092
1093 let skesk = packets[0].clone();
1100 packets.push(skesk);
1101
1102 assert!(packets.iter().map(|p| p.tag()).collect::<Vec<Tag>>()
1103 == [ Tag::SKESK, Tag::SEIP, Tag::SKESK ]);
1104
1105 let message = Message::try_from(packets.clone());
1106 assert!(message.is_err(), "{:#?}", message);
1107
1108 packets.swap(1, 2);
1115
1116 assert!(packets.iter().map(|p| p.tag()).collect::<Vec<Tag>>()
1117 == [ Tag::SKESK, Tag::SKESK, Tag::SEIP ]);
1118
1119 let message = Message::try_from(packets.clone());
1120 assert!(message.is_ok(), "{:#?}", message);
1121
1122 let seip = packets[2].clone();
1132 packets.push(seip);
1133
1134 assert!(packets.iter().map(|p| p.tag()).collect::<Vec<Tag>>()
1135 == [ Tag::SKESK, Tag::SKESK, Tag::SEIP, Tag::SEIP ]);
1136
1137 let message = Message::try_from(packets.clone());
1138 assert!(message.is_err(), "{:#?}", message);
1139
1140 packets[3] = lit.clone().into();
1148
1149 assert!(packets.iter().map(|p| p.tag()).collect::<Vec<Tag>>()
1150 == [ Tag::SKESK, Tag::SKESK, Tag::SEIP, Tag::Literal ]);
1151
1152 let message = Message::try_from(packets.clone());
1153 assert!(message.is_err(), "{:#?}", message);
1154
1155 packets.remove(3);
1163 packets[2].container_mut().unwrap()
1164 .children_mut().unwrap().push(lit.clone().into());
1165
1166 assert!(packets.iter().map(|p| p.tag()).collect::<Vec<Tag>>()
1167 == [ Tag::SKESK, Tag::SKESK, Tag::SEIP ]);
1168
1169 let message = Message::try_from(packets.clone());
1170 assert!(message.is_err(), "{:#?}", message);
1171
1172 packets[2].container_mut().unwrap()
1179 .children_mut().unwrap().pop().unwrap();
1180
1181 #[allow(deprecated)]
1182 packets.insert(
1183 1,
1184 PKESK3::new(
1185 Some("0000111122223333".parse().unwrap()),
1186 PublicKeyAlgorithm::RSAEncrypt,
1187 Ciphertext::RSA { c: MPI::new(&[]) }).unwrap().into());
1188
1189 assert!(packets.iter().map(|p| p.tag()).collect::<Vec<Tag>>()
1190 == [ Tag::SKESK, Tag::PKESK, Tag::SKESK, Tag::SEIP ]);
1191
1192 let message = Message::try_from(packets.clone());
1193 assert!(message.is_ok(), "{:#?}", message);
1194 }
1195
1196 #[test]
1197 fn basic_message_validator() {
1198 use crate::message::{MessageValidator, MessageValidity, Token};
1199
1200 let mut l = MessageValidator::new();
1201 l.push_token(Token::Literal, &[0]);
1202 l.finish();
1203 assert!(matches!(l.check(), MessageValidity::Message));
1204 }
1205
1206 #[test]
1207 fn message_validator_push_token() {
1208 use crate::message::{MessageValidator, MessageValidity, Token};
1209
1210 let mut l = MessageValidator::new();
1211 l.push_token(Token::Literal, &[0]);
1212 l.finish();
1213
1214 assert!(matches!(l.check(), MessageValidity::Message));
1215 }
1216
1217 #[test]
1218 fn message_validator_push() {
1219 use crate::message::{MessageValidator, MessageValidity};
1220 use crate::packet::Tag;
1221
1222 let mut l = MessageValidator::new();
1223 l.push(Tag::Literal, None, &[0]);
1224 l.finish();
1225
1226 assert!(matches!(l.check(), MessageValidity::Message));
1227 }
1228
1229 #[test]
1230 fn message_validator_finish() {
1231 use crate::message::{MessageValidator, MessageValidity};
1232
1233 let mut l = MessageValidator::new();
1234 l.finish();
1235
1236 assert!(matches!(l.check(), MessageValidity::Error(_)));
1237 }
1238
1239 #[test]
1240 fn message_validator_check() {
1241 use crate::message::{MessageValidator, MessageValidity};
1242 use crate::packet::Tag;
1243
1244 let mut l = MessageValidator::new();
1246 assert!(matches!(l.check(), MessageValidity::MessagePrefix));
1247 l.finish();
1248
1249 assert!(matches!(l.check(), MessageValidity::Error(_)));
1250
1251 let mut l = MessageValidator::new();
1253 l.push(Tag::Literal, None, &[0]);
1254 assert!(matches!(l.check(), MessageValidity::MessagePrefix));
1255 l.finish();
1256
1257 assert!(matches!(l.check(), MessageValidity::Message));
1258 }
1259}