xref: /aosp_15_r20/external/tink/testing/cc/keyset_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 "keyset_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 #include <utility>
24*e7b1675dSTing-Kang Chang 
25*e7b1675dSTing-Kang Chang #include "gmock/gmock.h"
26*e7b1675dSTing-Kang Chang #include "gtest/gtest.h"
27*e7b1675dSTing-Kang Chang #include "tink/aead/aead_key_templates.h"
28*e7b1675dSTing-Kang Chang #include "tink/binary_keyset_reader.h"
29*e7b1675dSTing-Kang Chang #include "tink/binary_keyset_writer.h"
30*e7b1675dSTing-Kang Chang #include "tink/cleartext_keyset_handle.h"
31*e7b1675dSTing-Kang Chang #include "tink/config/tink_config.h"
32*e7b1675dSTing-Kang Chang #include "tink/hybrid/hybrid_key_templates.h"
33*e7b1675dSTing-Kang Chang #include "tink/util/test_matchers.h"
34*e7b1675dSTing-Kang Chang #include "proto/testing_api.grpc.pb.h"
35*e7b1675dSTing-Kang Chang 
36*e7b1675dSTing-Kang Chang namespace crypto {
37*e7b1675dSTing-Kang Chang namespace tink {
38*e7b1675dSTing-Kang Chang namespace {
39*e7b1675dSTing-Kang Chang 
40*e7b1675dSTing-Kang Chang using ::crypto::tink::AeadKeyTemplates;
41*e7b1675dSTing-Kang Chang using ::crypto::tink::BinaryKeysetReader;
42*e7b1675dSTing-Kang Chang using ::crypto::tink::BinaryKeysetWriter;
43*e7b1675dSTing-Kang Chang using ::crypto::tink::CleartextKeysetHandle;
44*e7b1675dSTing-Kang Chang using ::crypto::tink::HybridKeyTemplates;
45*e7b1675dSTing-Kang Chang using ::google::crypto::tink::KeyTemplate;
46*e7b1675dSTing-Kang Chang using ::testing::Eq;
47*e7b1675dSTing-Kang Chang using ::testing::IsEmpty;
48*e7b1675dSTing-Kang Chang using ::crypto::tink::test::IsOk;
49*e7b1675dSTing-Kang Chang using ::tink_testing_api::KeysetFromJsonRequest;
50*e7b1675dSTing-Kang Chang using ::tink_testing_api::KeysetFromJsonResponse;
51*e7b1675dSTing-Kang Chang using ::tink_testing_api::KeysetGenerateRequest;
52*e7b1675dSTing-Kang Chang using ::tink_testing_api::KeysetGenerateResponse;
53*e7b1675dSTing-Kang Chang using ::tink_testing_api::KeysetPublicRequest;
54*e7b1675dSTing-Kang Chang using ::tink_testing_api::KeysetPublicResponse;
55*e7b1675dSTing-Kang Chang using ::tink_testing_api::KeysetReadEncryptedRequest;
56*e7b1675dSTing-Kang Chang using ::tink_testing_api::KeysetReadEncryptedResponse;
57*e7b1675dSTing-Kang Chang using ::tink_testing_api::KeysetToJsonRequest;
58*e7b1675dSTing-Kang Chang using ::tink_testing_api::KeysetToJsonResponse;
59*e7b1675dSTing-Kang Chang using ::tink_testing_api::KeysetWriteEncryptedRequest;
60*e7b1675dSTing-Kang Chang using ::tink_testing_api::KeysetWriteEncryptedResponse;
61*e7b1675dSTing-Kang Chang 
62*e7b1675dSTing-Kang Chang class KeysetImplTest : public ::testing::Test {
63*e7b1675dSTing-Kang Chang  protected:
SetUpTestSuite()64*e7b1675dSTing-Kang Chang   static void SetUpTestSuite() { ASSERT_TRUE(TinkConfig::Register().ok()); }
65*e7b1675dSTing-Kang Chang };
66*e7b1675dSTing-Kang Chang 
TEST_F(KeysetImplTest,GenerateSuccess)67*e7b1675dSTing-Kang Chang TEST_F(KeysetImplTest, GenerateSuccess) {
68*e7b1675dSTing-Kang Chang   tink_testing_api::KeysetImpl keyset;
69*e7b1675dSTing-Kang Chang   const KeyTemplate& key_template = AeadKeyTemplates::Aes128Eax();
70*e7b1675dSTing-Kang Chang   KeysetGenerateRequest request;
71*e7b1675dSTing-Kang Chang   std::string templ;
72*e7b1675dSTing-Kang Chang   EXPECT_TRUE(key_template.SerializeToString(&templ));
73*e7b1675dSTing-Kang Chang   request.set_template_(templ);
74*e7b1675dSTing-Kang Chang   KeysetGenerateResponse response;
75*e7b1675dSTing-Kang Chang 
76*e7b1675dSTing-Kang Chang   EXPECT_TRUE(keyset.Generate(nullptr, &request, &response).ok());
77*e7b1675dSTing-Kang Chang   EXPECT_THAT(response.err(), IsEmpty());
78*e7b1675dSTing-Kang Chang 
79*e7b1675dSTing-Kang Chang   auto reader_result = BinaryKeysetReader::New(response.keyset());
80*e7b1675dSTing-Kang Chang   ASSERT_TRUE(reader_result.ok());
81*e7b1675dSTing-Kang Chang   auto handle_result =
82*e7b1675dSTing-Kang Chang       CleartextKeysetHandle::Read(std::move(reader_result.value()));
83*e7b1675dSTing-Kang Chang   EXPECT_TRUE(handle_result.ok());
84*e7b1675dSTing-Kang Chang }
85*e7b1675dSTing-Kang Chang 
TEST_F(KeysetImplTest,GenerateFail)86*e7b1675dSTing-Kang Chang TEST_F(KeysetImplTest, GenerateFail) {
87*e7b1675dSTing-Kang Chang   tink_testing_api::KeysetImpl keyset;
88*e7b1675dSTing-Kang Chang 
89*e7b1675dSTing-Kang Chang   KeysetGenerateRequest request;
90*e7b1675dSTing-Kang Chang   request.set_template_("bad template");
91*e7b1675dSTing-Kang Chang   KeysetGenerateResponse response;
92*e7b1675dSTing-Kang Chang   EXPECT_TRUE(keyset.Generate(nullptr, &request, &response).ok());
93*e7b1675dSTing-Kang Chang   EXPECT_THAT(response.err(), Not(IsEmpty()));
94*e7b1675dSTing-Kang Chang }
95*e7b1675dSTing-Kang Chang 
AeadKeyset()96*e7b1675dSTing-Kang Chang util::StatusOr<std::string> AeadKeyset() {
97*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<KeysetHandle>> handle =
98*e7b1675dSTing-Kang Chang       KeysetHandle::GenerateNew(AeadKeyTemplates::Aes128Gcm());
99*e7b1675dSTing-Kang Chang   if (!handle.ok()) {
100*e7b1675dSTing-Kang Chang     return handle.status();
101*e7b1675dSTing-Kang Chang   }
102*e7b1675dSTing-Kang Chang   std::stringbuf keyset;
103*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<BinaryKeysetWriter>> writer =
104*e7b1675dSTing-Kang Chang       BinaryKeysetWriter::New(absl::make_unique<std::ostream>(&keyset));
105*e7b1675dSTing-Kang Chang   if (!handle.ok()) {
106*e7b1675dSTing-Kang Chang     return handle.status();
107*e7b1675dSTing-Kang Chang   }
108*e7b1675dSTing-Kang Chang   util::Status status = CleartextKeysetHandle::Write(writer->get(), **handle);
109*e7b1675dSTing-Kang Chang   if (!status.ok()) {
110*e7b1675dSTing-Kang Chang     return status;
111*e7b1675dSTing-Kang Chang   }
112*e7b1675dSTing-Kang Chang   return keyset.str();
113*e7b1675dSTing-Kang Chang }
114*e7b1675dSTing-Kang Chang 
ValidPrivateKeyset()115*e7b1675dSTing-Kang Chang util::StatusOr<std::string> ValidPrivateKeyset() {
116*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<KeysetHandle>> handle =
117*e7b1675dSTing-Kang Chang       KeysetHandle::GenerateNew(
118*e7b1675dSTing-Kang Chang           HybridKeyTemplates::EciesP256HkdfHmacSha256Aes128Gcm());
119*e7b1675dSTing-Kang Chang   if (!handle.ok()) {
120*e7b1675dSTing-Kang Chang     return handle.status();
121*e7b1675dSTing-Kang Chang   }
122*e7b1675dSTing-Kang Chang   std::stringbuf keyset;
123*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<BinaryKeysetWriter>> writer =
124*e7b1675dSTing-Kang Chang       BinaryKeysetWriter::New(absl::make_unique<std::ostream>(&keyset));
125*e7b1675dSTing-Kang Chang   if (!writer.ok()) {
126*e7b1675dSTing-Kang Chang     return writer.status();
127*e7b1675dSTing-Kang Chang   }
128*e7b1675dSTing-Kang Chang   util::Status status = CleartextKeysetHandle::Write(writer->get(), **handle);
129*e7b1675dSTing-Kang Chang   if (!status.ok()) {
130*e7b1675dSTing-Kang Chang     return status;
131*e7b1675dSTing-Kang Chang   }
132*e7b1675dSTing-Kang Chang   return keyset.str();
133*e7b1675dSTing-Kang Chang }
134*e7b1675dSTing-Kang Chang 
TEST_F(KeysetImplTest,PublicSuccess)135*e7b1675dSTing-Kang Chang TEST_F(KeysetImplTest, PublicSuccess) {
136*e7b1675dSTing-Kang Chang   tink_testing_api::KeysetImpl keyset;
137*e7b1675dSTing-Kang Chang 
138*e7b1675dSTing-Kang Chang   util::StatusOr<std::string> private_keyset = ValidPrivateKeyset();
139*e7b1675dSTing-Kang Chang   ASSERT_THAT(private_keyset.status(), IsOk());
140*e7b1675dSTing-Kang Chang 
141*e7b1675dSTing-Kang Chang   KeysetPublicRequest request;
142*e7b1675dSTing-Kang Chang   request.set_private_keyset(*private_keyset);
143*e7b1675dSTing-Kang Chang   KeysetPublicResponse response;
144*e7b1675dSTing-Kang Chang 
145*e7b1675dSTing-Kang Chang   EXPECT_TRUE(keyset.Public(nullptr, &request, &response).ok());
146*e7b1675dSTing-Kang Chang   EXPECT_THAT(response.err(), IsEmpty());
147*e7b1675dSTing-Kang Chang 
148*e7b1675dSTing-Kang Chang   auto reader_result = BinaryKeysetReader::New(response.public_keyset());
149*e7b1675dSTing-Kang Chang   ASSERT_TRUE(reader_result.ok());
150*e7b1675dSTing-Kang Chang   auto public_handle_result =
151*e7b1675dSTing-Kang Chang       CleartextKeysetHandle::Read(std::move(reader_result.value()));
152*e7b1675dSTing-Kang Chang   EXPECT_TRUE(public_handle_result.ok());
153*e7b1675dSTing-Kang Chang }
154*e7b1675dSTing-Kang Chang 
TEST_F(KeysetImplTest,PublicFail)155*e7b1675dSTing-Kang Chang TEST_F(KeysetImplTest, PublicFail) {
156*e7b1675dSTing-Kang Chang   tink_testing_api::KeysetImpl keyset;
157*e7b1675dSTing-Kang Chang 
158*e7b1675dSTing-Kang Chang   KeysetPublicRequest request;
159*e7b1675dSTing-Kang Chang   request.set_private_keyset("bad keyset");
160*e7b1675dSTing-Kang Chang   KeysetPublicResponse response;
161*e7b1675dSTing-Kang Chang   EXPECT_TRUE(keyset.Public(nullptr, &request, &response).ok());
162*e7b1675dSTing-Kang Chang   EXPECT_THAT(response.err(), Not(IsEmpty()));
163*e7b1675dSTing-Kang Chang }
164*e7b1675dSTing-Kang Chang 
TEST_F(KeysetImplTest,FromJsonSuccess)165*e7b1675dSTing-Kang Chang TEST_F(KeysetImplTest, FromJsonSuccess) {
166*e7b1675dSTing-Kang Chang   tink_testing_api::KeysetImpl keyset;
167*e7b1675dSTing-Kang Chang   std::string json_keyset = R""""(
168*e7b1675dSTing-Kang Chang         {
169*e7b1675dSTing-Kang Chang           "primaryKeyId": 42,
170*e7b1675dSTing-Kang Chang           "key": [
171*e7b1675dSTing-Kang Chang             {
172*e7b1675dSTing-Kang Chang               "keyData": {
173*e7b1675dSTing-Kang Chang                 "typeUrl": "type.googleapis.com/google.crypto.tink.FakeKeyType",
174*e7b1675dSTing-Kang Chang                 "keyMaterialType": "SYMMETRIC",
175*e7b1675dSTing-Kang Chang                 "value": "AFakeTestKeyValue1234567"
176*e7b1675dSTing-Kang Chang               },
177*e7b1675dSTing-Kang Chang               "outputPrefixType": "TINK",
178*e7b1675dSTing-Kang Chang               "keyId": 42,
179*e7b1675dSTing-Kang Chang               "status": "ENABLED"
180*e7b1675dSTing-Kang Chang             }
181*e7b1675dSTing-Kang Chang           ]
182*e7b1675dSTing-Kang Chang         })"""";
183*e7b1675dSTing-Kang Chang   KeysetFromJsonRequest from_request;
184*e7b1675dSTing-Kang Chang   from_request.set_json_keyset(json_keyset);
185*e7b1675dSTing-Kang Chang   KeysetFromJsonResponse from_response;
186*e7b1675dSTing-Kang Chang   EXPECT_TRUE(keyset.FromJson(nullptr, &from_request, &from_response).ok());
187*e7b1675dSTing-Kang Chang   EXPECT_THAT(from_response.err(), IsEmpty());
188*e7b1675dSTing-Kang Chang   std::string output = from_response.keyset();
189*e7b1675dSTing-Kang Chang 
190*e7b1675dSTing-Kang Chang   auto reader_result = BinaryKeysetReader::New(from_response.keyset());
191*e7b1675dSTing-Kang Chang   EXPECT_TRUE(reader_result.ok());
192*e7b1675dSTing-Kang Chang   auto keyset_proto_result = reader_result.value()->Read();
193*e7b1675dSTing-Kang Chang   EXPECT_TRUE(keyset_proto_result.ok());
194*e7b1675dSTing-Kang Chang   EXPECT_THAT(keyset_proto_result.value()->primary_key_id(), Eq(42));
195*e7b1675dSTing-Kang Chang }
196*e7b1675dSTing-Kang Chang 
TEST_F(KeysetImplTest,ToFromJsonSuccess)197*e7b1675dSTing-Kang Chang TEST_F(KeysetImplTest, ToFromJsonSuccess) {
198*e7b1675dSTing-Kang Chang   tink_testing_api::KeysetImpl keyset;
199*e7b1675dSTing-Kang Chang   util::StatusOr<std::string> private_keyset = ValidPrivateKeyset();
200*e7b1675dSTing-Kang Chang   EXPECT_THAT(private_keyset.status(), IsOk());
201*e7b1675dSTing-Kang Chang 
202*e7b1675dSTing-Kang Chang   KeysetToJsonRequest to_request;
203*e7b1675dSTing-Kang Chang   to_request.set_keyset(*private_keyset);
204*e7b1675dSTing-Kang Chang   KeysetToJsonResponse to_response;
205*e7b1675dSTing-Kang Chang   EXPECT_TRUE(keyset.ToJson(nullptr, &to_request, &to_response).ok());
206*e7b1675dSTing-Kang Chang   EXPECT_THAT(to_response.err(), IsEmpty());
207*e7b1675dSTing-Kang Chang   std::string json_keyset = to_response.json_keyset();
208*e7b1675dSTing-Kang Chang 
209*e7b1675dSTing-Kang Chang   KeysetFromJsonRequest from_request;
210*e7b1675dSTing-Kang Chang   from_request.set_json_keyset(json_keyset);
211*e7b1675dSTing-Kang Chang   KeysetFromJsonResponse from_response;
212*e7b1675dSTing-Kang Chang   EXPECT_TRUE(keyset.FromJson(nullptr, &from_request, &from_response).ok());
213*e7b1675dSTing-Kang Chang   EXPECT_THAT(from_response.err(), IsEmpty());
214*e7b1675dSTing-Kang Chang   std::string output = from_response.keyset();
215*e7b1675dSTing-Kang Chang   EXPECT_THAT(from_response.keyset(), Eq(*private_keyset));
216*e7b1675dSTing-Kang Chang }
217*e7b1675dSTing-Kang Chang 
TEST_F(KeysetImplTest,ToJsonFail)218*e7b1675dSTing-Kang Chang TEST_F(KeysetImplTest, ToJsonFail) {
219*e7b1675dSTing-Kang Chang   tink_testing_api::KeysetImpl keyset;
220*e7b1675dSTing-Kang Chang 
221*e7b1675dSTing-Kang Chang   KeysetToJsonRequest request;
222*e7b1675dSTing-Kang Chang   request.set_keyset("bad keyset");
223*e7b1675dSTing-Kang Chang   KeysetToJsonResponse response;
224*e7b1675dSTing-Kang Chang   EXPECT_TRUE(keyset.ToJson(nullptr, &request, &response).ok());
225*e7b1675dSTing-Kang Chang   EXPECT_THAT(response.err(), Not(IsEmpty()));
226*e7b1675dSTing-Kang Chang }
227*e7b1675dSTing-Kang Chang 
TEST_F(KeysetImplTest,FromJsonFail)228*e7b1675dSTing-Kang Chang TEST_F(KeysetImplTest, FromJsonFail) {
229*e7b1675dSTing-Kang Chang   tink_testing_api::KeysetImpl keyset;
230*e7b1675dSTing-Kang Chang 
231*e7b1675dSTing-Kang Chang   KeysetFromJsonRequest request;
232*e7b1675dSTing-Kang Chang   request.set_json_keyset("bad json keyset");
233*e7b1675dSTing-Kang Chang   KeysetFromJsonResponse response;
234*e7b1675dSTing-Kang Chang   EXPECT_TRUE(keyset.FromJson(nullptr, &request, &response).ok());
235*e7b1675dSTing-Kang Chang   EXPECT_THAT(response.err(), Not(IsEmpty()));
236*e7b1675dSTing-Kang Chang }
237*e7b1675dSTing-Kang Chang 
TEST_F(KeysetImplTest,ReadWriteEncryptedKeysetSuccess)238*e7b1675dSTing-Kang Chang TEST_F(KeysetImplTest, ReadWriteEncryptedKeysetSuccess) {
239*e7b1675dSTing-Kang Chang   tink_testing_api::KeysetImpl keyset_impl;
240*e7b1675dSTing-Kang Chang 
241*e7b1675dSTing-Kang Chang   util::StatusOr<std::string> master_keyset = AeadKeyset();
242*e7b1675dSTing-Kang Chang   ASSERT_THAT(master_keyset.status(), IsOk());
243*e7b1675dSTing-Kang Chang   util::StatusOr<std::string> keyset = AeadKeyset();
244*e7b1675dSTing-Kang Chang   ASSERT_THAT(master_keyset.status(), IsOk());
245*e7b1675dSTing-Kang Chang 
246*e7b1675dSTing-Kang Chang   KeysetWriteEncryptedRequest write_request;
247*e7b1675dSTing-Kang Chang   write_request.set_keyset(*keyset);
248*e7b1675dSTing-Kang Chang   write_request.set_master_keyset(*master_keyset);
249*e7b1675dSTing-Kang Chang   write_request.set_keyset_writer_type(tink_testing_api::KEYSET_WRITER_BINARY);
250*e7b1675dSTing-Kang Chang   KeysetWriteEncryptedResponse write_response;
251*e7b1675dSTing-Kang Chang 
252*e7b1675dSTing-Kang Chang   ASSERT_TRUE(
253*e7b1675dSTing-Kang Chang       keyset_impl
254*e7b1675dSTing-Kang Chang           .WriteEncrypted(/*context=*/nullptr, &write_request, &write_response)
255*e7b1675dSTing-Kang Chang           .ok());
256*e7b1675dSTing-Kang Chang   ASSERT_THAT(write_response.err(), IsEmpty());
257*e7b1675dSTing-Kang Chang 
258*e7b1675dSTing-Kang Chang   KeysetReadEncryptedRequest read_request;
259*e7b1675dSTing-Kang Chang   read_request.set_encrypted_keyset(write_response.encrypted_keyset());
260*e7b1675dSTing-Kang Chang   read_request.set_master_keyset(*master_keyset);
261*e7b1675dSTing-Kang Chang   read_request.set_keyset_reader_type(tink_testing_api::KEYSET_READER_BINARY);
262*e7b1675dSTing-Kang Chang   KeysetReadEncryptedResponse read_response;
263*e7b1675dSTing-Kang Chang 
264*e7b1675dSTing-Kang Chang   ASSERT_TRUE(
265*e7b1675dSTing-Kang Chang       keyset_impl
266*e7b1675dSTing-Kang Chang           .ReadEncrypted(/*context=*/nullptr, &read_request, &read_response)
267*e7b1675dSTing-Kang Chang           .ok());
268*e7b1675dSTing-Kang Chang   EXPECT_THAT(read_response.err(), IsEmpty());
269*e7b1675dSTing-Kang Chang   EXPECT_EQ(read_response.keyset(), *keyset);
270*e7b1675dSTing-Kang Chang }
271*e7b1675dSTing-Kang Chang 
TEST_F(KeysetImplTest,ReadWriteEncryptedWithAssociatedDataKeysetSuccess)272*e7b1675dSTing-Kang Chang TEST_F(KeysetImplTest, ReadWriteEncryptedWithAssociatedDataKeysetSuccess) {
273*e7b1675dSTing-Kang Chang   tink_testing_api::KeysetImpl keyset_impl;
274*e7b1675dSTing-Kang Chang 
275*e7b1675dSTing-Kang Chang   util::StatusOr<std::string> master_keyset = AeadKeyset();
276*e7b1675dSTing-Kang Chang   ASSERT_THAT(master_keyset.status(), IsOk());
277*e7b1675dSTing-Kang Chang   util::StatusOr<std::string> keyset = AeadKeyset();
278*e7b1675dSTing-Kang Chang   ASSERT_THAT(keyset.status(), IsOk());
279*e7b1675dSTing-Kang Chang   std::string associated_data = "associated_data";
280*e7b1675dSTing-Kang Chang 
281*e7b1675dSTing-Kang Chang   KeysetWriteEncryptedRequest write_request;
282*e7b1675dSTing-Kang Chang   write_request.set_keyset(*keyset);
283*e7b1675dSTing-Kang Chang   write_request.set_master_keyset(*master_keyset);
284*e7b1675dSTing-Kang Chang   write_request.mutable_associated_data()->set_value(associated_data);
285*e7b1675dSTing-Kang Chang   write_request.set_keyset_writer_type(tink_testing_api::KEYSET_WRITER_BINARY);
286*e7b1675dSTing-Kang Chang   KeysetWriteEncryptedResponse write_response;
287*e7b1675dSTing-Kang Chang 
288*e7b1675dSTing-Kang Chang   ASSERT_TRUE(
289*e7b1675dSTing-Kang Chang       keyset_impl
290*e7b1675dSTing-Kang Chang           .WriteEncrypted(/*context=*/nullptr, &write_request, &write_response)
291*e7b1675dSTing-Kang Chang           .ok());
292*e7b1675dSTing-Kang Chang   ASSERT_THAT(write_response.err(), IsEmpty());
293*e7b1675dSTing-Kang Chang 
294*e7b1675dSTing-Kang Chang   KeysetReadEncryptedRequest read_request;
295*e7b1675dSTing-Kang Chang   read_request.set_encrypted_keyset(write_response.encrypted_keyset());
296*e7b1675dSTing-Kang Chang   read_request.set_master_keyset(*master_keyset);
297*e7b1675dSTing-Kang Chang   read_request.mutable_associated_data()->set_value(associated_data);
298*e7b1675dSTing-Kang Chang   read_request.set_keyset_reader_type(tink_testing_api::KEYSET_READER_BINARY);
299*e7b1675dSTing-Kang Chang   KeysetReadEncryptedResponse read_response;
300*e7b1675dSTing-Kang Chang 
301*e7b1675dSTing-Kang Chang   ASSERT_TRUE(
302*e7b1675dSTing-Kang Chang       keyset_impl
303*e7b1675dSTing-Kang Chang           .ReadEncrypted(/*context=*/nullptr, &read_request, &read_response)
304*e7b1675dSTing-Kang Chang           .ok());
305*e7b1675dSTing-Kang Chang   EXPECT_THAT(read_response.err(), IsEmpty());
306*e7b1675dSTing-Kang Chang   EXPECT_EQ(read_response.keyset(), *keyset);
307*e7b1675dSTing-Kang Chang }
308*e7b1675dSTing-Kang Chang 
TEST_F(KeysetImplTest,WriteEncryptedKeysetFail)309*e7b1675dSTing-Kang Chang TEST_F(KeysetImplTest, WriteEncryptedKeysetFail) {
310*e7b1675dSTing-Kang Chang   tink_testing_api::KeysetImpl keyset_impl;
311*e7b1675dSTing-Kang Chang 
312*e7b1675dSTing-Kang Chang   util::StatusOr<std::string> master_keyset = AeadKeyset();
313*e7b1675dSTing-Kang Chang   ASSERT_THAT(master_keyset.status(), IsOk());
314*e7b1675dSTing-Kang Chang 
315*e7b1675dSTing-Kang Chang   KeysetWriteEncryptedRequest write_request;
316*e7b1675dSTing-Kang Chang   write_request.set_keyset("invalid");
317*e7b1675dSTing-Kang Chang   write_request.set_master_keyset(*master_keyset);
318*e7b1675dSTing-Kang Chang   write_request.set_keyset_writer_type(tink_testing_api::KEYSET_WRITER_BINARY);
319*e7b1675dSTing-Kang Chang   KeysetWriteEncryptedResponse write_response;
320*e7b1675dSTing-Kang Chang 
321*e7b1675dSTing-Kang Chang   ASSERT_TRUE(
322*e7b1675dSTing-Kang Chang       keyset_impl
323*e7b1675dSTing-Kang Chang           .WriteEncrypted(/*context=*/nullptr, &write_request, &write_response)
324*e7b1675dSTing-Kang Chang           .ok());
325*e7b1675dSTing-Kang Chang   EXPECT_THAT(write_response.err(), Not(IsEmpty()));
326*e7b1675dSTing-Kang Chang }
327*e7b1675dSTing-Kang Chang 
TEST_F(KeysetImplTest,ReadEncryptedKeysetFail)328*e7b1675dSTing-Kang Chang TEST_F(KeysetImplTest, ReadEncryptedKeysetFail) {
329*e7b1675dSTing-Kang Chang   tink_testing_api::KeysetImpl keyset_impl;
330*e7b1675dSTing-Kang Chang 
331*e7b1675dSTing-Kang Chang   util::StatusOr<std::string> master_keyset = AeadKeyset();
332*e7b1675dSTing-Kang Chang   ASSERT_THAT(master_keyset.status(), IsOk());
333*e7b1675dSTing-Kang Chang 
334*e7b1675dSTing-Kang Chang   KeysetReadEncryptedRequest read_request;
335*e7b1675dSTing-Kang Chang   read_request.set_encrypted_keyset("invalid");
336*e7b1675dSTing-Kang Chang   read_request.set_master_keyset(*master_keyset);
337*e7b1675dSTing-Kang Chang   read_request.set_keyset_reader_type(tink_testing_api::KEYSET_READER_BINARY);
338*e7b1675dSTing-Kang Chang   KeysetReadEncryptedResponse read_response;
339*e7b1675dSTing-Kang Chang 
340*e7b1675dSTing-Kang Chang   ASSERT_TRUE(
341*e7b1675dSTing-Kang Chang       keyset_impl
342*e7b1675dSTing-Kang Chang           .ReadEncrypted(/*context=*/nullptr, &read_request, &read_response)
343*e7b1675dSTing-Kang Chang           .ok());
344*e7b1675dSTing-Kang Chang   EXPECT_THAT(read_response.err(), Not(IsEmpty()));
345*e7b1675dSTing-Kang Chang }
346*e7b1675dSTing-Kang Chang 
347*e7b1675dSTing-Kang Chang }  // namespace
348*e7b1675dSTing-Kang Chang }  // namespace tink
349*e7b1675dSTing-Kang Chang }  // namespace crypto
350