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