diff options
author | Matt Caswell <matt@openssl.org> | 2020-11-30 14:46:47 +0000 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2020-12-08 10:18:44 +0000 |
commit | 433974af7b188d55b1da049b84f3fdeca320cb6a (patch) | |
tree | 896de2f81877344350b3eaf2f49e0ec859ae54e9 /test | |
parent | 94ece6af0c89d596f9c5221b7df7d6582168c8ba (diff) |
Add a test for encoding/decoding using an invalid ASN.1 Template
If you have a CHOICE type that it must use explicit tagging - otherwise
the template is invalid. We add tests for this.
Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org>
Diffstat (limited to 'test')
-rw-r--r-- | test/asn1_decode_test.c | 36 | ||||
-rw-r--r-- | test/asn1_encode_test.c | 33 |
2 files changed, 69 insertions, 0 deletions
diff --git a/test/asn1_decode_test.c b/test/asn1_decode_test.c index 369023d5f1..94a22c6682 100644 --- a/test/asn1_decode_test.c +++ b/test/asn1_decode_test.c @@ -160,6 +160,41 @@ static int test_uint64(void) return 1; } +typedef struct { + ASN1_STRING *invalidDirString; +} INVALIDTEMPLATE; + +ASN1_SEQUENCE(INVALIDTEMPLATE) = { + /* + * DirectoryString is a CHOICE type so it must use explicit tagging - + * but we deliberately use implicit here, which makes this template invalid. + */ + ASN1_IMP(INVALIDTEMPLATE, invalidDirString, DIRECTORYSTRING, 12) +} static_ASN1_SEQUENCE_END(INVALIDTEMPLATE) + +IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(INVALIDTEMPLATE) +IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(INVALIDTEMPLATE) + +/* Empty sequence for invalid template test */ +static unsigned char t_invalid_template[] = { + 0x30, 0x03, /* SEQUENCE tag + length */ + 0x0c, 0x01, 0x41 /* UTF8String, length 1, "A" */ +}; + +static int test_invalid_template(void) +{ + const unsigned char *p = t_invalid_template; + INVALIDTEMPLATE *tmp = d2i_INVALIDTEMPLATE(NULL, &p, + sizeof(t_invalid_template)); + + /* We expect a NULL pointer return */ + if (TEST_ptr_null(tmp)) + return 1; + + INVALIDTEMPLATE_free(tmp); + return 0; +} + int setup_tests(void) { #if OPENSSL_API_COMPAT < 0x10200000L @@ -169,5 +204,6 @@ int setup_tests(void) ADD_TEST(test_uint32); ADD_TEST(test_int64); ADD_TEST(test_uint64); + ADD_TEST(test_invalid_template); return 1; } diff --git a/test/asn1_encode_test.c b/test/asn1_encode_test.c index ed920a4d66..afbd18be6f 100644 --- a/test/asn1_encode_test.c +++ b/test/asn1_encode_test.c @@ -856,6 +856,38 @@ static int test_uint64(void) return test_intern(&uint64_test_package); } +typedef struct { + ASN1_STRING *invalidDirString; +} INVALIDTEMPLATE; + +ASN1_SEQUENCE(INVALIDTEMPLATE) = { + /* + * DirectoryString is a CHOICE type so it must use explicit tagging - + * but we deliberately use implicit here, which makes this template invalid. + */ + ASN1_IMP(INVALIDTEMPLATE, invalidDirString, DIRECTORYSTRING, 12) +} static_ASN1_SEQUENCE_END(INVALIDTEMPLATE) + +IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(INVALIDTEMPLATE) +IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(INVALIDTEMPLATE) + +static int test_invalid_template(void) +{ + INVALIDTEMPLATE *temp = INVALIDTEMPLATE_new(); + int ret; + + if (!TEST_ptr(temp)) + return 0; + + ret = i2d_INVALIDTEMPLATE(temp, NULL); + + INVALIDTEMPLATE_free(temp); + + /* We expect the i2d operation to fail */ + return ret < 0; +} + + int setup_tests(void) { #if OPENSSL_API_COMPAT < 0x10200000L @@ -866,5 +898,6 @@ int setup_tests(void) ADD_TEST(test_uint32); ADD_TEST(test_int64); ADD_TEST(test_uint64); + ADD_TEST(test_invalid_template); return 1; } |