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