test_sha256.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. /*
  2. * Test program for SHA256
  3. * Copyright (c) 2006, Jouni Malinen <j@w1.fi>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. *
  9. * Alternatively, this software may be distributed under the terms of BSD
  10. * license.
  11. *
  12. * See README and COPYING for more details.
  13. */
  14. #include "includes.h"
  15. #include "common.h"
  16. #include "sha256.h"
  17. #include "crypto.h"
  18. struct {
  19. char *data;
  20. u8 hash[32];
  21. } tests[] = {
  22. {
  23. "abc",
  24. {
  25. 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
  26. 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
  27. 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
  28. 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
  29. }
  30. },
  31. {
  32. "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
  33. {
  34. 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
  35. 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
  36. 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
  37. 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1
  38. }
  39. }
  40. };
  41. struct hmac_test {
  42. u8 key[80];
  43. size_t key_len;
  44. u8 data[128];
  45. size_t data_len;
  46. u8 hash[32];
  47. } hmac_tests[] = {
  48. /* draft-ietf-ipsec-ciph-sha-256-01.txt */
  49. {
  50. {
  51. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  52. 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
  53. 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
  54. 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
  55. },
  56. 32,
  57. "abc", 3,
  58. {
  59. 0xa2, 0x1b, 0x1f, 0x5d, 0x4c, 0xf4, 0xf7, 0x3a,
  60. 0x4d, 0xd9, 0x39, 0x75, 0x0f, 0x7a, 0x06, 0x6a,
  61. 0x7f, 0x98, 0xcc, 0x13, 0x1c, 0xb1, 0x6a, 0x66,
  62. 0x92, 0x75, 0x90, 0x21, 0xcf, 0xab, 0x81, 0x81
  63. }
  64. },
  65. {
  66. {
  67. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  68. 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
  69. 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
  70. 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
  71. },
  72. 32,
  73. "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
  74. 56,
  75. {
  76. 0x10, 0x4f, 0xdc, 0x12, 0x57, 0x32, 0x8f, 0x08,
  77. 0x18, 0x4b, 0xa7, 0x31, 0x31, 0xc5, 0x3c, 0xae,
  78. 0xe6, 0x98, 0xe3, 0x61, 0x19, 0x42, 0x11, 0x49,
  79. 0xea, 0x8c, 0x71, 0x24, 0x56, 0x69, 0x7d, 0x30
  80. }
  81. },
  82. {
  83. {
  84. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  85. 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
  86. 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
  87. 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
  88. },
  89. 32,
  90. "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
  91. "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
  92. 112,
  93. {
  94. 0x47, 0x03, 0x05, 0xfc, 0x7e, 0x40, 0xfe, 0x34,
  95. 0xd3, 0xee, 0xb3, 0xe7, 0x73, 0xd9, 0x5a, 0xab,
  96. 0x73, 0xac, 0xf0, 0xfd, 0x06, 0x04, 0x47, 0xa5,
  97. 0xeb, 0x45, 0x95, 0xbf, 0x33, 0xa9, 0xd1, 0xa3
  98. }
  99. },
  100. {
  101. {
  102. 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
  103. 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
  104. 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
  105. 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b
  106. },
  107. 32,
  108. "Hi There",
  109. 8,
  110. {
  111. 0x19, 0x8a, 0x60, 0x7e, 0xb4, 0x4b, 0xfb, 0xc6,
  112. 0x99, 0x03, 0xa0, 0xf1, 0xcf, 0x2b, 0xbd, 0xc5,
  113. 0xba, 0x0a, 0xa3, 0xf3, 0xd9, 0xae, 0x3c, 0x1c,
  114. 0x7a, 0x3b, 0x16, 0x96, 0xa0, 0xb6, 0x8c, 0xf7
  115. }
  116. },
  117. {
  118. "Jefe",
  119. 4,
  120. "what do ya want for nothing?",
  121. 28,
  122. {
  123. 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e,
  124. 0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7,
  125. 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
  126. 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43
  127. }
  128. },
  129. {
  130. {
  131. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  132. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  133. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  134. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
  135. },
  136. 32,
  137. {
  138. 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
  139. 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
  140. 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
  141. 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
  142. 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
  143. 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
  144. 0xdd, 0xdd
  145. },
  146. 50,
  147. {
  148. 0xcd, 0xcb, 0x12, 0x20, 0xd1, 0xec, 0xcc, 0xea,
  149. 0x91, 0xe5, 0x3a, 0xba, 0x30, 0x92, 0xf9, 0x62,
  150. 0xe5, 0x49, 0xfe, 0x6c, 0xe9, 0xed, 0x7f, 0xdc,
  151. 0x43, 0x19, 0x1f, 0xbd, 0xe4, 0x5c, 0x30, 0xb0
  152. }
  153. },
  154. {
  155. {
  156. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  157. 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
  158. 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
  159. 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
  160. 0x21, 0x22, 0x23, 0x24, 0x25
  161. },
  162. 37,
  163. {
  164. 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
  165. 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
  166. 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
  167. 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
  168. 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
  169. 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
  170. 0xcd, 0xcd
  171. },
  172. 50,
  173. {
  174. 0xd4, 0x63, 0x3c, 0x17, 0xf6, 0xfb, 0x8d, 0x74,
  175. 0x4c, 0x66, 0xde, 0xe0, 0xf8, 0xf0, 0x74, 0x55,
  176. 0x6e, 0xc4, 0xaf, 0x55, 0xef, 0x07, 0x99, 0x85,
  177. 0x41, 0x46, 0x8e, 0xb4, 0x9b, 0xd2, 0xe9, 0x17
  178. }
  179. },
  180. {
  181. {
  182. 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
  183. 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
  184. 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
  185. 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c
  186. },
  187. 32,
  188. "Test With Truncation",
  189. 20,
  190. {
  191. 0x75, 0x46, 0xaf, 0x01, 0x84, 0x1f, 0xc0, 0x9b,
  192. 0x1a, 0xb9, 0xc3, 0x74, 0x9a, 0x5f, 0x1c, 0x17,
  193. 0xd4, 0xf5, 0x89, 0x66, 0x8a, 0x58, 0x7b, 0x27,
  194. 0x00, 0xa9, 0xc9, 0x7c, 0x11, 0x93, 0xcf, 0x42
  195. }
  196. },
  197. {
  198. {
  199. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  200. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  201. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  202. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  203. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  204. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  205. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  206. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  207. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  208. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
  209. },
  210. 80,
  211. "Test Using Larger Than Block-Size Key - Hash Key First",
  212. 54,
  213. {
  214. 0x69, 0x53, 0x02, 0x5e, 0xd9, 0x6f, 0x0c, 0x09,
  215. 0xf8, 0x0a, 0x96, 0xf7, 0x8e, 0x65, 0x38, 0xdb,
  216. 0xe2, 0xe7, 0xb8, 0x20, 0xe3, 0xdd, 0x97, 0x0e,
  217. 0x7d, 0xdd, 0x39, 0x09, 0x1b, 0x32, 0x35, 0x2f
  218. }
  219. },
  220. {
  221. {
  222. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  223. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  224. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  225. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  226. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  227. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  228. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  229. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  230. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  231. 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
  232. },
  233. 80,
  234. "Test Using Larger Than Block-Size Key and Larger Than One "
  235. "Block-Size Data",
  236. 73,
  237. {
  238. 0x63, 0x55, 0xac, 0x22, 0xe8, 0x90, 0xd0, 0xa3,
  239. 0xc8, 0x48, 0x1a, 0x5c, 0xa4, 0x82, 0x5b, 0xc8,
  240. 0x84, 0xd3, 0xe7, 0xa1, 0xff, 0x98, 0xa2, 0xfc,
  241. 0x2a, 0xc7, 0xd8, 0xe0, 0x64, 0xc3, 0xb2, 0xe6
  242. }
  243. }
  244. };
  245. int main(int argc, char *argv[])
  246. {
  247. unsigned int i;
  248. u8 hash[32];
  249. const u8 *addr[2];
  250. size_t len[2];
  251. int errors = 0;
  252. for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) {
  253. printf("SHA256 test case %d:", i + 1);
  254. addr[0] = (u8 *) tests[i].data;
  255. len[0] = strlen(tests[i].data);
  256. sha256_vector(1, addr, len, hash);
  257. if (memcmp(hash, tests[i].hash, 32) != 0) {
  258. printf(" FAIL");
  259. errors++;
  260. } else
  261. printf(" OK");
  262. if (len[0]) {
  263. addr[0] = (u8 *) tests[i].data;
  264. len[0] = 1;
  265. addr[1] = (u8 *) tests[i].data + 1;
  266. len[1] = strlen(tests[i].data) - 1;
  267. sha256_vector(2, addr, len, hash);
  268. if (memcmp(hash, tests[i].hash, 32) != 0) {
  269. printf(" FAIL");
  270. errors++;
  271. } else
  272. printf(" OK");
  273. }
  274. printf("\n");
  275. }
  276. for (i = 0; i < sizeof(hmac_tests) / sizeof(hmac_tests[0]); i++) {
  277. struct hmac_test *t = &hmac_tests[i];
  278. printf("HMAC-SHA256 test case %d:", i + 1);
  279. hmac_sha256(t->key, t->key_len, t->data, t->data_len, hash);
  280. if (memcmp(hash, t->hash, 32) != 0) {
  281. printf(" FAIL");
  282. errors++;
  283. } else
  284. printf(" OK");
  285. addr[0] = t->data;
  286. len[0] = t->data_len;
  287. hmac_sha256_vector(t->key, t->key_len, 1, addr, len, hash);
  288. if (memcmp(hash, t->hash, 32) != 0) {
  289. printf(" FAIL");
  290. errors++;
  291. } else
  292. printf(" OK");
  293. if (len[0]) {
  294. addr[0] = t->data;
  295. len[0] = 1;
  296. addr[1] = t->data + 1;
  297. len[1] = t->data_len - 1;
  298. hmac_sha256_vector(t->key, t->key_len, 2, addr, len,
  299. hash);
  300. if (memcmp(hash, t->hash, 32) != 0) {
  301. printf(" FAIL");
  302. errors++;
  303. } else
  304. printf(" OK");
  305. }
  306. printf("\n");
  307. }
  308. printf("Test IEEE 802.11r KDF\n");
  309. sha256_prf("abc", 3, "KDF test", "data", 4, hash, sizeof(hash));
  310. /* TODO: add proper test case for this */
  311. return errors;
  312. }