| // Copyright 2024 The BoringSSL Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef OPENSSL_HEADER_SLHDSA_H |
| #define OPENSSL_HEADER_SLHDSA_H |
| |
| #include <openssl/base.h> // IWYU pragma: export |
| |
| #if defined(__cplusplus) |
| extern "C" { |
| #endif |
| |
| |
| // SLH-DSA. |
| |
| |
| // SLHDSA_SHA2_128S_PUBLIC_KEY_BYTES is the number of bytes in an |
| // SLH-DSA-SHA2-128s public key. |
| #define SLHDSA_SHA2_128S_PUBLIC_KEY_BYTES 32 |
| |
| // SLHDSA_SHA2_128S_PRIVATE_KEY_BYTES is the number of bytes in an |
| // SLH-DSA-SHA2-128s private key. |
| #define SLHDSA_SHA2_128S_PRIVATE_KEY_BYTES 64 |
| |
| // SLHDSA_SHA2_128S_SIGNATURE_BYTES is the number of bytes in an |
| // SLH-DSA-SHA2-128s signature. |
| #define SLHDSA_SHA2_128S_SIGNATURE_BYTES 7856 |
| |
| // SLHDSA_SHAKE_256F_PUBLIC_KEY_BYTES is the number of bytes in an |
| // SLH-DSA-SHAKE-256f public key. |
| #define SLHDSA_SHAKE_256F_PUBLIC_KEY_BYTES 64 |
| |
| // SLHDSA_SHAKE_256F_PRIVATE_KEY_BYTES is the number of bytes in an |
| // SLH-DSA-SHAKE-256f private key. |
| #define SLHDSA_SHAKE_256F_PRIVATE_KEY_BYTES 128 |
| |
| // SLHDSA_SHAKE_256F_SIGNATURE_BYTES is the number of bytes in an |
| // SLH-DSA-SHAKE-256f signature. |
| #define SLHDSA_SHAKE_256F_SIGNATURE_BYTES 49856 |
| |
| // SLHDSA_SHA2_128S_generate_key generates a SLH-DSA-SHA2-128s key pair and |
| // writes the result to `out_public_key` and `out_private_key`. |
| OPENSSL_EXPORT void SLHDSA_SHA2_128S_generate_key( |
| uint8_t out_public_key[SLHDSA_SHA2_128S_PUBLIC_KEY_BYTES], |
| uint8_t out_private_key[SLHDSA_SHA2_128S_PRIVATE_KEY_BYTES]); |
| |
| // SLHDSA_SHAKE_256F_generate_key generates a SLH-DSA-SHAKE-256f key pair and |
| // writes the result to `out_public_key` and `out_private_key`. |
| OPENSSL_EXPORT void SLHDSA_SHAKE_256F_generate_key( |
| uint8_t out_public_key[SLHDSA_SHAKE_256F_PUBLIC_KEY_BYTES], |
| uint8_t out_private_key[SLHDSA_SHAKE_256F_PRIVATE_KEY_BYTES]); |
| |
| // SLHDSA_SHA2_128S_public_from_private writes the public key corresponding to |
| // `private_key` to `out_public_key`. |
| OPENSSL_EXPORT void SLHDSA_SHA2_128S_public_from_private( |
| uint8_t out_public_key[SLHDSA_SHA2_128S_PUBLIC_KEY_BYTES], |
| const uint8_t private_key[SLHDSA_SHA2_128S_PRIVATE_KEY_BYTES]); |
| |
| // SLHDSA_SHAKE_256F_public_from_private writes the public key corresponding to |
| // `private_key` to `out_public_key`. |
| OPENSSL_EXPORT void SLHDSA_SHAKE_256F_public_from_private( |
| uint8_t out_public_key[SLHDSA_SHAKE_256F_PUBLIC_KEY_BYTES], |
| const uint8_t private_key[SLHDSA_SHAKE_256F_PRIVATE_KEY_BYTES]); |
| |
| // SLHDSA_SHA2_128S_sign slowly generates a SLH-DSA-SHA2-128s signature of `msg` |
| // using `private_key` and writes it to `out_signature`. The `context` argument |
| // is also signed over and can be used to include implicit contextual |
| // information that isn't included in `msg`. The same value of `context` must be |
| // presented to `SLHDSA_SHA2_128S_verify` in order for the generated signature |
| // to be considered valid. `context` and `context_len` may be `NULL` and 0 to |
| // use an empty context (this is common). It returns 1 on success and 0 if |
| // `context_len` is larger than 255. |
| OPENSSL_EXPORT int SLHDSA_SHA2_128S_sign( |
| uint8_t out_signature[SLHDSA_SHA2_128S_SIGNATURE_BYTES], |
| const uint8_t private_key[SLHDSA_SHA2_128S_PRIVATE_KEY_BYTES], |
| const uint8_t *msg, size_t msg_len, const uint8_t *context, |
| size_t context_len); |
| |
| // SLHDSA_SHAKE_256F_sign slowly generates a SLH-DSA-SHAKE-256f signature of |
| // `msg` using `private_key` and writes it to `out_signature`. The `context` |
| // argument is also signed over and can be used to include implicit contextual |
| // information that isn't included in `msg`. The same value of `context` must be |
| // presented to `SLHDSA_SHAKE_256F_verify` in order for the generated signature |
| // to be considered valid. `context` and `context_len` may be `NULL` and 0 to |
| // use an empty context (this is common). It returns 1 on success and 0 if |
| // `context_len` is larger than 255. |
| OPENSSL_EXPORT int SLHDSA_SHAKE_256F_sign( |
| uint8_t out_signature[SLHDSA_SHAKE_256F_SIGNATURE_BYTES], |
| const uint8_t private_key[SLHDSA_SHAKE_256F_PRIVATE_KEY_BYTES], |
| const uint8_t *msg, size_t msg_len, const uint8_t *context, |
| size_t context_len); |
| |
| // SLHDSA_SHA2_128S_verify verifies that `signature` is a valid |
| // SLH-DSA-SHA2-128s signature of `msg` by `public_key`. The value of `context` |
| // must equal the value that was passed to `SLHDSA_SHA2_128S_sign` when the |
| // signature was generated. It returns 1 if the signature is valid and 0 |
| // otherwise. |
| OPENSSL_EXPORT int SLHDSA_SHA2_128S_verify( |
| const uint8_t *signature, size_t signature_len, |
| const uint8_t public_key[SLHDSA_SHA2_128S_PUBLIC_KEY_BYTES], |
| const uint8_t *msg, size_t msg_len, const uint8_t *context, |
| size_t context_len); |
| |
| // SLHDSA_SHAKE_256F_verify verifies that `signature` is a valid |
| // SLH-DSA-SHAKE-256f signature of `msg` by `public_key`. The value of `context` |
| // must equal the value that was passed to `SLHDSA_SHAKE_256F_sign` when the |
| // signature was generated. It returns 1 if the signature is valid and 0 |
| // otherwise. |
| OPENSSL_EXPORT int SLHDSA_SHAKE_256F_verify( |
| const uint8_t *signature, size_t signature_len, |
| const uint8_t public_key[SLHDSA_SHAKE_256F_PUBLIC_KEY_BYTES], |
| const uint8_t *msg, size_t msg_len, const uint8_t *context, |
| size_t context_len); |
| |
| |
| // Prehashed SLH-DSA-SHA2-128s. |
| // |
| // These functions sign the hash of a message. They should generally not be |
| // used. The general functions are perfectly capable of signing a hash if you |
| // wish. These functions should only be used when: |
| // |
| // a) Compatibility with an external system that uses prehashed messages is |
| // required. (The general signature of a hash is not compatible with a |
| // "prehash" signature of the same hash.) |
| // b) A single private key is used to sign both prehashed and raw messages, |
| // and there's no other way to prevent ambiguity. |
| |
| // SLHDSA_SHA2_128S_prehash_sign slowly generates a SLH-DSA-SHA2-128s signature |
| // of the prehashed `hashed_msg` using `private_key` and writes it to |
| // `out_signature`. The `context` argument is also signed over and can be used |
| // to include implicit contextual information that isn't included in |
| // `hashed_msg`. The same value of `context` must be presented to |
| // `SLHDSA_SHA2_128S_prehash_verify` in order for the generated signature to be |
| // considered valid. `context` and `context_len` may be `NULL` and 0 to use an |
| // empty context (this is common). |
| // |
| // The `hash_nid` argument must specify the hash function that was used to |
| // generate `hashed_msg`. This function only accepts hash functions listed in |
| // FIPS 205. |
| // |
| // This function returns 1 on success and 0 if `context_len` is larger than 255, |
| // if the hash function is not supported, or if `hashed_msg` is the wrong |
| // length. |
| OPENSSL_EXPORT int SLHDSA_SHA2_128S_prehash_sign( |
| uint8_t out_signature[SLHDSA_SHA2_128S_SIGNATURE_BYTES], |
| const uint8_t private_key[SLHDSA_SHA2_128S_PRIVATE_KEY_BYTES], |
| const uint8_t *hashed_msg, size_t hashed_msg_len, int hash_nid, |
| const uint8_t *context, size_t context_len); |
| |
| // SLHDSA_SHA2_128S_prehash_verify verifies that `signature` is a valid |
| // SLH-DSA-SHA2-128s signature of the prehashed `hashed_msg` by `public_key`, |
| // using the hash algorithm identified by `hash_nid`. The value of `context` |
| // must equal the value that was passed to `SLHDSA_SHA2_128S_prehash_sign` when |
| // the signature was generated. |
| // |
| // The `hash_nid` argument must specify the hash function that was used to |
| // generate `hashed_msg`. This function only accepts hash functions that are |
| // listed in FIPS 205. |
| // |
| // This function returns 1 if the signature is valid and 0 if the signature is |
| // invalid, the hash function is not supported, or if `hashed_msg` is the wrong |
| // length. |
| OPENSSL_EXPORT int SLHDSA_SHA2_128S_prehash_verify( |
| const uint8_t *signature, size_t signature_len, |
| const uint8_t public_key[SLHDSA_SHA2_128S_PUBLIC_KEY_BYTES], |
| const uint8_t *hashed_msg, size_t hashed_msg_len, int hash_nid, |
| const uint8_t *context, size_t context_len); |
| |
| // SLHDSA_SHA2_128S_prehash_warning_nonstandard_sign slowly generates a |
| // SLH-DSA-SHA2-128s signature of the prehashed `hashed_msg` using `private_key` |
| // and writes it to `out_signature`. The `context` argument is also signed over |
| // and can be used to include implicit contextual information that isn't |
| // included in `hashed_msg`. The same value of `context` must be presented to |
| // `SLHDSA_SHA2_128S_prehash_warning_nonstandard_verify` in order for the |
| // generated signature to be considered valid. `context` and `context_len` may |
| // be `NULL` and 0 to use an empty context (this is common). |
| // |
| // The `hash_nid` argument must specify the hash function that was used to |
| // generate `hashed_msg`. This function only accepts non-standard hash functions |
| // that are not compliant with FIPS 205. |
| // |
| // This function returns 1 on success and 0 if `context_len` is larger than 255, |
| // if the hash function is not supported, or if `hashed_msg` is the wrong |
| // length. |
| OPENSSL_EXPORT int SLHDSA_SHA2_128S_prehash_warning_nonstandard_sign( |
| uint8_t out_signature[SLHDSA_SHA2_128S_SIGNATURE_BYTES], |
| const uint8_t private_key[SLHDSA_SHA2_128S_PRIVATE_KEY_BYTES], |
| const uint8_t *hashed_msg, size_t hashed_msg_len, int hash_nid, |
| const uint8_t *context, size_t context_len); |
| |
| // SLHDSA_SHA2_128S_prehash_warning_nonstandard_verify verifies that `signature` |
| // is a valid SLH-DSA-SHA2-128s signature of the prehashed `hashed_msg` by |
| // `public_key`, using the hash algorithm identified by `hash_nid`. The value of |
| // `context` must equal the value that was passed to |
| // `SLHDSA_SHA2_128S_prehash_sign` when the signature was generated. |
| // |
| // The `hash_nid` argument must specify the hash function that was used to |
| // generate `hashed_msg`. This function only accepts non-standard hash functions |
| // that are not compliant with FIPS 205. |
| // |
| // This function returns 1 if the signature is valid and 0 if the signature is |
| // invalid, the hash function is not supported, or if `hashed_msg` is the wrong |
| // length. |
| OPENSSL_EXPORT int SLHDSA_SHA2_128S_prehash_warning_nonstandard_verify( |
| const uint8_t *signature, size_t signature_len, |
| const uint8_t public_key[SLHDSA_SHA2_128S_PUBLIC_KEY_BYTES], |
| const uint8_t *hashed_msg, size_t hashed_msg_len, int hash_nid, |
| const uint8_t *context, size_t context_len); |
| |
| |
| #if defined(__cplusplus) |
| } // extern C |
| #endif |
| |
| #endif // OPENSSL_HEADER_SLHDSA_H |