@@ -112,7 +112,7 @@ mod choice {
112112 /// `Choice` with `IMPLICIT` tagging.
113113 mod implicit {
114114 use der:: {
115- Choice , Decode , Encode , SliceWriter ,
115+ Choice , Decode , Encode , Sequence , SliceWriter ,
116116 asn1:: { BitStringRef , GeneralizedTime } ,
117117 } ;
118118 use hex_literal:: hex;
@@ -179,6 +179,13 @@ mod choice {
179179 cs_time. encode ( & mut encoder) . unwrap ( ) ;
180180 assert_eq ! ( TIME_DER , encoder. finish( ) . unwrap( ) ) ;
181181 }
182+
183+ /// Test case for `CHOICE` inside `[0]` `EXPLICIT` tag in `SEQUENCE`.
184+ #[ derive( Sequence , Debug , Eq , PartialEq ) ]
185+ pub struct ExplicitChoiceInsideSequence < ' a > {
186+ #[ asn1( tag_mode = "EXPLICIT" , context_specific = "0" ) ]
187+ choice_field : ImplicitChoice < ' a > ,
188+ }
182189 }
183190}
184191
@@ -743,6 +750,67 @@ mod decode_value {
743750 }
744751}
745752
753+ /// Custom derive test cases for the `DecodeValue` + `EncodeValue` macro combo.
754+ mod decode_encode_value {
755+ use der:: {
756+ DecodeValue , EncodeValue , Header , IsConstructed , Length , SliceReader , SliceWriter , Tag ,
757+ TagNumber ,
758+ } ;
759+
760+ /// Example of a structure, that does not have a tag and is not a sequence
761+ #[ derive( DecodeValue , EncodeValue , Default , Eq , PartialEq , Debug ) ]
762+ #[ asn1( tag_mode = "IMPLICIT" ) ]
763+ struct DecodeEncodeCheck < ' a > {
764+ #[ asn1( type = "OCTET STRING" , context_specific = "5" ) ]
765+ field : & ' a [ u8 ] ,
766+ }
767+ impl IsConstructed for DecodeEncodeCheck < ' _ > {
768+ const CONSTRUCTED : bool = true ;
769+ }
770+
771+ // TODO(dishmaker): fix test after IMPLICIT/EXPLICIT trait split
772+ // #[derive(Sequence, Default, Eq, PartialEq, Debug)]
773+ // #[asn1(tag_mode = "IMPLICIT")]
774+ // struct ImplicitWrapper<'a> {
775+ // #[asn1(context_specific = "0")]
776+ // implicit_decode_encode: DecodeEncodeCheck<'a>,
777+ // }
778+
779+ #[ test]
780+ fn sequence_decode_encode_custom_implicit ( ) {
781+ // TODO(dishmaker): fix test after IMPLICIT/EXPLICIT trait split
782+ // let obj = ImplicitWrapper {
783+ // implicit_decode_encode: DecodeEncodeCheck {
784+ // field: &[0x33, 0x44],
785+ // },
786+ // };
787+
788+ // let der_encoded = obj.to_der().unwrap();
789+
790+ // assert_eq!(der_encoded, hex!("80 04 85 02 33 44"));
791+ // let obj_decoded = ImplicitWrapper::from_der(&der_encoded);
792+ // assert_eq!(obj, obj_decoded);
793+
794+ let header = Header {
795+ tag : Tag :: ContextSpecific {
796+ constructed : true ,
797+ number : TagNumber ( 0 ) ,
798+ } ,
799+ length : Length :: new ( 6u16 ) ,
800+ } ;
801+ let obj = DecodeEncodeCheck {
802+ field : & [ 0x33 , 0x44 ] ,
803+ } ;
804+
805+ let mut buf = [ 0u8 ; 100 ] ;
806+ let mut writer = SliceWriter :: new ( & mut buf) ;
807+ obj. encode_value ( & mut writer) . unwrap ( ) ;
808+
809+ let mut reader = SliceReader :: new ( & buf) . unwrap ( ) ;
810+ let _ = DecodeEncodeCheck :: decode_value ( & mut reader, header) ;
811+ }
812+ }
813+
746814/// Custom derive test cases for the `BitString` macro.
747815#[ cfg( feature = "std" ) ]
748816mod bitstring {
0 commit comments