@@ -1094,6 +1094,25 @@ static int der_choice_test(void)
10941094}
10951095
10961096
1097+ static void _der_recursion_limit (void )
1098+ {
1099+ int failed = 0 ;
1100+ unsigned int n ;
1101+ unsigned long integer = 123 , s ;
1102+ ltc_asn1_list seqs [LTC_DER_MAX_RECURSION + 2 ], dummy [1 ], * flexi ;
1103+ unsigned char buf [2048 ];
1104+ LTC_SET_ASN1 (dummy , 0 , LTC_ASN1_SHORT_INTEGER , & integer , 1 );
1105+ LTC_SET_ASN1 (seqs , LTC_DER_MAX_RECURSION + 1 , LTC_ASN1_SEQUENCE , dummy , 1 );
1106+ for (n = 0 ; n < LTC_DER_MAX_RECURSION + 1 ; ++ n ) {
1107+ LTC_SET_ASN1 (seqs , LTC_DER_MAX_RECURSION - n , LTC_ASN1_SEQUENCE , & seqs [LTC_DER_MAX_RECURSION - n + 1 ], 1 );
1108+ }
1109+ s = sizeof (buf );
1110+ DO (der_encode_sequence (seqs , 1 , buf , & s ));
1111+ DO (der_decode_sequence (buf , s , seqs , 1 ));
1112+ SHOULD_FAIL (der_decode_sequence_flexi (buf , & s , & flexi ));
1113+ if (failed ) exit (EXIT_FAILURE );
1114+ }
1115+
10971116int der_test (void )
10981117{
10991118 unsigned long x , y , z , zz , oid [2 ][32 ];
@@ -1126,6 +1145,8 @@ int der_test(void)
11261145 unsigned char utf8_buf [32 ];
11271146 wchar_t utf8_out [32 ];
11281147
1148+
1149+ _der_recursion_limit ();
11291150 der_cacert_test ();
11301151
11311152 DO (mp_init_multi (& a , & b , & c , & d , & e , & f , & g , NULL ));
0 commit comments