blob: 077499bedc865813c754d74d8c41af9ca331149a [file] [log] [blame]
// 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_