quickjs-tart

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

codecs.c (12686B)


      1 #define TEST_NAME "codecs"
      2 #include "cmptest.h"
      3 
      4 int
      5 main(void)
      6 {
      7     unsigned char  buf1[1000];
      8     char           buf3[33];
      9     unsigned char  buf4[4];
     10     const char    *b64;
     11     char          *b64_;
     12     const char    *b64_end;
     13     unsigned char *bin;
     14     const char    *hex;
     15     const char    *hex_end;
     16     size_t         b64_len;
     17     size_t         bin_len;
     18     unsigned int   i;
     19 
     20     printf("%s\n",
     21            sodium_bin2hex(buf3, 33U, (const unsigned char *) "0123456789ABCDEF",
     22                           16U));
     23     printf("bin2hex(..., guard_page, 0):%s\n",
     24            sodium_bin2hex(buf3, sizeof buf3, guard_page, 0U));
     25     printf("bin2hex(..., \"\", 0):%s\n",
     26            sodium_bin2hex(buf3, sizeof buf3, (const unsigned char *) "", 0U));
     27 
     28     hex = "Cafe : 6942";
     29     sodium_hex2bin(buf4, sizeof buf4, hex, strlen(hex), ": ", &bin_len,
     30                    &hex_end);
     31     printf("%lu:%02x%02x%02x%02x\n", (unsigned long) bin_len,
     32            buf4[0], buf4[1], buf4[2], buf4[3]);
     33     printf("dt1: %ld\n", (long) (hex_end - hex));
     34 
     35     hex = "Cafe : 6942";
     36     sodium_hex2bin(buf4, sizeof buf4, hex, strlen(hex), ": ", &bin_len, NULL);
     37     printf("%lu:%02x%02x%02x%02x\n", (unsigned long) bin_len,
     38            buf4[0], buf4[1], buf4[2], buf4[3]);
     39 
     40     hex = "deadbeef";
     41     if (sodium_hex2bin(buf1, 1U, hex, 8U, NULL, &bin_len, &hex_end) != -1) {
     42         printf("sodium_hex2bin() overflow not detected\n");
     43     }
     44     printf("dt2: %ld\n", (long) (hex_end - hex));
     45 
     46     hex = "de:ad:be:eff";
     47     if (sodium_hex2bin(buf1, 4U, hex, 12U, ":", &bin_len, &hex_end) != -1) {
     48         printf(
     49             "sodium_hex2bin() with an odd input length and a short output "
     50             "buffer\n");
     51     }
     52     printf("dt3: %ld\n", (long) (hex_end - hex));
     53 
     54     hex = "de:ad:be:eff";
     55     if (sodium_hex2bin(buf1, sizeof buf1, hex, 12U, ":",
     56                        &bin_len, &hex_end) != -1) {
     57         printf("sodium_hex2bin() with an odd input length\n");
     58     }
     59     printf("dt4: %ld\n", (long) (hex_end - hex));
     60 
     61     hex = "de:ad:be:eff";
     62     if (sodium_hex2bin(buf1, sizeof buf1, hex, 13U, ":",
     63                        &bin_len, &hex_end) != -1) {
     64         printf("sodium_hex2bin() with an odd input length (2)\n");
     65     }
     66     printf("dt5: %ld\n", (long) (hex_end - hex));
     67 
     68     hex = "de:ad:be:eff";
     69     if (sodium_hex2bin(buf1, sizeof buf1, hex, 12U, ":",
     70                        &bin_len, NULL) != -1) {
     71         printf("sodium_hex2bin() with an odd input length and no end pointer\n");
     72     }
     73 
     74     hex = "de:ad:be:ef*";
     75     if (sodium_hex2bin(buf1, sizeof buf1, hex, 12U, ":",
     76                        &bin_len, &hex_end) != 0) {
     77         printf("sodium_hex2bin() with an extra character and an end pointer\n");
     78     }
     79     printf("dt6: %ld\n", (long) (hex_end - hex));
     80 
     81     hex = "de:ad:be:ef*";
     82     if (sodium_hex2bin(buf1, sizeof buf1, hex, 12U, ":",
     83                        &bin_len, NULL) != -1) {
     84         printf("sodium_hex2bin() with an extra character and no end pointer\n");
     85     }
     86 
     87     assert(sodium_hex2bin(buf4, sizeof buf4, (const char *) guard_page, 0U,
     88                           NULL, &bin_len, NULL) == 0);
     89     assert(bin_len == 0);
     90 
     91     assert(sodium_hex2bin(buf4, sizeof buf4, "", 0U, NULL, &bin_len, NULL) == 0);
     92     assert(bin_len == 0);
     93 
     94     printf("%s\n",
     95            sodium_bin2base64(buf3, 31U, (const unsigned char *) "\xfb\xf0\xf1" "0123456789ABCDEFab",
     96                              21U, sodium_base64_VARIANT_ORIGINAL));
     97     printf("%s\n",
     98            sodium_bin2base64(buf3, 33U, (const unsigned char *) "\xfb\xf0\xf1" "0123456789ABCDEFabc",
     99                              22U, sodium_base64_VARIANT_ORIGINAL_NO_PADDING));
    100     printf("%s\n",
    101            sodium_bin2base64(buf3, 31U, (const unsigned char *) "\xfb\xf0\xf1" "0123456789ABCDEFab",
    102                              21U, sodium_base64_VARIANT_URLSAFE));
    103     printf("%s\n",
    104            sodium_bin2base64(buf3, 33U, (const unsigned char *) "\xfb\xf0\xf1" "0123456789ABCDEFabc",
    105                              22U, sodium_base64_VARIANT_URLSAFE_NO_PADDING));
    106     printf("%s\n",
    107            sodium_bin2base64(buf3, 1U, guard_page,
    108                              0U, sodium_base64_VARIANT_ORIGINAL));
    109     printf("%s\n",
    110            sodium_bin2base64(buf3, 5U, (const unsigned char *) "a",
    111                              1U, sodium_base64_VARIANT_ORIGINAL));
    112     printf("%s\n",
    113            sodium_bin2base64(buf3, 5U, (const unsigned char *) "ab",
    114                              2U, sodium_base64_VARIANT_ORIGINAL));
    115     printf("%s\n",
    116            sodium_bin2base64(buf3, 5U, (const unsigned char *) "abc",
    117                              3U, sodium_base64_VARIANT_ORIGINAL));
    118     printf("%s\n",
    119            sodium_bin2base64(buf3, 1U, guard_page,
    120                              0U, sodium_base64_VARIANT_ORIGINAL_NO_PADDING));
    121     printf("%s\n",
    122            sodium_bin2base64(buf3, 3U, (const unsigned char *) "a",
    123                              1U, sodium_base64_VARIANT_ORIGINAL_NO_PADDING));
    124     printf("%s\n",
    125            sodium_bin2base64(buf3, 4U, (const unsigned char *) "ab",
    126                              2U, sodium_base64_VARIANT_ORIGINAL_NO_PADDING));
    127     printf("%s\n",
    128            sodium_bin2base64(buf3, 5U, (const unsigned char *) "abc",
    129                              3U, sodium_base64_VARIANT_ORIGINAL_NO_PADDING));
    130 
    131     b64 = "VGhpcyBpcyBhIGpvdXJu" "\n" "ZXkgaW50by" " " "Bzb3VuZA==";
    132     memset(buf4, '*', sizeof buf4);
    133     assert(sodium_base642bin(buf4, sizeof buf4, b64, strlen(b64), "\n\r ", &bin_len,
    134                              &b64_end, sodium_base64_VARIANT_ORIGINAL) == -1);
    135     buf4[bin_len] = 0;
    136     printf("[%s]\n", (const char *) buf4);
    137     printf("[%s]\n", b64_end);
    138 
    139     memset(buf1, '*', sizeof buf1);
    140     assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), "\n\r ", &bin_len,
    141                              &b64_end, sodium_base64_VARIANT_ORIGINAL) == 0);
    142     buf1[bin_len] = 0;
    143     printf("[%s]\n", (const char *) buf1);
    144     assert(*b64_end == 0);
    145 
    146     memset(buf1, '*', sizeof buf1);
    147     assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), NULL, &bin_len,
    148                              &b64_end, sodium_base64_VARIANT_ORIGINAL) == 0);
    149     buf1[bin_len] = 0;
    150     printf("[%s]\n", (const char *) buf1);
    151     printf("[%s]\n", b64_end);
    152 
    153     assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), NULL, NULL,
    154                              &b64_end, sodium_base64_VARIANT_ORIGINAL) == 0);
    155     assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), NULL, NULL,
    156                              &b64_end, sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == 0);
    157     assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), " \r\n", NULL,
    158                              &b64_end, sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == 0);
    159     assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), NULL, NULL,
    160                              &b64_end, sodium_base64_VARIANT_URLSAFE_NO_PADDING) == 0);
    161     assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), " \r\n", NULL,
    162                              &b64_end, sodium_base64_VARIANT_URLSAFE_NO_PADDING) == 0);
    163 
    164     assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), NULL, NULL,
    165                              NULL, sodium_base64_VARIANT_ORIGINAL) == -1);
    166     assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), NULL, NULL,
    167                              NULL, sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == -1);
    168     assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), " \r\n", NULL,
    169                              NULL, sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == -1);
    170     assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), NULL, NULL,
    171                              NULL, sodium_base64_VARIANT_URLSAFE_NO_PADDING) == -1);
    172     assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), " \r\n", NULL,
    173                              NULL, sodium_base64_VARIANT_URLSAFE_NO_PADDING) == -1);
    174 
    175     assert(sodium_base642bin(guard_page, (size_t) 10U, "a=", (size_t) 2U, NULL, NULL, NULL,
    176                              sodium_base64_VARIANT_URLSAFE) == -1);
    177     assert(sodium_base642bin(guard_page, (size_t) 10U, "a*", (size_t) 2U, NULL, NULL, NULL,
    178                              sodium_base64_VARIANT_URLSAFE) == -1);
    179     assert(sodium_base642bin(guard_page, (size_t) 10U, "a*", (size_t) 2U, "~", NULL, NULL,
    180                              sodium_base64_VARIANT_URLSAFE) == -1);
    181     assert(sodium_base642bin(guard_page, (size_t) 10U, "a*", (size_t) 2U, "*", NULL, NULL,
    182                              sodium_base64_VARIANT_URLSAFE) == -1);
    183     assert(sodium_base642bin(guard_page, (size_t) 10U, "a==", (size_t) 3U, NULL, NULL, NULL,
    184                              sodium_base64_VARIANT_URLSAFE) == -1);
    185     assert(sodium_base642bin(guard_page, (size_t) 10U, "a=*", (size_t) 3U, NULL, NULL, NULL,
    186                              sodium_base64_VARIANT_URLSAFE) == -1);
    187     assert(sodium_base642bin(guard_page, (size_t) 10U, "a=*", (size_t) 3U, "~", NULL, NULL,
    188                              sodium_base64_VARIANT_URLSAFE) == -1);
    189     assert(sodium_base642bin(guard_page, (size_t) 10U, "a=*", (size_t) 3U, "*", NULL, NULL,
    190                              sodium_base64_VARIANT_URLSAFE) == -1);
    191 
    192     assert(sodium_base642bin(buf1, sizeof buf1, "O1R", (size_t) 3U, NULL, NULL, NULL,
    193                              sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == -1);
    194     assert(sodium_base642bin(buf1, sizeof buf1, "O1Q", (size_t) 3U, NULL, NULL, NULL,
    195                              sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == 0);
    196     assert(sodium_base642bin(buf1, sizeof buf1, "O1", (size_t) 2U, NULL, NULL, NULL,
    197                              sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == -1);
    198     assert(sodium_base642bin(buf1, sizeof buf1, "Ow", (size_t) 2U, NULL, NULL, NULL,
    199                              sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == 0);
    200     assert(sodium_base642bin(buf1, sizeof buf1, "O", (size_t) 1U, NULL, NULL, NULL,
    201                              sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == -1);
    202 
    203     assert(sodium_base642bin(buf1, sizeof buf1, "", (size_t) 0U, NULL, NULL, NULL,
    204                              sodium_base64_VARIANT_ORIGINAL) == 0);
    205     assert(sodium_base642bin(buf1, sizeof buf1, "A", (size_t) 1U, NULL, NULL, NULL,
    206                              sodium_base64_VARIANT_ORIGINAL) == -1);
    207     assert(sodium_base642bin(buf1, sizeof buf1, "AA", (size_t) 2U, NULL, NULL, NULL,
    208                              sodium_base64_VARIANT_ORIGINAL) == -1);
    209     assert(sodium_base642bin(buf1, sizeof buf1, "kaw", (size_t) 3U, NULL, NULL, NULL,
    210                              sodium_base64_VARIANT_ORIGINAL) == -1);
    211     assert(sodium_base642bin(buf1, sizeof buf1, "kQ*", (size_t) 3U, "@", NULL, NULL,
    212                              sodium_base64_VARIANT_ORIGINAL) == -1);
    213     assert(sodium_base642bin(buf1, sizeof buf1, "kQ*", (size_t) 3U, "*", NULL, NULL,
    214                              sodium_base64_VARIANT_ORIGINAL) == -1);
    215     assert(sodium_base642bin(buf1, sizeof buf1, "kaw=**", (size_t) 6U, "*", NULL, NULL,
    216                              sodium_base64_VARIANT_ORIGINAL) == 0);
    217     assert(sodium_base642bin(buf1, sizeof buf1, "kaw*=*", (size_t) 6U, "~*", NULL, NULL,
    218                              sodium_base64_VARIANT_ORIGINAL) == 0);
    219     assert(sodium_base642bin(buf1, sizeof buf1, "ka*w*=*", (size_t) 7U, "*~", NULL, NULL,
    220                              sodium_base64_VARIANT_ORIGINAL) == 0);
    221 
    222     assert(sodium_base642bin(buf1, sizeof buf1, (const char *) guard_page, 0U,
    223                              NULL, &bin_len, NULL, sodium_base64_VARIANT_ORIGINAL) == 0);
    224     assert(bin_len == 0);
    225 
    226     assert(sodium_base642bin(buf1, sizeof buf1, "", 0U, NULL, &bin_len, NULL,
    227                              sodium_base64_VARIANT_ORIGINAL) == 0);
    228     assert(bin_len == 0);
    229 
    230     for (i = 0; i < 1000; i++) {
    231         assert(sizeof buf1 >= 100);
    232         bin_len = (size_t) randombytes_uniform(100);
    233         bin = (unsigned char *) sodium_malloc(bin_len);
    234         b64_len = (bin_len + 2U) / 3U * 4U + 1U;
    235         assert(b64_len == sodium_base64_encoded_len(bin_len, sodium_base64_VARIANT_URLSAFE));
    236         b64_ = (char *) sodium_malloc(b64_len);
    237         randombytes_buf(bin, bin_len);
    238         memcpy(buf1, bin, bin_len);
    239         b64 = sodium_bin2base64(b64_, b64_len, bin, bin_len,
    240                                 sodium_base64_VARIANT_URLSAFE);
    241         assert(b64 != NULL);
    242         assert(sodium_base642bin(bin, bin_len + 10, b64, b64_len,
    243                                  NULL, NULL, &b64_end,
    244                                  sodium_base64_VARIANT_URLSAFE) == 0);
    245         assert(b64_end == &b64[b64_len - 1]);
    246         assert(memcmp(bin, buf1, bin_len) == 0);
    247         sodium_free(bin);
    248         sodium_free(b64_);
    249     }
    250     return 0;
    251 }