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 }