xref: /aosp_15_r20/external/tink/testing/cc/hybrid_impl_test.cc (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1*e7b1675dSTing-Kang Chang // Copyright 2020 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 "hybrid_impl.h"
18*e7b1675dSTing-Kang Chang 
19*e7b1675dSTing-Kang Chang #include <memory>
20*e7b1675dSTing-Kang Chang #include <ostream>
21*e7b1675dSTing-Kang Chang #include <sstream>
22*e7b1675dSTing-Kang Chang #include <string>
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 "tink/binary_keyset_writer.h"
27*e7b1675dSTing-Kang Chang #include "tink/cleartext_keyset_handle.h"
28*e7b1675dSTing-Kang Chang #include "tink/hybrid/hybrid_config.h"
29*e7b1675dSTing-Kang Chang #include "tink/hybrid/hybrid_key_templates.h"
30*e7b1675dSTing-Kang Chang #include "proto/testing_api.grpc.pb.h"
31*e7b1675dSTing-Kang Chang 
32*e7b1675dSTing-Kang Chang namespace crypto {
33*e7b1675dSTing-Kang Chang namespace tink {
34*e7b1675dSTing-Kang Chang namespace {
35*e7b1675dSTing-Kang Chang 
36*e7b1675dSTing-Kang Chang using ::crypto::tink::BinaryKeysetWriter;
37*e7b1675dSTing-Kang Chang using ::crypto::tink::CleartextKeysetHandle;
38*e7b1675dSTing-Kang Chang using ::crypto::tink::HybridKeyTemplates;
39*e7b1675dSTing-Kang Chang 
40*e7b1675dSTing-Kang Chang using ::testing::Eq;
41*e7b1675dSTing-Kang Chang using ::testing::IsEmpty;
42*e7b1675dSTing-Kang Chang using ::tink_testing_api::CreationRequest;
43*e7b1675dSTing-Kang Chang using ::tink_testing_api::CreationResponse;
44*e7b1675dSTing-Kang Chang using ::tink_testing_api::HybridDecryptRequest;
45*e7b1675dSTing-Kang Chang using ::tink_testing_api::HybridDecryptResponse;
46*e7b1675dSTing-Kang Chang using ::tink_testing_api::HybridEncryptRequest;
47*e7b1675dSTing-Kang Chang using ::tink_testing_api::HybridEncryptResponse;
48*e7b1675dSTing-Kang Chang 
49*e7b1675dSTing-Kang Chang using crypto::tink::KeysetHandle;
50*e7b1675dSTing-Kang Chang using google::crypto::tink::KeyTemplate;
51*e7b1675dSTing-Kang Chang 
KeysetBytes(const KeysetHandle & keyset_handle)52*e7b1675dSTing-Kang Chang std::string KeysetBytes(const KeysetHandle& keyset_handle) {
53*e7b1675dSTing-Kang Chang   std::stringbuf keyset;
54*e7b1675dSTing-Kang Chang   auto writer_result =
55*e7b1675dSTing-Kang Chang       BinaryKeysetWriter::New(absl::make_unique<std::ostream>(&keyset));
56*e7b1675dSTing-Kang Chang   EXPECT_TRUE(writer_result.ok());
57*e7b1675dSTing-Kang Chang   auto status =
58*e7b1675dSTing-Kang Chang       CleartextKeysetHandle::Write(writer_result.value().get(), keyset_handle);
59*e7b1675dSTing-Kang Chang   EXPECT_TRUE(status.ok());
60*e7b1675dSTing-Kang Chang   return keyset.str();
61*e7b1675dSTing-Kang Chang }
62*e7b1675dSTing-Kang Chang 
63*e7b1675dSTing-Kang Chang class HybridImplTest : public ::testing::Test {
64*e7b1675dSTing-Kang Chang  protected:
SetUpTestSuite()65*e7b1675dSTing-Kang Chang   static void SetUpTestSuite() { ASSERT_TRUE(HybridConfig::Register().ok()); }
66*e7b1675dSTing-Kang Chang };
67*e7b1675dSTing-Kang Chang 
TEST_F(HybridImplTest,CreateHybridDecryptSuccess)68*e7b1675dSTing-Kang Chang TEST_F(HybridImplTest, CreateHybridDecryptSuccess) {
69*e7b1675dSTing-Kang Chang   tink_testing_api::HybridImpl hybrid;
70*e7b1675dSTing-Kang Chang   const KeyTemplate& key_template =
71*e7b1675dSTing-Kang Chang       HybridKeyTemplates::EciesP256HkdfHmacSha256Aes128Gcm();
72*e7b1675dSTing-Kang Chang   ::crypto::tink::util::StatusOr<std::unique_ptr<KeysetHandle>>
73*e7b1675dSTing-Kang Chang       private_keyset_handle = KeysetHandle::GenerateNew(key_template);
74*e7b1675dSTing-Kang Chang   ASSERT_TRUE(private_keyset_handle.status().ok())
75*e7b1675dSTing-Kang Chang       << private_keyset_handle.status();
76*e7b1675dSTing-Kang Chang 
77*e7b1675dSTing-Kang Chang   CreationRequest request;
78*e7b1675dSTing-Kang Chang   request.mutable_annotated_keyset()->set_serialized_keyset(
79*e7b1675dSTing-Kang Chang       KeysetBytes(**private_keyset_handle));
80*e7b1675dSTing-Kang Chang   CreationResponse response;
81*e7b1675dSTing-Kang Chang 
82*e7b1675dSTing-Kang Chang   EXPECT_TRUE(hybrid.CreateHybridDecrypt(nullptr, &request, &response).ok());
83*e7b1675dSTing-Kang Chang   EXPECT_THAT(response.err(), IsEmpty());
84*e7b1675dSTing-Kang Chang }
85*e7b1675dSTing-Kang Chang 
TEST_F(HybridImplTest,CreateHybridDecryptFailure)86*e7b1675dSTing-Kang Chang TEST_F(HybridImplTest, CreateHybridDecryptFailure) {
87*e7b1675dSTing-Kang Chang   tink_testing_api::HybridImpl hybrid;
88*e7b1675dSTing-Kang Chang 
89*e7b1675dSTing-Kang Chang   CreationRequest request;
90*e7b1675dSTing-Kang Chang   request.mutable_annotated_keyset()->set_serialized_keyset("\x80");
91*e7b1675dSTing-Kang Chang   CreationResponse response;
92*e7b1675dSTing-Kang Chang 
93*e7b1675dSTing-Kang Chang   EXPECT_TRUE(hybrid.CreateHybridDecrypt(nullptr, &request, &response).ok());
94*e7b1675dSTing-Kang Chang   EXPECT_THAT(response.err(), Not(IsEmpty()));
95*e7b1675dSTing-Kang Chang }
96*e7b1675dSTing-Kang Chang 
TEST_F(HybridImplTest,CreateHybridEncryptSuccess)97*e7b1675dSTing-Kang Chang TEST_F(HybridImplTest, CreateHybridEncryptSuccess) {
98*e7b1675dSTing-Kang Chang   tink_testing_api::HybridImpl hybrid;
99*e7b1675dSTing-Kang Chang   const KeyTemplate& key_template =
100*e7b1675dSTing-Kang Chang       HybridKeyTemplates::EciesP256HkdfHmacSha256Aes128Gcm();
101*e7b1675dSTing-Kang Chang   ::crypto::tink::util::StatusOr<std::unique_ptr<KeysetHandle>>
102*e7b1675dSTing-Kang Chang       private_keyset_handle = KeysetHandle::GenerateNew(key_template);
103*e7b1675dSTing-Kang Chang   ASSERT_TRUE(private_keyset_handle.status().ok())
104*e7b1675dSTing-Kang Chang       << private_keyset_handle.status();
105*e7b1675dSTing-Kang Chang   ::crypto::tink::util::StatusOr<std::unique_ptr<KeysetHandle>>
106*e7b1675dSTing-Kang Chang       public_keyset_handle = (*private_keyset_handle)->GetPublicKeysetHandle();
107*e7b1675dSTing-Kang Chang   ASSERT_TRUE(public_keyset_handle.status().ok())
108*e7b1675dSTing-Kang Chang       << public_keyset_handle.status();
109*e7b1675dSTing-Kang Chang 
110*e7b1675dSTing-Kang Chang   CreationRequest request;
111*e7b1675dSTing-Kang Chang   request.mutable_annotated_keyset()->set_serialized_keyset(
112*e7b1675dSTing-Kang Chang       KeysetBytes(**public_keyset_handle));
113*e7b1675dSTing-Kang Chang   CreationResponse response;
114*e7b1675dSTing-Kang Chang 
115*e7b1675dSTing-Kang Chang   EXPECT_TRUE(hybrid.CreateHybridEncrypt(nullptr, &request, &response).ok());
116*e7b1675dSTing-Kang Chang   EXPECT_THAT(response.err(), IsEmpty());
117*e7b1675dSTing-Kang Chang }
118*e7b1675dSTing-Kang Chang 
TEST_F(HybridImplTest,CreateHybridEncryptFailure)119*e7b1675dSTing-Kang Chang TEST_F(HybridImplTest, CreateHybridEncryptFailure) {
120*e7b1675dSTing-Kang Chang   tink_testing_api::HybridImpl hybrid;
121*e7b1675dSTing-Kang Chang 
122*e7b1675dSTing-Kang Chang   CreationRequest request;
123*e7b1675dSTing-Kang Chang   request.mutable_annotated_keyset()->set_serialized_keyset("\x80");
124*e7b1675dSTing-Kang Chang   CreationResponse response;
125*e7b1675dSTing-Kang Chang 
126*e7b1675dSTing-Kang Chang   EXPECT_TRUE(hybrid.CreateHybridEncrypt(nullptr, &request, &response).ok());
127*e7b1675dSTing-Kang Chang   EXPECT_THAT(response.err(), Not(IsEmpty()));
128*e7b1675dSTing-Kang Chang }
129*e7b1675dSTing-Kang Chang 
TEST_F(HybridImplTest,EncryptDecryptSuccess)130*e7b1675dSTing-Kang Chang TEST_F(HybridImplTest, EncryptDecryptSuccess) {
131*e7b1675dSTing-Kang Chang   tink_testing_api::HybridImpl hybrid;
132*e7b1675dSTing-Kang Chang   const KeyTemplate& key_template =
133*e7b1675dSTing-Kang Chang       HybridKeyTemplates::EciesP256HkdfHmacSha256Aes128Gcm();
134*e7b1675dSTing-Kang Chang   auto private_handle_result = KeysetHandle::GenerateNew(key_template);
135*e7b1675dSTing-Kang Chang   EXPECT_TRUE(private_handle_result.ok());
136*e7b1675dSTing-Kang Chang   auto public_handle_result =
137*e7b1675dSTing-Kang Chang       private_handle_result.value()->GetPublicKeysetHandle();
138*e7b1675dSTing-Kang Chang   EXPECT_TRUE(public_handle_result.ok());
139*e7b1675dSTing-Kang Chang 
140*e7b1675dSTing-Kang Chang   HybridEncryptRequest enc_request;
141*e7b1675dSTing-Kang Chang   enc_request.mutable_public_annotated_keyset()->set_serialized_keyset(
142*e7b1675dSTing-Kang Chang       KeysetBytes(*public_handle_result.value()));
143*e7b1675dSTing-Kang Chang   enc_request.set_plaintext("Plain text");
144*e7b1675dSTing-Kang Chang   enc_request.set_context_info("context");
145*e7b1675dSTing-Kang Chang   HybridEncryptResponse enc_response;
146*e7b1675dSTing-Kang Chang 
147*e7b1675dSTing-Kang Chang   EXPECT_TRUE(hybrid.Encrypt(nullptr, &enc_request, &enc_response).ok());
148*e7b1675dSTing-Kang Chang   EXPECT_THAT(enc_response.err(), IsEmpty());
149*e7b1675dSTing-Kang Chang 
150*e7b1675dSTing-Kang Chang   HybridDecryptRequest dec_request;
151*e7b1675dSTing-Kang Chang   dec_request.mutable_private_annotated_keyset()->set_serialized_keyset(
152*e7b1675dSTing-Kang Chang       KeysetBytes(*private_handle_result.value()));
153*e7b1675dSTing-Kang Chang   dec_request.set_ciphertext(enc_response.ciphertext());
154*e7b1675dSTing-Kang Chang   dec_request.set_context_info("context");
155*e7b1675dSTing-Kang Chang   HybridDecryptResponse dec_response;
156*e7b1675dSTing-Kang Chang 
157*e7b1675dSTing-Kang Chang   EXPECT_TRUE(hybrid.Decrypt(nullptr, &dec_request, &dec_response).ok());
158*e7b1675dSTing-Kang Chang   EXPECT_THAT(dec_response.err(), IsEmpty());
159*e7b1675dSTing-Kang Chang   EXPECT_THAT(dec_response.plaintext(), Eq("Plain text"));
160*e7b1675dSTing-Kang Chang }
161*e7b1675dSTing-Kang Chang 
TEST_F(HybridImplTest,EncryptBadKeysetFail)162*e7b1675dSTing-Kang Chang TEST_F(HybridImplTest, EncryptBadKeysetFail) {
163*e7b1675dSTing-Kang Chang   tink_testing_api::HybridImpl hybrid;
164*e7b1675dSTing-Kang Chang   HybridEncryptRequest enc_request;
165*e7b1675dSTing-Kang Chang   enc_request.mutable_public_annotated_keyset()->set_serialized_keyset(
166*e7b1675dSTing-Kang Chang       "bad keyset");
167*e7b1675dSTing-Kang Chang   enc_request.set_plaintext("Plain text");
168*e7b1675dSTing-Kang Chang   enc_request.set_context_info("context");
169*e7b1675dSTing-Kang Chang   HybridEncryptResponse enc_response;
170*e7b1675dSTing-Kang Chang 
171*e7b1675dSTing-Kang Chang   EXPECT_TRUE(hybrid.Encrypt(nullptr, &enc_request, &enc_response).ok());
172*e7b1675dSTing-Kang Chang   EXPECT_THAT(enc_response.err(), Not(IsEmpty()));
173*e7b1675dSTing-Kang Chang }
174*e7b1675dSTing-Kang Chang 
TEST_F(HybridImplTest,DecryptBadCiphertextFail)175*e7b1675dSTing-Kang Chang TEST_F(HybridImplTest, DecryptBadCiphertextFail) {
176*e7b1675dSTing-Kang Chang   tink_testing_api::HybridImpl hybrid;
177*e7b1675dSTing-Kang Chang   const KeyTemplate& key_template =
178*e7b1675dSTing-Kang Chang       HybridKeyTemplates::EciesP256HkdfHmacSha256Aes128Gcm();
179*e7b1675dSTing-Kang Chang   auto private_handle_result = KeysetHandle::GenerateNew(key_template);
180*e7b1675dSTing-Kang Chang   EXPECT_TRUE(private_handle_result.ok());
181*e7b1675dSTing-Kang Chang 
182*e7b1675dSTing-Kang Chang   HybridDecryptRequest dec_request;
183*e7b1675dSTing-Kang Chang   dec_request.mutable_private_annotated_keyset()->set_serialized_keyset(
184*e7b1675dSTing-Kang Chang       KeysetBytes(*private_handle_result.value()));
185*e7b1675dSTing-Kang Chang   dec_request.set_ciphertext("bad ciphertext");
186*e7b1675dSTing-Kang Chang   dec_request.set_context_info("context");
187*e7b1675dSTing-Kang Chang   HybridDecryptResponse dec_response;
188*e7b1675dSTing-Kang Chang 
189*e7b1675dSTing-Kang Chang   EXPECT_TRUE(hybrid.Decrypt(nullptr, &dec_request, &dec_response).ok());
190*e7b1675dSTing-Kang Chang   EXPECT_THAT(dec_response.err(), Not(IsEmpty()));
191*e7b1675dSTing-Kang Chang }
192*e7b1675dSTing-Kang Chang 
193*e7b1675dSTing-Kang Chang }  // namespace
194*e7b1675dSTing-Kang Chang }  // namespace tink
195*e7b1675dSTing-Kang Chang }  // namespace crypto
196