xref: /aosp_15_r20/external/tink/cc/aead/internal/aead_from_zero_copy_test.cc (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1 // Copyright 2021 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 ///////////////////////////////////////////////////////////////////////////////
16 #include "tink/aead/internal/aead_from_zero_copy.h"
17 
18 #include <memory>
19 #include <string>
20 #include <utility>
21 
22 #include "gmock/gmock.h"
23 #include "gtest/gtest.h"
24 #include "absl/memory/memory.h"
25 #include "absl/status/status.h"
26 #include "absl/strings/string_view.h"
27 #include "absl/types/span.h"
28 #include "tink/aead/internal/mock_zero_copy_aead.h"
29 #include "tink/util/statusor.h"
30 #include "tink/util/test_matchers.h"
31 
32 namespace crypto {
33 namespace tink {
34 namespace internal {
35 namespace {
36 
37 constexpr absl::string_view kPlaintext = "Some data to encrypt.";
38 constexpr absl::string_view kAssociatedData = "Some associated data.";
39 constexpr absl::string_view kCiphertext = "37ajhgdahjsdg8653821218236182631";
40 
41 using ::crypto::tink::test::IsOk;
42 using ::crypto::tink::test::StatusIs;
43 using ::crypto::tink::util::Status;
44 using ::crypto::tink::util::StatusOr;
45 using ::testing::_;
46 using ::testing::Invoke;
47 using ::testing::Return;
48 using ::testing::Unused;
49 
TEST(AeadFromZeroCopyTest,EncryptSucceeds)50 TEST(AeadFromZeroCopyTest, EncryptSucceeds) {
51   std::unique_ptr<MockZeroCopyAead> mock_zero_copy_aead =
52       std::make_unique<MockZeroCopyAead>();
53   EXPECT_CALL(*mock_zero_copy_aead, MaxEncryptionSize(kPlaintext.size()))
54       .WillOnce(Return(kCiphertext.size()));
55   EXPECT_CALL(*mock_zero_copy_aead, Encrypt(kPlaintext, kAssociatedData, _))
56       .WillOnce(Invoke([&](Unused, Unused, absl::Span<char> buffer) {
57         memcpy(buffer.data(), kCiphertext.data(), kCiphertext.size());
58         return kCiphertext.size();
59       }));
60 
61   AeadFromZeroCopy aead(std::move(mock_zero_copy_aead));
62   StatusOr<std::string> ciphertext = aead.Encrypt(kPlaintext, kAssociatedData);
63   ASSERT_THAT(ciphertext, IsOk());
64   EXPECT_EQ(*ciphertext, kCiphertext);
65 }
66 
TEST(AeadFromZeroCopyTest,EncryptFailsIfZeroCopyEncryptFails)67 TEST(AeadFromZeroCopyTest, EncryptFailsIfZeroCopyEncryptFails) {
68   std::unique_ptr<MockZeroCopyAead> mock_zero_copy_aead =
69       std::make_unique<MockZeroCopyAead>();
70   EXPECT_CALL(*mock_zero_copy_aead, MaxEncryptionSize(kPlaintext.size()))
71       .WillOnce(Return(kCiphertext.size()));
72   EXPECT_CALL(*mock_zero_copy_aead, Encrypt(kPlaintext, kAssociatedData, _))
73       .WillOnce(
74           Return(Status(absl::StatusCode::kInternal, "Some error happened!")));
75   AeadFromZeroCopy aead(std::move(mock_zero_copy_aead));
76   EXPECT_THAT(aead.Encrypt(kPlaintext, kAssociatedData).status(),
77               StatusIs(absl::StatusCode::kInternal));
78 }
79 
TEST(AeadFromZeroCopyTest,DecryptSucceeds)80 TEST(AeadFromZeroCopyTest, DecryptSucceeds) {
81   std::unique_ptr<MockZeroCopyAead> mock_zero_copy_aead =
82       std::make_unique<MockZeroCopyAead>();
83   EXPECT_CALL(*mock_zero_copy_aead, MaxDecryptionSize(kCiphertext.size()))
84       .WillOnce(Return(kPlaintext.size()));
85   EXPECT_CALL(*mock_zero_copy_aead, Decrypt(kCiphertext, kAssociatedData, _))
86       .WillOnce(Invoke([&](Unused, Unused, absl::Span<char> buffer) {
87         memcpy(buffer.data(), kPlaintext.data(), kPlaintext.size());
88         return kPlaintext.size();
89       }));
90 
91   AeadFromZeroCopy aead(std::move(mock_zero_copy_aead));
92   StatusOr<std::string> plaintext = aead.Decrypt(kCiphertext, kAssociatedData);
93   ASSERT_THAT(plaintext, IsOk());
94   EXPECT_EQ(*plaintext, kPlaintext);
95 }
96 
TEST(AeadFromZeroCopyTest,EncryptFailsIfZeroCopyDecryptFails)97 TEST(AeadFromZeroCopyTest, EncryptFailsIfZeroCopyDecryptFails) {
98   std::unique_ptr<MockZeroCopyAead> mock_zero_copy_aead =
99       std::make_unique<MockZeroCopyAead>();
100   EXPECT_CALL(*mock_zero_copy_aead, MaxDecryptionSize(kCiphertext.size()))
101       .WillOnce(Return(kPlaintext.size()));
102   EXPECT_CALL(*mock_zero_copy_aead, Decrypt(kCiphertext, kAssociatedData, _))
103       .WillOnce(
104           Return(Status(absl::StatusCode::kInternal, "Some error happened!")));
105   AeadFromZeroCopy aead(std::move(mock_zero_copy_aead));
106   EXPECT_THAT(aead.Decrypt(kCiphertext, kAssociatedData).status(),
107               StatusIs(absl::StatusCode::kInternal));
108 }
109 
110 }  // namespace
111 }  // namespace internal
112 }  // namespace tink
113 }  // namespace crypto
114