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
17 #include "tink/hybrid/internal/hpke_util_boringssl.h"
18
19 #include <string>
20
21 #include "gtest/gtest.h"
22 #include "openssl/base.h"
23 #include "openssl/hpke.h"
24 #include "tink/hybrid/internal/hpke_test_util.h"
25 #include "tink/hybrid/internal/hpke_util.h"
26 #include "tink/util/test_matchers.h"
27 #include "tink/util/test_util.h"
28 #include "proto/hpke.pb.h"
29
30 namespace crypto {
31 namespace tink {
32 namespace internal {
33 namespace {
34
35 using ::crypto::tink::test::IsOk;
36 using ::testing::Eq;
37 using ::testing::Not;
38
TEST(HpkeUtilBoringSslTest,ValidParamsFromProto)39 TEST(HpkeUtilBoringSslTest, ValidParamsFromProto) {
40 google::crypto::tink::HpkeParams params =
41 CreateHpkeParams(google::crypto::tink::HpkeKem::DHKEM_X25519_HKDF_SHA256,
42 google::crypto::tink::HpkeKdf::HKDF_SHA256,
43 google::crypto::tink::HpkeAead::AES_256_GCM);
44
45 util::StatusOr<const EVP_HPKE_KEM *> kem_from_enum =
46 KemParam(google::crypto::tink::HpkeKem::DHKEM_X25519_HKDF_SHA256);
47 ASSERT_THAT(kem_from_enum, IsOk());
48 EXPECT_THAT(EVP_HPKE_KEM_id(*kem_from_enum),
49 Eq(EVP_HPKE_DHKEM_X25519_HKDF_SHA256));
50
51 util::StatusOr<const EVP_HPKE_KEM *> kem_from_proto = KemParam(params);
52 ASSERT_THAT(kem_from_proto, IsOk());
53 EXPECT_THAT(EVP_HPKE_KEM_id(*kem_from_proto),
54 Eq(EVP_HPKE_DHKEM_X25519_HKDF_SHA256));
55
56 util::StatusOr<const EVP_HPKE_KDF *> kdf = KdfParam(params);
57 ASSERT_THAT(kdf, IsOk());
58 EXPECT_THAT(EVP_HPKE_KDF_id(*kdf), Eq(EVP_HPKE_HKDF_SHA256));
59
60 util::StatusOr<const EVP_HPKE_AEAD *> aead = AeadParam(params);
61 ASSERT_THAT(aead, IsOk());
62 EXPECT_THAT(EVP_HPKE_AEAD_id(*aead), Eq(EVP_HPKE_AES_256_GCM));
63 }
64
TEST(HpkeUtilBoringSslTest,ValidParamsFromStruct)65 TEST(HpkeUtilBoringSslTest, ValidParamsFromStruct) {
66 HpkeParams params = {HpkeKem::kX25519HkdfSha256, HpkeKdf::kHkdfSha256,
67 HpkeAead::kAes256Gcm};
68
69 util::StatusOr<const EVP_HPKE_KEM *> kem_from_proto = KemParam(params);
70 ASSERT_THAT(kem_from_proto, IsOk());
71 EXPECT_THAT(EVP_HPKE_KEM_id(*kem_from_proto),
72 Eq(EVP_HPKE_DHKEM_X25519_HKDF_SHA256));
73
74 util::StatusOr<const EVP_HPKE_KDF *> kdf = KdfParam(params);
75 ASSERT_THAT(kdf, IsOk());
76 EXPECT_THAT(EVP_HPKE_KDF_id(*kdf), Eq(EVP_HPKE_HKDF_SHA256));
77
78 util::StatusOr<const EVP_HPKE_AEAD *> aead = AeadParam(params);
79 ASSERT_THAT(aead, IsOk());
80 EXPECT_THAT(EVP_HPKE_AEAD_id(*aead), Eq(EVP_HPKE_AES_256_GCM));
81 }
82
TEST(HpkeUtilBoringSslTest,UnknownKemParamFromProto)83 TEST(HpkeUtilBoringSslTest, UnknownKemParamFromProto) {
84 google::crypto::tink::HpkeParams params =
85 CreateHpkeParams(google::crypto::tink::HpkeKem::KEM_UNKNOWN,
86 google::crypto::tink::HpkeKdf::HKDF_SHA256,
87 google::crypto::tink::HpkeAead::AES_256_GCM);
88 EXPECT_THAT(KemParam(params), Not(IsOk()));
89 EXPECT_THAT(KdfParam(params), IsOk());
90 EXPECT_THAT(AeadParam(params), IsOk());
91 }
92
TEST(HpkeUtilBoringSslTest,UnknownKemParamFromStruct)93 TEST(HpkeUtilBoringSslTest, UnknownKemParamFromStruct) {
94 HpkeParams params = {HpkeKem::kUnknownKem, HpkeKdf::kHkdfSha256,
95 HpkeAead::kAes256Gcm};
96 EXPECT_THAT(KemParam(params), Not(IsOk()));
97 EXPECT_THAT(KdfParam(params), IsOk());
98 EXPECT_THAT(AeadParam(params), IsOk());
99 }
100
TEST(HpkeUtilBoringSslTest,UnknownKdfParamFromProto)101 TEST(HpkeUtilBoringSslTest, UnknownKdfParamFromProto) {
102 google::crypto::tink::HpkeParams params =
103 CreateHpkeParams(google::crypto::tink::HpkeKem::DHKEM_X25519_HKDF_SHA256,
104 google::crypto::tink::HpkeKdf::KDF_UNKNOWN,
105 google::crypto::tink::HpkeAead::AES_256_GCM);
106 EXPECT_THAT(KemParam(params), IsOk());
107 EXPECT_THAT(KdfParam(params), Not(IsOk()));
108 EXPECT_THAT(AeadParam(params), IsOk());
109 }
110
TEST(HpkeUtilBoringSslTest,UnknownKdfParamFromStruct)111 TEST(HpkeUtilBoringSslTest, UnknownKdfParamFromStruct) {
112 HpkeParams params = {HpkeKem::kX25519HkdfSha256, HpkeKdf::kUnknownKdf,
113 HpkeAead::kAes256Gcm};
114 EXPECT_THAT(KemParam(params), IsOk());
115 EXPECT_THAT(KdfParam(params), Not(IsOk()));
116 EXPECT_THAT(AeadParam(params), IsOk());
117 }
118
TEST(HpkeUtilBoringSslTest,UnknownAeadParamFromProto)119 TEST(HpkeUtilBoringSslTest, UnknownAeadParamFromProto) {
120 google::crypto::tink::HpkeParams params =
121 CreateHpkeParams(google::crypto::tink::HpkeKem::DHKEM_X25519_HKDF_SHA256,
122 google::crypto::tink::HpkeKdf::HKDF_SHA256,
123 google::crypto::tink::HpkeAead::AEAD_UNKNOWN);
124 EXPECT_THAT(KemParam(params), IsOk());
125 EXPECT_THAT(KdfParam(params), IsOk());
126 EXPECT_THAT(AeadParam(params), Not(IsOk()));
127 }
128
TEST(HpkeUtilBoringSslTest,UnknownAeadParamFromStruct)129 TEST(HpkeUtilBoringSslTest, UnknownAeadParamFromStruct) {
130 HpkeParams params = {HpkeKem::kX25519HkdfSha256, HpkeKdf::kHkdfSha256,
131 HpkeAead::kUnknownAead};
132 EXPECT_THAT(KemParam(params), IsOk());
133 EXPECT_THAT(KdfParam(params), IsOk());
134 EXPECT_THAT(AeadParam(params), Not(IsOk()));
135 }
136
137 } // namespace
138 } // namespace internal
139 } // namespace tink
140 } // namespace crypto
141