diff options
author | Tink Team <tink-dev@google.com> | 2021-09-03 03:50:31 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2021-09-03 03:51:10 -0700 |
commit | 9ce4e40e76dbbcc310cdccf90dd236560996a910 (patch) | |
tree | da8ff6b6ffc1ff576870a43cfe732b7725ee1b3b /cc/experimental | |
parent | f2e7ea8cfdfaa035e4742615de0482730461fef9 (diff) | |
download | tink-9ce4e40e76dbbcc310cdccf90dd236560996a910.tar.gz |
Create proto file for the Sphincs Digital Signature Algorithm and add ProtoToSubtle/SubtleToProto functions for corresponding enums.
PiperOrigin-RevId: 394650844
Diffstat (limited to 'cc/experimental')
10 files changed, 428 insertions, 124 deletions
diff --git a/cc/experimental/pqcrypto/signature/subtle/sphincs_sign.cc b/cc/experimental/pqcrypto/signature/subtle/sphincs_sign.cc index 4ee019276..9aa46c167 100644 --- a/cc/experimental/pqcrypto/signature/subtle/sphincs_sign.cc +++ b/cc/experimental/pqcrypto/signature/subtle/sphincs_sign.cc @@ -41,6 +41,11 @@ util::StatusOr<std::unique_ptr<PublicKeySign>> SphincsSign::New( return key_size; } + util::Status valid_parameters = ValidateParams(key.GetParams()); + if (!valid_parameters.ok()) { + return valid_parameters; + } + return {absl::WrapUnique(new SphincsSign(std::move(key)))}; } diff --git a/cc/experimental/pqcrypto/signature/subtle/sphincs_sign_test.cc b/cc/experimental/pqcrypto/signature/subtle/sphincs_sign_test.cc index 7ee91e6b6..c338de236 100644 --- a/cc/experimental/pqcrypto/signature/subtle/sphincs_sign_test.cc +++ b/cc/experimental/pqcrypto/signature/subtle/sphincs_sign_test.cc @@ -79,7 +79,7 @@ struct SphincsTestCase { std::string test_name; SphincsHashType hash_type; SphincsVariant variant; - SphincsSignatureLengthType sig_length_type; + SphincsSignatureType sig_length_type; int32_t private_key_size; int32_t signature_length; }; @@ -197,155 +197,155 @@ INSTANTIATE_TEST_SUITE_P( SphincsSignTests, SphincsSignTest, testing::ValuesIn<SphincsTestCase>( {{"SPHINCSHARAKA128FROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA128FROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA128FROBUST_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA128SROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA128SROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA128SROBUST_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA128FSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA128FSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA128FSIMPLE_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA128SSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA128SSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA128SSIMPLE_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA192FROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA192FROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA192FROBUST_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA192SROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA192SROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA192SROBUST_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA192FSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA192FSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA192FSIMPLE_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA192SSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA192SSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA192SSIMPLE_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA256FROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA256FROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA256FROBUST_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA256SROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA256SROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA256SROBUST_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA256FSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA256FSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA256FSIMPLE_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA256SSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA256SSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA256SSIMPLE_AESNI_CRYPTO_BYTES}, {"SPHINCSSHA256128FROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256128FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256128FROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256128SROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256128SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256128SROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256128FSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256128FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256128FSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256128SSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256128SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256128SSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256192FROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256192FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256192FROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256192SROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256192SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256192SROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256192FSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256192FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256192FSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256192SSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256192SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256192SSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256256FROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256256FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256256FROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256256SROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256256SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256256SROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256256FSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256256FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256256FSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256256SSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256256SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256256SSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256128FROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256128FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256128FROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256128SROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256128SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256128SROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256128FSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256128FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256128FSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256128SSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256192FROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256192FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256192FROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256192SROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256192SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256192SROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256192FSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256192FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256192FSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256192SSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256192SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256192SSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256256FROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256256FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256256FROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256256SROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256256SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256256SROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256256FSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256256FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256256FSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256256SSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256256SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256256SSIMPLE_AVX2_CRYPTO_BYTES}}), [](const testing::TestParamInfo<SphincsSignTest::ParamType>& info) { diff --git a/cc/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils.cc b/cc/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils.cc index 956c5500b..90efdf7f0 100644 --- a/cc/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils.cc +++ b/cc/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils.cc @@ -23,6 +23,7 @@ #include "absl/strings/str_format.h" #include "tink/experimental/pqcrypto/signature/subtle/sphincs_helper_pqclean.h" #include "tink/util/secret_data.h" +#include "tink/util/status.h" #include "tink/util/statusor.h" namespace crypto { @@ -31,16 +32,16 @@ namespace subtle { crypto::tink::util::StatusOr<SphincsKeyPair> GenerateSphincsKeyPair( SphincsParamsPqclean params) { - util::Status key_size_status = - ValidatePrivateKeySize(params.private_key_size); - if (!key_size_status.ok()) { - return key_size_status; + // Check if parameters are valid. + util::Status valid_parameters = ValidateParams(params); + if (!valid_parameters.ok()) { + return valid_parameters; } - util::StatusOr<int32> key_size_index_or = + util::StatusOr<int32> key_size_index = SphincsKeySizeToIndex(params.private_key_size); - if (!key_size_index_or.ok()) { - return key_size_index_or.status(); + if (!key_size_index.ok()) { + return key_size_index.status(); } std::string public_key; @@ -48,8 +49,8 @@ crypto::tink::util::StatusOr<SphincsKeyPair> GenerateSphincsKeyPair( private_key.resize(params.private_key_size); const SphincsHelperPqclean &sphincs_helper_pqclean = - GetSphincsHelperPqclean(params.hash_type, params.variant, - *key_size_index_or, params.sig_length_type); + GetSphincsHelperPqclean(params.hash_type, params.variant, *key_size_index, + params.sig_length_type); public_key.resize(sphincs_helper_pqclean.GetPublicKeySize()); if (0 != sphincs_helper_pqclean.Keygen( @@ -112,6 +113,42 @@ crypto::tink::util::StatusOr<int32> SphincsKeySizeToIndex(int32 key_size) { } } +crypto::tink::util::Status ValidateParams(SphincsParamsPqclean params) { + switch (params.hash_type) { + case SphincsHashType::HARAKA: + case SphincsHashType::SHA256: + case SphincsHashType::SHAKE256: { + break; + } + default: { + return util::Status(util::error::INVALID_ARGUMENT, "Invalid hash type"); + } + } + + switch (params.variant) { + case SphincsVariant::ROBUST: + case SphincsVariant::SIMPLE: { + break; + } + default: { + return util::Status(util::error::INVALID_ARGUMENT, "Invalid variant"); + } + } + + switch (params.sig_length_type) { + case SphincsSignatureType::FAST_SIGNING: + case SphincsSignatureType::SMALL_SIGNATURE: { + break; + } + default: { + return util::Status(util::error::INVALID_ARGUMENT, + "Invalid signature type"); + } + } + + return ValidatePrivateKeySize(params.private_key_size); +} + } // namespace subtle } // namespace tink } // namespace crypto diff --git a/cc/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils.h b/cc/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils.h index 38f5f0fc5..62670f948 100644 --- a/cc/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils.h +++ b/cc/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils.h @@ -43,22 +43,25 @@ enum SphincsHashType { HARAKA = 0, SHA256 = 1, SHAKE256 = 2, + UNKNOWN_HASH_TYPE = 3, }; enum SphincsVariant { ROBUST = 0, SIMPLE = 1, + UNKNOWN_VARIANT = 3, }; -enum SphincsSignatureLengthType { - F = 0, - S = 1, +enum SphincsSignatureType { + FAST_SIGNING = 0, + SMALL_SIGNATURE = 1, + UNKNOWN_SIG_TYPE = 3, }; struct SphincsParamsPqclean { SphincsHashType hash_type; SphincsVariant variant; - SphincsSignatureLengthType sig_length_type; + SphincsSignatureType sig_length_type; int32 private_key_size; }; @@ -129,6 +132,10 @@ crypto::tink::util::Status ValidatePrivateKeySize(int32 key_size); // Validates whether the public key size is safe to use for sphincs signature. crypto::tink::util::Status ValidatePublicKeySize(int32 key_size); +// Validates whether the parameters are safe to use for sphincs signature. +crypto::tink::util::Status ValidateParams(SphincsParamsPqclean params); + + // Convert the sphincs private key size to the appropiate index in the // pqclean functions array. crypto::tink::util::StatusOr<int32> SphincsKeySizeToIndex(int32 key_size); diff --git a/cc/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils_test.cc b/cc/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils_test.cc index 928b77d07..a55ccec4f 100644 --- a/cc/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils_test.cc +++ b/cc/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils_test.cc @@ -77,7 +77,7 @@ struct SphincsUtilsTestCase { std::string test_name; SphincsHashType hash_type; SphincsVariant variant; - SphincsSignatureLengthType sig_length_type; + SphincsSignatureType sig_length_type; int32_t private_key_size; int32_t public_key_size; }; @@ -148,159 +148,205 @@ TEST(SphincsUtilsTest, InvalidPublicKeySize) { } } +TEST_P(SphincsUtilsTest, ValidParams) { + const SphincsUtilsTestCase& test_case = GetParam(); + + SphincsParamsPqclean params = { + .hash_type = test_case.hash_type, + .variant = test_case.variant, + .sig_length_type = test_case.sig_length_type, + .private_key_size = test_case.private_key_size, + }; + + EXPECT_TRUE(ValidateParams(params).ok()); +} + +TEST(SphincsUtilsTest, InvalidHashType) { + SphincsParamsPqclean params = { + .hash_type = SphincsHashType::UNKNOWN_HASH_TYPE, + .variant = SphincsVariant::ROBUST, + .sig_length_type = SphincsSignatureType::FAST_SIGNING, + .private_key_size = kSphincsPrivateKeySize64, + }; + + EXPECT_FALSE(ValidateParams(params).ok()); +} + +TEST(SphincsUtilsTest, InvalidVariant) { + SphincsParamsPqclean params = { + .hash_type = SphincsHashType::HARAKA, + .variant = SphincsVariant::UNKNOWN_VARIANT, + .sig_length_type = SphincsSignatureType::FAST_SIGNING, + .private_key_size = kSphincsPrivateKeySize64, + }; + + EXPECT_FALSE(ValidateParams(params).ok()); +} + +TEST(SphincsUtilsTest, InvalidSignatureType) { + SphincsParamsPqclean params = { + .hash_type = SphincsHashType::HARAKA, + .variant = SphincsVariant::ROBUST, + .sig_length_type = SphincsSignatureType::UNKNOWN_SIG_TYPE, + .private_key_size = kSphincsPrivateKeySize64, + }; + + EXPECT_FALSE(ValidateParams(params).ok()); +} + INSTANTIATE_TEST_SUITE_P( SphincsUtilsTests, SphincsUtilsTest, testing::ValuesIn<SphincsUtilsTestCase>( {{"SPHINCSHARAKA128FROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA128FROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA128FROBUST_AESNI_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSHARAKA128SROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA128SROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA128SROBUST_AESNI_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSHARAKA128FSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA128FSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA128FSIMPLE_AESNI_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSHARAKA128SSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA128SSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA128SSIMPLE_AESNI_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSHARAKA192FROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA192FROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA192FROBUST_AESNI_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSHARAKA192SROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA192SROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA192SROBUST_AESNI_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSHARAKA192FSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA192FSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA192FSIMPLE_AESNI_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSHARAKA192SSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA192SSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA192SSIMPLE_AESNI_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSHARAKA256FROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA256FROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA256FROBUST_AESNI_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSHARAKA256SROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA256SROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA256SROBUST_AESNI_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSHARAKA256FSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA256FSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA256FSIMPLE_AESNI_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSHARAKA256SSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA256SSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA256SSIMPLE_AESNI_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHA256128FROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256128FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256128FROBUST_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHA256128SROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256128SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256128SROBUST_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHA256128FSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256128FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256128FSIMPLE_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHA256128SSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256128SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256128SSIMPLE_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHA256192FROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256192FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256192FROBUST_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHA256192SROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256192SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256192SROBUST_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHA256192FSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256192FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256192FSIMPLE_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHA256192SSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256192SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256192SSIMPLE_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHA256256FROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256256FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256256FROBUST_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHA256256SROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256256SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256256SROBUST_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHA256256FSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256256FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256256FSIMPLE_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHA256256SSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256256SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256256SSIMPLE_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHAKE256128FROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256128FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256128FROBUST_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHAKE256128SROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256128SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256128SROBUST_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHAKE256128FSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256128FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256128FSIMPLE_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHAKE256128SSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHAKE256192FROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256192FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256192FROBUST_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHAKE256192SROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256192SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256192SROBUST_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHAKE256192FSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256192FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256192FSIMPLE_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHAKE256192SSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256192SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256192SSIMPLE_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHAKE256256FROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256256FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256256FROBUST_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHAKE256256SROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256256SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256256SROBUST_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHAKE256256FSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256256FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256256FSIMPLE_AVX2_CRYPTO_PUBLICKEYBYTES}, {"SPHINCSSHAKE256256SSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256256SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256256SSIMPLE_AVX2_CRYPTO_PUBLICKEYBYTES}}), [](const testing::TestParamInfo<SphincsUtilsTest::ParamType>& info) { diff --git a/cc/experimental/pqcrypto/signature/subtle/sphincs_verify.cc b/cc/experimental/pqcrypto/signature/subtle/sphincs_verify.cc index 2906601db..77c55f006 100644 --- a/cc/experimental/pqcrypto/signature/subtle/sphincs_verify.cc +++ b/cc/experimental/pqcrypto/signature/subtle/sphincs_verify.cc @@ -41,6 +41,11 @@ util::StatusOr<std::unique_ptr<PublicKeyVerify>> SphincsVerify::New( return key_size; } + util::Status valid_parameters = ValidateParams(public_key.GetParams()); + if (!valid_parameters.ok()) { + return valid_parameters; + } + return {absl::WrapUnique<SphincsVerify>( new SphincsVerify(std::move(public_key)))}; } diff --git a/cc/experimental/pqcrypto/signature/subtle/sphincs_verify_test.cc b/cc/experimental/pqcrypto/signature/subtle/sphincs_verify_test.cc index 869c314df..660a2a5d8 100644 --- a/cc/experimental/pqcrypto/signature/subtle/sphincs_verify_test.cc +++ b/cc/experimental/pqcrypto/signature/subtle/sphincs_verify_test.cc @@ -80,7 +80,7 @@ struct SphincsTestCase { std::string test_name; SphincsHashType hash_type; SphincsVariant variant; - SphincsSignatureLengthType sig_length_type; + SphincsSignatureType sig_length_type; int32_t private_key_size; int32_t signature_length; }; @@ -276,155 +276,155 @@ INSTANTIATE_TEST_SUITE_P( SphincsVerifyTests, SphincsVerifyTest, testing::ValuesIn<SphincsTestCase>( {{"SPHINCSHARAKA128FROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA128FROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA128FROBUST_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA128SROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA128SROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA128SROBUST_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA128FSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA128FSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA128FSIMPLE_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA128SSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA128SSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA128SSIMPLE_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA192FROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA192FROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA192FROBUST_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA192SROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA192SROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA192SROBUST_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA192FSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA192FSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA192FSIMPLE_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA192SSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA192SSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA192SSIMPLE_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA256FROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA256FROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA256FROBUST_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA256SROBUST", SphincsHashType::HARAKA, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA256SROBUST_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA256SROBUST_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA256FSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSHARAKA256FSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA256FSIMPLE_AESNI_CRYPTO_BYTES}, {"SPHINCSHARAKA256SSIMPLE", SphincsHashType::HARAKA, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSHARAKA256SSIMPLE_AESNI_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSHARAKA256SSIMPLE_AESNI_CRYPTO_BYTES}, {"SPHINCSSHA256128FROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256128FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256128FROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256128SROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256128SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256128SROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256128FSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256128FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256128FSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256128SSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256128SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256128SSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256192FROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256192FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256192FROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256192SROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256192SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256192SROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256192FSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256192FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256192FSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256192SSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256192SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256192SSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256256FROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256256FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256256FROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256256SROBUST", SphincsHashType::SHA256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256256SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256256SROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256256FSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHA256256FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256256FSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHA256256SSIMPLE", SphincsHashType::SHA256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHA256256SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHA256256SSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256128FROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256128FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256128FROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256128SROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256128SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256128SROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256128FSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256128FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256128FSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256128SSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256128SSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256192FROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256192FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256192FROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256192SROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256192SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256192SROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256192FSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256192FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256192FSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256192SSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256192SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256192SSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256256FROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::F, + SphincsVariant::ROBUST, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256256FROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256256FROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256256SROBUST", SphincsHashType::SHAKE256, - SphincsVariant::ROBUST, SphincsSignatureLengthType::S, + SphincsVariant::ROBUST, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256256SROBUST_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256256SROBUST_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256256FSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::F, + SphincsVariant::SIMPLE, SphincsSignatureType::FAST_SIGNING, PQCLEAN_SPHINCSSHAKE256256FSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256256FSIMPLE_AVX2_CRYPTO_BYTES}, {"SPHINCSSHAKE256256SSIMPLE", SphincsHashType::SHAKE256, - SphincsVariant::SIMPLE, SphincsSignatureLengthType::S, + SphincsVariant::SIMPLE, SphincsSignatureType::SMALL_SIGNATURE, PQCLEAN_SPHINCSSHAKE256256SSIMPLE_AVX2_CRYPTO_SECRETKEYBYTES, PQCLEAN_SPHINCSSHAKE256256SSIMPLE_AVX2_CRYPTO_BYTES}}), [](const testing::TestParamInfo<SphincsVerifyTest::ParamType>& info) { diff --git a/cc/experimental/pqcrypto/signature/util/enums.cc b/cc/experimental/pqcrypto/signature/util/enums.cc index 166a37556..c6593f77b 100644 --- a/cc/experimental/pqcrypto/signature/util/enums.cc +++ b/cc/experimental/pqcrypto/signature/util/enums.cc @@ -48,6 +48,86 @@ subtle::DilithiumSeedExpansion EnumsPqcrypto::ProtoToSubtle( } } +// static +pb::SphincsHashType EnumsPqcrypto::SubtleToProto(subtle::SphincsHashType type) { + switch (type) { + case subtle::SphincsHashType::HARAKA: + return pb::SphincsHashType::HARAKA; + case subtle::SphincsHashType::SHA256: + return pb::SphincsHashType::SHA256; + case subtle::SphincsHashType::SHAKE256: + return pb::SphincsHashType::SHAKE256; + default: + return pb::SphincsHashType::UNKNOWN_HASH_TYPE; + } +} + +// static +subtle::SphincsHashType EnumsPqcrypto::ProtoToSubtle(pb::SphincsHashType type) { + switch (type) { + case pb::SphincsHashType::HARAKA: + return subtle::SphincsHashType::HARAKA; + case pb::SphincsHashType::SHA256: + return subtle::SphincsHashType::SHA256; + case pb::SphincsHashType::SHAKE256: + return subtle::SphincsHashType::SHAKE256; + default: + return subtle::SphincsHashType::UNKNOWN_HASH_TYPE; + } +} + +// static +pb::SphincsVariant EnumsPqcrypto::SubtleToProto( + subtle::SphincsVariant variant) { + switch (variant) { + case subtle::SphincsVariant::ROBUST: + return pb::SphincsVariant::ROBUST; + case subtle::SphincsVariant::SIMPLE: + return pb::SphincsVariant::SIMPLE; + default: + return pb::SphincsVariant::UNKNOWN_VARIANT; + } +} + +// static +subtle::SphincsVariant EnumsPqcrypto::ProtoToSubtle( + pb::SphincsVariant variant) { + switch (variant) { + case pb::SphincsVariant::ROBUST: + return subtle::SphincsVariant::ROBUST; + case pb::SphincsVariant::SIMPLE: + return subtle::SphincsVariant::SIMPLE; + default: + return subtle::SphincsVariant::UNKNOWN_VARIANT; + } +} + +// static +pb::SphincsSignatureType EnumsPqcrypto::SubtleToProto( + subtle::SphincsSignatureType type) { + switch (type) { + case subtle::SphincsSignatureType::FAST_SIGNING: + return pb::SphincsSignatureType::FAST_SIGNING; + case subtle::SphincsSignatureType::SMALL_SIGNATURE: + return pb::SphincsSignatureType::SMALL_SIGNATURE; + default: + return pb::SphincsSignatureType::UNKNOWN_SIG_TYPE; + } +} + +// static +subtle::SphincsSignatureType EnumsPqcrypto::ProtoToSubtle( + pb::SphincsSignatureType type) { + switch (type) { + case pb::SphincsSignatureType::FAST_SIGNING: + return subtle::SphincsSignatureType::FAST_SIGNING; + case pb::SphincsSignatureType::SMALL_SIGNATURE: + return subtle::SphincsSignatureType::SMALL_SIGNATURE; + default: + return subtle::SphincsSignatureType::UNKNOWN_SIG_TYPE; + } +} + } // namespace util } // namespace tink } // namespace crypto diff --git a/cc/experimental/pqcrypto/signature/util/enums.h b/cc/experimental/pqcrypto/signature/util/enums.h index 3b8d438ff..e72b8e335 100644 --- a/cc/experimental/pqcrypto/signature/util/enums.h +++ b/cc/experimental/pqcrypto/signature/util/enums.h @@ -19,8 +19,10 @@ #include "absl/strings/string_view.h" #include "tink/experimental/pqcrypto/signature/subtle/dilithium_key.h" +#include "tink/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils.h" #include "tink/util/statusor.h" #include "proto/experimental/pqcrypto/dilithium.pb.h" +#include "proto/experimental/pqcrypto/sphincs.pb.h" #include "proto/tink.pb.h" namespace crypto { @@ -37,6 +39,27 @@ class EnumsPqcrypto { static crypto::tink::subtle::DilithiumSeedExpansion ProtoToSubtle( google::crypto::tink::DilithiumSeedExpansion expansion); + + // SphincsHashType. + static google::crypto::tink::SphincsHashType SubtleToProto( + crypto::tink::subtle::SphincsHashType type); + + static crypto::tink::subtle::SphincsHashType ProtoToSubtle( + google::crypto::tink::SphincsHashType type); + + // SphincsVariant. + static google::crypto::tink::SphincsVariant SubtleToProto( + crypto::tink::subtle::SphincsVariant variant); + + static crypto::tink::subtle::SphincsVariant ProtoToSubtle( + google::crypto::tink::SphincsVariant variant); + + // SphincsSignatureType. + static google::crypto::tink::SphincsSignatureType SubtleToProto( + crypto::tink::subtle::SphincsSignatureType type); + + static crypto::tink::subtle::SphincsSignatureType ProtoToSubtle( + google::crypto::tink::SphincsSignatureType type); }; } // namespace util diff --git a/cc/experimental/pqcrypto/signature/util/enums_test.cc b/cc/experimental/pqcrypto/signature/util/enums_test.cc index 7f0e6731a..1327fe834 100644 --- a/cc/experimental/pqcrypto/signature/util/enums_test.cc +++ b/cc/experimental/pqcrypto/signature/util/enums_test.cc @@ -64,6 +64,107 @@ TEST_F(EnumsTest, DilithiumSeedExpansion) { EXPECT_EQ(3, count); } +TEST_F(EnumsTest, SphincsHashType) { + EXPECT_EQ(pb::SphincsHashType::HARAKA, + EnumsPqcrypto::SubtleToProto(subtle::SphincsHashType::HARAKA)); + EXPECT_EQ(pb::SphincsHashType::SHA256, + EnumsPqcrypto::SubtleToProto(subtle::SphincsHashType::SHA256)); + EXPECT_EQ(pb::SphincsHashType::SHAKE256, + EnumsPqcrypto::SubtleToProto(subtle::SphincsHashType::SHAKE256)); + EXPECT_EQ( + pb::SphincsHashType::UNKNOWN_HASH_TYPE, + EnumsPqcrypto::SubtleToProto(subtle::SphincsHashType::UNKNOWN_HASH_TYPE)); + + EXPECT_EQ(subtle::SphincsHashType::HARAKA, + EnumsPqcrypto::ProtoToSubtle(pb::SphincsHashType::HARAKA)); + EXPECT_EQ(subtle::SphincsHashType::SHA256, + EnumsPqcrypto::ProtoToSubtle(pb::SphincsHashType::SHA256)); + EXPECT_EQ(subtle::SphincsHashType::SHAKE256, + EnumsPqcrypto::ProtoToSubtle(pb::SphincsHashType::SHAKE256)); + EXPECT_EQ( + subtle::SphincsHashType::UNKNOWN_HASH_TYPE, + EnumsPqcrypto::ProtoToSubtle(pb::SphincsHashType::UNKNOWN_HASH_TYPE)); + + // Check that enum conversion covers the entire range of the proto-enum. + int count = 0; + for (int int_type = static_cast<int>(pb::SphincsHashType_MIN); + int_type <= static_cast<int>(pb::SphincsHashType_MAX); int_type++) { + if (pb::SphincsHashType_IsValid(int_type)) { + pb::SphincsHashType type = static_cast<pb::SphincsHashType>(int_type); + EXPECT_EQ(type, EnumsPqcrypto::SubtleToProto( + EnumsPqcrypto::ProtoToSubtle(type))); + count++; + } + } + EXPECT_EQ(4, count); +} + +TEST_F(EnumsTest, SphincsVariant) { + EXPECT_EQ(pb::SphincsVariant::ROBUST, + EnumsPqcrypto::SubtleToProto(subtle::SphincsVariant::ROBUST)); + EXPECT_EQ(pb::SphincsVariant::SIMPLE, + EnumsPqcrypto::SubtleToProto(subtle::SphincsVariant::SIMPLE)); + EXPECT_EQ( + pb::SphincsVariant::UNKNOWN_VARIANT, + EnumsPqcrypto::SubtleToProto(subtle::SphincsVariant::UNKNOWN_VARIANT)); + + EXPECT_EQ(subtle::SphincsVariant::ROBUST, + EnumsPqcrypto::ProtoToSubtle(pb::SphincsVariant::ROBUST)); + EXPECT_EQ(subtle::SphincsVariant::SIMPLE, + EnumsPqcrypto::ProtoToSubtle(pb::SphincsVariant::SIMPLE)); + EXPECT_EQ(subtle::SphincsVariant::UNKNOWN_VARIANT, + EnumsPqcrypto::ProtoToSubtle(pb::SphincsVariant::UNKNOWN_VARIANT)); + + // Check that enum conversion covers the entire range of the proto-enum. + int count = 0; + for (int int_type = static_cast<int>(pb::SphincsVariant_MIN); + int_type <= static_cast<int>(pb::SphincsVariant_MAX); int_type++) { + if (pb::SphincsVariant_IsValid(int_type)) { + pb::SphincsVariant type = static_cast<pb::SphincsVariant>(int_type); + EXPECT_EQ(type, EnumsPqcrypto::SubtleToProto( + EnumsPqcrypto::ProtoToSubtle(type))); + count++; + } + } + EXPECT_EQ(3, count); +} + +TEST_F(EnumsTest, SphincsSignatureType) { + EXPECT_EQ( + pb::SphincsSignatureType::FAST_SIGNING, + EnumsPqcrypto::SubtleToProto(subtle::SphincsSignatureType::FAST_SIGNING)); + EXPECT_EQ(pb::SphincsSignatureType::SMALL_SIGNATURE, + EnumsPqcrypto::SubtleToProto( + subtle::SphincsSignatureType::SMALL_SIGNATURE)); + EXPECT_EQ(pb::SphincsSignatureType::UNKNOWN_SIG_TYPE, + EnumsPqcrypto::SubtleToProto( + subtle::SphincsSignatureType::UNKNOWN_SIG_TYPE)); + + EXPECT_EQ( + subtle::SphincsSignatureType::FAST_SIGNING, + EnumsPqcrypto::ProtoToSubtle(pb::SphincsSignatureType::FAST_SIGNING)); + EXPECT_EQ( + subtle::SphincsSignatureType::SMALL_SIGNATURE, + EnumsPqcrypto::ProtoToSubtle(pb::SphincsSignatureType::SMALL_SIGNATURE)); + EXPECT_EQ( + subtle::SphincsSignatureType::UNKNOWN_SIG_TYPE, + EnumsPqcrypto::ProtoToSubtle(pb::SphincsSignatureType::UNKNOWN_SIG_TYPE)); + + // Check that enum conversion covers the entire range of the proto-enum. + int count = 0; + for (int int_type = static_cast<int>(pb::SphincsSignatureType_MIN); + int_type <= static_cast<int>(pb::SphincsSignatureType_MAX); int_type++) { + if (pb::SphincsSignatureType_IsValid(int_type)) { + pb::SphincsSignatureType type = + static_cast<pb::SphincsSignatureType>(int_type); + EXPECT_EQ(type, EnumsPqcrypto::SubtleToProto( + EnumsPqcrypto::ProtoToSubtle(type))); + count++; + } + } + EXPECT_EQ(3, count); +} + } // namespace } // namespace tink } // namespace crypto |