2121 Decode a SEQUENCE type using a VA list
2222 @param in Input buffer
2323 @param inlen Length of input in octets
24- @remark <...> is of the form <type, size, data> (int, unsigned long, void*)
24+ @param a1 Initialized argument list #1
25+ @param a2 Initialized argument list #2 (copy of #1)
26+ @param flags c.f. enum ltc_der_seq
2527 @return CRYPT_OK on success
2628*/
27- int der_decode_sequence_multi (const unsigned char * in , unsigned long inlen , ... )
29+ static int _der_decode_sequence_va (const unsigned char * in , unsigned long inlen , va_list a1 , va_list a2 , unsigned int flags )
2830{
2931 int err ;
3032 ltc_asn1_type type ;
3133 unsigned long size , x ;
3234 void * data ;
33- va_list args ;
3435 ltc_asn1_list * list ;
3536
3637 LTC_ARGCHK (in != NULL );
3738
3839 /* get size of output that will be required */
39- va_start (args , inlen );
4040 x = 0 ;
4141 for (;;) {
42- type = (ltc_asn1_type )va_arg (args , int );
43- size = va_arg (args , unsigned long );
44- data = va_arg (args , void * );
42+ type = (ltc_asn1_type )va_arg (a1 , int );
43+ size = va_arg (a1 , unsigned long );
44+ data = va_arg (a1 , void * );
4545 LTC_UNUSED_PARAM (size );
4646 LTC_UNUSED_PARAM (data );
4747
@@ -73,11 +73,9 @@ int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...)
7373
7474 case LTC_ASN1_EOL :
7575 case LTC_ASN1_CUSTOM_TYPE :
76- va_end (args );
7776 return CRYPT_INVALID_ARG ;
7877 }
7978 }
80- va_end (args );
8179
8280 /* allocate structure for x elements */
8381 if (x == 0 ) {
@@ -90,12 +88,11 @@ int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...)
9088 }
9189
9290 /* fill in the structure */
93- va_start (args , inlen );
9491 x = 0 ;
9592 for (;;) {
96- type = (ltc_asn1_type )va_arg (args , int );
97- size = va_arg (args , unsigned long );
98- data = va_arg (args , void * );
93+ type = (ltc_asn1_type )va_arg (a2 , int );
94+ size = va_arg (a2 , unsigned long );
95+ data = va_arg (a2 , void * );
9996
10097 if (type == LTC_ASN1_EOL ) {
10198 break ;
@@ -128,13 +125,63 @@ int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...)
128125 break ;
129126 }
130127 }
131- va_end (args );
132128
133- err = der_decode_sequence (in , inlen , list , x );
129+ err = der_decode_sequence_ex (in , inlen , list , x , flags );
134130 XFREE (list );
135131 return err ;
136132}
137133
134+ /**
135+ Decode a SEQUENCE type using a VA list
136+ @param in Input buffer
137+ @param inlen Length of input in octets
138+ @remark <...> is of the form <type, size, data> (int, unsigned long, void*)
139+ @return CRYPT_OK on success
140+ */
141+ int der_decode_sequence_multi (const unsigned char * in , unsigned long inlen , ...)
142+ {
143+ va_list a1 , a2 ;
144+ int err ;
145+
146+ LTC_ARGCHK (in != NULL );
147+
148+ va_start (a1 , inlen );
149+ va_start (a2 , inlen );
150+
151+ err = _der_decode_sequence_va (in , inlen , a1 , a2 , LTC_DER_SEQ_SEQUENCE | LTC_DER_SEQ_RELAXED );
152+
153+ va_end (a2 );
154+ va_end (a1 );
155+
156+ return err ;
157+ }
158+
159+ /**
160+ Decode a SEQUENCE type using a VA list
161+ @param in Input buffer
162+ @param inlen Length of input in octets
163+ @param flags c.f. enum ltc_der_seq
164+ @remark <...> is of the form <type, size, data> (int, unsigned long, void*)
165+ @return CRYPT_OK on success
166+ */
167+ int der_decode_sequence_multi_ex (const unsigned char * in , unsigned long inlen , unsigned int flags , ...)
168+ {
169+ va_list a1 , a2 ;
170+ int err ;
171+
172+ LTC_ARGCHK (in != NULL );
173+
174+ va_start (a1 , flags );
175+ va_start (a2 , flags );
176+
177+ err = _der_decode_sequence_va (in , inlen , a1 , a2 , flags );
178+
179+ va_end (a2 );
180+ va_end (a1 );
181+
182+ return err ;
183+ }
184+
138185#endif
139186
140187
0 commit comments