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