blob: 99b5610d700a426b10e6b4b82341117711c54965 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "device/fido/mac/util.h"
#include "base/time/time.h"
#include "base/time/time_override.h"
#include "device/fido/authenticator_data.h"
#include "device/fido/ec_public_key.h"
#include "device/fido/fido_parsing_utils.h"
#include "device/fido/fido_test_data.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using testing::ElementsAre;
namespace device {
namespace fido {
namespace mac {
namespace {
std::unique_ptr<ECPublicKey> TestKey() {
return ECPublicKey::ParseX962Uncompressed(
fido_parsing_utils::kEs256, test_data::kX962UncompressedPublicKey);
}
base::Time g_fake_now;
TEST(MakeAuthenticatorDataTest, TestTimestampSignatureCounter) {
g_fake_now = base::Time::UnixEpoch();
base::subtle::ScopedTimeClockOverrides time_clock_overrides(
[]() { return g_fake_now; }, nullptr, nullptr);
const std::string rp_id = "example.com";
const std::vector<uint8_t> credential_id = {1, 2, 3, 4, 5};
// Epoch equals zero.
auto opt_auth_data = MakeAuthenticatorData(rp_id, credential_id, TestKey());
EXPECT_THAT(opt_auth_data->counter(), ElementsAre(0x00, 0x00, 0x00, 0x00));
// Time counter increments in seconds.
g_fake_now += base::TimeDelta::FromSeconds(1);
opt_auth_data = MakeAuthenticatorData(rp_id, credential_id, TestKey());
EXPECT_THAT(opt_auth_data->counter(), ElementsAre(0x00, 0x00, 0x00, 0x01));
g_fake_now += base::TimeDelta::FromSeconds(1024);
opt_auth_data = MakeAuthenticatorData(rp_id, credential_id, TestKey());
EXPECT_THAT(opt_auth_data->counter(), ElementsAre(0x00, 0x00, 0x04, 0x01));
ASSERT_TRUE(base::Time::FromUTCExploded({2106, 1, 0, 1}, &g_fake_now));
opt_auth_data = MakeAuthenticatorData(rp_id, credential_id, TestKey());
EXPECT_THAT(opt_auth_data->counter(), ElementsAre(0xff, 0xce, 0xdd, 0x80));
}
} // namespace
} // namespace mac
} // namespace fido
} // namespace device