xref: /aosp_15_r20/external/tink/cc/signature/signature_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/signature/signature_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 "gmock/gmock.h"
25*e7b1675dSTing-Kang Chang #include "gtest/gtest.h"
26*e7b1675dSTing-Kang Chang #include "absl/memory/memory.h"
27*e7b1675dSTing-Kang Chang #include "absl/status/status.h"
28*e7b1675dSTing-Kang Chang #include "openssl/crypto.h"
29*e7b1675dSTing-Kang Chang #include "tink/insecure_secret_key_access.h"
30*e7b1675dSTing-Kang Chang #include "tink/internal/ec_util.h"
31*e7b1675dSTing-Kang Chang #include "tink/internal/fips_utils.h"
32*e7b1675dSTing-Kang Chang #include "tink/internal/mutable_serialization_registry.h"
33*e7b1675dSTing-Kang Chang #include "tink/internal/proto_key_serialization.h"
34*e7b1675dSTing-Kang Chang #include "tink/internal/proto_parameters_serialization.h"
35*e7b1675dSTing-Kang Chang #include "tink/internal/serialization.h"
36*e7b1675dSTing-Kang Chang #include "tink/key.h"
37*e7b1675dSTing-Kang Chang #include "tink/keyset_handle.h"
38*e7b1675dSTing-Kang Chang #include "tink/parameters.h"
39*e7b1675dSTing-Kang Chang #include "tink/partial_key_access.h"
40*e7b1675dSTing-Kang Chang #include "tink/public_key_sign.h"
41*e7b1675dSTing-Kang Chang #include "tink/public_key_verify.h"
42*e7b1675dSTing-Kang Chang #include "tink/registry.h"
43*e7b1675dSTing-Kang Chang #include "tink/restricted_data.h"
44*e7b1675dSTing-Kang Chang #include "tink/signature/ed25519_parameters.h"
45*e7b1675dSTing-Kang Chang #include "tink/signature/ed25519_private_key.h"
46*e7b1675dSTing-Kang Chang #include "tink/signature/ed25519_public_key.h"
47*e7b1675dSTing-Kang Chang #include "tink/signature/rsa_ssa_pss_sign_key_manager.h"
48*e7b1675dSTing-Kang Chang #include "tink/signature/rsa_ssa_pss_verify_key_manager.h"
49*e7b1675dSTing-Kang Chang #include "tink/signature/signature_key_templates.h"
50*e7b1675dSTing-Kang Chang #include "tink/subtle/random.h"
51*e7b1675dSTing-Kang Chang #include "tink/util/status.h"
52*e7b1675dSTing-Kang Chang #include "tink/util/statusor.h"
53*e7b1675dSTing-Kang Chang #include "tink/util/test_matchers.h"
54*e7b1675dSTing-Kang Chang #include "tink/util/test_util.h"
55*e7b1675dSTing-Kang Chang #include "proto/ed25519.pb.h"
56*e7b1675dSTing-Kang Chang #include "proto/tink.pb.h"
57*e7b1675dSTing-Kang Chang 
58*e7b1675dSTing-Kang Chang namespace crypto {
59*e7b1675dSTing-Kang Chang namespace tink {
60*e7b1675dSTing-Kang Chang namespace {
61*e7b1675dSTing-Kang Chang 
62*e7b1675dSTing-Kang Chang using ::crypto::tink::test::DummyPublicKeySign;
63*e7b1675dSTing-Kang Chang using ::crypto::tink::test::DummyPublicKeyVerify;
64*e7b1675dSTing-Kang Chang using ::crypto::tink::test::IsOk;
65*e7b1675dSTing-Kang Chang using ::crypto::tink::test::StatusIs;
66*e7b1675dSTing-Kang Chang using ::google::crypto::tink::KeyData;
67*e7b1675dSTing-Kang Chang using ::google::crypto::tink::OutputPrefixType;
68*e7b1675dSTing-Kang Chang using ::testing::Not;
69*e7b1675dSTing-Kang Chang 
70*e7b1675dSTing-Kang Chang class SignatureConfigTest : public ::testing::Test {
71*e7b1675dSTing-Kang Chang  protected:
SetUp()72*e7b1675dSTing-Kang Chang   void SetUp() override {
73*e7b1675dSTing-Kang Chang     Registry::Reset();
74*e7b1675dSTing-Kang Chang     internal::MutableSerializationRegistry::GlobalInstance().Reset();
75*e7b1675dSTing-Kang Chang   }
76*e7b1675dSTing-Kang Chang };
77*e7b1675dSTing-Kang Chang 
TEST_F(SignatureConfigTest,testBasic)78*e7b1675dSTing-Kang Chang TEST_F(SignatureConfigTest, testBasic) {
79*e7b1675dSTing-Kang Chang   if (internal::IsFipsModeEnabled() && !internal::IsFipsEnabledInSsl()) {
80*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Not supported if FIPS-mode is used and BoringCrypto is "
81*e7b1675dSTing-Kang Chang                     "not available";
82*e7b1675dSTing-Kang Chang   }
83*e7b1675dSTing-Kang Chang 
84*e7b1675dSTing-Kang Chang   EXPECT_THAT(Registry::get_key_manager<PublicKeySign>(
85*e7b1675dSTing-Kang Chang                   RsaSsaPssSignKeyManager().get_key_type())
86*e7b1675dSTing-Kang Chang                   .status(),
87*e7b1675dSTing-Kang Chang               StatusIs(absl::StatusCode::kNotFound));
88*e7b1675dSTing-Kang Chang   EXPECT_THAT(Registry::get_key_manager<PublicKeyVerify>(
89*e7b1675dSTing-Kang Chang                   RsaSsaPssVerifyKeyManager().get_key_type())
90*e7b1675dSTing-Kang Chang                   .status(),
91*e7b1675dSTing-Kang Chang               StatusIs(absl::StatusCode::kNotFound));
92*e7b1675dSTing-Kang Chang   EXPECT_THAT(SignatureConfig::Register(), IsOk());
93*e7b1675dSTing-Kang Chang   EXPECT_THAT(Registry::get_key_manager<PublicKeySign>(
94*e7b1675dSTing-Kang Chang                   RsaSsaPssSignKeyManager().get_key_type())
95*e7b1675dSTing-Kang Chang                   .status(),
96*e7b1675dSTing-Kang Chang               IsOk());
97*e7b1675dSTing-Kang Chang   EXPECT_THAT(Registry::get_key_manager<PublicKeyVerify>(
98*e7b1675dSTing-Kang Chang                   RsaSsaPssVerifyKeyManager().get_key_type())
99*e7b1675dSTing-Kang Chang                   .status(),
100*e7b1675dSTing-Kang Chang               IsOk());
101*e7b1675dSTing-Kang Chang }
102*e7b1675dSTing-Kang Chang 
103*e7b1675dSTing-Kang Chang // Tests that the PublicKeySignWrapper has been properly registered and we
104*e7b1675dSTing-Kang Chang // can wrap primitives.
TEST_F(SignatureConfigTest,PublicKeySignWrapperRegistered)105*e7b1675dSTing-Kang Chang TEST_F(SignatureConfigTest, PublicKeySignWrapperRegistered) {
106*e7b1675dSTing-Kang Chang   if (internal::IsFipsModeEnabled() && !internal::IsFipsEnabledInSsl()) {
107*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Not supported if FIPS-mode is used and BoringCrypto is "
108*e7b1675dSTing-Kang Chang                     "not available";
109*e7b1675dSTing-Kang Chang   }
110*e7b1675dSTing-Kang Chang 
111*e7b1675dSTing-Kang Chang   ASSERT_TRUE(SignatureConfig::Register().ok());
112*e7b1675dSTing-Kang Chang 
113*e7b1675dSTing-Kang Chang   google::crypto::tink::KeysetInfo::KeyInfo key_info;
114*e7b1675dSTing-Kang Chang   key_info.set_status(google::crypto::tink::KeyStatusType::ENABLED);
115*e7b1675dSTing-Kang Chang   key_info.set_key_id(1234);
116*e7b1675dSTing-Kang Chang   key_info.set_output_prefix_type(google::crypto::tink::OutputPrefixType::TINK);
117*e7b1675dSTing-Kang Chang   auto primitive_set = absl::make_unique<PrimitiveSet<PublicKeySign>>();
118*e7b1675dSTing-Kang Chang   ASSERT_THAT(
119*e7b1675dSTing-Kang Chang       primitive_set->set_primary(
120*e7b1675dSTing-Kang Chang           primitive_set
121*e7b1675dSTing-Kang Chang               ->AddPrimitive(absl::make_unique<DummyPublicKeySign>("dummy"),
122*e7b1675dSTing-Kang Chang                              key_info)
123*e7b1675dSTing-Kang Chang               .value()),
124*e7b1675dSTing-Kang Chang       IsOk());
125*e7b1675dSTing-Kang Chang 
126*e7b1675dSTing-Kang Chang   auto wrapped = Registry::Wrap(std::move(primitive_set));
127*e7b1675dSTing-Kang Chang 
128*e7b1675dSTing-Kang Chang   ASSERT_TRUE(wrapped.ok()) << wrapped.status();
129*e7b1675dSTing-Kang Chang   auto signature_result = wrapped.value()->Sign("message");
130*e7b1675dSTing-Kang Chang   ASSERT_TRUE(signature_result.ok());
131*e7b1675dSTing-Kang Chang 
132*e7b1675dSTing-Kang Chang   std::string prefix = CryptoFormat::GetOutputPrefix(key_info).value();
133*e7b1675dSTing-Kang Chang   EXPECT_EQ(signature_result.value(),
134*e7b1675dSTing-Kang Chang             absl::StrCat(prefix,
135*e7b1675dSTing-Kang Chang                          DummyPublicKeySign("dummy").Sign("message").value()));
136*e7b1675dSTing-Kang Chang }
137*e7b1675dSTing-Kang Chang 
138*e7b1675dSTing-Kang Chang 
139*e7b1675dSTing-Kang Chang // Tests that the PublicKeyVerifyWrapper has been properly registered and we
140*e7b1675dSTing-Kang Chang // can wrap primitives.
TEST_F(SignatureConfigTest,PublicKeyVerifyWrapperRegistered)141*e7b1675dSTing-Kang Chang TEST_F(SignatureConfigTest, PublicKeyVerifyWrapperRegistered) {
142*e7b1675dSTing-Kang Chang   if (internal::IsFipsModeEnabled() && !internal::IsFipsEnabledInSsl()) {
143*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Not supported if FIPS-mode is used and BoringCrypto is "
144*e7b1675dSTing-Kang Chang                     "not available";
145*e7b1675dSTing-Kang Chang   }
146*e7b1675dSTing-Kang Chang 
147*e7b1675dSTing-Kang Chang   ASSERT_TRUE(SignatureConfig::Register().ok());
148*e7b1675dSTing-Kang Chang 
149*e7b1675dSTing-Kang Chang   google::crypto::tink::KeysetInfo::KeyInfo key_info;
150*e7b1675dSTing-Kang Chang   key_info.set_status(google::crypto::tink::KeyStatusType::ENABLED);
151*e7b1675dSTing-Kang Chang   key_info.set_key_id(1234);
152*e7b1675dSTing-Kang Chang   key_info.set_output_prefix_type(google::crypto::tink::OutputPrefixType::TINK);
153*e7b1675dSTing-Kang Chang   auto primitive_set = absl::make_unique<PrimitiveSet<PublicKeyVerify>>();
154*e7b1675dSTing-Kang Chang   ASSERT_THAT(
155*e7b1675dSTing-Kang Chang       primitive_set->set_primary(
156*e7b1675dSTing-Kang Chang           primitive_set
157*e7b1675dSTing-Kang Chang               ->AddPrimitive(absl::make_unique<DummyPublicKeyVerify>("dummy"),
158*e7b1675dSTing-Kang Chang                              key_info)
159*e7b1675dSTing-Kang Chang               .value()),
160*e7b1675dSTing-Kang Chang       IsOk());
161*e7b1675dSTing-Kang Chang   std::string prefix = CryptoFormat::GetOutputPrefix(key_info).value();
162*e7b1675dSTing-Kang Chang   std::string signature = DummyPublicKeySign("dummy").Sign("message").value();
163*e7b1675dSTing-Kang Chang 
164*e7b1675dSTing-Kang Chang   auto wrapped = Registry::Wrap(std::move(primitive_set));
165*e7b1675dSTing-Kang Chang 
166*e7b1675dSTing-Kang Chang   ASSERT_TRUE(wrapped.ok()) << wrapped.status();
167*e7b1675dSTing-Kang Chang   ASSERT_TRUE(
168*e7b1675dSTing-Kang Chang       wrapped.value()->Verify(absl::StrCat(prefix, signature), "message").ok());
169*e7b1675dSTing-Kang Chang }
170*e7b1675dSTing-Kang Chang 
171*e7b1675dSTing-Kang Chang // FIPS-only mode tests
TEST_F(SignatureConfigTest,RegisterNonFipsTemplates)172*e7b1675dSTing-Kang Chang TEST_F(SignatureConfigTest, RegisterNonFipsTemplates) {
173*e7b1675dSTing-Kang Chang   if (!internal::IsFipsModeEnabled() || !internal::IsFipsEnabledInSsl()) {
174*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Only supported in FIPS-only mode with BoringCrypto.";
175*e7b1675dSTing-Kang Chang   }
176*e7b1675dSTing-Kang Chang 
177*e7b1675dSTing-Kang Chang   EXPECT_THAT(SignatureConfig::Register(), IsOk());
178*e7b1675dSTing-Kang Chang 
179*e7b1675dSTing-Kang Chang   std::list<google::crypto::tink::KeyTemplate> non_fips_key_templates;
180*e7b1675dSTing-Kang Chang   non_fips_key_templates.push_back(SignatureKeyTemplates::Ed25519());
181*e7b1675dSTing-Kang Chang   non_fips_key_templates.push_back(
182*e7b1675dSTing-Kang Chang       SignatureKeyTemplates::Ed25519WithRawOutput());
183*e7b1675dSTing-Kang Chang   // 4096-bit RSA is not validated.
184*e7b1675dSTing-Kang Chang   non_fips_key_templates.push_back(
185*e7b1675dSTing-Kang Chang       SignatureKeyTemplates::RsaSsaPkcs14096Sha512F4());
186*e7b1675dSTing-Kang Chang   non_fips_key_templates.push_back(
187*e7b1675dSTing-Kang Chang       SignatureKeyTemplates::RsaSsaPss4096Sha384Sha384F4());
188*e7b1675dSTing-Kang Chang   non_fips_key_templates.push_back(
189*e7b1675dSTing-Kang Chang       SignatureKeyTemplates::RsaSsaPss4096Sha512Sha512F4());
190*e7b1675dSTing-Kang Chang 
191*e7b1675dSTing-Kang Chang   for (auto key_template : non_fips_key_templates) {
192*e7b1675dSTing-Kang Chang     EXPECT_THAT(KeysetHandle::GenerateNew(key_template).status(),
193*e7b1675dSTing-Kang Chang                 Not(IsOk()));
194*e7b1675dSTing-Kang Chang   }
195*e7b1675dSTing-Kang Chang }
196*e7b1675dSTing-Kang Chang 
TEST_F(SignatureConfigTest,RegisterFipsValidTemplates)197*e7b1675dSTing-Kang Chang TEST_F(SignatureConfigTest, RegisterFipsValidTemplates) {
198*e7b1675dSTing-Kang Chang   if (!internal::IsFipsModeEnabled() || !internal::IsFipsEnabledInSsl()) {
199*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Only supported in FIPS-only mode with BoringCrypto.";
200*e7b1675dSTing-Kang Chang   }
201*e7b1675dSTing-Kang Chang 
202*e7b1675dSTing-Kang Chang   EXPECT_THAT(SignatureConfig::Register(), IsOk());
203*e7b1675dSTing-Kang Chang 
204*e7b1675dSTing-Kang Chang   std::list<google::crypto::tink::KeyTemplate> fips_key_templates;
205*e7b1675dSTing-Kang Chang   fips_key_templates.push_back(SignatureKeyTemplates::EcdsaP256());
206*e7b1675dSTing-Kang Chang   fips_key_templates.push_back(SignatureKeyTemplates::EcdsaP256Ieee());
207*e7b1675dSTing-Kang Chang   fips_key_templates.push_back(SignatureKeyTemplates::EcdsaP384Sha384());
208*e7b1675dSTing-Kang Chang   fips_key_templates.push_back(SignatureKeyTemplates::EcdsaP384Sha512());
209*e7b1675dSTing-Kang Chang   fips_key_templates.push_back(SignatureKeyTemplates::EcdsaP384Ieee());
210*e7b1675dSTing-Kang Chang   fips_key_templates.push_back(SignatureKeyTemplates::EcdsaP521());
211*e7b1675dSTing-Kang Chang   fips_key_templates.push_back(SignatureKeyTemplates::EcdsaP521Ieee());
212*e7b1675dSTing-Kang Chang   fips_key_templates.push_back(
213*e7b1675dSTing-Kang Chang       SignatureKeyTemplates::RsaSsaPkcs13072Sha256F4());
214*e7b1675dSTing-Kang Chang   fips_key_templates.push_back(
215*e7b1675dSTing-Kang Chang       SignatureKeyTemplates::RsaSsaPss3072Sha256Sha256F4());
216*e7b1675dSTing-Kang Chang 
217*e7b1675dSTing-Kang Chang   for (auto key_template : fips_key_templates) {
218*e7b1675dSTing-Kang Chang     EXPECT_THAT(KeysetHandle::GenerateNew(key_template), IsOk());
219*e7b1675dSTing-Kang Chang   }
220*e7b1675dSTing-Kang Chang }
221*e7b1675dSTing-Kang Chang 
TEST_F(SignatureConfigTest,Ed25519ProtoParamsSerializationRegistered)222*e7b1675dSTing-Kang Chang TEST_F(SignatureConfigTest, Ed25519ProtoParamsSerializationRegistered) {
223*e7b1675dSTing-Kang Chang   if (internal::IsFipsModeEnabled()) {
224*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Not supported in FIPS-only mode";
225*e7b1675dSTing-Kang Chang   }
226*e7b1675dSTing-Kang Chang 
227*e7b1675dSTing-Kang Chang   util::StatusOr<internal::ProtoParametersSerialization>
228*e7b1675dSTing-Kang Chang       proto_params_serialization =
229*e7b1675dSTing-Kang Chang           internal::ProtoParametersSerialization::Create(
230*e7b1675dSTing-Kang Chang               SignatureKeyTemplates::Ed25519());
231*e7b1675dSTing-Kang Chang   ASSERT_THAT(proto_params_serialization, IsOk());
232*e7b1675dSTing-Kang Chang 
233*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Parameters>> parsed_params =
234*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance().ParseParameters(
235*e7b1675dSTing-Kang Chang           *proto_params_serialization);
236*e7b1675dSTing-Kang Chang   ASSERT_THAT(parsed_params.status(), StatusIs(absl::StatusCode::kNotFound));
237*e7b1675dSTing-Kang Chang 
238*e7b1675dSTing-Kang Chang   util::StatusOr<Ed25519Parameters> params =
239*e7b1675dSTing-Kang Chang       Ed25519Parameters::Create(Ed25519Parameters::Variant::kTink);
240*e7b1675dSTing-Kang Chang   ASSERT_THAT(params, IsOk());
241*e7b1675dSTing-Kang Chang 
242*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialized_params =
243*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance()
244*e7b1675dSTing-Kang Chang           .SerializeParameters<internal::ProtoParametersSerialization>(*params);
245*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialized_params.status(),
246*e7b1675dSTing-Kang Chang               StatusIs(absl::StatusCode::kNotFound));
247*e7b1675dSTing-Kang Chang 
248*e7b1675dSTing-Kang Chang   ASSERT_THAT(SignatureConfig::Register(), IsOk());
249*e7b1675dSTing-Kang Chang 
250*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Parameters>> parsed_params2 =
251*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance().ParseParameters(
252*e7b1675dSTing-Kang Chang           *proto_params_serialization);
253*e7b1675dSTing-Kang Chang   ASSERT_THAT(parsed_params2, IsOk());
254*e7b1675dSTing-Kang Chang 
255*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialized_params2 =
256*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance()
257*e7b1675dSTing-Kang Chang           .SerializeParameters<internal::ProtoParametersSerialization>(*params);
258*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialized_params2, IsOk());
259*e7b1675dSTing-Kang Chang }
260*e7b1675dSTing-Kang Chang 
TEST_F(SignatureConfigTest,Ed25519ProtoPublicKeySerializationRegistered)261*e7b1675dSTing-Kang Chang TEST_F(SignatureConfigTest, Ed25519ProtoPublicKeySerializationRegistered) {
262*e7b1675dSTing-Kang Chang   if (internal::IsFipsModeEnabled()) {
263*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Not supported in FIPS-only mode";
264*e7b1675dSTing-Kang Chang   }
265*e7b1675dSTing-Kang Chang 
266*e7b1675dSTing-Kang Chang   const std::string raw_key = subtle::Random::GetRandomBytes(32);
267*e7b1675dSTing-Kang Chang 
268*e7b1675dSTing-Kang Chang   google::crypto::tink::Ed25519PublicKey key_proto;
269*e7b1675dSTing-Kang Chang   key_proto.set_version(0);
270*e7b1675dSTing-Kang Chang   key_proto.set_key_value(raw_key);
271*e7b1675dSTing-Kang Chang 
272*e7b1675dSTing-Kang Chang   util::StatusOr<internal::ProtoKeySerialization> proto_key_serialization =
273*e7b1675dSTing-Kang Chang       internal::ProtoKeySerialization::Create(
274*e7b1675dSTing-Kang Chang           "type.googleapis.com/google.crypto.tink.Ed25519PublicKey",
275*e7b1675dSTing-Kang Chang           RestrictedData(key_proto.SerializeAsString(),
276*e7b1675dSTing-Kang Chang                          InsecureSecretKeyAccess::Get()),
277*e7b1675dSTing-Kang Chang           KeyData::ASYMMETRIC_PUBLIC, OutputPrefixType::TINK,
278*e7b1675dSTing-Kang Chang           /*id_requirement=*/123);
279*e7b1675dSTing-Kang Chang   ASSERT_THAT(proto_key_serialization, IsOk());
280*e7b1675dSTing-Kang Chang 
281*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Key>> parsed_key =
282*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance().ParseKey(
283*e7b1675dSTing-Kang Chang           *proto_key_serialization, InsecureSecretKeyAccess::Get());
284*e7b1675dSTing-Kang Chang   ASSERT_THAT(parsed_key.status(), StatusIs(absl::StatusCode::kNotFound));
285*e7b1675dSTing-Kang Chang 
286*e7b1675dSTing-Kang Chang   util::StatusOr<Ed25519Parameters> params =
287*e7b1675dSTing-Kang Chang       Ed25519Parameters::Create(Ed25519Parameters::Variant::kTink);
288*e7b1675dSTing-Kang Chang   ASSERT_THAT(params, IsOk());
289*e7b1675dSTing-Kang Chang 
290*e7b1675dSTing-Kang Chang   util::StatusOr<Ed25519PublicKey> key =
291*e7b1675dSTing-Kang Chang       Ed25519PublicKey::Create(*params, raw_key,
292*e7b1675dSTing-Kang Chang                                /*id_requirement=*/123, GetPartialKeyAccess());
293*e7b1675dSTing-Kang Chang   ASSERT_THAT(key, IsOk());
294*e7b1675dSTing-Kang Chang 
295*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialized_key =
296*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance()
297*e7b1675dSTing-Kang Chang           .SerializeKey<internal::ProtoKeySerialization>(
298*e7b1675dSTing-Kang Chang               *key, InsecureSecretKeyAccess::Get());
299*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialized_key.status(), StatusIs(absl::StatusCode::kNotFound));
300*e7b1675dSTing-Kang Chang 
301*e7b1675dSTing-Kang Chang   ASSERT_THAT(SignatureConfig::Register(), IsOk());
302*e7b1675dSTing-Kang Chang 
303*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Key>> parsed_key2 =
304*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance().ParseKey(
305*e7b1675dSTing-Kang Chang           *proto_key_serialization, InsecureSecretKeyAccess::Get());
306*e7b1675dSTing-Kang Chang   ASSERT_THAT(parsed_key2, IsOk());
307*e7b1675dSTing-Kang Chang 
308*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialized_key2 =
309*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance()
310*e7b1675dSTing-Kang Chang           .SerializeKey<internal::ProtoKeySerialization>(
311*e7b1675dSTing-Kang Chang               *key, InsecureSecretKeyAccess::Get());
312*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialized_key2, IsOk());
313*e7b1675dSTing-Kang Chang }
314*e7b1675dSTing-Kang Chang 
TEST_F(SignatureConfigTest,Ed25519ProtoPrivateKeySerializationRegistered)315*e7b1675dSTing-Kang Chang TEST_F(SignatureConfigTest, Ed25519ProtoPrivateKeySerializationRegistered) {
316*e7b1675dSTing-Kang Chang   if (internal::IsFipsModeEnabled()) {
317*e7b1675dSTing-Kang Chang     GTEST_SKIP() << "Not supported in FIPS-only mode";
318*e7b1675dSTing-Kang Chang   }
319*e7b1675dSTing-Kang Chang 
320*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<internal::Ed25519Key>> key_pair =
321*e7b1675dSTing-Kang Chang       internal::NewEd25519Key();
322*e7b1675dSTing-Kang Chang   ASSERT_THAT(key_pair, IsOk());
323*e7b1675dSTing-Kang Chang 
324*e7b1675dSTing-Kang Chang   google::crypto::tink::Ed25519PublicKey public_key_proto;
325*e7b1675dSTing-Kang Chang   public_key_proto.set_version(0);
326*e7b1675dSTing-Kang Chang   public_key_proto.set_key_value((*key_pair)->public_key);
327*e7b1675dSTing-Kang Chang 
328*e7b1675dSTing-Kang Chang   google::crypto::tink::Ed25519PrivateKey private_key_proto;
329*e7b1675dSTing-Kang Chang   private_key_proto.set_version(0);
330*e7b1675dSTing-Kang Chang   private_key_proto.set_key_value((*key_pair)->private_key);
331*e7b1675dSTing-Kang Chang   *private_key_proto.mutable_public_key() = public_key_proto;
332*e7b1675dSTing-Kang Chang 
333*e7b1675dSTing-Kang Chang   util::StatusOr<internal::ProtoKeySerialization> proto_key_serialization =
334*e7b1675dSTing-Kang Chang       internal::ProtoKeySerialization::Create(
335*e7b1675dSTing-Kang Chang           "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey",
336*e7b1675dSTing-Kang Chang           RestrictedData(private_key_proto.SerializeAsString(),
337*e7b1675dSTing-Kang Chang                          InsecureSecretKeyAccess::Get()),
338*e7b1675dSTing-Kang Chang           KeyData::ASYMMETRIC_PRIVATE, OutputPrefixType::TINK,
339*e7b1675dSTing-Kang Chang           /*id_requirement=*/123);
340*e7b1675dSTing-Kang Chang   ASSERT_THAT(proto_key_serialization, IsOk());
341*e7b1675dSTing-Kang Chang 
342*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Key>> parsed_key =
343*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance().ParseKey(
344*e7b1675dSTing-Kang Chang           *proto_key_serialization, InsecureSecretKeyAccess::Get());
345*e7b1675dSTing-Kang Chang   ASSERT_THAT(parsed_key.status(), StatusIs(absl::StatusCode::kNotFound));
346*e7b1675dSTing-Kang Chang 
347*e7b1675dSTing-Kang Chang   util::StatusOr<Ed25519Parameters> params =
348*e7b1675dSTing-Kang Chang       Ed25519Parameters::Create(Ed25519Parameters::Variant::kTink);
349*e7b1675dSTing-Kang Chang   ASSERT_THAT(params, IsOk());
350*e7b1675dSTing-Kang Chang 
351*e7b1675dSTing-Kang Chang   util::StatusOr<Ed25519PublicKey> public_key =
352*e7b1675dSTing-Kang Chang       Ed25519PublicKey::Create(*params, (*key_pair)->public_key,
353*e7b1675dSTing-Kang Chang                                /*id_requirement=*/123, GetPartialKeyAccess());
354*e7b1675dSTing-Kang Chang   ASSERT_THAT(public_key, IsOk());
355*e7b1675dSTing-Kang Chang 
356*e7b1675dSTing-Kang Chang   RestrictedData private_key_bytes =
357*e7b1675dSTing-Kang Chang       RestrictedData((*key_pair)->private_key, InsecureSecretKeyAccess::Get());
358*e7b1675dSTing-Kang Chang 
359*e7b1675dSTing-Kang Chang   util::StatusOr<Ed25519PrivateKey> private_key = Ed25519PrivateKey::Create(
360*e7b1675dSTing-Kang Chang       *public_key, private_key_bytes, GetPartialKeyAccess());
361*e7b1675dSTing-Kang Chang   ASSERT_THAT(private_key, IsOk());
362*e7b1675dSTing-Kang Chang 
363*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialized_key =
364*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance()
365*e7b1675dSTing-Kang Chang           .SerializeKey<internal::ProtoKeySerialization>(
366*e7b1675dSTing-Kang Chang               *private_key, InsecureSecretKeyAccess::Get());
367*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialized_key.status(), StatusIs(absl::StatusCode::kNotFound));
368*e7b1675dSTing-Kang Chang 
369*e7b1675dSTing-Kang Chang   ASSERT_THAT(SignatureConfig::Register(), IsOk());
370*e7b1675dSTing-Kang Chang 
371*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Key>> parsed_key2 =
372*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance().ParseKey(
373*e7b1675dSTing-Kang Chang           *proto_key_serialization, InsecureSecretKeyAccess::Get());
374*e7b1675dSTing-Kang Chang   ASSERT_THAT(parsed_key2, IsOk());
375*e7b1675dSTing-Kang Chang 
376*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialized_key2 =
377*e7b1675dSTing-Kang Chang       internal::MutableSerializationRegistry::GlobalInstance()
378*e7b1675dSTing-Kang Chang           .SerializeKey<internal::ProtoKeySerialization>(
379*e7b1675dSTing-Kang Chang               *private_key, InsecureSecretKeyAccess::Get());
380*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialized_key2, IsOk());
381*e7b1675dSTing-Kang Chang }
382*e7b1675dSTing-Kang Chang 
383*e7b1675dSTing-Kang Chang }  // namespace
384*e7b1675dSTing-Kang Chang }  // namespace tink
385*e7b1675dSTing-Kang Chang }  // namespace crypto
386