1 /* 2 * Copyright 2017-2020 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 */ 26 static 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 34 typedef struct { 35 long test_long; 36 } ASN1_LONG_DATA; 37 38 ASN1_SEQUENCE(ASN1_LONG_DATA) = { 39 ASN1_EMBED(ASN1_LONG_DATA, test_long, LONG), 40 } static_ASN1_SEQUENCE_END(ASN1_LONG_DATA) 41 42 IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_LONG_DATA) 43 IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_LONG_DATA) 44 45 static 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 61 typedef struct { 62 int32_t test_int32; 63 } ASN1_INT32_DATA; 64 65 ASN1_SEQUENCE(ASN1_INT32_DATA) = { 66 ASN1_EMBED(ASN1_INT32_DATA, test_int32, INT32), 67 } static_ASN1_SEQUENCE_END(ASN1_INT32_DATA) 68 69 IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_INT32_DATA) 70 IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_INT32_DATA) 71 72 static 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 87 typedef struct { 88 uint32_t test_uint32; 89 } ASN1_UINT32_DATA; 90 91 ASN1_SEQUENCE(ASN1_UINT32_DATA) = { 92 ASN1_EMBED(ASN1_UINT32_DATA, test_uint32, UINT32), 93 } static_ASN1_SEQUENCE_END(ASN1_UINT32_DATA) 94 95 IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_UINT32_DATA) 96 IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_UINT32_DATA) 97 98 static 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 113 typedef struct { 114 int64_t test_int64; 115 } ASN1_INT64_DATA; 116 117 ASN1_SEQUENCE(ASN1_INT64_DATA) = { 118 ASN1_EMBED(ASN1_INT64_DATA, test_int64, INT64), 119 } static_ASN1_SEQUENCE_END(ASN1_INT64_DATA) 120 121 IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_INT64_DATA) 122 IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_INT64_DATA) 123 124 static 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 139 typedef struct { 140 uint64_t test_uint64; 141 } ASN1_UINT64_DATA; 142 143 ASN1_SEQUENCE(ASN1_UINT64_DATA) = { 144 ASN1_EMBED(ASN1_UINT64_DATA, test_uint64, UINT64), 145 } static_ASN1_SEQUENCE_END(ASN1_UINT64_DATA) 146 147 IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_UINT64_DATA) 148 IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_UINT64_DATA) 149 150 static 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 163 typedef struct { 164 ASN1_STRING *invalidDirString; 165 } INVALIDTEMPLATE; 166 167 ASN1_SEQUENCE(INVALIDTEMPLATE) = { 168 /* 169 * DirectoryString is a CHOICE type so it must use explicit tagging - 170 * but we deliberately use implicit here, which makes this template invalid. 171 */ 172 ASN1_IMP(INVALIDTEMPLATE, invalidDirString, DIRECTORYSTRING, 12) 173 } static_ASN1_SEQUENCE_END(INVALIDTEMPLATE) 174 175 IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(INVALIDTEMPLATE) 176 IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(INVALIDTEMPLATE) 177 178 /* Empty sequence for invalid template test */ 179 static unsigned char t_invalid_template[] = { 180 0x30, 0x03, /* SEQUENCE tag + length */ 181 0x0c, 0x01, 0x41 /* UTF8String, length 1, "A" */ 182 }; 183 184 static int test_invalid_template(void) 185 { 186 const unsigned char *p = t_invalid_template; 187 INVALIDTEMPLATE *tmp = d2i_INVALIDTEMPLATE(NULL, &p, 188 sizeof(t_invalid_template)); 189 190 /* We expect a NULL pointer return */ 191 if (TEST_ptr_null(tmp)) 192 return 1; 193 194 INVALIDTEMPLATE_free(tmp); 195 return 0; 196 } 197 198 int setup_tests(void) 199 { 200 #if OPENSSL_API_COMPAT < 0x10200000L 201 ADD_TEST(test_long); 202 #endif 203 ADD_TEST(test_int32); 204 ADD_TEST(test_uint32); 205 ADD_TEST(test_int64); 206 ADD_TEST(test_uint64); 207 ADD_TEST(test_invalid_template); 208 return 1; 209 } 210