diff options
author | Richard Levitte <levitte@openssl.org> | 2018-09-08 10:09:32 +0200 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2018-09-09 03:35:26 +0200 |
commit | c2278c8bc41b01df9fac5fc3d7134430a88dd0e5 (patch) | |
tree | 69da60b80fbbadf4c457575b44aba206a0fb06e6 /test/asn1_decode_test.c | |
parent | d74f23d2dbf2de0f374bff004c135242cfb65174 (diff) | |
download | openssl-c2278c8bc41b01df9fac5fc3d7134430a88dd0e5.tar.gz |
TESTS: add test of decoding of invalid zero length ASN.1 INTEGER zero
Confirms #7134
Reviewed-by: Tim Hudson <tjh@openssl.org>
Reviewed-by: Paul Dale <paul.dale@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/7153)
Diffstat (limited to 'test/asn1_decode_test.c')
-rw-r--r-- | test/asn1_decode_test.c | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/test/asn1_decode_test.c b/test/asn1_decode_test.c new file mode 100644 index 0000000000..369023d5f1 --- /dev/null +++ b/test/asn1_decode_test.c @@ -0,0 +1,173 @@ +/* + * Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include <stdio.h> +#include <string.h> + +#include <openssl/rand.h> +#include <openssl/asn1t.h> +#include "internal/numbers.h" +#include "testutil.h" + +#ifdef __GNUC__ +# pragma GCC diagnostic ignored "-Wunused-function" +#endif +#ifdef __clang__ +# pragma clang diagnostic ignored "-Wunused-function" +#endif + +/* Badly coded ASN.1 INTEGER zero wrapped in a sequence */ +static unsigned char t_invalid_zero[] = { + 0x30, 0x02, /* SEQUENCE tag + length */ + 0x02, 0x00 /* INTEGER tag + length */ +}; + +#if OPENSSL_API_COMPAT < 0x10200000L +/* LONG case ************************************************************* */ + +typedef struct { + long test_long; +} ASN1_LONG_DATA; + +ASN1_SEQUENCE(ASN1_LONG_DATA) = { + ASN1_EMBED(ASN1_LONG_DATA, test_long, LONG), +} static_ASN1_SEQUENCE_END(ASN1_LONG_DATA) + +IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_LONG_DATA) +IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_LONG_DATA) + +static int test_long(void) +{ + const unsigned char *p = t_invalid_zero; + ASN1_LONG_DATA *dectst = + d2i_ASN1_LONG_DATA(NULL, &p, sizeof(t_invalid_zero)); + + if (dectst == NULL) + return 0; /* Fail */ + + ASN1_LONG_DATA_free(dectst); + return 1; +} +#endif + +/* INT32 case ************************************************************* */ + +typedef struct { + int32_t test_int32; +} ASN1_INT32_DATA; + +ASN1_SEQUENCE(ASN1_INT32_DATA) = { + ASN1_EMBED(ASN1_INT32_DATA, test_int32, INT32), +} static_ASN1_SEQUENCE_END(ASN1_INT32_DATA) + +IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_INT32_DATA) +IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_INT32_DATA) + +static int test_int32(void) +{ + const unsigned char *p = t_invalid_zero; + ASN1_INT32_DATA *dectst = + d2i_ASN1_INT32_DATA(NULL, &p, sizeof(t_invalid_zero)); + + if (dectst == NULL) + return 0; /* Fail */ + + ASN1_INT32_DATA_free(dectst); + return 1; +} + +/* UINT32 case ************************************************************* */ + +typedef struct { + uint32_t test_uint32; +} ASN1_UINT32_DATA; + +ASN1_SEQUENCE(ASN1_UINT32_DATA) = { + ASN1_EMBED(ASN1_UINT32_DATA, test_uint32, UINT32), +} static_ASN1_SEQUENCE_END(ASN1_UINT32_DATA) + +IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_UINT32_DATA) +IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_UINT32_DATA) + +static int test_uint32(void) +{ + const unsigned char *p = t_invalid_zero; + ASN1_UINT32_DATA *dectst = + d2i_ASN1_UINT32_DATA(NULL, &p, sizeof(t_invalid_zero)); + + if (dectst == NULL) + return 0; /* Fail */ + + ASN1_UINT32_DATA_free(dectst); + return 1; +} + +/* INT64 case ************************************************************* */ + +typedef struct { + int64_t test_int64; +} ASN1_INT64_DATA; + +ASN1_SEQUENCE(ASN1_INT64_DATA) = { + ASN1_EMBED(ASN1_INT64_DATA, test_int64, INT64), +} static_ASN1_SEQUENCE_END(ASN1_INT64_DATA) + +IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_INT64_DATA) +IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_INT64_DATA) + +static int test_int64(void) +{ + const unsigned char *p = t_invalid_zero; + ASN1_INT64_DATA *dectst = + d2i_ASN1_INT64_DATA(NULL, &p, sizeof(t_invalid_zero)); + + if (dectst == NULL) + return 0; /* Fail */ + + ASN1_INT64_DATA_free(dectst); + return 1; +} + +/* UINT64 case ************************************************************* */ + +typedef struct { + uint64_t test_uint64; +} ASN1_UINT64_DATA; + +ASN1_SEQUENCE(ASN1_UINT64_DATA) = { + ASN1_EMBED(ASN1_UINT64_DATA, test_uint64, UINT64), +} static_ASN1_SEQUENCE_END(ASN1_UINT64_DATA) + +IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_UINT64_DATA) +IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_UINT64_DATA) + +static int test_uint64(void) +{ + const unsigned char *p = t_invalid_zero; + ASN1_UINT64_DATA *dectst = + d2i_ASN1_UINT64_DATA(NULL, &p, sizeof(t_invalid_zero)); + + if (dectst == NULL) + return 0; /* Fail */ + + ASN1_UINT64_DATA_free(dectst); + return 1; +} + +int setup_tests(void) +{ +#if OPENSSL_API_COMPAT < 0x10200000L + ADD_TEST(test_long); +#endif + ADD_TEST(test_int32); + ADD_TEST(test_uint32); + ADD_TEST(test_int64); + ADD_TEST(test_uint64); + return 1; +} |