123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- // 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/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"
- namespace device {
- namespace fido_parsing_utils {
- namespace {
- constexpr uint8_t kOne[] = {0x01};
- constexpr uint8_t kOneTwo[] = {0x01, 0x02};
- constexpr uint8_t kTwo[] = {0x02};
- constexpr uint8_t kTwoThree[] = {0x02, 0x03};
- constexpr uint8_t kThree[] = {0x03};
- constexpr uint8_t kOneTwoThree[] = {0x01, 0x02, 0x03};
- } // namespace
- TEST(U2fParsingUtils, RangeLess) {
- const std::array<int, 4> kOneTwoThreeFour = {1, 2, 3, 4};
- EXPECT_FALSE(RangeLess()(kOne, kOne));
- EXPECT_TRUE(RangeLess()(kOne, kOneTwo));
- EXPECT_TRUE(RangeLess()(kOne, kTwo));
- EXPECT_TRUE(RangeLess()(kOne, kTwoThree));
- EXPECT_TRUE(RangeLess()(kOne, kThree));
- EXPECT_TRUE(RangeLess()(kOne, kOneTwoThree));
- EXPECT_TRUE(RangeLess()(kOne, kOneTwoThreeFour));
- EXPECT_FALSE(RangeLess()(kOneTwo, kOne));
- EXPECT_FALSE(RangeLess()(kOneTwo, kOneTwo));
- EXPECT_TRUE(RangeLess()(kOneTwo, kTwo));
- EXPECT_TRUE(RangeLess()(kOneTwo, kTwoThree));
- EXPECT_TRUE(RangeLess()(kOneTwo, kThree));
- EXPECT_TRUE(RangeLess()(kOneTwo, kOneTwoThree));
- EXPECT_TRUE(RangeLess()(kOneTwo, kOneTwoThreeFour));
- EXPECT_FALSE(RangeLess()(kTwo, kOne));
- EXPECT_FALSE(RangeLess()(kTwo, kOneTwo));
- EXPECT_FALSE(RangeLess()(kTwo, kTwo));
- EXPECT_TRUE(RangeLess()(kTwo, kTwoThree));
- EXPECT_TRUE(RangeLess()(kTwo, kThree));
- EXPECT_FALSE(RangeLess()(kTwo, kOneTwoThree));
- EXPECT_FALSE(RangeLess()(kTwo, kOneTwoThreeFour));
- EXPECT_FALSE(RangeLess()(kTwoThree, kOne));
- EXPECT_FALSE(RangeLess()(kTwoThree, kOneTwo));
- EXPECT_FALSE(RangeLess()(kTwoThree, kTwo));
- EXPECT_FALSE(RangeLess()(kTwoThree, kTwoThree));
- EXPECT_TRUE(RangeLess()(kTwoThree, kThree));
- EXPECT_FALSE(RangeLess()(kTwoThree, kOneTwoThree));
- EXPECT_FALSE(RangeLess()(kTwoThree, kOneTwoThreeFour));
- EXPECT_FALSE(RangeLess()(kThree, kOne));
- EXPECT_FALSE(RangeLess()(kThree, kOneTwo));
- EXPECT_FALSE(RangeLess()(kThree, kTwo));
- EXPECT_FALSE(RangeLess()(kThree, kTwoThree));
- EXPECT_FALSE(RangeLess()(kThree, kThree));
- EXPECT_FALSE(RangeLess()(kThree, kOneTwoThree));
- EXPECT_FALSE(RangeLess()(kThree, kOneTwoThreeFour));
- EXPECT_FALSE(RangeLess()(kOneTwoThree, kOne));
- EXPECT_FALSE(RangeLess()(kOneTwoThree, kOneTwo));
- EXPECT_TRUE(RangeLess()(kOneTwoThree, kTwo));
- EXPECT_TRUE(RangeLess()(kOneTwoThree, kTwoThree));
- EXPECT_TRUE(RangeLess()(kOneTwoThree, kThree));
- EXPECT_FALSE(RangeLess()(kOneTwoThree, kOneTwoThree));
- EXPECT_TRUE(RangeLess()(kOneTwoThree, kOneTwoThreeFour));
- EXPECT_FALSE(RangeLess()(kOneTwoThreeFour, kOne));
- EXPECT_FALSE(RangeLess()(kOneTwoThreeFour, kOneTwo));
- EXPECT_TRUE(RangeLess()(kOneTwoThreeFour, kTwo));
- EXPECT_TRUE(RangeLess()(kOneTwoThreeFour, kTwoThree));
- EXPECT_TRUE(RangeLess()(kOneTwoThreeFour, kThree));
- EXPECT_FALSE(RangeLess()(kOneTwoThreeFour, kOneTwoThree));
- EXPECT_FALSE(RangeLess()(kOneTwoThreeFour, kOneTwoThreeFour));
- }
- TEST(U2fParsingUtils, Materialize) {
- const std::vector<uint8_t> empty;
- EXPECT_THAT(Materialize(empty), ::testing::IsEmpty());
- EXPECT_THAT(Materialize(base::span<const uint8_t>()), ::testing::IsEmpty());
- EXPECT_THAT(Materialize(base::span<const uint8_t>(kOne)),
- ::testing::ElementsAreArray(kOne));
- EXPECT_THAT(Materialize(base::span<const uint8_t>(kOneTwoThree)),
- ::testing::ElementsAreArray(kOneTwoThree));
- static_assert(std::is_same<std::vector<uint8_t>,
- decltype(Materialize(
- base::span<const uint8_t>(kOne)))>::value,
- "Materialize with a dynamic span should yield a std::vector.");
- }
- TEST(U2fParsingUtils, StaticMaterialize) {
- std::array<uint8_t, 0> empty;
- EXPECT_THAT(Materialize(empty), ::testing::IsEmpty());
- EXPECT_THAT(Materialize(base::span<const uint8_t, 0>()),
- ::testing::IsEmpty());
- EXPECT_THAT(Materialize(base::make_span(kOne)),
- ::testing::ElementsAreArray(kOne));
- EXPECT_THAT(Materialize(base::make_span(kOneTwoThree)),
- ::testing::ElementsAreArray(kOneTwoThree));
- static_assert(
- std::is_same<std::array<uint8_t, 1>,
- decltype(Materialize(base::make_span(kOne)))>::value,
- "Materialize with a static span should yield a std::array.");
- }
- TEST(U2fParsingUtils, MaterializeOrNull) {
- auto result = MaterializeOrNull(kOneTwoThree);
- ASSERT_TRUE(result.has_value());
- EXPECT_THAT(*result, ::testing::ElementsAreArray(kOneTwoThree));
- EXPECT_EQ(MaterializeOrNull(absl::nullopt), absl::nullopt);
- }
- TEST(U2fParsingUtils, Append) {
- std::vector<uint8_t> target;
- Append(&target, base::span<const uint8_t>());
- EXPECT_THAT(target, ::testing::IsEmpty());
- // Should be idempotent, try twice for good measure.
- Append(&target, base::span<const uint8_t>());
- EXPECT_THAT(target, ::testing::IsEmpty());
- const std::vector<uint8_t> one(std::begin(kOne), std::end(kOne));
- Append(&target, one);
- EXPECT_THAT(target, ::testing::ElementsAreArray(kOne));
- Append(&target, kTwoThree);
- EXPECT_THAT(target, ::testing::ElementsAreArray(kOneTwoThree));
- }
- TEST(U2fParsingUtils, AppendSelfCrashes) {
- std::vector<uint8_t> target(std::begin(kOneTwoThree), std::end(kOneTwoThree));
- auto span = base::make_span(target);
- // Tests the case where |in_values| overlap with the beginning of |*target|.
- EXPECT_DEATH_IF_SUPPORTED(Append(&target, span.first(1)), "");
- // Tests the case where |in_values| overlap with the end of |*target|.
- EXPECT_DEATH_IF_SUPPORTED(Append(&target, span.last(1)), "");
- }
- // ExtractSpan and ExtractSuffixSpan are implicitly tested as they used by
- // the Extract and ExtractSuffix implementations.
- TEST(U2fParsingUtils, ExtractEmpty) {
- const std::vector<uint8_t> empty;
- EXPECT_THAT(Extract(empty, 0, 0), ::testing::IsEmpty());
- EXPECT_THAT(Extract(kOne, 0, 0), ::testing::IsEmpty());
- EXPECT_THAT(Extract(kOne, 1, 0), ::testing::IsEmpty());
- EXPECT_THAT(Extract(kOneTwoThree, 0, 0), ::testing::IsEmpty());
- EXPECT_THAT(Extract(kOneTwoThree, 1, 0), ::testing::IsEmpty());
- EXPECT_THAT(Extract(kOneTwoThree, 2, 0), ::testing::IsEmpty());
- EXPECT_THAT(Extract(kOneTwoThree, 3, 0), ::testing::IsEmpty());
- }
- TEST(U2fParsingUtils, ExtractInBounds) {
- EXPECT_THAT(Extract(kOne, 0, 1), ::testing::ElementsAreArray(kOne));
- EXPECT_THAT(Extract(kOneTwoThree, 0, 1), ::testing::ElementsAreArray(kOne));
- EXPECT_THAT(Extract(kOneTwoThree, 2, 1), ::testing::ElementsAreArray(kThree));
- EXPECT_THAT(Extract(kOneTwoThree, 1, 2),
- ::testing::ElementsAreArray(kTwoThree));
- EXPECT_THAT(Extract(kOneTwoThree, 0, 3),
- ::testing::ElementsAreArray(kOneTwoThree));
- }
- TEST(U2fParsingUtils, ExtractOutOfBounds) {
- const std::vector<uint8_t> empty;
- EXPECT_THAT(Extract(empty, 0, 1), ::testing::IsEmpty());
- EXPECT_THAT(Extract(empty, 1, 0), ::testing::IsEmpty());
- EXPECT_THAT(Extract(kOne, 0, 2), ::testing::IsEmpty());
- EXPECT_THAT(Extract(kOne, 1, 1), ::testing::IsEmpty());
- EXPECT_THAT(Extract(kOne, 2, 0), ::testing::IsEmpty());
- EXPECT_THAT(Extract(kOneTwoThree, 0, 4), ::testing::IsEmpty());
- EXPECT_THAT(Extract(kOneTwoThree, 1, 3), ::testing::IsEmpty());
- EXPECT_THAT(Extract(kOneTwoThree, 2, 2), ::testing::IsEmpty());
- EXPECT_THAT(Extract(kOneTwoThree, 3, 1), ::testing::IsEmpty());
- EXPECT_THAT(Extract(kOneTwoThree, 4, 0), ::testing::IsEmpty());
- }
- TEST(U2fParsingUtils, ExtractSuffixEmpty) {
- const std::vector<uint8_t> empty;
- EXPECT_THAT(ExtractSuffix(empty, 0), ::testing::IsEmpty());
- EXPECT_THAT(ExtractSuffix(kOne, 1), ::testing::IsEmpty());
- EXPECT_THAT(ExtractSuffix(kOneTwoThree, 3), ::testing::IsEmpty());
- }
- TEST(U2fParsingUtils, ExtractSuffixInBounds) {
- EXPECT_THAT(ExtractSuffix(kOne, 0), ::testing::ElementsAreArray(kOne));
- EXPECT_THAT(ExtractSuffix(kOneTwoThree, 1),
- ::testing::ElementsAreArray(kTwoThree));
- EXPECT_THAT(ExtractSuffix(kOneTwoThree, 2),
- ::testing::ElementsAreArray(kThree));
- }
- TEST(U2fParsingUtils, ExtractSuffixOutOfBounds) {
- const std::vector<uint8_t> empty;
- EXPECT_THAT(ExtractSuffix(empty, 1), ::testing::IsEmpty());
- EXPECT_THAT(ExtractSuffix(kOne, 2), ::testing::IsEmpty());
- EXPECT_THAT(ExtractSuffix(kOneTwoThree, 4), ::testing::IsEmpty());
- }
- TEST(U2fParsingUtils, ExtractArray) {
- const std::vector<uint8_t> empty;
- std::array<uint8_t, 0> array_empty;
- EXPECT_TRUE(ExtractArray(empty, 0, &array_empty));
- std::array<uint8_t, 2> array_two_three;
- EXPECT_TRUE(ExtractArray(kTwoThree, 0, &array_two_three));
- EXPECT_THAT(array_two_three, ::testing::ElementsAreArray(kTwoThree));
- EXPECT_FALSE(ExtractArray(kOneTwoThree, 2, &array_two_three));
- std::array<uint8_t, 1> array_three;
- EXPECT_TRUE(ExtractArray(kOneTwoThree, 2, &array_three));
- EXPECT_THAT(array_three, ::testing::ElementsAreArray(kThree));
- }
- TEST(U2fParsingUtils, SplitSpan) {
- std::vector<uint8_t> empty;
- EXPECT_THAT(SplitSpan(empty, 1), ::testing::IsEmpty());
- EXPECT_THAT(SplitSpan(empty, 2), ::testing::IsEmpty());
- EXPECT_THAT(SplitSpan(empty, 3), ::testing::IsEmpty());
- EXPECT_THAT(SplitSpan(kOne, 1),
- ::testing::ElementsAre(::testing::ElementsAreArray(kOne)));
- EXPECT_THAT(SplitSpan(kOne, 2),
- ::testing::ElementsAre(::testing::ElementsAreArray(kOne)));
- EXPECT_THAT(SplitSpan(kOne, 3),
- ::testing::ElementsAre(::testing::ElementsAreArray(kOne)));
- EXPECT_THAT(SplitSpan(kOneTwo, 1),
- ::testing::ElementsAre(::testing::ElementsAreArray(kOne),
- ::testing::ElementsAreArray(kTwo)));
- EXPECT_THAT(SplitSpan(kOneTwo, 2),
- ::testing::ElementsAre(::testing::ElementsAreArray(kOneTwo)));
- EXPECT_THAT(SplitSpan(kOneTwo, 3),
- ::testing::ElementsAre(::testing::ElementsAreArray(kOneTwo)));
- EXPECT_THAT(SplitSpan(kOneTwoThree, 1),
- ::testing::ElementsAre(::testing::ElementsAreArray(kOne),
- ::testing::ElementsAreArray(kTwo),
- ::testing::ElementsAreArray(kThree)));
- EXPECT_THAT(SplitSpan(kOneTwoThree, 2),
- ::testing::ElementsAre(::testing::ElementsAreArray(kOneTwo),
- ::testing::ElementsAreArray(kThree)));
- EXPECT_THAT(
- SplitSpan(kOneTwoThree, 3),
- ::testing::ElementsAre(::testing::ElementsAreArray(kOneTwoThree)));
- EXPECT_THAT(
- SplitSpan(kOneTwoThree, 4),
- ::testing::ElementsAre(::testing::ElementsAreArray(kOneTwoThree)));
- EXPECT_THAT(
- SplitSpan(kOneTwoThree, 5),
- ::testing::ElementsAre(::testing::ElementsAreArray(kOneTwoThree)));
- EXPECT_THAT(
- SplitSpan(kOneTwoThree, 6),
- ::testing::ElementsAre(::testing::ElementsAreArray(kOneTwoThree)));
- }
- TEST(U2fParsingUtils, CreateSHA256Hash) {
- EXPECT_THAT(CreateSHA256Hash("acme.com"),
- ::testing::ElementsAreArray(test_data::kApplicationParameter));
- }
- TEST(U2fParsingUtils, ConvertSpanToStringPiece) {
- constexpr uint8_t kTestAsciiAbcd[] = {'a', 'b', 'c', 'd'};
- EXPECT_EQ("abcd", ConvertToStringPiece(kTestAsciiAbcd));
- }
- } // namespace fido_parsing_utils
- } // namespace device
|