1*e7b1675dSTing-Kang Chang // Copyright 2023 Google LLC
2*e7b1675dSTing-Kang Chang //
3*e7b1675dSTing-Kang Chang // Licensed under the Apache License, Version 2.0 (the "License");
4*e7b1675dSTing-Kang Chang // you may not use this file except in compliance with the License.
5*e7b1675dSTing-Kang Chang // You may obtain a copy of the License at
6*e7b1675dSTing-Kang Chang //
7*e7b1675dSTing-Kang Chang // http://www.apache.org/licenses/LICENSE-2.0
8*e7b1675dSTing-Kang Chang //
9*e7b1675dSTing-Kang Chang // Unless required by applicable law or agreed to in writing, software
10*e7b1675dSTing-Kang Chang // distributed under the License is distributed on an "AS IS" BASIS,
11*e7b1675dSTing-Kang Chang // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*e7b1675dSTing-Kang Chang // See the License for the specific language governing permissions and
13*e7b1675dSTing-Kang Chang // limitations under the License.
14*e7b1675dSTing-Kang Chang //
15*e7b1675dSTing-Kang Chang ////////////////////////////////////////////////////////////////////////////////
16*e7b1675dSTing-Kang Chang
17*e7b1675dSTing-Kang Chang #include "tink/signature/ed25519_parameters.h"
18*e7b1675dSTing-Kang Chang
19*e7b1675dSTing-Kang Chang #include "gmock/gmock.h"
20*e7b1675dSTing-Kang Chang #include "gtest/gtest.h"
21*e7b1675dSTing-Kang Chang #include "tink/util/statusor.h"
22*e7b1675dSTing-Kang Chang #include "tink/util/test_matchers.h"
23*e7b1675dSTing-Kang Chang
24*e7b1675dSTing-Kang Chang namespace crypto {
25*e7b1675dSTing-Kang Chang namespace tink {
26*e7b1675dSTing-Kang Chang namespace {
27*e7b1675dSTing-Kang Chang
28*e7b1675dSTing-Kang Chang using ::crypto::tink::test::IsOk;
29*e7b1675dSTing-Kang Chang using ::crypto::tink::test::StatusIs;
30*e7b1675dSTing-Kang Chang using ::testing::Eq;
31*e7b1675dSTing-Kang Chang using ::testing::IsTrue;
32*e7b1675dSTing-Kang Chang using ::testing::TestWithParam;
33*e7b1675dSTing-Kang Chang using ::testing::Values;
34*e7b1675dSTing-Kang Chang
35*e7b1675dSTing-Kang Chang struct TestCase {
36*e7b1675dSTing-Kang Chang Ed25519Parameters::Variant variant;
37*e7b1675dSTing-Kang Chang bool has_id_requirement;
38*e7b1675dSTing-Kang Chang };
39*e7b1675dSTing-Kang Chang
40*e7b1675dSTing-Kang Chang using Ed25519ParametersTest = TestWithParam<TestCase>;
41*e7b1675dSTing-Kang Chang
42*e7b1675dSTing-Kang Chang INSTANTIATE_TEST_SUITE_P(Ed25519ParametersTestSuite, Ed25519ParametersTest,
43*e7b1675dSTing-Kang Chang Values(TestCase{Ed25519Parameters::Variant::kTink,
44*e7b1675dSTing-Kang Chang /*has_id_requirement=*/true},
45*e7b1675dSTing-Kang Chang TestCase{Ed25519Parameters::Variant::kCrunchy,
46*e7b1675dSTing-Kang Chang /*has_id_requirement=*/true},
47*e7b1675dSTing-Kang Chang TestCase{Ed25519Parameters::Variant::kLegacy,
48*e7b1675dSTing-Kang Chang /*has_id_requirement=*/true},
49*e7b1675dSTing-Kang Chang TestCase{Ed25519Parameters::Variant::kNoPrefix,
50*e7b1675dSTing-Kang Chang /*has_id_requirement=*/false}));
51*e7b1675dSTing-Kang Chang
TEST_P(Ed25519ParametersTest,Create)52*e7b1675dSTing-Kang Chang TEST_P(Ed25519ParametersTest, Create) {
53*e7b1675dSTing-Kang Chang TestCase test_case = GetParam();
54*e7b1675dSTing-Kang Chang
55*e7b1675dSTing-Kang Chang util::StatusOr<Ed25519Parameters> parameters =
56*e7b1675dSTing-Kang Chang Ed25519Parameters::Create(test_case.variant);
57*e7b1675dSTing-Kang Chang ASSERT_THAT(parameters, IsOk());
58*e7b1675dSTing-Kang Chang
59*e7b1675dSTing-Kang Chang EXPECT_THAT(parameters->GetVariant(), Eq(test_case.variant));
60*e7b1675dSTing-Kang Chang EXPECT_THAT(parameters->HasIdRequirement(), Eq(test_case.has_id_requirement));
61*e7b1675dSTing-Kang Chang }
62*e7b1675dSTing-Kang Chang
TEST(Ed25519ParametersTest,CreateWithInvalidVariantFails)63*e7b1675dSTing-Kang Chang TEST(Ed25519ParametersTest, CreateWithInvalidVariantFails) {
64*e7b1675dSTing-Kang Chang EXPECT_THAT(Ed25519Parameters::Create(
65*e7b1675dSTing-Kang Chang Ed25519Parameters::Variant::
66*e7b1675dSTing-Kang Chang kDoNotUseInsteadUseDefaultWhenWritingSwitchStatements)
67*e7b1675dSTing-Kang Chang .status(),
68*e7b1675dSTing-Kang Chang StatusIs(absl::StatusCode::kInvalidArgument));
69*e7b1675dSTing-Kang Chang }
70*e7b1675dSTing-Kang Chang
TEST(Ed25519ParametersTest,CopyConstructor)71*e7b1675dSTing-Kang Chang TEST(Ed25519ParametersTest, CopyConstructor) {
72*e7b1675dSTing-Kang Chang util::StatusOr<Ed25519Parameters> parameters =
73*e7b1675dSTing-Kang Chang Ed25519Parameters::Create(Ed25519Parameters::Variant::kTink);
74*e7b1675dSTing-Kang Chang ASSERT_THAT(parameters, IsOk());
75*e7b1675dSTing-Kang Chang
76*e7b1675dSTing-Kang Chang Ed25519Parameters copy(*parameters);
77*e7b1675dSTing-Kang Chang
78*e7b1675dSTing-Kang Chang EXPECT_THAT(copy.GetVariant(), Eq(Ed25519Parameters::Variant::kTink));
79*e7b1675dSTing-Kang Chang EXPECT_THAT(copy.HasIdRequirement(), IsTrue());
80*e7b1675dSTing-Kang Chang }
81*e7b1675dSTing-Kang Chang
TEST(Ed25519ParametersTest,CopyAssignment)82*e7b1675dSTing-Kang Chang TEST(Ed25519ParametersTest, CopyAssignment) {
83*e7b1675dSTing-Kang Chang util::StatusOr<Ed25519Parameters> parameters =
84*e7b1675dSTing-Kang Chang Ed25519Parameters::Create(Ed25519Parameters::Variant::kTink);
85*e7b1675dSTing-Kang Chang ASSERT_THAT(parameters, IsOk());
86*e7b1675dSTing-Kang Chang
87*e7b1675dSTing-Kang Chang Ed25519Parameters copy = *parameters;
88*e7b1675dSTing-Kang Chang
89*e7b1675dSTing-Kang Chang EXPECT_THAT(copy.GetVariant(), Eq(Ed25519Parameters::Variant::kTink));
90*e7b1675dSTing-Kang Chang EXPECT_THAT(copy.HasIdRequirement(), IsTrue());
91*e7b1675dSTing-Kang Chang }
92*e7b1675dSTing-Kang Chang
TEST_P(Ed25519ParametersTest,ParametersEquals)93*e7b1675dSTing-Kang Chang TEST_P(Ed25519ParametersTest, ParametersEquals) {
94*e7b1675dSTing-Kang Chang TestCase test_case = GetParam();
95*e7b1675dSTing-Kang Chang
96*e7b1675dSTing-Kang Chang util::StatusOr<Ed25519Parameters> parameters =
97*e7b1675dSTing-Kang Chang Ed25519Parameters::Create(test_case.variant);
98*e7b1675dSTing-Kang Chang ASSERT_THAT(parameters, IsOk());
99*e7b1675dSTing-Kang Chang
100*e7b1675dSTing-Kang Chang util::StatusOr<Ed25519Parameters> other_parameters =
101*e7b1675dSTing-Kang Chang Ed25519Parameters::Create(test_case.variant);
102*e7b1675dSTing-Kang Chang ASSERT_THAT(other_parameters, IsOk());
103*e7b1675dSTing-Kang Chang
104*e7b1675dSTing-Kang Chang EXPECT_TRUE(*parameters == *other_parameters);
105*e7b1675dSTing-Kang Chang EXPECT_TRUE(*other_parameters == *parameters);
106*e7b1675dSTing-Kang Chang EXPECT_FALSE(*parameters != *other_parameters);
107*e7b1675dSTing-Kang Chang EXPECT_FALSE(*other_parameters != *parameters);
108*e7b1675dSTing-Kang Chang }
109*e7b1675dSTing-Kang Chang
TEST(Ed25519ParametersTest,VariantNotEqual)110*e7b1675dSTing-Kang Chang TEST(Ed25519ParametersTest, VariantNotEqual) {
111*e7b1675dSTing-Kang Chang util::StatusOr<Ed25519Parameters> parameters =
112*e7b1675dSTing-Kang Chang Ed25519Parameters::Create(Ed25519Parameters::Variant::kTink);
113*e7b1675dSTing-Kang Chang ASSERT_THAT(parameters, IsOk());
114*e7b1675dSTing-Kang Chang
115*e7b1675dSTing-Kang Chang util::StatusOr<Ed25519Parameters> other_parameters =
116*e7b1675dSTing-Kang Chang Ed25519Parameters::Create(Ed25519Parameters::Variant::kNoPrefix);
117*e7b1675dSTing-Kang Chang ASSERT_THAT(other_parameters, IsOk());
118*e7b1675dSTing-Kang Chang
119*e7b1675dSTing-Kang Chang EXPECT_TRUE(*parameters != *other_parameters);
120*e7b1675dSTing-Kang Chang EXPECT_FALSE(*parameters == *other_parameters);
121*e7b1675dSTing-Kang Chang }
122*e7b1675dSTing-Kang Chang
123*e7b1675dSTing-Kang Chang } // namespace
124*e7b1675dSTing-Kang Chang } // namespace tink
125*e7b1675dSTing-Kang Chang } // namespace crypto
126