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