aboutsummaryrefslogtreecommitdiff
path: root/cc/experimental
diff options
context:
space:
mode:
authorTink Team <tink-dev@google.com>2021-09-03 03:50:31 -0700
committerCopybara-Service <copybara-worker@google.com>2021-09-03 03:51:10 -0700
commit9ce4e40e76dbbcc310cdccf90dd236560996a910 (patch)
treeda8ff6b6ffc1ff576870a43cfe732b7725ee1b3b /cc/experimental
parentf2e7ea8cfdfaa035e4742615de0482730461fef9 (diff)
downloadtink-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')
-rw-r--r--cc/experimental/pqcrypto/signature/subtle/sphincs_sign.cc5
-rw-r--r--cc/experimental/pqcrypto/signature/subtle/sphincs_sign_test.cc74
-rw-r--r--cc/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils.cc55
-rw-r--r--cc/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils.h15
-rw-r--r--cc/experimental/pqcrypto/signature/subtle/sphincs_subtle_utils_test.cc120
-rw-r--r--cc/experimental/pqcrypto/signature/subtle/sphincs_verify.cc5
-rw-r--r--cc/experimental/pqcrypto/signature/subtle/sphincs_verify_test.cc74
-rw-r--r--cc/experimental/pqcrypto/signature/util/enums.cc80
-rw-r--r--cc/experimental/pqcrypto/signature/util/enums.h23
-rw-r--r--cc/experimental/pqcrypto/signature/util/enums_test.cc101
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