1*e7b1675dSTing-Kang Chang // Copyright 2019 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 #include "tink/util/test_util.h"
17*e7b1675dSTing-Kang Chang
18*e7b1675dSTing-Kang Chang #include <algorithm>
19*e7b1675dSTing-Kang Chang #include <cstdint>
20*e7b1675dSTing-Kang Chang #include <memory>
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 "absl/strings/string_view.h"
28*e7b1675dSTing-Kang Chang #include "tink/internal/test_random_access_stream.h"
29*e7b1675dSTing-Kang Chang #include "tink/output_stream.h"
30*e7b1675dSTing-Kang Chang #include "tink/random_access_stream.h"
31*e7b1675dSTing-Kang Chang #include "tink/subtle/random.h"
32*e7b1675dSTing-Kang Chang #include "tink/subtle/test_util.h"
33*e7b1675dSTing-Kang Chang #include "tink/util/buffer.h"
34*e7b1675dSTing-Kang Chang #include "tink/util/ostream_output_stream.h"
35*e7b1675dSTing-Kang Chang #include "tink/util/statusor.h"
36*e7b1675dSTing-Kang Chang #include "tink/util/test_matchers.h"
37*e7b1675dSTing-Kang Chang #include "proto/aes_gcm.pb.h"
38*e7b1675dSTing-Kang Chang #include "proto/tink.pb.h"
39*e7b1675dSTing-Kang Chang
40*e7b1675dSTing-Kang Chang namespace crypto {
41*e7b1675dSTing-Kang Chang namespace tink {
42*e7b1675dSTing-Kang Chang namespace test {
43*e7b1675dSTing-Kang Chang namespace {
44*e7b1675dSTing-Kang Chang
45*e7b1675dSTing-Kang Chang using ::crypto::tink::internal::TestRandomAccessStream;
46*e7b1675dSTing-Kang Chang using ::crypto::tink::test::StatusIs;
47*e7b1675dSTing-Kang Chang using ::google::crypto::tink::AesGcmKey;
48*e7b1675dSTing-Kang Chang using ::google::crypto::tink::KeyData;
49*e7b1675dSTing-Kang Chang using ::testing::Eq;
50*e7b1675dSTing-Kang Chang using ::testing::Not;
51*e7b1675dSTing-Kang Chang
TEST(AsKeyDataTest,Basic)52*e7b1675dSTing-Kang Chang TEST(AsKeyDataTest, Basic) {
53*e7b1675dSTing-Kang Chang AesGcmKey key;
54*e7b1675dSTing-Kang Chang key.set_key_value(crypto::tink::subtle::Random::GetRandomBytes(11));
55*e7b1675dSTing-Kang Chang
56*e7b1675dSTing-Kang Chang KeyData key_data = AsKeyData(key, KeyData::SYMMETRIC);
57*e7b1675dSTing-Kang Chang
58*e7b1675dSTing-Kang Chang EXPECT_THAT(key_data.type_url(),
59*e7b1675dSTing-Kang Chang Eq("type.googleapis.com/google.crypto.tink.AesGcmKey"));
60*e7b1675dSTing-Kang Chang EXPECT_THAT(key_data.key_material_type(), Eq(KeyData::SYMMETRIC));
61*e7b1675dSTing-Kang Chang AesGcmKey deserialized_key;
62*e7b1675dSTing-Kang Chang EXPECT_TRUE(deserialized_key.ParseFromString(key_data.value()));
63*e7b1675dSTing-Kang Chang EXPECT_THAT(deserialized_key.key_value(), Eq(key.key_value()));
64*e7b1675dSTing-Kang Chang }
65*e7b1675dSTing-Kang Chang
TEST(DummyTests,Aead)66*e7b1675dSTing-Kang Chang TEST(DummyTests, Aead) {
67*e7b1675dSTing-Kang Chang EXPECT_THAT(DummyAead("dummy").Encrypt("foo", "bar").value(),
68*e7b1675dSTing-Kang Chang Eq("5:3:dummybarfoo"));
69*e7b1675dSTing-Kang Chang }
70*e7b1675dSTing-Kang Chang
TEST(DummyTests,AeadCord)71*e7b1675dSTing-Kang Chang TEST(DummyTests, AeadCord) {
72*e7b1675dSTing-Kang Chang absl::Cord plaintext;
73*e7b1675dSTing-Kang Chang plaintext.Append("foo");
74*e7b1675dSTing-Kang Chang absl::Cord aad;
75*e7b1675dSTing-Kang Chang aad.Append("bar");
76*e7b1675dSTing-Kang Chang
77*e7b1675dSTing-Kang Chang EXPECT_THAT(DummyCordAead("dummy").Encrypt(plaintext, aad).value(),
78*e7b1675dSTing-Kang Chang Eq("5:3:dummybarfoo"));
79*e7b1675dSTing-Kang Chang }
80*e7b1675dSTing-Kang Chang
TEST(DummyTests,AeadCordMultipleChunks)81*e7b1675dSTing-Kang Chang TEST(DummyTests, AeadCordMultipleChunks) {
82*e7b1675dSTing-Kang Chang absl::Cord plaintext;
83*e7b1675dSTing-Kang Chang plaintext.Append("f");
84*e7b1675dSTing-Kang Chang plaintext.Append("o");
85*e7b1675dSTing-Kang Chang plaintext.Append("o");
86*e7b1675dSTing-Kang Chang absl::Cord aad;
87*e7b1675dSTing-Kang Chang aad.Append("b");
88*e7b1675dSTing-Kang Chang aad.Append("a");
89*e7b1675dSTing-Kang Chang aad.Append("r");
90*e7b1675dSTing-Kang Chang
91*e7b1675dSTing-Kang Chang EXPECT_THAT(DummyCordAead("dummy").Encrypt(plaintext, aad).value(),
92*e7b1675dSTing-Kang Chang Eq("5:3:dummybarfoo"));
93*e7b1675dSTing-Kang Chang }
94*e7b1675dSTing-Kang Chang
TEST(ZTests,UniformString)95*e7b1675dSTing-Kang Chang TEST(ZTests, UniformString) {
96*e7b1675dSTing-Kang Chang EXPECT_THAT(ZTestUniformString(std::string(32, 0xaa)), IsOk());
97*e7b1675dSTing-Kang Chang EXPECT_THAT(ZTestUniformString(std::string(32, 0x00)), Not(IsOk()));
98*e7b1675dSTing-Kang Chang EXPECT_THAT(ZTestUniformString(subtle::Random::GetRandomBytes(32)), IsOk());
99*e7b1675dSTing-Kang Chang }
100*e7b1675dSTing-Kang Chang
TEST(ZTests,CrossCorrelationUniformString)101*e7b1675dSTing-Kang Chang TEST(ZTests, CrossCorrelationUniformString) {
102*e7b1675dSTing-Kang Chang EXPECT_THAT(ZTestCrosscorrelationUniformStrings(std::string(32, 0xaa),
103*e7b1675dSTing-Kang Chang std::string(32, 0x99)),
104*e7b1675dSTing-Kang Chang IsOk());
105*e7b1675dSTing-Kang Chang EXPECT_THAT(ZTestCrosscorrelationUniformStrings(std::string(32, 0xaa),
106*e7b1675dSTing-Kang Chang std::string(32, 0xaa)),
107*e7b1675dSTing-Kang Chang Not(IsOk()));
108*e7b1675dSTing-Kang Chang EXPECT_THAT(
109*e7b1675dSTing-Kang Chang ZTestCrosscorrelationUniformStrings(subtle::Random::GetRandomBytes(32),
110*e7b1675dSTing-Kang Chang subtle::Random::GetRandomBytes(32)),
111*e7b1675dSTing-Kang Chang IsOk());
112*e7b1675dSTing-Kang Chang }
113*e7b1675dSTing-Kang Chang
TEST(ZTests,AutocorrelationUniformString)114*e7b1675dSTing-Kang Chang TEST(ZTests, AutocorrelationUniformString) {
115*e7b1675dSTing-Kang Chang EXPECT_THAT(ZTestAutocorrelationUniformString(std::string(32, 0xaa)),
116*e7b1675dSTing-Kang Chang Not(IsOk()));
117*e7b1675dSTing-Kang Chang EXPECT_THAT(ZTestAutocorrelationUniformString(std::string(
118*e7b1675dSTing-Kang Chang "This is a text that is only ascii characters and therefore "
119*e7b1675dSTing-Kang Chang "not random. It needs quite a few characters before it has "
120*e7b1675dSTing-Kang Chang "enough to find a pattern, though, as it is text.")),
121*e7b1675dSTing-Kang Chang Not(IsOk()));
122*e7b1675dSTing-Kang Chang EXPECT_THAT(
123*e7b1675dSTing-Kang Chang ZTestAutocorrelationUniformString(subtle::Random::GetRandomBytes(32)),
124*e7b1675dSTing-Kang Chang IsOk());
125*e7b1675dSTing-Kang Chang }
126*e7b1675dSTing-Kang Chang
TEST(DummyStreamingAead,DummyDecryptingStreamPreadAllAtOnceSucceeds)127*e7b1675dSTing-Kang Chang TEST(DummyStreamingAead, DummyDecryptingStreamPreadAllAtOnceSucceeds) {
128*e7b1675dSTing-Kang Chang const int stream_size = 1024;
129*e7b1675dSTing-Kang Chang std::string stream_content = subtle::Random::GetRandomBytes(stream_size);
130*e7b1675dSTing-Kang Chang
131*e7b1675dSTing-Kang Chang auto ostream = std::make_unique<std::ostringstream>();
132*e7b1675dSTing-Kang Chang auto string_stream_buffer = ostream->rdbuf();
133*e7b1675dSTing-Kang Chang auto output_stream =
134*e7b1675dSTing-Kang Chang std::make_unique<util::OstreamOutputStream>(std::move(ostream));
135*e7b1675dSTing-Kang Chang
136*e7b1675dSTing-Kang Chang DummyStreamingAead streaming_aead("Some AEAD");
137*e7b1675dSTing-Kang Chang util::StatusOr<std::unique_ptr<OutputStream>> encrypting_output_stream =
138*e7b1675dSTing-Kang Chang streaming_aead.NewEncryptingStream(std::move(output_stream), "Some AAD");
139*e7b1675dSTing-Kang Chang ASSERT_THAT(encrypting_output_stream.status(), IsOk());
140*e7b1675dSTing-Kang Chang ASSERT_THAT(subtle::test::WriteToStream(
141*e7b1675dSTing-Kang Chang encrypting_output_stream.value().get(), stream_content),
142*e7b1675dSTing-Kang Chang IsOk());
143*e7b1675dSTing-Kang Chang
144*e7b1675dSTing-Kang Chang std::string ciphertext = string_stream_buffer->str();
145*e7b1675dSTing-Kang Chang auto test_random_access_stream =
146*e7b1675dSTing-Kang Chang std::make_unique<TestRandomAccessStream>(ciphertext);
147*e7b1675dSTing-Kang Chang util::StatusOr<std::unique_ptr<RandomAccessStream>>
148*e7b1675dSTing-Kang Chang decrypting_random_access_stream =
149*e7b1675dSTing-Kang Chang streaming_aead.NewDecryptingRandomAccessStream(
150*e7b1675dSTing-Kang Chang std::move(test_random_access_stream), "Some AAD");
151*e7b1675dSTing-Kang Chang ASSERT_THAT(decrypting_random_access_stream.status(), IsOk());
152*e7b1675dSTing-Kang Chang
153*e7b1675dSTing-Kang Chang auto buffer = util::Buffer::New(ciphertext.size());
154*e7b1675dSTing-Kang Chang EXPECT_THAT((*decrypting_random_access_stream)
155*e7b1675dSTing-Kang Chang ->PRead(/*position=*/0, ciphertext.size(), buffer->get()),
156*e7b1675dSTing-Kang Chang StatusIs(absl::StatusCode::kOutOfRange));
157*e7b1675dSTing-Kang Chang EXPECT_EQ(stream_content,
158*e7b1675dSTing-Kang Chang std::string((*buffer)->get_mem_block(), (*buffer)->size()));
159*e7b1675dSTing-Kang Chang }
160*e7b1675dSTing-Kang Chang
TEST(DummyStreamingAead,DummyDecryptingStreamPreadInChunksSucceeds)161*e7b1675dSTing-Kang Chang TEST(DummyStreamingAead, DummyDecryptingStreamPreadInChunksSucceeds) {
162*e7b1675dSTing-Kang Chang const int stream_size = 1024;
163*e7b1675dSTing-Kang Chang std::string stream_content = subtle::Random::GetRandomBytes(stream_size);
164*e7b1675dSTing-Kang Chang
165*e7b1675dSTing-Kang Chang auto ostream = std::make_unique<std::ostringstream>();
166*e7b1675dSTing-Kang Chang auto string_stream_buffer = ostream->rdbuf();
167*e7b1675dSTing-Kang Chang auto output_stream =
168*e7b1675dSTing-Kang Chang std::make_unique<util::OstreamOutputStream>(std::move(ostream));
169*e7b1675dSTing-Kang Chang
170*e7b1675dSTing-Kang Chang DummyStreamingAead streaming_aead("Some AEAD");
171*e7b1675dSTing-Kang Chang util::StatusOr<std::unique_ptr<OutputStream>> encrypting_output_stream =
172*e7b1675dSTing-Kang Chang streaming_aead.NewEncryptingStream(std::move(output_stream), "Some AAD");
173*e7b1675dSTing-Kang Chang ASSERT_THAT(encrypting_output_stream.status(), IsOk());
174*e7b1675dSTing-Kang Chang ASSERT_THAT(subtle::test::WriteToStream(
175*e7b1675dSTing-Kang Chang encrypting_output_stream.value().get(), stream_content),
176*e7b1675dSTing-Kang Chang IsOk());
177*e7b1675dSTing-Kang Chang
178*e7b1675dSTing-Kang Chang std::string ciphertext = string_stream_buffer->str();
179*e7b1675dSTing-Kang Chang auto test_random_access_stream =
180*e7b1675dSTing-Kang Chang std::make_unique<TestRandomAccessStream>(ciphertext);
181*e7b1675dSTing-Kang Chang util::StatusOr<std::unique_ptr<RandomAccessStream>>
182*e7b1675dSTing-Kang Chang decrypting_random_access_stream =
183*e7b1675dSTing-Kang Chang streaming_aead.NewDecryptingRandomAccessStream(
184*e7b1675dSTing-Kang Chang std::move(test_random_access_stream), "Some AAD");
185*e7b1675dSTing-Kang Chang ASSERT_THAT(decrypting_random_access_stream.status(), IsOk());
186*e7b1675dSTing-Kang Chang
187*e7b1675dSTing-Kang Chang int chunk_size = 10;
188*e7b1675dSTing-Kang Chang auto buffer = util::Buffer::New(chunk_size);
189*e7b1675dSTing-Kang Chang std::string plaintext;
190*e7b1675dSTing-Kang Chang int64_t position = 0;
191*e7b1675dSTing-Kang Chang util::Status status = (*decrypting_random_access_stream)
192*e7b1675dSTing-Kang Chang ->PRead(position, chunk_size, buffer->get());
193*e7b1675dSTing-Kang Chang while (status.ok()) {
194*e7b1675dSTing-Kang Chang plaintext.append((*buffer)->get_mem_block(), (*buffer)->size());
195*e7b1675dSTing-Kang Chang position += (*buffer)->size();
196*e7b1675dSTing-Kang Chang status = (*decrypting_random_access_stream)
197*e7b1675dSTing-Kang Chang ->PRead(position, chunk_size, buffer->get());
198*e7b1675dSTing-Kang Chang }
199*e7b1675dSTing-Kang Chang EXPECT_THAT(status, StatusIs(absl::StatusCode::kOutOfRange));
200*e7b1675dSTing-Kang Chang plaintext.append((*buffer)->get_mem_block(), (*buffer)->size());
201*e7b1675dSTing-Kang Chang EXPECT_EQ(stream_content, plaintext);
202*e7b1675dSTing-Kang Chang }
203*e7b1675dSTing-Kang Chang
TEST(DummyStreamingAead,DummyDecryptingStreamPreadWithSmallerHeaderFails)204*e7b1675dSTing-Kang Chang TEST(DummyStreamingAead, DummyDecryptingStreamPreadWithSmallerHeaderFails) {
205*e7b1675dSTing-Kang Chang const int stream_size = 1024;
206*e7b1675dSTing-Kang Chang std::string stream_content = subtle::Random::GetRandomBytes(stream_size);
207*e7b1675dSTing-Kang Chang
208*e7b1675dSTing-Kang Chang auto ostream = std::make_unique<std::ostringstream>();
209*e7b1675dSTing-Kang Chang auto output_stream =
210*e7b1675dSTing-Kang Chang std::make_unique<util::OstreamOutputStream>(std::move(ostream));
211*e7b1675dSTing-Kang Chang
212*e7b1675dSTing-Kang Chang constexpr absl::string_view kStreamingAeadName = "Some AEAD";
213*e7b1675dSTing-Kang Chang constexpr absl::string_view kStreamingAeadAad = "Some associated data";
214*e7b1675dSTing-Kang Chang
215*e7b1675dSTing-Kang Chang DummyStreamingAead streaming_aead(kStreamingAeadName);
216*e7b1675dSTing-Kang Chang util::StatusOr<std::unique_ptr<OutputStream>> encrypting_output_stream =
217*e7b1675dSTing-Kang Chang streaming_aead.NewEncryptingStream(std::move(output_stream),
218*e7b1675dSTing-Kang Chang kStreamingAeadAad);
219*e7b1675dSTing-Kang Chang ASSERT_THAT(encrypting_output_stream.status(), IsOk());
220*e7b1675dSTing-Kang Chang ASSERT_THAT(subtle::test::WriteToStream(
221*e7b1675dSTing-Kang Chang encrypting_output_stream.value().get(), stream_content),
222*e7b1675dSTing-Kang Chang IsOk());
223*e7b1675dSTing-Kang Chang // Stream content size is too small; DummyDecryptingStream expects
224*e7b1675dSTing-Kang Chang // absl::StrCat(kStreamingAeadName, kStreamingAeadAad).
225*e7b1675dSTing-Kang Chang std::string ciphertext = "Invalid header";
226*e7b1675dSTing-Kang Chang auto test_random_access_stream =
227*e7b1675dSTing-Kang Chang std::make_unique<TestRandomAccessStream>(ciphertext);
228*e7b1675dSTing-Kang Chang util::StatusOr<std::unique_ptr<RandomAccessStream>>
229*e7b1675dSTing-Kang Chang decrypting_random_access_stream =
230*e7b1675dSTing-Kang Chang streaming_aead.NewDecryptingRandomAccessStream(
231*e7b1675dSTing-Kang Chang std::move(test_random_access_stream), kStreamingAeadAad);
232*e7b1675dSTing-Kang Chang ASSERT_THAT(decrypting_random_access_stream.status(), IsOk());
233*e7b1675dSTing-Kang Chang
234*e7b1675dSTing-Kang Chang int chunk_size = 10;
235*e7b1675dSTing-Kang Chang auto buffer = util::Buffer::New(chunk_size);
236*e7b1675dSTing-Kang Chang EXPECT_THAT(
237*e7b1675dSTing-Kang Chang (*decrypting_random_access_stream)
238*e7b1675dSTing-Kang Chang ->PRead(/*position=*/0, chunk_size, buffer->get()),
239*e7b1675dSTing-Kang Chang StatusIs(absl::StatusCode::kInvalidArgument, "Could not read header"));
240*e7b1675dSTing-Kang Chang EXPECT_THAT(
241*e7b1675dSTing-Kang Chang (*decrypting_random_access_stream)
242*e7b1675dSTing-Kang Chang ->PRead(/*position=*/0, chunk_size, buffer->get()),
243*e7b1675dSTing-Kang Chang StatusIs(absl::StatusCode::kInvalidArgument, "Could not read header"));
244*e7b1675dSTing-Kang Chang EXPECT_THAT(
245*e7b1675dSTing-Kang Chang (*decrypting_random_access_stream)->size().status(),
246*e7b1675dSTing-Kang Chang StatusIs(absl::StatusCode::kInvalidArgument, "Could not read header"));
247*e7b1675dSTing-Kang Chang }
248*e7b1675dSTing-Kang Chang
TEST(DummyStreamingAead,DummyDecryptingStreamPreadWithCorruptedAadFails)249*e7b1675dSTing-Kang Chang TEST(DummyStreamingAead, DummyDecryptingStreamPreadWithCorruptedAadFails) {
250*e7b1675dSTing-Kang Chang const int stream_size = 1024;
251*e7b1675dSTing-Kang Chang std::string stream_content = subtle::Random::GetRandomBytes(stream_size);
252*e7b1675dSTing-Kang Chang
253*e7b1675dSTing-Kang Chang auto ostream = std::make_unique<std::ostringstream>();
254*e7b1675dSTing-Kang Chang auto string_stream_buffer = ostream->rdbuf();
255*e7b1675dSTing-Kang Chang auto output_stream =
256*e7b1675dSTing-Kang Chang std::make_unique<util::OstreamOutputStream>(std::move(ostream));
257*e7b1675dSTing-Kang Chang
258*e7b1675dSTing-Kang Chang constexpr absl::string_view kStreamingAeadName = "Some AEAD";
259*e7b1675dSTing-Kang Chang constexpr absl::string_view kStreamingAeadAad = "Some associated data";
260*e7b1675dSTing-Kang Chang
261*e7b1675dSTing-Kang Chang DummyStreamingAead streaming_aead(kStreamingAeadName);
262*e7b1675dSTing-Kang Chang util::StatusOr<std::unique_ptr<OutputStream>> encrypting_output_stream =
263*e7b1675dSTing-Kang Chang streaming_aead.NewEncryptingStream(std::move(output_stream),
264*e7b1675dSTing-Kang Chang kStreamingAeadAad);
265*e7b1675dSTing-Kang Chang ASSERT_THAT(encrypting_output_stream.status(), IsOk());
266*e7b1675dSTing-Kang Chang ASSERT_THAT(subtle::test::WriteToStream(
267*e7b1675dSTing-Kang Chang encrypting_output_stream.value().get(), stream_content),
268*e7b1675dSTing-Kang Chang IsOk());
269*e7b1675dSTing-Kang Chang // Invalid associated data.
270*e7b1675dSTing-Kang Chang std::string ciphertext = string_stream_buffer->str();
271*e7b1675dSTing-Kang Chang auto test_random_access_stream =
272*e7b1675dSTing-Kang Chang std::make_unique<TestRandomAccessStream>(ciphertext);
273*e7b1675dSTing-Kang Chang util::StatusOr<std::unique_ptr<RandomAccessStream>>
274*e7b1675dSTing-Kang Chang decrypting_random_access_stream =
275*e7b1675dSTing-Kang Chang streaming_aead.NewDecryptingRandomAccessStream(
276*e7b1675dSTing-Kang Chang std::move(test_random_access_stream), "Some wrong AAD");
277*e7b1675dSTing-Kang Chang ASSERT_THAT(decrypting_random_access_stream.status(), IsOk());
278*e7b1675dSTing-Kang Chang
279*e7b1675dSTing-Kang Chang int chunk_size = 10;
280*e7b1675dSTing-Kang Chang auto buffer = util::Buffer::New(chunk_size);
281*e7b1675dSTing-Kang Chang EXPECT_THAT((*decrypting_random_access_stream)
282*e7b1675dSTing-Kang Chang ->PRead(/*position=*/0, chunk_size, buffer->get()),
283*e7b1675dSTing-Kang Chang StatusIs(absl::StatusCode::kInvalidArgument, "Corrupted header"));
284*e7b1675dSTing-Kang Chang EXPECT_THAT((*decrypting_random_access_stream)
285*e7b1675dSTing-Kang Chang ->PRead(/*position=*/0, chunk_size, buffer->get()),
286*e7b1675dSTing-Kang Chang StatusIs(absl::StatusCode::kInvalidArgument, "Corrupted header"));
287*e7b1675dSTing-Kang Chang EXPECT_THAT((*decrypting_random_access_stream)->size().status(),
288*e7b1675dSTing-Kang Chang StatusIs(absl::StatusCode::kInvalidArgument, "Corrupted header"));
289*e7b1675dSTing-Kang Chang }
290*e7b1675dSTing-Kang Chang
291*e7b1675dSTing-Kang Chang } // namespace
292*e7b1675dSTing-Kang Chang } // namespace test
293*e7b1675dSTing-Kang Chang } // namespace tink
294*e7b1675dSTing-Kang Chang } // namespace crypto
295