blob: 2c0b50cfe02391c6914f0688be1b36735d51cdf3 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "util/crypto_util/mac.h"
#include <limits.h>
#include <string>
#include <vector>
#include "third_party/googletest/googletest/include/gtest/gtest.h"
#include "util/crypto_util/errors.h"
#include "util/crypto_util/random.h"
namespace cobalt {
namespace crypto {
namespace hmac {
// This is just a smoke test of the hmac function. We invoke it 101 times
// using a key length ranging from 0 to 100 and a data length ranging from
// 100 to 0 and we check that it completes without an error.
TEST(HmacTest, VariousKeyLengths) {
byte key[100], data[100];
Random rand;
rand.RandomBytes(key, 100);
rand.RandomBytes(data, 100);
byte tag[hmac::TAG_SIZE];
for (size_t key_len = 0; key_len <= 100; key_len++) {
EXPECT_TRUE(HMAC(key, key_len, data, 100 - key_len, tag))
<< GetLastErrorMessage();
}
}
// A helper function for the EqualsAndNotEqual test. It takes
// two keys and two data arrays and invokes HMAC on each of them.
// Then it compares them for equality or inequality depending on the
// value of |expect_eq|.
void checkEqualHmacs(byte key1[32], byte key2[32], byte data1[100],
byte data2[100], bool expect_eq) {
byte tag1[hmac::TAG_SIZE], tag2[hmac::TAG_SIZE];
EXPECT_TRUE(HMAC(key1, 32, data1, 100, tag1))
<< GetLastErrorMessage();
EXPECT_TRUE(HMAC(key2, 32, data2, 100, tag2))
<< GetLastErrorMessage();
if (expect_eq) {
EXPECT_EQ(std::string(reinterpret_cast<char*>(tag1), hmac::TAG_SIZE),
std::string(reinterpret_cast<char*>(tag2), hmac::TAG_SIZE));
} else {
EXPECT_NE(std::string(reinterpret_cast<char*>(tag1), hmac::TAG_SIZE),
std::string(reinterpret_cast<char*>(tag2), hmac::TAG_SIZE));
}
}
// Tests that if we call HMAC twice with the same key and data we get
// the same tag but if we change either the key or the data we get a
// different tag.
TEST(HmacTest, EqualAndNotEqual) {
byte key1[32], key2[32], data1[100], data2[100];
Random rand;
rand.RandomBytes(key1, 32);
rand.RandomBytes(key2, 32);
rand.RandomBytes(data1, 100);
rand.RandomBytes(data2, 100);
checkEqualHmacs(key1, key1, data1, data1, true);
checkEqualHmacs(key1, key1, data1, data2, false);
checkEqualHmacs(key1, key2, data1, data1, false);
}
} // namespace hmac
} // namespace crypto
} // namespace cobalt