Home | History | Annotate | Line # | Download | only in test
      1 /*
      2  * Copyright 2017-2024 The OpenSSL Project Authors. All Rights Reserved.
      3  *
      4  * Licensed under the Apache License 2.0 (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 #pragma GCC diagnostic ignored "-Wformat"
     21 #endif
     22 #ifdef __clang__
     23 #pragma clang diagnostic ignored "-Wunused-function"
     24 #pragma clang diagnostic ignored "-Wformat"
     25 #endif
     26 
     27 /***** Custom test data ******************************************************/
     28 
     29 /*
     30  * We conduct tests with these arrays for every type we try out.
     31  * You will find the expected results together with the test structures
     32  * for each type, further down.
     33  */
     34 
     35 static unsigned char t_zero[] = {
     36     0x00
     37 };
     38 static unsigned char t_one[] = {
     39     0x01
     40 };
     41 static unsigned char t_one_neg[] = {
     42     0xff
     43 };
     44 static unsigned char t_minus_256[] = {
     45     0xff, 0x00
     46 };
     47 static unsigned char t_longundef[] = {
     48     0x7f, 0xff, 0xff, 0xff
     49 };
     50 static unsigned char t_9bytes_1[] = {
     51     0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
     52 };
     53 static unsigned char t_8bytes_1[] = {
     54     0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
     55 };
     56 static unsigned char t_8bytes_2[] = {
     57     0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
     58 };
     59 static unsigned char t_8bytes_3_pad[] = {
     60     0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
     61 };
     62 static unsigned char t_8bytes_4_neg[] = {
     63     0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
     64 };
     65 static unsigned char t_8bytes_5_negpad[] = {
     66     0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
     67 };
     68 
     69 /* 32-bit long */
     70 static unsigned char t_5bytes_1[] = {
     71     0x01, 0xff, 0xff, 0xff, 0xff
     72 };
     73 static unsigned char t_4bytes_1[] = {
     74     0x00, 0x80, 0x00, 0x00, 0x00
     75 };
     76 /* We make the last byte 0xfe to avoid a clash with ASN1_LONG_UNDEF */
     77 static unsigned char t_4bytes_2[] = {
     78     0x7f, 0xff, 0xff, 0xfe
     79 };
     80 static unsigned char t_4bytes_3_pad[] = {
     81     0x00, 0x7f, 0xff, 0xff, 0xfe
     82 };
     83 static unsigned char t_4bytes_4_neg[] = {
     84     0x80, 0x00, 0x00, 0x00
     85 };
     86 static unsigned char t_4bytes_5_negpad[] = {
     87     0xff, 0x80, 0x00, 0x00, 0x00
     88 };
     89 
     90 typedef struct {
     91     unsigned char *bytes1;
     92     size_t nbytes1;
     93     unsigned char *bytes2;
     94     size_t nbytes2;
     95 } TEST_CUSTOM_DATA;
     96 #define CUSTOM_DATA(v)                      \
     97     { v, sizeof(v), t_one, sizeof(t_one) }, \
     98     {                                       \
     99         t_one, sizeof(t_one), v, sizeof(v)  \
    100     }
    101 
    102 static TEST_CUSTOM_DATA test_custom_data[] = {
    103     CUSTOM_DATA(t_zero),
    104     CUSTOM_DATA(t_longundef),
    105     CUSTOM_DATA(t_one),
    106     CUSTOM_DATA(t_one_neg),
    107     CUSTOM_DATA(t_minus_256),
    108     CUSTOM_DATA(t_9bytes_1),
    109     CUSTOM_DATA(t_8bytes_1),
    110     CUSTOM_DATA(t_8bytes_2),
    111     CUSTOM_DATA(t_8bytes_3_pad),
    112     CUSTOM_DATA(t_8bytes_4_neg),
    113     CUSTOM_DATA(t_8bytes_5_negpad),
    114     CUSTOM_DATA(t_5bytes_1),
    115     CUSTOM_DATA(t_4bytes_1),
    116     CUSTOM_DATA(t_4bytes_2),
    117     CUSTOM_DATA(t_4bytes_3_pad),
    118     CUSTOM_DATA(t_4bytes_4_neg),
    119     CUSTOM_DATA(t_4bytes_5_negpad),
    120 };
    121 
    122 /***** Type specific test data ***********************************************/
    123 
    124 /*
    125  * First, a few utility things that all type specific data can use, or in some
    126  * cases, MUST use.
    127  */
    128 
    129 /*
    130  * For easy creation of arrays of expected data.  These macros correspond to
    131  * the uses of CUSTOM_DATA above.
    132  */
    133 #define CUSTOM_EXPECTED_SUCCESS(num, znum) \
    134     { 0xff, num, 1 },                      \
    135     {                                      \
    136         0xff, 1, znum                      \
    137     }
    138 #define CUSTOM_EXPECTED_FAILURE \
    139     { 0, 0, 0 },                \
    140         { 0, 0, 0 }
    141 
    142 /*
    143  * A structure to collect all test information in.  There MUST be one instance
    144  * of this for each test
    145  */
    146 typedef int i2d_fn(void *a, unsigned char **pp);
    147 typedef void *d2i_fn(void **a, unsigned char **pp, long length);
    148 typedef void ifree_fn(void *a);
    149 typedef struct {
    150     ASN1_ITEM_EXP *asn1_type;
    151     const char *name;
    152     int skip; /* 1 if this package should be skipped */
    153 
    154     /* An array of structures to compare decoded custom data with */
    155     void *encode_expectations;
    156     size_t encode_expectations_size;
    157     size_t encode_expectations_elem_size;
    158 
    159     /*
    160      * An array of structures that are encoded into a DER blob, which is
    161      * then decoded, and result gets compared with the original.
    162      */
    163     void *encdec_data;
    164     size_t encdec_data_size;
    165     size_t encdec_data_elem_size;
    166 
    167     /* The i2d function to use with this type */
    168     i2d_fn *i2d;
    169     /* The d2i function to use with this type */
    170     d2i_fn *d2i;
    171     /* Function to free a decoded structure */
    172     ifree_fn *ifree;
    173 } TEST_PACKAGE;
    174 
    175 /* To facilitate the creation of an encdec_data array */
    176 #define ENCDEC_DATA(num, znum) \
    177     { 0xff, num, 1 }, { 0xff, 1, znum }
    178 #define ENCDEC_ARRAY(max, zmax, min, zmin) \
    179     ENCDEC_DATA(max, zmax),                \
    180         ENCDEC_DATA(min, zmin),            \
    181         ENCDEC_DATA(1, 1),                 \
    182         ENCDEC_DATA(-1, -1),               \
    183         ENCDEC_DATA(0, ASN1_LONG_UNDEF)
    184 
    185 #ifndef OPENSSL_NO_DEPRECATED_3_0
    186 /***** LONG ******************************************************************/
    187 
    188 typedef struct {
    189     /* If decoding is expected to succeed, set this to 1, otherwise 0 */
    190     ASN1_BOOLEAN success;
    191     long test_long;
    192     long test_zlong;
    193 } ASN1_LONG_DATA;
    194 
    195 ASN1_SEQUENCE(ASN1_LONG_DATA) = {
    196     ASN1_SIMPLE(ASN1_LONG_DATA, success, ASN1_BOOLEAN),
    197     ASN1_SIMPLE(ASN1_LONG_DATA, test_long, LONG),
    198     ASN1_EXP_OPT(ASN1_LONG_DATA, test_zlong, ZLONG, 0)
    199 } static_ASN1_SEQUENCE_END(ASN1_LONG_DATA)
    200 
    201     IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_LONG_DATA)
    202 IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_LONG_DATA)
    203 
    204 static ASN1_LONG_DATA long_expected_32bit[] = {
    205     /* The following should fail on the second because it's the default */
    206     { 0xff, 0, 1 },
    207     { 0, 0, 0 }, /* t_zero */
    208     { 0, 0, 0 },
    209     { 0xff, 1, 0x7fffffff }, /* t_longundef */
    210     CUSTOM_EXPECTED_SUCCESS(1, 1), /* t_one */
    211     CUSTOM_EXPECTED_SUCCESS(-1, -1), /* t_one_neg */
    212     CUSTOM_EXPECTED_SUCCESS(-256, -256), /* t_minus_256 */
    213     CUSTOM_EXPECTED_FAILURE, /* t_9bytes_1 */
    214     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_1 */
    215     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_2 */
    216     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_3_pad */
    217     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_4_neg */
    218     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_5_negpad */
    219     CUSTOM_EXPECTED_FAILURE, /* t_5bytes_1 */
    220     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_1 (too large positive) */
    221     CUSTOM_EXPECTED_SUCCESS(INT32_MAX - 1, INT32_MAX - 1), /* t_4bytes_2 */
    222     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_3_pad (illegal padding) */
    223     CUSTOM_EXPECTED_SUCCESS(INT32_MIN, INT32_MIN), /* t_4bytes_4_neg */
    224     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_5_negpad (illegal padding) */
    225 };
    226 static ASN1_LONG_DATA long_encdec_data_32bit[] = {
    227     ENCDEC_ARRAY(LONG_MAX - 1, LONG_MAX, LONG_MIN, LONG_MIN),
    228     /* Check that default numbers fail */
    229     { 0, ASN1_LONG_UNDEF, 1 }, { 0, 1, 0 }
    230 };
    231 
    232 static TEST_PACKAGE long_test_package_32bit = {
    233     ASN1_ITEM_ref(ASN1_LONG_DATA), "LONG", sizeof(long) != 4,
    234     long_expected_32bit,
    235     sizeof(long_expected_32bit), sizeof(long_expected_32bit[0]),
    236     long_encdec_data_32bit,
    237     sizeof(long_encdec_data_32bit), sizeof(long_encdec_data_32bit[0]),
    238     (i2d_fn *)i2d_ASN1_LONG_DATA, (d2i_fn *)d2i_ASN1_LONG_DATA,
    239     (ifree_fn *)ASN1_LONG_DATA_free
    240 };
    241 
    242 static ASN1_LONG_DATA long_expected_64bit[] = {
    243     /* The following should fail on the second because it's the default */
    244     { 0xff, 0, 1 },
    245     { 0, 0, 0 }, /* t_zero */
    246     { 0, 0, 0 },
    247     { 0xff, 1, 0x7fffffff }, /* t_longundef */
    248     CUSTOM_EXPECTED_SUCCESS(1, 1), /* t_one */
    249     CUSTOM_EXPECTED_SUCCESS(-1, -1), /* t_one_neg */
    250     CUSTOM_EXPECTED_SUCCESS(-256, -256), /* t_minus_256 */
    251     CUSTOM_EXPECTED_FAILURE, /* t_9bytes_1 */
    252     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_1 */
    253     CUSTOM_EXPECTED_SUCCESS(LONG_MAX, LONG_MAX), /* t_8bytes_2 */
    254     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_3_pad (illegal padding) */
    255     CUSTOM_EXPECTED_SUCCESS(LONG_MIN, LONG_MIN), /* t_8bytes_4_neg */
    256     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_5_negpad (illegal padding) */
    257     CUSTOM_EXPECTED_SUCCESS((long)0x1ffffffff, (long)0x1ffffffff), /* t_5bytes_1 */
    258     CUSTOM_EXPECTED_SUCCESS((long)0x80000000, (long)0x80000000), /* t_4bytes_1 */
    259     CUSTOM_EXPECTED_SUCCESS(INT32_MAX - 1, INT32_MAX - 1), /* t_4bytes_2 */
    260     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_3_pad (illegal padding) */
    261     CUSTOM_EXPECTED_SUCCESS(INT32_MIN, INT32_MIN), /* t_4bytes_4_neg */
    262     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_5_negpad (illegal padding) */
    263 };
    264 static ASN1_LONG_DATA long_encdec_data_64bit[] = {
    265     ENCDEC_ARRAY(LONG_MAX, LONG_MAX, LONG_MIN, LONG_MIN),
    266     /* Check that default numbers fail */
    267     { 0, ASN1_LONG_UNDEF, 1 }, { 0, 1, 0 }
    268 };
    269 
    270 static TEST_PACKAGE long_test_package_64bit = {
    271     ASN1_ITEM_ref(ASN1_LONG_DATA), "LONG", sizeof(long) != 8,
    272     long_expected_64bit,
    273     sizeof(long_expected_64bit), sizeof(long_expected_64bit[0]),
    274     long_encdec_data_64bit,
    275     sizeof(long_encdec_data_64bit), sizeof(long_encdec_data_64bit[0]),
    276     (i2d_fn *)i2d_ASN1_LONG_DATA, (d2i_fn *)d2i_ASN1_LONG_DATA,
    277     (ifree_fn *)ASN1_LONG_DATA_free
    278 };
    279 #endif
    280 
    281 /***** INT32 *****************************************************************/
    282 
    283 typedef struct {
    284     ASN1_BOOLEAN success;
    285     int32_t test_int32;
    286     int32_t test_zint32;
    287 } ASN1_INT32_DATA;
    288 
    289 ASN1_SEQUENCE(ASN1_INT32_DATA) = {
    290     ASN1_SIMPLE(ASN1_INT32_DATA, success, ASN1_BOOLEAN),
    291     ASN1_EMBED(ASN1_INT32_DATA, test_int32, INT32),
    292     ASN1_EXP_OPT_EMBED(ASN1_INT32_DATA, test_zint32, ZINT32, 0)
    293 } static_ASN1_SEQUENCE_END(ASN1_INT32_DATA)
    294 
    295     IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_INT32_DATA)
    296 IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_INT32_DATA)
    297 
    298 static ASN1_INT32_DATA int32_expected[] = {
    299     CUSTOM_EXPECTED_SUCCESS(0, 0), /* t_zero */
    300     CUSTOM_EXPECTED_SUCCESS(ASN1_LONG_UNDEF, ASN1_LONG_UNDEF), /* t_zero */
    301     CUSTOM_EXPECTED_SUCCESS(1, 1), /* t_one */
    302     CUSTOM_EXPECTED_SUCCESS(-1, -1), /* t_one_neg */
    303     CUSTOM_EXPECTED_SUCCESS(-256, -256), /* t_minus_256 */
    304     CUSTOM_EXPECTED_FAILURE, /* t_9bytes_1 */
    305     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_1 */
    306     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_2 */
    307     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_3_pad */
    308     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_4_neg */
    309     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_5_negpad */
    310     CUSTOM_EXPECTED_FAILURE, /* t_5bytes_1 */
    311     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_1 (too large positive) */
    312     CUSTOM_EXPECTED_SUCCESS(INT32_MAX - 1, INT32_MAX - 1), /* t_4bytes_2 */
    313     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_3_pad (illegal padding) */
    314     CUSTOM_EXPECTED_SUCCESS(INT32_MIN, INT32_MIN), /* t_4bytes_4_neg */
    315     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_5_negpad (illegal padding) */
    316 };
    317 static ASN1_INT32_DATA int32_encdec_data[] = {
    318     ENCDEC_ARRAY(INT32_MAX, INT32_MAX, INT32_MIN, INT32_MIN),
    319 };
    320 
    321 static TEST_PACKAGE int32_test_package = {
    322     ASN1_ITEM_ref(ASN1_INT32_DATA), "INT32", 0,
    323     int32_expected, sizeof(int32_expected), sizeof(int32_expected[0]),
    324     int32_encdec_data, sizeof(int32_encdec_data), sizeof(int32_encdec_data[0]),
    325     (i2d_fn *)i2d_ASN1_INT32_DATA, (d2i_fn *)d2i_ASN1_INT32_DATA,
    326     (ifree_fn *)ASN1_INT32_DATA_free
    327 };
    328 
    329 /***** UINT32 ****************************************************************/
    330 
    331 typedef struct {
    332     ASN1_BOOLEAN success;
    333     uint32_t test_uint32;
    334     uint32_t test_zuint32;
    335 } ASN1_UINT32_DATA;
    336 
    337 ASN1_SEQUENCE(ASN1_UINT32_DATA) = {
    338     ASN1_SIMPLE(ASN1_UINT32_DATA, success, ASN1_BOOLEAN),
    339     ASN1_EMBED(ASN1_UINT32_DATA, test_uint32, UINT32),
    340     ASN1_EXP_OPT_EMBED(ASN1_UINT32_DATA, test_zuint32, ZUINT32, 0)
    341 } static_ASN1_SEQUENCE_END(ASN1_UINT32_DATA)
    342 
    343     IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_UINT32_DATA)
    344 IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_UINT32_DATA)
    345 
    346 static ASN1_UINT32_DATA uint32_expected[] = {
    347     CUSTOM_EXPECTED_SUCCESS(0, 0), /* t_zero */
    348     CUSTOM_EXPECTED_SUCCESS(ASN1_LONG_UNDEF, ASN1_LONG_UNDEF), /* t_zero */
    349     CUSTOM_EXPECTED_SUCCESS(1, 1), /* t_one */
    350     CUSTOM_EXPECTED_FAILURE, /* t_one_neg (illegal negative value) */
    351     CUSTOM_EXPECTED_FAILURE, /* t_minus_256 (illegal negative value) */
    352     CUSTOM_EXPECTED_FAILURE, /* t_9bytes_1 */
    353     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_1 */
    354     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_2 */
    355     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_3_pad */
    356     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_4_neg */
    357     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_5_negpad */
    358     CUSTOM_EXPECTED_FAILURE, /* t_5bytes_1 */
    359     CUSTOM_EXPECTED_SUCCESS(0x80000000, 0x80000000), /* t_4bytes_1 */
    360     CUSTOM_EXPECTED_SUCCESS(INT32_MAX - 1, INT32_MAX - 1), /* t_4bytes_2 */
    361     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_3_pad (illegal padding) */
    362     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_4_neg (illegal negative value) */
    363     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_5_negpad (illegal padding) */
    364 };
    365 static ASN1_UINT32_DATA uint32_encdec_data[] = {
    366     ENCDEC_ARRAY(UINT32_MAX, UINT32_MAX, 0, 0),
    367 };
    368 
    369 static TEST_PACKAGE uint32_test_package = {
    370     ASN1_ITEM_ref(ASN1_UINT32_DATA), "UINT32", 0,
    371     uint32_expected, sizeof(uint32_expected), sizeof(uint32_expected[0]),
    372     uint32_encdec_data, sizeof(uint32_encdec_data), sizeof(uint32_encdec_data[0]),
    373     (i2d_fn *)i2d_ASN1_UINT32_DATA, (d2i_fn *)d2i_ASN1_UINT32_DATA,
    374     (ifree_fn *)ASN1_UINT32_DATA_free
    375 };
    376 
    377 /***** INT64 *****************************************************************/
    378 
    379 typedef struct {
    380     ASN1_BOOLEAN success;
    381     int64_t test_int64;
    382     int64_t test_zint64;
    383 } ASN1_INT64_DATA;
    384 
    385 ASN1_SEQUENCE(ASN1_INT64_DATA) = {
    386     ASN1_SIMPLE(ASN1_INT64_DATA, success, ASN1_BOOLEAN),
    387     ASN1_EMBED(ASN1_INT64_DATA, test_int64, INT64),
    388     ASN1_EXP_OPT_EMBED(ASN1_INT64_DATA, test_zint64, ZINT64, 0)
    389 } static_ASN1_SEQUENCE_END(ASN1_INT64_DATA)
    390 
    391     IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_INT64_DATA)
    392 IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_INT64_DATA)
    393 
    394 static ASN1_INT64_DATA int64_expected[] = {
    395     CUSTOM_EXPECTED_SUCCESS(0, 0), /* t_zero */
    396     CUSTOM_EXPECTED_SUCCESS(ASN1_LONG_UNDEF, ASN1_LONG_UNDEF), /* t_zero */
    397     CUSTOM_EXPECTED_SUCCESS(1, 1), /* t_one */
    398     CUSTOM_EXPECTED_SUCCESS(-1, -1), /* t_one_neg */
    399     CUSTOM_EXPECTED_SUCCESS(-256, -256), /* t_minus_256 */
    400     CUSTOM_EXPECTED_FAILURE, /* t_9bytes_1 */
    401     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_1 (too large positive) */
    402     CUSTOM_EXPECTED_SUCCESS(INT64_MAX, INT64_MAX), /* t_8bytes_2 */
    403     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_3_pad (illegal padding) */
    404     CUSTOM_EXPECTED_SUCCESS(INT64_MIN, INT64_MIN), /* t_8bytes_4_neg */
    405     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_5_negpad (illegal padding) */
    406     CUSTOM_EXPECTED_SUCCESS(0x1ffffffffULL, 0x1ffffffffULL), /* t_5bytes_1 */
    407     CUSTOM_EXPECTED_SUCCESS(0x80000000, 0x80000000), /* t_4bytes_1 */
    408     CUSTOM_EXPECTED_SUCCESS(INT32_MAX - 1, INT32_MAX - 1), /* t_4bytes_2 */
    409     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_3_pad (illegal padding) */
    410     CUSTOM_EXPECTED_SUCCESS(INT32_MIN, INT32_MIN), /* t_4bytes_4_neg */
    411     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_5_negpad (illegal padding) */
    412 };
    413 static ASN1_INT64_DATA int64_encdec_data[] = {
    414     ENCDEC_ARRAY(INT64_MAX, INT64_MAX, INT64_MIN, INT64_MIN),
    415     ENCDEC_ARRAY(INT32_MAX, INT32_MAX, INT32_MIN, INT32_MIN),
    416 };
    417 
    418 static TEST_PACKAGE int64_test_package = {
    419     ASN1_ITEM_ref(ASN1_INT64_DATA), "INT64", 0,
    420     int64_expected, sizeof(int64_expected), sizeof(int64_expected[0]),
    421     int64_encdec_data, sizeof(int64_encdec_data), sizeof(int64_encdec_data[0]),
    422     (i2d_fn *)i2d_ASN1_INT64_DATA, (d2i_fn *)d2i_ASN1_INT64_DATA,
    423     (ifree_fn *)ASN1_INT64_DATA_free
    424 };
    425 
    426 /***** UINT64 ****************************************************************/
    427 
    428 typedef struct {
    429     ASN1_BOOLEAN success;
    430     uint64_t test_uint64;
    431     uint64_t test_zuint64;
    432 } ASN1_UINT64_DATA;
    433 
    434 ASN1_SEQUENCE(ASN1_UINT64_DATA) = {
    435     ASN1_SIMPLE(ASN1_UINT64_DATA, success, ASN1_BOOLEAN),
    436     ASN1_EMBED(ASN1_UINT64_DATA, test_uint64, UINT64),
    437     ASN1_EXP_OPT_EMBED(ASN1_UINT64_DATA, test_zuint64, ZUINT64, 0)
    438 } static_ASN1_SEQUENCE_END(ASN1_UINT64_DATA)
    439 
    440     IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(ASN1_UINT64_DATA)
    441 IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(ASN1_UINT64_DATA)
    442 
    443 static ASN1_UINT64_DATA uint64_expected[] = {
    444     CUSTOM_EXPECTED_SUCCESS(0, 0), /* t_zero */
    445     CUSTOM_EXPECTED_SUCCESS(ASN1_LONG_UNDEF, ASN1_LONG_UNDEF), /* t_zero */
    446     CUSTOM_EXPECTED_SUCCESS(1, 1), /* t_one */
    447     CUSTOM_EXPECTED_FAILURE, /* t_one_neg (illegal negative value) */
    448     CUSTOM_EXPECTED_FAILURE, /* t_minus_256 (illegal negative value) */
    449     CUSTOM_EXPECTED_FAILURE, /* t_9bytes_1 */
    450     CUSTOM_EXPECTED_SUCCESS((uint64_t)INT64_MAX + 1, (uint64_t)INT64_MAX + 1),
    451     /* t_8bytes_1 */
    452     CUSTOM_EXPECTED_SUCCESS(INT64_MAX, INT64_MAX), /* t_8bytes_2 */
    453     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_3_pad */
    454     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_4_neg */
    455     CUSTOM_EXPECTED_FAILURE, /* t_8bytes_5_negpad */
    456     CUSTOM_EXPECTED_SUCCESS(0x1ffffffffULL, 0x1ffffffffULL), /* t_5bytes_1 */
    457     CUSTOM_EXPECTED_SUCCESS(0x80000000, 0x80000000), /* t_4bytes_1 */
    458     CUSTOM_EXPECTED_SUCCESS(INT32_MAX - 1, INT32_MAX - 1), /* t_4bytes_2 */
    459     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_3_pad (illegal padding) */
    460     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_4_neg (illegal negative value) */
    461     CUSTOM_EXPECTED_FAILURE, /* t_4bytes_5_negpad (illegal padding) */
    462 };
    463 static ASN1_UINT64_DATA uint64_encdec_data[] = {
    464     ENCDEC_ARRAY(UINT64_MAX, UINT64_MAX, 0, 0),
    465 };
    466 
    467 static TEST_PACKAGE uint64_test_package = {
    468     ASN1_ITEM_ref(ASN1_UINT64_DATA), "UINT64", 0,
    469     uint64_expected, sizeof(uint64_expected), sizeof(uint64_expected[0]),
    470     uint64_encdec_data, sizeof(uint64_encdec_data), sizeof(uint64_encdec_data[0]),
    471     (i2d_fn *)i2d_ASN1_UINT64_DATA, (d2i_fn *)d2i_ASN1_UINT64_DATA,
    472     (ifree_fn *)ASN1_UINT64_DATA_free
    473 };
    474 
    475 /***** General testing functions *********************************************/
    476 
    477 /* Template structure to map onto any test data structure */
    478 typedef struct {
    479     ASN1_BOOLEAN success;
    480     unsigned char bytes[1]; /* In reality, there's more */
    481 } EXPECTED;
    482 
    483 /*
    484  * do_decode returns a tristate:
    485  *
    486  *      -1      Couldn't decode
    487  *      0       decoded structure wasn't what was expected (failure)
    488  *      1       decoded structure was what was expected (success)
    489  */
    490 static int do_decode(unsigned char *bytes, long nbytes,
    491     const EXPECTED *expected, size_t expected_size,
    492     const TEST_PACKAGE *package)
    493 {
    494     EXPECTED *enctst = NULL;
    495     const unsigned char *start;
    496     int ret = 0;
    497 
    498     start = bytes;
    499     enctst = package->d2i(NULL, &bytes, nbytes);
    500     if (enctst == NULL) {
    501         if (expected->success == 0) {
    502             ret = 1;
    503             ERR_clear_error();
    504         } else {
    505             ret = -1;
    506         }
    507     } else {
    508         if (start + nbytes == bytes
    509             && memcmp(enctst, expected, expected_size) == 0)
    510             ret = 1;
    511         else
    512             ret = 0;
    513     }
    514 
    515     package->ifree(enctst);
    516     return ret;
    517 }
    518 
    519 /*
    520  * do_encode returns a tristate:
    521  *
    522  *      -1      Couldn't encode
    523  *      0       encoded DER wasn't what was expected (failure)
    524  *      1       encoded DER was what was expected (success)
    525  */
    526 static int do_encode(EXPECTED *input,
    527     const unsigned char *expected, size_t expected_len,
    528     const TEST_PACKAGE *package)
    529 {
    530     unsigned char *data = NULL;
    531     int len;
    532     int ret = 0;
    533 
    534     len = package->i2d(input, &data);
    535     if (len < 0)
    536         return -1;
    537 
    538     if ((size_t)len != expected_len
    539         || memcmp(data, expected, expected_len) != 0) {
    540         if (input->success == 0) {
    541             ret = 1;
    542             ERR_clear_error();
    543         } else {
    544             ret = 0;
    545         }
    546     } else {
    547         ret = 1;
    548     }
    549 
    550     OPENSSL_free(data);
    551     return ret;
    552 }
    553 
    554 /* Do an encode/decode round trip */
    555 static int do_enc_dec(EXPECTED *bytes, long nbytes,
    556     const TEST_PACKAGE *package)
    557 {
    558     unsigned char *data = NULL;
    559     int len;
    560     int ret = 0;
    561     void *p = bytes;
    562 
    563     len = package->i2d(p, &data);
    564     if (len < 0)
    565         return -1;
    566 
    567     ret = do_decode(data, len, bytes, nbytes, package);
    568     OPENSSL_free(data);
    569     return ret;
    570 }
    571 
    572 static size_t der_encode_length(size_t len, unsigned char **pp)
    573 {
    574     size_t lenbytes;
    575 
    576     OPENSSL_assert(len < 0x8000);
    577     if (len > 255)
    578         lenbytes = 3;
    579     else if (len > 127)
    580         lenbytes = 2;
    581     else
    582         lenbytes = 1;
    583 
    584     if (pp != NULL) {
    585         if (lenbytes == 1) {
    586             *(*pp)++ = (unsigned char)len;
    587         } else {
    588             *(*pp)++ = (unsigned char)(lenbytes - 1);
    589             if (lenbytes == 2) {
    590                 *(*pp)++ = (unsigned char)(0x80 | len);
    591             } else {
    592                 *(*pp)++ = (unsigned char)(0x80 | (len >> 8));
    593                 *(*pp)++ = (unsigned char)(len);
    594             }
    595         }
    596     }
    597     return lenbytes;
    598 }
    599 
    600 static size_t make_custom_der(const TEST_CUSTOM_DATA *custom_data,
    601     unsigned char **encoding, int explicit_default)
    602 {
    603     size_t firstbytes, secondbytes = 0, secondbytesinner = 0, seqbytes;
    604     const unsigned char t_true[] = { V_ASN1_BOOLEAN, 0x01, 0xff };
    605     unsigned char *p = NULL;
    606     size_t i;
    607 
    608     /*
    609      * The first item is just an INTEGER tag, INTEGER length and INTEGER content
    610      */
    611     firstbytes = 1 + der_encode_length(custom_data->nbytes1, NULL)
    612         + custom_data->nbytes1;
    613 
    614     for (i = custom_data->nbytes2; i > 0; i--) {
    615         if (custom_data->bytes2[i - 1] != '\0')
    616             break;
    617     }
    618     if (explicit_default || i > 0) {
    619         /*
    620          * The second item is an explicit tag, content length, INTEGER tag,
    621          * INTEGER length, INTEGER bytes
    622          */
    623         secondbytesinner = 1 + der_encode_length(custom_data->nbytes2, NULL)
    624             + custom_data->nbytes2;
    625         secondbytes = 1 + der_encode_length(secondbytesinner, NULL) + secondbytesinner;
    626     }
    627 
    628     /*
    629      * The whole sequence is the sequence tag, content length, BOOLEAN true
    630      * (copied from t_true), the first (firstbytes) and second (secondbytes)
    631      * items
    632      */
    633     seqbytes = 1 + der_encode_length(sizeof(t_true) + firstbytes + secondbytes, NULL)
    634         + sizeof(t_true) + firstbytes + secondbytes;
    635 
    636     *encoding = p = OPENSSL_malloc(seqbytes);
    637     if (*encoding == NULL)
    638         return 0;
    639 
    640     /* Sequence tag */
    641     *p++ = 0x30;
    642     der_encode_length(sizeof(t_true) + firstbytes + secondbytes, &p);
    643 
    644     /* ASN1_BOOLEAN TRUE */
    645     memcpy(p, t_true, sizeof(t_true)); /* Marks decoding success */
    646     p += sizeof(t_true);
    647 
    648     /* First INTEGER item (non-optional) */
    649     *p++ = V_ASN1_INTEGER;
    650     der_encode_length(custom_data->nbytes1, &p);
    651     memcpy(p, custom_data->bytes1, custom_data->nbytes1);
    652     p += custom_data->nbytes1;
    653 
    654     if (secondbytes > 0) {
    655         /* Second INTEGER item (optional) */
    656         /* Start with the explicit optional tag */
    657         *p++ = 0xa0;
    658         der_encode_length(secondbytesinner, &p);
    659         *p++ = V_ASN1_INTEGER;
    660         der_encode_length(custom_data->nbytes2, &p);
    661         memcpy(p, custom_data->bytes2, custom_data->nbytes2);
    662         p += custom_data->nbytes2;
    663     }
    664 
    665     OPENSSL_assert(seqbytes == (size_t)(p - *encoding));
    666 
    667     return seqbytes;
    668 }
    669 
    670 /* Attempt to decode a custom encoding of the test structure */
    671 static int do_decode_custom(const TEST_CUSTOM_DATA *custom_data,
    672     const EXPECTED *expected, size_t expected_size,
    673     const TEST_PACKAGE *package)
    674 {
    675     unsigned char *encoding = NULL;
    676     /*
    677      * We force the defaults to be explicitly encoded to make sure we test
    678      * for defaults that shouldn't be present (i.e. we check for failure)
    679      */
    680     size_t encoding_length = make_custom_der(custom_data, &encoding, 1);
    681     int ret;
    682 
    683     if (encoding_length == 0)
    684         return -1;
    685 
    686     ret = do_decode(encoding, encoding_length, expected, expected_size,
    687         package);
    688     OPENSSL_free(encoding);
    689 
    690     return ret;
    691 }
    692 
    693 /* Attempt to encode the test structure and compare it to custom DER */
    694 static int do_encode_custom(EXPECTED *input,
    695     const TEST_CUSTOM_DATA *custom_data,
    696     const TEST_PACKAGE *package)
    697 {
    698     unsigned char *expected = NULL;
    699     size_t expected_length = make_custom_der(custom_data, &expected, 0);
    700     int ret;
    701 
    702     if (expected_length == 0)
    703         return -1;
    704 
    705     ret = do_encode(input, expected, expected_length, package);
    706     OPENSSL_free(expected);
    707 
    708     return ret;
    709 }
    710 
    711 static int do_print_item(const TEST_PACKAGE *package)
    712 {
    713 #define DATA_BUF_SIZE 256
    714     const ASN1_ITEM *i = ASN1_ITEM_ptr(package->asn1_type);
    715     ASN1_VALUE *o;
    716     int ret;
    717 
    718     OPENSSL_assert(package->encode_expectations_elem_size <= DATA_BUF_SIZE);
    719     if ((o = OPENSSL_malloc(DATA_BUF_SIZE)) == NULL)
    720         return 0;
    721 
    722     (void)RAND_bytes((unsigned char *)o,
    723         (int)package->encode_expectations_elem_size);
    724     ret = ASN1_item_print(bio_err, o, 0, i, NULL);
    725     OPENSSL_free(o);
    726 
    727     return ret;
    728 }
    729 
    730 static int test_intern(const TEST_PACKAGE *package)
    731 {
    732     unsigned int i;
    733     size_t nelems;
    734     int fail = 0;
    735 
    736     if (package->skip)
    737         return 1;
    738 
    739     /* Do decode_custom checks */
    740     nelems = package->encode_expectations_size
    741         / package->encode_expectations_elem_size;
    742     OPENSSL_assert(nelems == OSSL_NELEM(test_custom_data));
    743     for (i = 0; i < nelems; i++) {
    744         size_t pos = i * package->encode_expectations_elem_size;
    745         EXPECTED *expected
    746             = (EXPECTED *)&((unsigned char *)package->encode_expectations)[pos];
    747 
    748         switch (do_encode_custom(expected, &test_custom_data[i], package)) {
    749         case -1:
    750             if (expected->success) {
    751                 TEST_error("Failed custom encode round trip %u of %s",
    752                     i, package->name);
    753                 TEST_openssl_errors();
    754                 fail++;
    755             }
    756             break;
    757         case 0:
    758             TEST_error("Custom encode round trip %u of %s mismatch",
    759                 i, package->name);
    760             TEST_openssl_errors();
    761             fail++;
    762             break;
    763         case 1:
    764             break;
    765         default:
    766             OPENSSL_die("do_encode_custom() return unknown value",
    767                 __FILE__, __LINE__);
    768         }
    769         switch (do_decode_custom(&test_custom_data[i], expected,
    770             package->encode_expectations_elem_size,
    771             package)) {
    772         case -1:
    773             if (expected->success) {
    774                 TEST_error("Failed custom decode round trip %u of %s",
    775                     i, package->name);
    776                 TEST_openssl_errors();
    777                 fail++;
    778             }
    779             break;
    780         case 0:
    781             TEST_error("Custom decode round trip %u of %s mismatch",
    782                 i, package->name);
    783             TEST_openssl_errors();
    784             fail++;
    785             break;
    786         case 1:
    787             break;
    788         default:
    789             OPENSSL_die("do_decode_custom() return unknown value",
    790                 __FILE__, __LINE__);
    791         }
    792     }
    793 
    794     /* Do enc_dec checks */
    795     nelems = package->encdec_data_size / package->encdec_data_elem_size;
    796     for (i = 0; i < nelems; i++) {
    797         size_t pos = i * package->encdec_data_elem_size;
    798         EXPECTED *expected
    799             = (EXPECTED *)&((unsigned char *)package->encdec_data)[pos];
    800 
    801         switch (do_enc_dec(expected, package->encdec_data_elem_size, package)) {
    802         case -1:
    803             if (expected->success) {
    804                 TEST_error("Failed encode/decode round trip %u of %s",
    805                     i, package->name);
    806                 TEST_openssl_errors();
    807                 fail++;
    808             }
    809             break;
    810         case 0:
    811             TEST_error("Encode/decode round trip %u of %s mismatch",
    812                 i, package->name);
    813             fail++;
    814             break;
    815         case 1:
    816             break;
    817         default:
    818             OPENSSL_die("do_enc_dec() return unknown value",
    819                 __FILE__, __LINE__);
    820         }
    821     }
    822 
    823     if (!do_print_item(package)) {
    824         TEST_error("Printing of %s failed", package->name);
    825         TEST_openssl_errors();
    826         fail++;
    827     }
    828 
    829     return fail == 0;
    830 }
    831 
    832 #ifndef OPENSSL_NO_DEPRECATED_3_0
    833 static int test_long_32bit(void)
    834 {
    835     return test_intern(&long_test_package_32bit);
    836 }
    837 
    838 static int test_long_64bit(void)
    839 {
    840     return test_intern(&long_test_package_64bit);
    841 }
    842 #endif
    843 
    844 static int test_int32(void)
    845 {
    846     return test_intern(&int32_test_package);
    847 }
    848 
    849 static int test_uint32(void)
    850 {
    851     return test_intern(&uint32_test_package);
    852 }
    853 
    854 static int test_int64(void)
    855 {
    856     return test_intern(&int64_test_package);
    857 }
    858 
    859 static int test_uint64(void)
    860 {
    861     return test_intern(&uint64_test_package);
    862 }
    863 
    864 typedef struct {
    865     ASN1_STRING *invalidDirString;
    866 } INVALIDTEMPLATE;
    867 
    868 ASN1_SEQUENCE(INVALIDTEMPLATE) = {
    869     /*
    870      * DirectoryString is a CHOICE type so it must use explicit tagging -
    871      * but we deliberately use implicit here, which makes this template invalid.
    872      */
    873     ASN1_IMP(INVALIDTEMPLATE, invalidDirString, DIRECTORYSTRING, 12)
    874 } static_ASN1_SEQUENCE_END(INVALIDTEMPLATE)
    875 
    876     IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(INVALIDTEMPLATE)
    877 IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(INVALIDTEMPLATE)
    878 
    879 static int test_invalid_template(void)
    880 {
    881     INVALIDTEMPLATE *temp = INVALIDTEMPLATE_new();
    882     int ret;
    883 
    884     if (!TEST_ptr(temp))
    885         return 0;
    886 
    887     ret = i2d_INVALIDTEMPLATE(temp, NULL);
    888 
    889     INVALIDTEMPLATE_free(temp);
    890 
    891     /* We expect the i2d operation to fail */
    892     return ret < 0;
    893 }
    894 
    895 int setup_tests(void)
    896 {
    897 #ifndef OPENSSL_NO_DEPRECATED_3_0
    898     ADD_TEST(test_long_32bit);
    899     ADD_TEST(test_long_64bit);
    900 #endif
    901     ADD_TEST(test_int32);
    902     ADD_TEST(test_uint32);
    903     ADD_TEST(test_int64);
    904     ADD_TEST(test_uint64);
    905     ADD_TEST(test_invalid_template);
    906     return 1;
    907 }
    908