quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

asn1_helpers.c (1719B)


      1 /** \file asn1_helpers.c
      2  *
      3  * \brief Helper functions for tests that manipulate ASN.1 data.
      4  */
      5 
      6 /*
      7  *  Copyright The Mbed TLS Contributors
      8  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
      9  */
     10 
     11 #include <test/helpers.h>
     12 #include <test/macros.h>
     13 
     14 #if defined(MBEDTLS_ASN1_PARSE_C)
     15 
     16 #include <mbedtls/asn1.h>
     17 
     18 #include <test/asn1_helpers.h>
     19 
     20 int mbedtls_test_asn1_skip_integer(unsigned char **p, const unsigned char *end,
     21                                    size_t min_bits, size_t max_bits,
     22                                    int must_be_odd)
     23 {
     24     size_t len;
     25     size_t actual_bits;
     26     unsigned char msb;
     27     TEST_EQUAL(mbedtls_asn1_get_tag(p, end, &len,
     28                                     MBEDTLS_ASN1_INTEGER),
     29                0);
     30 
     31     /* Check if the retrieved length doesn't extend the actual buffer's size.
     32      * It is assumed here, that end >= p, which validates casting to size_t. */
     33     TEST_ASSERT(len <= (size_t) (end - *p));
     34 
     35     /* Tolerate a slight departure from DER encoding:
     36      * - 0 may be represented by an empty string or a 1-byte string.
     37      * - The sign bit may be used as a value bit. */
     38     if ((len == 1 && (*p)[0] == 0) ||
     39         (len > 1 && (*p)[0] == 0 && ((*p)[1] & 0x80) != 0)) {
     40         ++(*p);
     41         --len;
     42     }
     43     if (min_bits == 0 && len == 0) {
     44         return 1;
     45     }
     46     msb = (*p)[0];
     47     TEST_ASSERT(msb != 0);
     48     actual_bits = 8 * (len - 1);
     49     while (msb != 0) {
     50         msb >>= 1;
     51         ++actual_bits;
     52     }
     53     TEST_ASSERT(actual_bits >= min_bits);
     54     TEST_ASSERT(actual_bits <= max_bits);
     55     if (must_be_odd) {
     56         TEST_ASSERT(((*p)[len-1] & 1) != 0);
     57     }
     58     *p += len;
     59     return 1;
     60 exit:
     61     return 0;
     62 }
     63 
     64 #endif /* MBEDTLS_ASN1_PARSE_C */