Export SLHDSA_generate_key_from_seed to the public API. Change-Id: Id967a4512e0b0759d3828e23becd6cce86be1044 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/98847 Reviewed-by: David Benjamin <davidben@google.com> Presubmit-BoringSSL-Verified: boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com <boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Xiangfei Ding <xfding@google.com> Commit-Queue: Guillaume Endignoux <guillaumee@google.com>
diff --git a/crypto/slhdsa/slhdsa.cc b/crypto/slhdsa/slhdsa.cc index ff47073..ece60ff 100644 --- a/crypto/slhdsa/slhdsa.cc +++ b/crypto/slhdsa/slhdsa.cc
@@ -21,12 +21,14 @@ using namespace bssl; +static_assert(SLHDSA_SHA2_128S_SEED_BYTES == 3 * BCM_SLHDSA_SHA2_128S_N); static_assert(SLHDSA_SHA2_128S_PUBLIC_KEY_BYTES == BCM_SLHDSA_SHA2_128S_PUBLIC_KEY_BYTES); static_assert(SLHDSA_SHA2_128S_PRIVATE_KEY_BYTES == BCM_SLHDSA_SHA2_128S_PRIVATE_KEY_BYTES); static_assert(SLHDSA_SHA2_128S_SIGNATURE_BYTES == BCM_SLHDSA_SHA2_128S_SIGNATURE_BYTES); +static_assert(SLHDSA_SHAKE_256F_SEED_BYTES == 3 * BCM_SLHDSA_SHAKE_256F_N); static_assert(SLHDSA_SHAKE_256F_PUBLIC_KEY_BYTES == BCM_SLHDSA_SHAKE_256F_PUBLIC_KEY_BYTES); static_assert(SLHDSA_SHAKE_256F_PRIVATE_KEY_BYTES == @@ -34,6 +36,22 @@ static_assert(SLHDSA_SHAKE_256F_SIGNATURE_BYTES == BCM_SLHDSA_SHAKE_256F_SIGNATURE_BYTES); +void SLHDSA_SHA2_128S_generate_key_from_seed( + uint8_t out_public_key[SLHDSA_SHA2_128S_PUBLIC_KEY_BYTES], + uint8_t out_private_key[SLHDSA_SHA2_128S_PRIVATE_KEY_BYTES], + const uint8_t seed[SLHDSA_SHA2_128S_SEED_BYTES]) { + BCM_slhdsa_sha2_128s_generate_key_from_seed(out_public_key, out_private_key, + seed); +} + +void SLHDSA_SHAKE_256F_generate_key_from_seed( + uint8_t out_public_key[SLHDSA_SHAKE_256F_PUBLIC_KEY_BYTES], + uint8_t out_private_key[SLHDSA_SHAKE_256F_PRIVATE_KEY_BYTES], + const uint8_t seed[SLHDSA_SHAKE_256F_SEED_BYTES]) { + BCM_slhdsa_shake_256f_generate_key_from_seed(out_public_key, out_private_key, + seed); +} + void SLHDSA_SHA2_128S_generate_key( uint8_t out_public_key[SLHDSA_SHA2_128S_PUBLIC_KEY_BYTES], uint8_t out_private_key[SLHDSA_SHA2_128S_PRIVATE_KEY_BYTES]) { @@ -73,8 +91,7 @@ const uint8_t *msg, size_t msg_len, const uint8_t *context, size_t context_len) { return bcm_success(BCM_slhdsa_shake_256f_sign(out_signature, private_key, msg, - msg_len, context, - context_len)); + msg_len, context, context_len)); } int SLHDSA_SHA2_128S_verify( @@ -83,8 +100,8 @@ const uint8_t *msg, size_t msg_len, const uint8_t *context, size_t context_len) { return bcm_success(BCM_slhdsa_sha2_128s_verify(signature, signature_len, - public_key, msg, msg_len, - context, context_len)); + public_key, msg, msg_len, + context, context_len)); } int SLHDSA_SHAKE_256F_verify( @@ -93,8 +110,8 @@ const uint8_t *msg, size_t msg_len, const uint8_t *context, size_t context_len) { return bcm_success(BCM_slhdsa_shake_256f_verify(signature, signature_len, - public_key, msg, msg_len, - context, context_len)); + public_key, msg, msg_len, + context, context_len)); } int SLHDSA_SHA2_128S_prehash_sign(
diff --git a/include/openssl/prefix_symbols.h b/include/openssl/prefix_symbols.h index 9175ce2..a2fec15 100644 --- a/include/openssl/prefix_symbols.h +++ b/include/openssl/prefix_symbols.h
@@ -1840,6 +1840,7 @@ #pragma redefine_extname SHA512_Update BORINGSSL_ADD_USER_LABEL_AND_PREFIX(SHA512_Update) #pragma redefine_extname SIPHASH_24 BORINGSSL_ADD_USER_LABEL_AND_PREFIX(SIPHASH_24) #pragma redefine_extname SLHDSA_SHA2_128S_generate_key BORINGSSL_ADD_USER_LABEL_AND_PREFIX(SLHDSA_SHA2_128S_generate_key) +#pragma redefine_extname SLHDSA_SHA2_128S_generate_key_from_seed BORINGSSL_ADD_USER_LABEL_AND_PREFIX(SLHDSA_SHA2_128S_generate_key_from_seed) #pragma redefine_extname SLHDSA_SHA2_128S_prehash_sign BORINGSSL_ADD_USER_LABEL_AND_PREFIX(SLHDSA_SHA2_128S_prehash_sign) #pragma redefine_extname SLHDSA_SHA2_128S_prehash_verify BORINGSSL_ADD_USER_LABEL_AND_PREFIX(SLHDSA_SHA2_128S_prehash_verify) #pragma redefine_extname SLHDSA_SHA2_128S_prehash_warning_nonstandard_sign BORINGSSL_ADD_USER_LABEL_AND_PREFIX(SLHDSA_SHA2_128S_prehash_warning_nonstandard_sign) @@ -1848,6 +1849,7 @@ #pragma redefine_extname SLHDSA_SHA2_128S_sign BORINGSSL_ADD_USER_LABEL_AND_PREFIX(SLHDSA_SHA2_128S_sign) #pragma redefine_extname SLHDSA_SHA2_128S_verify BORINGSSL_ADD_USER_LABEL_AND_PREFIX(SLHDSA_SHA2_128S_verify) #pragma redefine_extname SLHDSA_SHAKE_256F_generate_key BORINGSSL_ADD_USER_LABEL_AND_PREFIX(SLHDSA_SHAKE_256F_generate_key) +#pragma redefine_extname SLHDSA_SHAKE_256F_generate_key_from_seed BORINGSSL_ADD_USER_LABEL_AND_PREFIX(SLHDSA_SHAKE_256F_generate_key_from_seed) #pragma redefine_extname SLHDSA_SHAKE_256F_public_from_private BORINGSSL_ADD_USER_LABEL_AND_PREFIX(SLHDSA_SHAKE_256F_public_from_private) #pragma redefine_extname SLHDSA_SHAKE_256F_sign BORINGSSL_ADD_USER_LABEL_AND_PREFIX(SLHDSA_SHAKE_256F_sign) #pragma redefine_extname SLHDSA_SHAKE_256F_verify BORINGSSL_ADD_USER_LABEL_AND_PREFIX(SLHDSA_SHAKE_256F_verify) @@ -4961,6 +4963,7 @@ #define SHA512_Update BORINGSSL_ADD_PREFIX(SHA512_Update) #define SIPHASH_24 BORINGSSL_ADD_PREFIX(SIPHASH_24) #define SLHDSA_SHA2_128S_generate_key BORINGSSL_ADD_PREFIX(SLHDSA_SHA2_128S_generate_key) +#define SLHDSA_SHA2_128S_generate_key_from_seed BORINGSSL_ADD_PREFIX(SLHDSA_SHA2_128S_generate_key_from_seed) #define SLHDSA_SHA2_128S_prehash_sign BORINGSSL_ADD_PREFIX(SLHDSA_SHA2_128S_prehash_sign) #define SLHDSA_SHA2_128S_prehash_verify BORINGSSL_ADD_PREFIX(SLHDSA_SHA2_128S_prehash_verify) #define SLHDSA_SHA2_128S_prehash_warning_nonstandard_sign BORINGSSL_ADD_PREFIX(SLHDSA_SHA2_128S_prehash_warning_nonstandard_sign) @@ -4969,6 +4972,7 @@ #define SLHDSA_SHA2_128S_sign BORINGSSL_ADD_PREFIX(SLHDSA_SHA2_128S_sign) #define SLHDSA_SHA2_128S_verify BORINGSSL_ADD_PREFIX(SLHDSA_SHA2_128S_verify) #define SLHDSA_SHAKE_256F_generate_key BORINGSSL_ADD_PREFIX(SLHDSA_SHAKE_256F_generate_key) +#define SLHDSA_SHAKE_256F_generate_key_from_seed BORINGSSL_ADD_PREFIX(SLHDSA_SHAKE_256F_generate_key_from_seed) #define SLHDSA_SHAKE_256F_public_from_private BORINGSSL_ADD_PREFIX(SLHDSA_SHAKE_256F_public_from_private) #define SLHDSA_SHAKE_256F_sign BORINGSSL_ADD_PREFIX(SLHDSA_SHAKE_256F_sign) #define SLHDSA_SHAKE_256F_verify BORINGSSL_ADD_PREFIX(SLHDSA_SHAKE_256F_verify)
diff --git a/include/openssl/slhdsa.h b/include/openssl/slhdsa.h index 9a535ba..996158e 100644 --- a/include/openssl/slhdsa.h +++ b/include/openssl/slhdsa.h
@@ -15,7 +15,7 @@ #ifndef OPENSSL_HEADER_SLHDSA_H #define OPENSSL_HEADER_SLHDSA_H -#include <openssl/base.h> // IWYU pragma: export +#include <openssl/base.h> // IWYU pragma: export #if defined(__cplusplus) extern "C" { @@ -25,6 +25,10 @@ // SLH-DSA. +// SLHDSA_SHA2_128S_SEED_BYTES is the number of bytes in an SLH-DSA-SHA2-128s +// private seed. +#define SLHDSA_SHA2_128S_SEED_BYTES 48 + // SLHDSA_SHA2_128S_PUBLIC_KEY_BYTES is the number of bytes in an // SLH-DSA-SHA2-128s public key. #define SLHDSA_SHA2_128S_PUBLIC_KEY_BYTES 32 @@ -37,6 +41,10 @@ // SLH-DSA-SHA2-128s signature. #define SLHDSA_SHA2_128S_SIGNATURE_BYTES 7856 +// SLHDSA_SHAKE_256F_SEED_BYTES is the number of bytes in an SLH-DSA-SHAKE-256f +// private seed. +#define SLHDSA_SHAKE_256F_SEED_BYTES 96 + // SLHDSA_SHAKE_256F_PUBLIC_KEY_BYTES is the number of bytes in an // SLH-DSA-SHAKE-256f public key. #define SLHDSA_SHAKE_256F_PUBLIC_KEY_BYTES 64 @@ -49,6 +57,22 @@ // SLH-DSA-SHAKE-256f signature. #define SLHDSA_SHAKE_256F_SIGNATURE_BYTES 49856 +// SLHDSA_SHA2_128S_generate_key_from_seed generates a SLH-DSA-SHA2-128s key +// pair from the given `seed` and writes the result to `out_public_key` and +// `out_private_key`. +OPENSSL_EXPORT void SLHDSA_SHA2_128S_generate_key_from_seed( + uint8_t out_public_key[SLHDSA_SHA2_128S_PUBLIC_KEY_BYTES], + uint8_t out_private_key[SLHDSA_SHA2_128S_PRIVATE_KEY_BYTES], + const uint8_t seed[SLHDSA_SHA2_128S_SEED_BYTES]); + +// SLHDSA_SHAKE_256F_generate_key_from_seed generates a SLH-DSA-SHA2-128s key +// pair from the given `seed` and writes the result to `out_public_key` and +// `out_private_key`. +OPENSSL_EXPORT void SLHDSA_SHAKE_256F_generate_key_from_seed( + uint8_t out_public_key[SLHDSA_SHAKE_256F_PUBLIC_KEY_BYTES], + uint8_t out_private_key[SLHDSA_SHAKE_256F_PRIVATE_KEY_BYTES], + const uint8_t seed[SLHDSA_SHAKE_256F_SEED_BYTES]); + // SLHDSA_SHA2_128S_generate_key generates a SLH-DSA-SHA2-128s key pair and // writes the result to `out_public_key` and `out_private_key`. OPENSSL_EXPORT void SLHDSA_SHA2_128S_generate_key(