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/experimental/pqcrypto/signature/sphincs_key_template.h"
18
19 #include <memory>
20 #include <string>
21
22 #include "gmock/gmock.h"
23 #include "gtest/gtest.h"
24 #include "tink/core/key_manager_impl.h"
25 #include "tink/core/private_key_manager_impl.h"
26 #include "tink/experimental/pqcrypto/signature/sphincs_sign_key_manager.h"
27 #include "tink/experimental/pqcrypto/signature/sphincs_verify_key_manager.h"
28 #include "tink/util/test_matchers.h"
29 #include "proto/tink.pb.h"
30
31 extern "C" {
32 #include "third_party/pqclean/crypto_sign/sphincs-haraka-128f-robust/api.h"
33 #include "third_party/pqclean/crypto_sign/sphincs-haraka-128f-simple/api.h"
34 #include "third_party/pqclean/crypto_sign/sphincs-haraka-128s-robust/api.h"
35 #include "third_party/pqclean/crypto_sign/sphincs-haraka-128s-simple/api.h"
36 #include "third_party/pqclean/crypto_sign/sphincs-haraka-192f-robust/api.h"
37 #include "third_party/pqclean/crypto_sign/sphincs-haraka-192f-simple/api.h"
38 #include "third_party/pqclean/crypto_sign/sphincs-haraka-192s-robust/api.h"
39 #include "third_party/pqclean/crypto_sign/sphincs-haraka-192s-simple/api.h"
40 #include "third_party/pqclean/crypto_sign/sphincs-haraka-256f-robust/api.h"
41 #include "third_party/pqclean/crypto_sign/sphincs-haraka-256f-simple/api.h"
42 #include "third_party/pqclean/crypto_sign/sphincs-haraka-256s-robust/api.h"
43 #include "third_party/pqclean/crypto_sign/sphincs-haraka-256s-simple/api.h"
44 #include "third_party/pqclean/crypto_sign/sphincs-sha256-128f-robust/api.h"
45 #include "third_party/pqclean/crypto_sign/sphincs-sha256-128f-simple/api.h"
46 #include "third_party/pqclean/crypto_sign/sphincs-sha256-128s-robust/api.h"
47 #include "third_party/pqclean/crypto_sign/sphincs-sha256-128s-simple/api.h"
48 #include "third_party/pqclean/crypto_sign/sphincs-sha256-192f-robust/api.h"
49 #include "third_party/pqclean/crypto_sign/sphincs-sha256-192f-simple/api.h"
50 #include "third_party/pqclean/crypto_sign/sphincs-sha256-192s-robust/api.h"
51 #include "third_party/pqclean/crypto_sign/sphincs-sha256-192s-simple/api.h"
52 #include "third_party/pqclean/crypto_sign/sphincs-sha256-256f-robust/api.h"
53 #include "third_party/pqclean/crypto_sign/sphincs-sha256-256f-simple/api.h"
54 #include "third_party/pqclean/crypto_sign/sphincs-sha256-256s-robust/api.h"
55 #include "third_party/pqclean/crypto_sign/sphincs-sha256-256s-simple/api.h"
56 #include "third_party/pqclean/crypto_sign/sphincs-shake256-128f-robust/api.h"
57 #include "third_party/pqclean/crypto_sign/sphincs-shake256-128f-simple/api.h"
58 #include "third_party/pqclean/crypto_sign/sphincs-shake256-128s-robust/api.h"
59 #include "third_party/pqclean/crypto_sign/sphincs-shake256-128s-simple/api.h"
60 #include "third_party/pqclean/crypto_sign/sphincs-shake256-192f-robust/api.h"
61 #include "third_party/pqclean/crypto_sign/sphincs-shake256-192f-simple/api.h"
62 #include "third_party/pqclean/crypto_sign/sphincs-shake256-192s-robust/api.h"
63 #include "third_party/pqclean/crypto_sign/sphincs-shake256-192s-simple/api.h"
64 #include "third_party/pqclean/crypto_sign/sphincs-shake256-256f-robust/api.h"
65 #include "third_party/pqclean/crypto_sign/sphincs-shake256-256f-simple/api.h"
66 #include "third_party/pqclean/crypto_sign/sphincs-shake256-256s-robust/api.h"
67 #include "third_party/pqclean/crypto_sign/sphincs-shake256-256s-simple/api.h"
68 }
69
70 namespace crypto {
71 namespace tink {
72 namespace {
73
74 using ::crypto::tink::test::IsOk;
75 using google::crypto::tink::KeyTemplate;
76 using google::crypto::tink::OutputPrefixType;
77 using ::google::crypto::tink::SphincsHashType;
78 using ::google::crypto::tink::SphincsKeyFormat;
79 using ::google::crypto::tink::SphincsParams;
80 using ::google::crypto::tink::SphincsPrivateKey;
81 using ::google::crypto::tink::SphincsSignatureType;
82 using ::google::crypto::tink::SphincsVariant;
83
84 struct SphincsTestCase {
85 std::string test_name;
86 SphincsHashType hash_type;
87 SphincsVariant variant;
88 SphincsSignatureType sig_length_type;
89 int32_t private_key_size;
90 KeyTemplate key_template;
91 };
92
93 using SphincsKeyTemplateTest = testing::TestWithParam<SphincsTestCase>;
94
TEST_P(SphincsKeyTemplateTest,CheckKeyTemplateValid)95 TEST_P(SphincsKeyTemplateTest, CheckKeyTemplateValid) {
96 std::string type_url =
97 "type.googleapis.com/google.crypto.tink.SphincsPrivateKey";
98
99 const SphincsTestCase& test_case = GetParam();
100 EXPECT_EQ(type_url, test_case.key_template.type_url());
101 EXPECT_EQ(OutputPrefixType::TINK,
102 test_case.key_template.output_prefix_type());
103
104 SphincsKeyFormat key_format;
105 EXPECT_TRUE(key_format.ParseFromString(test_case.key_template.value()));
106 EXPECT_EQ(test_case.hash_type, key_format.params().hash_type());
107 EXPECT_EQ(test_case.variant, key_format.params().variant());
108 EXPECT_EQ(test_case.sig_length_type, key_format.params().sig_length_type());
109 EXPECT_EQ(test_case.private_key_size, key_format.params().key_size());
110 }
111
TEST_P(SphincsKeyTemplateTest,SameReference)112 TEST_P(SphincsKeyTemplateTest, SameReference) {
113 const KeyTemplate& key_template = GetParam().key_template;
114 const KeyTemplate& key_template_2 = GetParam().key_template;
115
116 EXPECT_EQ(&key_template, &key_template_2);
117 }
118
TEST_P(SphincsKeyTemplateTest,KeyManagerCompatibility)119 TEST_P(SphincsKeyTemplateTest, KeyManagerCompatibility) {
120 SphincsSignKeyManager sign_key_manager;
121 SphincsVerifyKeyManager verify_key_manager;
122 std::unique_ptr<KeyManager<PublicKeySign>> key_manager =
123 internal::MakePrivateKeyManager<PublicKeySign>(&sign_key_manager,
124 &verify_key_manager);
125 SphincsKeyFormat key_format;
126 const SphincsTestCase& test_case = GetParam();
127
128 SphincsParams* params = key_format.mutable_params();
129 params->set_key_size(test_case.private_key_size);
130 params->set_hash_type(test_case.hash_type);
131 params->set_variant(test_case.variant);
132 params->set_sig_length_type(test_case.sig_length_type);
133
134 util::StatusOr<std::unique_ptr<portable_proto::MessageLite>> new_key_result =
135 key_manager->get_key_factory().NewKey(key_format);
136 EXPECT_THAT(new_key_result, IsOk());
137 }
138
139 INSTANTIATE_TEST_SUITE_P(
140 SphincsKeyTemplateTests, SphincsKeyTemplateTest,
141 testing::ValuesIn<SphincsTestCase>(
142 {{"SPHINCSHARAKA128FROBUST", SphincsHashType::HARAKA,
143 SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING,
144 PQCLEAN_SPHINCSHARAKA128FROBUST_CRYPTO_SECRETKEYBYTES,
145 Sphincs_Haraka_128_F_Robust_KeyTemplate()},
146 {"SPHINCSHARAKA128SROBUST", SphincsHashType::HARAKA,
147 SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE,
148 PQCLEAN_SPHINCSHARAKA128SROBUST_CRYPTO_SECRETKEYBYTES,
149 Sphincs_Haraka_128_S_Robust_KeyTemplate()},
150 {"SPHINCSHARAKA128FSIMPLE", SphincsHashType::HARAKA,
151 SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING,
152 PQCLEAN_SPHINCSHARAKA128FSIMPLE_CRYPTO_SECRETKEYBYTES,
153 Sphincs_Haraka_128_F_Simple_KeyTemplate()},
154 {"SPHINCSHARAKA128SSIMPLE", SphincsHashType::HARAKA,
155 SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE,
156 PQCLEAN_SPHINCSHARAKA128SSIMPLE_CRYPTO_SECRETKEYBYTES,
157 Sphincs_Haraka_128_S_Simple_KeyTemplate()},
158
159 {"SPHINCSHARAKA192FROBUST", SphincsHashType::HARAKA,
160 SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING,
161 PQCLEAN_SPHINCSHARAKA192FROBUST_CRYPTO_SECRETKEYBYTES,
162 Sphincs_Haraka_192_F_Robust_KeyTemplate()},
163 {"SPHINCSHARAKA192SROBUST", SphincsHashType::HARAKA,
164 SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE,
165 PQCLEAN_SPHINCSHARAKA192SROBUST_CRYPTO_SECRETKEYBYTES,
166 Sphincs_Haraka_192_S_Robust_KeyTemplate()},
167 {"SPHINCSHARAKA192FSIMPLE", SphincsHashType::HARAKA,
168 SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING,
169 PQCLEAN_SPHINCSHARAKA192FSIMPLE_CRYPTO_SECRETKEYBYTES,
170 Sphincs_Haraka_192_F_Simple_KeyTemplate()},
171 {"SPHINCSHARAKA192SSIMPLE", SphincsHashType::HARAKA,
172 SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE,
173 PQCLEAN_SPHINCSHARAKA192SSIMPLE_CRYPTO_SECRETKEYBYTES,
174 Sphincs_Haraka_192_S_Simple_KeyTemplate()},
175
176 {"SPHINCSHARAKA256FROBUST", SphincsHashType::HARAKA,
177 SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING,
178 PQCLEAN_SPHINCSHARAKA256FROBUST_CRYPTO_SECRETKEYBYTES,
179 Sphincs_Haraka_256_F_Robust_KeyTemplate()},
180 {"SPHINCSHARAKA256SROBUST", SphincsHashType::HARAKA,
181 SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE,
182 PQCLEAN_SPHINCSHARAKA256SROBUST_CRYPTO_SECRETKEYBYTES,
183 Sphincs_Haraka_256_S_Robust_KeyTemplate()},
184 {"SPHINCSHARAKA256FSIMPLE", SphincsHashType::HARAKA,
185 SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING,
186 PQCLEAN_SPHINCSHARAKA256FSIMPLE_CRYPTO_SECRETKEYBYTES,
187 Sphincs_Haraka_256_F_Simple_KeyTemplate()},
188 {"SPHINCSHARAKA256SSIMPLE", SphincsHashType::HARAKA,
189 SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE,
190 PQCLEAN_SPHINCSHARAKA256SSIMPLE_CRYPTO_SECRETKEYBYTES,
191 Sphincs_Haraka_256_S_Simple_KeyTemplate()},
192
193 {"SPHINCSSHA256128FROBUST", SphincsHashType::SHA256,
194 SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING,
195 PQCLEAN_SPHINCSSHA256128FROBUST_CRYPTO_SECRETKEYBYTES,
196 Sphincs_Sha256_128_F_Robust_KeyTemplate()},
197 {"SPHINCSSHA256128SROBUST", SphincsHashType::SHA256,
198 SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE,
199 PQCLEAN_SPHINCSSHA256128SROBUST_CRYPTO_SECRETKEYBYTES,
200 Sphincs_Sha256_128_S_Robust_KeyTemplate()},
201 {"SPHINCSSHA256128FSIMPLE", SphincsHashType::SHA256,
202 SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING,
203 PQCLEAN_SPHINCSSHA256128FSIMPLE_CRYPTO_SECRETKEYBYTES,
204 Sphincs_Sha256_128_F_Simple_KeyTemplate()},
205 {"SPHINCSSHA256128SSIMPLE", SphincsHashType::SHA256,
206 SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE,
207 PQCLEAN_SPHINCSSHA256128SSIMPLE_CRYPTO_SECRETKEYBYTES,
208 Sphincs_Sha256_128_S_Simple_KeyTemplate()},
209
210 {"SPHINCSSHA256192FROBUST", SphincsHashType::SHA256,
211 SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING,
212 PQCLEAN_SPHINCSSHA256192FROBUST_CRYPTO_SECRETKEYBYTES,
213 Sphincs_Sha256_192_F_Robust_KeyTemplate()},
214 {"SPHINCSSHA256192SROBUST", SphincsHashType::SHA256,
215 SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE,
216 PQCLEAN_SPHINCSSHA256192SROBUST_CRYPTO_SECRETKEYBYTES,
217 Sphincs_Sha256_192_S_Robust_KeyTemplate()},
218 {"SPHINCSSHA256192FSIMPLE", SphincsHashType::SHA256,
219 SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING,
220 PQCLEAN_SPHINCSSHA256192FSIMPLE_CRYPTO_SECRETKEYBYTES,
221 Sphincs_Sha256_192_F_Simple_KeyTemplate()},
222 {"SPHINCSSHA256192SSIMPLE", SphincsHashType::SHA256,
223 SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE,
224 PQCLEAN_SPHINCSSHA256192SSIMPLE_CRYPTO_SECRETKEYBYTES,
225 Sphincs_Sha256_192_S_Simple_KeyTemplate()},
226
227 {"SPHINCSSHA256256FROBUST", SphincsHashType::SHA256,
228 SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING,
229 PQCLEAN_SPHINCSSHA256256FROBUST_CRYPTO_SECRETKEYBYTES,
230 Sphincs_Sha256_256_F_Robust_KeyTemplate()},
231 {"SPHINCSSHA256256SROBUST", SphincsHashType::SHA256,
232 SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE,
233 PQCLEAN_SPHINCSSHA256256SROBUST_CRYPTO_SECRETKEYBYTES,
234 Sphincs_Sha256_256_S_Robust_KeyTemplate()},
235 {"SPHINCSSHA256256FSIMPLE", SphincsHashType::SHA256,
236 SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING,
237 PQCLEAN_SPHINCSSHA256256FSIMPLE_CRYPTO_SECRETKEYBYTES,
238 Sphincs_Sha256_256_F_Simple_KeyTemplate()},
239 {"SPHINCSSHA256256SSIMPLE", SphincsHashType::SHA256,
240 SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE,
241 PQCLEAN_SPHINCSSHA256256SSIMPLE_CRYPTO_SECRETKEYBYTES,
242 Sphincs_Sha256_256_S_Simple_KeyTemplate()},
243
244 {"SPHINCSSHAKE256128FROBUST", SphincsHashType::SHAKE256,
245 SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING,
246 PQCLEAN_SPHINCSSHAKE256128FROBUST_CRYPTO_SECRETKEYBYTES,
247 Sphincs_Shake256_128_F_Robust_KeyTemplate()},
248 {"SPHINCSSHAKE256128SROBUST", SphincsHashType::SHAKE256,
249 SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE,
250 PQCLEAN_SPHINCSSHAKE256128SROBUST_CRYPTO_SECRETKEYBYTES,
251 Sphincs_Shake256_128_S_Robust_KeyTemplate()},
252 {"SPHINCSSHAKE256128FSIMPLE", SphincsHashType::SHAKE256,
253 SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING,
254 PQCLEAN_SPHINCSSHAKE256128FSIMPLE_CRYPTO_SECRETKEYBYTES,
255 Sphincs_Shake256_128_F_Simple_KeyTemplate()},
256 {"SPHINCSSHAKE256128SSIMPLE", SphincsHashType::SHAKE256,
257 SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE,
258 PQCLEAN_SPHINCSSHAKE256128SSIMPLE_CRYPTO_SECRETKEYBYTES,
259 Sphincs_Shake256_128_S_Simple_KeyTemplate()},
260
261 {"SPHINCSSHAKE256192FROBUST", SphincsHashType::SHAKE256,
262 SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING,
263 PQCLEAN_SPHINCSSHAKE256192FROBUST_CRYPTO_SECRETKEYBYTES,
264 Sphincs_Shake256_192_F_Robust_KeyTemplate()},
265 {"SPHINCSSHAKE256192SROBUST", SphincsHashType::SHAKE256,
266 SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE,
267 PQCLEAN_SPHINCSSHAKE256192SROBUST_CRYPTO_SECRETKEYBYTES,
268 Sphincs_Shake256_192_S_Robust_KeyTemplate()},
269 {"SPHINCSSHAKE256192FSIMPLE", SphincsHashType::SHAKE256,
270 SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING,
271 PQCLEAN_SPHINCSSHAKE256192FSIMPLE_CRYPTO_SECRETKEYBYTES,
272 Sphincs_Shake256_192_F_Simple_KeyTemplate()},
273 {"SPHINCSSHAKE256192SSIMPLE", SphincsHashType::SHAKE256,
274 SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE,
275 PQCLEAN_SPHINCSSHAKE256192SSIMPLE_CRYPTO_SECRETKEYBYTES,
276 Sphincs_Shake256_192_S_Simple_KeyTemplate()},
277
278 {"SPHINCSSHAKE256256FROBUST", SphincsHashType::SHAKE256,
279 SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING,
280 PQCLEAN_SPHINCSSHAKE256256FROBUST_CRYPTO_SECRETKEYBYTES,
281 Sphincs_Shake256_256_F_Robust_KeyTemplate()},
282 {"SPHINCSSHAKE256256SROBUST", SphincsHashType::SHAKE256,
283 SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE,
284 PQCLEAN_SPHINCSSHAKE256256SROBUST_CRYPTO_SECRETKEYBYTES,
285 Sphincs_Shake256_256_S_Robust_KeyTemplate()},
286 {"SPHINCSSHAKE256256FSIMPLE", SphincsHashType::SHAKE256,
287 SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING,
288 PQCLEAN_SPHINCSSHAKE256256FSIMPLE_CRYPTO_SECRETKEYBYTES,
289 Sphincs_Shake256_256_F_Simple_KeyTemplate()},
290 {"SPHINCSSHAKE256256SSIMPLE", SphincsHashType::SHAKE256,
291 SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE,
292 PQCLEAN_SPHINCSSHAKE256256SSIMPLE_CRYPTO_SECRETKEYBYTES,
293 Sphincs_Shake256_256_S_Simple_KeyTemplate()}}),
__anona6e7cd3c0202(const testing::TestParamInfo<SphincsKeyTemplateTest::ParamType>& info) 294 [](const testing::TestParamInfo<SphincsKeyTemplateTest::ParamType>& info) {
295 return info.param.test_name;
296 });
297
298 } // namespace
299 } // namespace tink
300 } // namespace crypto
301