17689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong/*
27689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong * Copyright (C) 2015 The Android Open Source Project
37689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong *
47689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong * Licensed under the Apache License, Version 2.0 (the "License");
57689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong * you may not use this file except in compliance with the License.
67689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong * You may obtain a copy of the License at
77689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong *
87689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong *      http://www.apache.org/licenses/LICENSE-2.0
97689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong *
107689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong * Unless required by applicable law or agreed to in writing, software
117689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong * distributed under the License is distributed on an "AS IS" BASIS,
127689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong * See the License for the specific language governing permissions and
147689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong * limitations under the License.
157689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong */
167689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
177689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong#include "hmac.h"
187689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
197689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong#include <gtest/gtest.h>
207689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong#include <string.h>
217689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
22b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include "android_keymaster_test_utils.h"
237689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
247689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duongusing std::string;
257689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
267689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duongnamespace keymaster {
277689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
287689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duongnamespace test {
297689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
307689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duongstruct HmacTest {
317689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong    const char* data;
327689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong    const char* key;
337689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong    uint8_t digest[32];
347689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong};
357689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
367689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duongstatic const HmacTest kHmacTests[] = {
377689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong    {
387689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        "Test Using Larger Than Block-Size Key - Hash Key First",
397689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
407689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
417689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
427689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
437689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        {
447689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong            0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26, 0xaa, 0xcb, 0xf5,
457689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong            0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f,
467689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong            0x0e, 0xe3, 0x7f, 0x54,
477689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        },
487689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong    },
497689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong    {
507689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        "The test message for the MD2, MD5, and SHA-1 hashing algorithms.",
517689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        "46697265666f7820616e64205468756e64657242697264206172652061776573"
527689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        "6f6d652100",
537689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        {
547689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong            0x05, 0x75, 0x9a, 0x9e, 0x70, 0x5e, 0xe7, 0x44, 0xe2, 0x46, 0x4b, 0x92, 0x22, 0x14,
557689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong            0x22, 0xe0, 0x1b, 0x92, 0x8a, 0x0c, 0xfe, 0xf5, 0x49, 0xe9, 0xa7, 0x1b, 0x56, 0x7d,
567689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong            0x1d, 0x29, 0x40, 0x48,
577689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        },
587689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong    },
597689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong};
607689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
617689ed6e95e5cb712c4983cb30ad383520cfaa33Thai DuongTEST(HmacTest, SHA256) {
627689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong    for (size_t i = 0; i < 2; i++) {
637689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        const HmacTest& test(kHmacTests[i]);
647689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
657689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        HmacSha256 hmac;
667689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        const string key = hex2str(test.key);
677689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        Buffer key_buffer(key.data(), key.size());
687689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        ASSERT_TRUE(hmac.Init(key_buffer));
697689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
707689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        uint8_t digest_copy[sizeof(test.digest)];
717689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        memcpy(digest_copy, test.digest, sizeof(test.digest));
727689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        Buffer digest_buffer(reinterpret_cast<uint8_t*>(digest_copy), sizeof(digest_copy));
737689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
747689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        Buffer data_buffer(test.data, strlen(test.data));
757689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        EXPECT_TRUE(hmac.Verify(data_buffer, digest_buffer));
767689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
777689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        digest_copy[16] ^= 0x80;
787689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        digest_buffer.Reinitialize(reinterpret_cast<uint8_t*>(digest_copy), sizeof(digest_copy));
797689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        EXPECT_FALSE(hmac.Verify(data_buffer, digest_buffer));
807689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong    }
817689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong}
827689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
837689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong}  // namespace test
847689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong}  // namespace keymaster
85