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(