diff --git a/docs/algorithms/sig/falcon.md b/docs/algorithms/sig/falcon.md index 30d94682bd..f9ceaecc15 100644 --- a/docs/algorithms/sig/falcon.md +++ b/docs/algorithms/sig/falcon.md @@ -7,9 +7,9 @@ - **Authors' website**: https://falcon-sign.info - **Specification version**: 20211101. - **Primary Source**<a name="primary-source"></a>: - - **Source**: https://github.com/PQClean/PQClean/commit/1eacfdafc15ddc5d5759d0b85b4cef26627df181 + - **Source**: https://github.com/PQClean/PQClean/commit/1eacfdafc15ddc5d5759d0b85b4cef26627df181 with copy_from_upstream patches - **Implementation license (SPDX-Identifier)**: MIT -- **Optimized Implementation sources**: https://github.com/PQClean/PQClean/commit/1eacfdafc15ddc5d5759d0b85b4cef26627df181 +- **Optimized Implementation sources**: https://github.com/PQClean/PQClean/commit/1eacfdafc15ddc5d5759d0b85b4cef26627df181 with copy_from_upstream patches - **pqclean-aarch64**:<a name="pqclean-aarch64"></a> - **Source**: https://github.com/PQClean/PQClean/commit/7707d1bcc8ae7f9ffd296dd13b1d76d2767d14f8 - **Implementation license (SPDX-Identifier)**: Apache-2.0 diff --git a/docs/algorithms/sig/falcon.yml b/docs/algorithms/sig/falcon.yml index c55c2d4fa5..152428f6bb 100644 --- a/docs/algorithms/sig/falcon.yml +++ b/docs/algorithms/sig/falcon.yml @@ -19,6 +19,7 @@ nist-round: 3 spec-version: 20211101 primary-upstream: source: https://github.com/PQClean/PQClean/commit/1eacfdafc15ddc5d5759d0b85b4cef26627df181 + with copy_from_upstream patches spdx-license-identifier: MIT upstream-ancestors: - https://www.falcon-sign.info diff --git a/src/sig/cross/sig_cross.h b/src/sig/cross/sig_cross.h index 584121692a..49d8a490ec 100644 --- a/src/sig/cross/sig_cross.h +++ b/src/sig/cross/sig_cross.h @@ -12,6 +12,8 @@ OQS_SIG *OQS_SIG_cross_rsdp_128_balanced_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_balanced_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_balanced_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_balanced_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_balanced_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_balanced_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_balanced_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -25,6 +27,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_balanced_verify_with_ctx_str(const uin OQS_SIG *OQS_SIG_cross_rsdp_128_fast_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_fast_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_fast_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_fast_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_fast_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_fast_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_fast_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -38,6 +42,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_fast_verify_with_ctx_str(const uint8_t OQS_SIG *OQS_SIG_cross_rsdp_128_small_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_small_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_small_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_small_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_small_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_small_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_small_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -51,6 +57,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_small_verify_with_ctx_str(const uint8_ OQS_SIG *OQS_SIG_cross_rsdp_192_balanced_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_balanced_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_balanced_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_balanced_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_balanced_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_balanced_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_balanced_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -64,6 +72,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_balanced_verify_with_ctx_str(const uin OQS_SIG *OQS_SIG_cross_rsdp_192_fast_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_fast_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_fast_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_fast_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_fast_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_fast_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_fast_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -77,6 +87,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_fast_verify_with_ctx_str(const uint8_t OQS_SIG *OQS_SIG_cross_rsdp_192_small_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_small_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_small_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_small_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_small_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_small_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_small_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -90,6 +102,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_small_verify_with_ctx_str(const uint8_ OQS_SIG *OQS_SIG_cross_rsdp_256_balanced_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_balanced_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_balanced_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_balanced_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_balanced_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_balanced_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_balanced_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -103,6 +117,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_balanced_verify_with_ctx_str(const uin OQS_SIG *OQS_SIG_cross_rsdp_256_fast_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_fast_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_fast_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_fast_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_fast_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_fast_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_fast_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -116,6 +132,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_fast_verify_with_ctx_str(const uint8_t OQS_SIG *OQS_SIG_cross_rsdp_256_small_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_small_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_small_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_small_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_small_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_small_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_small_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -129,6 +147,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_small_verify_with_ctx_str(const uint8_ OQS_SIG *OQS_SIG_cross_rsdpg_128_balanced_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_balanced_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_balanced_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_balanced_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_balanced_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_balanced_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_balanced_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -142,6 +162,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_balanced_verify_with_ctx_str(const ui OQS_SIG *OQS_SIG_cross_rsdpg_128_fast_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_fast_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_fast_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_fast_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_fast_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_fast_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_fast_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -155,6 +177,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_fast_verify_with_ctx_str(const uint8_ OQS_SIG *OQS_SIG_cross_rsdpg_128_small_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_small_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_small_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_small_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_small_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_small_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_small_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -168,6 +192,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_small_verify_with_ctx_str(const uint8 OQS_SIG *OQS_SIG_cross_rsdpg_192_balanced_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_balanced_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_balanced_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_balanced_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_balanced_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_balanced_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_balanced_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -181,6 +207,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_balanced_verify_with_ctx_str(const ui OQS_SIG *OQS_SIG_cross_rsdpg_192_fast_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_fast_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_fast_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_fast_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_fast_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_fast_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_fast_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -194,6 +222,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_fast_verify_with_ctx_str(const uint8_ OQS_SIG *OQS_SIG_cross_rsdpg_192_small_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_small_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_small_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_small_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_small_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_small_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_small_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -207,6 +237,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_small_verify_with_ctx_str(const uint8 OQS_SIG *OQS_SIG_cross_rsdpg_256_balanced_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_balanced_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_balanced_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_balanced_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_balanced_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_balanced_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_balanced_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -220,6 +252,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_balanced_verify_with_ctx_str(const ui OQS_SIG *OQS_SIG_cross_rsdpg_256_fast_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_fast_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_fast_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_fast_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_fast_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_fast_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_fast_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -233,6 +267,8 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_fast_verify_with_ctx_str(const uint8_ OQS_SIG *OQS_SIG_cross_rsdpg_256_small_new(void); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_small_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_small_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_small_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_small_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_small_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_small_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); diff --git a/src/sig/cross/sig_cross_rsdp_128_balanced.c b/src/sig/cross/sig_cross_rsdp_128_balanced.c index 497810b7ed..f69aaa1f1c 100644 --- a/src/sig/cross/sig_cross_rsdp_128_balanced.c +++ b/src/sig/cross/sig_cross_rsdp_128_balanced.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdp_128_balanced_new(void) { sig->length_signature = OQS_SIG_cross_rsdp_128_balanced_length_signature; sig->keypair = OQS_SIG_cross_rsdp_128_balanced_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdp_128_balanced_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdp_128_balanced_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdp_128_balanced_sign; sig->verify = OQS_SIG_cross_rsdp_128_balanced_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdp_128_balanced_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdp_128_balanced_new(void) { } extern int PQCLEAN_CROSSRSDP128BALANCED_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP128BALANCED_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP128BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP128BALANCED_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP128BALANCED_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdp_128_balanced_avx2) extern int PQCLEAN_CROSSRSDP128BALANCED_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP128BALANCED_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP128BALANCED_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP128BALANCED_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP128BALANCED_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_balanced_keypair(uint8_t *public_key, #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_balanced_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_128_balanced_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP128BALANCED_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP128BALANCED_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP128BALANCED_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_balanced_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_128_balanced_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP128BALANCED_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP128BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP128BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_balanced_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdp_128_balanced_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdp_128_fast.c b/src/sig/cross/sig_cross_rsdp_128_fast.c index 4adf088873..68850b9c2c 100644 --- a/src/sig/cross/sig_cross_rsdp_128_fast.c +++ b/src/sig/cross/sig_cross_rsdp_128_fast.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdp_128_fast_new(void) { sig->length_signature = OQS_SIG_cross_rsdp_128_fast_length_signature; sig->keypair = OQS_SIG_cross_rsdp_128_fast_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdp_128_fast_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdp_128_fast_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdp_128_fast_sign; sig->verify = OQS_SIG_cross_rsdp_128_fast_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdp_128_fast_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdp_128_fast_new(void) { } extern int PQCLEAN_CROSSRSDP128FAST_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP128FAST_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP128FAST_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP128FAST_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP128FAST_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdp_128_fast_avx2) extern int PQCLEAN_CROSSRSDP128FAST_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP128FAST_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP128FAST_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP128FAST_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP128FAST_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_fast_keypair(uint8_t *public_key, uint #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_fast_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_128_fast_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP128FAST_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP128FAST_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP128FAST_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_fast_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_128_fast_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP128FAST_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP128FAST_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP128FAST_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_fast_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdp_128_fast_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdp_128_small.c b/src/sig/cross/sig_cross_rsdp_128_small.c index ad50ba35bc..99597e3ee4 100644 --- a/src/sig/cross/sig_cross_rsdp_128_small.c +++ b/src/sig/cross/sig_cross_rsdp_128_small.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdp_128_small_new(void) { sig->length_signature = OQS_SIG_cross_rsdp_128_small_length_signature; sig->keypair = OQS_SIG_cross_rsdp_128_small_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdp_128_small_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdp_128_small_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdp_128_small_sign; sig->verify = OQS_SIG_cross_rsdp_128_small_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdp_128_small_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdp_128_small_new(void) { } extern int PQCLEAN_CROSSRSDP128SMALL_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP128SMALL_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP128SMALL_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP128SMALL_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP128SMALL_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdp_128_small_avx2) extern int PQCLEAN_CROSSRSDP128SMALL_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP128SMALL_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP128SMALL_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP128SMALL_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP128SMALL_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_small_keypair(uint8_t *public_key, uin #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_small_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_128_small_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP128SMALL_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP128SMALL_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP128SMALL_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_small_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_128_small_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP128SMALL_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP128SMALL_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP128SMALL_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdp_128_small_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdp_128_small_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdp_192_balanced.c b/src/sig/cross/sig_cross_rsdp_192_balanced.c index 98289029f5..e4f7640c16 100644 --- a/src/sig/cross/sig_cross_rsdp_192_balanced.c +++ b/src/sig/cross/sig_cross_rsdp_192_balanced.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdp_192_balanced_new(void) { sig->length_signature = OQS_SIG_cross_rsdp_192_balanced_length_signature; sig->keypair = OQS_SIG_cross_rsdp_192_balanced_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdp_192_balanced_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdp_192_balanced_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdp_192_balanced_sign; sig->verify = OQS_SIG_cross_rsdp_192_balanced_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdp_192_balanced_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdp_192_balanced_new(void) { } extern int PQCLEAN_CROSSRSDP192BALANCED_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP192BALANCED_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP192BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP192BALANCED_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP192BALANCED_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdp_192_balanced_avx2) extern int PQCLEAN_CROSSRSDP192BALANCED_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP192BALANCED_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP192BALANCED_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP192BALANCED_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP192BALANCED_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_balanced_keypair(uint8_t *public_key, #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_balanced_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_192_balanced_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP192BALANCED_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP192BALANCED_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP192BALANCED_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_balanced_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_192_balanced_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP192BALANCED_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP192BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP192BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_balanced_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdp_192_balanced_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdp_192_fast.c b/src/sig/cross/sig_cross_rsdp_192_fast.c index 4490466dbc..9b01185b5d 100644 --- a/src/sig/cross/sig_cross_rsdp_192_fast.c +++ b/src/sig/cross/sig_cross_rsdp_192_fast.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdp_192_fast_new(void) { sig->length_signature = OQS_SIG_cross_rsdp_192_fast_length_signature; sig->keypair = OQS_SIG_cross_rsdp_192_fast_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdp_192_fast_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdp_192_fast_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdp_192_fast_sign; sig->verify = OQS_SIG_cross_rsdp_192_fast_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdp_192_fast_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdp_192_fast_new(void) { } extern int PQCLEAN_CROSSRSDP192FAST_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP192FAST_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP192FAST_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP192FAST_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP192FAST_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdp_192_fast_avx2) extern int PQCLEAN_CROSSRSDP192FAST_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP192FAST_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP192FAST_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP192FAST_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP192FAST_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_fast_keypair(uint8_t *public_key, uint #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_fast_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_192_fast_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP192FAST_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP192FAST_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP192FAST_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_fast_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_192_fast_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP192FAST_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP192FAST_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP192FAST_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_fast_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdp_192_fast_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdp_192_small.c b/src/sig/cross/sig_cross_rsdp_192_small.c index 1a78de79ac..aed253e0d1 100644 --- a/src/sig/cross/sig_cross_rsdp_192_small.c +++ b/src/sig/cross/sig_cross_rsdp_192_small.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdp_192_small_new(void) { sig->length_signature = OQS_SIG_cross_rsdp_192_small_length_signature; sig->keypair = OQS_SIG_cross_rsdp_192_small_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdp_192_small_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdp_192_small_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdp_192_small_sign; sig->verify = OQS_SIG_cross_rsdp_192_small_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdp_192_small_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdp_192_small_new(void) { } extern int PQCLEAN_CROSSRSDP192SMALL_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP192SMALL_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP192SMALL_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP192SMALL_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP192SMALL_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdp_192_small_avx2) extern int PQCLEAN_CROSSRSDP192SMALL_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP192SMALL_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP192SMALL_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP192SMALL_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP192SMALL_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_small_keypair(uint8_t *public_key, uin #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_small_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_192_small_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP192SMALL_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP192SMALL_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP192SMALL_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_small_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_192_small_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP192SMALL_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP192SMALL_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP192SMALL_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdp_192_small_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdp_192_small_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdp_256_balanced.c b/src/sig/cross/sig_cross_rsdp_256_balanced.c index f51ccb2176..907b7ecba1 100644 --- a/src/sig/cross/sig_cross_rsdp_256_balanced.c +++ b/src/sig/cross/sig_cross_rsdp_256_balanced.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdp_256_balanced_new(void) { sig->length_signature = OQS_SIG_cross_rsdp_256_balanced_length_signature; sig->keypair = OQS_SIG_cross_rsdp_256_balanced_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdp_256_balanced_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdp_256_balanced_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdp_256_balanced_sign; sig->verify = OQS_SIG_cross_rsdp_256_balanced_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdp_256_balanced_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdp_256_balanced_new(void) { } extern int PQCLEAN_CROSSRSDP256BALANCED_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP256BALANCED_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP256BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP256BALANCED_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP256BALANCED_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdp_256_balanced_avx2) extern int PQCLEAN_CROSSRSDP256BALANCED_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP256BALANCED_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP256BALANCED_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP256BALANCED_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP256BALANCED_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_balanced_keypair(uint8_t *public_key, #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_balanced_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_256_balanced_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP256BALANCED_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP256BALANCED_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP256BALANCED_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_balanced_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_256_balanced_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP256BALANCED_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP256BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP256BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_balanced_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdp_256_balanced_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdp_256_fast.c b/src/sig/cross/sig_cross_rsdp_256_fast.c index 8b5f6e2ef2..634f177730 100644 --- a/src/sig/cross/sig_cross_rsdp_256_fast.c +++ b/src/sig/cross/sig_cross_rsdp_256_fast.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdp_256_fast_new(void) { sig->length_signature = OQS_SIG_cross_rsdp_256_fast_length_signature; sig->keypair = OQS_SIG_cross_rsdp_256_fast_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdp_256_fast_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdp_256_fast_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdp_256_fast_sign; sig->verify = OQS_SIG_cross_rsdp_256_fast_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdp_256_fast_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdp_256_fast_new(void) { } extern int PQCLEAN_CROSSRSDP256FAST_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP256FAST_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP256FAST_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP256FAST_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP256FAST_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdp_256_fast_avx2) extern int PQCLEAN_CROSSRSDP256FAST_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP256FAST_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP256FAST_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP256FAST_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP256FAST_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_fast_keypair(uint8_t *public_key, uint #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_fast_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_256_fast_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP256FAST_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP256FAST_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP256FAST_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_fast_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_256_fast_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP256FAST_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP256FAST_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP256FAST_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_fast_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdp_256_fast_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdp_256_small.c b/src/sig/cross/sig_cross_rsdp_256_small.c index 108ef4d710..c6dfcd24db 100644 --- a/src/sig/cross/sig_cross_rsdp_256_small.c +++ b/src/sig/cross/sig_cross_rsdp_256_small.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdp_256_small_new(void) { sig->length_signature = OQS_SIG_cross_rsdp_256_small_length_signature; sig->keypair = OQS_SIG_cross_rsdp_256_small_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdp_256_small_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdp_256_small_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdp_256_small_sign; sig->verify = OQS_SIG_cross_rsdp_256_small_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdp_256_small_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdp_256_small_new(void) { } extern int PQCLEAN_CROSSRSDP256SMALL_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP256SMALL_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP256SMALL_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP256SMALL_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP256SMALL_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdp_256_small_avx2) extern int PQCLEAN_CROSSRSDP256SMALL_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDP256SMALL_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDP256SMALL_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP256SMALL_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDP256SMALL_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_small_keypair(uint8_t *public_key, uin #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_small_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_256_small_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP256SMALL_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP256SMALL_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP256SMALL_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_small_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdp_256_small_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDP256SMALL_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDP256SMALL_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDP256SMALL_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdp_256_small_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdp_256_small_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdpg_128_balanced.c b/src/sig/cross/sig_cross_rsdpg_128_balanced.c index d6f7774598..033ede7171 100644 --- a/src/sig/cross/sig_cross_rsdpg_128_balanced.c +++ b/src/sig/cross/sig_cross_rsdpg_128_balanced.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdpg_128_balanced_new(void) { sig->length_signature = OQS_SIG_cross_rsdpg_128_balanced_length_signature; sig->keypair = OQS_SIG_cross_rsdpg_128_balanced_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdpg_128_balanced_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdpg_128_balanced_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdpg_128_balanced_sign; sig->verify = OQS_SIG_cross_rsdpg_128_balanced_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdpg_128_balanced_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdpg_128_balanced_new(void) { } extern int PQCLEAN_CROSSRSDPG128BALANCED_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG128BALANCED_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG128BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG128BALANCED_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG128BALANCED_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdpg_128_balanced_avx2) extern int PQCLEAN_CROSSRSDPG128BALANCED_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG128BALANCED_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG128BALANCED_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG128BALANCED_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG128BALANCED_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_balanced_keypair(uint8_t *public_key, #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_balanced_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_128_balanced_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128BALANCED_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128BALANCED_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128BALANCED_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_balanced_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_128_balanced_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128BALANCED_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_balanced_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdpg_128_balanced_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdpg_128_fast.c b/src/sig/cross/sig_cross_rsdpg_128_fast.c index 369eb47f8c..d6ce9c127b 100644 --- a/src/sig/cross/sig_cross_rsdpg_128_fast.c +++ b/src/sig/cross/sig_cross_rsdpg_128_fast.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdpg_128_fast_new(void) { sig->length_signature = OQS_SIG_cross_rsdpg_128_fast_length_signature; sig->keypair = OQS_SIG_cross_rsdpg_128_fast_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdpg_128_fast_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdpg_128_fast_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdpg_128_fast_sign; sig->verify = OQS_SIG_cross_rsdpg_128_fast_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdpg_128_fast_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdpg_128_fast_new(void) { } extern int PQCLEAN_CROSSRSDPG128FAST_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG128FAST_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG128FAST_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG128FAST_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG128FAST_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdpg_128_fast_avx2) extern int PQCLEAN_CROSSRSDPG128FAST_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG128FAST_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG128FAST_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG128FAST_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG128FAST_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_fast_keypair(uint8_t *public_key, uin #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_fast_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_128_fast_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128FAST_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128FAST_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128FAST_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_fast_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_128_fast_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128FAST_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128FAST_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128FAST_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_fast_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdpg_128_fast_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdpg_128_small.c b/src/sig/cross/sig_cross_rsdpg_128_small.c index 50868405d5..a3628a2d68 100644 --- a/src/sig/cross/sig_cross_rsdpg_128_small.c +++ b/src/sig/cross/sig_cross_rsdpg_128_small.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdpg_128_small_new(void) { sig->length_signature = OQS_SIG_cross_rsdpg_128_small_length_signature; sig->keypair = OQS_SIG_cross_rsdpg_128_small_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdpg_128_small_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdpg_128_small_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdpg_128_small_sign; sig->verify = OQS_SIG_cross_rsdpg_128_small_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdpg_128_small_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdpg_128_small_new(void) { } extern int PQCLEAN_CROSSRSDPG128SMALL_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG128SMALL_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG128SMALL_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG128SMALL_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG128SMALL_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdpg_128_small_avx2) extern int PQCLEAN_CROSSRSDPG128SMALL_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG128SMALL_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG128SMALL_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG128SMALL_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG128SMALL_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_small_keypair(uint8_t *public_key, ui #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_small_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_128_small_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128SMALL_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128SMALL_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128SMALL_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_small_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_128_small_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128SMALL_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128SMALL_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG128SMALL_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_128_small_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdpg_128_small_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdpg_192_balanced.c b/src/sig/cross/sig_cross_rsdpg_192_balanced.c index 13b5c8b315..b11106a5b7 100644 --- a/src/sig/cross/sig_cross_rsdpg_192_balanced.c +++ b/src/sig/cross/sig_cross_rsdpg_192_balanced.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdpg_192_balanced_new(void) { sig->length_signature = OQS_SIG_cross_rsdpg_192_balanced_length_signature; sig->keypair = OQS_SIG_cross_rsdpg_192_balanced_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdpg_192_balanced_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdpg_192_balanced_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdpg_192_balanced_sign; sig->verify = OQS_SIG_cross_rsdpg_192_balanced_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdpg_192_balanced_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdpg_192_balanced_new(void) { } extern int PQCLEAN_CROSSRSDPG192BALANCED_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG192BALANCED_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG192BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG192BALANCED_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG192BALANCED_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdpg_192_balanced_avx2) extern int PQCLEAN_CROSSRSDPG192BALANCED_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG192BALANCED_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG192BALANCED_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG192BALANCED_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG192BALANCED_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_balanced_keypair(uint8_t *public_key, #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_balanced_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_192_balanced_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192BALANCED_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192BALANCED_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192BALANCED_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_balanced_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_192_balanced_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192BALANCED_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_balanced_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdpg_192_balanced_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdpg_192_fast.c b/src/sig/cross/sig_cross_rsdpg_192_fast.c index d020f5eb91..ca4011ab05 100644 --- a/src/sig/cross/sig_cross_rsdpg_192_fast.c +++ b/src/sig/cross/sig_cross_rsdpg_192_fast.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdpg_192_fast_new(void) { sig->length_signature = OQS_SIG_cross_rsdpg_192_fast_length_signature; sig->keypair = OQS_SIG_cross_rsdpg_192_fast_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdpg_192_fast_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdpg_192_fast_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdpg_192_fast_sign; sig->verify = OQS_SIG_cross_rsdpg_192_fast_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdpg_192_fast_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdpg_192_fast_new(void) { } extern int PQCLEAN_CROSSRSDPG192FAST_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG192FAST_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG192FAST_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG192FAST_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG192FAST_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdpg_192_fast_avx2) extern int PQCLEAN_CROSSRSDPG192FAST_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG192FAST_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG192FAST_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG192FAST_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG192FAST_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_fast_keypair(uint8_t *public_key, uin #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_fast_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_192_fast_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192FAST_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192FAST_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192FAST_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_fast_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_192_fast_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192FAST_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192FAST_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192FAST_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_fast_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdpg_192_fast_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdpg_192_small.c b/src/sig/cross/sig_cross_rsdpg_192_small.c index f996c15f80..563557d4af 100644 --- a/src/sig/cross/sig_cross_rsdpg_192_small.c +++ b/src/sig/cross/sig_cross_rsdpg_192_small.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdpg_192_small_new(void) { sig->length_signature = OQS_SIG_cross_rsdpg_192_small_length_signature; sig->keypair = OQS_SIG_cross_rsdpg_192_small_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdpg_192_small_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdpg_192_small_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdpg_192_small_sign; sig->verify = OQS_SIG_cross_rsdpg_192_small_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdpg_192_small_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdpg_192_small_new(void) { } extern int PQCLEAN_CROSSRSDPG192SMALL_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG192SMALL_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG192SMALL_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG192SMALL_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG192SMALL_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdpg_192_small_avx2) extern int PQCLEAN_CROSSRSDPG192SMALL_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG192SMALL_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG192SMALL_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG192SMALL_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG192SMALL_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_small_keypair(uint8_t *public_key, ui #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_small_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_192_small_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192SMALL_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192SMALL_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192SMALL_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_small_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_192_small_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192SMALL_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192SMALL_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG192SMALL_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_192_small_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdpg_192_small_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdpg_256_balanced.c b/src/sig/cross/sig_cross_rsdpg_256_balanced.c index 0ecc634849..4d9bfeaf99 100644 --- a/src/sig/cross/sig_cross_rsdpg_256_balanced.c +++ b/src/sig/cross/sig_cross_rsdpg_256_balanced.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdpg_256_balanced_new(void) { sig->length_signature = OQS_SIG_cross_rsdpg_256_balanced_length_signature; sig->keypair = OQS_SIG_cross_rsdpg_256_balanced_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdpg_256_balanced_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdpg_256_balanced_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdpg_256_balanced_sign; sig->verify = OQS_SIG_cross_rsdpg_256_balanced_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdpg_256_balanced_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdpg_256_balanced_new(void) { } extern int PQCLEAN_CROSSRSDPG256BALANCED_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG256BALANCED_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG256BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG256BALANCED_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG256BALANCED_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdpg_256_balanced_avx2) extern int PQCLEAN_CROSSRSDPG256BALANCED_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG256BALANCED_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG256BALANCED_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG256BALANCED_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG256BALANCED_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_balanced_keypair(uint8_t *public_key, #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_balanced_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_256_balanced_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256BALANCED_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256BALANCED_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256BALANCED_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_balanced_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_256_balanced_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256BALANCED_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256BALANCED_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_balanced_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdpg_256_balanced_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdpg_256_fast.c b/src/sig/cross/sig_cross_rsdpg_256_fast.c index fc8c7ad9c4..634cf9381a 100644 --- a/src/sig/cross/sig_cross_rsdpg_256_fast.c +++ b/src/sig/cross/sig_cross_rsdpg_256_fast.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdpg_256_fast_new(void) { sig->length_signature = OQS_SIG_cross_rsdpg_256_fast_length_signature; sig->keypair = OQS_SIG_cross_rsdpg_256_fast_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdpg_256_fast_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdpg_256_fast_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdpg_256_fast_sign; sig->verify = OQS_SIG_cross_rsdpg_256_fast_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdpg_256_fast_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdpg_256_fast_new(void) { } extern int PQCLEAN_CROSSRSDPG256FAST_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG256FAST_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG256FAST_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG256FAST_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG256FAST_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdpg_256_fast_avx2) extern int PQCLEAN_CROSSRSDPG256FAST_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG256FAST_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG256FAST_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG256FAST_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG256FAST_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_fast_keypair(uint8_t *public_key, uin #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_fast_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_256_fast_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256FAST_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256FAST_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256FAST_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_fast_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_256_fast_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256FAST_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256FAST_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256FAST_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_fast_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdpg_256_fast_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/cross/sig_cross_rsdpg_256_small.c b/src/sig/cross/sig_cross_rsdpg_256_small.c index e4e7227a5f..d1eacbd438 100644 --- a/src/sig/cross/sig_cross_rsdpg_256_small.c +++ b/src/sig/cross/sig_cross_rsdpg_256_small.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_cross_rsdpg_256_small_new(void) { sig->length_signature = OQS_SIG_cross_rsdpg_256_small_length_signature; sig->keypair = OQS_SIG_cross_rsdpg_256_small_keypair; + sig->keypair_from_fseed = OQS_SIG_cross_rsdpg_256_small_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_cross_rsdpg_256_small_pubkey_from_privkey; sig->sign = OQS_SIG_cross_rsdpg_256_small_sign; sig->verify = OQS_SIG_cross_rsdpg_256_small_verify; sig->sign_with_ctx_str = OQS_SIG_cross_rsdpg_256_small_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_cross_rsdpg_256_small_new(void) { } extern int PQCLEAN_CROSSRSDPG256SMALL_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG256SMALL_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG256SMALL_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG256SMALL_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG256SMALL_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_cross_rsdpg_256_small_avx2) extern int PQCLEAN_CROSSRSDPG256SMALL_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_CROSSRSDPG256SMALL_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_CROSSRSDPG256SMALL_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG256SMALL_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_CROSSRSDPG256SMALL_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_small_keypair(uint8_t *public_key, ui #endif } +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_small_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_256_small_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256SMALL_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256SMALL_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256SMALL_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_small_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_cross_rsdpg_256_small_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256SMALL_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256SMALL_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_CROSSRSDPG256SMALL_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_cross_rsdpg_256_small_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_cross_rsdpg_256_small_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/dilithium/oldpqclean_dilithium2_aarch64/api.h b/src/sig/dilithium/oldpqclean_dilithium2_aarch64/api.h index 2ce42599b4..b9700497e6 100644 --- a/src/sig/dilithium/oldpqclean_dilithium2_aarch64/api.h +++ b/src/sig/dilithium/oldpqclean_dilithium2_aarch64/api.h @@ -19,6 +19,10 @@ int PQCLEAN_DILITHIUM2_AARCH64_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +int PQCLEAN_DILITHIUM2_AARCH64_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +int PQCLEAN_DILITHIUM2_AARCH64_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int PQCLEAN_DILITHIUM2_AARCH64_crypto_sign_signature( uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); diff --git a/src/sig/dilithium/oldpqclean_dilithium2_aarch64/sign.c b/src/sig/dilithium/oldpqclean_dilithium2_aarch64/sign.c index a299d72994..a83af97b48 100644 --- a/src/sig/dilithium/oldpqclean_dilithium2_aarch64/sign.c +++ b/src/sig/dilithium/oldpqclean_dilithium2_aarch64/sign.c @@ -96,6 +96,113 @@ int crypto_sign_keypair(uint8_t *pk, uint8_t *sk) { return 0; } +/************************************************* +* Name: crypto_sign_keypair_from_fseed +* +* Description: Generates public and private key from fixed seed. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key (allocated +* array of CRYPTO_SECRETKEYBYTES bytes) +* - const uint8_t *seed: Pointer to the input fixed seed. +* Must point to an array of SEEDBYTES bytes. +* The seed provides deterministic randomness +* for key generation and must be unique and +* securely generated for each keypair to +* ensure security. +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + uint8_t seedbuf[2 * SEEDBYTES + CRHBYTES]; + uint8_t tr[SEEDBYTES]; + const uint8_t *rho, *rhoprime, *key; + polyvecl mat[K]; + polyvecl s1, s1hat; + polyveck s2, t1, t0; + + /* Use fixed seed for randomness for rho, rhoprime and key */ + shake256(seedbuf, 2*SEEDBYTES + CRHBYTES, seed, SEEDBYTES); + rho = seedbuf; + rhoprime = rho + SEEDBYTES; + key = rhoprime + CRHBYTES; + + /* Expand matrix */ + polyvec_matrix_expand(mat, rho); + + /* Sample short vectors s1 and s2 */ + polyvecl_uniform_eta(&s1, rhoprime, 0); + polyveck_uniform_eta(&s2, rhoprime, L); + + /* Matrix-vector multiplication */ + s1hat = s1; + polyvecl_ntt(&s1hat); + polyvec_matrix_pointwise_montgomery(&t1, mat, &s1hat); + polyveck_reduce(&t1); + polyveck_invntt_tomont(&t1); + + /* Add error vector s2 */ + polyveck_add(&t1, &t1, &s2); + + /* Extract t1 and write public key */ + polyveck_caddq(&t1); + polyveck_power2round(&t1, &t0, &t1); + pack_pk(pk, rho, &t1); + + /* Compute H(rho, t1) and write secret key */ + shake256(tr, SEEDBYTES, pk, CRYPTO_PUBLICKEYBYTES); + pack_sk(sk, rho, tr, key, &t0, &s1, &s2); + + return 0; +} + +/************************************************* +* Name: crypto_sign_pubkey_from_privkey +* +* Description: Generates public key from exist private key. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - const uint8_t *sk: pointer to the input private key (points +* to a read-only array of CRYPTO_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk) { + uint8_t rho[SEEDBYTES]; + uint8_t tr[SEEDBYTES]; + uint8_t key[SEEDBYTES]; + polyvecl s1, s1hat; + polyveck s2, t0, t1; + polyvecl mat[K]; + + /* unpack privat key */ + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + /* Expand matrix */ + polyvec_matrix_expand(mat, rho); + + /* Matrix-vector multiplication */ + s1hat = s1; + polyvecl_ntt(&s1hat); + polyvec_matrix_pointwise_montgomery(&t1, mat, &s1hat); + polyveck_reduce(&t1); + polyveck_invntt_tomont(&t1); + + /* Add error vector s2 */ + polyveck_add(&t1, &t1, &s2); + + /* Extract t1 */ + polyveck_caddq(&t1); + polyveck_power2round(&t1, &t0, &t1); + + /* Pack public key */ + pack_pk(pk, rho, &t1); + + return 0; +} + /************************************************* * Name: crypto_sign_signature * diff --git a/src/sig/dilithium/oldpqclean_dilithium2_aarch64/sign.h b/src/sig/dilithium/oldpqclean_dilithium2_aarch64/sign.h index fba1bf1832..23886457fc 100644 --- a/src/sig/dilithium/oldpqclean_dilithium2_aarch64/sign.h +++ b/src/sig/dilithium/oldpqclean_dilithium2_aarch64/sign.h @@ -21,6 +21,12 @@ void challenge(poly *c, const uint8_t seed[SEEDBYTES]); #define crypto_sign_keypair DILITHIUM_NAMESPACE(crypto_sign_keypair) int crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +#define crypto_sign_keypair_from_fseed DILITHIUM_NAMESPACE(keypair_from_fseed) +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +#define crypto_sign_pubkey_from_privkey DILITHIUM_NAMESPACE(pubkey_from_privkey) +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + #define crypto_sign_signature DILITHIUM_NAMESPACE(crypto_sign_signature) int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, diff --git a/src/sig/dilithium/oldpqclean_dilithium3_aarch64/api.h b/src/sig/dilithium/oldpqclean_dilithium3_aarch64/api.h index 6a05644010..3752bc6316 100644 --- a/src/sig/dilithium/oldpqclean_dilithium3_aarch64/api.h +++ b/src/sig/dilithium/oldpqclean_dilithium3_aarch64/api.h @@ -19,6 +19,10 @@ int PQCLEAN_DILITHIUM3_AARCH64_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +int PQCLEAN_DILITHIUM3_AARCH64_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +int PQCLEAN_DILITHIUM3_AARCH64_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int PQCLEAN_DILITHIUM3_AARCH64_crypto_sign_signature( uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); diff --git a/src/sig/dilithium/oldpqclean_dilithium3_aarch64/sign.c b/src/sig/dilithium/oldpqclean_dilithium3_aarch64/sign.c index a299d72994..a83af97b48 100644 --- a/src/sig/dilithium/oldpqclean_dilithium3_aarch64/sign.c +++ b/src/sig/dilithium/oldpqclean_dilithium3_aarch64/sign.c @@ -96,6 +96,113 @@ int crypto_sign_keypair(uint8_t *pk, uint8_t *sk) { return 0; } +/************************************************* +* Name: crypto_sign_keypair_from_fseed +* +* Description: Generates public and private key from fixed seed. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key (allocated +* array of CRYPTO_SECRETKEYBYTES bytes) +* - const uint8_t *seed: Pointer to the input fixed seed. +* Must point to an array of SEEDBYTES bytes. +* The seed provides deterministic randomness +* for key generation and must be unique and +* securely generated for each keypair to +* ensure security. +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + uint8_t seedbuf[2 * SEEDBYTES + CRHBYTES]; + uint8_t tr[SEEDBYTES]; + const uint8_t *rho, *rhoprime, *key; + polyvecl mat[K]; + polyvecl s1, s1hat; + polyveck s2, t1, t0; + + /* Use fixed seed for randomness for rho, rhoprime and key */ + shake256(seedbuf, 2*SEEDBYTES + CRHBYTES, seed, SEEDBYTES); + rho = seedbuf; + rhoprime = rho + SEEDBYTES; + key = rhoprime + CRHBYTES; + + /* Expand matrix */ + polyvec_matrix_expand(mat, rho); + + /* Sample short vectors s1 and s2 */ + polyvecl_uniform_eta(&s1, rhoprime, 0); + polyveck_uniform_eta(&s2, rhoprime, L); + + /* Matrix-vector multiplication */ + s1hat = s1; + polyvecl_ntt(&s1hat); + polyvec_matrix_pointwise_montgomery(&t1, mat, &s1hat); + polyveck_reduce(&t1); + polyveck_invntt_tomont(&t1); + + /* Add error vector s2 */ + polyveck_add(&t1, &t1, &s2); + + /* Extract t1 and write public key */ + polyveck_caddq(&t1); + polyveck_power2round(&t1, &t0, &t1); + pack_pk(pk, rho, &t1); + + /* Compute H(rho, t1) and write secret key */ + shake256(tr, SEEDBYTES, pk, CRYPTO_PUBLICKEYBYTES); + pack_sk(sk, rho, tr, key, &t0, &s1, &s2); + + return 0; +} + +/************************************************* +* Name: crypto_sign_pubkey_from_privkey +* +* Description: Generates public key from exist private key. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - const uint8_t *sk: pointer to the input private key (points +* to a read-only array of CRYPTO_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk) { + uint8_t rho[SEEDBYTES]; + uint8_t tr[SEEDBYTES]; + uint8_t key[SEEDBYTES]; + polyvecl s1, s1hat; + polyveck s2, t0, t1; + polyvecl mat[K]; + + /* unpack privat key */ + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + /* Expand matrix */ + polyvec_matrix_expand(mat, rho); + + /* Matrix-vector multiplication */ + s1hat = s1; + polyvecl_ntt(&s1hat); + polyvec_matrix_pointwise_montgomery(&t1, mat, &s1hat); + polyveck_reduce(&t1); + polyveck_invntt_tomont(&t1); + + /* Add error vector s2 */ + polyveck_add(&t1, &t1, &s2); + + /* Extract t1 */ + polyveck_caddq(&t1); + polyveck_power2round(&t1, &t0, &t1); + + /* Pack public key */ + pack_pk(pk, rho, &t1); + + return 0; +} + /************************************************* * Name: crypto_sign_signature * diff --git a/src/sig/dilithium/oldpqclean_dilithium3_aarch64/sign.h b/src/sig/dilithium/oldpqclean_dilithium3_aarch64/sign.h index fba1bf1832..23886457fc 100644 --- a/src/sig/dilithium/oldpqclean_dilithium3_aarch64/sign.h +++ b/src/sig/dilithium/oldpqclean_dilithium3_aarch64/sign.h @@ -21,6 +21,12 @@ void challenge(poly *c, const uint8_t seed[SEEDBYTES]); #define crypto_sign_keypair DILITHIUM_NAMESPACE(crypto_sign_keypair) int crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +#define crypto_sign_keypair_from_fseed DILITHIUM_NAMESPACE(keypair_from_fseed) +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +#define crypto_sign_pubkey_from_privkey DILITHIUM_NAMESPACE(pubkey_from_privkey) +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + #define crypto_sign_signature DILITHIUM_NAMESPACE(crypto_sign_signature) int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, diff --git a/src/sig/dilithium/oldpqclean_dilithium5_aarch64/api.h b/src/sig/dilithium/oldpqclean_dilithium5_aarch64/api.h index ab5e2c4183..69c1ccc487 100644 --- a/src/sig/dilithium/oldpqclean_dilithium5_aarch64/api.h +++ b/src/sig/dilithium/oldpqclean_dilithium5_aarch64/api.h @@ -20,6 +20,10 @@ int PQCLEAN_DILITHIUM5_AARCH64_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +int PQCLEAN_DILITHIUM5_AARCH64_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +int PQCLEAN_DILITHIUM5_AARCH64_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int PQCLEAN_DILITHIUM5_AARCH64_crypto_sign_signature( uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); diff --git a/src/sig/dilithium/oldpqclean_dilithium5_aarch64/sign.c b/src/sig/dilithium/oldpqclean_dilithium5_aarch64/sign.c index a299d72994..a83af97b48 100644 --- a/src/sig/dilithium/oldpqclean_dilithium5_aarch64/sign.c +++ b/src/sig/dilithium/oldpqclean_dilithium5_aarch64/sign.c @@ -96,6 +96,113 @@ int crypto_sign_keypair(uint8_t *pk, uint8_t *sk) { return 0; } +/************************************************* +* Name: crypto_sign_keypair_from_fseed +* +* Description: Generates public and private key from fixed seed. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key (allocated +* array of CRYPTO_SECRETKEYBYTES bytes) +* - const uint8_t *seed: Pointer to the input fixed seed. +* Must point to an array of SEEDBYTES bytes. +* The seed provides deterministic randomness +* for key generation and must be unique and +* securely generated for each keypair to +* ensure security. +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + uint8_t seedbuf[2 * SEEDBYTES + CRHBYTES]; + uint8_t tr[SEEDBYTES]; + const uint8_t *rho, *rhoprime, *key; + polyvecl mat[K]; + polyvecl s1, s1hat; + polyveck s2, t1, t0; + + /* Use fixed seed for randomness for rho, rhoprime and key */ + shake256(seedbuf, 2*SEEDBYTES + CRHBYTES, seed, SEEDBYTES); + rho = seedbuf; + rhoprime = rho + SEEDBYTES; + key = rhoprime + CRHBYTES; + + /* Expand matrix */ + polyvec_matrix_expand(mat, rho); + + /* Sample short vectors s1 and s2 */ + polyvecl_uniform_eta(&s1, rhoprime, 0); + polyveck_uniform_eta(&s2, rhoprime, L); + + /* Matrix-vector multiplication */ + s1hat = s1; + polyvecl_ntt(&s1hat); + polyvec_matrix_pointwise_montgomery(&t1, mat, &s1hat); + polyveck_reduce(&t1); + polyveck_invntt_tomont(&t1); + + /* Add error vector s2 */ + polyveck_add(&t1, &t1, &s2); + + /* Extract t1 and write public key */ + polyveck_caddq(&t1); + polyveck_power2round(&t1, &t0, &t1); + pack_pk(pk, rho, &t1); + + /* Compute H(rho, t1) and write secret key */ + shake256(tr, SEEDBYTES, pk, CRYPTO_PUBLICKEYBYTES); + pack_sk(sk, rho, tr, key, &t0, &s1, &s2); + + return 0; +} + +/************************************************* +* Name: crypto_sign_pubkey_from_privkey +* +* Description: Generates public key from exist private key. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - const uint8_t *sk: pointer to the input private key (points +* to a read-only array of CRYPTO_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk) { + uint8_t rho[SEEDBYTES]; + uint8_t tr[SEEDBYTES]; + uint8_t key[SEEDBYTES]; + polyvecl s1, s1hat; + polyveck s2, t0, t1; + polyvecl mat[K]; + + /* unpack privat key */ + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + /* Expand matrix */ + polyvec_matrix_expand(mat, rho); + + /* Matrix-vector multiplication */ + s1hat = s1; + polyvecl_ntt(&s1hat); + polyvec_matrix_pointwise_montgomery(&t1, mat, &s1hat); + polyveck_reduce(&t1); + polyveck_invntt_tomont(&t1); + + /* Add error vector s2 */ + polyveck_add(&t1, &t1, &s2); + + /* Extract t1 */ + polyveck_caddq(&t1); + polyveck_power2round(&t1, &t0, &t1); + + /* Pack public key */ + pack_pk(pk, rho, &t1); + + return 0; +} + /************************************************* * Name: crypto_sign_signature * diff --git a/src/sig/dilithium/oldpqclean_dilithium5_aarch64/sign.h b/src/sig/dilithium/oldpqclean_dilithium5_aarch64/sign.h index fba1bf1832..23886457fc 100644 --- a/src/sig/dilithium/oldpqclean_dilithium5_aarch64/sign.h +++ b/src/sig/dilithium/oldpqclean_dilithium5_aarch64/sign.h @@ -21,6 +21,12 @@ void challenge(poly *c, const uint8_t seed[SEEDBYTES]); #define crypto_sign_keypair DILITHIUM_NAMESPACE(crypto_sign_keypair) int crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +#define crypto_sign_keypair_from_fseed DILITHIUM_NAMESPACE(keypair_from_fseed) +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +#define crypto_sign_pubkey_from_privkey DILITHIUM_NAMESPACE(pubkey_from_privkey) +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + #define crypto_sign_signature DILITHIUM_NAMESPACE(crypto_sign_signature) int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium2_avx2/api.h b/src/sig/dilithium/pqcrystals-dilithium_dilithium2_avx2/api.h index d64709d676..a4771cb952 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium2_avx2/api.h +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium2_avx2/api.h @@ -14,6 +14,11 @@ int pqcrystals_dilithium2_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium2_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium2_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium2_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -36,6 +41,11 @@ int pqcrystals_dilithium2_avx2_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium2aes_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium2aes_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium2aes_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium2aes_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -62,6 +72,11 @@ int pqcrystals_dilithium2aes_avx2_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium3_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium3_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium3_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium3_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -84,6 +99,11 @@ int pqcrystals_dilithium3_avx2_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium3aes_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium3aes_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium3aes_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium3aes_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -110,6 +130,11 @@ int pqcrystals_dilithium3aes_avx2_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium5_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium5_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium5_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium5_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -132,6 +157,11 @@ int pqcrystals_dilithium5_avx2_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium5aes_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium5aes_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium5aes_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium5aes_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium2_avx2/sign.c b/src/sig/dilithium/pqcrystals-dilithium_dilithium2_avx2/sign.c index 448cdd17de..bc9fb2d5d7 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium2_avx2/sign.c +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium2_avx2/sign.c @@ -175,6 +175,205 @@ int crypto_sign_keypair(uint8_t *pk, uint8_t *sk) { return 0; } +/************************************************* +* Name: crypto_sign_keypair_from_fseed +* +* Description: Generates public and private key from fixed seed. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key (allocated +* array of CRYPTO_SECRETKEYBYTES bytes) +* - const uint8_t *seed: Pointer to the input fixed seed. +* Must point to an array of SEEDBYTES bytes. +* The seed provides deterministic randomness +* for key generation and must be unique and +* securely generated for each keypair to +* ensure security. +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + unsigned int i; + uint8_t seedbuf[2*SEEDBYTES + CRHBYTES]; + const uint8_t *rho, *rhoprime, *key; +#ifdef DILITHIUM_USE_AES + uint64_t nonce; + aes256ctr_ctx aesctx; + polyvecl rowbuf[1]; +#else + polyvecl rowbuf[2]; +#endif + polyvecl s1, *row = rowbuf; + polyveck s2; + poly t1, t0; + + /* Use fixed seed for randomness for rho, rhoprime and key */ + shake256(seedbuf, 2*SEEDBYTES + CRHBYTES, seed, SEEDBYTES); + rho = seedbuf; + rhoprime = rho + SEEDBYTES; + key = rhoprime + CRHBYTES; + + /* Store rho, key */ + memcpy(pk, rho, SEEDBYTES); + memcpy(sk, rho, SEEDBYTES); + memcpy(sk + SEEDBYTES, key, SEEDBYTES); + + /* Sample short vectors s1 and s2 */ +#ifdef DILITHIUM_USE_AES + aes256ctr_init_u64(&aesctx, rhoprime, 0); + for(i = 0; i < L; ++i) { + nonce = i; + aes256ctr_init_iv_u64(&aesctx, nonce); + poly_uniform_eta_preinit(&s1.vec[i], &aesctx); + } + for(i = 0; i < K; ++i) { + nonce = L + i; + aes256ctr_init_iv_u64(&aesctx, nonce); + poly_uniform_eta_preinit(&s2.vec[i], &aesctx); + } + aes256_ctx_release(&aesctx); +#elif K == 4 && L == 4 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s2.vec[0], &s2.vec[1], &s2.vec[2], &s2.vec[3], rhoprime, 4, 5, 6, 7); +#elif K == 6 && L == 5 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s1.vec[4], &s2.vec[0], &s2.vec[1], &s2.vec[2], rhoprime, 4, 5, 6, 7); + poly_uniform_eta_4x(&s2.vec[3], &s2.vec[4], &s2.vec[5], &t0, rhoprime, 8, 9, 10, 11); +#elif K == 8 && L == 7 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s1.vec[4], &s1.vec[5], &s1.vec[6], &s2.vec[0], rhoprime, 4, 5, 6, 7); + poly_uniform_eta_4x(&s2.vec[1], &s2.vec[2], &s2.vec[3], &s2.vec[4], rhoprime, 8, 9, 10, 11); + poly_uniform_eta_4x(&s2.vec[5], &s2.vec[6], &s2.vec[7], &t0, rhoprime, 12, 13, 14, 15); +#else +#error +#endif + + /* Pack secret vectors */ + for(i = 0; i < L; i++) + polyeta_pack(sk + 3*SEEDBYTES + i*POLYETA_PACKEDBYTES, &s1.vec[i]); + for(i = 0; i < K; i++) + polyeta_pack(sk + 3*SEEDBYTES + (L + i)*POLYETA_PACKEDBYTES, &s2.vec[i]); + + /* Transform s1 */ + polyvecl_ntt(&s1); + +#ifdef DILITHIUM_USE_AES + aes256ctr_init_u64(&aesctx, rho, 0); +#endif + + for(i = 0; i < K; i++) { + /* Expand matrix row */ +#ifdef DILITHIUM_USE_AES + for(unsigned int j = 0; j < L; j++) { + nonce = (i << 8) + j; + aes256ctr_init_iv_u64(&aesctx, nonce); + poly_uniform_preinit(&row->vec[j], &aesctx); + poly_nttunpack(&row->vec[j]); + } +#else + polyvec_matrix_expand_row(&row, rowbuf, rho, i); +#endif + + /* Compute inner-product */ + polyvecl_pointwise_acc_montgomery(&t1, row, &s1); + poly_invntt_tomont(&t1); + + /* Add error polynomial */ + poly_add(&t1, &t1, &s2.vec[i]); + + /* Round t and pack t1, t0 */ + poly_caddq(&t1); + poly_power2round(&t1, &t0, &t1); + polyt1_pack(pk + SEEDBYTES + i*POLYT1_PACKEDBYTES, &t1); + polyt0_pack(sk + 3*SEEDBYTES + (L+K)*POLYETA_PACKEDBYTES + i*POLYT0_PACKEDBYTES, &t0); + } + +#ifdef DILITHIUM_USE_AES + aes256_ctx_release(&aesctx); +#endif + + /* Compute H(rho, t1) and store in secret key */ + shake256(sk + 2*SEEDBYTES, SEEDBYTES, pk, CRYPTO_PUBLICKEYBYTES); + + return 0; +} + +/************************************************* +* Name: crypto_sign_pubkey_from_privkey +* +* Description: Generates public key from existing private key. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - const uint8_t *sk: pointer to input private key (points +* to array of CRYPTO_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk) { + unsigned int i; + uint8_t rho[SEEDBYTES]; + uint8_t tr[SEEDBYTES]; + uint8_t key[SEEDBYTES]; +#ifdef DILITHIUM_USE_AES + uint64_t nonce; + aes256ctr_ctx aesctx; + polyvecl rowbuf[1]; +#else + polyvecl rowbuf[2]; +#endif + polyvecl s1, *row = rowbuf; + polyveck s2; + poly t1, t0; + + // Unpack private key + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + // Store rho in public key + memcpy(pk, rho, SEEDBYTES); + + // Transform s1 + polyvecl_ntt(&s1); + +#ifdef DILITHIUM_USE_AES + aes256ctr_init_u64(&aesctx, rho, 0); +#endif + + // Process each row + for(i = 0; i < K; i++) { + /* Expand matrix row */ +#ifdef DILITHIUM_USE_AES + for(unsigned int j = 0; j < L; j++) { + nonce = (i << 8) + j; + aes256ctr_init_iv_u64(&aesctx, nonce); + poly_uniform_preinit(&row->vec[j], &aesctx); + poly_nttunpack(&row->vec[j]); + } +#else + polyvec_matrix_expand_row(&row, rowbuf, rho, i); +#endif + + /* Compute inner-product */ + polyvecl_pointwise_acc_montgomery(&t1, row, &s1); + poly_invntt_tomont(&t1); + + /* Add error polynomial */ + poly_add(&t1, &t1, &s2.vec[i]); + + /* Round t and pack t1 */ + poly_caddq(&t1); + poly_power2round(&t1, &t0, &t1); + polyt1_pack(pk + SEEDBYTES + i*POLYT1_PACKEDBYTES, &t1); + } + +#ifdef DILITHIUM_USE_AES + aes256_ctx_release(&aesctx); +#endif + + return 0; +} + /************************************************* * Name: crypto_sign_signature * diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium2_avx2/sign.h b/src/sig/dilithium/pqcrystals-dilithium_dilithium2_avx2/sign.h index 295f378c00..a5022837df 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium2_avx2/sign.h +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium2_avx2/sign.h @@ -13,6 +13,13 @@ void challenge(poly *c, const uint8_t seed[SEEDBYTES]); #define crypto_sign_keypair DILITHIUM_NAMESPACE(keypair) int crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +#define crypto_sign_keypair_from_fseed DILITHIUM_NAMESPACE(keypair_from_fseed) +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +#define crypto_sign_pubkey_from_privkey DILITHIUM_NAMESPACE(pubkey_from_privkey) +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + #define crypto_sign_signature DILITHIUM_NAMESPACE(signature) int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium2_ref/api.h b/src/sig/dilithium/pqcrystals-dilithium_dilithium2_ref/api.h index ceeef106dc..4fd8d934d0 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium2_ref/api.h +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium2_ref/api.h @@ -14,6 +14,11 @@ int pqcrystals_dilithium2_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium2_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium2_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium2_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -36,6 +41,11 @@ int pqcrystals_dilithium2_ref_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium2aes_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium2aes_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium2aes_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium2aes_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -62,6 +72,11 @@ int pqcrystals_dilithium2aes_ref_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium3_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium3_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium3_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium3_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -84,6 +99,11 @@ int pqcrystals_dilithium3_ref_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium3aes_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium3aes_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium3aes_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium3aes_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -110,6 +130,11 @@ int pqcrystals_dilithium3aes_ref_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium5_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium5_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium5_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium5_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -132,6 +157,11 @@ int pqcrystals_dilithium5_ref_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium5aes_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium5aes_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium5aes_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium5aes_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium2_ref/sign.c b/src/sig/dilithium/pqcrystals-dilithium_dilithium2_ref/sign.c index 16333eb84d..cdf6ab5fd7 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium2_ref/sign.c +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium2_ref/sign.c @@ -64,6 +64,113 @@ int crypto_sign_keypair(uint8_t *pk, uint8_t *sk) { return 0; } +/************************************************* +* Name: crypto_sign_keypair_from_fseed +* +* Description: Generates public and private key from fixed seed. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key (allocated +* array of CRYPTO_SECRETKEYBYTES bytes) +* - const uint8_t *seed: Pointer to the input fixed seed. +* Must point to an array of SEEDBYTES bytes. +* The seed provides deterministic randomness +* for key generation and must be unique and +* securely generated for each keypair to +* ensure security. +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + uint8_t seedbuf[2*SEEDBYTES + CRHBYTES]; + uint8_t tr[SEEDBYTES]; + const uint8_t *rho, *rhoprime, *key; + polyvecl mat[K]; + polyvecl s1, s1hat; + polyveck s2, t1, t0; + + /* Use fixed seed for randomness for rho, rhoprime and key */ + shake256(seedbuf, 2*SEEDBYTES + CRHBYTES, seed, SEEDBYTES); + rho = seedbuf; + rhoprime = rho + SEEDBYTES; + key = rhoprime + CRHBYTES; + + /* Expand matrix */ + polyvec_matrix_expand(mat, rho); + + /* Sample short vectors s1 and s2 */ + polyvecl_uniform_eta(&s1, rhoprime, 0); + polyveck_uniform_eta(&s2, rhoprime, L); + + /* Matrix-vector multiplication */ + s1hat = s1; + polyvecl_ntt(&s1hat); + polyvec_matrix_pointwise_montgomery(&t1, mat, &s1hat); + polyveck_reduce(&t1); + polyveck_invntt_tomont(&t1); + + /* Add error vector s2 */ + polyveck_add(&t1, &t1, &s2); + + /* Extract t1 and write public key */ + polyveck_caddq(&t1); + polyveck_power2round(&t1, &t0, &t1); + pack_pk(pk, rho, &t1); + + /* Compute H(rho, t1) and write secret key */ + shake256(tr, SEEDBYTES, pk, CRYPTO_PUBLICKEYBYTES); + pack_sk(sk, rho, tr, key, &t0, &s1, &s2); + + return 0; +} + +/************************************************* +* Name: crypto_sign_pubkey_from_privkey +* +* Description: Generates public key from exist private key. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - const uint8_t *sk: pointer to the input private key (points +* to a read-only array of CRYPTO_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk) { + uint8_t rho[SEEDBYTES]; + uint8_t tr[SEEDBYTES]; + uint8_t key[SEEDBYTES]; + polyvecl s1, s1hat; + polyveck s2, t0, t1; + polyvecl mat[K]; + + /* unpack privat key */ + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + /* Expand matrix */ + polyvec_matrix_expand(mat, rho); + + /* Matrix-vector multiplication */ + s1hat = s1; + polyvecl_ntt(&s1hat); + polyvec_matrix_pointwise_montgomery(&t1, mat, &s1hat); + polyveck_reduce(&t1); + polyveck_invntt_tomont(&t1); + + /* Add error vector s2 */ + polyveck_add(&t1, &t1, &s2); + + /* Extract t1 */ + polyveck_caddq(&t1); + polyveck_power2round(&t1, &t0, &t1); + + /* Pack public key */ + pack_pk(pk, rho, &t1); + + return 0; +} + /************************************************* * Name: crypto_sign_signature * diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium2_ref/sign.h b/src/sig/dilithium/pqcrystals-dilithium_dilithium2_ref/sign.h index 295f378c00..a5022837df 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium2_ref/sign.h +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium2_ref/sign.h @@ -13,6 +13,13 @@ void challenge(poly *c, const uint8_t seed[SEEDBYTES]); #define crypto_sign_keypair DILITHIUM_NAMESPACE(keypair) int crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +#define crypto_sign_keypair_from_fseed DILITHIUM_NAMESPACE(keypair_from_fseed) +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +#define crypto_sign_pubkey_from_privkey DILITHIUM_NAMESPACE(pubkey_from_privkey) +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + #define crypto_sign_signature DILITHIUM_NAMESPACE(signature) int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium3_avx2/api.h b/src/sig/dilithium/pqcrystals-dilithium_dilithium3_avx2/api.h index d64709d676..a4771cb952 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium3_avx2/api.h +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium3_avx2/api.h @@ -14,6 +14,11 @@ int pqcrystals_dilithium2_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium2_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium2_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium2_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -36,6 +41,11 @@ int pqcrystals_dilithium2_avx2_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium2aes_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium2aes_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium2aes_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium2aes_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -62,6 +72,11 @@ int pqcrystals_dilithium2aes_avx2_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium3_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium3_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium3_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium3_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -84,6 +99,11 @@ int pqcrystals_dilithium3_avx2_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium3aes_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium3aes_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium3aes_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium3aes_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -110,6 +130,11 @@ int pqcrystals_dilithium3aes_avx2_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium5_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium5_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium5_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium5_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -132,6 +157,11 @@ int pqcrystals_dilithium5_avx2_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium5aes_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium5aes_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium5aes_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium5aes_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium3_avx2/sign.c b/src/sig/dilithium/pqcrystals-dilithium_dilithium3_avx2/sign.c index 448cdd17de..bc9fb2d5d7 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium3_avx2/sign.c +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium3_avx2/sign.c @@ -175,6 +175,205 @@ int crypto_sign_keypair(uint8_t *pk, uint8_t *sk) { return 0; } +/************************************************* +* Name: crypto_sign_keypair_from_fseed +* +* Description: Generates public and private key from fixed seed. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key (allocated +* array of CRYPTO_SECRETKEYBYTES bytes) +* - const uint8_t *seed: Pointer to the input fixed seed. +* Must point to an array of SEEDBYTES bytes. +* The seed provides deterministic randomness +* for key generation and must be unique and +* securely generated for each keypair to +* ensure security. +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + unsigned int i; + uint8_t seedbuf[2*SEEDBYTES + CRHBYTES]; + const uint8_t *rho, *rhoprime, *key; +#ifdef DILITHIUM_USE_AES + uint64_t nonce; + aes256ctr_ctx aesctx; + polyvecl rowbuf[1]; +#else + polyvecl rowbuf[2]; +#endif + polyvecl s1, *row = rowbuf; + polyveck s2; + poly t1, t0; + + /* Use fixed seed for randomness for rho, rhoprime and key */ + shake256(seedbuf, 2*SEEDBYTES + CRHBYTES, seed, SEEDBYTES); + rho = seedbuf; + rhoprime = rho + SEEDBYTES; + key = rhoprime + CRHBYTES; + + /* Store rho, key */ + memcpy(pk, rho, SEEDBYTES); + memcpy(sk, rho, SEEDBYTES); + memcpy(sk + SEEDBYTES, key, SEEDBYTES); + + /* Sample short vectors s1 and s2 */ +#ifdef DILITHIUM_USE_AES + aes256ctr_init_u64(&aesctx, rhoprime, 0); + for(i = 0; i < L; ++i) { + nonce = i; + aes256ctr_init_iv_u64(&aesctx, nonce); + poly_uniform_eta_preinit(&s1.vec[i], &aesctx); + } + for(i = 0; i < K; ++i) { + nonce = L + i; + aes256ctr_init_iv_u64(&aesctx, nonce); + poly_uniform_eta_preinit(&s2.vec[i], &aesctx); + } + aes256_ctx_release(&aesctx); +#elif K == 4 && L == 4 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s2.vec[0], &s2.vec[1], &s2.vec[2], &s2.vec[3], rhoprime, 4, 5, 6, 7); +#elif K == 6 && L == 5 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s1.vec[4], &s2.vec[0], &s2.vec[1], &s2.vec[2], rhoprime, 4, 5, 6, 7); + poly_uniform_eta_4x(&s2.vec[3], &s2.vec[4], &s2.vec[5], &t0, rhoprime, 8, 9, 10, 11); +#elif K == 8 && L == 7 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s1.vec[4], &s1.vec[5], &s1.vec[6], &s2.vec[0], rhoprime, 4, 5, 6, 7); + poly_uniform_eta_4x(&s2.vec[1], &s2.vec[2], &s2.vec[3], &s2.vec[4], rhoprime, 8, 9, 10, 11); + poly_uniform_eta_4x(&s2.vec[5], &s2.vec[6], &s2.vec[7], &t0, rhoprime, 12, 13, 14, 15); +#else +#error +#endif + + /* Pack secret vectors */ + for(i = 0; i < L; i++) + polyeta_pack(sk + 3*SEEDBYTES + i*POLYETA_PACKEDBYTES, &s1.vec[i]); + for(i = 0; i < K; i++) + polyeta_pack(sk + 3*SEEDBYTES + (L + i)*POLYETA_PACKEDBYTES, &s2.vec[i]); + + /* Transform s1 */ + polyvecl_ntt(&s1); + +#ifdef DILITHIUM_USE_AES + aes256ctr_init_u64(&aesctx, rho, 0); +#endif + + for(i = 0; i < K; i++) { + /* Expand matrix row */ +#ifdef DILITHIUM_USE_AES + for(unsigned int j = 0; j < L; j++) { + nonce = (i << 8) + j; + aes256ctr_init_iv_u64(&aesctx, nonce); + poly_uniform_preinit(&row->vec[j], &aesctx); + poly_nttunpack(&row->vec[j]); + } +#else + polyvec_matrix_expand_row(&row, rowbuf, rho, i); +#endif + + /* Compute inner-product */ + polyvecl_pointwise_acc_montgomery(&t1, row, &s1); + poly_invntt_tomont(&t1); + + /* Add error polynomial */ + poly_add(&t1, &t1, &s2.vec[i]); + + /* Round t and pack t1, t0 */ + poly_caddq(&t1); + poly_power2round(&t1, &t0, &t1); + polyt1_pack(pk + SEEDBYTES + i*POLYT1_PACKEDBYTES, &t1); + polyt0_pack(sk + 3*SEEDBYTES + (L+K)*POLYETA_PACKEDBYTES + i*POLYT0_PACKEDBYTES, &t0); + } + +#ifdef DILITHIUM_USE_AES + aes256_ctx_release(&aesctx); +#endif + + /* Compute H(rho, t1) and store in secret key */ + shake256(sk + 2*SEEDBYTES, SEEDBYTES, pk, CRYPTO_PUBLICKEYBYTES); + + return 0; +} + +/************************************************* +* Name: crypto_sign_pubkey_from_privkey +* +* Description: Generates public key from existing private key. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - const uint8_t *sk: pointer to input private key (points +* to array of CRYPTO_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk) { + unsigned int i; + uint8_t rho[SEEDBYTES]; + uint8_t tr[SEEDBYTES]; + uint8_t key[SEEDBYTES]; +#ifdef DILITHIUM_USE_AES + uint64_t nonce; + aes256ctr_ctx aesctx; + polyvecl rowbuf[1]; +#else + polyvecl rowbuf[2]; +#endif + polyvecl s1, *row = rowbuf; + polyveck s2; + poly t1, t0; + + // Unpack private key + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + // Store rho in public key + memcpy(pk, rho, SEEDBYTES); + + // Transform s1 + polyvecl_ntt(&s1); + +#ifdef DILITHIUM_USE_AES + aes256ctr_init_u64(&aesctx, rho, 0); +#endif + + // Process each row + for(i = 0; i < K; i++) { + /* Expand matrix row */ +#ifdef DILITHIUM_USE_AES + for(unsigned int j = 0; j < L; j++) { + nonce = (i << 8) + j; + aes256ctr_init_iv_u64(&aesctx, nonce); + poly_uniform_preinit(&row->vec[j], &aesctx); + poly_nttunpack(&row->vec[j]); + } +#else + polyvec_matrix_expand_row(&row, rowbuf, rho, i); +#endif + + /* Compute inner-product */ + polyvecl_pointwise_acc_montgomery(&t1, row, &s1); + poly_invntt_tomont(&t1); + + /* Add error polynomial */ + poly_add(&t1, &t1, &s2.vec[i]); + + /* Round t and pack t1 */ + poly_caddq(&t1); + poly_power2round(&t1, &t0, &t1); + polyt1_pack(pk + SEEDBYTES + i*POLYT1_PACKEDBYTES, &t1); + } + +#ifdef DILITHIUM_USE_AES + aes256_ctx_release(&aesctx); +#endif + + return 0; +} + /************************************************* * Name: crypto_sign_signature * diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium3_avx2/sign.h b/src/sig/dilithium/pqcrystals-dilithium_dilithium3_avx2/sign.h index 295f378c00..a5022837df 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium3_avx2/sign.h +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium3_avx2/sign.h @@ -13,6 +13,13 @@ void challenge(poly *c, const uint8_t seed[SEEDBYTES]); #define crypto_sign_keypair DILITHIUM_NAMESPACE(keypair) int crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +#define crypto_sign_keypair_from_fseed DILITHIUM_NAMESPACE(keypair_from_fseed) +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +#define crypto_sign_pubkey_from_privkey DILITHIUM_NAMESPACE(pubkey_from_privkey) +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + #define crypto_sign_signature DILITHIUM_NAMESPACE(signature) int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium3_ref/api.h b/src/sig/dilithium/pqcrystals-dilithium_dilithium3_ref/api.h index ceeef106dc..4fd8d934d0 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium3_ref/api.h +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium3_ref/api.h @@ -14,6 +14,11 @@ int pqcrystals_dilithium2_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium2_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium2_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium2_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -36,6 +41,11 @@ int pqcrystals_dilithium2_ref_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium2aes_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium2aes_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium2aes_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium2aes_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -62,6 +72,11 @@ int pqcrystals_dilithium2aes_ref_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium3_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium3_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium3_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium3_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -84,6 +99,11 @@ int pqcrystals_dilithium3_ref_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium3aes_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium3aes_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium3aes_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium3aes_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -110,6 +130,11 @@ int pqcrystals_dilithium3aes_ref_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium5_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium5_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium5_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium5_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -132,6 +157,11 @@ int pqcrystals_dilithium5_ref_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium5aes_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium5aes_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium5aes_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium5aes_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium3_ref/sign.c b/src/sig/dilithium/pqcrystals-dilithium_dilithium3_ref/sign.c index 16333eb84d..cdf6ab5fd7 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium3_ref/sign.c +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium3_ref/sign.c @@ -64,6 +64,113 @@ int crypto_sign_keypair(uint8_t *pk, uint8_t *sk) { return 0; } +/************************************************* +* Name: crypto_sign_keypair_from_fseed +* +* Description: Generates public and private key from fixed seed. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key (allocated +* array of CRYPTO_SECRETKEYBYTES bytes) +* - const uint8_t *seed: Pointer to the input fixed seed. +* Must point to an array of SEEDBYTES bytes. +* The seed provides deterministic randomness +* for key generation and must be unique and +* securely generated for each keypair to +* ensure security. +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + uint8_t seedbuf[2*SEEDBYTES + CRHBYTES]; + uint8_t tr[SEEDBYTES]; + const uint8_t *rho, *rhoprime, *key; + polyvecl mat[K]; + polyvecl s1, s1hat; + polyveck s2, t1, t0; + + /* Use fixed seed for randomness for rho, rhoprime and key */ + shake256(seedbuf, 2*SEEDBYTES + CRHBYTES, seed, SEEDBYTES); + rho = seedbuf; + rhoprime = rho + SEEDBYTES; + key = rhoprime + CRHBYTES; + + /* Expand matrix */ + polyvec_matrix_expand(mat, rho); + + /* Sample short vectors s1 and s2 */ + polyvecl_uniform_eta(&s1, rhoprime, 0); + polyveck_uniform_eta(&s2, rhoprime, L); + + /* Matrix-vector multiplication */ + s1hat = s1; + polyvecl_ntt(&s1hat); + polyvec_matrix_pointwise_montgomery(&t1, mat, &s1hat); + polyveck_reduce(&t1); + polyveck_invntt_tomont(&t1); + + /* Add error vector s2 */ + polyveck_add(&t1, &t1, &s2); + + /* Extract t1 and write public key */ + polyveck_caddq(&t1); + polyveck_power2round(&t1, &t0, &t1); + pack_pk(pk, rho, &t1); + + /* Compute H(rho, t1) and write secret key */ + shake256(tr, SEEDBYTES, pk, CRYPTO_PUBLICKEYBYTES); + pack_sk(sk, rho, tr, key, &t0, &s1, &s2); + + return 0; +} + +/************************************************* +* Name: crypto_sign_pubkey_from_privkey +* +* Description: Generates public key from exist private key. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - const uint8_t *sk: pointer to the input private key (points +* to a read-only array of CRYPTO_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk) { + uint8_t rho[SEEDBYTES]; + uint8_t tr[SEEDBYTES]; + uint8_t key[SEEDBYTES]; + polyvecl s1, s1hat; + polyveck s2, t0, t1; + polyvecl mat[K]; + + /* unpack privat key */ + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + /* Expand matrix */ + polyvec_matrix_expand(mat, rho); + + /* Matrix-vector multiplication */ + s1hat = s1; + polyvecl_ntt(&s1hat); + polyvec_matrix_pointwise_montgomery(&t1, mat, &s1hat); + polyveck_reduce(&t1); + polyveck_invntt_tomont(&t1); + + /* Add error vector s2 */ + polyveck_add(&t1, &t1, &s2); + + /* Extract t1 */ + polyveck_caddq(&t1); + polyveck_power2round(&t1, &t0, &t1); + + /* Pack public key */ + pack_pk(pk, rho, &t1); + + return 0; +} + /************************************************* * Name: crypto_sign_signature * diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium3_ref/sign.h b/src/sig/dilithium/pqcrystals-dilithium_dilithium3_ref/sign.h index 295f378c00..a5022837df 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium3_ref/sign.h +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium3_ref/sign.h @@ -13,6 +13,13 @@ void challenge(poly *c, const uint8_t seed[SEEDBYTES]); #define crypto_sign_keypair DILITHIUM_NAMESPACE(keypair) int crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +#define crypto_sign_keypair_from_fseed DILITHIUM_NAMESPACE(keypair_from_fseed) +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +#define crypto_sign_pubkey_from_privkey DILITHIUM_NAMESPACE(pubkey_from_privkey) +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + #define crypto_sign_signature DILITHIUM_NAMESPACE(signature) int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium5_avx2/api.h b/src/sig/dilithium/pqcrystals-dilithium_dilithium5_avx2/api.h index d64709d676..a4771cb952 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium5_avx2/api.h +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium5_avx2/api.h @@ -14,6 +14,11 @@ int pqcrystals_dilithium2_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium2_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium2_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium2_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -36,6 +41,11 @@ int pqcrystals_dilithium2_avx2_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium2aes_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium2aes_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium2aes_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium2aes_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -62,6 +72,11 @@ int pqcrystals_dilithium2aes_avx2_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium3_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium3_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium3_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium3_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -84,6 +99,11 @@ int pqcrystals_dilithium3_avx2_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium3aes_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium3aes_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium3aes_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium3aes_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -110,6 +130,11 @@ int pqcrystals_dilithium3aes_avx2_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium5_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium5_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium5_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium5_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -132,6 +157,11 @@ int pqcrystals_dilithium5_avx2_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium5aes_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium5aes_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium5aes_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium5aes_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium5_avx2/sign.c b/src/sig/dilithium/pqcrystals-dilithium_dilithium5_avx2/sign.c index 448cdd17de..bc9fb2d5d7 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium5_avx2/sign.c +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium5_avx2/sign.c @@ -175,6 +175,205 @@ int crypto_sign_keypair(uint8_t *pk, uint8_t *sk) { return 0; } +/************************************************* +* Name: crypto_sign_keypair_from_fseed +* +* Description: Generates public and private key from fixed seed. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key (allocated +* array of CRYPTO_SECRETKEYBYTES bytes) +* - const uint8_t *seed: Pointer to the input fixed seed. +* Must point to an array of SEEDBYTES bytes. +* The seed provides deterministic randomness +* for key generation and must be unique and +* securely generated for each keypair to +* ensure security. +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + unsigned int i; + uint8_t seedbuf[2*SEEDBYTES + CRHBYTES]; + const uint8_t *rho, *rhoprime, *key; +#ifdef DILITHIUM_USE_AES + uint64_t nonce; + aes256ctr_ctx aesctx; + polyvecl rowbuf[1]; +#else + polyvecl rowbuf[2]; +#endif + polyvecl s1, *row = rowbuf; + polyveck s2; + poly t1, t0; + + /* Use fixed seed for randomness for rho, rhoprime and key */ + shake256(seedbuf, 2*SEEDBYTES + CRHBYTES, seed, SEEDBYTES); + rho = seedbuf; + rhoprime = rho + SEEDBYTES; + key = rhoprime + CRHBYTES; + + /* Store rho, key */ + memcpy(pk, rho, SEEDBYTES); + memcpy(sk, rho, SEEDBYTES); + memcpy(sk + SEEDBYTES, key, SEEDBYTES); + + /* Sample short vectors s1 and s2 */ +#ifdef DILITHIUM_USE_AES + aes256ctr_init_u64(&aesctx, rhoprime, 0); + for(i = 0; i < L; ++i) { + nonce = i; + aes256ctr_init_iv_u64(&aesctx, nonce); + poly_uniform_eta_preinit(&s1.vec[i], &aesctx); + } + for(i = 0; i < K; ++i) { + nonce = L + i; + aes256ctr_init_iv_u64(&aesctx, nonce); + poly_uniform_eta_preinit(&s2.vec[i], &aesctx); + } + aes256_ctx_release(&aesctx); +#elif K == 4 && L == 4 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s2.vec[0], &s2.vec[1], &s2.vec[2], &s2.vec[3], rhoprime, 4, 5, 6, 7); +#elif K == 6 && L == 5 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s1.vec[4], &s2.vec[0], &s2.vec[1], &s2.vec[2], rhoprime, 4, 5, 6, 7); + poly_uniform_eta_4x(&s2.vec[3], &s2.vec[4], &s2.vec[5], &t0, rhoprime, 8, 9, 10, 11); +#elif K == 8 && L == 7 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s1.vec[4], &s1.vec[5], &s1.vec[6], &s2.vec[0], rhoprime, 4, 5, 6, 7); + poly_uniform_eta_4x(&s2.vec[1], &s2.vec[2], &s2.vec[3], &s2.vec[4], rhoprime, 8, 9, 10, 11); + poly_uniform_eta_4x(&s2.vec[5], &s2.vec[6], &s2.vec[7], &t0, rhoprime, 12, 13, 14, 15); +#else +#error +#endif + + /* Pack secret vectors */ + for(i = 0; i < L; i++) + polyeta_pack(sk + 3*SEEDBYTES + i*POLYETA_PACKEDBYTES, &s1.vec[i]); + for(i = 0; i < K; i++) + polyeta_pack(sk + 3*SEEDBYTES + (L + i)*POLYETA_PACKEDBYTES, &s2.vec[i]); + + /* Transform s1 */ + polyvecl_ntt(&s1); + +#ifdef DILITHIUM_USE_AES + aes256ctr_init_u64(&aesctx, rho, 0); +#endif + + for(i = 0; i < K; i++) { + /* Expand matrix row */ +#ifdef DILITHIUM_USE_AES + for(unsigned int j = 0; j < L; j++) { + nonce = (i << 8) + j; + aes256ctr_init_iv_u64(&aesctx, nonce); + poly_uniform_preinit(&row->vec[j], &aesctx); + poly_nttunpack(&row->vec[j]); + } +#else + polyvec_matrix_expand_row(&row, rowbuf, rho, i); +#endif + + /* Compute inner-product */ + polyvecl_pointwise_acc_montgomery(&t1, row, &s1); + poly_invntt_tomont(&t1); + + /* Add error polynomial */ + poly_add(&t1, &t1, &s2.vec[i]); + + /* Round t and pack t1, t0 */ + poly_caddq(&t1); + poly_power2round(&t1, &t0, &t1); + polyt1_pack(pk + SEEDBYTES + i*POLYT1_PACKEDBYTES, &t1); + polyt0_pack(sk + 3*SEEDBYTES + (L+K)*POLYETA_PACKEDBYTES + i*POLYT0_PACKEDBYTES, &t0); + } + +#ifdef DILITHIUM_USE_AES + aes256_ctx_release(&aesctx); +#endif + + /* Compute H(rho, t1) and store in secret key */ + shake256(sk + 2*SEEDBYTES, SEEDBYTES, pk, CRYPTO_PUBLICKEYBYTES); + + return 0; +} + +/************************************************* +* Name: crypto_sign_pubkey_from_privkey +* +* Description: Generates public key from existing private key. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - const uint8_t *sk: pointer to input private key (points +* to array of CRYPTO_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk) { + unsigned int i; + uint8_t rho[SEEDBYTES]; + uint8_t tr[SEEDBYTES]; + uint8_t key[SEEDBYTES]; +#ifdef DILITHIUM_USE_AES + uint64_t nonce; + aes256ctr_ctx aesctx; + polyvecl rowbuf[1]; +#else + polyvecl rowbuf[2]; +#endif + polyvecl s1, *row = rowbuf; + polyveck s2; + poly t1, t0; + + // Unpack private key + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + // Store rho in public key + memcpy(pk, rho, SEEDBYTES); + + // Transform s1 + polyvecl_ntt(&s1); + +#ifdef DILITHIUM_USE_AES + aes256ctr_init_u64(&aesctx, rho, 0); +#endif + + // Process each row + for(i = 0; i < K; i++) { + /* Expand matrix row */ +#ifdef DILITHIUM_USE_AES + for(unsigned int j = 0; j < L; j++) { + nonce = (i << 8) + j; + aes256ctr_init_iv_u64(&aesctx, nonce); + poly_uniform_preinit(&row->vec[j], &aesctx); + poly_nttunpack(&row->vec[j]); + } +#else + polyvec_matrix_expand_row(&row, rowbuf, rho, i); +#endif + + /* Compute inner-product */ + polyvecl_pointwise_acc_montgomery(&t1, row, &s1); + poly_invntt_tomont(&t1); + + /* Add error polynomial */ + poly_add(&t1, &t1, &s2.vec[i]); + + /* Round t and pack t1 */ + poly_caddq(&t1); + poly_power2round(&t1, &t0, &t1); + polyt1_pack(pk + SEEDBYTES + i*POLYT1_PACKEDBYTES, &t1); + } + +#ifdef DILITHIUM_USE_AES + aes256_ctx_release(&aesctx); +#endif + + return 0; +} + /************************************************* * Name: crypto_sign_signature * diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium5_avx2/sign.h b/src/sig/dilithium/pqcrystals-dilithium_dilithium5_avx2/sign.h index 295f378c00..a5022837df 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium5_avx2/sign.h +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium5_avx2/sign.h @@ -13,6 +13,13 @@ void challenge(poly *c, const uint8_t seed[SEEDBYTES]); #define crypto_sign_keypair DILITHIUM_NAMESPACE(keypair) int crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +#define crypto_sign_keypair_from_fseed DILITHIUM_NAMESPACE(keypair_from_fseed) +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +#define crypto_sign_pubkey_from_privkey DILITHIUM_NAMESPACE(pubkey_from_privkey) +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + #define crypto_sign_signature DILITHIUM_NAMESPACE(signature) int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium5_ref/api.h b/src/sig/dilithium/pqcrystals-dilithium_dilithium5_ref/api.h index ceeef106dc..4fd8d934d0 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium5_ref/api.h +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium5_ref/api.h @@ -14,6 +14,11 @@ int pqcrystals_dilithium2_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium2_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium2_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium2_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -36,6 +41,11 @@ int pqcrystals_dilithium2_ref_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium2aes_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium2aes_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium2aes_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium2aes_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -62,6 +72,11 @@ int pqcrystals_dilithium2aes_ref_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium3_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium3_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium3_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium3_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -84,6 +99,11 @@ int pqcrystals_dilithium3_ref_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium3aes_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium3aes_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium3aes_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium3aes_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -110,6 +130,11 @@ int pqcrystals_dilithium3aes_ref_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium5_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium5_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium5_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium5_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); @@ -132,6 +157,11 @@ int pqcrystals_dilithium5_ref_open(uint8_t *m, size_t *mlen, int pqcrystals_dilithium5aes_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_dilithium5aes_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +int pqcrystals_dilithium5aes_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + int pqcrystals_dilithium5aes_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium5_ref/sign.c b/src/sig/dilithium/pqcrystals-dilithium_dilithium5_ref/sign.c index 16333eb84d..cdf6ab5fd7 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium5_ref/sign.c +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium5_ref/sign.c @@ -64,6 +64,113 @@ int crypto_sign_keypair(uint8_t *pk, uint8_t *sk) { return 0; } +/************************************************* +* Name: crypto_sign_keypair_from_fseed +* +* Description: Generates public and private key from fixed seed. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key (allocated +* array of CRYPTO_SECRETKEYBYTES bytes) +* - const uint8_t *seed: Pointer to the input fixed seed. +* Must point to an array of SEEDBYTES bytes. +* The seed provides deterministic randomness +* for key generation and must be unique and +* securely generated for each keypair to +* ensure security. +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + uint8_t seedbuf[2*SEEDBYTES + CRHBYTES]; + uint8_t tr[SEEDBYTES]; + const uint8_t *rho, *rhoprime, *key; + polyvecl mat[K]; + polyvecl s1, s1hat; + polyveck s2, t1, t0; + + /* Use fixed seed for randomness for rho, rhoprime and key */ + shake256(seedbuf, 2*SEEDBYTES + CRHBYTES, seed, SEEDBYTES); + rho = seedbuf; + rhoprime = rho + SEEDBYTES; + key = rhoprime + CRHBYTES; + + /* Expand matrix */ + polyvec_matrix_expand(mat, rho); + + /* Sample short vectors s1 and s2 */ + polyvecl_uniform_eta(&s1, rhoprime, 0); + polyveck_uniform_eta(&s2, rhoprime, L); + + /* Matrix-vector multiplication */ + s1hat = s1; + polyvecl_ntt(&s1hat); + polyvec_matrix_pointwise_montgomery(&t1, mat, &s1hat); + polyveck_reduce(&t1); + polyveck_invntt_tomont(&t1); + + /* Add error vector s2 */ + polyveck_add(&t1, &t1, &s2); + + /* Extract t1 and write public key */ + polyveck_caddq(&t1); + polyveck_power2round(&t1, &t0, &t1); + pack_pk(pk, rho, &t1); + + /* Compute H(rho, t1) and write secret key */ + shake256(tr, SEEDBYTES, pk, CRYPTO_PUBLICKEYBYTES); + pack_sk(sk, rho, tr, key, &t0, &s1, &s2); + + return 0; +} + +/************************************************* +* Name: crypto_sign_pubkey_from_privkey +* +* Description: Generates public key from exist private key. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - const uint8_t *sk: pointer to the input private key (points +* to a read-only array of CRYPTO_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk) { + uint8_t rho[SEEDBYTES]; + uint8_t tr[SEEDBYTES]; + uint8_t key[SEEDBYTES]; + polyvecl s1, s1hat; + polyveck s2, t0, t1; + polyvecl mat[K]; + + /* unpack privat key */ + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + /* Expand matrix */ + polyvec_matrix_expand(mat, rho); + + /* Matrix-vector multiplication */ + s1hat = s1; + polyvecl_ntt(&s1hat); + polyvec_matrix_pointwise_montgomery(&t1, mat, &s1hat); + polyveck_reduce(&t1); + polyveck_invntt_tomont(&t1); + + /* Add error vector s2 */ + polyveck_add(&t1, &t1, &s2); + + /* Extract t1 */ + polyveck_caddq(&t1); + polyveck_power2round(&t1, &t0, &t1); + + /* Pack public key */ + pack_pk(pk, rho, &t1); + + return 0; +} + /************************************************* * Name: crypto_sign_signature * diff --git a/src/sig/dilithium/pqcrystals-dilithium_dilithium5_ref/sign.h b/src/sig/dilithium/pqcrystals-dilithium_dilithium5_ref/sign.h index 295f378c00..a5022837df 100644 --- a/src/sig/dilithium/pqcrystals-dilithium_dilithium5_ref/sign.h +++ b/src/sig/dilithium/pqcrystals-dilithium_dilithium5_ref/sign.h @@ -13,6 +13,13 @@ void challenge(poly *c, const uint8_t seed[SEEDBYTES]); #define crypto_sign_keypair DILITHIUM_NAMESPACE(keypair) int crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +#define crypto_sign_keypair_from_fseed DILITHIUM_NAMESPACE(keypair_from_fseed) +int crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, + const uint8_t *seed); + +#define crypto_sign_pubkey_from_privkey DILITHIUM_NAMESPACE(pubkey_from_privkey) +int crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); + #define crypto_sign_signature DILITHIUM_NAMESPACE(signature) int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, diff --git a/src/sig/dilithium/sig_dilithium.h b/src/sig/dilithium/sig_dilithium.h index 2e5ced50be..4776881e12 100644 --- a/src/sig/dilithium/sig_dilithium.h +++ b/src/sig/dilithium/sig_dilithium.h @@ -12,6 +12,8 @@ OQS_SIG *OQS_SIG_dilithium_2_new(void); OQS_API OQS_STATUS OQS_SIG_dilithium_2_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_dilithium_2_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_dilithium_2_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_dilithium_2_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_dilithium_2_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_dilithium_2_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -25,6 +27,8 @@ OQS_API OQS_STATUS OQS_SIG_dilithium_2_verify_with_ctx_str(const uint8_t *messag OQS_SIG *OQS_SIG_dilithium_3_new(void); OQS_API OQS_STATUS OQS_SIG_dilithium_3_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_dilithium_3_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_dilithium_3_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_dilithium_3_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_dilithium_3_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_dilithium_3_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -38,6 +42,8 @@ OQS_API OQS_STATUS OQS_SIG_dilithium_3_verify_with_ctx_str(const uint8_t *messag OQS_SIG *OQS_SIG_dilithium_5_new(void); OQS_API OQS_STATUS OQS_SIG_dilithium_5_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_dilithium_5_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_dilithium_5_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_dilithium_5_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_dilithium_5_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_dilithium_5_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); diff --git a/src/sig/dilithium/sig_dilithium_2.c b/src/sig/dilithium/sig_dilithium_2.c index 06abc8d19d..9ec7cdf91d 100644 --- a/src/sig/dilithium/sig_dilithium_2.c +++ b/src/sig/dilithium/sig_dilithium_2.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_dilithium_2_new(void) { sig->length_signature = OQS_SIG_dilithium_2_length_signature; sig->keypair = OQS_SIG_dilithium_2_keypair; + sig->keypair_from_fseed = OQS_SIG_dilithium_2_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_dilithium_2_pubkey_from_privkey; sig->sign = OQS_SIG_dilithium_2_sign; sig->verify = OQS_SIG_dilithium_2_verify; sig->sign_with_ctx_str = OQS_SIG_dilithium_2_sign_with_ctx_str; @@ -32,17 +34,23 @@ OQS_SIG *OQS_SIG_dilithium_2_new(void) { } extern int pqcrystals_dilithium2_ref_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_dilithium2_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int pqcrystals_dilithium2_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqcrystals_dilithium2_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqcrystals_dilithium2_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_dilithium_2_avx2) extern int pqcrystals_dilithium2_avx2_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_dilithium2_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int pqcrystals_dilithium2_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqcrystals_dilithium2_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqcrystals_dilithium2_avx2_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif #if defined(OQS_ENABLE_SIG_dilithium_2_aarch64) extern int PQCLEAN_DILITHIUM2_AARCH64_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_DILITHIUM2_AARCH64_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_DILITHIUM2_AARCH64_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_DILITHIUM2_AARCH64_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_DILITHIUM2_AARCH64_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -73,6 +81,58 @@ OQS_API OQS_STATUS OQS_SIG_dilithium_2_keypair(uint8_t *public_key, uint8_t *sec #endif } +OQS_API OQS_STATUS OQS_SIG_dilithium_2_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_dilithium_2_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_dilithium2_avx2_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_dilithium2_ref_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#elif defined(OQS_ENABLE_SIG_dilithium_2_aarch64) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_DILITHIUM2_AARCH64_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_dilithium2_ref_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_dilithium2_ref_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_dilithium_2_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_dilithium_2_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_dilithium2_avx2_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_dilithium2_ref_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#elif defined(OQS_ENABLE_SIG_dilithium_2_aarch64) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_DILITHIUM2_AARCH64_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_dilithium2_ref_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_dilithium2_ref_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_dilithium_2_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_dilithium_2_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/dilithium/sig_dilithium_3.c b/src/sig/dilithium/sig_dilithium_3.c index 3257588fc7..c919f5c53a 100644 --- a/src/sig/dilithium/sig_dilithium_3.c +++ b/src/sig/dilithium/sig_dilithium_3.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_dilithium_3_new(void) { sig->length_signature = OQS_SIG_dilithium_3_length_signature; sig->keypair = OQS_SIG_dilithium_3_keypair; + sig->keypair_from_fseed = OQS_SIG_dilithium_3_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_dilithium_3_pubkey_from_privkey; sig->sign = OQS_SIG_dilithium_3_sign; sig->verify = OQS_SIG_dilithium_3_verify; sig->sign_with_ctx_str = OQS_SIG_dilithium_3_sign_with_ctx_str; @@ -32,17 +34,23 @@ OQS_SIG *OQS_SIG_dilithium_3_new(void) { } extern int pqcrystals_dilithium3_ref_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_dilithium3_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int pqcrystals_dilithium3_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqcrystals_dilithium3_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqcrystals_dilithium3_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_dilithium_3_avx2) extern int pqcrystals_dilithium3_avx2_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_dilithium3_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int pqcrystals_dilithium3_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqcrystals_dilithium3_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqcrystals_dilithium3_avx2_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif #if defined(OQS_ENABLE_SIG_dilithium_3_aarch64) extern int PQCLEAN_DILITHIUM3_AARCH64_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_DILITHIUM3_AARCH64_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_DILITHIUM3_AARCH64_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_DILITHIUM3_AARCH64_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_DILITHIUM3_AARCH64_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -73,6 +81,58 @@ OQS_API OQS_STATUS OQS_SIG_dilithium_3_keypair(uint8_t *public_key, uint8_t *sec #endif } +OQS_API OQS_STATUS OQS_SIG_dilithium_3_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_dilithium_3_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_dilithium3_avx2_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_dilithium3_ref_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#elif defined(OQS_ENABLE_SIG_dilithium_3_aarch64) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_DILITHIUM3_AARCH64_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_dilithium3_ref_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_dilithium3_ref_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_dilithium_3_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_dilithium_3_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_dilithium3_avx2_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_dilithium3_ref_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#elif defined(OQS_ENABLE_SIG_dilithium_3_aarch64) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_DILITHIUM3_AARCH64_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_dilithium3_ref_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_dilithium3_ref_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_dilithium_3_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_dilithium_3_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/dilithium/sig_dilithium_5.c b/src/sig/dilithium/sig_dilithium_5.c index 79a0bb471e..f1d3c92381 100644 --- a/src/sig/dilithium/sig_dilithium_5.c +++ b/src/sig/dilithium/sig_dilithium_5.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_dilithium_5_new(void) { sig->length_signature = OQS_SIG_dilithium_5_length_signature; sig->keypair = OQS_SIG_dilithium_5_keypair; + sig->keypair_from_fseed = OQS_SIG_dilithium_5_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_dilithium_5_pubkey_from_privkey; sig->sign = OQS_SIG_dilithium_5_sign; sig->verify = OQS_SIG_dilithium_5_verify; sig->sign_with_ctx_str = OQS_SIG_dilithium_5_sign_with_ctx_str; @@ -32,17 +34,23 @@ OQS_SIG *OQS_SIG_dilithium_5_new(void) { } extern int pqcrystals_dilithium5_ref_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_dilithium5_ref_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int pqcrystals_dilithium5_ref_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqcrystals_dilithium5_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqcrystals_dilithium5_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_dilithium_5_avx2) extern int pqcrystals_dilithium5_avx2_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_dilithium5_avx2_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int pqcrystals_dilithium5_avx2_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqcrystals_dilithium5_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqcrystals_dilithium5_avx2_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif #if defined(OQS_ENABLE_SIG_dilithium_5_aarch64) extern int PQCLEAN_DILITHIUM5_AARCH64_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_DILITHIUM5_AARCH64_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_DILITHIUM5_AARCH64_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_DILITHIUM5_AARCH64_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_DILITHIUM5_AARCH64_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -73,6 +81,58 @@ OQS_API OQS_STATUS OQS_SIG_dilithium_5_keypair(uint8_t *public_key, uint8_t *sec #endif } +OQS_API OQS_STATUS OQS_SIG_dilithium_5_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_dilithium_5_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_dilithium5_avx2_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_dilithium5_ref_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#elif defined(OQS_ENABLE_SIG_dilithium_5_aarch64) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_DILITHIUM5_AARCH64_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_dilithium5_ref_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_dilithium5_ref_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_dilithium_5_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_dilithium_5_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_dilithium5_avx2_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_dilithium5_ref_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#elif defined(OQS_ENABLE_SIG_dilithium_5_aarch64) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_DILITHIUM5_AARCH64_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_dilithium5_ref_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_dilithium5_ref_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_dilithium_5_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_dilithium_5_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/falcon/pqclean_falcon-1024_aarch64/api.h b/src/sig/falcon/pqclean_falcon-1024_aarch64/api.h index 06787aaca3..def76c6443 100644 --- a/src/sig/falcon/pqclean_falcon-1024_aarch64/api.h +++ b/src/sig/falcon/pqclean_falcon-1024_aarch64/api.h @@ -23,6 +23,29 @@ int PQCLEAN_FALCON1024_AARCH64_crypto_sign_keypair( uint8_t *pk, uint8_t *sk); +/* + * Generate a new key pair from fixed seed. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCON1024_AARCH64_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCON1024_AARCH64_CRYPTO_SECRETKEYBYTES + * seed (seed): Input buffer containing the fixed seed (size: dependent on algorithm settings, for Falcon standard setting = 48 bytes) + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCON1024_AARCH64_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +/* + * Generate a public key from a private key. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCON1024_AARCH64_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCON1024_AARCH64_CRYPTO_SECRETKEYBYTES + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCON1024_AARCH64_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk); + /* * Compute a signature on a provided message (m, mlen), with a given * private key (sk). Signature is written in sig[], with length written diff --git a/src/sig/falcon/pqclean_falcon-1024_aarch64/pqclean.c b/src/sig/falcon/pqclean_falcon-1024_aarch64/pqclean.c index 7355b07dba..a2e0313c57 100644 --- a/src/sig/falcon/pqclean_falcon-1024_aarch64/pqclean.c +++ b/src/sig/falcon/pqclean_falcon-1024_aarch64/pqclean.c @@ -108,6 +108,145 @@ PQCLEAN_FALCON1024_AARCH64_crypto_sign_keypair( return 0; } +/* keypair from fixed seed*/ +int +PQCLEAN_FALCON1024_AARCH64_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + union { + uint8_t b[28 * FALCON_N]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[FALCON_N], g[FALCON_N], F[FALCON_N]; + uint16_t h[FALCON_N]; + inner_shake256_context rng; + size_t u, v; + + /* + * Checking the input seed parameter. + * If the seed is NULL, return an error. + */ + if (seed == NULL) { + return -1; // Error: seed is not provided. + } + + /* + * Initialize the SHAKE256 random number generator using the seed. + * We now pass the seed directly to the generator. + */ + inner_shake256_init(&rng); + inner_shake256_inject(&rng, seed, 48); + inner_shake256_flip(&rng); + PQCLEAN_FALCON1024_AARCH64_keygen(&rng, f, g, F, NULL, h, FALCON_LOGN, tmp.b); + inner_shake256_ctx_release(&rng); + + /* + * Encode private key. + */ + sk[0] = 0x50 + FALCON_LOGN; + u = 1; + v = PQCLEAN_FALCON1024_AARCH64_trim_i8_encode( + sk + u, PQCLEAN_FALCON1024_AARCH64_CRYPTO_SECRETKEYBYTES - u, + f, PQCLEAN_FALCON1024_AARCH64_max_fg_bits[FALCON_LOGN]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON1024_AARCH64_trim_i8_encode( + sk + u, PQCLEAN_FALCON1024_AARCH64_CRYPTO_SECRETKEYBYTES - u, + g, PQCLEAN_FALCON1024_AARCH64_max_fg_bits[FALCON_LOGN]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON1024_AARCH64_trim_i8_encode( + sk + u, PQCLEAN_FALCON1024_AARCH64_CRYPTO_SECRETKEYBYTES - u, + F, PQCLEAN_FALCON1024_AARCH64_max_FG_bits[FALCON_LOGN]); + if (v == 0) { + return -1; + } + u += v; + if (u != PQCLEAN_FALCON1024_AARCH64_CRYPTO_SECRETKEYBYTES) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + FALCON_LOGN; + v = PQCLEAN_FALCON1024_AARCH64_modq_encode( + pk + 1, PQCLEAN_FALCON1024_AARCH64_CRYPTO_PUBLICKEYBYTES - 1, + h, FALCON_LOGN); + if (v != PQCLEAN_FALCON1024_AARCH64_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + +/* + * This function reconstructs the public key from a given private key. + * It decodes the private key components (f and g) from the secret key + * and uses them to regenerate the corresponding public key (h). + * The generated public key is then encoded into the provided pk array. + * + * public (pk): The output buffer where the public key will be stored (must be at least PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES in size). + * private (sk): The input secret key (private key) in byte array format (must be PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES in size). + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCON1024_AARCH64_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk) { + union { + uint8_t b[28 * FALCON_N]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[FALCON_N], g[FALCON_N], F[FALCON_N]; + uint16_t h[FALCON_N]; + size_t u, v; + + /* + * Decode the private key. + */ + if (sk[0] != 0x50 + FALCON_LOGN) { + return -1; + } + u = 1; + v = PQCLEAN_FALCON1024_AARCH64_trim_i8_decode( + f, PQCLEAN_FALCON1024_AARCH64_max_fg_bits[FALCON_LOGN], + sk + u, PQCLEAN_FALCON1024_AARCH64_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON1024_AARCH64_trim_i8_decode( + g, PQCLEAN_FALCON1024_AARCH64_max_fg_bits[FALCON_LOGN], + sk + u, PQCLEAN_FALCON1024_AARCH64_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + + /* + * Reconstruct the public key using f and g by calling the compute_public function. + */ + if (!PQCLEAN_FALCON1024_AARCH64_compute_public(h, f, g, FALCON_LOGN, tmp.b)) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + FALCON_LOGN; + v = PQCLEAN_FALCON1024_AARCH64_modq_encode( + pk + 1, PQCLEAN_FALCON1024_AARCH64_CRYPTO_PUBLICKEYBYTES - 1, + h, FALCON_LOGN); + if (v != PQCLEAN_FALCON1024_AARCH64_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + /* * Compute the signature. nonce[] receives the nonce and must have length * NONCELEN bytes. sigbuf[] receives the signature value (without nonce diff --git a/src/sig/falcon/pqclean_falcon-1024_avx2/api.h b/src/sig/falcon/pqclean_falcon-1024_avx2/api.h index 85e201fc28..98b1d19a33 100644 --- a/src/sig/falcon/pqclean_falcon-1024_avx2/api.h +++ b/src/sig/falcon/pqclean_falcon-1024_avx2/api.h @@ -23,6 +23,29 @@ int PQCLEAN_FALCON1024_AVX2_crypto_sign_keypair( uint8_t *pk, uint8_t *sk); +/* + * Generate a new key pair from fixed seed. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCON1024_AVX2_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCON1024_AVX2_CRYPTO_SECRETKEYBYTES + * seed (seed): Input buffer containing the fixed seed (size: dependent on algorithm settings, for Falcon standard setting = 48 bytes) + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCON1024_AVX2_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +/* + * Generate a public key from a private key. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCON1024_AVX2_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCON1024_AVX2_CRYPTO_SECRETKEYBYTES + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCON1024_AVX2_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk); + /* * Compute a signature on a provided message (m, mlen), with a given * private key (sk). Signature is written in sig[], with length written diff --git a/src/sig/falcon/pqclean_falcon-1024_avx2/pqclean.c b/src/sig/falcon/pqclean_falcon-1024_avx2/pqclean.c index ea214a19f0..82f177f38e 100644 --- a/src/sig/falcon/pqclean_falcon-1024_avx2/pqclean.c +++ b/src/sig/falcon/pqclean_falcon-1024_avx2/pqclean.c @@ -108,6 +108,145 @@ PQCLEAN_FALCON1024_AVX2_crypto_sign_keypair( return 0; } +/* keypair from fixed seed*/ +int +PQCLEAN_FALCON1024_AVX2_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_10]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[1024], g[1024], F[1024]; + uint16_t h[1024]; + inner_shake256_context rng; + size_t u, v; + + /* + * Checking the input seed parameter. + * If the seed is NULL, return an error. + */ + if (seed == NULL) { + return -1; // Error: seed is not provided. + } + + /* + * Initialize the SHAKE256 random number generator using the seed. + * We now pass the seed directly to the generator. + */ + inner_shake256_init(&rng); + inner_shake256_inject(&rng, seed, 48); + inner_shake256_flip(&rng); + PQCLEAN_FALCON1024_AVX2_keygen(&rng, f, g, F, NULL, h, 10, tmp.b); + inner_shake256_ctx_release(&rng); + + /* + * Encode private key. + */ + sk[0] = 0x50 + 10; + u = 1; + v = PQCLEAN_FALCON1024_AVX2_trim_i8_encode( + sk + u, PQCLEAN_FALCON1024_AVX2_CRYPTO_SECRETKEYBYTES - u, + f, 10, PQCLEAN_FALCON1024_AVX2_max_fg_bits[10]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON1024_AVX2_trim_i8_encode( + sk + u, PQCLEAN_FALCON1024_AVX2_CRYPTO_SECRETKEYBYTES - u, + g, 10, PQCLEAN_FALCON1024_AVX2_max_fg_bits[10]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON1024_AVX2_trim_i8_encode( + sk + u, PQCLEAN_FALCON1024_AVX2_CRYPTO_SECRETKEYBYTES - u, + F, 10, PQCLEAN_FALCON1024_AVX2_max_FG_bits[10]); + if (v == 0) { + return -1; + } + u += v; + if (u != PQCLEAN_FALCON1024_AVX2_CRYPTO_SECRETKEYBYTES) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 10; + v = PQCLEAN_FALCON1024_AVX2_modq_encode( + pk + 1, PQCLEAN_FALCON1024_AVX2_CRYPTO_PUBLICKEYBYTES - 1, + h, 10); + if (v != PQCLEAN_FALCON1024_AVX2_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + +/* + * This function reconstructs the public key from a given private key. + * It decodes the private key components (f and g) from the secret key + * and uses them to regenerate the corresponding public key (h). + * The generated public key is then encoded into the provided pk array. + * + * public (pk): The output buffer where the public key will be stored (must be at least PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES in size). + * private (sk): The input secret key (private key) in byte array format (must be PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES in size). + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCON1024_AVX2_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_10]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[1024], g[1024], F[1024]; + uint16_t h[1024]; + size_t u, v; + + /* + * Decode the private key. + */ + if (sk[0] != 0x50 + 10) { + return -1; + } + u = 1; + v = PQCLEAN_FALCON1024_AVX2_trim_i8_decode( + f, 10, PQCLEAN_FALCON1024_AVX2_max_fg_bits[10], + sk + u, PQCLEAN_FALCON1024_AVX2_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON1024_AVX2_trim_i8_decode( + g, 10, PQCLEAN_FALCON1024_AVX2_max_fg_bits[10], + sk + u, PQCLEAN_FALCON1024_AVX2_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + + /* + * Reconstruct the public key using f and g by calling the compute_public function. + */ + if (!PQCLEAN_FALCON1024_AVX2_compute_public(h, f, g, 10, tmp.b)) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 10; + v = PQCLEAN_FALCON1024_AVX2_modq_encode( + pk + 1, PQCLEAN_FALCON1024_AVX2_CRYPTO_PUBLICKEYBYTES - 1, + h, 10); + if (v != PQCLEAN_FALCON1024_AVX2_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + /* * Compute the signature. nonce[] receives the nonce and must have length * NONCELEN bytes. sigbuf[] receives the signature value (without nonce diff --git a/src/sig/falcon/pqclean_falcon-1024_clean/api.h b/src/sig/falcon/pqclean_falcon-1024_clean/api.h index cc6557fdea..dbf62e43cd 100644 --- a/src/sig/falcon/pqclean_falcon-1024_clean/api.h +++ b/src/sig/falcon/pqclean_falcon-1024_clean/api.h @@ -23,6 +23,29 @@ int PQCLEAN_FALCON1024_CLEAN_crypto_sign_keypair( uint8_t *pk, uint8_t *sk); +/* + * Generate a new key pair from fixed seed. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCON1024_CLEAN_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCON1024_CLEAN_CRYPTO_SECRETKEYBYTES + * seed (seed): Input buffer containing the fixed seed (size: dependent on algorithm settings, for Falcon standard setting = 48 bytes) + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCON1024_CLEAN_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +/* + * Generate a public key from a private key. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCON1024_CLEAN_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCON1024_CLEAN_CRYPTO_SECRETKEYBYTES + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCON1024_CLEAN_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk); + /* * Compute a signature on a provided message (m, mlen), with a given * private key (sk). Signature is written in sig[], with length written diff --git a/src/sig/falcon/pqclean_falcon-1024_clean/pqclean.c b/src/sig/falcon/pqclean_falcon-1024_clean/pqclean.c index 086d249ef2..0f2e319905 100644 --- a/src/sig/falcon/pqclean_falcon-1024_clean/pqclean.c +++ b/src/sig/falcon/pqclean_falcon-1024_clean/pqclean.c @@ -108,6 +108,146 @@ PQCLEAN_FALCON1024_CLEAN_crypto_sign_keypair( return 0; } +/* keypair from fixed seed*/ +int +PQCLEAN_FALCON1024_CLEAN_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_10]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[1024], g[1024], F[1024]; + uint16_t h[1024]; + inner_shake256_context rng; + size_t u, v; + + /* + * Checking the input seed parameter. + * If the seed is NULL, return an error. + */ + if (seed == NULL) { + return -1; // Error: seed is not provided. + } + + /* + * Initialize the SHAKE256 random number generator using the seed. + * We now pass the seed directly to the generator. + */ + inner_shake256_init(&rng); + inner_shake256_inject(&rng, seed, 48); + inner_shake256_flip(&rng); + PQCLEAN_FALCON1024_CLEAN_keygen(&rng, f, g, F, NULL, h, 10, tmp.b); + inner_shake256_ctx_release(&rng); + + /* + * Encode private key. + */ + sk[0] = 0x50 + 10; + u = 1; + v = PQCLEAN_FALCON1024_CLEAN_trim_i8_encode( + sk + u, PQCLEAN_FALCON1024_CLEAN_CRYPTO_SECRETKEYBYTES - u, + f, 10, PQCLEAN_FALCON1024_CLEAN_max_fg_bits[10]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON1024_CLEAN_trim_i8_encode( + sk + u, PQCLEAN_FALCON1024_CLEAN_CRYPTO_SECRETKEYBYTES - u, + g, 10, PQCLEAN_FALCON1024_CLEAN_max_fg_bits[10]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON1024_CLEAN_trim_i8_encode( + sk + u, PQCLEAN_FALCON1024_CLEAN_CRYPTO_SECRETKEYBYTES - u, + F, 10, PQCLEAN_FALCON1024_CLEAN_max_FG_bits[10]); + if (v == 0) { + return -1; + } + u += v; + if (u != PQCLEAN_FALCON1024_CLEAN_CRYPTO_SECRETKEYBYTES) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 10; + v = PQCLEAN_FALCON1024_CLEAN_modq_encode( + pk + 1, PQCLEAN_FALCON1024_CLEAN_CRYPTO_PUBLICKEYBYTES - 1, + h, 10); + if (v != PQCLEAN_FALCON1024_CLEAN_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + +/* + * This function reconstructs the public key from a given private key. + * It decodes the private key components (f and g) from the secret key + * and uses them to regenerate the corresponding public key (h). + * The generated public key is then encoded into the provided pk array. + * + * public (pk): The output buffer where the public key will be stored (must be at least PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES in size). + * private (sk): The input secret key (private key) in byte array format (must be PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES in size). + * Return value: 0 on success, -1 on error. + */ +int +PQCLEAN_FALCON1024_CLEAN_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_10]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[1024], g[1024], F[1024]; + uint16_t h[1024]; + size_t u, v; + + /* + * Decode the private key. + */ + if (sk[0] != 0x50 + 10) { + return -1; + } + u = 1; + v = PQCLEAN_FALCON1024_CLEAN_trim_i8_decode( + f, 10, PQCLEAN_FALCON1024_CLEAN_max_fg_bits[10], + sk + u, PQCLEAN_FALCON1024_CLEAN_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON1024_CLEAN_trim_i8_decode( + g, 10, PQCLEAN_FALCON1024_CLEAN_max_fg_bits[10], + sk + u, PQCLEAN_FALCON1024_CLEAN_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + + /* + * Reconstruct the public key using f and g by calling the compute_public function. + */ + if (!PQCLEAN_FALCON1024_CLEAN_compute_public(h, f, g, 10, tmp.b)) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 10; + v = PQCLEAN_FALCON1024_CLEAN_modq_encode( + pk + 1, PQCLEAN_FALCON1024_CLEAN_CRYPTO_PUBLICKEYBYTES - 1, + h, 10); + if (v != PQCLEAN_FALCON1024_CLEAN_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + /* * Compute the signature. nonce[] receives the nonce and must have length * NONCELEN bytes. sigbuf[] receives the signature value (without nonce diff --git a/src/sig/falcon/pqclean_falcon-512_aarch64/api.h b/src/sig/falcon/pqclean_falcon-512_aarch64/api.h index d70db344b0..eece1b5b2a 100644 --- a/src/sig/falcon/pqclean_falcon-512_aarch64/api.h +++ b/src/sig/falcon/pqclean_falcon-512_aarch64/api.h @@ -23,6 +23,29 @@ int PQCLEAN_FALCON512_AARCH64_crypto_sign_keypair( uint8_t *pk, uint8_t *sk); +/* + * Generate a new key pair from fixed seed. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCON512_AARCH64_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCON512_AARCH64_CRYPTO_SECRETKEYBYTES + * seed (seed): Input buffer containing the fixed seed (size: dependent on algorithm settings, for Falcon standard setting = 48 bytes) + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCON512_AARCH64_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +/* + * Generate a public key from a private key. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCON512_AARCH64_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCON512_AARCH64_CRYPTO_SECRETKEYBYTES + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCON512_AARCH64_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk); + /* * Compute a signature on a provided message (m, mlen), with a given * private key (sk). Signature is written in sig[], with length written diff --git a/src/sig/falcon/pqclean_falcon-512_aarch64/pqclean.c b/src/sig/falcon/pqclean_falcon-512_aarch64/pqclean.c index b898d746a6..8224716c9d 100644 --- a/src/sig/falcon/pqclean_falcon-512_aarch64/pqclean.c +++ b/src/sig/falcon/pqclean_falcon-512_aarch64/pqclean.c @@ -108,6 +108,146 @@ PQCLEAN_FALCON512_AARCH64_crypto_sign_keypair( return 0; } +/* keypair from fixed seed*/ +int +PQCLEAN_FALCON512_AARCH64_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + union { + uint8_t b[28 * FALCON_N]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[FALCON_N], g[FALCON_N], F[FALCON_N]; + uint16_t h[FALCON_N]; + inner_shake256_context rng; + size_t u, v; + + /* + * Checking the input seed parameter. + * If the seed is NULL, return an error. + */ + if (seed == NULL) { + return -1; // Error: seed is not provided. + } + + /* + * Initialize the SHAKE256 random number generator using the seed. + * We now pass the seed directly to the generator. + */ + inner_shake256_init(&rng); + inner_shake256_inject(&rng, seed, 48); + inner_shake256_flip(&rng); + PQCLEAN_FALCON512_AARCH64_keygen(&rng, f, g, F, NULL, h, FALCON_LOGN, tmp.b); + inner_shake256_ctx_release(&rng); + + /* + * Encode private key. + */ + sk[0] = 0x50 + FALCON_LOGN; + u = 1; + v = PQCLEAN_FALCON512_AARCH64_trim_i8_encode( + sk + u, PQCLEAN_FALCON512_AARCH64_CRYPTO_SECRETKEYBYTES - u, + f, PQCLEAN_FALCON512_AARCH64_max_fg_bits[FALCON_LOGN]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON512_AARCH64_trim_i8_encode( + sk + u, PQCLEAN_FALCON512_AARCH64_CRYPTO_SECRETKEYBYTES - u, + g, PQCLEAN_FALCON512_AARCH64_max_fg_bits[FALCON_LOGN]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON512_AARCH64_trim_i8_encode( + sk + u, PQCLEAN_FALCON512_AARCH64_CRYPTO_SECRETKEYBYTES - u, + F, PQCLEAN_FALCON512_AARCH64_max_FG_bits[FALCON_LOGN]); + if (v == 0) { + return -1; + } + u += v; + if (u != PQCLEAN_FALCON512_AARCH64_CRYPTO_SECRETKEYBYTES) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + FALCON_LOGN; + v = PQCLEAN_FALCON512_AARCH64_modq_encode( + pk + 1, PQCLEAN_FALCON512_AARCH64_CRYPTO_PUBLICKEYBYTES - 1, + h, FALCON_LOGN); + if (v != PQCLEAN_FALCON512_AARCH64_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + +/* + * This function reconstructs the public key from a given private key. + * It decodes the private key components (f and g) from the secret key + * and uses them to regenerate the corresponding public key (h). + * The generated public key is then encoded into the provided pk array. + * + * public (pk): The output buffer where the public key will be stored (must be at least PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES in size). + * private (sk): The input secret key (private key) in byte array format (must be PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES in size). + * Return value: 0 on success, -1 on error. + */ +int +PQCLEAN_FALCON512_AARCH64_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk) { + union { + uint8_t b[28 * FALCON_N]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[FALCON_N], g[FALCON_N], F[FALCON_N]; + uint16_t h[FALCON_N]; + size_t u, v; + + /* + * Decode the private key. + */ + if (sk[0] != 0x50 + FALCON_LOGN) { + return -1; + } + u = 1; + v = PQCLEAN_FALCON512_AARCH64_trim_i8_decode( + f, PQCLEAN_FALCON512_AARCH64_max_fg_bits[FALCON_LOGN], + sk + u, PQCLEAN_FALCON512_AARCH64_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON512_AARCH64_trim_i8_decode( + g, PQCLEAN_FALCON512_AARCH64_max_fg_bits[FALCON_LOGN], + sk + u, PQCLEAN_FALCON512_AARCH64_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + + /* + * Reconstruct the public key using f and g by calling the compute_public function. + */ + if (!PQCLEAN_FALCON512_AARCH64_compute_public(h, f, g, FALCON_LOGN, tmp.b)) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + FALCON_LOGN; + v = PQCLEAN_FALCON512_AARCH64_modq_encode( + pk + 1, PQCLEAN_FALCON512_AARCH64_CRYPTO_PUBLICKEYBYTES - 1, + h, FALCON_LOGN); + if (v != PQCLEAN_FALCON512_AARCH64_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + /* * Compute the signature. nonce[] receives the nonce and must have length * NONCELEN bytes. sigbuf[] receives the signature value (without nonce diff --git a/src/sig/falcon/pqclean_falcon-512_avx2/api.h b/src/sig/falcon/pqclean_falcon-512_avx2/api.h index 2f74f26270..e918944b66 100644 --- a/src/sig/falcon/pqclean_falcon-512_avx2/api.h +++ b/src/sig/falcon/pqclean_falcon-512_avx2/api.h @@ -23,6 +23,29 @@ int PQCLEAN_FALCON512_AVX2_crypto_sign_keypair( uint8_t *pk, uint8_t *sk); +/* + * Generate a new key pair from fixed seed. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCON512_AVX2_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCON512_AVX2_CRYPTO_SECRETKEYBYTES + * seed (seed): Input buffer containing the fixed seed (size: dependent on algorithm settings, for Falcon standard setting = 48 bytes) + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCON512_AVX2_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +/* + * Generate a public key from a private key. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCON512_AVX2_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCON512_AVX2_CRYPTO_SECRETKEYBYTES + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCON512_AVX2_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk); + /* * Compute a signature on a provided message (m, mlen), with a given * private key (sk). Signature is written in sig[], with length written diff --git a/src/sig/falcon/pqclean_falcon-512_avx2/pqclean.c b/src/sig/falcon/pqclean_falcon-512_avx2/pqclean.c index 84e393d691..3c8a428c93 100644 --- a/src/sig/falcon/pqclean_falcon-512_avx2/pqclean.c +++ b/src/sig/falcon/pqclean_falcon-512_avx2/pqclean.c @@ -108,6 +108,146 @@ PQCLEAN_FALCON512_AVX2_crypto_sign_keypair( return 0; } +/* keypair from fixed seed*/ +int +PQCLEAN_FALCON512_AVX2_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_9]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[512], g[512], F[512]; + uint16_t h[512]; + inner_shake256_context rng; + size_t u, v; + + /* + * Checking the input seed parameter. + * If the seed is NULL, return an error. + */ + if (seed == NULL) { + return -1; // Error: seed is not provided. + } + + /* + * Initialize the SHAKE256 random number generator using the seed. + * We now pass the seed directly to the generator. + */ + inner_shake256_init(&rng); + inner_shake256_inject(&rng, seed, 48); + inner_shake256_flip(&rng); + PQCLEAN_FALCON512_AVX2_keygen(&rng, f, g, F, NULL, h, 9, tmp.b); + inner_shake256_ctx_release(&rng); + + /* + * Encode private key. + */ + sk[0] = 0x50 + 9; + u = 1; + v = PQCLEAN_FALCON512_AVX2_trim_i8_encode( + sk + u, PQCLEAN_FALCON512_AVX2_CRYPTO_SECRETKEYBYTES - u, + f, 9, PQCLEAN_FALCON512_AVX2_max_fg_bits[9]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON512_AVX2_trim_i8_encode( + sk + u, PQCLEAN_FALCON512_AVX2_CRYPTO_SECRETKEYBYTES - u, + g, 9, PQCLEAN_FALCON512_AVX2_max_fg_bits[9]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON512_AVX2_trim_i8_encode( + sk + u, PQCLEAN_FALCON512_AVX2_CRYPTO_SECRETKEYBYTES - u, + F, 9, PQCLEAN_FALCON512_AVX2_max_FG_bits[9]); + if (v == 0) { + return -1; + } + u += v; + if (u != PQCLEAN_FALCON512_AVX2_CRYPTO_SECRETKEYBYTES) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 9; + v = PQCLEAN_FALCON512_AVX2_modq_encode( + pk + 1, PQCLEAN_FALCON512_AVX2_CRYPTO_PUBLICKEYBYTES - 1, + h, 9); + if (v != PQCLEAN_FALCON512_AVX2_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + +/* + * This function reconstructs the public key from a given private key. + * It decodes the private key components (f and g) from the secret key + * and uses them to regenerate the corresponding public key (h). + * The generated public key is then encoded into the provided pk array. + * + * public (pk): The output buffer where the public key will be stored (must be at least PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES in size). + * private (sk): The input secret key (private key) in byte array format (must be PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES in size). + * Return value: 0 on success, -1 on error. + */ +int +PQCLEAN_FALCON512_AVX2_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_9]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[512], g[512], F[512]; + uint16_t h[512]; + size_t u, v; + + /* + * Decode the private key. + */ + if (sk[0] != 0x50 + 9) { + return -1; + } + u = 1; + v = PQCLEAN_FALCON512_AVX2_trim_i8_decode( + f, 9, PQCLEAN_FALCON512_AVX2_max_fg_bits[9], + sk + u, PQCLEAN_FALCON512_AVX2_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON512_AVX2_trim_i8_decode( + g, 9, PQCLEAN_FALCON512_AVX2_max_fg_bits[9], + sk + u, PQCLEAN_FALCON512_AVX2_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + + /* + * Reconstruct the public key using f and g by calling the compute_public function. + */ + if (!PQCLEAN_FALCON512_AVX2_compute_public(h, f, g, 9, tmp.b)) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 9; + v = PQCLEAN_FALCON512_AVX2_modq_encode( + pk + 1, PQCLEAN_FALCON512_AVX2_CRYPTO_PUBLICKEYBYTES - 1, + h, 9); + if (v != PQCLEAN_FALCON512_AVX2_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + /* * Compute the signature. nonce[] receives the nonce and must have length * NONCELEN bytes. sigbuf[] receives the signature value (without nonce diff --git a/src/sig/falcon/pqclean_falcon-512_clean/api.h b/src/sig/falcon/pqclean_falcon-512_clean/api.h index 49489d2b10..b9c1fb9f98 100644 --- a/src/sig/falcon/pqclean_falcon-512_clean/api.h +++ b/src/sig/falcon/pqclean_falcon-512_clean/api.h @@ -23,6 +23,29 @@ int PQCLEAN_FALCON512_CLEAN_crypto_sign_keypair( uint8_t *pk, uint8_t *sk); +/* + * Generate a new key pair from fixed seed. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES + * seed (seed): Input buffer containing the fixed seed (size: dependent on algorithm settings, for Falcon standard setting = 48 bytes) + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCON512_CLEAN_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +/* + * Generate a public key from a private key. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCON512_CLEAN_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk); + /* * Compute a signature on a provided message (m, mlen), with a given * private key (sk). Signature is written in sig[], with length written diff --git a/src/sig/falcon/pqclean_falcon-512_clean/pqclean.c b/src/sig/falcon/pqclean_falcon-512_clean/pqclean.c index 80d8cbe32d..640693337c 100644 --- a/src/sig/falcon/pqclean_falcon-512_clean/pqclean.c +++ b/src/sig/falcon/pqclean_falcon-512_clean/pqclean.c @@ -108,6 +108,146 @@ PQCLEAN_FALCON512_CLEAN_crypto_sign_keypair( return 0; } +/* keypair from fixed seed*/ +int +PQCLEAN_FALCON512_CLEAN_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_9]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[512], g[512], F[512]; + uint16_t h[512]; + inner_shake256_context rng; + size_t u, v; + + /* + * Checking the input seed parameter. + * If the seed is NULL, return an error. + */ + if (seed == NULL) { + return -1; // Error: seed is not provided. + } + + /* + * Initialize the SHAKE256 random number generator using the seed. + * We now pass the seed directly to the generator. + */ + inner_shake256_init(&rng); + inner_shake256_inject(&rng, seed, 48); + inner_shake256_flip(&rng); + PQCLEAN_FALCON512_CLEAN_keygen(&rng, f, g, F, NULL, h, 9, tmp.b); + inner_shake256_ctx_release(&rng); + + /* + * Encode private key. + */ + sk[0] = 0x50 + 9; + u = 1; + v = PQCLEAN_FALCON512_CLEAN_trim_i8_encode( + sk + u, PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES - u, + f, 9, PQCLEAN_FALCON512_CLEAN_max_fg_bits[9]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON512_CLEAN_trim_i8_encode( + sk + u, PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES - u, + g, 9, PQCLEAN_FALCON512_CLEAN_max_fg_bits[9]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON512_CLEAN_trim_i8_encode( + sk + u, PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES - u, + F, 9, PQCLEAN_FALCON512_CLEAN_max_FG_bits[9]); + if (v == 0) { + return -1; + } + u += v; + if (u != PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 9; + v = PQCLEAN_FALCON512_CLEAN_modq_encode( + pk + 1, PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES - 1, + h, 9); + if (v != PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + +/* + * This function reconstructs the public key from a given private key. + * It decodes the private key components (f and g) from the secret key + * and uses them to regenerate the corresponding public key (h). + * The generated public key is then encoded into the provided pk array. + * + * public (pk): The output buffer where the public key will be stored (must be at least PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES in size). + * private (sk): The input secret key (private key) in byte array format (must be PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES in size). + * Return value: 0 on success, -1 on error. + */ +int +PQCLEAN_FALCON512_CLEAN_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_9]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[512], g[512], F[512]; + uint16_t h[512]; + size_t u, v; + + /* + * Decode the private key. + */ + if (sk[0] != 0x50 + 9) { + return -1; + } + u = 1; + v = PQCLEAN_FALCON512_CLEAN_trim_i8_decode( + f, 9, PQCLEAN_FALCON512_CLEAN_max_fg_bits[9], + sk + u, PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCON512_CLEAN_trim_i8_decode( + g, 9, PQCLEAN_FALCON512_CLEAN_max_fg_bits[9], + sk + u, PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + + /* + * Reconstruct the public key using f and g by calling the compute_public function. + */ + if (!PQCLEAN_FALCON512_CLEAN_compute_public(h, f, g, 9, tmp.b)) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 9; + v = PQCLEAN_FALCON512_CLEAN_modq_encode( + pk + 1, PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES - 1, + h, 9); + if (v != PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + /* * Compute the signature. nonce[] receives the nonce and must have length * NONCELEN bytes. sigbuf[] receives the signature value (without nonce diff --git a/src/sig/falcon/pqclean_falcon-padded-1024_aarch64/api.h b/src/sig/falcon/pqclean_falcon-padded-1024_aarch64/api.h index 9b6299841b..76ff9a56b0 100644 --- a/src/sig/falcon/pqclean_falcon-padded-1024_aarch64/api.h +++ b/src/sig/falcon/pqclean_falcon-padded-1024_aarch64/api.h @@ -21,6 +21,29 @@ int PQCLEAN_FALCONPADDED1024_AARCH64_crypto_sign_keypair( uint8_t *pk, uint8_t *sk); +/* + * Generate a new key pair from fixed seed. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCONPADDED1024_AARCH64_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCONPADDED1024_AARCH64_CRYPTO_SECRETKEYBYTES + * seed (seed): Input buffer containing the fixed seed (size: dependent on algorithm settings, for Falcon standard setting = 48 bytes) + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCONPADDED1024_AARCH64_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +/* + * Generate a public key from a private key. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCONPADDED1024_AARCH64_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCONPADDED1024_AARCH64_CRYPTO_SECRETKEYBYTES + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCONPADDED1024_AARCH64_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk); + /* * Compute a signature on a provided message (m, mlen), with a given * private key (sk). Signature is written in sig[], with length written diff --git a/src/sig/falcon/pqclean_falcon-padded-1024_aarch64/pqclean.c b/src/sig/falcon/pqclean_falcon-padded-1024_aarch64/pqclean.c index 8cc7563231..39c6555ba4 100644 --- a/src/sig/falcon/pqclean_falcon-padded-1024_aarch64/pqclean.c +++ b/src/sig/falcon/pqclean_falcon-padded-1024_aarch64/pqclean.c @@ -105,6 +105,146 @@ PQCLEAN_FALCONPADDED1024_AARCH64_crypto_sign_keypair( return 0; } +/* keypair from fixed seed*/ +int +PQCLEAN_FALCONPADDED1024_AARCH64_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + union { + uint8_t b[28 * FALCON_N]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[FALCON_N], g[FALCON_N], F[FALCON_N]; + uint16_t h[FALCON_N]; + inner_shake256_context rng; + size_t u, v; + + /* + * Checking the input seed parameter. + * If the seed is NULL, return an error. + */ + if (seed == NULL) { + return -1; // Error: seed is not provided. + } + + /* + * Initialize the SHAKE256 random number generator using the seed. + * We now pass the seed directly to the generator. + */ + inner_shake256_init(&rng); + inner_shake256_inject(&rng, seed, 48); + inner_shake256_flip(&rng); + PQCLEAN_FALCONPADDED1024_AARCH64_keygen(&rng, f, g, F, NULL, h, FALCON_LOGN, tmp.b); + inner_shake256_ctx_release(&rng); + + /* + * Encode private key. + */ + sk[0] = 0x50 + FALCON_LOGN; + u = 1; + v = PQCLEAN_FALCONPADDED1024_AARCH64_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED1024_AARCH64_CRYPTO_SECRETKEYBYTES - u, + f, PQCLEAN_FALCONPADDED1024_AARCH64_max_fg_bits[FALCON_LOGN]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED1024_AARCH64_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED1024_AARCH64_CRYPTO_SECRETKEYBYTES - u, + g, PQCLEAN_FALCONPADDED1024_AARCH64_max_fg_bits[FALCON_LOGN]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED1024_AARCH64_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED1024_AARCH64_CRYPTO_SECRETKEYBYTES - u, + F, PQCLEAN_FALCONPADDED1024_AARCH64_max_FG_bits[FALCON_LOGN]); + if (v == 0) { + return -1; + } + u += v; + if (u != PQCLEAN_FALCONPADDED1024_AARCH64_CRYPTO_SECRETKEYBYTES) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + FALCON_LOGN; + v = PQCLEAN_FALCONPADDED1024_AARCH64_modq_encode( + pk + 1, PQCLEAN_FALCONPADDED1024_AARCH64_CRYPTO_PUBLICKEYBYTES - 1, + h, FALCON_LOGN); + if (v != PQCLEAN_FALCONPADDED1024_AARCH64_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + +/* + * This function reconstructs the public key from a given private key. + * It decodes the private key components (f and g) from the secret key + * and uses them to regenerate the corresponding public key (h). + * The generated public key is then encoded into the provided pk array. + * + * public (pk): The output buffer where the public key will be stored (must be at least PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES in size). + * private (sk): The input secret key (private key) in byte array format (must be PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES in size). + * Return value: 0 on success, -1 on error. + */ +int +PQCLEAN_FALCONPADDED1024_AARCH64_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk) { + union { + uint8_t b[28 * FALCON_N]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[FALCON_N], g[FALCON_N], F[FALCON_N]; + uint16_t h[FALCON_N]; + size_t u, v; + + /* + * Decode the private key. + */ + if (sk[0] != 0x50 + FALCON_LOGN) { + return -1; + } + u = 1; + v = PQCLEAN_FALCONPADDED1024_AARCH64_trim_i8_decode( + f, PQCLEAN_FALCONPADDED1024_AARCH64_max_fg_bits[FALCON_LOGN], + sk + u, PQCLEAN_FALCONPADDED1024_AARCH64_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED1024_AARCH64_trim_i8_decode( + g, PQCLEAN_FALCONPADDED1024_AARCH64_max_fg_bits[FALCON_LOGN], + sk + u, PQCLEAN_FALCONPADDED1024_AARCH64_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + + /* + * Reconstruct the public key using f and g by calling the compute_public function. + */ + if (!PQCLEAN_FALCONPADDED1024_AARCH64_compute_public(h, f, g, FALCON_LOGN, tmp.b)) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + FALCON_LOGN; + v = PQCLEAN_FALCONPADDED1024_AARCH64_modq_encode( + pk + 1, PQCLEAN_FALCONPADDED1024_AARCH64_CRYPTO_PUBLICKEYBYTES - 1, + h, FALCON_LOGN); + if (v != PQCLEAN_FALCONPADDED1024_AARCH64_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + /* * Compute the signature. nonce[] receives the nonce and must have length * NONCELEN bytes. sigbuf[] receives the signature value (without nonce diff --git a/src/sig/falcon/pqclean_falcon-padded-1024_avx2/api.h b/src/sig/falcon/pqclean_falcon-padded-1024_avx2/api.h index da6103260d..9b30dbd89c 100644 --- a/src/sig/falcon/pqclean_falcon-padded-1024_avx2/api.h +++ b/src/sig/falcon/pqclean_falcon-padded-1024_avx2/api.h @@ -21,6 +21,29 @@ int PQCLEAN_FALCONPADDED1024_AVX2_crypto_sign_keypair( uint8_t *pk, uint8_t *sk); +/* + * Generate a new key pair from fixed seed. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCONPADDED1024_AVX2_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCONPADDED1024_AVX2_CRYPTO_SECRETKEYBYTES + * seed (seed): Input buffer containing the fixed seed (size: dependent on algorithm settings, for Falcon standard setting = 48 bytes) + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCONPADDED1024_AVX2_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +/* + * Generate a public key from a private key. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCONPADDED1024_AVX2_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCONPADDED1024_AVX2_CRYPTO_SECRETKEYBYTES + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCONPADDED1024_AVX2_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk); + /* * Compute a signature on a provided message (m, mlen), with a given * private key (sk). Signature is written in sig[], with length written diff --git a/src/sig/falcon/pqclean_falcon-padded-1024_avx2/pqclean.c b/src/sig/falcon/pqclean_falcon-padded-1024_avx2/pqclean.c index 06560ed5c4..bac2189527 100644 --- a/src/sig/falcon/pqclean_falcon-padded-1024_avx2/pqclean.c +++ b/src/sig/falcon/pqclean_falcon-padded-1024_avx2/pqclean.c @@ -105,6 +105,146 @@ PQCLEAN_FALCONPADDED1024_AVX2_crypto_sign_keypair( return 0; } +/* keypair from fixed seed*/ +int +PQCLEAN_FALCONPADDED1024_AVX2_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_10]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[1024], g[1024], F[1024]; + uint16_t h[1024]; + inner_shake256_context rng; + size_t u, v; + + /* + * Checking the input seed parameter. + * If the seed is NULL, return an error. + */ + if (seed == NULL) { + return -1; // Error: seed is not provided. + } + + /* + * Initialize the SHAKE256 random number generator using the seed. + * We now pass the seed directly to the generator. + */ + inner_shake256_init(&rng); + inner_shake256_inject(&rng, seed, 48); + inner_shake256_flip(&rng); + PQCLEAN_FALCONPADDED1024_AVX2_keygen(&rng, f, g, F, NULL, h, 10, tmp.b); + inner_shake256_ctx_release(&rng); + + /* + * Encode private key. + */ + sk[0] = 0x50 + 10; + u = 1; + v = PQCLEAN_FALCONPADDED1024_AVX2_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED1024_AVX2_CRYPTO_SECRETKEYBYTES - u, + f, 10, PQCLEAN_FALCONPADDED1024_AVX2_max_fg_bits[10]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED1024_AVX2_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED1024_AVX2_CRYPTO_SECRETKEYBYTES - u, + g, 10, PQCLEAN_FALCONPADDED1024_AVX2_max_fg_bits[10]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED1024_AVX2_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED1024_AVX2_CRYPTO_SECRETKEYBYTES - u, + F, 10, PQCLEAN_FALCONPADDED1024_AVX2_max_FG_bits[10]); + if (v == 0) { + return -1; + } + u += v; + if (u != PQCLEAN_FALCONPADDED1024_AVX2_CRYPTO_SECRETKEYBYTES) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 10; + v = PQCLEAN_FALCONPADDED1024_AVX2_modq_encode( + pk + 1, PQCLEAN_FALCONPADDED1024_AVX2_CRYPTO_PUBLICKEYBYTES - 1, + h, 10); + if (v != PQCLEAN_FALCONPADDED1024_AVX2_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + +/* + * This function reconstructs the public key from a given private key. + * It decodes the private key components (f and g) from the secret key + * and uses them to regenerate the corresponding public key (h). + * The generated public key is then encoded into the provided pk array. + * + * public (pk): The output buffer where the public key will be stored (must be at least PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES in size). + * private (sk): The input secret key (private key) in byte array format (must be PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES in size). + * Return value: 0 on success, -1 on error. + */ +int +PQCLEAN_FALCONPADDED1024_AVX2_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_10]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[1024], g[1024], F[1024]; + uint16_t h[1024]; + size_t u, v; + + /* + * Decode the private key. + */ + if (sk[0] != 0x50 + 10) { + return -1; + } + u = 1; + v = PQCLEAN_FALCONPADDED1024_AVX2_trim_i8_decode( + f, 10, PQCLEAN_FALCONPADDED1024_AVX2_max_fg_bits[10], + sk + u, PQCLEAN_FALCONPADDED1024_AVX2_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED1024_AVX2_trim_i8_decode( + g, 10, PQCLEAN_FALCONPADDED1024_AVX2_max_fg_bits[10], + sk + u, PQCLEAN_FALCONPADDED1024_AVX2_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + + /* + * Reconstruct the public key using f and g by calling the compute_public function. + */ + if (!PQCLEAN_FALCONPADDED1024_AVX2_compute_public(h, f, g, 10, tmp.b)) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 10; + v = PQCLEAN_FALCONPADDED1024_AVX2_modq_encode( + pk + 1, PQCLEAN_FALCONPADDED1024_AVX2_CRYPTO_PUBLICKEYBYTES - 1, + h, 10); + if (v != PQCLEAN_FALCONPADDED1024_AVX2_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + /* * Compute the signature. nonce[] receives the nonce and must have length * NONCELEN bytes. sigbuf[] receives the signature value (without nonce diff --git a/src/sig/falcon/pqclean_falcon-padded-1024_clean/api.h b/src/sig/falcon/pqclean_falcon-padded-1024_clean/api.h index 0d38a55f74..a3289f45d6 100644 --- a/src/sig/falcon/pqclean_falcon-padded-1024_clean/api.h +++ b/src/sig/falcon/pqclean_falcon-padded-1024_clean/api.h @@ -21,6 +21,29 @@ int PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_keypair( uint8_t *pk, uint8_t *sk); +/* + * Generate a new key pair from fixed seed. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_SECRETKEYBYTES + * seed (seed): Input buffer containing the fixed seed (size: dependent on algorithm settings, for Falcon standard setting = 48 bytes) + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +/* + * Generate a public key from a private key. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_SECRETKEYBYTES + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk); + /* * Compute a signature on a provided message (m, mlen), with a given * private key (sk). Signature is written in sig[], with length written diff --git a/src/sig/falcon/pqclean_falcon-padded-1024_clean/pqclean.c b/src/sig/falcon/pqclean_falcon-padded-1024_clean/pqclean.c index eb6cc85a15..cb64941d63 100644 --- a/src/sig/falcon/pqclean_falcon-padded-1024_clean/pqclean.c +++ b/src/sig/falcon/pqclean_falcon-padded-1024_clean/pqclean.c @@ -105,6 +105,146 @@ PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_keypair( return 0; } +/* keypair from fixed seed*/ +int +PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_10]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[1024], g[1024], F[1024]; + uint16_t h[1024]; + inner_shake256_context rng; + size_t u, v; + + /* + * Checking the input seed parameter. + * If the seed is NULL, return an error. + */ + if (seed == NULL) { + return -1; // Error: seed is not provided. + } + + /* + * Initialize the SHAKE256 random number generator using the seed. + * We now pass the seed directly to the generator. + */ + inner_shake256_init(&rng); + inner_shake256_inject(&rng, seed, 48); + inner_shake256_flip(&rng); + PQCLEAN_FALCONPADDED1024_CLEAN_keygen(&rng, f, g, F, NULL, h, 10, tmp.b); + inner_shake256_ctx_release(&rng); + + /* + * Encode private key. + */ + sk[0] = 0x50 + 10; + u = 1; + v = PQCLEAN_FALCONPADDED1024_CLEAN_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_SECRETKEYBYTES - u, + f, 10, PQCLEAN_FALCONPADDED1024_CLEAN_max_fg_bits[10]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED1024_CLEAN_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_SECRETKEYBYTES - u, + g, 10, PQCLEAN_FALCONPADDED1024_CLEAN_max_fg_bits[10]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED1024_CLEAN_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_SECRETKEYBYTES - u, + F, 10, PQCLEAN_FALCONPADDED1024_CLEAN_max_FG_bits[10]); + if (v == 0) { + return -1; + } + u += v; + if (u != PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_SECRETKEYBYTES) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 10; + v = PQCLEAN_FALCONPADDED1024_CLEAN_modq_encode( + pk + 1, PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_PUBLICKEYBYTES - 1, + h, 10); + if (v != PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + +/* + * This function reconstructs the public key from a given private key. + * It decodes the private key components (f and g) from the secret key + * and uses them to regenerate the corresponding public key (h). + * The generated public key is then encoded into the provided pk array. + * + * public (pk): The output buffer where the public key will be stored (must be at least PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES in size). + * private (sk): The input secret key (private key) in byte array format (must be PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES in size). + * Return value: 0 on success, -1 on error. + */ +int +PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_10]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[1024], g[1024], F[1024]; + uint16_t h[1024]; + size_t u, v; + + /* + * Decode the private key. + */ + if (sk[0] != 0x50 + 10) { + return -1; + } + u = 1; + v = PQCLEAN_FALCONPADDED1024_CLEAN_trim_i8_decode( + f, 10, PQCLEAN_FALCONPADDED1024_CLEAN_max_fg_bits[10], + sk + u, PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED1024_CLEAN_trim_i8_decode( + g, 10, PQCLEAN_FALCONPADDED1024_CLEAN_max_fg_bits[10], + sk + u, PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + + /* + * Reconstruct the public key using f and g by calling the compute_public function. + */ + if (!PQCLEAN_FALCONPADDED1024_CLEAN_compute_public(h, f, g, 10, tmp.b)) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 10; + v = PQCLEAN_FALCONPADDED1024_CLEAN_modq_encode( + pk + 1, PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_PUBLICKEYBYTES - 1, + h, 10); + if (v != PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + /* * Compute the signature. nonce[] receives the nonce and must have length * NONCELEN bytes. sigbuf[] receives the signature value (without nonce diff --git a/src/sig/falcon/pqclean_falcon-padded-512_aarch64/api.h b/src/sig/falcon/pqclean_falcon-padded-512_aarch64/api.h index deba20b361..c7908164bb 100644 --- a/src/sig/falcon/pqclean_falcon-padded-512_aarch64/api.h +++ b/src/sig/falcon/pqclean_falcon-padded-512_aarch64/api.h @@ -21,6 +21,29 @@ int PQCLEAN_FALCONPADDED512_AARCH64_crypto_sign_keypair( uint8_t *pk, uint8_t *sk); +/* + * Generate a new key pair from fixed seed. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCONPADDED512_AARCH64_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCONPADDED512_AARCH64_CRYPTO_SECRETKEYBYTES + * seed (seed): Input buffer containing the fixed seed (size: dependent on algorithm settings, for Falcon standard setting = 48 bytes) + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCONPADDED512_AARCH64_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +/* + * Generate a public key from a private key. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCONPADDED512_AARCH64_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCONPADDED512_AARCH64_CRYPTO_SECRETKEYBYTES + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCONPADDED512_AARCH64_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk); + /* * Compute a signature on a provided message (m, mlen), with a given * private key (sk). Signature is written in sig[], with length written diff --git a/src/sig/falcon/pqclean_falcon-padded-512_aarch64/pqclean.c b/src/sig/falcon/pqclean_falcon-padded-512_aarch64/pqclean.c index bd6f049433..d1b644a22d 100644 --- a/src/sig/falcon/pqclean_falcon-padded-512_aarch64/pqclean.c +++ b/src/sig/falcon/pqclean_falcon-padded-512_aarch64/pqclean.c @@ -105,6 +105,146 @@ PQCLEAN_FALCONPADDED512_AARCH64_crypto_sign_keypair( return 0; } +/* keypair from fixed seed*/ +int +PQCLEAN_FALCONPADDED512_AARCH64_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + union { + uint8_t b[28 * FALCON_N]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[FALCON_N], g[FALCON_N], F[FALCON_N]; + uint16_t h[FALCON_N]; + inner_shake256_context rng; + size_t u, v; + + /* + * Checking the input seed parameter. + * If the seed is NULL, return an error. + */ + if (seed == NULL) { + return -1; // Error: seed is not provided. + } + + /* + * Initialize the SHAKE256 random number generator using the seed. + * We now pass the seed directly to the generator. + */ + inner_shake256_init(&rng); + inner_shake256_inject(&rng, seed, 48); + inner_shake256_flip(&rng); + PQCLEAN_FALCONPADDED512_AARCH64_keygen(&rng, f, g, F, NULL, h, FALCON_LOGN, tmp.b); + inner_shake256_ctx_release(&rng); + + /* + * Encode private key. + */ + sk[0] = 0x50 + FALCON_LOGN; + u = 1; + v = PQCLEAN_FALCONPADDED512_AARCH64_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED512_AARCH64_CRYPTO_SECRETKEYBYTES - u, + f, PQCLEAN_FALCONPADDED512_AARCH64_max_fg_bits[FALCON_LOGN]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED512_AARCH64_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED512_AARCH64_CRYPTO_SECRETKEYBYTES - u, + g, PQCLEAN_FALCONPADDED512_AARCH64_max_fg_bits[FALCON_LOGN]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED512_AARCH64_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED512_AARCH64_CRYPTO_SECRETKEYBYTES - u, + F, PQCLEAN_FALCONPADDED512_AARCH64_max_FG_bits[FALCON_LOGN]); + if (v == 0) { + return -1; + } + u += v; + if (u != PQCLEAN_FALCONPADDED512_AARCH64_CRYPTO_SECRETKEYBYTES) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + FALCON_LOGN; + v = PQCLEAN_FALCONPADDED512_AARCH64_modq_encode( + pk + 1, PQCLEAN_FALCONPADDED512_AARCH64_CRYPTO_PUBLICKEYBYTES - 1, + h, FALCON_LOGN); + if (v != PQCLEAN_FALCONPADDED512_AARCH64_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + +/* + * This function reconstructs the public key from a given private key. + * It decodes the private key components (f and g) from the secret key + * and uses them to regenerate the corresponding public key (h). + * The generated public key is then encoded into the provided pk array. + * + * public (pk): The output buffer where the public key will be stored (must be at least PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES in size). + * private (sk): The input secret key (private key) in byte array format (must be PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES in size). + * Return value: 0 on success, -1 on error. + */ +int +PQCLEAN_FALCONPADDED512_AARCH64_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk) { + union { + uint8_t b[28 * FALCON_N]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[FALCON_N], g[FALCON_N], F[FALCON_N]; + uint16_t h[FALCON_N]; + size_t u, v; + + /* + * Decode the private key. + */ + if (sk[0] != 0x50 + FALCON_LOGN) { + return -1; + } + u = 1; + v = PQCLEAN_FALCONPADDED512_AARCH64_trim_i8_decode( + f, PQCLEAN_FALCONPADDED512_AARCH64_max_fg_bits[FALCON_LOGN], + sk + u, PQCLEAN_FALCONPADDED512_AARCH64_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED512_AARCH64_trim_i8_decode( + g, PQCLEAN_FALCONPADDED512_AARCH64_max_fg_bits[FALCON_LOGN], + sk + u, PQCLEAN_FALCONPADDED512_AARCH64_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + + /* + * Reconstruct the public key using f and g by calling the compute_public function. + */ + if (!PQCLEAN_FALCONPADDED512_AARCH64_compute_public(h, f, g, FALCON_LOGN, tmp.b)) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + FALCON_LOGN; + v = PQCLEAN_FALCONPADDED512_AARCH64_modq_encode( + pk + 1, PQCLEAN_FALCONPADDED512_AARCH64_CRYPTO_PUBLICKEYBYTES - 1, + h, FALCON_LOGN); + if (v != PQCLEAN_FALCONPADDED512_AARCH64_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + /* * Compute the signature. nonce[] receives the nonce and must have length * NONCELEN bytes. sigbuf[] receives the signature value (without nonce diff --git a/src/sig/falcon/pqclean_falcon-padded-512_avx2/api.h b/src/sig/falcon/pqclean_falcon-padded-512_avx2/api.h index c039206c77..b77c6270f9 100644 --- a/src/sig/falcon/pqclean_falcon-padded-512_avx2/api.h +++ b/src/sig/falcon/pqclean_falcon-padded-512_avx2/api.h @@ -21,6 +21,29 @@ int PQCLEAN_FALCONPADDED512_AVX2_crypto_sign_keypair( uint8_t *pk, uint8_t *sk); +/* + * Generate a new key pair from fixed seed. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCONPADDED512_AVX2_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCONPADDED512_AVX2_CRYPTO_SECRETKEYBYTES + * seed (seed): Input buffer containing the fixed seed (size: dependent on algorithm settings, for Falcon standard setting = 48 bytes) + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCONPADDED512_AVX2_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +/* + * Generate a public key from a private key. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCONPADDED512_AVX2_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCONPADDED512_AVX2_CRYPTO_SECRETKEYBYTES + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCONPADDED512_AVX2_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk); + /* * Compute a signature on a provided message (m, mlen), with a given * private key (sk). Signature is written in sig[], with length written diff --git a/src/sig/falcon/pqclean_falcon-padded-512_avx2/pqclean.c b/src/sig/falcon/pqclean_falcon-padded-512_avx2/pqclean.c index 1711050040..e8a25c3cf5 100644 --- a/src/sig/falcon/pqclean_falcon-padded-512_avx2/pqclean.c +++ b/src/sig/falcon/pqclean_falcon-padded-512_avx2/pqclean.c @@ -105,6 +105,146 @@ PQCLEAN_FALCONPADDED512_AVX2_crypto_sign_keypair( return 0; } +/* keypair from fixed seed*/ +int +PQCLEAN_FALCONPADDED512_AVX2_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_9]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[512], g[512], F[512]; + uint16_t h[512]; + inner_shake256_context rng; + size_t u, v; + + /* + * Checking the input seed parameter. + * If the seed is NULL, return an error. + */ + if (seed == NULL) { + return -1; // Error: seed is not provided. + } + + /* + * Initialize the SHAKE256 random number generator using the seed. + * We now pass the seed directly to the generator. + */ + inner_shake256_init(&rng); + inner_shake256_inject(&rng, seed, 48); + inner_shake256_flip(&rng); + PQCLEAN_FALCONPADDED512_AVX2_keygen(&rng, f, g, F, NULL, h, 9, tmp.b); + inner_shake256_ctx_release(&rng); + + /* + * Encode private key. + */ + sk[0] = 0x50 + 9; + u = 1; + v = PQCLEAN_FALCONPADDED512_AVX2_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED512_AVX2_CRYPTO_SECRETKEYBYTES - u, + f, 9, PQCLEAN_FALCONPADDED512_AVX2_max_fg_bits[9]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED512_AVX2_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED512_AVX2_CRYPTO_SECRETKEYBYTES - u, + g, 9, PQCLEAN_FALCONPADDED512_AVX2_max_fg_bits[9]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED512_AVX2_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED512_AVX2_CRYPTO_SECRETKEYBYTES - u, + F, 9, PQCLEAN_FALCONPADDED512_AVX2_max_FG_bits[9]); + if (v == 0) { + return -1; + } + u += v; + if (u != PQCLEAN_FALCONPADDED512_AVX2_CRYPTO_SECRETKEYBYTES) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 9; + v = PQCLEAN_FALCONPADDED512_AVX2_modq_encode( + pk + 1, PQCLEAN_FALCONPADDED512_AVX2_CRYPTO_PUBLICKEYBYTES - 1, + h, 9); + if (v != PQCLEAN_FALCONPADDED512_AVX2_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + +/* + * This function reconstructs the public key from a given private key. + * It decodes the private key components (f and g) from the secret key + * and uses them to regenerate the corresponding public key (h). + * The generated public key is then encoded into the provided pk array. + * + * public (pk): The output buffer where the public key will be stored (must be at least PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES in size). + * private (sk): The input secret key (private key) in byte array format (must be PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES in size). + * Return value: 0 on success, -1 on error. + */ +int +PQCLEAN_FALCONPADDED512_AVX2_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_9]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[512], g[512], F[512]; + uint16_t h[512]; + size_t u, v; + + /* + * Decode the private key. + */ + if (sk[0] != 0x50 + 9) { + return -1; + } + u = 1; + v = PQCLEAN_FALCONPADDED512_AVX2_trim_i8_decode( + f, 9, PQCLEAN_FALCONPADDED512_AVX2_max_fg_bits[9], + sk + u, PQCLEAN_FALCONPADDED512_AVX2_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED512_AVX2_trim_i8_decode( + g, 9, PQCLEAN_FALCONPADDED512_AVX2_max_fg_bits[9], + sk + u, PQCLEAN_FALCONPADDED512_AVX2_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + + /* + * Reconstruct the public key using f and g by calling the compute_public function. + */ + if (!PQCLEAN_FALCONPADDED512_AVX2_compute_public(h, f, g, 9, tmp.b)) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 9; + v = PQCLEAN_FALCONPADDED512_AVX2_modq_encode( + pk + 1, PQCLEAN_FALCONPADDED512_AVX2_CRYPTO_PUBLICKEYBYTES - 1, + h, 9); + if (v != PQCLEAN_FALCONPADDED512_AVX2_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + /* * Compute the signature. nonce[] receives the nonce and must have length * NONCELEN bytes. sigbuf[] receives the signature value (without nonce diff --git a/src/sig/falcon/pqclean_falcon-padded-512_clean/api.h b/src/sig/falcon/pqclean_falcon-padded-512_clean/api.h index 47c131469c..2008914cc1 100644 --- a/src/sig/falcon/pqclean_falcon-padded-512_clean/api.h +++ b/src/sig/falcon/pqclean_falcon-padded-512_clean/api.h @@ -21,6 +21,29 @@ int PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_keypair( uint8_t *pk, uint8_t *sk); +/* + * Generate a new key pair from fixed seed. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCONPADDED512_CLEAN_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCONPADDED512_CLEAN_CRYPTO_SECRETKEYBYTES + * seed (seed): Input buffer containing the fixed seed (size: dependent on algorithm settings, for Falcon standard setting = 48 bytes) + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed); + +/* + * Generate a public key from a private key. Public key goes into pk[], private key in sk[]. + * Key sizes are exact (in bytes): + * public (pk): PQCLEAN_FALCONPADDED512_CLEAN_CRYPTO_PUBLICKEYBYTES + * private (sk): PQCLEAN_FALCONPADDED512_CLEAN_CRYPTO_SECRETKEYBYTES + * + * Return value: 0 on success, -1 on error. + */ +int PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk); + /* * Compute a signature on a provided message (m, mlen), with a given * private key (sk). Signature is written in sig[], with length written diff --git a/src/sig/falcon/pqclean_falcon-padded-512_clean/pqclean.c b/src/sig/falcon/pqclean_falcon-padded-512_clean/pqclean.c index 7edf6a8745..458c527435 100644 --- a/src/sig/falcon/pqclean_falcon-padded-512_clean/pqclean.c +++ b/src/sig/falcon/pqclean_falcon-padded-512_clean/pqclean.c @@ -105,6 +105,146 @@ PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_keypair( return 0; } +/* keypair from fixed seed*/ +int +PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_keypair_from_fseed( + uint8_t *pk, uint8_t *sk, const uint8_t *seed) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_9]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[512], g[512], F[512]; + uint16_t h[512]; + inner_shake256_context rng; + size_t u, v; + + /* + * Checking the input seed parameter. + * If the seed is NULL, return an error. + */ + if (seed == NULL) { + return -1; // Error: seed is not provided. + } + + /* + * Initialize the SHAKE256 random number generator using the seed. + * We now pass the seed directly to the generator. + */ + inner_shake256_init(&rng); + inner_shake256_inject(&rng, seed, 48); + inner_shake256_flip(&rng); + PQCLEAN_FALCONPADDED512_CLEAN_keygen(&rng, f, g, F, NULL, h, 9, tmp.b); + inner_shake256_ctx_release(&rng); + + /* + * Encode private key. + */ + sk[0] = 0x50 + 9; + u = 1; + v = PQCLEAN_FALCONPADDED512_CLEAN_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED512_CLEAN_CRYPTO_SECRETKEYBYTES - u, + f, 9, PQCLEAN_FALCONPADDED512_CLEAN_max_fg_bits[9]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED512_CLEAN_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED512_CLEAN_CRYPTO_SECRETKEYBYTES - u, + g, 9, PQCLEAN_FALCONPADDED512_CLEAN_max_fg_bits[9]); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED512_CLEAN_trim_i8_encode( + sk + u, PQCLEAN_FALCONPADDED512_CLEAN_CRYPTO_SECRETKEYBYTES - u, + F, 9, PQCLEAN_FALCONPADDED512_CLEAN_max_FG_bits[9]); + if (v == 0) { + return -1; + } + u += v; + if (u != PQCLEAN_FALCONPADDED512_CLEAN_CRYPTO_SECRETKEYBYTES) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 9; + v = PQCLEAN_FALCONPADDED512_CLEAN_modq_encode( + pk + 1, PQCLEAN_FALCONPADDED512_CLEAN_CRYPTO_PUBLICKEYBYTES - 1, + h, 9); + if (v != PQCLEAN_FALCONPADDED512_CLEAN_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + +/* + * This function reconstructs the public key from a given private key. + * It decodes the private key components (f and g) from the secret key + * and uses them to regenerate the corresponding public key (h). + * The generated public key is then encoded into the provided pk array. + * + * public (pk): The output buffer where the public key will be stored (must be at least PQCLEAN_FALCON512_CLEAN_CRYPTO_PUBLICKEYBYTES in size). + * private (sk): The input secret key (private key) in byte array format (must be PQCLEAN_FALCON512_CLEAN_CRYPTO_SECRETKEYBYTES in size). + * Return value: 0 on success, -1 on error. + */ +int +PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_pubkey_from_privkey( + uint8_t *pk, const uint8_t *sk) { + union { + uint8_t b[FALCON_KEYGEN_TEMP_9]; + uint64_t dummy_u64; + fpr dummy_fpr; + } tmp; + int8_t f[512], g[512], F[512]; + uint16_t h[512]; + size_t u, v; + + /* + * Decode the private key. + */ + if (sk[0] != 0x50 + 9) { + return -1; + } + u = 1; + v = PQCLEAN_FALCONPADDED512_CLEAN_trim_i8_decode( + f, 9, PQCLEAN_FALCONPADDED512_CLEAN_max_fg_bits[9], + sk + u, PQCLEAN_FALCONPADDED512_CLEAN_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + u += v; + v = PQCLEAN_FALCONPADDED512_CLEAN_trim_i8_decode( + g, 9, PQCLEAN_FALCONPADDED512_CLEAN_max_fg_bits[9], + sk + u, PQCLEAN_FALCONPADDED512_CLEAN_CRYPTO_SECRETKEYBYTES - u); + if (v == 0) { + return -1; + } + + /* + * Reconstruct the public key using f and g by calling the compute_public function. + */ + if (!PQCLEAN_FALCONPADDED512_CLEAN_compute_public(h, f, g, 9, tmp.b)) { + return -1; + } + + /* + * Encode public key. + */ + pk[0] = 0x00 + 9; + v = PQCLEAN_FALCONPADDED512_CLEAN_modq_encode( + pk + 1, PQCLEAN_FALCONPADDED512_CLEAN_CRYPTO_PUBLICKEYBYTES - 1, + h, 9); + if (v != PQCLEAN_FALCONPADDED512_CLEAN_CRYPTO_PUBLICKEYBYTES - 1) { + return -1; + } + + return 0; +} + /* * Compute the signature. nonce[] receives the nonce and must have length * NONCELEN bytes. sigbuf[] receives the signature value (without nonce diff --git a/src/sig/falcon/sig_falcon.h b/src/sig/falcon/sig_falcon.h index 1721fe1f91..f8007fef0f 100644 --- a/src/sig/falcon/sig_falcon.h +++ b/src/sig/falcon/sig_falcon.h @@ -12,6 +12,8 @@ OQS_SIG *OQS_SIG_falcon_512_new(void); OQS_API OQS_STATUS OQS_SIG_falcon_512_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_falcon_512_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_falcon_512_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_falcon_512_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_falcon_512_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_falcon_512_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -25,6 +27,8 @@ OQS_API OQS_STATUS OQS_SIG_falcon_512_verify_with_ctx_str(const uint8_t *message OQS_SIG *OQS_SIG_falcon_1024_new(void); OQS_API OQS_STATUS OQS_SIG_falcon_1024_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_falcon_1024_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_falcon_1024_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_falcon_1024_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_falcon_1024_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_falcon_1024_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -38,6 +42,8 @@ OQS_API OQS_STATUS OQS_SIG_falcon_1024_verify_with_ctx_str(const uint8_t *messag OQS_SIG *OQS_SIG_falcon_padded_512_new(void); OQS_API OQS_STATUS OQS_SIG_falcon_padded_512_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_falcon_padded_512_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_falcon_padded_512_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_falcon_padded_512_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_falcon_padded_512_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_falcon_padded_512_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -51,6 +57,8 @@ OQS_API OQS_STATUS OQS_SIG_falcon_padded_512_verify_with_ctx_str(const uint8_t * OQS_SIG *OQS_SIG_falcon_padded_1024_new(void); OQS_API OQS_STATUS OQS_SIG_falcon_padded_1024_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_falcon_padded_1024_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_falcon_padded_1024_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_falcon_padded_1024_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_falcon_padded_1024_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_falcon_padded_1024_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); diff --git a/src/sig/falcon/sig_falcon_1024.c b/src/sig/falcon/sig_falcon_1024.c index e6048fc73e..39aea05bce 100644 --- a/src/sig/falcon/sig_falcon_1024.c +++ b/src/sig/falcon/sig_falcon_1024.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_falcon_1024_new(void) { sig->length_signature = OQS_SIG_falcon_1024_length_signature; sig->keypair = OQS_SIG_falcon_1024_keypair; + sig->keypair_from_fseed = OQS_SIG_falcon_1024_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_falcon_1024_pubkey_from_privkey; sig->sign = OQS_SIG_falcon_1024_sign; sig->verify = OQS_SIG_falcon_1024_verify; sig->sign_with_ctx_str = OQS_SIG_falcon_1024_sign_with_ctx_str; @@ -32,17 +34,23 @@ OQS_SIG *OQS_SIG_falcon_1024_new(void) { } extern int PQCLEAN_FALCON1024_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_FALCON1024_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_FALCON1024_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_FALCON1024_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_FALCON1024_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_falcon_1024_avx2) extern int PQCLEAN_FALCON1024_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_FALCON1024_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_FALCON1024_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_FALCON1024_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_FALCON1024_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif #if defined(OQS_ENABLE_SIG_falcon_1024_aarch64) extern int PQCLEAN_FALCON1024_AARCH64_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_FALCON1024_AARCH64_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_FALCON1024_AARCH64_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_FALCON1024_AARCH64_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_FALCON1024_AARCH64_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -73,6 +81,58 @@ OQS_API OQS_STATUS OQS_SIG_falcon_1024_keypair(uint8_t *public_key, uint8_t *sec #endif } +OQS_API OQS_STATUS OQS_SIG_falcon_1024_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_falcon_1024_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCON1024_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCON1024_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#elif defined(OQS_ENABLE_SIG_falcon_1024_aarch64) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCON1024_AARCH64_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCON1024_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_FALCON1024_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_falcon_1024_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_falcon_1024_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCON1024_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCON1024_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#elif defined(OQS_ENABLE_SIG_falcon_1024_aarch64) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCON1024_AARCH64_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCON1024_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_FALCON1024_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_falcon_1024_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_falcon_1024_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/falcon/sig_falcon_512.c b/src/sig/falcon/sig_falcon_512.c index aec1bc614f..a8db337e36 100644 --- a/src/sig/falcon/sig_falcon_512.c +++ b/src/sig/falcon/sig_falcon_512.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_falcon_512_new(void) { sig->length_signature = OQS_SIG_falcon_512_length_signature; sig->keypair = OQS_SIG_falcon_512_keypair; + sig->keypair_from_fseed = OQS_SIG_falcon_512_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_falcon_512_pubkey_from_privkey; sig->sign = OQS_SIG_falcon_512_sign; sig->verify = OQS_SIG_falcon_512_verify; sig->sign_with_ctx_str = OQS_SIG_falcon_512_sign_with_ctx_str; @@ -32,17 +34,23 @@ OQS_SIG *OQS_SIG_falcon_512_new(void) { } extern int PQCLEAN_FALCON512_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_FALCON512_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_FALCON512_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_FALCON512_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_FALCON512_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_falcon_512_avx2) extern int PQCLEAN_FALCON512_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_FALCON512_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_FALCON512_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_FALCON512_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_FALCON512_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif #if defined(OQS_ENABLE_SIG_falcon_512_aarch64) extern int PQCLEAN_FALCON512_AARCH64_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_FALCON512_AARCH64_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_FALCON512_AARCH64_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_FALCON512_AARCH64_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_FALCON512_AARCH64_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -73,6 +81,58 @@ OQS_API OQS_STATUS OQS_SIG_falcon_512_keypair(uint8_t *public_key, uint8_t *secr #endif } +OQS_API OQS_STATUS OQS_SIG_falcon_512_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_falcon_512_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCON512_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCON512_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#elif defined(OQS_ENABLE_SIG_falcon_512_aarch64) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCON512_AARCH64_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCON512_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_FALCON512_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_falcon_512_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_falcon_512_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCON512_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCON512_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#elif defined(OQS_ENABLE_SIG_falcon_512_aarch64) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCON512_AARCH64_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCON512_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_FALCON512_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_falcon_512_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_falcon_512_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/falcon/sig_falcon_padded_1024.c b/src/sig/falcon/sig_falcon_padded_1024.c index b2a777272b..870e4fd98e 100644 --- a/src/sig/falcon/sig_falcon_padded_1024.c +++ b/src/sig/falcon/sig_falcon_padded_1024.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_falcon_padded_1024_new(void) { sig->length_signature = OQS_SIG_falcon_padded_1024_length_signature; sig->keypair = OQS_SIG_falcon_padded_1024_keypair; + sig->keypair_from_fseed = OQS_SIG_falcon_padded_1024_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_falcon_padded_1024_pubkey_from_privkey; sig->sign = OQS_SIG_falcon_padded_1024_sign; sig->verify = OQS_SIG_falcon_padded_1024_verify; sig->sign_with_ctx_str = OQS_SIG_falcon_padded_1024_sign_with_ctx_str; @@ -32,17 +34,23 @@ OQS_SIG *OQS_SIG_falcon_padded_1024_new(void) { } extern int PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_falcon_padded_1024_avx2) extern int PQCLEAN_FALCONPADDED1024_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_FALCONPADDED1024_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_FALCONPADDED1024_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_FALCONPADDED1024_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_FALCONPADDED1024_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif #if defined(OQS_ENABLE_SIG_falcon_padded_1024_aarch64) extern int PQCLEAN_FALCONPADDED1024_AARCH64_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_FALCONPADDED1024_AARCH64_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_FALCONPADDED1024_AARCH64_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_FALCONPADDED1024_AARCH64_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_FALCONPADDED1024_AARCH64_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -73,6 +81,58 @@ OQS_API OQS_STATUS OQS_SIG_falcon_padded_1024_keypair(uint8_t *public_key, uint8 #endif } +OQS_API OQS_STATUS OQS_SIG_falcon_padded_1024_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_falcon_padded_1024_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCONPADDED1024_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#elif defined(OQS_ENABLE_SIG_falcon_padded_1024_aarch64) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCONPADDED1024_AARCH64_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_falcon_padded_1024_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_falcon_padded_1024_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCONPADDED1024_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#elif defined(OQS_ENABLE_SIG_falcon_padded_1024_aarch64) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCONPADDED1024_AARCH64_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_FALCONPADDED1024_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_falcon_padded_1024_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_falcon_padded_1024_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/falcon/sig_falcon_padded_512.c b/src/sig/falcon/sig_falcon_padded_512.c index 3826074334..1335040a4c 100644 --- a/src/sig/falcon/sig_falcon_padded_512.c +++ b/src/sig/falcon/sig_falcon_padded_512.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_falcon_padded_512_new(void) { sig->length_signature = OQS_SIG_falcon_padded_512_length_signature; sig->keypair = OQS_SIG_falcon_padded_512_keypair; + sig->keypair_from_fseed = OQS_SIG_falcon_padded_512_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_falcon_padded_512_pubkey_from_privkey; sig->sign = OQS_SIG_falcon_padded_512_sign; sig->verify = OQS_SIG_falcon_padded_512_verify; sig->sign_with_ctx_str = OQS_SIG_falcon_padded_512_sign_with_ctx_str; @@ -32,17 +34,23 @@ OQS_SIG *OQS_SIG_falcon_padded_512_new(void) { } extern int PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_falcon_padded_512_avx2) extern int PQCLEAN_FALCONPADDED512_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_FALCONPADDED512_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_FALCONPADDED512_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_FALCONPADDED512_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_FALCONPADDED512_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif #if defined(OQS_ENABLE_SIG_falcon_padded_512_aarch64) extern int PQCLEAN_FALCONPADDED512_AARCH64_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_FALCONPADDED512_AARCH64_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_FALCONPADDED512_AARCH64_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_FALCONPADDED512_AARCH64_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_FALCONPADDED512_AARCH64_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -73,6 +81,58 @@ OQS_API OQS_STATUS OQS_SIG_falcon_padded_512_keypair(uint8_t *public_key, uint8_ #endif } +OQS_API OQS_STATUS OQS_SIG_falcon_padded_512_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_falcon_padded_512_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCONPADDED512_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#elif defined(OQS_ENABLE_SIG_falcon_padded_512_aarch64) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCONPADDED512_AARCH64_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_falcon_padded_512_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_falcon_padded_512_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCONPADDED512_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#elif defined(OQS_ENABLE_SIG_falcon_padded_512_aarch64) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_FALCONPADDED512_AARCH64_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_FALCONPADDED512_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_falcon_padded_512_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_falcon_padded_512_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/mayo/sig_mayo.h b/src/sig/mayo/sig_mayo.h index 00d4b80dde..0bb48424dd 100644 --- a/src/sig/mayo/sig_mayo.h +++ b/src/sig/mayo/sig_mayo.h @@ -12,6 +12,8 @@ OQS_SIG *OQS_SIG_mayo_1_new(void); OQS_API OQS_STATUS OQS_SIG_mayo_1_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_mayo_1_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_mayo_1_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_mayo_1_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_mayo_1_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_mayo_1_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -25,6 +27,8 @@ OQS_API OQS_STATUS OQS_SIG_mayo_1_verify_with_ctx_str(const uint8_t *message, si OQS_SIG *OQS_SIG_mayo_2_new(void); OQS_API OQS_STATUS OQS_SIG_mayo_2_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_mayo_2_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_mayo_2_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_mayo_2_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_mayo_2_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_mayo_2_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -38,6 +42,8 @@ OQS_API OQS_STATUS OQS_SIG_mayo_2_verify_with_ctx_str(const uint8_t *message, si OQS_SIG *OQS_SIG_mayo_3_new(void); OQS_API OQS_STATUS OQS_SIG_mayo_3_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_mayo_3_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_mayo_3_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_mayo_3_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_mayo_3_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_mayo_3_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -51,6 +57,8 @@ OQS_API OQS_STATUS OQS_SIG_mayo_3_verify_with_ctx_str(const uint8_t *message, si OQS_SIG *OQS_SIG_mayo_5_new(void); OQS_API OQS_STATUS OQS_SIG_mayo_5_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_mayo_5_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_mayo_5_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_mayo_5_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_mayo_5_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_mayo_5_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); diff --git a/src/sig/mayo/sig_mayo_1.c b/src/sig/mayo/sig_mayo_1.c index be70917dbd..ab6818690f 100644 --- a/src/sig/mayo/sig_mayo_1.c +++ b/src/sig/mayo/sig_mayo_1.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_mayo_1_new(void) { sig->length_signature = OQS_SIG_mayo_1_length_signature; sig->keypair = OQS_SIG_mayo_1_keypair; + sig->keypair_from_fseed = OQS_SIG_mayo_1_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_mayo_1_pubkey_from_privkey; sig->sign = OQS_SIG_mayo_1_sign; sig->verify = OQS_SIG_mayo_1_verify; sig->sign_with_ctx_str = OQS_SIG_mayo_1_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_mayo_1_new(void) { } extern int pqmayo_MAYO_1_opt_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_MAYO1_OPT_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_MAYO1_OPT_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqmayo_MAYO_1_opt_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqmayo_MAYO_1_opt_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_mayo_1_avx2) extern int pqmayo_MAYO_1_avx2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_MAYO1_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_MAYO1_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqmayo_MAYO_1_avx2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqmayo_MAYO_1_avx2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_mayo_1_keypair(uint8_t *public_key, uint8_t *secret_k #endif } +OQS_API OQS_STATUS OQS_SIG_mayo_1_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_mayo_1_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_MAYO1_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_MAYO1_OPT_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_MAYO1_OPT_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_mayo_1_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_mayo_1_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_MAYO1_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_MAYO1_OPT_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_MAYO1_OPT_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_mayo_1_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_mayo_1_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/mayo/sig_mayo_2.c b/src/sig/mayo/sig_mayo_2.c index 3a4e0dfd75..b9630fe6f7 100644 --- a/src/sig/mayo/sig_mayo_2.c +++ b/src/sig/mayo/sig_mayo_2.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_mayo_2_new(void) { sig->length_signature = OQS_SIG_mayo_2_length_signature; sig->keypair = OQS_SIG_mayo_2_keypair; + sig->keypair_from_fseed = OQS_SIG_mayo_2_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_mayo_2_pubkey_from_privkey; sig->sign = OQS_SIG_mayo_2_sign; sig->verify = OQS_SIG_mayo_2_verify; sig->sign_with_ctx_str = OQS_SIG_mayo_2_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_mayo_2_new(void) { } extern int pqmayo_MAYO_2_opt_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_MAYO2_OPT_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_MAYO2_OPT_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqmayo_MAYO_2_opt_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqmayo_MAYO_2_opt_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_mayo_2_avx2) extern int pqmayo_MAYO_2_avx2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_MAYO2_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_MAYO2_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqmayo_MAYO_2_avx2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqmayo_MAYO_2_avx2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_mayo_2_keypair(uint8_t *public_key, uint8_t *secret_k #endif } +OQS_API OQS_STATUS OQS_SIG_mayo_2_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_mayo_2_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_MAYO2_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_MAYO2_OPT_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_MAYO2_OPT_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_mayo_2_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_mayo_2_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_MAYO2_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_MAYO2_OPT_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_MAYO2_OPT_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_mayo_2_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_mayo_2_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/mayo/sig_mayo_3.c b/src/sig/mayo/sig_mayo_3.c index d912107574..eb4bb7bd34 100644 --- a/src/sig/mayo/sig_mayo_3.c +++ b/src/sig/mayo/sig_mayo_3.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_mayo_3_new(void) { sig->length_signature = OQS_SIG_mayo_3_length_signature; sig->keypair = OQS_SIG_mayo_3_keypair; + sig->keypair_from_fseed = OQS_SIG_mayo_3_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_mayo_3_pubkey_from_privkey; sig->sign = OQS_SIG_mayo_3_sign; sig->verify = OQS_SIG_mayo_3_verify; sig->sign_with_ctx_str = OQS_SIG_mayo_3_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_mayo_3_new(void) { } extern int pqmayo_MAYO_3_opt_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_MAYO3_OPT_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_MAYO3_OPT_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqmayo_MAYO_3_opt_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqmayo_MAYO_3_opt_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_mayo_3_avx2) extern int pqmayo_MAYO_3_avx2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_MAYO3_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_MAYO3_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqmayo_MAYO_3_avx2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqmayo_MAYO_3_avx2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_mayo_3_keypair(uint8_t *public_key, uint8_t *secret_k #endif } +OQS_API OQS_STATUS OQS_SIG_mayo_3_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_mayo_3_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_MAYO3_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_MAYO3_OPT_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_MAYO3_OPT_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_mayo_3_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_mayo_3_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_MAYO3_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_MAYO3_OPT_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_MAYO3_OPT_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_mayo_3_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_mayo_3_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/mayo/sig_mayo_5.c b/src/sig/mayo/sig_mayo_5.c index 812e0f1001..e6863ca6f0 100644 --- a/src/sig/mayo/sig_mayo_5.c +++ b/src/sig/mayo/sig_mayo_5.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_mayo_5_new(void) { sig->length_signature = OQS_SIG_mayo_5_length_signature; sig->keypair = OQS_SIG_mayo_5_keypair; + sig->keypair_from_fseed = OQS_SIG_mayo_5_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_mayo_5_pubkey_from_privkey; sig->sign = OQS_SIG_mayo_5_sign; sig->verify = OQS_SIG_mayo_5_verify; sig->sign_with_ctx_str = OQS_SIG_mayo_5_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_mayo_5_new(void) { } extern int pqmayo_MAYO_5_opt_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_MAYO5_OPT_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_MAYO5_OPT_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqmayo_MAYO_5_opt_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqmayo_MAYO_5_opt_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_mayo_5_avx2) extern int pqmayo_MAYO_5_avx2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_MAYO5_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_MAYO5_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqmayo_MAYO_5_avx2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqmayo_MAYO_5_avx2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_mayo_5_keypair(uint8_t *public_key, uint8_t *secret_k #endif } +OQS_API OQS_STATUS OQS_SIG_mayo_5_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_mayo_5_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_MAYO5_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_MAYO5_OPT_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_MAYO5_OPT_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_mayo_5_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_mayo_5_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_MAYO5_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_MAYO5_OPT_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_MAYO5_OPT_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_mayo_5_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_mayo_5_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/ml_dsa/sig_ml_dsa.h b/src/sig/ml_dsa/sig_ml_dsa.h index e5f00f4387..ac90ac0daf 100644 --- a/src/sig/ml_dsa/sig_ml_dsa.h +++ b/src/sig/ml_dsa/sig_ml_dsa.h @@ -12,6 +12,8 @@ OQS_SIG *OQS_SIG_ml_dsa_44_new(void); OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -25,6 +27,8 @@ OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_verify_with_ctx_str(const uint8_t *message, OQS_SIG *OQS_SIG_ml_dsa_65_new(void); OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -38,6 +42,8 @@ OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_verify_with_ctx_str(const uint8_t *message, OQS_SIG *OQS_SIG_ml_dsa_87_new(void); OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); diff --git a/src/sig/ml_dsa/sig_ml_dsa_44.c b/src/sig/ml_dsa/sig_ml_dsa_44.c index 1a786ae850..93a5716215 100644 --- a/src/sig/ml_dsa/sig_ml_dsa_44.c +++ b/src/sig/ml_dsa/sig_ml_dsa_44.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_ml_dsa_44_new(void) { sig->length_signature = OQS_SIG_ml_dsa_44_length_signature; sig->keypair = OQS_SIG_ml_dsa_44_keypair; + sig->keypair_from_fseed = OQS_SIG_ml_dsa_44_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_ml_dsa_44_pubkey_from_privkey; sig->sign = OQS_SIG_ml_dsa_44_sign; sig->verify = OQS_SIG_ml_dsa_44_verify; sig->sign_with_ctx_str = OQS_SIG_ml_dsa_44_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_ml_dsa_44_new(void) { } extern int pqcrystals_ml_dsa_44_ref_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_MLDSA44_REF_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_MLDSA44_REF_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqcrystals_ml_dsa_44_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *ctx, size_t ctxlen, const uint8_t *sk); extern int pqcrystals_ml_dsa_44_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *ctx, size_t ctxlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_ml_dsa_44_avx2) extern int pqcrystals_ml_dsa_44_avx2_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_MLDSA44_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_MLDSA44_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqcrystals_ml_dsa_44_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *ctx, size_t ctxlen, const uint8_t *sk); extern int pqcrystals_ml_dsa_44_avx2_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *ctx, size_t ctxlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_keypair(uint8_t *public_key, uint8_t *secre #endif } +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_ml_dsa_44_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_MLDSA44_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_MLDSA44_REF_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_MLDSA44_REF_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_44_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_MLDSA44_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_MLDSA44_REF_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_MLDSA44_REF_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_ml_dsa_44_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/ml_dsa/sig_ml_dsa_65.c b/src/sig/ml_dsa/sig_ml_dsa_65.c index 094878d4c0..f9fbe2deed 100644 --- a/src/sig/ml_dsa/sig_ml_dsa_65.c +++ b/src/sig/ml_dsa/sig_ml_dsa_65.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_ml_dsa_65_new(void) { sig->length_signature = OQS_SIG_ml_dsa_65_length_signature; sig->keypair = OQS_SIG_ml_dsa_65_keypair; + sig->keypair_from_fseed = OQS_SIG_ml_dsa_65_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_ml_dsa_65_pubkey_from_privkey; sig->sign = OQS_SIG_ml_dsa_65_sign; sig->verify = OQS_SIG_ml_dsa_65_verify; sig->sign_with_ctx_str = OQS_SIG_ml_dsa_65_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_ml_dsa_65_new(void) { } extern int pqcrystals_ml_dsa_65_ref_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_MLDSA65_REF_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_MLDSA65_REF_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqcrystals_ml_dsa_65_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *ctx, size_t ctxlen, const uint8_t *sk); extern int pqcrystals_ml_dsa_65_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *ctx, size_t ctxlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_ml_dsa_65_avx2) extern int pqcrystals_ml_dsa_65_avx2_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_MLDSA65_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_MLDSA65_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqcrystals_ml_dsa_65_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *ctx, size_t ctxlen, const uint8_t *sk); extern int pqcrystals_ml_dsa_65_avx2_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *ctx, size_t ctxlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_keypair(uint8_t *public_key, uint8_t *secre #endif } +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_ml_dsa_65_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_MLDSA65_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_MLDSA65_REF_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_MLDSA65_REF_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_65_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_MLDSA65_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_MLDSA65_REF_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_MLDSA65_REF_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_ml_dsa_65_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/ml_dsa/sig_ml_dsa_87.c b/src/sig/ml_dsa/sig_ml_dsa_87.c index 689690aa61..3f26912379 100644 --- a/src/sig/ml_dsa/sig_ml_dsa_87.c +++ b/src/sig/ml_dsa/sig_ml_dsa_87.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_ml_dsa_87_new(void) { sig->length_signature = OQS_SIG_ml_dsa_87_length_signature; sig->keypair = OQS_SIG_ml_dsa_87_keypair; + sig->keypair_from_fseed = OQS_SIG_ml_dsa_87_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_ml_dsa_87_pubkey_from_privkey; sig->sign = OQS_SIG_ml_dsa_87_sign; sig->verify = OQS_SIG_ml_dsa_87_verify; sig->sign_with_ctx_str = OQS_SIG_ml_dsa_87_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_ml_dsa_87_new(void) { } extern int pqcrystals_ml_dsa_87_ref_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_MLDSA87_REF_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_MLDSA87_REF_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqcrystals_ml_dsa_87_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *ctx, size_t ctxlen, const uint8_t *sk); extern int pqcrystals_ml_dsa_87_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *ctx, size_t ctxlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_ml_dsa_87_avx2) extern int pqcrystals_ml_dsa_87_avx2_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_MLDSA87_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_MLDSA87_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int pqcrystals_ml_dsa_87_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *ctx, size_t ctxlen, const uint8_t *sk); extern int pqcrystals_ml_dsa_87_avx2_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *ctx, size_t ctxlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_keypair(uint8_t *public_key, uint8_t *secre #endif } +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_ml_dsa_87_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_MLDSA87_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_MLDSA87_REF_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_MLDSA87_REF_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_87_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_MLDSA87_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_MLDSA87_REF_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_MLDSA87_REF_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_ml_dsa_87_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/sphincs/sig_sphincs.h b/src/sig/sphincs/sig_sphincs.h index 5b3e4f9274..1969e8982b 100644 --- a/src/sig/sphincs/sig_sphincs.h +++ b/src/sig/sphincs/sig_sphincs.h @@ -12,6 +12,8 @@ OQS_SIG *OQS_SIG_sphincs_sha2_128f_simple_new(void); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128f_simple_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128f_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128f_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128f_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128f_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128f_simple_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -25,6 +27,8 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128f_simple_verify_with_ctx_str(const ui OQS_SIG *OQS_SIG_sphincs_sha2_128s_simple_new(void); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128s_simple_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128s_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128s_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128s_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128s_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128s_simple_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -38,6 +42,8 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128s_simple_verify_with_ctx_str(const ui OQS_SIG *OQS_SIG_sphincs_sha2_192f_simple_new(void); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192f_simple_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192f_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192f_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192f_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192f_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192f_simple_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -51,6 +57,8 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192f_simple_verify_with_ctx_str(const ui OQS_SIG *OQS_SIG_sphincs_sha2_192s_simple_new(void); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192s_simple_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192s_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192s_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192s_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192s_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192s_simple_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -64,6 +72,8 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192s_simple_verify_with_ctx_str(const ui OQS_SIG *OQS_SIG_sphincs_sha2_256f_simple_new(void); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256f_simple_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256f_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256f_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256f_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256f_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256f_simple_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -77,6 +87,8 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256f_simple_verify_with_ctx_str(const ui OQS_SIG *OQS_SIG_sphincs_sha2_256s_simple_new(void); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256s_simple_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256s_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256s_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256s_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256s_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256s_simple_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -90,6 +102,8 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256s_simple_verify_with_ctx_str(const ui OQS_SIG *OQS_SIG_sphincs_shake_128f_simple_new(void); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128f_simple_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128f_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128f_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128f_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128f_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128f_simple_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -103,6 +117,8 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128f_simple_verify_with_ctx_str(const u OQS_SIG *OQS_SIG_sphincs_shake_128s_simple_new(void); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128s_simple_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128s_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128s_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128s_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128s_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128s_simple_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -116,6 +132,8 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128s_simple_verify_with_ctx_str(const u OQS_SIG *OQS_SIG_sphincs_shake_192f_simple_new(void); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192f_simple_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192f_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192f_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192f_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192f_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192f_simple_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -129,6 +147,8 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192f_simple_verify_with_ctx_str(const u OQS_SIG *OQS_SIG_sphincs_shake_192s_simple_new(void); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192s_simple_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192s_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192s_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192s_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192s_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192s_simple_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -142,6 +162,8 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192s_simple_verify_with_ctx_str(const u OQS_SIG *OQS_SIG_sphincs_shake_256f_simple_new(void); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256f_simple_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256f_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256f_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256f_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256f_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256f_simple_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); @@ -155,6 +177,8 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256f_simple_verify_with_ctx_str(const u OQS_SIG *OQS_SIG_sphincs_shake_256s_simple_new(void); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256s_simple_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256s_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed); +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256s_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256s_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256s_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256s_simple_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx, size_t ctxlen, const uint8_t *secret_key); diff --git a/src/sig/sphincs/sig_sphincs_sha2_128f_simple.c b/src/sig/sphincs/sig_sphincs_sha2_128f_simple.c index cc2f9dc230..d42e69b7fc 100644 --- a/src/sig/sphincs/sig_sphincs_sha2_128f_simple.c +++ b/src/sig/sphincs/sig_sphincs_sha2_128f_simple.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_sphincs_sha2_128f_simple_new(void) { sig->length_signature = OQS_SIG_sphincs_sha2_128f_simple_length_signature; sig->keypair = OQS_SIG_sphincs_sha2_128f_simple_keypair; + sig->keypair_from_fseed = OQS_SIG_sphincs_sha2_128f_simple_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_sphincs_sha2_128f_simple_pubkey_from_privkey; sig->sign = OQS_SIG_sphincs_sha2_128f_simple_sign; sig->verify = OQS_SIG_sphincs_sha2_128f_simple_verify; sig->sign_with_ctx_str = OQS_SIG_sphincs_sha2_128f_simple_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_sphincs_sha2_128f_simple_new(void) { } extern int PQCLEAN_SPHINCSSHA2128FSIMPLE_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHA2128FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHA2128FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2128FSIMPLE_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2128FSIMPLE_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_sphincs_sha2_128f_simple_avx2) extern int PQCLEAN_SPHINCSSHA2128FSIMPLE_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHA2128FSIMPLE_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHA2128FSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2128FSIMPLE_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2128FSIMPLE_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128f_simple_keypair(uint8_t *public_key, #endif } +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128f_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_sphincs_sha2_128f_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2128FSIMPLE_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2128FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2128FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128f_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_sphincs_sha2_128f_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2128FSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2128FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2128FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128f_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_sphincs_sha2_128f_simple_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/sphincs/sig_sphincs_sha2_128s_simple.c b/src/sig/sphincs/sig_sphincs_sha2_128s_simple.c index 6098fd6f90..70e620ec80 100644 --- a/src/sig/sphincs/sig_sphincs_sha2_128s_simple.c +++ b/src/sig/sphincs/sig_sphincs_sha2_128s_simple.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_sphincs_sha2_128s_simple_new(void) { sig->length_signature = OQS_SIG_sphincs_sha2_128s_simple_length_signature; sig->keypair = OQS_SIG_sphincs_sha2_128s_simple_keypair; + sig->keypair_from_fseed = OQS_SIG_sphincs_sha2_128s_simple_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_sphincs_sha2_128s_simple_pubkey_from_privkey; sig->sign = OQS_SIG_sphincs_sha2_128s_simple_sign; sig->verify = OQS_SIG_sphincs_sha2_128s_simple_verify; sig->sign_with_ctx_str = OQS_SIG_sphincs_sha2_128s_simple_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_sphincs_sha2_128s_simple_new(void) { } extern int PQCLEAN_SPHINCSSHA2128SSIMPLE_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHA2128SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHA2128SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2128SSIMPLE_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2128SSIMPLE_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_sphincs_sha2_128s_simple_avx2) extern int PQCLEAN_SPHINCSSHA2128SSIMPLE_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHA2128SSIMPLE_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHA2128SSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2128SSIMPLE_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2128SSIMPLE_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128s_simple_keypair(uint8_t *public_key, #endif } +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128s_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_sphincs_sha2_128s_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2128SSIMPLE_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2128SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2128SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128s_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_sphincs_sha2_128s_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2128SSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2128SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2128SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128s_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_sphincs_sha2_128s_simple_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/sphincs/sig_sphincs_sha2_192f_simple.c b/src/sig/sphincs/sig_sphincs_sha2_192f_simple.c index 3d74bb4fa6..0a1140d485 100644 --- a/src/sig/sphincs/sig_sphincs_sha2_192f_simple.c +++ b/src/sig/sphincs/sig_sphincs_sha2_192f_simple.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_sphincs_sha2_192f_simple_new(void) { sig->length_signature = OQS_SIG_sphincs_sha2_192f_simple_length_signature; sig->keypair = OQS_SIG_sphincs_sha2_192f_simple_keypair; + sig->keypair_from_fseed = OQS_SIG_sphincs_sha2_192f_simple_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_sphincs_sha2_192f_simple_pubkey_from_privkey; sig->sign = OQS_SIG_sphincs_sha2_192f_simple_sign; sig->verify = OQS_SIG_sphincs_sha2_192f_simple_verify; sig->sign_with_ctx_str = OQS_SIG_sphincs_sha2_192f_simple_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_sphincs_sha2_192f_simple_new(void) { } extern int PQCLEAN_SPHINCSSHA2192FSIMPLE_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHA2192FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHA2192FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2192FSIMPLE_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2192FSIMPLE_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_sphincs_sha2_192f_simple_avx2) extern int PQCLEAN_SPHINCSSHA2192FSIMPLE_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHA2192FSIMPLE_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHA2192FSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2192FSIMPLE_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2192FSIMPLE_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192f_simple_keypair(uint8_t *public_key, #endif } +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192f_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_sphincs_sha2_192f_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2192FSIMPLE_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2192FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2192FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192f_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_sphincs_sha2_192f_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2192FSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2192FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2192FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192f_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_sphincs_sha2_192f_simple_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/sphincs/sig_sphincs_sha2_192s_simple.c b/src/sig/sphincs/sig_sphincs_sha2_192s_simple.c index 13b219a276..1d41ead069 100644 --- a/src/sig/sphincs/sig_sphincs_sha2_192s_simple.c +++ b/src/sig/sphincs/sig_sphincs_sha2_192s_simple.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_sphincs_sha2_192s_simple_new(void) { sig->length_signature = OQS_SIG_sphincs_sha2_192s_simple_length_signature; sig->keypair = OQS_SIG_sphincs_sha2_192s_simple_keypair; + sig->keypair_from_fseed = OQS_SIG_sphincs_sha2_192s_simple_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_sphincs_sha2_192s_simple_pubkey_from_privkey; sig->sign = OQS_SIG_sphincs_sha2_192s_simple_sign; sig->verify = OQS_SIG_sphincs_sha2_192s_simple_verify; sig->sign_with_ctx_str = OQS_SIG_sphincs_sha2_192s_simple_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_sphincs_sha2_192s_simple_new(void) { } extern int PQCLEAN_SPHINCSSHA2192SSIMPLE_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHA2192SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHA2192SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2192SSIMPLE_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2192SSIMPLE_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_sphincs_sha2_192s_simple_avx2) extern int PQCLEAN_SPHINCSSHA2192SSIMPLE_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHA2192SSIMPLE_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHA2192SSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2192SSIMPLE_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2192SSIMPLE_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192s_simple_keypair(uint8_t *public_key, #endif } +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192s_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_sphincs_sha2_192s_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2192SSIMPLE_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2192SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2192SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192s_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_sphincs_sha2_192s_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2192SSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2192SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2192SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192s_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_sphincs_sha2_192s_simple_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/sphincs/sig_sphincs_sha2_256f_simple.c b/src/sig/sphincs/sig_sphincs_sha2_256f_simple.c index 25851e4b65..003677d0b3 100644 --- a/src/sig/sphincs/sig_sphincs_sha2_256f_simple.c +++ b/src/sig/sphincs/sig_sphincs_sha2_256f_simple.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_sphincs_sha2_256f_simple_new(void) { sig->length_signature = OQS_SIG_sphincs_sha2_256f_simple_length_signature; sig->keypair = OQS_SIG_sphincs_sha2_256f_simple_keypair; + sig->keypair_from_fseed = OQS_SIG_sphincs_sha2_256f_simple_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_sphincs_sha2_256f_simple_pubkey_from_privkey; sig->sign = OQS_SIG_sphincs_sha2_256f_simple_sign; sig->verify = OQS_SIG_sphincs_sha2_256f_simple_verify; sig->sign_with_ctx_str = OQS_SIG_sphincs_sha2_256f_simple_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_sphincs_sha2_256f_simple_new(void) { } extern int PQCLEAN_SPHINCSSHA2256FSIMPLE_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHA2256FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHA2256FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2256FSIMPLE_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2256FSIMPLE_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_sphincs_sha2_256f_simple_avx2) extern int PQCLEAN_SPHINCSSHA2256FSIMPLE_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHA2256FSIMPLE_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHA2256FSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2256FSIMPLE_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2256FSIMPLE_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256f_simple_keypair(uint8_t *public_key, #endif } +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256f_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_sphincs_sha2_256f_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2256FSIMPLE_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2256FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2256FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256f_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_sphincs_sha2_256f_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2256FSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2256FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2256FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256f_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_sphincs_sha2_256f_simple_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/sphincs/sig_sphincs_sha2_256s_simple.c b/src/sig/sphincs/sig_sphincs_sha2_256s_simple.c index 6f564cd8b2..828bb77a01 100644 --- a/src/sig/sphincs/sig_sphincs_sha2_256s_simple.c +++ b/src/sig/sphincs/sig_sphincs_sha2_256s_simple.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_sphincs_sha2_256s_simple_new(void) { sig->length_signature = OQS_SIG_sphincs_sha2_256s_simple_length_signature; sig->keypair = OQS_SIG_sphincs_sha2_256s_simple_keypair; + sig->keypair_from_fseed = OQS_SIG_sphincs_sha2_256s_simple_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_sphincs_sha2_256s_simple_pubkey_from_privkey; sig->sign = OQS_SIG_sphincs_sha2_256s_simple_sign; sig->verify = OQS_SIG_sphincs_sha2_256s_simple_verify; sig->sign_with_ctx_str = OQS_SIG_sphincs_sha2_256s_simple_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_sphincs_sha2_256s_simple_new(void) { } extern int PQCLEAN_SPHINCSSHA2256SSIMPLE_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHA2256SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHA2256SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2256SSIMPLE_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2256SSIMPLE_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_sphincs_sha2_256s_simple_avx2) extern int PQCLEAN_SPHINCSSHA2256SSIMPLE_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHA2256SSIMPLE_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHA2256SSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2256SSIMPLE_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHA2256SSIMPLE_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256s_simple_keypair(uint8_t *public_key, #endif } +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256s_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_sphincs_sha2_256s_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2256SSIMPLE_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2256SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2256SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256s_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_sphincs_sha2_256s_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2256SSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2256SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHA2256SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256s_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_sphincs_sha2_256s_simple_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/sphincs/sig_sphincs_shake_128f_simple.c b/src/sig/sphincs/sig_sphincs_shake_128f_simple.c index e66ec651b5..490dfe3419 100644 --- a/src/sig/sphincs/sig_sphincs_shake_128f_simple.c +++ b/src/sig/sphincs/sig_sphincs_shake_128f_simple.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_sphincs_shake_128f_simple_new(void) { sig->length_signature = OQS_SIG_sphincs_shake_128f_simple_length_signature; sig->keypair = OQS_SIG_sphincs_shake_128f_simple_keypair; + sig->keypair_from_fseed = OQS_SIG_sphincs_shake_128f_simple_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_sphincs_shake_128f_simple_pubkey_from_privkey; sig->sign = OQS_SIG_sphincs_shake_128f_simple_sign; sig->verify = OQS_SIG_sphincs_shake_128f_simple_verify; sig->sign_with_ctx_str = OQS_SIG_sphincs_shake_128f_simple_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_sphincs_shake_128f_simple_new(void) { } extern int PQCLEAN_SPHINCSSHAKE128FSIMPLE_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHAKE128FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHAKE128FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE128FSIMPLE_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE128FSIMPLE_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_sphincs_shake_128f_simple_avx2) extern int PQCLEAN_SPHINCSSHAKE128FSIMPLE_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHAKE128FSIMPLE_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHAKE128FSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE128FSIMPLE_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE128FSIMPLE_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128f_simple_keypair(uint8_t *public_key #endif } +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128f_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_sphincs_shake_128f_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE128FSIMPLE_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE128FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE128FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128f_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_sphincs_shake_128f_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE128FSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE128FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE128FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128f_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_sphincs_shake_128f_simple_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/sphincs/sig_sphincs_shake_128s_simple.c b/src/sig/sphincs/sig_sphincs_shake_128s_simple.c index 34ae16c29d..01d89be4c9 100644 --- a/src/sig/sphincs/sig_sphincs_shake_128s_simple.c +++ b/src/sig/sphincs/sig_sphincs_shake_128s_simple.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_sphincs_shake_128s_simple_new(void) { sig->length_signature = OQS_SIG_sphincs_shake_128s_simple_length_signature; sig->keypair = OQS_SIG_sphincs_shake_128s_simple_keypair; + sig->keypair_from_fseed = OQS_SIG_sphincs_shake_128s_simple_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_sphincs_shake_128s_simple_pubkey_from_privkey; sig->sign = OQS_SIG_sphincs_shake_128s_simple_sign; sig->verify = OQS_SIG_sphincs_shake_128s_simple_verify; sig->sign_with_ctx_str = OQS_SIG_sphincs_shake_128s_simple_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_sphincs_shake_128s_simple_new(void) { } extern int PQCLEAN_SPHINCSSHAKE128SSIMPLE_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHAKE128SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHAKE128SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE128SSIMPLE_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE128SSIMPLE_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_sphincs_shake_128s_simple_avx2) extern int PQCLEAN_SPHINCSSHAKE128SSIMPLE_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHAKE128SSIMPLE_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHAKE128SSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE128SSIMPLE_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE128SSIMPLE_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128s_simple_keypair(uint8_t *public_key #endif } +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128s_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_sphincs_shake_128s_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE128SSIMPLE_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE128SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE128SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128s_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_sphincs_shake_128s_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE128SSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE128SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE128SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128s_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_sphincs_shake_128s_simple_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/sphincs/sig_sphincs_shake_192f_simple.c b/src/sig/sphincs/sig_sphincs_shake_192f_simple.c index d99bc15908..538d2ea6a0 100644 --- a/src/sig/sphincs/sig_sphincs_shake_192f_simple.c +++ b/src/sig/sphincs/sig_sphincs_shake_192f_simple.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_sphincs_shake_192f_simple_new(void) { sig->length_signature = OQS_SIG_sphincs_shake_192f_simple_length_signature; sig->keypair = OQS_SIG_sphincs_shake_192f_simple_keypair; + sig->keypair_from_fseed = OQS_SIG_sphincs_shake_192f_simple_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_sphincs_shake_192f_simple_pubkey_from_privkey; sig->sign = OQS_SIG_sphincs_shake_192f_simple_sign; sig->verify = OQS_SIG_sphincs_shake_192f_simple_verify; sig->sign_with_ctx_str = OQS_SIG_sphincs_shake_192f_simple_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_sphincs_shake_192f_simple_new(void) { } extern int PQCLEAN_SPHINCSSHAKE192FSIMPLE_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHAKE192FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHAKE192FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE192FSIMPLE_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE192FSIMPLE_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_sphincs_shake_192f_simple_avx2) extern int PQCLEAN_SPHINCSSHAKE192FSIMPLE_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHAKE192FSIMPLE_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHAKE192FSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE192FSIMPLE_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE192FSIMPLE_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192f_simple_keypair(uint8_t *public_key #endif } +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192f_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_sphincs_shake_192f_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE192FSIMPLE_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE192FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE192FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192f_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_sphincs_shake_192f_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE192FSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE192FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE192FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192f_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_sphincs_shake_192f_simple_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/sphincs/sig_sphincs_shake_192s_simple.c b/src/sig/sphincs/sig_sphincs_shake_192s_simple.c index 3645bc5a9e..320da80dbe 100644 --- a/src/sig/sphincs/sig_sphincs_shake_192s_simple.c +++ b/src/sig/sphincs/sig_sphincs_shake_192s_simple.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_sphincs_shake_192s_simple_new(void) { sig->length_signature = OQS_SIG_sphincs_shake_192s_simple_length_signature; sig->keypair = OQS_SIG_sphincs_shake_192s_simple_keypair; + sig->keypair_from_fseed = OQS_SIG_sphincs_shake_192s_simple_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_sphincs_shake_192s_simple_pubkey_from_privkey; sig->sign = OQS_SIG_sphincs_shake_192s_simple_sign; sig->verify = OQS_SIG_sphincs_shake_192s_simple_verify; sig->sign_with_ctx_str = OQS_SIG_sphincs_shake_192s_simple_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_sphincs_shake_192s_simple_new(void) { } extern int PQCLEAN_SPHINCSSHAKE192SSIMPLE_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHAKE192SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHAKE192SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE192SSIMPLE_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE192SSIMPLE_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_sphincs_shake_192s_simple_avx2) extern int PQCLEAN_SPHINCSSHAKE192SSIMPLE_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHAKE192SSIMPLE_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHAKE192SSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE192SSIMPLE_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE192SSIMPLE_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192s_simple_keypair(uint8_t *public_key #endif } +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192s_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_sphincs_shake_192s_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE192SSIMPLE_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE192SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE192SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192s_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_sphincs_shake_192s_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE192SSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE192SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE192SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192s_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_sphincs_shake_192s_simple_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/sphincs/sig_sphincs_shake_256f_simple.c b/src/sig/sphincs/sig_sphincs_shake_256f_simple.c index 25bc38f436..b17a115a63 100644 --- a/src/sig/sphincs/sig_sphincs_shake_256f_simple.c +++ b/src/sig/sphincs/sig_sphincs_shake_256f_simple.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_sphincs_shake_256f_simple_new(void) { sig->length_signature = OQS_SIG_sphincs_shake_256f_simple_length_signature; sig->keypair = OQS_SIG_sphincs_shake_256f_simple_keypair; + sig->keypair_from_fseed = OQS_SIG_sphincs_shake_256f_simple_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_sphincs_shake_256f_simple_pubkey_from_privkey; sig->sign = OQS_SIG_sphincs_shake_256f_simple_sign; sig->verify = OQS_SIG_sphincs_shake_256f_simple_verify; sig->sign_with_ctx_str = OQS_SIG_sphincs_shake_256f_simple_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_sphincs_shake_256f_simple_new(void) { } extern int PQCLEAN_SPHINCSSHAKE256FSIMPLE_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHAKE256FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHAKE256FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE256FSIMPLE_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE256FSIMPLE_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_sphincs_shake_256f_simple_avx2) extern int PQCLEAN_SPHINCSSHAKE256FSIMPLE_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHAKE256FSIMPLE_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHAKE256FSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE256FSIMPLE_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE256FSIMPLE_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256f_simple_keypair(uint8_t *public_key #endif } +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256f_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_sphincs_shake_256f_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE256FSIMPLE_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE256FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE256FSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256f_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_sphincs_shake_256f_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE256FSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE256FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE256FSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256f_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_sphincs_shake_256f_simple_avx2) #if defined(OQS_DIST_BUILD) diff --git a/src/sig/sphincs/sig_sphincs_shake_256s_simple.c b/src/sig/sphincs/sig_sphincs_shake_256s_simple.c index 3075ba2285..814d70a4a0 100644 --- a/src/sig/sphincs/sig_sphincs_shake_256s_simple.c +++ b/src/sig/sphincs/sig_sphincs_shake_256s_simple.c @@ -23,6 +23,8 @@ OQS_SIG *OQS_SIG_sphincs_shake_256s_simple_new(void) { sig->length_signature = OQS_SIG_sphincs_shake_256s_simple_length_signature; sig->keypair = OQS_SIG_sphincs_shake_256s_simple_keypair; + sig->keypair_from_fseed = OQS_SIG_sphincs_shake_256s_simple_keypair_from_fseed; + sig->pubkey_from_privkey = OQS_SIG_sphincs_shake_256s_simple_pubkey_from_privkey; sig->sign = OQS_SIG_sphincs_shake_256s_simple_sign; sig->verify = OQS_SIG_sphincs_shake_256s_simple_verify; sig->sign_with_ctx_str = OQS_SIG_sphincs_shake_256s_simple_sign_with_ctx_str; @@ -32,11 +34,15 @@ OQS_SIG *OQS_SIG_sphincs_shake_256s_simple_new(void) { } extern int PQCLEAN_SPHINCSSHAKE256SSIMPLE_CLEAN_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHAKE256SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHAKE256SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE256SSIMPLE_CLEAN_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE256SSIMPLE_CLEAN_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #if defined(OQS_ENABLE_SIG_sphincs_shake_256s_simple_avx2) extern int PQCLEAN_SPHINCSSHAKE256SSIMPLE_AVX2_crypto_sign_keypair(uint8_t *pk, uint8_t *sk); +extern int PQCLEAN_SPHINCSSHAKE256SSIMPLE_AVX2_crypto_sign_keypair_from_fseed(uint8_t *pk, uint8_t *sk, const uint8_t *seed); +extern int PQCLEAN_SPHINCSSHAKE256SSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(uint8_t *pk, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE256SSIMPLE_AVX2_crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int PQCLEAN_SPHINCSSHAKE256SSIMPLE_AVX2_crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif @@ -57,6 +63,38 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256s_simple_keypair(uint8_t *public_key #endif } +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256s_simple_keypair_from_fseed(uint8_t *public_key, uint8_t *secret_key, const uint8_t *seed) { +#if defined(OQS_ENABLE_SIG_sphincs_shake_256s_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE256SSIMPLE_AVX2_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE256SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE256SSIMPLE_CLEAN_crypto_sign_keypair_from_fseed(public_key, secret_key, seed); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256s_simple_pubkey_from_privkey(uint8_t *public_key, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_sphincs_shake_256s_simple_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE256SSIMPLE_AVX2_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE256SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) PQCLEAN_SPHINCSSHAKE256SSIMPLE_CLEAN_crypto_sign_pubkey_from_privkey(public_key, secret_key); +#endif +} + OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256s_simple_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { #if defined(OQS_ENABLE_SIG_sphincs_shake_256s_simple_avx2) #if defined(OQS_DIST_BUILD)