xref: /aosp_15_r20/external/tink/cc/mac/mac_config_test.cc (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1*e7b1675dSTing-Kang Chang // Copyright 2017 Google Inc.
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/mac/mac_config.h"
18*e7b1675dSTing-Kang Chang 
19*e7b1675dSTing-Kang Chang #include <list>
20*e7b1675dSTing-Kang Chang #include <memory>
21*e7b1675dSTing-Kang Chang #include <string>
22*e7b1675dSTing-Kang Chang #include <utility>
23*e7b1675dSTing-Kang Chang 
24*e7b1675dSTing-Kang Chang #include "gtest/gtest.h"
25*e7b1675dSTing-Kang Chang #include "absl/status/status.h"
26*e7b1675dSTing-Kang Chang #include "tink/chunked_mac.h"
27*e7b1675dSTing-Kang Chang #include "tink/insecure_secret_key_access.h"
28*e7b1675dSTing-Kang Chang #include "tink/internal/fips_utils.h"
29*e7b1675dSTing-Kang Chang #include "tink/internal/mutable_serialization_registry.h"
30*e7b1675dSTing-Kang Chang #include "tink/internal/proto_key_serialization.h"
31*e7b1675dSTing-Kang Chang #include "tink/internal/proto_parameters_serialization.h"
32*e7b1675dSTing-Kang Chang #include "tink/keyset_handle.h"
33*e7b1675dSTing-Kang Chang #include "tink/mac.h"
34*e7b1675dSTing-Kang Chang #include "tink/mac/aes_cmac_key.h"
35*e7b1675dSTing-Kang Chang #include "tink/mac/aes_cmac_key_manager.h"
36*e7b1675dSTing-Kang Chang #include "tink/mac/aes_cmac_parameters.h"
37*e7b1675dSTing-Kang Chang #include "tink/mac/hmac_key.h"
38*e7b1675dSTing-Kang Chang #include "tink/mac/hmac_key_manager.h"
39*e7b1675dSTing-Kang Chang #include "tink/mac/hmac_parameters.h"
40*e7b1675dSTing-Kang Chang #include "tink/mac/mac_key_templates.h"
41*e7b1675dSTing-Kang Chang #include "tink/partial_key_access.h"
42*e7b1675dSTing-Kang Chang #include "tink/registry.h"
43*e7b1675dSTing-Kang Chang #include "tink/util/status.h"
44*e7b1675dSTing-Kang Chang #include "tink/util/test_matchers.h"
45*e7b1675dSTing-Kang Chang #include "tink/util/test_util.h"
46*e7b1675dSTing-Kang Chang #include "proto/common.pb.h"
47*e7b1675dSTing-Kang Chang #include "proto/tink.pb.h"
48*e7b1675dSTing-Kang Chang 
49*e7b1675dSTing-Kang Chang namespace crypto {
50*e7b1675dSTing-Kang Chang namespace tink {
51*e7b1675dSTing-Kang Chang namespace {
52*e7b1675dSTing-Kang Chang 
53*e7b1675dSTing-Kang Chang using ::crypto::tink::test::DummyMac;
54*e7b1675dSTing-Kang Chang using ::crypto::tink::test::IsOk;
55*e7b1675dSTing-Kang Chang using ::crypto::tink::test::StatusIs;
56*e7b1675dSTing-Kang Chang using ::google::crypto::tink::KeyData;
57*e7b1675dSTing-Kang Chang using ::google::crypto::tink::KeysetInfo;
58*e7b1675dSTing-Kang Chang using ::google::crypto::tink::KeyStatusType;
59*e7b1675dSTing-Kang Chang using ::google::crypto::tink::HashType;
60*e7b1675dSTing-Kang Chang using ::google::crypto::tink::KeyTemplate;
61*e7b1675dSTing-Kang Chang using ::google::crypto::tink::OutputPrefixType;
62*e7b1675dSTing-Kang Chang using ::testing::Values;
63*e7b1675dSTing-Kang Chang 
64*e7b1675dSTing-Kang Chang class MacConfigTest : public ::testing::Test {
65*e7b1675dSTing-Kang Chang  protected:
SetUp()66*e7b1675dSTing-Kang Chang   void SetUp() override {
67*e7b1675dSTing-Kang Chang     Registry::Reset();
68*e7b1675dSTing-Kang Chang     internal::MutableSerializationRegistry::GlobalInstance().Reset();
69*e7b1675dSTing-Kang Chang   }
70*e7b1675dSTing-Kang Chang };
71*e7b1675dSTing-Kang Chang 
TEST_F(MacConfigTest,Basic)72*e7b1675dSTing-Kang Chang TEST_F(MacConfigTest, Basic) {
73*e7b1675dSTing-Kang Chang   if (internal::IsFipsModeEnabled()) {
74*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Not supported in FIPS-only mode";
75*e7b1675dSTing-Kang Chang   }
76*e7b1675dSTing-Kang Chang 
77*e7b1675dSTing-Kang Chang   EXPECT_THAT(
78*e7b1675dSTing-Kang Chang       Registry::get_key_manager<Mac>(HmacKeyManager().get_key_type()).status(),
79*e7b1675dSTing-Kang Chang       StatusIs(absl::StatusCode::kNotFound));
80*e7b1675dSTing-Kang Chang   EXPECT_THAT(
81*e7b1675dSTing-Kang Chang       Registry::get_key_manager<ChunkedMac>(HmacKeyManager().get_key_type())
82*e7b1675dSTing-Kang Chang           .status(),
83*e7b1675dSTing-Kang Chang       StatusIs(absl::StatusCode::kNotFound));
84*e7b1675dSTing-Kang Chang   EXPECT_THAT(Registry::get_key_manager<Mac>(AesCmacKeyManager().get_key_type())
85*e7b1675dSTing-Kang Chang                   .status(),
86*e7b1675dSTing-Kang Chang               StatusIs(absl::StatusCode::kNotFound));
87*e7b1675dSTing-Kang Chang   EXPECT_THAT(
88*e7b1675dSTing-Kang Chang       Registry::get_key_manager<ChunkedMac>(AesCmacKeyManager().get_key_type())
89*e7b1675dSTing-Kang Chang           .status(),
90*e7b1675dSTing-Kang Chang       StatusIs(absl::StatusCode::kNotFound));
91*e7b1675dSTing-Kang Chang 
92*e7b1675dSTing-Kang Chang   ASSERT_THAT(MacConfig::Register(), IsOk());
93*e7b1675dSTing-Kang Chang 
94*e7b1675dSTing-Kang Chang   EXPECT_THAT(
95*e7b1675dSTing-Kang Chang       Registry::get_key_manager<Mac>(HmacKeyManager().get_key_type()).status(),
96*e7b1675dSTing-Kang Chang       IsOk());
97*e7b1675dSTing-Kang Chang   EXPECT_THAT(
98*e7b1675dSTing-Kang Chang       Registry::get_key_manager<ChunkedMac>(HmacKeyManager().get_key_type())
99*e7b1675dSTing-Kang Chang           .status(),
100*e7b1675dSTing-Kang Chang       IsOk());
101*e7b1675dSTing-Kang Chang   EXPECT_THAT(Registry::get_key_manager<Mac>(AesCmacKeyManager().get_key_type())
102*e7b1675dSTing-Kang Chang                   .status(),
103*e7b1675dSTing-Kang Chang               IsOk());
104*e7b1675dSTing-Kang Chang   EXPECT_THAT(
105*e7b1675dSTing-Kang Chang       Registry::get_key_manager<ChunkedMac>(AesCmacKeyManager().get_key_type())
106*e7b1675dSTing-Kang Chang           .status(),
107*e7b1675dSTing-Kang Chang       IsOk());
108*e7b1675dSTing-Kang Chang }
109*e7b1675dSTing-Kang Chang 
110*e7b1675dSTing-Kang Chang // Tests that the MacWrapper has been properly registered and we can wrap
111*e7b1675dSTing-Kang Chang // primitives.
TEST_F(MacConfigTest,MacWrappersRegistered)112*e7b1675dSTing-Kang Chang TEST_F(MacConfigTest, MacWrappersRegistered) {
113*e7b1675dSTing-Kang Chang   if (internal::IsFipsModeEnabled()) {
114*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Not supported in FIPS-only mode";
115*e7b1675dSTing-Kang Chang   }
116*e7b1675dSTing-Kang Chang 
117*e7b1675dSTing-Kang Chang   ASSERT_TRUE(MacConfig::Register().ok());
118*e7b1675dSTing-Kang Chang 
119*e7b1675dSTing-Kang Chang   KeysetInfo::KeyInfo key_info;
120*e7b1675dSTing-Kang Chang   key_info.set_status(KeyStatusType::ENABLED);
121*e7b1675dSTing-Kang Chang   key_info.set_key_id(1234);
122*e7b1675dSTing-Kang Chang   key_info.set_output_prefix_type(OutputPrefixType::RAW);
123*e7b1675dSTing-Kang Chang   auto primitive_set = absl::make_unique<PrimitiveSet<Mac>>();
124*e7b1675dSTing-Kang Chang   ASSERT_TRUE(
125*e7b1675dSTing-Kang Chang       primitive_set
126*e7b1675dSTing-Kang Chang           ->set_primary(
127*e7b1675dSTing-Kang Chang               primitive_set
128*e7b1675dSTing-Kang Chang                   ->AddPrimitive(absl::make_unique<DummyMac>("dummy"), key_info)
129*e7b1675dSTing-Kang Chang                   .value())
130*e7b1675dSTing-Kang Chang           .ok());
131*e7b1675dSTing-Kang Chang 
132*e7b1675dSTing-Kang Chang   auto primitive_result = Registry::Wrap(std::move(primitive_set));
133*e7b1675dSTing-Kang Chang 
134*e7b1675dSTing-Kang Chang   ASSERT_TRUE(primitive_result.ok()) << primitive_result.status();
135*e7b1675dSTing-Kang Chang   auto mac_result = primitive_result.value()->ComputeMac("verified text");
136*e7b1675dSTing-Kang Chang   ASSERT_TRUE(mac_result.ok());
137*e7b1675dSTing-Kang Chang 
138*e7b1675dSTing-Kang Chang   EXPECT_TRUE(
139*e7b1675dSTing-Kang Chang       DummyMac("dummy").VerifyMac(mac_result.value(), "verified text").ok());
140*e7b1675dSTing-Kang Chang   EXPECT_FALSE(
141*e7b1675dSTing-Kang Chang       DummyMac("dummy").VerifyMac(mac_result.value(), "faked text").ok());
142*e7b1675dSTing-Kang Chang }
143*e7b1675dSTing-Kang Chang 
TEST_F(MacConfigTest,AesCmacProtoParamsSerializationRegistered)144*e7b1675dSTing-Kang Chang TEST_F(MacConfigTest, AesCmacProtoParamsSerializationRegistered) {
145*e7b1675dSTing-Kang Chang   if (internal::IsFipsModeEnabled()) {
146*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Not supported in FIPS-only mode";
147*e7b1675dSTing-Kang Chang   }
148*e7b1675dSTing-Kang Chang 
149*e7b1675dSTing-Kang Chang   util::StatusOr<internal::ProtoParametersSerialization>
150*e7b1675dSTing-Kang Chang       proto_params_serialization =
151*e7b1675dSTing-Kang Chang           internal::ProtoParametersSerialization::Create(
152*e7b1675dSTing-Kang Chang               MacKeyTemplates::AesCmac());
153*e7b1675dSTing-Kang Chang   ASSERT_THAT(proto_params_serialization, IsOk());
154*e7b1675dSTing-Kang Chang 
155*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Parameters>> parsed_params =
156*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance().ParseParameters(
157*e7b1675dSTing-Kang Chang           *proto_params_serialization);
158*e7b1675dSTing-Kang Chang   ASSERT_THAT(parsed_params.status(), StatusIs(absl::StatusCode::kNotFound));
159*e7b1675dSTing-Kang Chang 
160*e7b1675dSTing-Kang Chang   util::StatusOr<AesCmacParameters> params = AesCmacParameters::Create(
161*e7b1675dSTing-Kang Chang       /*key_size_in_bytes=*/32, /*cryptographic_tag_size_in_bytes=*/16,
162*e7b1675dSTing-Kang Chang       AesCmacParameters::Variant::kTink);
163*e7b1675dSTing-Kang Chang   ASSERT_THAT(params, IsOk());
164*e7b1675dSTing-Kang Chang 
165*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialized_params =
166*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance()
167*e7b1675dSTing-Kang Chang           .SerializeParameters<internal::ProtoParametersSerialization>(*params);
168*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialized_params.status(),
169*e7b1675dSTing-Kang Chang               StatusIs(absl::StatusCode::kNotFound));
170*e7b1675dSTing-Kang Chang 
171*e7b1675dSTing-Kang Chang   ASSERT_THAT(MacConfig::Register(), IsOk());
172*e7b1675dSTing-Kang Chang 
173*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Parameters>> parsed_params2 =
174*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance().ParseParameters(
175*e7b1675dSTing-Kang Chang           *proto_params_serialization);
176*e7b1675dSTing-Kang Chang   ASSERT_THAT(parsed_params2, IsOk());
177*e7b1675dSTing-Kang Chang 
178*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialized_params2 =
179*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance()
180*e7b1675dSTing-Kang Chang           .SerializeParameters<internal::ProtoParametersSerialization>(*params);
181*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialized_params2, IsOk());
182*e7b1675dSTing-Kang Chang }
183*e7b1675dSTing-Kang Chang 
TEST_F(MacConfigTest,AesCmacProtoKeySerializationRegistered)184*e7b1675dSTing-Kang Chang TEST_F(MacConfigTest, AesCmacProtoKeySerializationRegistered) {
185*e7b1675dSTing-Kang Chang   if (internal::IsFipsModeEnabled()) {
186*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Not supported in FIPS-only mode";
187*e7b1675dSTing-Kang Chang   }
188*e7b1675dSTing-Kang Chang 
189*e7b1675dSTing-Kang Chang   google::crypto::tink::AesCmacKey key_proto;
190*e7b1675dSTing-Kang Chang   key_proto.set_version(0);
191*e7b1675dSTing-Kang Chang   key_proto.set_key_value(subtle::Random::GetRandomBytes(32));
192*e7b1675dSTing-Kang Chang   key_proto.mutable_params()->set_tag_size(16);
193*e7b1675dSTing-Kang Chang 
194*e7b1675dSTing-Kang Chang   util::StatusOr<internal::ProtoKeySerialization> proto_key_serialization =
195*e7b1675dSTing-Kang Chang       internal::ProtoKeySerialization::Create(
196*e7b1675dSTing-Kang Chang           "type.googleapis.com/google.crypto.tink.AesCmacKey",
197*e7b1675dSTing-Kang Chang           RestrictedData(key_proto.SerializeAsString(),
198*e7b1675dSTing-Kang Chang                          InsecureSecretKeyAccess::Get()),
199*e7b1675dSTing-Kang Chang           KeyData::SYMMETRIC, OutputPrefixType::TINK, /*id_requirement=*/123);
200*e7b1675dSTing-Kang Chang   ASSERT_THAT(proto_key_serialization, IsOk());
201*e7b1675dSTing-Kang Chang 
202*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Key>> parsed_key =
203*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance().ParseKey(
204*e7b1675dSTing-Kang Chang           *proto_key_serialization, InsecureSecretKeyAccess::Get());
205*e7b1675dSTing-Kang Chang   ASSERT_THAT(parsed_key.status(), StatusIs(absl::StatusCode::kNotFound));
206*e7b1675dSTing-Kang Chang 
207*e7b1675dSTing-Kang Chang   util::StatusOr<AesCmacParameters> params = AesCmacParameters::Create(
208*e7b1675dSTing-Kang Chang       /*key_size_in_bytes=*/32, /*cryptographic_tag_size_in_bytes=*/16,
209*e7b1675dSTing-Kang Chang       AesCmacParameters::Variant::kTink);
210*e7b1675dSTing-Kang Chang   ASSERT_THAT(params, IsOk());
211*e7b1675dSTing-Kang Chang 
212*e7b1675dSTing-Kang Chang   util::StatusOr<AesCmacKey> key =
213*e7b1675dSTing-Kang Chang       AesCmacKey::Create(*params,
214*e7b1675dSTing-Kang Chang                          RestrictedData(subtle::Random::GetRandomBytes(32),
215*e7b1675dSTing-Kang Chang                                         InsecureSecretKeyAccess::Get()),
216*e7b1675dSTing-Kang Chang                          /*id_requirement=*/123, GetPartialKeyAccess());
217*e7b1675dSTing-Kang Chang   ASSERT_THAT(key, IsOk());
218*e7b1675dSTing-Kang Chang 
219*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialized_key =
220*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance()
221*e7b1675dSTing-Kang Chang           .SerializeKey<internal::ProtoKeySerialization>(
222*e7b1675dSTing-Kang Chang               *key, InsecureSecretKeyAccess::Get());
223*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialized_key.status(), StatusIs(absl::StatusCode::kNotFound));
224*e7b1675dSTing-Kang Chang 
225*e7b1675dSTing-Kang Chang   ASSERT_THAT(MacConfig::Register(), IsOk());
226*e7b1675dSTing-Kang Chang 
227*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Key>> parsed_key2 =
228*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance().ParseKey(
229*e7b1675dSTing-Kang Chang           *proto_key_serialization, InsecureSecretKeyAccess::Get());
230*e7b1675dSTing-Kang Chang   ASSERT_THAT(parsed_key2, IsOk());
231*e7b1675dSTing-Kang Chang 
232*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialized_key2 =
233*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance()
234*e7b1675dSTing-Kang Chang           .SerializeKey<internal::ProtoKeySerialization>(
235*e7b1675dSTing-Kang Chang               *key, InsecureSecretKeyAccess::Get());
236*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialized_key2, IsOk());
237*e7b1675dSTing-Kang Chang }
238*e7b1675dSTing-Kang Chang 
TEST_F(MacConfigTest,HmacProtoParamsSerializationRegistered)239*e7b1675dSTing-Kang Chang TEST_F(MacConfigTest, HmacProtoParamsSerializationRegistered) {
240*e7b1675dSTing-Kang Chang   if (internal::IsFipsModeEnabled()) {
241*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Not supported in FIPS-only mode";
242*e7b1675dSTing-Kang Chang   }
243*e7b1675dSTing-Kang Chang 
244*e7b1675dSTing-Kang Chang   util::StatusOr<internal::ProtoParametersSerialization>
245*e7b1675dSTing-Kang Chang       proto_params_serialization =
246*e7b1675dSTing-Kang Chang           internal::ProtoParametersSerialization::Create(
247*e7b1675dSTing-Kang Chang               MacKeyTemplates::HmacSha256());
248*e7b1675dSTing-Kang Chang   ASSERT_THAT(proto_params_serialization, IsOk());
249*e7b1675dSTing-Kang Chang 
250*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Parameters>> parsed_params =
251*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance().ParseParameters(
252*e7b1675dSTing-Kang Chang           *proto_params_serialization);
253*e7b1675dSTing-Kang Chang   ASSERT_THAT(parsed_params.status(), StatusIs(absl::StatusCode::kNotFound));
254*e7b1675dSTing-Kang Chang 
255*e7b1675dSTing-Kang Chang   util::StatusOr<HmacParameters> parameters = HmacParameters::Create(
256*e7b1675dSTing-Kang Chang       /*key_size_in_bytes=*/32, /*cryptographic_tag_size_in_bytes=*/32,
257*e7b1675dSTing-Kang Chang       HmacParameters::HashType::kSha256, HmacParameters::Variant::kTink);
258*e7b1675dSTing-Kang Chang   ASSERT_THAT(parameters, IsOk());
259*e7b1675dSTing-Kang Chang 
260*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialized_parameters =
261*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance()
262*e7b1675dSTing-Kang Chang           .SerializeParameters<internal::ProtoParametersSerialization>(
263*e7b1675dSTing-Kang Chang               *parameters);
264*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialized_parameters.status(),
265*e7b1675dSTing-Kang Chang               StatusIs(absl::StatusCode::kNotFound));
266*e7b1675dSTing-Kang Chang 
267*e7b1675dSTing-Kang Chang   // Register parser and serializer.
268*e7b1675dSTing-Kang Chang   ASSERT_THAT(MacConfig::Register(), IsOk());
269*e7b1675dSTing-Kang Chang 
270*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Parameters>> parsed_params2 =
271*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance().ParseParameters(
272*e7b1675dSTing-Kang Chang           *proto_params_serialization);
273*e7b1675dSTing-Kang Chang   ASSERT_THAT(parsed_params2, IsOk());
274*e7b1675dSTing-Kang Chang 
275*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialized_params2 =
276*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance()
277*e7b1675dSTing-Kang Chang           .SerializeParameters<internal::ProtoParametersSerialization>(
278*e7b1675dSTing-Kang Chang               *parameters);
279*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialized_params2, IsOk());
280*e7b1675dSTing-Kang Chang }
281*e7b1675dSTing-Kang Chang 
TEST_F(MacConfigTest,HmacProtoKeySerializationRegistered)282*e7b1675dSTing-Kang Chang TEST_F(MacConfigTest, HmacProtoKeySerializationRegistered) {
283*e7b1675dSTing-Kang Chang   if (internal::IsFipsModeEnabled()) {
284*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Not supported in FIPS-only mode";
285*e7b1675dSTing-Kang Chang   }
286*e7b1675dSTing-Kang Chang 
287*e7b1675dSTing-Kang Chang   google::crypto::tink::HmacKey key_proto;
288*e7b1675dSTing-Kang Chang   key_proto.set_version(0);
289*e7b1675dSTing-Kang Chang   key_proto.set_key_value(subtle::Random::GetRandomBytes(32));
290*e7b1675dSTing-Kang Chang   key_proto.mutable_params()->set_tag_size(32);
291*e7b1675dSTing-Kang Chang   key_proto.mutable_params()->set_hash(HashType::SHA256);
292*e7b1675dSTing-Kang Chang 
293*e7b1675dSTing-Kang Chang   util::StatusOr<internal::ProtoKeySerialization> proto_key_serialization =
294*e7b1675dSTing-Kang Chang       internal::ProtoKeySerialization::Create(
295*e7b1675dSTing-Kang Chang           "type.googleapis.com/google.crypto.tink.HmacKey",
296*e7b1675dSTing-Kang Chang           RestrictedData(key_proto.SerializeAsString(),
297*e7b1675dSTing-Kang Chang                          InsecureSecretKeyAccess::Get()),
298*e7b1675dSTing-Kang Chang           KeyData::SYMMETRIC, OutputPrefixType::TINK, /*id_requirement=*/123);
299*e7b1675dSTing-Kang Chang   ASSERT_THAT(proto_key_serialization, IsOk());
300*e7b1675dSTing-Kang Chang 
301*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Key>> parsed_key =
302*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance().ParseKey(
303*e7b1675dSTing-Kang Chang           *proto_key_serialization, InsecureSecretKeyAccess::Get());
304*e7b1675dSTing-Kang Chang   ASSERT_THAT(parsed_key.status(), StatusIs(absl::StatusCode::kNotFound));
305*e7b1675dSTing-Kang Chang 
306*e7b1675dSTing-Kang Chang   util::StatusOr<HmacParameters> parameters = HmacParameters::Create(
307*e7b1675dSTing-Kang Chang       /*key_size_in_bytes=*/32, /*cryptographic_tag_size_in_bytes=*/32,
308*e7b1675dSTing-Kang Chang       HmacParameters::HashType::kSha256, HmacParameters::Variant::kTink);
309*e7b1675dSTing-Kang Chang   ASSERT_THAT(parameters, IsOk());
310*e7b1675dSTing-Kang Chang 
311*e7b1675dSTing-Kang Chang   util::StatusOr<HmacKey> key =
312*e7b1675dSTing-Kang Chang       HmacKey::Create(*parameters,
313*e7b1675dSTing-Kang Chang                       RestrictedData(subtle::Random::GetRandomBytes(32),
314*e7b1675dSTing-Kang Chang                                      InsecureSecretKeyAccess::Get()),
315*e7b1675dSTing-Kang Chang                       /*id_requirement=*/123, GetPartialKeyAccess());
316*e7b1675dSTing-Kang Chang   ASSERT_THAT(key, IsOk());
317*e7b1675dSTing-Kang Chang 
318*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialized_key =
319*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance()
320*e7b1675dSTing-Kang Chang           .SerializeKey<internal::ProtoKeySerialization>(
321*e7b1675dSTing-Kang Chang               *key, InsecureSecretKeyAccess::Get());
322*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialized_key.status(), StatusIs(absl::StatusCode::kNotFound));
323*e7b1675dSTing-Kang Chang 
324*e7b1675dSTing-Kang Chang   // Register parser and serializer.
325*e7b1675dSTing-Kang Chang   ASSERT_THAT(MacConfig::Register(), IsOk());
326*e7b1675dSTing-Kang Chang 
327*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Key>> parsed_key2 =
328*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance().ParseKey(
329*e7b1675dSTing-Kang Chang           *proto_key_serialization, InsecureSecretKeyAccess::Get());
330*e7b1675dSTing-Kang Chang   ASSERT_THAT(parsed_key2, IsOk());
331*e7b1675dSTing-Kang Chang 
332*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialized_key2 =
333*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance()
334*e7b1675dSTing-Kang Chang           .SerializeKey<internal::ProtoKeySerialization>(
335*e7b1675dSTing-Kang Chang               *key, InsecureSecretKeyAccess::Get());
336*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialized_key2, IsOk());
337*e7b1675dSTing-Kang Chang }
338*e7b1675dSTing-Kang Chang 
339*e7b1675dSTing-Kang Chang class ChunkedMacConfigTest : public ::testing::TestWithParam<KeyTemplate> {
340*e7b1675dSTing-Kang Chang  protected:
SetUp()341*e7b1675dSTing-Kang Chang   void SetUp() override { Registry::Reset(); }
342*e7b1675dSTing-Kang Chang };
343*e7b1675dSTing-Kang Chang 
344*e7b1675dSTing-Kang Chang INSTANTIATE_TEST_SUITE_P(ChunkedMacConfigTestSuite, ChunkedMacConfigTest,
345*e7b1675dSTing-Kang Chang                          Values(MacKeyTemplates::AesCmac(),
346*e7b1675dSTing-Kang Chang                                 MacKeyTemplates::HmacSha256()));
347*e7b1675dSTing-Kang Chang 
348*e7b1675dSTing-Kang Chang // Tests that the ChunkedMacWrapper has been properly registered and we can get
349*e7b1675dSTing-Kang Chang // primitives.
TEST_P(ChunkedMacConfigTest,ChunkedMacWrappersRegistered)350*e7b1675dSTing-Kang Chang TEST_P(ChunkedMacConfigTest, ChunkedMacWrappersRegistered) {
351*e7b1675dSTing-Kang Chang   if (internal::IsFipsModeEnabled()) {
352*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Not supported in FIPS-only mode";
353*e7b1675dSTing-Kang Chang   }
354*e7b1675dSTing-Kang Chang 
355*e7b1675dSTing-Kang Chang   ASSERT_THAT(MacConfig::Register(), IsOk());
356*e7b1675dSTing-Kang Chang 
357*e7b1675dSTing-Kang Chang   KeyTemplate key_template = GetParam();
358*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<KeysetHandle>> key =
359*e7b1675dSTing-Kang Chang       KeysetHandle::GenerateNew(key_template);
360*e7b1675dSTing-Kang Chang   ASSERT_THAT(key, IsOk());
361*e7b1675dSTing-Kang Chang 
362*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<ChunkedMac>> chunked_mac =
363*e7b1675dSTing-Kang Chang       (*key)->GetPrimitive<ChunkedMac>();
364*e7b1675dSTing-Kang Chang   ASSERT_THAT(chunked_mac, IsOk());
365*e7b1675dSTing-Kang Chang 
366*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<ChunkedMacComputation>> computation =
367*e7b1675dSTing-Kang Chang       (*chunked_mac)->CreateComputation();
368*e7b1675dSTing-Kang Chang   ASSERT_THAT(computation, IsOk());
369*e7b1675dSTing-Kang Chang   ASSERT_THAT((*computation)->Update("verified text"), IsOk());
370*e7b1675dSTing-Kang Chang   util::StatusOr<std::string> tag = (*computation)->ComputeMac();
371*e7b1675dSTing-Kang Chang   ASSERT_THAT(tag, IsOk());
372*e7b1675dSTing-Kang Chang 
373*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<ChunkedMacVerification>> verification =
374*e7b1675dSTing-Kang Chang       (*chunked_mac)->CreateVerification(*tag);
375*e7b1675dSTing-Kang Chang   ASSERT_THAT(verification, IsOk());
376*e7b1675dSTing-Kang Chang   ASSERT_THAT((*verification)->Update("verified text"), IsOk());
377*e7b1675dSTing-Kang Chang 
378*e7b1675dSTing-Kang Chang   EXPECT_THAT((*verification)->VerifyMac(), IsOk());
379*e7b1675dSTing-Kang Chang }
380*e7b1675dSTing-Kang Chang 
381*e7b1675dSTing-Kang Chang // FIPS-only mode tests
TEST_F(MacConfigTest,RegisterNonFipsTemplates)382*e7b1675dSTing-Kang Chang TEST_F(MacConfigTest, RegisterNonFipsTemplates) {
383*e7b1675dSTing-Kang Chang   if (!internal::IsFipsModeEnabled() || !internal::IsFipsEnabledInSsl()) {
384*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Only supported in FIPS-only mode";
385*e7b1675dSTing-Kang Chang   }
386*e7b1675dSTing-Kang Chang 
387*e7b1675dSTing-Kang Chang   EXPECT_THAT(MacConfig::Register(), IsOk());
388*e7b1675dSTing-Kang Chang 
389*e7b1675dSTing-Kang Chang   std::list<google::crypto::tink::KeyTemplate> non_fips_key_templates;
390*e7b1675dSTing-Kang Chang   non_fips_key_templates.push_back(MacKeyTemplates::AesCmac());
391*e7b1675dSTing-Kang Chang 
392*e7b1675dSTing-Kang Chang   for (auto key_template : non_fips_key_templates) {
393*e7b1675dSTing-Kang Chang     EXPECT_THAT(KeysetHandle::GenerateNew(key_template).status(),
394*e7b1675dSTing-Kang Chang                 StatusIs(absl::StatusCode::kNotFound));
395*e7b1675dSTing-Kang Chang   }
396*e7b1675dSTing-Kang Chang }
397*e7b1675dSTing-Kang Chang 
TEST_F(MacConfigTest,RegisterFipsValidTemplates)398*e7b1675dSTing-Kang Chang TEST_F(MacConfigTest, RegisterFipsValidTemplates) {
399*e7b1675dSTing-Kang Chang   if (!internal::IsFipsModeEnabled() || !internal::IsFipsEnabledInSsl()) {
400*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Only supported in FIPS-only mode";
401*e7b1675dSTing-Kang Chang   }
402*e7b1675dSTing-Kang Chang 
403*e7b1675dSTing-Kang Chang   EXPECT_THAT(MacConfig::Register(), IsOk());
404*e7b1675dSTing-Kang Chang 
405*e7b1675dSTing-Kang Chang   std::list<google::crypto::tink::KeyTemplate> fips_key_templates;
406*e7b1675dSTing-Kang Chang   fips_key_templates.push_back(MacKeyTemplates::HmacSha256());
407*e7b1675dSTing-Kang Chang   fips_key_templates.push_back(MacKeyTemplates::HmacSha256HalfSizeTag());
408*e7b1675dSTing-Kang Chang   fips_key_templates.push_back(MacKeyTemplates::HmacSha512());
409*e7b1675dSTing-Kang Chang   fips_key_templates.push_back(MacKeyTemplates::HmacSha512HalfSizeTag());
410*e7b1675dSTing-Kang Chang 
411*e7b1675dSTing-Kang Chang   for (auto key_template : fips_key_templates) {
412*e7b1675dSTing-Kang Chang     EXPECT_THAT(KeysetHandle::GenerateNew(key_template), IsOk());
413*e7b1675dSTing-Kang Chang   }
414*e7b1675dSTing-Kang Chang }
415*e7b1675dSTing-Kang Chang 
416*e7b1675dSTing-Kang Chang }  // namespace
417*e7b1675dSTing-Kang Chang }  // namespace tink
418*e7b1675dSTing-Kang Chang }  // namespace crypto
419