@@ -63,8 +63,14 @@ impl<T> ContextSpecific<T> {
63
63
T : DecodeValue < ' a > + Tagged ,
64
64
{
65
65
Self :: decode_with :: < _ , _ , T :: Error > ( reader, tag_number, |reader| {
66
+ // Decode IMPLICIT header
66
67
let header = Header :: decode ( reader) ?;
67
- let value = T :: decode_value ( reader, header) ?;
68
+
69
+ // read_nested checks if header matches decoded length
70
+ let value = reader. read_nested ( header. length , |reader| {
71
+ // Decode inner IMPLICIT value
72
+ T :: decode_value ( reader, header)
73
+ } ) ?;
68
74
69
75
if header. tag . is_constructed ( ) != value. tag ( ) . is_constructed ( ) {
70
76
return Err ( header. tag . non_canonical_error ( ) . into ( ) ) ;
@@ -119,6 +125,7 @@ where
119
125
type Error = T :: Error ;
120
126
121
127
fn decode < R : Reader < ' a > > ( reader : & mut R ) -> Result < Self , Self :: Error > {
128
+ // Decode EXPLICIT header
122
129
let header = Header :: decode ( reader) ?;
123
130
124
131
match header. tag {
@@ -128,7 +135,10 @@ where
128
135
} => Ok ( Self {
129
136
tag_number : number,
130
137
tag_mode : TagMode :: default ( ) ,
131
- value : reader. read_nested ( header. length , |reader| T :: decode ( reader) ) ?,
138
+ value : reader. read_nested ( header. length , |reader| {
139
+ // Decode inner tag-length-value of EXPLICIT
140
+ T :: decode ( reader)
141
+ } ) ?,
132
142
} ) ,
133
143
tag => Err ( tag. unexpected_error ( None ) . into ( ) ) ,
134
144
}
0 commit comments