| // 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_API_H_ |
| #define OPENTITAN_SW_DEVICE_LIB_CRYPTO_API_H_ |
| |
| /** |
| * @brief OS-facing API for the OpenTitan cryptography library. |
| * |
| * NOTE: This API is a work in progress, and the code here only records the |
| * current state. It will continue to change until the API design is finalized. |
| */ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif // __cplusplus |
| |
| /** |
| * Enum to handle return values of the crypto API. |
| * |
| * Values are hardened. |
| */ |
| typedef enum crypto_status { |
| // Status is OK; no errors. |
| kCryptoStatusOK = 0x7d3a, |
| // Invalid input arguments; Wrong length or invalid type. |
| kCryptoIncorrectInput = 0x6b7f, |
| // Inconsistencies when cross-checking results, witness, checksums. |
| kCryptoStatusInternalError = 0x4753, |
| // An asynchronous operation is still in progress. |
| kCryptoStatusAsyncIncomplete = 0xe2b7, |
| } crypto_status_t; |
| |
| /** |
| * Enum to handle return values of the verification APIs. |
| * |
| * Values are hardened. |
| */ |
| typedef enum verification_status { |
| // Return value for successful verification. |
| kVerificationStatusPass = 0x2c89, |
| // Return value for unsuccessful verification. |
| kVerificationStatusFail = 0x49d3, |
| } verification_status_t; |
| |
| /** |
| * Enum for opentitan crypto modes using a key. |
| * |
| * Used to denote crypto mode for which key usage is intended. Values are |
| * hardened. |
| */ |
| typedef enum key_mode { |
| // AES ECB mode. |
| kKeyModeAesEcb = 0x0101, |
| // AES CBC mode. |
| kKeyModeAesCbc = 0x0102, |
| // AES CFB mode. |
| kKeyModeAesCfb = 0x0103, |
| // AES OFB mode. |
| kKeyModeAesOfb = 0x0104, |
| // AES CTR mode. |
| kKeyModeAesCtr = 0x0105, |
| // AES GCM mode. |
| kKeyModeAesGcm = 0x0106, |
| // AES KWP mode. |
| kKeyModeAesKwp = 0x0107, |
| // HMAC-SHA-256. |
| kKeyModeHmacSha256 = 0x0201, |
| // KMAC-256. |
| kKeyModeKmac256 = 0x0202, |
| // RSA key generation. |
| kKeyModeRsaKeygen = 0x0301, |
| // RSA digital signature. |
| kKeyModeRsaSign = 0x0302, |
| // Elliptic curve key generation. |
| kKeyModeEccKeygen = 0x0401, |
| // Elliptic curve digital signature. |
| kKeyModeEccSign = 0x0402, |
| // Elliptic curve Diffie–Hellman key exchange. |
| kKeyModeEccEcdh = 0x0403, |
| } key_mode_t; |
| |
| /** |
| * Type of blinded keys. |
| * |
| * This type is not exposed in the API because it should not be used directly. |
| */ |
| typedef struct crypto_blinded_key crypto_blinded_key_t; |
| |
| /** |
| * Struct to handle unmasked key type. |
| */ |
| typedef struct crypto_unblinded_key { |
| // Mode for which the key usage is intended. |
| key_mode_t key_mode; |
| // Key length. |
| uint16_t key_length; |
| // Implementation specific, storage provided by caller. |
| uint32_t *key; |
| // Checksum for this struct. |
| uint32_t checksum; |
| } crypto_unblinded_key_t; |
| |
| /** |
| * Enum to define AES mode of operation. |
| */ |
| typedef enum block_cipher_mode { |
| // AES ECB mode (electronic codebook mode). |
| kBlockCipherModeEcb = 0, |
| // AES CBC mode (cipher block chaining mode). |
| kBlockCipherModeCbc = 1, |
| // AES CFB mode (cipher feedback mode). |
| kBlockCipherModeCfb = 2, |
| // AES OFB mode (output feedback mode). |
| kBlockCipherModeOfb = 3, |
| // AES CTR mode (counter mode). |
| kBlockCipherModeCtr = 4, |
| } block_cipher_mode_t; |
| |
| /** |
| * Enum to define AES operation to be performed. |
| */ |
| typedef enum aes_operation { |
| // AES operation mode encrypt. |
| kAesOperationEncrypt = 0, |
| // AES operation mode decrypt. |
| kAesOperationDecrypt = 1, |
| } aes_operation_t; |
| |
| /** |
| * Enum to define padding scheme for AES data. |
| */ |
| typedef enum aes_padding { |
| // Pads with value same as the number of padding bytes. |
| kAesPaddingPkcs7 = 0, |
| // Pads with 0x80 (10000000), followed by zero bytes. |
| kAesPaddingIso9797M2 = 1, |
| // Pads with 0x00 bytes. |
| kAesPaddingIso9797M1 = 2, |
| // Pads with random bytes, last byte is no. of padded bytes. |
| kAesPaddingRandom = 3, |
| // Pads with 0x00 bytes, last byte is no. of padded bytes. |
| kAesPaddingX923 = 4, |
| // Add no padding. |
| kAesPaddingNull = 5, |
| } aes_padding_t; |
| |
| /** |
| * Enum to define hashing mode. |
| */ |
| typedef enum hash_mode { |
| // SHA2-256 mode. |
| kHashModeSha256 = 0, |
| // SHA2-384 mode. |
| kHashModeSha384 = 1, |
| // SHA2-512 mode. |
| kHashModeSha512 = 2, |
| // SHA3-224 mode. |
| kHashModeSha3_224 = 3, |
| // SHA3-256 mode. |
| kHashModeSha3_256 = 4, |
| // SHA3-384 mode. |
| kHashModeSha3_384 = 5, |
| // SHA3-512 mode. |
| kHashModeSha3_512 = 6, |
| // SHA3-Shake128 mode. |
| kHashModeSha3Shake128 = 7, |
| // SHA3-Shake256 mode. |
| kHashModeSha3Shake256 = 8, |
| // SHA3-cShake128 mode. |
| kHashModeSha3Cshake128 = 9, |
| // SHA3-cShake256 mode. |
| kHashModeSha3Cshake256 = 10, |
| } hash_mode_t; |
| |
| /** |
| * Enum to define MAC mode. |
| */ |
| typedef enum mac_mode { |
| // HMAC-SHA2-256 mode. |
| kMacModeHmacSha256 = 0, |
| // KMAC-128 mode. |
| kMacModeKmac128 = 1, |
| // KMAC-256 mode. |
| kMacModeKmac256 = 2, |
| } mac_mode_t; |
| |
| /** |
| * Enum to define padding scheme for RSA data. |
| */ |
| typedef enum rsa_padding { |
| // Pads input data according to the PKCS#1-OAEP scheme. |
| kRsaPaddingOaep = 0, |
| // Pads input data according to the PKCS#1 (v1.5) scheme. |
| kRsaPaddingPkcs = 1, |
| // Pads input data according to the PKCS#1-PSS scheme. |
| kRsaPaddingPss = 2, |
| // NULL padding. |
| kRsaPaddingNull = 3, |
| } rsa_padding_t; |
| |
| /** |
| * Enum to define hash modes for RSA scheme |
| * |
| * Aligning with existing HASH modes. |
| */ |
| typedef enum rsa_hash { |
| // SHA2-256 hashing mode for RSA. |
| kRsaHashSha256 = 0, |
| // SHA2-384 hashing mode for RSA. |
| kRsaHashSha384 = 1, |
| // SHA2-512 hashing mode for RSA. |
| kRsaHashSha512 = 2, |
| // SHA3-384 hashing mode for RSA. |
| kRsaHashSha3_384 = 3, |
| } rsa_hash_t; |
| |
| /** |
| * Enum to define named elliptic curves. |
| */ |
| typedef enum ecc_named_curve { |
| // ECC named curve NIST P256. |
| kEccNamedCurveNistP256 = 0, |
| // ECC named curve NIST P384. |
| kEccNamedCurveNistP384 = 1, |
| // ECC named curve brainpool P256r1. |
| kEccNamedCurveBrainpoolP256R1 = 2, |
| } ecc_named_curve_t; |
| |
| /** |
| * Struct to handle ECDSA or EdDSA signature. |
| */ |
| 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. |
| */ |
| typedef enum eddsa_sign_mode { |
| // Signature mode EdDSA. |
| kEddsaSignModeEdDSA = 0, |
| // Signature mode Hashed EdDSA. |
| kEddsaSignModeHashEdDSA = 1, |
| } 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. |
| uint32_t *x; |
| // ECC public key y coordinate. |
| uint32_t *y; |
| } ecc_public_key_t; |
| |
| /** |
| * Struct to handle Ed25519 public key type. |
| * |
| * Length of encoded public key for Ed25519 is 256 bits (32 bytes). |
| */ |
| typedef struct ed25519_public_key { |
| // Public key for Ed25519. |
| uint32_t *pub_key; |
| } eddsa_public_key_t; |
| |
| /** |
| * Struct for domain parameters for a generic Weierstrass elliptic curve. |
| */ |
| typedef struct ecc_domain { |
| // Length of p. |
| size_t len_p; |
| // Value of prime p (modulus of coordinate finite field). |
| uint32_t *p; |
| // Length of coefficient a. |
| size_t len_a; |
| // Value of coefficient a. |
| uint32_t *a; |
| // Length of coefficient b. |
| size_t len_b; |
| // Value of coefficient b. |
| uint32_t *b; |
| // Value of x coordinate of G (base point). Same length as p. |
| uint32_t *gx; |
| // Value of y coordinate of G (base point). Same length as p. |
| uint32_t *gy; |
| // Length of q. |
| size_t len_q; |
| // Value of q (order of G). |
| uint32_t *q; |
| // Cofactor of the curve. |
| uint32_t cofactor; |
| // Checksum value of the parameters. |
| uint32_t checksum; |
| } ecc_domain_t; |
| |
| /** |
| * Struct to handle crypto data buffer with pointer and length. |
| */ |
| typedef struct crypto_uint8_buf { |
| // Pointer to the data. |
| uint8_t *data; |
| // Length of the data in bytes. |
| size_t len; |
| } crypto_uint8_buf_t; |
| |
| /** |
| * Performs the AES initialization operation. |
| * |
| * The `aes_mode` and `aes_operation` are selected and the `key`, `iv` |
| * are loaded into the register. |
| * |
| * @param key Pointer to the blinded key struct with key shares |
| * @param iv Initialization vector, used for CBC, CFB, OFB, CTR modes |
| * @param aes_mode Required aes mode of operation |
| * @param aes_operation Required aes operation |
| * @return crypto_status_t The result of the init operation |
| */ |
| crypto_status_t aes_init(const crypto_blinded_key_t *key, crypto_uint8_buf_t iv, |
| block_cipher_mode_t aes_mode, |
| aes_operation_t aes_operation); |
| |
| /** |
| * Performs the AES cipher operation. |
| * |
| * The #aes_init function should be called before this, to initialize |
| * the key, aes mode and aes cipher operation to be performed. |
| * |
| * The input data in the `cipher_input` is first padded using the |
| * aes_padding scheme, the output is placed in the `cipher_output`. |
| * |
| * @param cipher_input Input data to be ciphered |
| * @param aes_padding Padding scheme to be used for the data |
| * @param cipher_output Output data after cipher operation |
| * @return crypto_status_t The result of the cipher operation |
| */ |
| crypto_status_t aes_cipher(const crypto_uint8_buf_t cipher_input, |
| aes_padding_t aes_padding, |
| crypto_uint8_buf_t *cipher_output); |
| |
| /** |
| * Performs the AES-GCM authenticated encryption operation. |
| * |
| * This function encrypts the input data `plaintext` to produce an |
| * `ciphertext` output. Additionally it generates an authentication |
| * tag `auth_tag` on both the (confidential) input data and any |
| * additional non-confidential authenticated data `aad`. |
| * |
| * @param key Pointer to the blinded gcm-key struct |
| * @param plaintext Input data to be encrypted and authenticated |
| * @param iv Initialization vector for the encryption function |
| * @param aad Additional authenticated data |
| * @param ciphertext Encrypted output data, same length as input data |
| * @param auth_tag Authentication tag |
| * @return crypto_status_t The result of the encryption operation |
| */ |
| crypto_status_t aes_encrypt_gcm(const crypto_blinded_key_t *key, |
| const crypto_uint8_buf_t plaintext, |
| crypto_uint8_buf_t iv, crypto_uint8_buf_t aad, |
| crypto_uint8_buf_t *ciphertext, |
| crypto_uint8_buf_t *auth_tag); |
| |
| /** |
| * Performs the AES-GCM authenticated decryption operation. |
| * |
| * This function first verifies if the authentication tag `auth_tag` |
| * matches the internally generated tag. Upon verification, the |
| * function decrypts the input `ciphertext` to get a `plaintext data. |
| * |
| * @param key Pointer to the blinded gcm-key struct |
| * @param ciphertext Input data to be decrypted |
| * @param iv Initialization vector for the decryption function |
| * @param aad Additional authenticated data |
| * @param auth_tag Authentication tag to be verified |
| * @param plaintext Decrypted plaintext data, same len as input data |
| * @return crypto_status_t The result of the encryption operation |
| */ |
| crypto_status_t aes_decrypt_gcm(const crypto_blinded_key_t *key, |
| const crypto_uint8_buf_t ciphertext, |
| crypto_uint8_buf_t iv, crypto_uint8_buf_t aad, |
| crypto_uint8_buf_t auth_tag, |
| crypto_uint8_buf_t *plaintext); |
| |
| /** |
| * AES-GCM context. |
| * |
| * Representation is internal to the AES implementation; initialize with |
| * #aes_gcm_init. |
| */ |
| typedef struct aes_gcm_context aes_gcm_context_t; |
| |
| /** |
| * Initializes the AES-GCM engine. |
| * |
| * Generates the GHASH subkey H and pre-counter block J0 from the |
| * `key` and `iv`, and stores them in the `gcm_context` struct. |
| * |
| * @param gcm_context Pointer to the GCM context struct |
| * @param key Pointer to the blinded GCM key struct |
| * @param iv Initialization vector for the GCM function |
| * @return crypto_status_t The result of the init operation |
| */ |
| crypto_status_t aes_gcm_init(aes_gcm_context_t *gcm_context, |
| const crypto_blinded_key_t *key, |
| crypto_uint8_buf_t iv); |
| |
| /** |
| * Updates the AAD value for the encryption/decryption function. |
| * |
| * After copying the aad, computes GHASH value and stores the result |
| * in the `gcm_context` state parameter. |
| * |
| * #aes_gcm_init should be called before calling this function. |
| * |
| * @param gcm_context Pointer to the GCM context struct |
| * @param aad Additional authenticated data |
| * @return crypto_status_t The result of the aad update operation |
| */ |
| crypto_status_t aes_gcm_aad_update(aes_gcm_context_t *gcm_context, |
| crypto_uint8_buf_t aad); |
| |
| /** |
| * Performs the AES-GCM authenticated encryption update operation. |
| * |
| * This function encrypts the input data in `plaintext` and produces a |
| * `ciphertext` data as output. The partial data bytes are stored back |
| * in the `gcm_context` and combined with subsequent bytes or padded to |
| * block length for the last block. The intermediate result is stored in |
| * the `gcm_context` state parameter. |
| * |
| * #aes_gcm_init and if needed #aes_gcm_aad_update should be called |
| * before calling this function. |
| * |
| * @param gcm_context Pointer to the GCM context struct |
| * @param plaintext Input data to be encrypted and authenticated |
| * @param ciphertext Encrypted output data, same length as input data |
| * @return crypto_status_t The result of the init operation |
| */ |
| crypto_status_t aes_gcm_encrypt_update(aes_gcm_context_t *gcm_context, |
| const crypto_uint8_buf_t plaintext, |
| crypto_uint8_buf_t *ciphertext); |
| |
| /** |
| * Performs the AES-GCM authenticated encryption final operation. |
| * |
| * This function pads the remaining partial data and encrypts the |
| * block. Computes GHASH of the updated state after and stores the |
| * result back in `gcm_context` state parameter, for tag generation. |
| * |
| * #aes_gcm_encrypt_update should be called before calling this |
| * function. |
| * |
| * @param gcm_context Pointer to the GCM context struct |
| * @param ciphertext Encrypted output data, same length as input data |
| * @return crypto_status_t The result of the init operation |
| */ |
| crypto_status_t aes_gcm_encrypt_final(aes_gcm_context_t *gcm_context, |
| crypto_uint8_buf_t *ciphertext); |
| |
| /** |
| * Performs the authentication tag generation operation. |
| * |
| * Performs GCTR on the final state value stored in the `gcm_context` |
| * and returns the generated `auth_tag`. |
| * |
| * #aes_gcm_encrypt_final should be called before using this API. |
| * |
| * @param gcm_context Pointer to the GCM context struct |
| * @param auth_tag Authentication tag |
| * @return crypto_status_t The result of the tag generate operation |
| */ |
| crypto_status_t aes_gcm_generate_tag(aes_gcm_context_t *gcm_context, |
| crypto_uint8_buf_t *auth_tag); |
| |
| /** |
| * Performs the pre-step for AES-GCM tag verification operation. |
| * |
| * Note: Tag should be verified before decrypting ciphertext. |
| * |
| * This function computes the final state value from the `ciphertext` |
| * and AAD data. The partial data bytes and intermediate result are |
| * stored back in the `gcm_context`. |
| * |
| * #aes_gcm_init and aes_gcm_aad_update should be called before using |
| * this function. |
| * |
| * @param gcm_context Pointer to the GCM context struct |
| * @param ciphertext Encrypted input data for tag generation |
| * @return crypto_status_t The return status of the verify update operation |
| */ |
| crypto_status_t aes_gcm_verify_tag_update(aes_gcm_context_t *gcm_context, |
| const crypto_uint8_buf_t ciphertext); |
| |
| /** |
| * Performs the AES-GCM tag verification operation. |
| * |
| * Note: Tag should be verified before decrypting ciphertext. |
| * |
| * This function pads the remaining partial data and after that |
| * computes the authentication tag. The generated tag is verified |
| * against the input `auth_tag` for correctness. |
| * |
| * #aes_gcm_verify_tag_update should be called before using this function. |
| * |
| * @param gcm_context Pointer to the GCM context struct |
| * @param auth_tag Authentication tag |
| * @param verification_result Result of the tag verification (Pass/Fail) |
| * @return crypto_status_t The return status of the tag verify operation |
| */ |
| crypto_status_t aes_gcm_verify_tag_final( |
| aes_gcm_context_t *gcm_context, crypto_uint8_buf_t auth_tag, |
| verification_status_t *verification_result); |
| |
| /** |
| * Performs the AES-GCM decryption update operation. |
| * |
| * Note: Decrypt should only be used after tag verification. |
| * |
| * This function generates `plaintext` from the `ciphertext` data. The |
| * partial data bytes and intermediate result are stored back in the |
| * `gcm_context`. |
| * |
| * #aes_gcm_init and aes_gcm_aad_update should be called before using |
| * this function. |
| * |
| * @param gcm_context Pointer to the GCM context struct |
| * @param ciphertext Input data to be decrypted |
| * @param plaintext Decrypted plaintext data, same len as input data |
| * @return crypto_status_t The result of the decrypt update operation |
| */ |
| crypto_status_t aes_gcm_decrypt_update(aes_gcm_context_t *gcm_context, |
| const crypto_uint8_buf_t ciphertext, |
| crypto_uint8_buf_t *plaintext); |
| |
| /** |
| * Performs the AES-GCM authenticated decryption final operation. |
| * |
| * This function pads the remaining partial data and decrypts the |
| * block to `plaintext`. |
| * |
| * #aes_gcm_decrypt_update should be called before using this function. |
| * |
| * @param gcm_context Pointer to the GCM context struct |
| * @param ciphertext Input data to be decrypted |
| * @param plaintext Decrypted plaintext data, same len as input data |
| * @return crypto_status_t The result of the decrypt operation |
| */ |
| crypto_status_t aes_gcm_decrypt_final(aes_gcm_context_t *gcm_context, |
| crypto_uint8_buf_t *plaintext); |
| |
| /** |
| * Performs the AES-KWP authenticated encryption operation. |
| * |
| * This encrypt function takes an input key `key_to_wrap` and using |
| * the encryption key `key_kek` outputs a wrapped key `wrapped_key`. |
| * |
| * @param key_to_wrap Pointer to the blinded key to be wrapped |
| * @param key_kek Input Pointer to the blinded encryption key |
| * @param wrapped_key Pointer to the output wrapped key |
| * @return crypto_status_t The result of the aes-kwp encrypt operation |
| */ |
| crypto_status_t aes_kwp_encrypt(const crypto_blinded_key_t *key_to_wrap, |
| const crypto_blinded_key_t *key_kek, |
| crypto_uint8_buf_t *wrapped_key); |
| |
| /** |
| * Performs the AES-KWP authenticated decryption operation. |
| * |
| * This decrypt function takes a wrapped key `wrapped_key` and using |
| * encryption key `key_kek` outputs a unwrapped key `unwrapped_key`. |
| * |
| * @param wrapped_key Pointer to the input wrapped key |
| * @param key_kek Input Pointer to the blinded encryption key |
| * @param unwrapped_key Pointer to the output unwrapped key struct |
| * @return crypto_status_t The result of the aes-kwp decrypt operation |
| */ |
| crypto_status_t aes_kwp_decrypt(const crypto_uint8_buf_t wrapped_key, |
| const crypto_blinded_key_t *key_kek, |
| crypto_blinded_key_t *unwrapped_key); |
| |
| /** |
| * Performs the required hash function on the input data. |
| * |
| * This function hashes the `input_message` with the selected hash |
| * function to return a `digest`. Supported hash modes are |
| * kHashModeSha256,kHashModeSha384, kHashModeSha512, |
| * kHashModeSha3_224, kHashModeSha3_256, kHashModeSha3_384 and |
| * kHashModeSha3_512. |
| * |
| * @param input_message Input message to be hashed |
| * @param hash_mode Required hash mode for the digest |
| * @param digest Output digest after hashing the input data |
| * @return crypto_status_t The result of the hash operation |
| */ |
| crypto_status_t hash(const crypto_uint8_buf_t input_message, |
| hash_mode_t hash_mode, crypto_uint8_buf_t *digest); |
| |
| /** |
| * Performs the required hash xof function on the input data. |
| * |
| * This function hashes the `input_message` with the selected hash xof |
| * function and returns a `digest`. Supported hash modes are |
| * kHashModeSha3Shake128, kHashModeSha3Shake256, |
| * kHashModeSha3Cshake128 and kHashModeSha3Cshake256. |
| * |
| * The customization string is passed through `customization_string` |
| * parameter. If no customization is desired it can be empty. |
| * |
| * The function name is used to define functions based on cSHAKE. When |
| * no function other than cSHAKE is desired; it can be empty. |
| * |
| * The `function_name_string` and `customization_string` are ignored |
| * when the `hash_mode` is set to kHashModeSha3Shake128 or |
| * kHashModeSha3Shake256. |
| * |
| * @param input_message Input message to be hashed |
| * @param hash_mode Required hash mode for the digest |
| * @param function_name_string NIST Function name string |
| * @param customization_string Customization string for kmac |
| * @param required_output_len Requested output length from kmac |
| * @param digest Output digest after hashing the input data |
| * @return crypto_status_t The result of the cshake operation |
| */ |
| crypto_status_t hash_xof(const crypto_uint8_buf_t input_message, |
| hash_mode_t hash_mode, |
| crypto_uint8_buf_t function_name_string, |
| crypto_uint8_buf_t customization_string, |
| size_t required_output_len, |
| crypto_uint8_buf_t *digest); |
| |
| /** |
| * Generic hash context. |
| * |
| * Representation is internal to the hash implementations; initialize with |
| * #hash_init. |
| */ |
| typedef struct hash_context hash_context_t; |
| |
| /** |
| * Performs the generic hash init operation. |
| * |
| * Initializes the generic hash function. Populates the init, update |
| * and final function pointers, and digest, block sizes, by calling |
| * the respective init function requested by `hash_mode` parameter. |
| * |
| * @param ctx Pointer to the generic hash context struct |
| * @param hash_mode Required hash mode |
| * @return crypto_status_t The result of the init operation |
| */ |
| crypto_status_t hash_init(const hash_context_t *ctx, hash_mode_t hash_mode); |
| |
| /** |
| * Performs the generic hash update operation. |
| * |
| * The update operation computes the required hash on `input_meaage` |
| * blocks. The intermediate digest is stored in the context `ctx` in |
| * the state parameter. Any partial data is stored back in the context |
| * and combined with subsequent bytes. |
| * |
| * #hash_init should be called before calling this function. |
| * |
| * @param ctx Pointer to the generic hash context struct |
| * @param input_message Input message to be hashed |
| * @return crypto_status_t The result of the update operation |
| */ |
| crypto_status_t hash_update(const hash_context_t *ctx, |
| const crypto_uint8_buf_t input_message); |
| |
| /** |
| * Performs the generic hash final operation. |
| * |
| * The final operation computes the required hash on the remaining |
| * partial blocks if any, and then computes the final hash and stores |
| * it in the `digest` parameter. |
| * |
| * #hash_update should be called before calling this function. |
| * |
| * @param ctx Pointer to the generic hash context struct |
| * @param digest Output digest after hashing the input blocks |
| * @return crypto_status_t The result of the final operation |
| */ |
| crypto_status_t hash_final(const hash_context_t *ctx, |
| crypto_uint8_buf_t *digest); |
| |
| /** |
| * Performs the SHA2-256 init operation. |
| * |
| * Initializes the SHA2-256 parameters in the `ctx` context, such as the |
| * init, update, final functions to use and the digest, block sizes. |
| * |
| * @param ctx Pointer to the generic hash context struct |
| * @return crypto_status_t The result of the init operation |
| */ |
| crypto_status_t sha256_init(const hash_context_t *ctx); |
| |
| /** |
| * Performs the SHA2-256 update operation. |
| * |
| * The update operation computes the SHA2-256 hash on the `input_message` |
| * blocks. The intermediate digest is stored in the context `ctx` in |
| * the state parameter. Any partial data is stored back in the context |
| * and combined with subsequent bytes. |
| * |
| * @param ctx Pointer to the generic hash context struct |
| * @param input_message Input message to be hashed |
| * @return crypto_status_t The result of the update operation |
| */ |
| crypto_status_t sha256_update(const hash_context_t *ctx, |
| const crypto_uint8_buf_t input_message); |
| |
| /** |
| * Performs the SHA2-256 final operation. |
| * |
| * The final operation computes the SHA2-256 hash on the remaining |
| * partial blocks if any, and then computes the final hash and stores |
| * it in the `digest` parameter. |
| * |
| * @param ctx Pointer to the generic hash context struct |
| * @param digest Output digest after hashing the input blocks |
| * @return crypto_status_t The result of the final operation |
| */ |
| crypto_status_t sha256_final(const hash_context_t *ctx, |
| crypto_uint8_buf_t *digest); |
| |
| /** |
| * Performs the SHA2-384 init operation. |
| * |
| * Initializes the SHA2-384 parameters in the `ctx` context, such as the |
| * init, update, final functions to use and the digest, block sizes. |
| * |
| * @param ctx Pointer to the generic hash context struct |
| * @return crypto_status_t The result of the init operation |
| */ |
| crypto_status_t sha384_init(const hash_context_t *ctx); |
| |
| /** |
| * Performs the SHA2-384 update operation. |
| * |
| * The update operation computes the SHA2-384 hash on the `input_meaage` |
| * blocks. The intermediate digest is stored in the context `ctx` in |
| * the state parameter. Any partial data is stored back in the context |
| * and combined with subsequent bytes. |
| * |
| * @param ctx Pointer to the generic hash context struct |
| * @param input_message Input message to be hashed |
| * @return crypto_status_t The result of the update operation |
| */ |
| crypto_status_t sha384_update(const hash_context_t *ctx, |
| const crypto_uint8_buf_t input_message); |
| |
| /** |
| * Performs the SHA2-384 final operation. |
| * |
| * The final operation computes the SHA2-384 hash on the remaining |
| * partial blocks if any, and then computes the final hash and stores |
| * it in the `digest` parameter. |
| * |
| * @param ctx Pointer to the generic hash context struct |
| * @param digest Output digest after hashing the input blocks |
| * @return crypto_status_t The result of the final operation |
| */ |
| crypto_status_t sha384_final(const hash_context_t *ctx, |
| crypto_uint8_buf_t *digest); |
| |
| /** |
| * Performs the SHA2-512 init operation. |
| * |
| * Initializes the SHA2-512 parameters in the `ctx` context, such as the |
| * init, update, final functions to use and the digest, block sizes. |
| * |
| * @param ctx Pointer to the generic hash context struct |
| * @return crypto_status_t The result of the init operation |
| */ |
| crypto_status_t sha512_init(const hash_context_t *ctx); |
| |
| /** |
| * Performs the SHA2-512 update operation. |
| * |
| * The update operation computes the SHA2-512 hash on the `input_meaage` |
| * blocks. The intermediate digest is stored in the context `ctx` in |
| * the state parameter. Any partial data is stored back in the context |
| * and combined with subsequent bytes. |
| * |
| * @param ctx Pointer to the generic hash context struct |
| * @param input_message Input message to be hashed |
| * @return crypto_status_t The result of the update operation |
| */ |
| crypto_status_t sha512_update(const hash_context_t *ctx, |
| const crypto_uint8_buf_t input_message); |
| |
| /** |
| * Performs the SHA2-512 final operation. |
| * |
| * The final operation computes the SHA2-512 hash on the remaining |
| * partial blocks if any, and then computes the final hash and stores |
| * it in the `digest` parameter. |
| * |
| * @param ctx Pointer to the generic hash context struct |
| * @param digest Output digest after hashing the input blocks |
| * @return crypto_status_t The result of the final operation |
| */ |
| crypto_status_t sha512_final(const hash_context_t *ctx, |
| crypto_uint8_buf_t *digest); |
| |
| /** |
| * Performs the MAC (HMAC/KMAC) hash function on the input data. |
| * |
| * Supported MAC modes are kMacModeHmacSha256, kMacModeKmac128 and |
| * kMacModeKmac256. |
| * |
| * HMAC: This function computes the required mac function on the |
| * `input_message` using the `key` and returns a `digest`. |
| * |
| * KMAC: This function computes the kmac on the `input_message` using |
| * the `key` and returns a `digest` of `required_output_len`. The |
| * customization string is passed through `customization_string` |
| * parameter. If no customization is desired it can be empty. |
| * |
| * The `customization_string` and `required_output_len` is only used |
| * for kmac modes kMacModeKmac128 and kMacModeKmac256, and is ignored |
| * when the required mode is set to kMacModeHmacSha256. |
| * |
| * @param key Pointer to the blinded key struct with key shares |
| * @param input_message Input message to be hashed |
| * @param mac_mode Required MAC mode for the digest (HMAC/KMAC) |
| * @param customization_string Customization string for kmac |
| * @param required_output_len Requested output length from kmac |
| * @param digest Output digest after hashing the input data |
| * @return crypto_status_t The result of the kmac128 operation |
| */ |
| crypto_status_t mac(const crypto_blinded_key_t *key, |
| const crypto_uint8_buf_t input_message, mac_mode_t mac_mode, |
| crypto_uint8_buf_t customization_string, |
| size_t required_output_len, crypto_uint8_buf_t *digest); |
| |
| /** |
| * Generic HMAC context. |
| * |
| * Representation is internal to the HMAC implementations; initialize with |
| * #hmac_init. |
| */ |
| typedef struct hmac_context hmac_context_t; |
| |
| /** |
| * Performs the generic HMAC init operation. |
| * |
| * Initializes the generic HMAC function. Populates the init, update |
| * and final function pointers, and digest, block sizes, by calling |
| * the respective init function as requested by `hash_mode` parameter. |
| * |
| * @param ctx Pointer to the generic HMAC context struct |
| * @param key Pointer to the blinded HMAC key struct |
| * @param hash_mode Required hash mode |
| * @return crypto_status_t The result of the init operation |
| */ |
| crypto_status_t hmac_init(const hash_context_t *ctx, |
| const crypto_blinded_key_t *key, |
| hash_mode_t hash_mode); |
| |
| /** |
| * Performs the generic HMAC update operation. |
| * |
| * The update operation computes the required hash on `input_meaage` |
| * blocks. The intermediate digest is stored in the context `ctx`, in |
| * the state parameter. Any partial data is stored back in the context |
| * and combined with subsequent bytes after. |
| * |
| * #hmac_init should be called before calling this function. |
| * |
| * @param ctx Pointer to the generic HMAC context struct |
| * @param input_message Input message to be hashed |
| * @return crypto_status_t The result of the init operation |
| */ |
| crypto_status_t hmac_update(const hash_context_t *ctx, |
| const crypto_uint8_buf_t input_message); |
| |
| /** |
| * Performs the generic HMAC final operation. |
| * |
| * The final operation computes the hash function on the remaining |
| * partial blocks if any, and then computes the final hash, and stores |
| * the result in the `digest` parameter. |
| * |
| * #hmac_update should be called before calling this function. |
| * |
| * @param ctx Pointer to the generic HMAC context struct |
| * @param digest Output digest after hashing the input blocks |
| * @return crypto_status_t The result of the final operation |
| */ |
| crypto_status_t hmac_final(const hash_context_t *ctx, |
| crypto_uint8_buf_t *digest); |
| |
| /** |
| * Performs the HMAC SHA2-256 init operation. |
| * |
| * Initializes the HMAC SHA2-256 parameters in the `ctx` context, such |
| * as the init, update, final functions to use and respective digest, |
| * block sizes. |
| * |
| * @param ctx Pointer to the generic HMAC context struct |
| * @param key Pointer to the blinded HMAC key struct |
| * @return crypto_status_t The result of the init operation |
| */ |
| crypto_status_t hmac_sha256_init(const hash_context_t *ctx, |
| const crypto_blinded_key_t *key); |
| |
| /** |
| * Performs the hmac-SHA2-256 update operation. |
| * |
| * The update operation computes the required hash on `input_meaage` |
| * blocks. The intermediate digest is stored in the context `ctx`, in |
| * the state parameter. Any partial data is stored back in the context |
| * and combined with subsequent bytes after. |
| * |
| * @param ctx Pointer to the generic HMAC context struct |
| * @param input_message Input message to be hashed |
| * @return crypto_status_t The result of the update operation |
| */ |
| crypto_status_t hmac_sha256_update(const hash_context_t *ctx, |
| const crypto_uint8_buf_t input_message); |
| |
| /** |
| * Performs the hmac-SHA2-256 final operation. |
| * |
| * The final operation computes the hash function on the remaining |
| * partial blocks if any, and then computes the final hash, and stores |
| * the result in the `digest` parameter. |
| * |
| * @param ctx Pointer to the generic HMAC context struct |
| * @param digest Output digest after hashing the input blocks |
| * @return crypto_status_t The result of the final operation |
| */ |
| crypto_status_t hmac_sha256_final(const hash_context_t *ctx, |
| crypto_uint8_buf_t *digest); |
| |
| /** |
| * Performs the RSA key generation. |
| * |
| * Computes RSA private key (d) and RSA public key exponent (e) and |
| * modulus (n). DRBG state is passed as an input parameter. |
| * |
| * @param drbg_state Pointer to the DRBG working state |
| * @param additional_input Pointer to the additional input for DRBG |
| * @param required_key_len Requested key length in bits |
| * @param n Pointer to un-blinded key struct with modulus |
| * @param e Pointer to un-blinded key struct with public exponent |
| * @param d Pointer to blinded key struct with private exponent |
| * @return crypto_status_t The result of the RSA key generation |
| */ |
| crypto_status_t rsa_keygen(drbg_state_t *drbg_state, |
| crypto_uint8_buf_t additional_input, |
| size_t required_key_len, crypto_unblinded_key_t *n, |
| crypto_unblinded_key_t *e, crypto_blinded_key_t *d); |
| |
| /** |
| * Computes the digital signature on the input message data. |
| * |
| * @param n Pointer to un-blinded key struct with modulus (n) |
| * @param d Pointer to blinded key struct with private exponent (d) |
| * @param input_message Input message to be signed |
| * @param padding_mode Padding scheme to be used for the data |
| * @param hash_mode Hashing scheme to be used for the signature scheme |
| * @param signature Pointer to generated signature struct |
| * @return crypto_status_t The result of the RSA sign generation |
| */ |
| crypto_status_t rsa_sign(crypto_unblinded_key_t *n, crypto_blinded_key_t *d, |
| const crypto_uint8_buf_t input_message, |
| rsa_padding_t padding_mode, rsa_hash_t hash_mode, |
| crypto_uint8_buf_t *signature); |
| |
| /** |
| * Verifies the authenticity of the input signature. |
| * |
| * The generated signature is compared against the input signature and |
| * PASS / FAIL is returned. |
| * |
| * @param n Pointer to un-blinded key struct with modulus (n) |
| * @param e Pointer to un-blinded key struct with public exponent (e) |
| * @param input_message Input message to be signed for verification |
| * @param padding_mode Padding scheme to be used for the data |
| * @param hash_mode Hashing scheme to be used for the signature scheme |
| * @param signature Pointer to the signature to be verified |
| * @param verification_result Returns the result of signature verification |
| * (Pass/Fail) |
| * @return crypto_status_t The return status of the RSA verify operation |
| */ |
| crypto_status_t rsa_verify(crypto_unblinded_key_t *n, crypto_unblinded_key_t *e, |
| const crypto_uint8_buf_t input_message, |
| rsa_padding_t padding_mode, rsa_hash_t hash_mode, |
| crypto_uint8_buf_t signature, |
| verification_status_t *verification_result); |
| |
| /** |
| * Performs the RSA key generation, asynchronously. |
| * |
| * Computes RSA private key (d) and RSA public key exponent (e) and |
| * modulus (n). DRBG state is passed as an input parameter. |
| * |
| * @param drbg_state Pointer to the DRBG working state |
| * @param additional_input Pointer to the additional input for DRBG |
| * @param required_key_len Requested key length in bits |
| * @param n Pointer to un-blinded key struct with modulus (n) |
| * @param e Pointer to un-blinded key struct with public exponent (e) |
| * @param d Pointer to blinded key struct with private exponent (d) |
| * @return crypto_status_t The result of the RSA key generation |
| */ |
| crypto_status_t rsa_keygen_async(drbg_state_t *drbg_state, |
| crypto_uint8_buf_t additional_input, |
| size_t required_key_len, |
| crypto_unblinded_key_t *n, |
| crypto_unblinded_key_t *e, |
| crypto_blinded_key_t *d); |
| |
| /** |
| * Computes the digital signature on the input message data, async. |
| * |
| * @param n Pointer to un-blinded key struct with modulus (n) |
| * @param d Pointer to blinded key struct with private exponent (d) |
| * @param input_message Input message to be signed |
| * @param padding_mode Padding scheme to be used for the data |
| * @param hash_mode Hashing scheme to be used for the signature scheme |
| * @param signature Pointer to generated signature struct |
| * @return crypto_status_t The result of the RSA sign generation |
| */ |
| crypto_status_t rsa_sign_async(crypto_unblinded_key_t *n, |
| crypto_blinded_key_t *d, |
| const crypto_uint8_buf_t input_message, |
| rsa_padding_t padding_mode, rsa_hash_t hash_mode, |
| crypto_uint8_buf_t *signature); |
| |
| /** |
| * Verifies the authenticity of the input signature, asynchronously. |
| * |
| * The generated signature is compared against the input signature and |
| * PASS / FAIL is returned. |
| * |
| * @param n Pointer to un-blinded key struct with modulus (n) |
| * @param e Pointer to un-blinded key struct with public exponent (e) |
| * @param input_message Input message to be signed for verification |
| * @param padding_mode Padding scheme to be used for the data |
| * @param hash_mode Hashing scheme to be used for the signature scheme |
| * @param signature Pointer to the signature to be verified |
| * @param verification_result Returns the result of signature verification |
| * (Pass/Fail) |
| * @return crypto_status_t The return status of the RSA verify operation |
| */ |
| crypto_status_t rsa_verify_async(crypto_unblinded_key_t *n, |
| crypto_unblinded_key_t *e, |
| const crypto_uint8_buf_t input_message, |
| rsa_padding_t padding_mode, |
| rsa_hash_t hash_mode, |
| crypto_uint8_buf_t signature, |
| verification_status_t *verification_result); |
| |
| /** |
| * Sets the domain parameters of a generic Weierstrass curve. |
| * |
| * @param domain_parameters Pointer to the ECC curve domain parameters |
| * @return crypto_status_t The result of the ECC set domain operation |
| */ |
| crypto_status_t ecc_set_domain(ecc_domain_t domain_parameters); |
| |
| /** |
| * Sets the domain parameters of a named Weierstrass curve. |
| * |
| * @param named_curve Named curve to set domain parameters for |
| * @return crypto_status_t The result of the ECC set domain operation |
| */ |
| crypto_status_t ecc_set_domain_named(ecc_named_curve_t named_curve); |
| |
| /** |
| * Performs ECDSA/ECDH key generation. |
| * |
| * Computes private key (d) and public key (Q). DRBG state is passed as an |
| * input parameter. |
| * |
| * @param drbg_state Pointer to the DRBG working state |
| * @param additional_input Pointer to the additional input for DRBG |
| * @param required_key_len Requested key length in bits |
| * @param private_key Pointer to the blinded private key (d) struct |
| * @param public_key Pointer to the unblinded public key (Q) struct |
| * @return crypto_status_t The result of the key generation |
| */ |
| crypto_status_t ecc_keygen(drbg_state_t *drbg_state, |
| crypto_uint8_buf_t additional_input, |
| size_t required_key_len, |
| crypto_blinded_key_t *private_key, |
| ecc_public_key_t *public_key); |
| |
| /** |
| * Performs ECDSA digital signature generation. |
| * |
| * @param private_key Pointer to the blinded private key (d) struct |
| * @param input_message Input message to be signed |
| * @param signature Pointer to the signature struct with (r,s) values |
| * @return crypto_status_t Result of the signature operation |
| */ |
| crypto_status_t ecdsa_sign(crypto_blinded_key_t *private_key, |
| const crypto_uint8_buf_t input_message, |
| ecc_signature_t *signature); |
| |
| /** |
| * Performs ECDSA digital signature verification. |
| * |
| * @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 verification_result Returns the result of signature verification |
| * (Pass/Fail) |
| * @return crypto_status_t Return status of the verification operation |
| */ |
| crypto_status_t ecdsa_verify(ecc_public_key_t *public_key, |
| const crypto_uint8_buf_t input_message, |
| ecc_signature_t *signature, |
| verification_status_t *verification_result); |
| |
| /** |
| * Performs Elliptic Curve Diffie Hellman shared secret generation. |
| * |
| * @param private_key Pointer to the blinded private key (d) struct |
| * @param public_key Pointer to the unblinded public key (Q) struct |
| * @param shared_secret Pointer to generated blinded shared key struct |
| * @return crypto_status_t Result of the ecdh operation |
| */ |
| crypto_status_t ecdh(crypto_blinded_key_t *private_key, |
| ecc_public_key_t *public_key, |
| crypto_blinded_key_t *shared_secret); |
| |
| /** |
| * Performs the X25519 Diffie Hellman shared secret generation. |
| * |
| * @param private_key Pointer to the blinded private key (u-coordinate) |
| * @param public_key Pointer to the public scalar from the sender |
| * @param shared_secret Pointer to shared secret key (u-coordinate) |
| * @return crypto_status_t Result of the ecdh operation |
| */ |
| crypto_status_t x25519(crypto_blinded_key_t *private_key, |
| crypto_uint8_buf_t *public_key, |
| crypto_blinded_key_t *shared_secret); |
| |
| /** |
| * Performs key generation for Ed25519. |
| * |
| * Computes the private exponent (d) and public key (Q) based on |
| * Curve25519. DRBG state is passed as an input parameter. |
| * |
| * @param drbg_state Pointer to the DRBG working state |
| * @param additional_input Pointer to the additional input for DRBG |
| * @param required_key_len Requested key len in bits (256 for Ed25519) |
| * @param private_key Pointer to the blinded private key struct |
| * @param public_key Pointer to the unblinded public key struct |
| * @return crypto_status_t The result of the ecdsa key generation |
| */ |
| crypto_status_t ed25519_keygen(drbg_state_t *drbg_state, |
| crypto_uint8_buf_t additional_input, |
| size_t required_key_len, |
| crypto_blinded_key_t *private_key, |
| eddsa_public_key_t *public_key); |
| |
| /** |
| * Performs EdDSA digital signature generation for Ed25519. |
| * |
| * @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 signature Pointer to the EdDSA signature with (r,s) values |
| * @return crypto_status_t Result of the EdDSA signature operation |
| */ |
| crypto_status_t ed25519_sign(crypto_blinded_key_t *private_key, |
| const crypto_uint8_buf_t input_message, |
| eddsa_sign_mode_t sign_mode, |
| ecc_signature_t *signature); |
| |
| /** |
| * Performs EdDSA signature verification for Ed25519. |
| * |
| * @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 verification_result Returns the result of signature verification |
| * (Pass/Fail) |
| * @return crypto_status_t Return status of the EdDSA verification operation |
| */ |
| crypto_status_t ed25519_verify(edd_public_key_t *public_key, |
| const crypto_uint8_buf_t input_message, |
| eddsa_sign_mode_t sign_mode, |
| ecc_signature_t *signature, |
| verification_status_t *verification_result); |
| |
| /** |
| * Performs ECDSA/ECDH key generation, asynchronously. |
| * |
| * Computes private exponent (d) and public key (Q). DRBG state is |
| * passed as an input parameter. |
| * |
| * @param drbg_state Pointer to the DRBG working state |
| * @param additional_input Pointer to the additional input for DRBG |
| * @param required_key_len Requested key length in bits |
| * @param private_key Pointer to the blinded private key (d) struct |
| * @param public_key Pointer to the unblinded public key (Q) struct |
| * @return crypto_status_t The result of the ECC key generation |
| */ |
| crypto_status_t ecc_keygen_async(drbg_state_t *drbg_state, |
| crypto_uint8_buf_t additional_input, |
| size_t required_key_len, |
| crypto_blinded_key_t *private_key, |
| ecc_public_key_t *public_key); |
| |
| /** |
| * Performs the key generation for EdDSA, asynchronously. |
| * |
| * Computes EdDSA private exponent (d) and public key (Q). DRBG |
| * state is passed as an input parameter. |
| * |
| * @param drbg_state Pointer to the DRBG working state |
| * @param additional_input Pointer to the additional input for DRBG |
| * @param required_key_len Requested key len in bits (256 for Ed25519) |
| * @param private_key Pointer to the blinded private key struct |
| * @param public_key Pointer to the unblinded public key struct |
| * @return crypto_status_t The result of the ecdsa key generation |
| */ |
| crypto_status_t eddsa_keygen_async(drbg_state_t *drbg_state, |
| crypto_uint8_buf_t additional_input, |
| size_t required_key_len, |
| crypto_blinded_key_t *private_key, |
| eddsa_public_key_t *public_key); |
| |
| /** |
| * Performs ECDSA digital signature generation, asynchronously. |
| * |
| * @param private_key Pointer to the blinded private key (d) struct |
| * @param input_message Input message to be signed |
| * @param signature Pointer to the ECC sign struct with (r,s) values |
| * @return crypto_status_t Result of the ECC signature operation |
| */ |
| crypto_status_t ecdsa_sign_async(crypto_blinded_key_t *private_key, |
| const crypto_uint8_buf_t input_message, |
| ecc_signature_t *signature); |
| |
| /** |
| * Performs ECDSA digital signature verification, asynchronously. |
| * |
| * @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 verification_result Returns the result of signature verification |
| * (Pass/Fail) |
| * @return crypto_status_t Return status of the ECC verification operation |
| */ |
| crypto_status_t ecdsa_verify_async(ecc_public_key_t *public_key, |
| const crypto_uint8_buf_t input_message, |
| ecc_signature_t *signature, |
| verification_status_t *verification_result); |
| |
| /** |
| * Performs the EdDSA digital signature generation for Ed25519, |
| * asynchronously. |
| * |
| * @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 signature Pointer to the EdDSA signature with (r,s) values |
| * @return crypto_status_t Result of the EdDSA signature operation |
| */ |
| crypto_status_t ed25519_sign_async(crypto_blinded_key_t *private_key, |
| const crypto_uint8_buf_t input_message, |
| eddsa_sign_mode_t sign_mode, |
| ecc_signature_t *signature); |
| |
| /** |
| * Performs the EdDSA signature verification for Ed25519, |
| * asynchronously. |
| * |
| * @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 verification_result Returns the result of signature verification |
| * (Pass/Fail) |
| * @return crypto_status_t Return status of the EdDSA verification operation |
| */ |
| crypto_status_t ed25519_verify_async( |
| edd_public_key_t *public_key, const crypto_uint8_buf_t input_message, |
| eddsa_sign_mode_t sign_mode, ecc_signature_t *signature, |
| verification_status_t *verification_result); |
| |
| /** |
| * DRBG state. |
| */ |
| typedef struct drbg_state drbg_state_t; |
| |
| /** |
| * Initializes the DRBG. |
| * |
| * Initializes DRBG and the context parameter for DRBG. Gets the |
| * entropy input automatically from the entropy source. |
| * |
| * @param drbg_state Pointer to the DRBG working state |
| * @param nonce Pointer to the nonce bit-string |
| * @param personalization_string Pointer to personalization bitstring |
| * @return crypto_status_t Result of the DRBG instantiate operation |
| */ |
| crypto_status_t drbg_instantiate(drbg_state_t *drbg_state, |
| crypto_uint8_buf_t nonce, |
| crypto_uint8_buf_t personalization_string); |
| |
| /** |
| * Reseeds the DRBG with fresh entropy. |
| * |
| * Reseeds the DRBG with fresh entropy automatically fetched from the |
| * entropy source and updates the working state parameters. |
| * |
| * @param drbg_state Pointer to the DRBG working state |
| * @param additional_input Pointer to the additional input for DRBG |
| * @return crypto_status_t Result of the DRBG reseed operation |
| */ |
| crypto_status_t drbg_reseed(drbg_state_t *drbg_state, |
| crypto_uint8_buf_t additional_input); |
| |
| /** |
| * Initializes the DRBG. |
| * |
| * Initializes DRBG and the context parameter for DRBG. Gets the |
| * entropy input from the user through `entropy` parameter. |
| * |
| * @param drbg_state Pointer to the DRBG working state |
| * @param entropy Pointer to the user defined entropy value |
| * @param nonce Pointer to the nonce bit-string |
| * @param personalization_string Pointer to personalization bitstring |
| * @return crypto_status_t Result of the DRBG instantiate operation |
| */ |
| crypto_status_t drbg_manual_instantiate( |
| drbg_state_t *drbg_state, crypto_uint8_buf_t entropy, |
| crypto_uint8_buf_t nonce, crypto_uint8_buf_t personalization_string); |
| |
| /** |
| * Reseeds the DRBG with fresh entropy. |
| * |
| * Reseeds the DRBG with entropy input from the user through `entropy` |
| * parameter and updates the working state parameters. |
| * |
| * @param drbg_state Pointer to the DRBG working state |
| * @param entropy Pointer to the user defined entropy value |
| * @param additional_input Pointer to the additional input for DRBG |
| * @return crypto_status_t Result of the DRBG reseed operation |
| */ |
| crypto_status_t drbg_manual_reseed(drbg_state_t *drbg_state, |
| crypto_uint8_buf_t entropy, |
| crypto_uint8_buf_t additional_input); |
| |
| /** |
| * DRBG function for generating random bits. |
| * |
| * Used to generate pseudo random bits after DRBG instantiation or |
| * DRBG reseeding. |
| * |
| * @param drbg_state Pointer to the DRBG working state |
| * @param additional_input Pointer to the additional data |
| * @param drbg_output Pointer to the generated pseudo random bits |
| * @return crypto_status_t Result of the DRBG generate operation |
| */ |
| crypto_status_t drbg_generate(drbg_state_t *drbg_state, |
| crypto_uint8_buf_t additional_input, |
| crypto_uint8_buf_t *drbg_output); |
| |
| /** |
| * Uninstantiates DRBG and clears the context. |
| * |
| * @param drbg_state Pointer to the DRBG working state |
| * @return crypto_status_t Result of the DRBG uninstantiate operation |
| */ |
| crypto_status_t drbg_uninstantiate(drbg_state_t *drbg_state); |
| |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif // __cplusplus |
| |
| #endif // OPENTITAN_SW_DEVICE_LIB_CRYPTO_API_H_ |