PageRenderTime 35ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/mordor/tests/hmac.cpp

http://github.com/mozy/mordor
C++ | 107 lines | 87 code | 18 blank | 2 comment | 0 complexity | a720b622d7504e810d6ddcf6a5839f89 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. #include "mordor/pch.h"
  2. #include "mordor/string.h"
  3. #include "mordor/test/test.h"
  4. using namespace Mordor;
  5. using namespace Mordor::Test;
  6. MORDOR_UNITTEST(HMAC, HMAC_MD5_1)
  7. {
  8. std::string key;
  9. key.append(16, 0x0b);
  10. std::string data("Hi There");
  11. MORDOR_TEST_ASSERT(hmacMd5(data, key) ==
  12. "\x92\x94\x72\x7a\x36\x38\xbb\x1c\x13\xf4\x8e\xf8\x15\x8b\xfc\x9d");
  13. }
  14. MORDOR_UNITTEST(HMAC, HMAC_MD5_2)
  15. {
  16. std::string key("Jefe");
  17. std::string data("what do ya want for nothing?");
  18. MORDOR_TEST_ASSERT(hmacMd5(data, key) ==
  19. "\x75\x0c\x78\x3e\x6a\xb0\xb5\x03\xea\xa8\x6e\x31\x0a\x5d\xb7\x38");
  20. }
  21. MORDOR_UNITTEST(HMAC, HMAC_MD5_3)
  22. {
  23. std::string key;
  24. key.append(16, (uint8_t)0xaa);
  25. std::string data;
  26. data.append(50, (uint8_t)0xdd);
  27. MORDOR_TEST_ASSERT(hmacMd5(data, key) ==
  28. "\x56\xbe\x34\x52\x1d\x14\x4c\x88\xdb\xb8\xc7\x33\xf0\xe8\xb3\xf6");
  29. }
  30. // test cases from http://tools.ietf.org/html/rfc4231
  31. MORDOR_UNITTEST(HMAC, HMAC_SHA256_RFC4231_1)
  32. {
  33. std::string hmac = hmacSha256("Hi There", std::string(20, '\x0b'));
  34. MORDOR_TEST_ASSERT_EQUAL(
  35. hexstringFromData(hmac.c_str(), SHA256_DIGEST_LENGTH),
  36. "b0344c61d8db38535ca8afceaf0bf12b"
  37. "881dc200c9833da726e9376c2e32cff7");
  38. }
  39. MORDOR_UNITTEST(HMAC, HMAC_SHA256_RFC4231_2)
  40. {
  41. std::string hmac = hmacSha256("what do ya want for nothing?", "Jefe");
  42. MORDOR_TEST_ASSERT_EQUAL(
  43. hexstringFromData(hmac.c_str(), SHA256_DIGEST_LENGTH),
  44. "5bdcc146bf60754e6a042426089575c7"
  45. "5a003f089d2739839dec58b964ec3843");
  46. }
  47. MORDOR_UNITTEST(HMAC, HMAC_SHA256_RFC4231_3)
  48. {
  49. std::string hmac = hmacSha256(std::string(50, '\xdd'),
  50. std::string(20, '\xaa'));
  51. MORDOR_TEST_ASSERT_EQUAL(
  52. hexstringFromData(hmac.c_str(), SHA256_DIGEST_LENGTH),
  53. "773ea91e36800e46854db8ebd09181a7"
  54. "2959098b3ef8c122d9635514ced565fe");
  55. }
  56. MORDOR_UNITTEST(HMAC, HMAC_SHA256_RFC4231_4)
  57. {
  58. std::string hmac = hmacSha256(
  59. std::string(50, '\xcd'),
  60. "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
  61. "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19");
  62. MORDOR_TEST_ASSERT_EQUAL(
  63. hexstringFromData(hmac.c_str(), SHA256_DIGEST_LENGTH),
  64. "82558a389a443c0ea4cc819899f2083a"
  65. "85f0faa3e578f8077a2e3ff46729665b");
  66. }
  67. // RFC 4231 Test Case 5 deals with output truncation, omitted
  68. MORDOR_UNITTEST(HMAC, HMAC_SHA256_RFC4231_6)
  69. {
  70. std::string hmac = hmacSha256(
  71. "Test Using Larger Than Block-Size Key - Hash Key First",
  72. std::string(131, '\xaa'));
  73. MORDOR_TEST_ASSERT_EQUAL(
  74. hexstringFromData(hmac.c_str(), SHA256_DIGEST_LENGTH),
  75. "60e431591ee0b67f0d8a26aacbf5b77f"
  76. "8e0bc6213728c5140546040f0ee37f54");
  77. }
  78. MORDOR_UNITTEST(HMAC, HMAC_SHA256_RFC4231_7)
  79. {
  80. std::string hmac = hmacSha256(
  81. "This is a test using a larger than block-size key and a "
  82. "larger than block-size data. The key needs to be hashed "
  83. "before being used by the HMAC algorithm.",
  84. std::string(131, '\xaa'));
  85. MORDOR_TEST_ASSERT_EQUAL(
  86. hexstringFromData(hmac.c_str(), SHA256_DIGEST_LENGTH),
  87. "9b09ffa71b942fcb27635fbcd5b0e944"
  88. "bfdc63644f0713938a7f51535c3a35e2");
  89. }