• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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