codecs.c 11 KB

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