asn1_decode_test.c revision 1.1.1.1
1/* 2 * Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10#include <stdio.h> 11#include <string.h> 12 13#include <openssl/rand.h> 14#include <openssl/asn1t.h> 15#include "internal/numbers.h" 16#include "testutil.h" 17 18#ifdef __GNUC__ 19# pragma GCC diagnostic ignored "-Wunused-function" 20#endif 21#ifdef __clang__ 22# pragma clang diagnostic ignored "-Wunused-function" 23#endif 24 25/* Badly coded ASN.1 INTEGER zero wrapped in a sequence */ 26static unsigned char t_invalid_zero[] = { 27 0x30, 0x02, /* SEQUENCE tag + length */ 28 0x02, 0x00 /* INTEGER tag + length */ 29}; 30 31#if OPENSSL_API_COMPAT < 0x10200000L 32/* LONG case ************************************************************* */ 33 34typedef struct { 35 long test_long; 36} ASN1_LONG_DATA; 37 38ASN1_SEQUENCE(ASN1_LONG_DATA) = { 39 ASN1_EMBED(ASN1_LONG_DATA, test_long, LONG), 40} static_ASN1_SEQUENCE_END(ASN1_LONG_DATA) 41 42IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_LONG_DATA) 43IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_LONG_DATA) 44 45static int test_long(void) 46{ 47 const unsigned char *p = t_invalid_zero; 48 ASN1_LONG_DATA *dectst = 49 d2i_ASN1_LONG_DATA(NULL, &p, sizeof(t_invalid_zero)); 50 51 if (dectst == NULL) 52 return 0; /* Fail */ 53 54 ASN1_LONG_DATA_free(dectst); 55 return 1; 56} 57#endif 58 59/* INT32 case ************************************************************* */ 60 61typedef struct { 62 int32_t test_int32; 63} ASN1_INT32_DATA; 64 65ASN1_SEQUENCE(ASN1_INT32_DATA) = { 66 ASN1_EMBED(ASN1_INT32_DATA, test_int32, INT32), 67} static_ASN1_SEQUENCE_END(ASN1_INT32_DATA) 68 69IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_INT32_DATA) 70IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_INT32_DATA) 71 72static int test_int32(void) 73{ 74 const unsigned char *p = t_invalid_zero; 75 ASN1_INT32_DATA *dectst = 76 d2i_ASN1_INT32_DATA(NULL, &p, sizeof(t_invalid_zero)); 77 78 if (dectst == NULL) 79 return 0; /* Fail */ 80 81 ASN1_INT32_DATA_free(dectst); 82 return 1; 83} 84 85/* UINT32 case ************************************************************* */ 86 87typedef struct { 88 uint32_t test_uint32; 89} ASN1_UINT32_DATA; 90 91ASN1_SEQUENCE(ASN1_UINT32_DATA) = { 92 ASN1_EMBED(ASN1_UINT32_DATA, test_uint32, UINT32), 93} static_ASN1_SEQUENCE_END(ASN1_UINT32_DATA) 94 95IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_UINT32_DATA) 96IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_UINT32_DATA) 97 98static int test_uint32(void) 99{ 100 const unsigned char *p = t_invalid_zero; 101 ASN1_UINT32_DATA *dectst = 102 d2i_ASN1_UINT32_DATA(NULL, &p, sizeof(t_invalid_zero)); 103 104 if (dectst == NULL) 105 return 0; /* Fail */ 106 107 ASN1_UINT32_DATA_free(dectst); 108 return 1; 109} 110 111/* INT64 case ************************************************************* */ 112 113typedef struct { 114 int64_t test_int64; 115} ASN1_INT64_DATA; 116 117ASN1_SEQUENCE(ASN1_INT64_DATA) = { 118 ASN1_EMBED(ASN1_INT64_DATA, test_int64, INT64), 119} static_ASN1_SEQUENCE_END(ASN1_INT64_DATA) 120 121IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_INT64_DATA) 122IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_INT64_DATA) 123 124static int test_int64(void) 125{ 126 const unsigned char *p = t_invalid_zero; 127 ASN1_INT64_DATA *dectst = 128 d2i_ASN1_INT64_DATA(NULL, &p, sizeof(t_invalid_zero)); 129 130 if (dectst == NULL) 131 return 0; /* Fail */ 132 133 ASN1_INT64_DATA_free(dectst); 134 return 1; 135} 136 137/* UINT64 case ************************************************************* */ 138 139typedef struct { 140 uint64_t test_uint64; 141} ASN1_UINT64_DATA; 142 143ASN1_SEQUENCE(ASN1_UINT64_DATA) = { 144 ASN1_EMBED(ASN1_UINT64_DATA, test_uint64, UINT64), 145} static_ASN1_SEQUENCE_END(ASN1_UINT64_DATA) 146 147IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_UINT64_DATA) 148IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_UINT64_DATA) 149 150static int test_uint64(void) 151{ 152 const unsigned char *p = t_invalid_zero; 153 ASN1_UINT64_DATA *dectst = 154 d2i_ASN1_UINT64_DATA(NULL, &p, sizeof(t_invalid_zero)); 155 156 if (dectst == NULL) 157 return 0; /* Fail */ 158 159 ASN1_UINT64_DATA_free(dectst); 160 return 1; 161} 162 163int setup_tests(void) 164{ 165#if OPENSSL_API_COMPAT < 0x10200000L 166 ADD_TEST(test_long); 167#endif 168 ADD_TEST(test_int32); 169 ADD_TEST(test_uint32); 170 ADD_TEST(test_int64); 171 ADD_TEST(test_uint64); 172 return 1; 173} 174