5656
5757#include <openssl/asn1.h>
5858#include <openssl/bio.h>
59+ #include "../internal.h"
5960
6061// Forward declarations
6162static int asn1_parse2 (BIO * bp , const uint8_t * * pp , long length , int offset ,
@@ -117,6 +118,8 @@ const char *ASN1_tag2str(int tag) {
117118}
118119
119120int ASN1_parse (BIO * bp , const unsigned char * pp , long len , int indent ) {
121+ GUARD_PTR (bp );
122+ GUARD_PTR (pp );
120123 return asn1_parse2 (bp , & pp , len , 0 , 0 , indent , 0 );
121124}
122125
@@ -173,21 +176,21 @@ static int asn1_parse_constructed_type(
173176 const unsigned char * original_start , long * object_length , int parse_flags ,
174177 int offset , int depth , int indent , int dump ) {
175178 const unsigned char * start_pos = * current_pos ;
176- const unsigned char * constructed_end = * current_pos + * object_length ;
177- int parse_result ;
178179
179- if (!bp || !current_pos || !total_end || !original_start || !object_length ) {
180- return 0 ;
181- }
180+ GUARD_PTR (bp );
181+ GUARD_PTR (current_pos );
182+ GUARD_PTR (total_end );
183+ GUARD_PTR (original_start );
184+ GUARD_PTR (object_length );
182185
183186 if (BIO_write (bp , "\n" , 1 ) <= 0 ) {
184187 return 0 ;
185188 }
186189
187- if ((parse_flags == 0x21 ) && (* object_length == 0 )) {
190+ if ((parse_flags == ( V_ASN1_CONSTRUCTED | 1 ) ) && (* object_length == 0 )) {
188191 // Indefinite length constructed object
189192 for (;;) {
190- parse_result = asn1_parse2 (
193+ const int parse_result = asn1_parse2 (
191194 bp , current_pos , (long )(total_end - * current_pos ),
192195 offset + (* current_pos - original_start ), depth + 1 , indent , dump );
193196 if (parse_result == 0 ) {
@@ -200,13 +203,18 @@ static int asn1_parse_constructed_type(
200203 }
201204 } else {
202205 // Definite length constructed object
206+ const unsigned char * constructed_end = * current_pos + * object_length ;
203207 long remaining_length = * object_length ;
204208
209+ if (constructed_end > total_end ) {
210+ return 0 ;
211+ }
212+
205213 while (* current_pos < constructed_end ) {
206214 start_pos = * current_pos ;
207- parse_result = asn1_parse2 (bp , current_pos , remaining_length ,
208- offset + ( * current_pos - original_start ) ,
209- depth + 1 , indent , dump );
215+ const int parse_result = asn1_parse2 (
216+ bp , current_pos , remaining_length ,
217+ offset + ( * current_pos - original_start ), depth + 1 , indent , dump );
210218 if (parse_result == 0 ) {
211219 return 0 ;
212220 }
@@ -242,6 +250,9 @@ static int asn1_parse_primitive_type(BIO *bp, const unsigned char *object_start,
242250 if (BIO_write (bp , ":" , 1 ) <= 0 ) {
243251 goto end ;
244252 }
253+ if (object_length > INT_MAX ) {
254+ return 0 ;
255+ }
245256 if ((object_length > 0 ) &&
246257 BIO_write (bp , (const char * )current_pos , (int )object_length ) !=
247258 (int )object_length ) {
@@ -444,13 +455,12 @@ static int asn1_parse_primitive_type(BIO *bp, const unsigned char *object_start,
444455static int asn1_parse2 (BIO * bp , const unsigned char * * pp , long length ,
445456 int offset , int depth , int indent , int dump ) {
446457 const unsigned char * current_pos , * total_end , * object_start ;
447- long object_length ;
458+ long object_length = 0 ;
448459 int tag , xclass , return_value = 0 ;
449- int header_length , parse_flags ;
460+ int header_length = 0 , parse_flags = 0 ;
450461
451- if (!bp || !pp ) {
452- return 0 ;
453- }
462+ GUARD_PTR (bp );
463+ GUARD_PTR (pp );
454464
455465 if (depth > ASN1_PARSE_MAXDEPTH ) {
456466 BIO_puts (bp , "BAD RECURSION DEPTH\n" );
0 commit comments