1*e7b1675dSTing-Kang Chang // Copyright 2023 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 "tink/config/v0.h"
18*e7b1675dSTing-Kang Chang
19*e7b1675dSTing-Kang Chang #include <memory>
20*e7b1675dSTing-Kang Chang #include <string>
21*e7b1675dSTing-Kang Chang
22*e7b1675dSTing-Kang Chang #include "gmock/gmock.h"
23*e7b1675dSTing-Kang Chang #include "gtest/gtest.h"
24*e7b1675dSTing-Kang Chang #include "tink/aead.h"
25*e7b1675dSTing-Kang Chang #include "tink/aead/aead_key_templates.h"
26*e7b1675dSTing-Kang Chang #include "tink/aead/aes_ctr_hmac_aead_key_manager.h"
27*e7b1675dSTing-Kang Chang #include "tink/aead/aes_eax_key_manager.h"
28*e7b1675dSTing-Kang Chang #include "tink/aead/aes_gcm_key_manager.h"
29*e7b1675dSTing-Kang Chang #include "tink/aead/aes_gcm_siv_key_manager.h"
30*e7b1675dSTing-Kang Chang #include "tink/aead/xchacha20_poly1305_key_manager.h"
31*e7b1675dSTing-Kang Chang #include "tink/chunked_mac.h"
32*e7b1675dSTing-Kang Chang #include "tink/config/key_gen_v0.h"
33*e7b1675dSTing-Kang Chang #include "tink/configuration.h"
34*e7b1675dSTing-Kang Chang #include "tink/daead/aes_siv_key_manager.h"
35*e7b1675dSTing-Kang Chang #include "tink/deterministic_aead.h"
36*e7b1675dSTing-Kang Chang #include "tink/hybrid/ecies_aead_hkdf_public_key_manager.h"
37*e7b1675dSTing-Kang Chang #include "tink/hybrid/internal/hpke_public_key_manager.h"
38*e7b1675dSTing-Kang Chang #include "tink/hybrid_decrypt.h"
39*e7b1675dSTing-Kang Chang #include "tink/hybrid_encrypt.h"
40*e7b1675dSTing-Kang Chang #include "tink/internal/configuration_impl.h"
41*e7b1675dSTing-Kang Chang #include "tink/internal/keyset_wrapper_store.h"
42*e7b1675dSTing-Kang Chang #include "tink/keyset_handle.h"
43*e7b1675dSTing-Kang Chang #include "tink/mac.h"
44*e7b1675dSTing-Kang Chang #include "tink/mac/aes_cmac_key_manager.h"
45*e7b1675dSTing-Kang Chang #include "tink/mac/hmac_key_manager.h"
46*e7b1675dSTing-Kang Chang #include "tink/prf/aes_cmac_prf_key_manager.h"
47*e7b1675dSTing-Kang Chang #include "tink/prf/hkdf_prf_key_manager.h"
48*e7b1675dSTing-Kang Chang #include "tink/prf/hmac_prf_key_manager.h"
49*e7b1675dSTing-Kang Chang #include "tink/prf/prf_set.h"
50*e7b1675dSTing-Kang Chang #include "tink/public_key_sign.h"
51*e7b1675dSTing-Kang Chang #include "tink/public_key_verify.h"
52*e7b1675dSTing-Kang Chang #include "tink/signature/ecdsa_verify_key_manager.h"
53*e7b1675dSTing-Kang Chang #include "tink/signature/ed25519_verify_key_manager.h"
54*e7b1675dSTing-Kang Chang #include "tink/signature/rsa_ssa_pkcs1_verify_key_manager.h"
55*e7b1675dSTing-Kang Chang #include "tink/signature/rsa_ssa_pss_verify_key_manager.h"
56*e7b1675dSTing-Kang Chang #include "tink/streaming_aead.h"
57*e7b1675dSTing-Kang Chang #include "tink/streamingaead/aes_ctr_hmac_streaming_key_manager.h"
58*e7b1675dSTing-Kang Chang #include "tink/streamingaead/aes_gcm_hkdf_streaming_key_manager.h"
59*e7b1675dSTing-Kang Chang #include "tink/util/test_matchers.h"
60*e7b1675dSTing-Kang Chang
61*e7b1675dSTing-Kang Chang namespace crypto {
62*e7b1675dSTing-Kang Chang namespace tink {
63*e7b1675dSTing-Kang Chang namespace {
64*e7b1675dSTing-Kang Chang
65*e7b1675dSTing-Kang Chang using ::crypto::tink::test::IsOk;
66*e7b1675dSTing-Kang Chang using ::crypto::tink::test::IsOkAndHolds;
67*e7b1675dSTing-Kang Chang
TEST(V0Test,PrimitiveWrappers)68*e7b1675dSTing-Kang Chang TEST(V0Test, PrimitiveWrappers) {
69*e7b1675dSTing-Kang Chang util::StatusOr<const internal::KeysetWrapperStore*> store =
70*e7b1675dSTing-Kang Chang internal::ConfigurationImpl::GetKeysetWrapperStore(ConfigV0());
71*e7b1675dSTing-Kang Chang ASSERT_THAT(store, IsOk());
72*e7b1675dSTing-Kang Chang
73*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get<Mac>(), IsOk());
74*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get<ChunkedMac>(), IsOk());
75*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get<Aead>(), IsOk());
76*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get<DeterministicAead>(), IsOk());
77*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get<StreamingAead>(), IsOk());
78*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get<HybridEncrypt>(), IsOk());
79*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get<HybridDecrypt>(), IsOk());
80*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get<PrfSet>(), IsOk());
81*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get<PublicKeySign>(), IsOk());
82*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get<PublicKeyVerify>(), IsOk());
83*e7b1675dSTing-Kang Chang }
84*e7b1675dSTing-Kang Chang
TEST(V0Test,KeyManagers)85*e7b1675dSTing-Kang Chang TEST(V0Test, KeyManagers) {
86*e7b1675dSTing-Kang Chang util::StatusOr<const internal::KeyTypeInfoStore*> store =
87*e7b1675dSTing-Kang Chang internal::ConfigurationImpl::GetKeyTypeInfoStore(ConfigV0());
88*e7b1675dSTing-Kang Chang ASSERT_THAT(store, IsOk());
89*e7b1675dSTing-Kang Chang
90*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(HmacKeyManager().get_key_type()), IsOk());
91*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(AesCmacKeyManager().get_key_type()), IsOk());
92*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(AesCtrHmacAeadKeyManager().get_key_type()), IsOk());
93*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(AesGcmKeyManager().get_key_type()), IsOk());
94*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(AesGcmSivKeyManager().get_key_type()), IsOk());
95*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(AesEaxKeyManager().get_key_type()), IsOk());
96*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(XChaCha20Poly1305KeyManager().get_key_type()),
97*e7b1675dSTing-Kang Chang IsOk());
98*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(AesSivKeyManager().get_key_type()), IsOk());
99*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(AesGcmHkdfStreamingKeyManager().get_key_type()),
100*e7b1675dSTing-Kang Chang IsOk());
101*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(AesCtrHmacStreamingKeyManager().get_key_type()),
102*e7b1675dSTing-Kang Chang IsOk());
103*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(EciesAeadHkdfPublicKeyManager().get_key_type()),
104*e7b1675dSTing-Kang Chang IsOk());
105*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(internal::HpkePublicKeyManager().get_key_type()),
106*e7b1675dSTing-Kang Chang IsOk());
107*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(HmacPrfKeyManager().get_key_type()), IsOk());
108*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(HkdfPrfKeyManager().get_key_type()), IsOk());
109*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(AesCmacPrfKeyManager().get_key_type()), IsOk());
110*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(EcdsaVerifyKeyManager().get_key_type()), IsOk());
111*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(RsaSsaPssVerifyKeyManager().get_key_type()),
112*e7b1675dSTing-Kang Chang IsOk());
113*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(RsaSsaPkcs1VerifyKeyManager().get_key_type()),
114*e7b1675dSTing-Kang Chang IsOk());
115*e7b1675dSTing-Kang Chang EXPECT_THAT((*store)->Get(Ed25519VerifyKeyManager().get_key_type()), IsOk());
116*e7b1675dSTing-Kang Chang }
117*e7b1675dSTing-Kang Chang
TEST(V0Test,GetPrimitive)118*e7b1675dSTing-Kang Chang TEST(V0Test, GetPrimitive) {
119*e7b1675dSTing-Kang Chang util::StatusOr<std::unique_ptr<KeysetHandle>> handle =
120*e7b1675dSTing-Kang Chang KeysetHandle::GenerateNew(AeadKeyTemplates::Aes128Gcm(),
121*e7b1675dSTing-Kang Chang KeyGenConfigV0());
122*e7b1675dSTing-Kang Chang ASSERT_THAT(handle, IsOk());
123*e7b1675dSTing-Kang Chang
124*e7b1675dSTing-Kang Chang util::StatusOr<std::unique_ptr<Aead>> aead =
125*e7b1675dSTing-Kang Chang (*handle)->GetPrimitive<Aead>(ConfigV0());
126*e7b1675dSTing-Kang Chang ASSERT_THAT(aead, IsOk());
127*e7b1675dSTing-Kang Chang
128*e7b1675dSTing-Kang Chang std::string plaintext = "plaintext";
129*e7b1675dSTing-Kang Chang std::string ad = "ad";
130*e7b1675dSTing-Kang Chang util::StatusOr<std::string> ciphertext = (*aead)->Encrypt(plaintext, ad);
131*e7b1675dSTing-Kang Chang ASSERT_THAT(ciphertext, IsOk());
132*e7b1675dSTing-Kang Chang EXPECT_THAT((*aead)->Decrypt(*ciphertext, ad), IsOkAndHolds(plaintext));
133*e7b1675dSTing-Kang Chang }
134*e7b1675dSTing-Kang Chang
135*e7b1675dSTing-Kang Chang } // namespace
136*e7b1675dSTing-Kang Chang } // namespace tink
137*e7b1675dSTing-Kang Chang } // namespace crypto
138