Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <keymaster/km_openssl/hmac.h>
     18 
     19 #include <gtest/gtest.h>
     20 #include <string.h>
     21 
     22 #include "android_keymaster_test_utils.h"
     23 
     24 using std::string;
     25 
     26 namespace keymaster {
     27 
     28 namespace test {
     29 
     30 struct HmacTest {
     31     const char* data;
     32     const char* key;
     33     uint8_t digest[32];
     34 };
     35 
     36 static const HmacTest kHmacTests[] = {
     37     {
     38         "Test Using Larger Than Block-Size Key - Hash Key First",
     39         "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
     40         "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
     41         "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
     42         "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
     43         {
     44             0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26, 0xaa, 0xcb, 0xf5,
     45             0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f,
     46             0x0e, 0xe3, 0x7f, 0x54,
     47         },
     48     },
     49     {
     50         "The test message for the MD2, MD5, and SHA-1 hashing algorithms.",
     51         "46697265666f7820616e64205468756e64657242697264206172652061776573"
     52         "6f6d652100",
     53         {
     54             0x05, 0x75, 0x9a, 0x9e, 0x70, 0x5e, 0xe7, 0x44, 0xe2, 0x46, 0x4b, 0x92, 0x22, 0x14,
     55             0x22, 0xe0, 0x1b, 0x92, 0x8a, 0x0c, 0xfe, 0xf5, 0x49, 0xe9, 0xa7, 0x1b, 0x56, 0x7d,
     56             0x1d, 0x29, 0x40, 0x48,
     57         },
     58     },
     59 };
     60 
     61 TEST(HmacTest, SHA256) {
     62     for (size_t i = 0; i < 2; i++) {
     63         const HmacTest& test(kHmacTests[i]);
     64 
     65         HmacSha256 hmac;
     66         const string key = hex2str(test.key);
     67         Buffer key_buffer(key.data(), key.size());
     68         ASSERT_TRUE(hmac.Init(key_buffer));
     69 
     70         uint8_t digest_copy[sizeof(test.digest)];
     71         memcpy(digest_copy, test.digest, sizeof(test.digest));
     72         Buffer digest_buffer(reinterpret_cast<uint8_t*>(digest_copy), sizeof(digest_copy));
     73 
     74         Buffer data_buffer(test.data, strlen(test.data));
     75         EXPECT_TRUE(hmac.Verify(data_buffer, digest_buffer));
     76 
     77         digest_copy[16] ^= 0x80;
     78         digest_buffer.Reinitialize(reinterpret_cast<uint8_t*>(digest_copy), sizeof(digest_copy));
     79         EXPECT_FALSE(hmac.Verify(data_buffer, digest_buffer));
     80     }
     81 }
     82 
     83 }  // namespace test
     84 }  // namespace keymaster
     85