@@ -1422,6 +1422,49 @@ static void s_der_regression_test(void)
14221422 SHOULD_FAIL (der_decode_sequence_flexi (issue_507 , & len , & l ));
14231423}
14241424
1425+ static void s_der_custom_setof (void )
1426+ {
1427+ /*
1428+ * C.f. https://github.com/libtom/libtomcrypt/issues/622
1429+ *
1430+ Toy ::= SEQUENCE {
1431+ hello UTF8String,
1432+ numbers [0] IMPLICIT SET OF Number }
1433+
1434+ Number ::= INTEGER { zero(0), one(1) }
1435+
1436+ 30 0F
1437+ 0C 02 68 69
1438+ A0 09
1439+ 02 01 00
1440+ 02 01 00
1441+ 02 01 01
1442+
1443+ *
1444+ */
1445+
1446+ ltc_asn1_list setof [3 ];
1447+ ltc_asn1_list seq [2 ];
1448+ const unsigned long zero = 0 ;
1449+ const unsigned long one = 1 ;
1450+ const wchar_t * hello = L"hi" ;
1451+ unsigned char buf [32 ];
1452+ unsigned long buflen = sizeof (buf );
1453+ ltc_asn1_list * flexi ;
1454+
1455+ LTC_SET_ASN1 (setof , 0 , LTC_ASN1_SHORT_INTEGER , & one , 1 );
1456+ LTC_SET_ASN1 (setof , 1 , LTC_ASN1_SHORT_INTEGER , & zero , 1 );
1457+ LTC_SET_ASN1 (setof , 2 , LTC_ASN1_SHORT_INTEGER , & zero , 1 );
1458+
1459+ LTC_SET_ASN1 (seq , 0 , LTC_ASN1_UTF8_STRING , hello , wcslen (hello ));
1460+ LTC_SET_ASN1_CUSTOM (seq , 1 , LTC_ASN1_CL_CONTEXT_SPECIFIC , LTC_ASN1_PC_CONSTRUCTED , 0 , LTC_ASN1_SETOF , setof , 3 );
1461+ DO (der_encode_sequence (seq , 2 , buf , & buflen ));
1462+
1463+ DO (der_decode_sequence_flexi (buf , & buflen , & flexi ));
1464+ s_der_tests_print_flexi (flexi );
1465+ der_free_sequence_flexi (flexi );
1466+ }
1467+
14251468static void der_toolong_test (void )
14261469{
14271470 int n , err , failed = 0 ;
@@ -1652,6 +1695,8 @@ int der_test(void)
16521695
16531696 if (ltc_mp .name == NULL ) return CRYPT_NOP ;
16541697
1698+ s_der_custom_setof ();
1699+
16551700 s_der_recursion_limit ();
16561701
16571702 der_Xcode_test ();
0 commit comments