| // Copyright lowRISC contributors. | |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
| // SPDX-License-Identifier: Apache-2.0 | |
| #ifndef OPENTITAN_SW_DEVICE_LIB_CRYPTO_INCLUDE_ECC_H_ | |
| #define OPENTITAN_SW_DEVICE_LIB_CRYPTO_INCLUDE_ECC_H_ | |
| /** | |
| * @file | |
| * @brief Elliptic curve operations for OpenTitan cryptography library. | |
| * | |
| * Includes ECDSA, ECDH, Ed25519, and X25519. | |
| */ | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif // __cplusplus | |
| /** | |
| * Struct to handle ECDSA or EdDSA signatures. | |
| */ | |
| typedef struct ecc_signature { | |
| // Length of ECC signature R parameter, in bytes. | |
| size_t len_r; | |
| // ECC signature R parameter. | |
| uint32_t *r; | |
| // Length of ECC signature S parameter, in bytes. | |
| size_t len_s; | |
| // ECC signature S parameter. | |
| uint32_t *s; | |
| } ecc_signature_t; | |
| /** | |
| * Enum to define EdDSA mode for signature. | |
| * | |
| * Values are hardened. | |
| */ | |
| typedef enum eddsa_sign_mode { | |
| // Signature mode EdDSA. | |
| kEddsaSignModeEdDSA = 0x4fd1, | |
| // Signature mode Hashed EdDSA. | |
| kEddsaSignModeHashEdDSA = 0x9bed, | |
| } eddsa_sign_mode_t; | |
| /** | |
| * Struct to handle ECDSA or ECDH public key type. | |
| * | |
| * Length of public key coordinates (x,y) follows len(p). | |
| */ | |
| typedef struct ecc_public_key { | |
| // ECC public key x coordinate. | |
| crypto_unblinded_key_t x; | |
| // ECC public key y coordinate. | |
| crypto_unblinded_key_t y; | |
| } ecc_public_key_t; | |
| /** | |
| * Struct for domain parameters of a custom Weierstrass curve. | |
| */ | |
| typedef struct ecc_domain { | |
| // Prime P (modulus of coordinate finite field). | |
| crypto_const_uint8_buf_t p; | |
| // Coefficient a. | |
| crypto_const_uint8_buf_t a; | |
| // Coefficient b. | |
| crypto_const_uint8_buf_t b; | |
| // q (order of G). | |
| crypto_const_uint8_buf_t q; | |
| // Value of x coordinate of G (basepoint). Same length as p. | |
| const uint32_t *gx; | |
| // Value of y coordinate of G (basepoint). Same length as p. | |
| const uint32_t *gy; | |
| // Cofactor of the curve. | |
| const uint32_t cofactor; | |
| // Checksum value of the parameters. | |
| uint32_t checksum; | |
| } ecc_domain_t; | |
| /** | |
| * Enum to define the type of elliptic curve used for the operation. | |
| * | |
| * Values are hardened. | |
| */ | |
| typedef enum ecc_curve_type { | |
| // Generic Weierstrass curve, with custom domain parameters. | |
| kEccCurveTypeCustom = 0xf93c, | |
| // Named Weierstrass curve - NIST P256. | |
| kEccCurveTypeNistP256 = 0xe1e7, | |
| // Named Weierstrass curve - NIST P384. | |
| kEccCurveTypeNistP384 = 0x6a2b, | |
| // Named Weierstrass curve - Brainpool P256r1. | |
| kEccCurveTypeBrainpoolP256R1 = 0x5e96, | |
| } ecc_curve_type_t; | |
| /** | |
| * Struct for ECC curve used for ECDSA / ECDH operation. | |
| * | |
| * Values are hardened. | |
| */ | |
| typedef struct ecc_curve { | |
| // Type of the Weierstrass curve, custom curve or named curve. | |
| ecc_curve_type_t curve_type; | |
| // Domain parameters for a custom Weierstrass curve. | |
| ecc_domain_t domain_parameter; | |
| } ecc_curve_t; | |
| /** | |
| * Performs the key generation for ECDSA operation. | |
| * | |
| * Computes private key (d) and public key (Q) keys for ECDSA operation. | |
| * | |
| * The caller should allocate and partially populate the blinded key struct, | |
| * including populating the key configuration and allocating space for the | |
| * keyblob. The caller should indicate the length of the allocated keyblob; | |
| * this function will return an error if the keyblob length does not match | |
| * expectations. For hardware-backed keys, the keyblob length is 0 and the | |
| * keyblob pointer may be `NULL`. For non-hardware-backed keys, the keyblob | |
| * should be twice the length of the key. The value in the `checksum` field of | |
| * the blinded key struct will be populated by the key generation function. | |
| * | |
| * The `domain_parameter` field of the `elliptic_curve` is required only for a | |
| * custom curve. For named curves this field is ignored and can be set to | |
| * `NULL`. | |
| * | |
| * @param elliptic_curve Pointer to the elliptic curve to be used. | |
| * @param[out] private_key Pointer to the blinded private key (d) struct. | |
| * @param[out] public_key Pointer to the unblinded public key (Q) struct. | |
| * @return Result of the ECDSA key generation. | |
| */ | |
| crypto_status_t otcrypto_ecdsa_keygen(ecc_curve_t *elliptic_curve, | |
| crypto_blinded_key_t *private_key, | |
| ecc_public_key_t *public_key); | |
| /** | |
| * Performs the ECDSA digital signature generation. | |
| * | |
| * The `domain_parameter` field of the `elliptic_curve` is required | |
| * only for a custom curve. For named curves this field is ignored | |
| * and can be set to `NULL`. | |
| * | |
| * @param private_key Pointer to the blinded private key (d) struct. | |
| * @param input_message Input message to be signed. | |
| * @param elliptic_curve Pointer to the elliptic curve to be used. | |
| * @param[out] signature Pointer to the signature struct with (r,s) values. | |
| * @return Result of the ECDSA signature generation. | |
| */ | |
| crypto_status_t otcrypto_ecdsa_sign(const crypto_blinded_key_t *private_key, | |
| crypto_const_uint8_buf_t input_message, | |
| ecc_curve_t *elliptic_curve, | |
| ecc_signature_t *signature); | |
| /** | |
| * Performs the deterministic ECDSA digital signature generation. | |
| * | |
| * In the case of deterministic ECDSA, the random value âkâ for the | |
| * signature generation is deterministically generated from the | |
| * private key and the input message. Refer to RFC6979 for details. | |
| * | |
| * The `domain_parameter` field of the `elliptic_curve` is required | |
| * only for a custom curve. For named curves this field is ignored | |
| * and can be set to `NULL`. | |
| * | |
| * @param private_key Pointer to the blinded private key (d) struct. | |
| * @param input_message Input message to be signed. | |
| * @param elliptic_curve Pointer to the elliptic curve to be used. | |
| * @param[out] signature Pointer to the signature struct with (r,s) values. | |
| * @return Result of the deterministic ECDSA signature. | |
| * generation | |
| */ | |
| crypto_status_t otcrypto_deterministic_ecdsa_sign( | |
| const crypto_blinded_key_t *private_key, | |
| crypto_const_uint8_buf_t input_message, ecc_curve_t *elliptic_curve, | |
| ecc_signature_t *signature); | |
| /** | |
| * Performs the ECDSA digital signature verification. | |
| * | |
| * The `domain_parameter` field of the `elliptic_curve` is required | |
| * only for a custom curve. For named curves this field is ignored | |
| * and can be set to `NULL`. | |
| * | |
| * @param public_key Pointer to the unblinded public key (Q) struct. | |
| * @param input_message Input message to be signed for verification. | |
| * @param signature Pointer to the signature to be verified. | |
| * @param elliptic_curve Pointer to the elliptic curve to be used. | |
| * @param[out] verification_result Result of signature verification | |
| * (Pass/Fail). | |
| * @return Result of the ECDSA verification operation. | |
| */ | |
| crypto_status_t otcrypto_ecdsa_verify( | |
| const ecc_public_key_t *public_key, crypto_const_uint8_buf_t input_message, | |
| ecc_signature_t *signature, ecc_curve_t *elliptic_curve, | |
| verification_status_t *verification_result); | |
| /** | |
| * Performs the key generation for ECDH key agreement. | |
| * | |
| * Computes private key (d) and public key (Q) keys for ECDSA operation. | |
| * | |
| * The `domain_parameter` field of the `elliptic_curve` is required only for a | |
| * custom curve. For named curves this field is ignored and can be set to | |
| * `NULL`. | |
| * | |
| * The caller should allocate and partially populate the blinded key struct, | |
| * including populating the key configuration and allocating space for the | |
| * keyblob. The caller should indicate the length of the allocated keyblob; | |
| * this function will return an error if the keyblob length does not match | |
| * expectations. For hardware-backed keys, the keyblob length is 0 and the | |
| * keyblob pointer may be `NULL`. For non-hardware-backed keys, the keyblob | |
| * should be twice the length of the key. The value in the `checksum` field of | |
| * the blinded key struct will be populated by the key generation function. | |
| * | |
| * @param elliptic_curve Pointer to the elliptic curve to be used. | |
| * @param[out] private_key Pointer to the blinded private key (d) struct. | |
| * @param[out] public_key Pointer to the unblinded public key (Q) struct. | |
| * @return Result of the ECDH key generation. | |
| */ | |
| crypto_status_t otcrypto_ecdh_keygen(ecc_curve_t *elliptic_curve, | |
| crypto_blinded_key_t *private_key, | |
| ecc_public_key_t *public_key); | |
| /** | |
| * Performs Elliptic Curve Diffie Hellman shared secret generation. | |
| * | |
| * The `domain_parameter` field of the `elliptic_curve` is required | |
| * only for a custom curve. For named curves this field is ignored | |
| * and can be set to `NULL`. | |
| * | |
| * @param private_key Pointer to the blinded private key (d) struct. | |
| * @param public_key Pointer to the unblinded public key (Q) struct. | |
| * @param elliptic_curve Pointer to the elliptic curve to be used. | |
| * @param[out] shared_secret Pointer to generated blinded shared key struct. | |
| * @return Result of ECDH shared secret generation. | |
| */ | |
| crypto_status_t otcrypto_ecdh(const crypto_blinded_key_t *private_key, | |
| const ecc_public_key_t *public_key, | |
| ecc_curve_t *elliptic_curve, | |
| crypto_blinded_key_t *shared_secret); | |
| /** | |
| * Generates a new Ed25519 key pair. | |
| * | |
| * Computes the private exponent (d) and public key (Q) based on | |
| * Curve25519. | |
| * | |
| * No `domain_parameter` is needed and is automatically set for Ed25519. | |
| * | |
| * The caller should allocate and partially populate the blinded key struct, | |
| * including populating the key configuration and allocating space for the | |
| * keyblob. The caller should indicate the length of the allocated keyblob; | |
| * this function will return an error if the keyblob length does not match | |
| * expectations. For hardware-backed keys, the keyblob length is 0 and the | |
| * keyblob pointer may be `NULL`. For non-hardware-backed keys, the keyblob | |
| * should be twice the length of the key. The value in the `checksum` field of | |
| * the blinded key struct will be populated by the key generation function. | |
| * | |
| * @param[out] private_key Pointer to the blinded private key struct. | |
| * @param[out] public_key Pointer to the unblinded public key struct. | |
| * @return Result of the Ed25519 key generation. | |
| */ | |
| crypto_status_t otcrypto_ed25519_keygen(crypto_blinded_key_t *private_key, | |
| crypto_unblinded_key_t *public_key); | |
| /** | |
| * Generates an Ed25519 digital signature. | |
| * | |
| * @param private_key Pointer to the blinded private key struct. | |
| * @param input_message Input message to be signed. | |
| * @param sign_mode Parameter for EdDSA or Hash EdDSA sign mode. | |
| * @param[out] signature Pointer to the EdDSA signature with (r,s) values. | |
| * @return Result of the EdDSA signature generation. | |
| */ | |
| crypto_status_t otcrypto_ed25519_sign(const crypto_blinded_key_t *private_key, | |
| crypto_const_uint8_buf_t input_message, | |
| eddsa_sign_mode_t sign_mode, | |
| ecc_signature_t *signature); | |
| /** | |
| * Verifies an Ed25519 signature. | |
| * | |
| * @param public_key Pointer to the unblinded public key struct. | |
| * @param input_message Input message to be signed for verification. | |
| * @param sign_mode Parameter for EdDSA or Hash EdDSA sign mode. | |
| * @param signature Pointer to the signature to be verified. | |
| * @param[out] verification_result Result of signature verification | |
| * (Pass/Fail). | |
| * @return Result of the EdDSA verification operation. | |
| */ | |
| crypto_status_t otcrypto_ed25519_verify( | |
| const crypto_unblinded_key_t *public_key, | |
| crypto_const_uint8_buf_t input_message, eddsa_sign_mode_t sign_mode, | |
| ecc_signature_t *signature, verification_status_t *verification_result); | |
| /** | |
| * Generates a new key pair for X25519 key exchange. | |
| * | |
| * Computes the private scalar (d) and public key (Q) based on | |
| * Curve25519. | |
| * | |
| * No `domain_parameter` is needed and is automatically set for X25519. | |
| * | |
| * The caller should allocate and partially populate the blinded key struct, | |
| * including populating the key configuration and allocating space for the | |
| * keyblob. The caller should indicate the length of the allocated keyblob; | |
| * this function will return an error if the keyblob length does not match | |
| * expectations. For hardware-backed keys, the keyblob length is 0 and the | |
| * keyblob pointer may be `NULL`. For non-hardware-backed keys, the keyblob | |
| * should be twice the length of the key. The value in the `checksum` field of | |
| * the blinded key struct will be populated by the key generation function. | |
| * | |
| * @param[out] private_key Pointer to the blinded private key struct. | |
| * @param[out] public_key Pointer to the unblinded public key struct. | |
| * @return Result of the X25519 key generation. | |
| */ | |
| crypto_status_t otcrypto_x25519_keygen(crypto_blinded_key_t *private_key, | |
| crypto_unblinded_key_t *public_key); | |
| /** | |
| * Performs the X25519 Diffie Hellman shared secret generation. | |
| * | |
| * @param private_key Pointer to blinded private key (u-coordinate). | |
| * @param public_key Pointer to the public scalar from the sender. | |
| * @param[out] shared_secret Pointer to shared secret key (u-coordinate). | |
| * @return Result of the X25519 operation. | |
| */ | |
| crypto_status_t otcrypto_x25519(const crypto_blinded_key_t *private_key, | |
| const crypto_unblinded_key_t *public_key, | |
| crypto_blinded_key_t *shared_secret); | |
| /** | |
| * Starts the asynchronous key generation for ECDSA operation. | |
| * | |
| * Initializes OTBN and starts the OTBN routine to compute the private | |
| * key (d) and public key (Q) for ECDSA operation. | |
| * | |
| * The `domain_parameter` field of the `elliptic_curve` is required | |
| * only for a custom curve. For named curves this field is ignored | |
| * and can be set to `NULL`. | |
| * | |
| * Returns `kCryptoStatusOK` if the operation was successfully | |
| * started, or`kCryptoStatusInternalError` if the operation cannot be | |
| * started. | |
| * | |
| * @param elliptic_curve Pointer to the elliptic curve to be used. | |
| * @return Result of asynchronous ECDSA keygen start operation. | |
| */ | |
| crypto_status_t otcrypto_ecdsa_keygen_async_start(ecc_curve_t *elliptic_curve); | |
| /** | |
| * Finalizes the asynchronous key generation for ECDSA operation. | |
| * | |
| * Returns `kCryptoStatusOK` and copies the private key (d) and public | |
| * key (Q), if the OTBN status is done, or | |
| * `kCryptoStatusAsyncIncomplete` if the OTBN is busy or | |
| * `kCryptoStatusInternalError` if there is an error. | |
| * | |
| * @param[out] private_key Pointer to the blinded private key (d) struct. | |
| * @param[out] public_key Pointer to the unblinded public key (Q) struct. | |
| * @return Result of asynchronous ECDSA keygen finalize operation. | |
| */ | |
| crypto_status_t otcrypto_ecdsa_keygen_async_finalize( | |
| crypto_blinded_key_t *private_key, ecc_public_key_t *public_key); | |
| /** | |
| * Starts the asynchronous ECDSA digital signature generation. | |
| * | |
| * Initializes OTBN and starts the OTBN routine to compute the digital | |
| * signature on the input message. The `domain_parameter` field of the | |
| * `elliptic_curve` is required only for a custom curve. For named | |
| * curves this field is ignored and can be set to `NULL`. | |
| * | |
| * @param private_key Pointer to the blinded private key (d) struct. | |
| * @param input_message Input message to be signed. | |
| * @param elliptic_curve Pointer to the elliptic curve to be used. | |
| * @return Result of async ECDSA start operation. | |
| */ | |
| crypto_status_t otcrypto_ecdsa_sign_async_start( | |
| const crypto_blinded_key_t *private_key, | |
| crypto_const_uint8_buf_t input_message, ecc_curve_t *elliptic_curve); | |
| /** | |
| * Finalizes the asynchronous ECDSA digital signature generation. | |
| * | |
| * Returns `kCryptoStatusOK` and copies the signature if the OTBN | |
| * status is done, or `kCryptoStatusAsyncIncomplete` if the OTBN is | |
| * busy or `kCryptoStatusInternalError` if there is an error. | |
| * | |
| * @param[out] signature Pointer to the signature struct with (r,s) values. | |
| * @return Result of async ECDSA finalize operation. | |
| */ | |
| crypto_status_t otcrypto_ecdsa_sign_async_finalize(ecc_signature_t *signature); | |
| /** | |
| * Starts the asynchronous deterministic ECDSA digital signature generation. | |
| * | |
| * Initializes OTBN and starts the OTBN routine to compute the digital | |
| * signature on the input message. The `domain_parameter` field of the | |
| * `elliptic_curve` is required only for a custom curve. For named | |
| * curves this field is ignored and can be set to `NULL`. | |
| * | |
| * @param private_key Pointer to the blinded private key (d) struct. | |
| * @param input_message Input message to be signed. | |
| * @param elliptic_curve Pointer to the elliptic curve to be used. | |
| * @return Result of async ECDSA start operation. | |
| */ | |
| crypto_status_t otcrypto_deterministic_ecdsa_sign_async_start( | |
| const crypto_blinded_key_t *private_key, | |
| crypto_const_uint8_buf_t input_message, ecc_curve_t *elliptic_curve); | |
| /** | |
| * Finalizes the asynchronous deterministic ECDSA digital signature generation. | |
| * | |
| * In the case of deterministic ECDSA, the random value âkâ for the | |
| * signature generation is deterministically generated from the | |
| * private key and the input message. Refer to RFC6979 for details. | |
| * | |
| * Returns `kCryptoStatusOK` and copies the signature if the OTBN | |
| * status is done, or `kCryptoStatusAsyncIncomplete` if the OTBN is | |
| * busy or `kCryptoStatusInternalError` if there is an error. | |
| * | |
| * @param[out] signature Pointer to the signature struct with (r,s) values. | |
| * @return Result of async deterministic ECDSA finalize operation. | |
| */ | |
| crypto_status_t otcrypto_ecdsa_deterministic_sign_async_finalize( | |
| ecc_signature_t *signature); | |
| /** | |
| * Starts the asynchronous ECDSA digital signature verification. | |
| * | |
| * Initializes OTBN and starts the OTBN routine to recover ârâ value | |
| * from the input signature âsâ value. The `domain_parameter` field of | |
| * `elliptic_curve` is required only for a custom curve. For named | |
| * curves this field is ignored and can be set to `NULL`. | |
| * | |
| * @param public_key Pointer to the unblinded public key (Q) struct. | |
| * @param input_message Input message to be signed for verification. | |
| * @param signature Pointer to the signature to be verified. | |
| * @param elliptic_curve Pointer to the elliptic curve to be used. | |
| * @return Result of async ECDSA verify start function. | |
| */ | |
| crypto_status_t otcrypto_ecdsa_verify_async_start( | |
| const ecc_public_key_t *public_key, crypto_const_uint8_buf_t input_message, | |
| ecc_signature_t *signature, ecc_curve_t *elliptic_curve); | |
| /** | |
| * Finalizes the asynchronous ECDSA digital signature verification. | |
| * | |
| * Returns `kCryptoStatusOK` and populates the `verification result` | |
| * if the OTBN status is done. `kCryptoStatusAsyncIncomplete` if the | |
| * OTBN is busy or `kCryptoStatusInternalError` if there is an error. | |
| * The computed signature is compared against the input signature | |
| * and a PASS or FAIL is returned. | |
| * | |
| * @param[out] verification_result Result of signature verification | |
| * (Pass/Fail). | |
| * @return Result of async ECDSA verify finalize operation. | |
| */ | |
| crypto_status_t otcrypto_ecdsa_verify_async_finalize( | |
| verification_status_t *verification_result); | |
| /** | |
| * Starts the asynchronous key generation for ECDH operation. | |
| * | |
| * Initializes OTBN and starts the OTBN routine to compute the private | |
| * key (d) and public key (Q) for ECDH operation. | |
| * | |
| * The `domain_parameter` field of the `elliptic_curve` is required | |
| * only for a custom curve. For named curves this field is ignored | |
| * and can be set to `NULL`. | |
| * | |
| * Returns `kCryptoStatusOK` if the operation was successfully | |
| * started, or`kCryptoStatusInternalError` if the operation cannot be | |
| * started. | |
| * | |
| * @param elliptic_curve Pointer to the elliptic curve to be used. | |
| * @return Result of asynchronous ECDH keygen start operation. | |
| */ | |
| crypto_status_t otcrypto_ecdh_keygen_async_start(ecc_curve_t *elliptic_curve); | |
| /** | |
| * Finalizes the asynchronous key generation for ECDSA operation. | |
| * | |
| * Returns `kCryptoStatusOK` and copies the private key (d) and public | |
| * key (Q), if the OTBN status is done, or | |
| * `kCryptoStatusAsyncIncomplete` if the OTBN is busy or | |
| * `kCryptoStatusInternalError` if there is an error. | |
| * | |
| * @param[out] private_key Pointer to the blinded private key (d) struct. | |
| * @param[out] public_key Pointer to the unblinded public key (Q) struct. | |
| * @return Result of asynchronous ECDH keygen finalize operation. | |
| */ | |
| crypto_status_t otcrypto_ecdh_keygen_async_finalize( | |
| crypto_blinded_key_t *private_key, ecc_public_key_t *public_key); | |
| /** | |
| * Starts the asynchronous Elliptic Curve Diffie Hellman shared | |
| * secret generation. | |
| * | |
| * The `domain_parameter` field of the `elliptic_curve` is required | |
| * only for a custom curve. For named curves this field is ignored | |
| * and can be set to `NULL`. | |
| * | |
| * @param private_key Pointer to the blinded private key (d) struct. | |
| * @param public_key Pointer to the unblinded public key (Q) struct. | |
| * @param elliptic_curve Pointer to the elliptic curve to be used. | |
| * @return Result of async ECDH start operation. | |
| */ | |
| crypto_status_t otcrypto_ecdh_async_start( | |
| const crypto_blinded_key_t *private_key, const ecc_public_key_t *public_key, | |
| ecc_curve_t *elliptic_curve); | |
| /** | |
| * Finalizes the asynchronous Elliptic Curve Diffie Hellman shared | |
| * secret generation. | |
| * | |
| * Returns `kCryptoStatusOK` and copies `shared_secret` if the OTBN | |
| * status is done, or `kCryptoStatusAsyncIncomplete` if the OTBN | |
| * is busy or `kCryptoStatusInternalError` if there is an error. | |
| * | |
| * @param[out] shared_secret Pointer to generated blinded shared key struct. | |
| * @return Result of async ECDH finalize operation. | |
| */ | |
| crypto_status_t otcrypto_ecdh_async_finalize( | |
| crypto_blinded_key_t *shared_secret); | |
| /** | |
| * Starts the asynchronous key generation for Ed25519. | |
| * | |
| * Initializes OTBN and starts the OTBN routine to compute the private | |
| * exponent (d) and public key (Q) based on Curve25519. | |
| * | |
| * No `domain_parameter` is needed and is automatically set for X25519. | |
| * | |
| * @return Result of asynchronous ed25519 keygen start operation. | |
| */ | |
| crypto_status_t otcrypto_ed25519_keygen_async_start(); | |
| /** | |
| * Finalizes the asynchronous key generation for Ed25519. | |
| * | |
| * Returns `kCryptoStatusOK` and copies private key (d) and public key | |
| * (Q), if the OTBN status is done, or `kCryptoStatusAsyncIncomplete` | |
| * if the OTBN is busy or `kCryptoStatusInternalError` if there is an | |
| * error. | |
| * | |
| * @param[out] private_key Pointer to the blinded private key struct. | |
| * @param[out] public_key Pointer to the unblinded public key struct. | |
| * @return Result of asynchronous ed25519 keygen finalize operation. | |
| */ | |
| crypto_status_t otcrypto_ed25519_keygen_async_finalize( | |
| crypto_blinded_key_t *private_key, crypto_unblinded_key_t *public_key); | |
| /** | |
| * Starts the asynchronous Ed25519 digital signature generation. | |
| * | |
| * Initializes OTBN and starts the OTBN routine to compute the digital | |
| * signature on the input message. The `domain_parameter` field for | |
| * Ed25519 is automatically set. | |
| * | |
| * @param private_key Pointer to the blinded private key struct. | |
| * @param input_message Input message to be signed. | |
| * @param sign_mode Parameter for EdDSA or Hash EdDSA sign mode. | |
| * @param[out] signature Pointer to the EdDSA signature to get (r) value. | |
| * @return Result of async Ed25519 start operation. | |
| */ | |
| crypto_status_t otcrypto_ed25519_sign_async_start( | |
| const crypto_blinded_key_t *private_key, | |
| crypto_const_uint8_buf_t input_message, eddsa_sign_mode_t sign_mode, | |
| ecc_signature_t *signature); | |
| /** | |
| * Finalizes the asynchronous Ed25519 digital signature generation. | |
| * | |
| * Returns `kCryptoStatusOK` and copies the signature if the OTBN | |
| * status is done, or `kCryptoStatusAsyncIncomplete` if the OTBN is | |
| * busy or `kCryptoStatusInternalError` if there is an error. | |
| * | |
| * @param[out] signature Pointer to the EdDSA signature to get (s) value. | |
| * @return Result of async Ed25519 finalize operation. | |
| */ | |
| crypto_status_t otcrypto_ed25519_sign_async_finalize( | |
| ecc_signature_t *signature); | |
| /** | |
| * Starts the asynchronous Ed25519 digital signature verification. | |
| * | |
| * Initializes OTBN and starts the OTBN routine to verify the | |
| * signature. The `domain_parameter` for Ed25519 is set automatically. | |
| * | |
| * @param public_key Pointer to the unblinded public key struct. | |
| * @param input_message Input message to be signed for verification. | |
| * @param sign_mode Parameter for EdDSA or Hash EdDSA sign mode. | |
| * @param signature Pointer to the signature to be verified. | |
| * @return Result of async Ed25519 verification start operation. | |
| */ | |
| crypto_status_t otcrypto_ed25519_verify_async_start( | |
| const crypto_unblinded_key_t *public_key, | |
| crypto_const_uint8_buf_t input_message, eddsa_sign_mode_t sign_mode, | |
| ecc_signature_t *signature); | |
| /** | |
| * Finalizes the asynchronous Ed25519 digital signature verification. | |
| * | |
| * Returns `kCryptoStatusOK` and populates the `verification result` | |
| * with a PASS or FAIL, if the OTBN status is done, | |
| * `kCryptoStatusAsyncIncomplete` if the OTBN is busy or | |
| * `kCryptoStatusInternalError` if there is an error. | |
| * | |
| * @param[out] verification_result Result of signature verification | |
| * (Pass/Fail). | |
| * @return Result of async Ed25519 verification finalize operation. | |
| */ | |
| crypto_status_t otcrypto_ed25519_verify_async_finalize( | |
| verification_status_t *verification_result); | |
| /** | |
| * Starts the asynchronous key generation for X25519. | |
| * | |
| * Initializes OTBN and starts the OTBN routine to compute the private | |
| * exponent (d) and public key (Q) based on Curve25519. | |
| * | |
| * No `domain_parameter` is needed and is automatically set for X25519. | |
| * | |
| * @return Result of asynchronous X25519 keygen start operation. | |
| */ | |
| crypto_status_t otcrypto_x25519_keygen_async_start(); | |
| /** | |
| * Finalizes the asynchronous key generation for X25519. | |
| * | |
| * Returns `kCryptoStatusOK` and copies private key (d) and public key | |
| * (Q), if the OTBN status is done, or `kCryptoStatusAsyncIncomplete` | |
| * if the OTBN is busy or `kCryptoStatusInternalError` if there is an | |
| * error. | |
| * | |
| * @param[out] private_key Pointer to the blinded private key struct. | |
| * @param[out] public_key Pointer to the unblinded public key struct. | |
| * @return Result of asynchronous X25519 keygen finalize operation. | |
| */ | |
| crypto_status_t otcrypto_x25519_keygen_async_finalize( | |
| crypto_blinded_key_t *private_key, crypto_unblinded_key_t *public_key); | |
| /** | |
| * Starts the asynchronous X25519 Diffie Hellman shared secret | |
| * generation. | |
| * | |
| * Initializes OTBN and starts the OTBN routine to perform Diffie | |
| * Hellman shared secret generation based on Curve25519. The | |
| * domain parameter is automatically set for X25519 API. | |
| * | |
| * @param private_key Pointer to the blinded private key (u-coordinate). | |
| * @param public_key Pointer to the public scalar from the sender. | |
| * @return Result of the async X25519 start operation. | |
| */ | |
| crypto_status_t otcrypto_x25519_async_start( | |
| const crypto_blinded_key_t *private_key, | |
| const crypto_unblinded_key_t *public_key); | |
| /** | |
| * Finalizes the asynchronous X25519 Diffie Hellman shared secret | |
| * generation. | |
| * | |
| * Returns `kCryptoStatusOK` and copies `shared_secret` if the OTBN | |
| * status is done, or `kCryptoStatusAsyncIncomplete` if the OTBN | |
| * is busy or `kCryptoStatusInternalError` if there is an error. | |
| * | |
| * @param[out] shared_secret Pointer to shared secret key (u-coordinate). | |
| * @return Result of async X25519 finalize operation. | |
| */ | |
| crypto_status_t otcrypto_x25519_async_finalize( | |
| crypto_blinded_key_t *shared_secret); | |
| #ifdef __cplusplus | |
| } // extern "C" | |
| #endif // __cplusplus | |
| #endif // OPENTITAN_SW_DEVICE_LIB_CRYPTO_INCLUDE_ECC_H_ |