UtilSecurityTest.cc 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. #include "util.h"
  2. #include "util_security.h"
  3. #include <cppunit/extensions/HelperMacros.h>
  4. // Test vectors from RFC 6234
  5. enum {
  6. SHA1HashSize = 20,
  7. SHA224HashSize = 28,
  8. SHA256HashSize = 32,
  9. SHA384HashSize = 48,
  10. SHA512HashSize = 64,
  11. };
  12. static struct hmachash {
  13. const char* keyarray[5];
  14. int keylength[5];
  15. const char* dataarray[5];
  16. int datalength[5];
  17. const char* resultarray[5];
  18. int resultlength[5];
  19. } hmachashes[] = {
  20. {/* 1 */ {"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
  21. "\x0b\x0b\x0b\x0b\x0b"},
  22. {20},
  23. {
  24. "\x48\x69\x20\x54\x68\x65\x72\x65" /* "Hi There" */
  25. },
  26. {8},
  27. {/* HMAC-SHA-1 */
  28. "B617318655057264E28BC0B6FB378C8EF146BE00",
  29. /* HMAC-SHA-224 */
  30. "896FB1128ABBDF196832107CD49DF33F47B4B1169912BA4F53684B22",
  31. /* HMAC-SHA-256 */
  32. "B0344C61D8DB38535CA8AFCEAF0BF12B881DC200C9833DA726E9376C2E32"
  33. "CFF7",
  34. /* HMAC-SHA-384 */
  35. "AFD03944D84895626B0825F4AB46907F15F9DADBE4101EC682AA034C7CEB"
  36. "C59CFAEA9EA9076EDE7F4AF152E8B2FA9CB6",
  37. /* HMAC-SHA-512 */
  38. "87AA7CDEA5EF619D4FF0B4241A1D6CB02379F4E2CE4EC2787AD0B30545E1"
  39. "7CDEDAA833B7D6B8A702038B274EAEA3F4E4BE9D914EEB61F1702E696C20"
  40. "3A126854"},
  41. {SHA1HashSize, SHA224HashSize, SHA256HashSize, SHA384HashSize,
  42. SHA512HashSize}},
  43. {/* 2 */ {
  44. "\x4a\x65\x66\x65" /* "Jefe" */
  45. },
  46. {4},
  47. {
  48. "\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61\x20\x77\x61\x6e\x74"
  49. "\x20\x66\x6f\x72\x20\x6e\x6f\x74\x68\x69\x6e\x67\x3f"
  50. /* "what do ya want for nothing?" */
  51. },
  52. {28},
  53. {/* HMAC-SHA-1 */
  54. "EFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79",
  55. /* HMAC-SHA-224 */
  56. "A30E01098BC6DBBF45690F3A7E9E6D0F8BBEA2A39E6148008FD05E44",
  57. /* HMAC-SHA-256 */
  58. "5BDCC146BF60754E6A042426089575C75A003F089D2739839DEC58B964EC"
  59. "3843",
  60. /* HMAC-SHA-384 */
  61. "AF45D2E376484031617F78D2B58A6B1B9C7EF464F5A01B47E42EC3736322"
  62. "445E8E2240CA5E69E2C78B3239ECFAB21649",
  63. /* HMAC-SHA-512 */
  64. "164B7A7BFCF819E2E395FBE73B56E0A387BD64222E831FD610270CD7EA25"
  65. "05549758BF75C05A994A6D034F65F8F0E6FDCAEAB1A34D4A6B4B636E070A"
  66. "38BCE737"},
  67. {SHA1HashSize, SHA224HashSize, SHA256HashSize, SHA384HashSize,
  68. SHA512HashSize}},
  69. {/* 3 */
  70. {"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  71. "\xaa\xaa\xaa\xaa\xaa"},
  72. {20},
  73. {"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  74. "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  75. "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
  76. "\xdd\xdd\xdd\xdd\xdd"},
  77. {50},
  78. {/* HMAC-SHA-1 */
  79. "125D7342B9AC11CD91A39AF48AA17B4F63F175D3",
  80. /* HMAC-SHA-224 */
  81. "7FB3CB3588C6C1F6FFA9694D7D6AD2649365B0C1F65D69D1EC8333EA",
  82. /* HMAC-SHA-256 */
  83. "773EA91E36800E46854DB8EBD09181A72959098B3EF8C122D9635514CED5"
  84. "65FE",
  85. /* HMAC-SHA-384 */
  86. "88062608D3E6AD8A0AA2ACE014C8A86F0AA635D947AC9FEBE83EF4E55966"
  87. "144B2A5AB39DC13814B94E3AB6E101A34F27",
  88. /* HMAC-SHA-512 */
  89. "FA73B0089D56A284EFB0F0756C890BE9B1B5DBDD8EE81A3655F83E33B227"
  90. "9D39BF3E848279A722C806B485A47E67C807B946A337BEE8942674278859"
  91. "E13292FB"},
  92. {SHA1HashSize, SHA224HashSize, SHA256HashSize, SHA384HashSize,
  93. SHA512HashSize}},
  94. {/* 4 */ {"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
  95. "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19"},
  96. {25},
  97. {"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  98. "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  99. "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  100. "\xcd\xcd\xcd\xcd\xcd"},
  101. {50},
  102. {/* HMAC-SHA-1 */
  103. "4C9007F4026250C6BC8414F9BF50C86C2D7235DA",
  104. /* HMAC-SHA-224 */
  105. "6C11506874013CAC6A2ABC1BB382627CEC6A90D86EFC012DE7AFEC5A",
  106. /* HMAC-SHA-256 */
  107. "82558A389A443C0EA4CC819899F2083A85F0FAA3E578F8077A2E3FF46729"
  108. "665B",
  109. /* HMAC-SHA-384 */
  110. "3E8A69B7783C25851933AB6290AF6CA77A9981480850009CC5577C6E1F57"
  111. "3B4E6801DD23C4A7D679CCF8A386C674CFFB",
  112. /* HMAC-SHA-512 */
  113. "B0BA465637458C6990E5A8C5F61D4AF7E576D97FF94B872DE76F8050361E"
  114. "E3DBA91CA5C11AA25EB4D679275CC5788063A5F19741120C4F2DE2ADEBEB"
  115. "10A298DD"},
  116. {SHA1HashSize, SHA224HashSize, SHA256HashSize, SHA384HashSize,
  117. SHA512HashSize}},
  118. {/* 5 */ {"\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
  119. "\x0c\x0c\x0c\x0c\x0c"},
  120. {20},
  121. {"Test With Truncation"},
  122. {20},
  123. {/* HMAC-SHA-1 */
  124. "4C1A03424B55E07FE7F27BE1",
  125. /* HMAC-SHA-224 */
  126. "0E2AEA68A90C8D37C988BCDB9FCA6FA8",
  127. /* HMAC-SHA-256 */
  128. "A3B6167473100EE06E0C796C2955552B",
  129. /* HMAC-SHA-384 */
  130. "3ABF34C3503B2A23A46EFC619BAEF897",
  131. /* HMAC-SHA-512 */
  132. "415FAD6271580A531D4179BC891D87A6"},
  133. {12, 16, 16, 16, 16}},
  134. {/* 6 */ {"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  135. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  136. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  137. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  138. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  139. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  140. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  141. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  142. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"},
  143. {80, 131},
  144. {"Test Using Larger Than Block-Size Key - Hash Key First"},
  145. {54},
  146. {/* HMAC-SHA-1 */
  147. "AA4AE5E15272D00E95705637CE8A3B55ED402112",
  148. /* HMAC-SHA-224 */
  149. "95E9A0DB962095ADAEBE9B2D6F0DBCE2D499F112F2D2B7273FA6870E",
  150. /* HMAC-SHA-256 */
  151. "60E431591EE0B67F0D8A26AACBF5B77F8E0BC6213728C5140546040F0EE3"
  152. "7F54",
  153. /* HMAC-SHA-384 */
  154. "4ECE084485813E9088D2C63A041BC5B44F9EF1012A2B588F3CD11F05033A"
  155. "C4C60C2EF6AB4030FE8296248DF163F44952",
  156. /* HMAC-SHA-512 */
  157. "80B24263C7C1A3EBB71493C1DD7BE8B49B46D1F41B4AEEC1121B013783F8"
  158. "F3526B56D037E05F2598BD0FD2215D6A1E5295E64F73F63F0AEC8B915A98"
  159. "5D786598"},
  160. {SHA1HashSize, SHA224HashSize, SHA256HashSize, SHA384HashSize,
  161. SHA512HashSize}},
  162. {/* 7 */ {"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  163. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  164. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  165. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  166. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  167. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  168. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  169. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
  170. "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"},
  171. {80, 131},
  172. {
  173. "Test Using Larger Than Block-Size Key and "
  174. "Larger Than One Block-Size Data",
  175. "\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x74\x65\x73\x74\x20"
  176. "\x75\x73\x69\x6e\x67\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20"
  177. "\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65"
  178. "\x20\x6b\x65\x79\x20\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67"
  179. "\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73"
  180. "\x69\x7a\x65\x20\x64\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b"
  181. "\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74\x6f\x20\x62\x65\x20"
  182. "\x68\x61\x73\x68\x65\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62"
  183. "\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20\x62\x79\x20\x74\x68"
  184. "\x65\x20\x48\x4d\x41\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68"
  185. "\x6d\x2e"
  186. /* "This is a test using a larger than block-size key and a "
  187. "larger than block-size data. The key needs to be hashed "
  188. "before being used by the HMAC algorithm." */
  189. },
  190. {73, 152},
  191. {/* HMAC-SHA-1 */
  192. "E8E99D0F45237D786D6BBAA7965C7808BBFF1A91",
  193. /* HMAC-SHA-224 */
  194. "3A854166AC5D9F023F54D517D0B39DBD946770DB9C2B95C9F6F565D1",
  195. /* HMAC-SHA-256 */
  196. "9B09FFA71B942FCB27635FBCD5B0E944BFDC63644F0713938A7F51535C3A"
  197. "35E2",
  198. /* HMAC-SHA-384 */
  199. "6617178E941F020D351E2F254E8FD32C602420FEB0B8FB9ADCCEBB82461E"
  200. "99C5A678CC31E799176D3860E6110C46523E",
  201. /* HMAC-SHA-512 */
  202. "E37B6A775DC87DBAA4DFA9F96E5E3FFDDEBD71F8867289865DF5A32D20CD"
  203. "C944B6022CAC3C4982B10D5EEB55C3E4DE15134676FB6DE0446065C97440"
  204. "FA8C6A58"},
  205. {SHA1HashSize, SHA224HashSize, SHA256HashSize, SHA384HashSize,
  206. SHA512HashSize}}};
  207. namespace aria2 {
  208. class SecurityTest : public CppUnit::TestFixture {
  209. CPPUNIT_TEST_SUITE(SecurityTest);
  210. CPPUNIT_TEST(testCompareByte);
  211. CPPUNIT_TEST(testCompareArray);
  212. CPPUNIT_TEST(testHMAC);
  213. CPPUNIT_TEST(testHMACRandom);
  214. CPPUNIT_TEST(testPBKDF2);
  215. CPPUNIT_TEST_SUITE_END();
  216. private:
  217. public:
  218. void setUp() {}
  219. void testCompareByte();
  220. void testCompareArray();
  221. void testHMAC();
  222. void testHMACRandom();
  223. void testPBKDF2();
  224. };
  225. CPPUNIT_TEST_SUITE_REGISTRATION(SecurityTest);
  226. void SecurityTest::testCompareByte()
  227. {
  228. CPPUNIT_ASSERT(util::security::compare('a', 'a'));
  229. CPPUNIT_ASSERT(util::security::compare('\0', '\0'));
  230. CPPUNIT_ASSERT(util::security::compare(0xff, 0xff));
  231. CPPUNIT_ASSERT(!util::security::compare('a', 'f'));
  232. CPPUNIT_ASSERT(!util::security::compare('\xfe', 'f'));
  233. CPPUNIT_ASSERT(!util::security::compare(0, 0xff));
  234. }
  235. void SecurityTest::testCompareArray()
  236. {
  237. CPPUNIT_ASSERT(util::security::compare("", "", 0));
  238. CPPUNIT_ASSERT(util::security::compare("a", "a", 1));
  239. CPPUNIT_ASSERT(util::security::compare("a", "ab", 1));
  240. CPPUNIT_ASSERT(util::security::compare("a\0b", "a\0b", 3));
  241. CPPUNIT_ASSERT(
  242. util::security::compare("a\0b", "a\0b", 4)); // implicit null-termination
  243. CPPUNIT_ASSERT(util::security::compare("a\0", "a\0b", 2));
  244. CPPUNIT_ASSERT(util::security::compare("a\xff", "a\xff", 2));
  245. CPPUNIT_ASSERT(!util::security::compare("a", "b", 1));
  246. CPPUNIT_ASSERT(!util::security::compare("a", "bb", 1));
  247. CPPUNIT_ASSERT(!util::security::compare("a\1b", "a\0b", 3));
  248. CPPUNIT_ASSERT(
  249. !util::security::compare("a\1b", "a\0b", 4)); // implicit null-termination
  250. CPPUNIT_ASSERT(!util::security::compare("a\4", "a\0b", 2));
  251. CPPUNIT_ASSERT(!util::security::compare("a\0", "a\xff", 2));
  252. }
  253. static struct {
  254. const char* hash;
  255. const size_t idx;
  256. } hmacs[] = {{"sha-1", 0},
  257. {"sha-224", 1},
  258. {"sha-256", 2},
  259. {"sha-384", 3},
  260. {"sha-512", 4}};
  261. void SecurityTest::testHMAC()
  262. {
  263. for (const auto& test : hmachashes) {
  264. for (const auto& hmac : hmacs) {
  265. if (!util::security::HMAC::supports(hmac.hash)) {
  266. continue;
  267. }
  268. #define SELECT(v) \
  269. test.v[hmac.idx] ? test.v[hmac.idx] : test.v[1] ? test.v[1] : test.v[0]
  270. auto key = SELECT(keyarray);
  271. auto keylen = SELECT(keylength);
  272. auto data = SELECT(dataarray);
  273. auto datalen = SELECT(datalength);
  274. auto result = SELECT(resultarray);
  275. auto resultlen = SELECT(resultlength);
  276. #undef SELECT
  277. auto h = util::security::HMAC::create(hmac.hash, key, keylen);
  278. auto h2 = util::security::HMAC::create(hmac.hash, key, keylen - 1);
  279. auto r = h->getResult(data, datalen);
  280. auto hr = util::toUpper(util::toHex(r.getBytes()));
  281. CPPUNIT_ASSERT(util::security::compare(hr.data(), result, resultlen));
  282. CPPUNIT_ASSERT(r == r);
  283. auto r2 = r;
  284. CPPUNIT_ASSERT(r == r2);
  285. CPPUNIT_ASSERT(r != h2->getResult(data, datalen));
  286. }
  287. }
  288. }
  289. void SecurityTest::testHMACRandom()
  290. {
  291. auto h = util::security::HMAC::createRandom();
  292. CPPUNIT_ASSERT(h->getResult("abc") == h->getResult("abc"));
  293. auto r = h->getResult("def");
  294. CPPUNIT_ASSERT(r == h->getResult("def"));
  295. // Sanity check. At the very least 3 out of ten times 2 random hmacs should
  296. // be different from each other and the 0-secret hmac.
  297. size_t diff = 0;
  298. for (auto i = 0; i < 10; ++i) {
  299. auto h1 = util::security::HMAC::createRandom("sha-1");
  300. auto h2 = util::security::HMAC::createRandom("sha-1");
  301. auto h3 = util::security::HMAC::create("sha-1", "");
  302. CPPUNIT_ASSERT(h1->getResult("abc") == h1->getResult("abc"));
  303. CPPUNIT_ASSERT(h2->getResult("abc") == h2->getResult("abc"));
  304. if (h1->getResult("abc") != h2->getResult("abc") &&
  305. h1->getResult("abc") != h3->getResult("abc") &&
  306. h2->getResult("abc") != h3->getResult("abc")) {
  307. ++diff;
  308. }
  309. }
  310. CPPUNIT_ASSERT(diff > 3);
  311. }
  312. static struct pbkdf2 {
  313. char pass[32];
  314. size_t pass_len;
  315. char salt[40];
  316. size_t salt_len;
  317. size_t iterations;
  318. unsigned char key[32];
  319. size_t key_len;
  320. } pbkdf2s[] = {{"password",
  321. 8,
  322. "salt",
  323. 4,
  324. 1,
  325. {0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71, 0xf3, 0xa9,
  326. 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06, 0x2f, 0xe0, 0x37, 0xa6},
  327. 20},
  328. {"password",
  329. 8,
  330. "salt",
  331. 4,
  332. 1,
  333. {0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71, 0xf3, 0xa9,
  334. 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06, 0x2f, 0xe0, 0x37, 0xa6},
  335. 0},
  336. {"password",
  337. 8,
  338. "salt",
  339. 4,
  340. 2,
  341. {0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c, 0xcd, 0x1e,
  342. 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0, 0xd8, 0xde, 0x89, 0x57},
  343. 20},
  344. {"password",
  345. 8,
  346. "salt",
  347. 4,
  348. 4096,
  349. {0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a, 0xbe, 0xad,
  350. 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0, 0x65, 0xa4, 0x29, 0xc1},
  351. 20},
  352. /* Disabled due to #236
  353. {
  354. "password", 8,
  355. "salt", 4,
  356. 16777216,
  357. { 0xee, 0xfe, 0x3d, 0x61, 0xcd, 0x4d, 0xa4, 0xe4, 0xe9, 0x94,
  358. 0x5b, 0x3d, 0x6b, 0xa2, 0x15, 0x8c, 0x26, 0x34, 0xe9, 0x84 }, 20,
  359. },
  360. */
  361. {
  362. "passwordPASSWORDpassword",
  363. 24,
  364. "saltSALTsaltSALTsaltSALTsaltSALTsalt",
  365. 36,
  366. 4096,
  367. {0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b, 0x80,
  368. 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a, 0x8b, 0x29,
  369. 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70, 0x38},
  370. 25,
  371. },
  372. {"pass\0word",
  373. 9,
  374. "sa\0lt",
  375. 5,
  376. 4096,
  377. {0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d, 0xcc, 0x37,
  378. 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3},
  379. 16}};
  380. void SecurityTest::testPBKDF2()
  381. {
  382. for (const auto& test : pbkdf2s) {
  383. auto h = util::security::HMAC::create(test.pass, test.pass_len);
  384. auto r = util::security::PBKDF2(h.get(), test.salt, test.salt_len,
  385. test.iterations, test.key_len);
  386. const auto kl = test.key_len ? test.key_len : r.length();
  387. auto e = util::security::HMACResult((char*)test.key, kl);
  388. #if 0
  389. printf("actual [%s]  expected [%s]\n",
  390. util::toHex(r.getBytes()).c_str(),
  391. util::toHex(e.getBytes()).c_str()
  392. );
  393. #endif
  394. CPPUNIT_ASSERT(r == e);
  395. CPPUNIT_ASSERT(r.getBytes() == std::string((char*)test.key, kl));
  396. }
  397. }
  398. } // namespace aria2