1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string>
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/hmac.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const int kSHA1DigestSize = 20;
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const int kSHA256DigestSize = 32;
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HMACTest, HmacSafeBrowsingResponseTest) {
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int kKeySize = 16;
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Client key.
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const unsigned char kClientKey[kKeySize] =
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      { 0xbf, 0xf6, 0x83, 0x4b, 0x3e, 0xa3, 0x23, 0xdd,
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        0x96, 0x78, 0x70, 0x8e, 0xa1, 0x9d, 0x3b, 0x40 };
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Expected HMAC result using kMessage and kClientKey.
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const unsigned char kReceivedHmac[kSHA1DigestSize] =
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      { 0xb9, 0x3c, 0xd6, 0xf0, 0x49, 0x47, 0xe2, 0x52,
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        0x59, 0x7a, 0xbd, 0x1f, 0x2b, 0x4c, 0x83, 0xad,
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        0x86, 0xd2, 0x48, 0x85 };
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char kMessage[] =
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"n:1896\ni:goog-malware-shavar\nu:s.ytimg.com/safebrowsing/rd/goog-malware-shav"
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"ar_s_445-450\nu:s.ytimg.com/safebrowsing/rd/goog-malware-shavar_s_439-444\nu:s"
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott".ytimg.com/safebrowsing/rd/goog-malware-shavar_s_437\nu:s.ytimg.com/safebrowsi"
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"ng/rd/goog-malware-shavar_s_436\nu:s.ytimg.com/safebrowsing/rd/goog-malware-sh"
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"avar_s_433-435\nu:s.ytimg.com/safebrowsing/rd/goog-malware-shavar_s_431\nu:s.y"
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"timg.com/safebrowsing/rd/goog-malware-shavar_s_430\nu:s.ytimg.com/safebrowsing"
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"/rd/goog-malware-shavar_s_429\nu:s.ytimg.com/safebrowsing/rd/goog-malware-shav"
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"ar_s_428\nu:s.ytimg.com/safebrowsing/rd/goog-malware-shavar_s_426\nu:s.ytimg.c"
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"om/safebrowsing/rd/goog-malware-shavar_s_424\nu:s.ytimg.com/safebrowsing/rd/go"
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"og-malware-shavar_s_423\nu:s.ytimg.com/safebrowsing/rd/goog-malware-shavar_s_4"
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"22\nu:s.ytimg.com/safebrowsing/rd/goog-malware-shavar_s_420\nu:s.ytimg.com/saf"
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"ebrowsing/rd/goog-malware-shavar_s_419\nu:s.ytimg.com/safebrowsing/rd/goog-mal"
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"ware-shavar_s_414\nu:s.ytimg.com/safebrowsing/rd/goog-malware-shavar_s_409-411"
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"\nu:s.ytimg.com/safebrowsing/rd/goog-malware-shavar_s_405\nu:s.ytimg.com/safeb"
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"rowsing/rd/goog-malware-shavar_s_404\nu:s.ytimg.com/safebrowsing/rd/goog-malwa"
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"re-shavar_s_402\nu:s.ytimg.com/safebrowsing/rd/goog-malware-shavar_s_401\nu:s."
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"ytimg.com/safebrowsing/rd/goog-malware-shavar_a_973-978\nu:s.ytimg.com/safebro"
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"wsing/rd/goog-malware-shavar_a_937-972\nu:s.ytimg.com/safebrowsing/rd/goog-mal"
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"ware-shavar_a_931-936\nu:s.ytimg.com/safebrowsing/rd/goog-malware-shavar_a_925"
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"-930\nu:s.ytimg.com/safebrowsing/rd/goog-malware-shavar_a_919-924\ni:goog-phis"
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"h-shavar\nu:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_2633\nu:s.ytimg.co"
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"m/safebrowsing/rd/goog-phish-shavar_a_2632\nu:s.ytimg.com/safebrowsing/rd/goog"
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"-phish-shavar_a_2629-2631\nu:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_2"
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott"626-2628\nu:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_2625\n";
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string message_data(kMessage);
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  crypto::HMAC hmac(crypto::HMAC::SHA1);
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(hmac.Init(kClientKey, kKeySize));
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  unsigned char calculated_hmac[kSHA1DigestSize];
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(hmac.Sign(message_data, calculated_hmac, kSHA1DigestSize));
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, memcmp(kReceivedHmac, calculated_hmac, kSHA1DigestSize));
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Test cases from RFC 2202 section 3
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HMACTest, RFC2202TestCases) {
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const struct {
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char *key;
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int key_len;
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char *data;
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int data_len;
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char *digest;
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } cases[] = {
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\x0B\x0B\x0B\x0B", 20,
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "Hi There", 8,
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\xB6\x17\x31\x86\x55\x05\x72\x64\xE2\x8B\xC0\xB6\xFB\x37\x8C\x8E"
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xF1\x46\xBE\x00" },
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "Jefe", 4,
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "what do ya want for nothing?", 28,
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\xEF\xFC\xDF\x6A\xE5\xEB\x2F\xA2\xD2\x74\x16\xD5\xF1\x84\xDF\x9C"
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\x25\x9A\x7C\x79" },
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xAA\xAA\xAA\xAA", 20,
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xDD\xDD", 50,
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\x12\x5D\x73\x42\xB9\xAC\x11\xCD\x91\xA3\x9A\xF4\x8A\xA1\x7B\x4F"
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\x63\xF1\x75\xD3" },
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\x11\x12\x13\x14\x15\x16\x17\x18\x19", 25,
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xCD\xCD", 50,
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\x4C\x90\x07\xF4\x02\x62\x50\xC6\xBC\x84\x14\xF9\xBF\x50\xC8\x6C"
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\x2D\x72\x35\xDA" },
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\x0C\x0C\x0C\x0C", 20,
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "Test With Truncation", 20,
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\x4C\x1A\x03\x42\x4B\x55\xE0\x7F\xE7\xF2\x7B\xE1\xD5\x8B\xB9\x32"
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\x4A\x9A\x5A\x04" },
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA",
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      80,
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "Test Using Larger Than Block-Size Key - Hash Key First", 54,
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\xAA\x4A\xE5\xE1\x52\x72\xD0\x0E\x95\x70\x56\x37\xCE\x8A\x3B\x55"
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xED\x40\x21\x12" },
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA",
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      80,
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "Test Using Larger Than Block-Size Key and Larger "
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "Than One Block-Size Data", 73,
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\xE8\xE9\x9D\x0F\x45\x23\x7D\x78\x6D\x6B\xBA\xA7\x96\x5C\x78\x08"
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xBB\xFF\x1A\x91" }
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    crypto::HMAC hmac(crypto::HMAC::SHA1);
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_TRUE(hmac.Init(reinterpret_cast<const unsigned char*>(cases[i].key),
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          cases[i].key_len));
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    std::string data_string(cases[i].data, cases[i].data_len);
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    unsigned char digest[kSHA1DigestSize];
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(hmac.Sign(data_string, digest, kSHA1DigestSize));
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(0, memcmp(cases[i].digest, digest, kSHA1DigestSize));
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(wtc): add other test vectors from RFC 4231.
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(HMACTest, RFC4231TestCase6) {
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  unsigned char key[131];
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < sizeof(key); ++i)
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    key[i] = 0xaa;
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string data = "Test Using Larger Than Block-Size Key - Hash Key First";
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(54U, data.size());
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static unsigned char kKnownHMACSHA256[] = {
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f,
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x0d, 0x8a, 0x26, 0xaa, 0xcb, 0xf5, 0xb7, 0x7f,
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14,
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  crypto::HMAC hmac(crypto::HMAC::SHA256);
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(hmac.Init(key, sizeof(key)));
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  unsigned char calculated_hmac[kSHA256DigestSize];
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(hmac.Sign(data, calculated_hmac, kSHA256DigestSize));
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, memcmp(kKnownHMACSHA256, calculated_hmac, kSHA256DigestSize));
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Based on NSS's FIPS HMAC power-up self-test.
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(HMACTest, NSSFIPSPowerUpSelfTest) {
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const char kKnownMessage[] =
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "The test message for the MD2, MD5, and SHA-1 hashing algorithms.";
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const unsigned char kKnownSecretKey[] = {
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x46, 0x69, 0x72, 0x65, 0x66, 0x6f, 0x78, 0x20,
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x61, 0x6e, 0x64, 0x20, 0x54, 0x68, 0x75, 0x6e,
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x64, 0x65, 0x72, 0x42, 0x69, 0x72, 0x64, 0x20,
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x61, 0x72, 0x65, 0x20, 0x61, 0x77, 0x65, 0x73,
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x6f, 0x6d, 0x65, 0x21, 0x00
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const size_t kKnownSecretKeySize = sizeof(kKnownSecretKey);
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // HMAC-SHA-1 known answer (20 bytes).
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const unsigned char kKnownHMACSHA1[] = {
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0xd5, 0x85, 0xf6, 0x5b, 0x39, 0xfa, 0xb9, 0x05,
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x3b, 0x57, 0x1d, 0x61, 0xe7, 0xb8, 0x84, 0x1e,
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x5d, 0x0e, 0x1e, 0x11
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // HMAC-SHA-256 known answer (32 bytes).
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const unsigned char kKnownHMACSHA256[] = {
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x05, 0x75, 0x9a, 0x9e, 0x70, 0x5e, 0xe7, 0x44,
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0xe2, 0x46, 0x4b, 0x92, 0x22, 0x14, 0x22, 0xe0,
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x1b, 0x92, 0x8a, 0x0c, 0xfe, 0xf5, 0x49, 0xe9,
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0xa7, 0x1b, 0x56, 0x7d, 0x1d, 0x29, 0x40, 0x48
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string message_data(kKnownMessage);
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  crypto::HMAC hmac(crypto::HMAC::SHA1);
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(hmac.Init(kKnownSecretKey, kKnownSecretKeySize));
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  unsigned char calculated_hmac[kSHA1DigestSize];
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(hmac.Sign(message_data, calculated_hmac, kSHA1DigestSize));
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, memcmp(kKnownHMACSHA1, calculated_hmac, kSHA1DigestSize));
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  crypto::HMAC hmac2(crypto::HMAC::SHA256);
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(hmac2.Init(kKnownSecretKey, kKnownSecretKeySize));
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  unsigned char calculated_hmac2[kSHA256DigestSize];
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(hmac2.Sign(message_data, calculated_hmac2, kSHA256DigestSize));
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, memcmp(kKnownHMACSHA256, calculated_hmac2, kSHA256DigestSize));
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HMACTest, HMACObjectReuse) {
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char *key =
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA";
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int key_len = 80;
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const struct {
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char *data;
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int data_len;
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char *digest;
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } cases[] = {
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "Test Using Larger Than Block-Size Key - Hash Key First", 54,
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\xAA\x4A\xE5\xE1\x52\x72\xD0\x0E\x95\x70\x56\x37\xCE\x8A\x3B\x55"
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xED\x40\x21\x12" },
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { "Test Using Larger Than Block-Size Key and Larger "
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "Than One Block-Size Data", 73,
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "\xE8\xE9\x9D\x0F\x45\x23\x7D\x78\x6D\x6B\xBA\xA7\x96\x5C\x78\x08"
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          "\xBB\xFF\x1A\x91" }
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  crypto::HMAC hmac(crypto::HMAC::SHA1);
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(hmac.Init(reinterpret_cast<const unsigned char*>(key), key_len));
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    std::string data_string(cases[i].data, cases[i].data_len);
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    unsigned char digest[kSHA1DigestSize];
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(hmac.Sign(data_string, digest, kSHA1DigestSize));
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(0, memcmp(cases[i].digest, digest, kSHA1DigestSize));
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
237