primitives (Hash Serials, HMAC, RSA, Diffie-Hellman, etc) for UEFI security\r
functionality enabling.\r
\r
-Copyright (c) 2009 - 2020, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2009 - 2022, Intel Corporation. All rights reserved.<BR>\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
///\r
/// MD5 digest size in bytes\r
///\r
-#define MD5_DIGEST_SIZE 16\r
+#define MD5_DIGEST_SIZE 16\r
\r
///\r
/// SHA-1 digest size in bytes.\r
///\r
-#define SHA1_DIGEST_SIZE 20\r
+#define SHA1_DIGEST_SIZE 20\r
\r
///\r
/// SHA-256 digest size in bytes\r
///\r
/// SM3 digest size in bytes\r
///\r
-#define SM3_256_DIGEST_SIZE 32\r
+#define SM3_256_DIGEST_SIZE 32\r
\r
///\r
/// TDES block size in bytes\r
///\r
-#define TDES_BLOCK_SIZE 8\r
+#define TDES_BLOCK_SIZE 8\r
\r
///\r
/// AES block size in bytes\r
///\r
-#define AES_BLOCK_SIZE 16\r
+#define AES_BLOCK_SIZE 16\r
\r
///\r
/// RSA Key Tags Definition used in RsaSetKey() function for key component identification.\r
RsaKeyQInv ///< The CRT coefficient (== 1/q mod p)\r
} RSA_KEY_TAG;\r
\r
-//=====================================================================================\r
+// =====================================================================================\r
// One-Way Cryptographic Hash Primitives\r
-//=====================================================================================\r
+// =====================================================================================\r
\r
#ifdef ENABLE_MD5_DEPRECATED_INTERFACES\r
+\r
/**\r
Retrieves the size, in bytes, of the context buffer required for MD5 hash operations.\r
\r
IN UINTN DataSize,\r
OUT UINT8 *HashValue\r
);\r
+\r
#endif\r
\r
#ifndef DISABLE_SHA1_DEPRECATED_INTERFACES\r
+\r
/**\r
Retrieves the size, in bytes, of the context buffer required for SHA-1 hash operations.\r
\r
IN UINTN DataSize,\r
OUT UINT8 *HashValue\r
);\r
+\r
#endif\r
\r
/**\r
OUT UINT8 *HashValue\r
);\r
\r
+/**\r
+ Parallel hash function ParallelHash256, as defined in NIST's Special Publication 800-185,\r
+ published December 2016.\r
+\r
+ @param[in] Input Pointer to the input message (X).\r
+ @param[in] InputByteLen The number(>0) of input bytes provided for the input data.\r
+ @param[in] BlockSize The size of each block (B).\r
+ @param[out] Output Pointer to the output buffer.\r
+ @param[in] OutputByteLen The desired number of output bytes (L).\r
+ @param[in] Customization Pointer to the customization string (S).\r
+ @param[in] CustomByteLen The length of the customization string in bytes.\r
+\r
+ @retval TRUE ParallelHash256 digest computation succeeded.\r
+ @retval FALSE ParallelHash256 digest computation failed.\r
+ @retval FALSE This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+ParallelHash256HashAll (\r
+ IN CONST VOID *Input,\r
+ IN UINTN InputByteLen,\r
+ IN UINTN BlockSize,\r
+ OUT VOID *Output,\r
+ IN UINTN OutputByteLen,\r
+ IN CONST VOID *Customization,\r
+ IN UINTN CustomByteLen\r
+ );\r
+\r
/**\r
Retrieves the size, in bytes, of the context buffer required for SM3 hash operations.\r
\r
OUT UINT8 *HashValue\r
);\r
\r
-//=====================================================================================\r
+// =====================================================================================\r
// MAC (Message Authentication Code) Primitive\r
-//=====================================================================================\r
+// =====================================================================================\r
\r
/**\r
Allocates and initializes one HMAC_CTX context for subsequent HMAC-SHA256 use.\r
OUT UINT8 *HmacValue\r
);\r
\r
-//=====================================================================================\r
+/**\r
+ Computes the HMAC-SHA256 digest of a input data buffer.\r
+\r
+ This function performs the HMAC-SHA256 digest of a given data buffer, and places\r
+ the digest value into the specified memory.\r
+\r
+ If this interface is not supported, then return FALSE.\r
+\r
+ @param[in] Data Pointer to the buffer containing the data to be digested.\r
+ @param[in] DataSize Size of Data buffer in bytes.\r
+ @param[in] Key Pointer to the user-supplied key.\r
+ @param[in] KeySize Key size in bytes.\r
+ @param[out] HashValue Pointer to a buffer that receives the HMAC-SHA256 digest\r
+ value (32 bytes).\r
+\r
+ @retval TRUE HMAC-SHA256 digest computation succeeded.\r
+ @retval FALSE HMAC-SHA256 digest computation failed.\r
+ @retval FALSE This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HmacSha256All (\r
+ IN CONST VOID *Data,\r
+ IN UINTN DataSize,\r
+ IN CONST UINT8 *Key,\r
+ IN UINTN KeySize,\r
+ OUT UINT8 *HmacValue\r
+ );\r
+\r
+/**\r
+ Allocates and initializes one HMAC_CTX context for subsequent HMAC-SHA384 use.\r
+\r
+ @return Pointer to the HMAC_CTX context that has been initialized.\r
+ If the allocations fails, HmacSha384New() returns NULL.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+HmacSha384New (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Release the specified HMAC_CTX context.\r
+\r
+ @param[in] HmacSha384Ctx Pointer to the HMAC_CTX context to be released.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+HmacSha384Free (\r
+ IN VOID *HmacSha384Ctx\r
+ );\r
+\r
+/**\r
+ Set user-supplied key for subsequent use. It must be done before any\r
+ calling to HmacSha384Update().\r
+\r
+ If HmacSha384Context is NULL, then return FALSE.\r
+ If this interface is not supported, then return FALSE.\r
+\r
+ @param[out] HmacSha384Context Pointer to HMAC-SHA384 context.\r
+ @param[in] Key Pointer to the user-supplied key.\r
+ @param[in] KeySize Key size in bytes.\r
+\r
+ @retval TRUE The Key is set successfully.\r
+ @retval FALSE The Key is set unsuccessfully.\r
+ @retval FALSE This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HmacSha384SetKey (\r
+ OUT VOID *HmacSha384Context,\r
+ IN CONST UINT8 *Key,\r
+ IN UINTN KeySize\r
+ );\r
+\r
+/**\r
+ Makes a copy of an existing HMAC-SHA384 context.\r
+\r
+ If HmacSha384Context is NULL, then return FALSE.\r
+ If NewHmacSha384Context is NULL, then return FALSE.\r
+ If this interface is not supported, then return FALSE.\r
+\r
+ @param[in] HmacSha384Context Pointer to HMAC-SHA384 context being copied.\r
+ @param[out] NewHmacSha384Context Pointer to new HMAC-SHA384 context.\r
+\r
+ @retval TRUE HMAC-SHA384 context copy succeeded.\r
+ @retval FALSE HMAC-SHA384 context copy failed.\r
+ @retval FALSE This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HmacSha384Duplicate (\r
+ IN CONST VOID *HmacSha384Context,\r
+ OUT VOID *NewHmacSha384Context\r
+ );\r
+\r
+/**\r
+ Digests the input data and updates HMAC-SHA384 context.\r
+\r
+ This function performs HMAC-SHA384 digest on a data buffer of the specified size.\r
+ It can be called multiple times to compute the digest of long or discontinuous data streams.\r
+ HMAC-SHA384 context should be initialized by HmacSha384New(), and should not be finalized\r
+ by HmacSha384Final(). Behavior with invalid context is undefined.\r
+\r
+ If HmacSha384Context is NULL, then return FALSE.\r
+ If this interface is not supported, then return FALSE.\r
+\r
+ @param[in, out] HmacSha384Context Pointer to the HMAC-SHA384 context.\r
+ @param[in] Data Pointer to the buffer containing the data to be digested.\r
+ @param[in] DataSize Size of Data buffer in bytes.\r
+\r
+ @retval TRUE HMAC-SHA384 data digest succeeded.\r
+ @retval FALSE HMAC-SHA384 data digest failed.\r
+ @retval FALSE This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HmacSha384Update (\r
+ IN OUT VOID *HmacSha384Context,\r
+ IN CONST VOID *Data,\r
+ IN UINTN DataSize\r
+ );\r
+\r
+/**\r
+ Completes computation of the HMAC-SHA384 digest value.\r
+\r
+ This function completes HMAC-SHA384 hash computation and retrieves the digest value into\r
+ the specified memory. After this function has been called, the HMAC-SHA384 context cannot\r
+ be used again.\r
+ HMAC-SHA384 context should be initialized by HmacSha384New(), and should not be finalized\r
+ by HmacSha384Final(). Behavior with invalid HMAC-SHA384 context is undefined.\r
+\r
+ If HmacSha384Context is NULL, then return FALSE.\r
+ If HmacValue is NULL, then return FALSE.\r
+ If this interface is not supported, then return FALSE.\r
+\r
+ @param[in, out] HmacSha384Context Pointer to the HMAC-SHA384 context.\r
+ @param[out] HmacValue Pointer to a buffer that receives the HMAC-SHA384 digest\r
+ value (48 bytes).\r
+\r
+ @retval TRUE HMAC-SHA384 digest computation succeeded.\r
+ @retval FALSE HMAC-SHA384 digest computation failed.\r
+ @retval FALSE This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HmacSha384Final (\r
+ IN OUT VOID *HmacSha384Context,\r
+ OUT UINT8 *HmacValue\r
+ );\r
+\r
+/**\r
+ Computes the HMAC-SHA384 digest of a input data buffer.\r
+\r
+ This function performs the HMAC-SHA384 digest of a given data buffer, and places\r
+ the digest value into the specified memory.\r
+\r
+ If this interface is not supported, then return FALSE.\r
+\r
+ @param[in] Data Pointer to the buffer containing the data to be digested.\r
+ @param[in] DataSize Size of Data buffer in bytes.\r
+ @param[in] Key Pointer to the user-supplied key.\r
+ @param[in] KeySize Key size in bytes.\r
+ @param[out] HashValue Pointer to a buffer that receives the HMAC-SHA384 digest\r
+ value (48 bytes).\r
+\r
+ @retval TRUE HMAC-SHA384 digest computation succeeded.\r
+ @retval FALSE HMAC-SHA384 digest computation failed.\r
+ @retval FALSE This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HmacSha384All (\r
+ IN CONST VOID *Data,\r
+ IN UINTN DataSize,\r
+ IN CONST UINT8 *Key,\r
+ IN UINTN KeySize,\r
+ OUT UINT8 *HmacValue\r
+ );\r
+\r
+// =====================================================================================\r
// Symmetric Cryptography Primitive\r
-//=====================================================================================\r
+// =====================================================================================\r
\r
/**\r
Retrieves the size, in bytes, of the context buffer required for AES operations.\r
OUT UINT8 *Output\r
);\r
\r
-//=====================================================================================\r
+// =====================================================================================\r
+// Authenticated Encryption with Associated Data (AEAD) Cryptography Primitive\r
+// =====================================================================================\r
+\r
+/**\r
+ Performs AEAD AES-GCM authenticated encryption on a data buffer and additional authenticated data (AAD).\r
+\r
+ IvSize must be 12, otherwise FALSE is returned.\r
+ KeySize must be 16, 24 or 32, otherwise FALSE is returned.\r
+ TagSize must be 12, 13, 14, 15, 16, otherwise FALSE is returned.\r
+\r
+ @param[in] Key Pointer to the encryption key.\r
+ @param[in] KeySize Size of the encryption key in bytes.\r
+ @param[in] Iv Pointer to the IV value.\r
+ @param[in] IvSize Size of the IV value in bytes.\r
+ @param[in] AData Pointer to the additional authenticated data (AAD).\r
+ @param[in] ADataSize Size of the additional authenticated data (AAD) in bytes.\r
+ @param[in] DataIn Pointer to the input data buffer to be encrypted.\r
+ @param[in] DataInSize Size of the input data buffer in bytes.\r
+ @param[out] TagOut Pointer to a buffer that receives the authentication tag output.\r
+ @param[in] TagSize Size of the authentication tag in bytes.\r
+ @param[out] DataOut Pointer to a buffer that receives the encryption output.\r
+ @param[out] DataOutSize Size of the output data buffer in bytes.\r
+\r
+ @retval TRUE AEAD AES-GCM authenticated encryption succeeded.\r
+ @retval FALSE AEAD AES-GCM authenticated encryption failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+AeadAesGcmEncrypt (\r
+ IN CONST UINT8 *Key,\r
+ IN UINTN KeySize,\r
+ IN CONST UINT8 *Iv,\r
+ IN UINTN IvSize,\r
+ IN CONST UINT8 *AData,\r
+ IN UINTN ADataSize,\r
+ IN CONST UINT8 *DataIn,\r
+ IN UINTN DataInSize,\r
+ OUT UINT8 *TagOut,\r
+ IN UINTN TagSize,\r
+ OUT UINT8 *DataOut,\r
+ OUT UINTN *DataOutSize\r
+ );\r
+\r
+/**\r
+ Performs AEAD AES-GCM authenticated decryption on a data buffer and additional authenticated data (AAD).\r
+\r
+ IvSize must be 12, otherwise FALSE is returned.\r
+ KeySize must be 16, 24 or 32, otherwise FALSE is returned.\r
+ TagSize must be 12, 13, 14, 15, 16, otherwise FALSE is returned.\r
+ If additional authenticated data verification fails, FALSE is returned.\r
+\r
+ @param[in] Key Pointer to the encryption key.\r
+ @param[in] KeySize Size of the encryption key in bytes.\r
+ @param[in] Iv Pointer to the IV value.\r
+ @param[in] IvSize Size of the IV value in bytes.\r
+ @param[in] AData Pointer to the additional authenticated data (AAD).\r
+ @param[in] ADataSize Size of the additional authenticated data (AAD) in bytes.\r
+ @param[in] DataIn Pointer to the input data buffer to be decrypted.\r
+ @param[in] DataInSize Size of the input data buffer in bytes.\r
+ @param[in] Tag Pointer to a buffer that contains the authentication tag.\r
+ @param[in] TagSize Size of the authentication tag in bytes.\r
+ @param[out] DataOut Pointer to a buffer that receives the decryption output.\r
+ @param[out] DataOutSize Size of the output data buffer in bytes.\r
+\r
+ @retval TRUE AEAD AES-GCM authenticated decryption succeeded.\r
+ @retval FALSE AEAD AES-GCM authenticated decryption failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+AeadAesGcmDecrypt (\r
+ IN CONST UINT8 *Key,\r
+ IN UINTN KeySize,\r
+ IN CONST UINT8 *Iv,\r
+ IN UINTN IvSize,\r
+ IN CONST UINT8 *AData,\r
+ IN UINTN ADataSize,\r
+ IN CONST UINT8 *DataIn,\r
+ IN UINTN DataInSize,\r
+ IN CONST UINT8 *Tag,\r
+ IN UINTN TagSize,\r
+ OUT UINT8 *DataOut,\r
+ OUT UINTN *DataOutSize\r
+ );\r
+\r
+// =====================================================================================\r
// Asymmetric Cryptography Primitive\r
-//=====================================================================================\r
+// =====================================================================================\r
\r
/**\r
Allocates and initializes one RSA context for subsequent use.\r
If Message is NULL, then return FALSE.\r
If MsgSize is zero or > INT_MAX, then return FALSE.\r
If DigestLen is NOT 32, 48 or 64, return FALSE.\r
- If SaltLen is < DigestLen, then return FALSE.\r
+ If SaltLen is not equal to DigestLen, then return FALSE.\r
If SigSize is large enough but Signature is NULL, then return FALSE.\r
If this interface is not supported, then return FALSE.\r
\r
Verifies the RSA signature with RSASSA-PSS signature scheme defined in RFC 8017.\r
Implementation determines salt length automatically from the signature encoding.\r
Mask generation function is the same as the message digest algorithm.\r
- Salt length should atleast be equal to digest length.\r
+ Salt length should be equal to digest length.\r
\r
@param[in] RsaContext Pointer to RSA context for signature verification.\r
@param[in] Message Pointer to octet message to be verified.\r
X509GetCommonName (\r
IN CONST UINT8 *Cert,\r
IN UINTN CertSize,\r
- OUT CHAR8 *CommonName, OPTIONAL\r
+ OUT CHAR8 *CommonName OPTIONAL,\r
IN OUT UINTN *CommonNameSize\r
);\r
\r
RETURN_STATUS\r
EFIAPI\r
X509GetOrganizationName (\r
- IN CONST UINT8 *Cert,\r
- IN UINTN CertSize,\r
- OUT CHAR8 *NameBuffer, OPTIONAL\r
- IN OUT UINTN *NameBufferSize\r
+ IN CONST UINT8 *Cert,\r
+ IN UINTN CertSize,\r
+ OUT CHAR8 *NameBuffer OPTIONAL,\r
+ IN OUT UINTN *NameBufferSize\r
);\r
\r
/**\r
IN UINTN PublicKeySize,\r
IN UINT8 *InData,\r
IN UINTN InDataSize,\r
- IN CONST UINT8 *PrngSeed, OPTIONAL\r
- IN UINTN PrngSeedSize, OPTIONAL\r
+ IN CONST UINT8 *PrngSeed OPTIONAL,\r
+ IN UINTN PrngSeedSize OPTIONAL,\r
OUT UINT8 **EncryptedData,\r
OUT UINTN *EncryptedDataSize\r
);\r
} EFI_CERT_DATA;\r
\r
typedef struct {\r
- UINT8 CertNumber; // Number of X.509 certificate.\r
- //EFI_CERT_DATA CertArray[]; // An array of X.509 certificate.\r
+ UINT8 CertNumber; // Number of X.509 certificate.\r
+ // EFI_CERT_DATA CertArray[]; // An array of X.509 certificate.\r
} EFI_CERT_STACK;\r
\r
#pragma pack()\r
VOID\r
EFIAPI\r
Pkcs7FreeSigners (\r
- IN UINT8 *Certs\r
+ IN UINT8 *Certs\r
);\r
\r
/**\r
OUT EFI_TIME *SigningTime\r
);\r
\r
-//=====================================================================================\r
+// =====================================================================================\r
// DH Key Exchange Primitive\r
-//=====================================================================================\r
+// =====================================================================================\r
\r
/**\r
Allocates and Initializes one Diffie-Hellman Context for subsequent use.\r
IN OUT UINTN *KeySize\r
);\r
\r
-//=====================================================================================\r
+// =====================================================================================\r
// Pseudo-Random Generation Primitive\r
-//=====================================================================================\r
+// =====================================================================================\r
\r
/**\r
Sets up the seed value for the pseudorandom number generator.\r
IN UINTN Size\r
);\r
\r
-//=====================================================================================\r
+// =====================================================================================\r
// Key Derivation Function Primitive\r
-//=====================================================================================\r
+// =====================================================================================\r
\r
/**\r
Derive key data using HMAC-SHA256 based KDF.\r
IN UINTN OutSize\r
);\r
\r
+/**\r
+ Derive SHA256 HMAC-based Extract key Derivation Function (HKDF).\r
+\r
+ @param[in] Key Pointer to the user-supplied key.\r
+ @param[in] KeySize key size in bytes.\r
+ @param[in] Salt Pointer to the salt(non-secret) value.\r
+ @param[in] SaltSize salt size in bytes.\r
+ @param[out] PrkOut Pointer to buffer to receive hkdf value.\r
+ @param[in] PrkOutSize size of hkdf bytes to generate.\r
+\r
+ @retval true Hkdf generated successfully.\r
+ @retval false Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha256Extract (\r
+ IN CONST UINT8 *Key,\r
+ IN UINTN KeySize,\r
+ IN CONST UINT8 *Salt,\r
+ IN UINTN SaltSize,\r
+ OUT UINT8 *PrkOut,\r
+ UINTN PrkOutSize\r
+ );\r
+\r
+/**\r
+ Derive SHA256 HMAC-based Expand Key Derivation Function (HKDF).\r
+\r
+ @param[in] Prk Pointer to the user-supplied key.\r
+ @param[in] PrkSize Key size in bytes.\r
+ @param[in] Info Pointer to the application specific info.\r
+ @param[in] InfoSize Info size in bytes.\r
+ @param[out] Out Pointer to buffer to receive hkdf value.\r
+ @param[in] OutSize Size of hkdf bytes to generate.\r
+\r
+ @retval TRUE Hkdf generated successfully.\r
+ @retval FALSE Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha256Expand (\r
+ IN CONST UINT8 *Prk,\r
+ IN UINTN PrkSize,\r
+ IN CONST UINT8 *Info,\r
+ IN UINTN InfoSize,\r
+ OUT UINT8 *Out,\r
+ IN UINTN OutSize\r
+ );\r
+\r
+/**\r
+ Derive SHA384 HMAC-based Extract-and-Expand Key Derivation Function (HKDF).\r
+\r
+ @param[in] Key Pointer to the user-supplied key.\r
+ @param[in] KeySize Key size in bytes.\r
+ @param[in] Salt Pointer to the salt(non-secret) value.\r
+ @param[in] SaltSize Salt size in bytes.\r
+ @param[in] Info Pointer to the application specific info.\r
+ @param[in] InfoSize Info size in bytes.\r
+ @param[out] Out Pointer to buffer to receive hkdf value.\r
+ @param[in] OutSize Size of hkdf bytes to generate.\r
+\r
+ @retval TRUE Hkdf generated successfully.\r
+ @retval FALSE Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha384ExtractAndExpand (\r
+ IN CONST UINT8 *Key,\r
+ IN UINTN KeySize,\r
+ IN CONST UINT8 *Salt,\r
+ IN UINTN SaltSize,\r
+ IN CONST UINT8 *Info,\r
+ IN UINTN InfoSize,\r
+ OUT UINT8 *Out,\r
+ IN UINTN OutSize\r
+ );\r
+\r
+/**\r
+ Derive SHA384 HMAC-based Extract key Derivation Function (HKDF).\r
+\r
+ @param[in] Key Pointer to the user-supplied key.\r
+ @param[in] KeySize key size in bytes.\r
+ @param[in] Salt Pointer to the salt(non-secret) value.\r
+ @param[in] SaltSize salt size in bytes.\r
+ @param[out] PrkOut Pointer to buffer to receive hkdf value.\r
+ @param[in] PrkOutSize size of hkdf bytes to generate.\r
+\r
+ @retval true Hkdf generated successfully.\r
+ @retval false Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha384Extract (\r
+ IN CONST UINT8 *Key,\r
+ IN UINTN KeySize,\r
+ IN CONST UINT8 *Salt,\r
+ IN UINTN SaltSize,\r
+ OUT UINT8 *PrkOut,\r
+ UINTN PrkOutSize\r
+ );\r
+\r
+/**\r
+ Derive SHA384 HMAC-based Expand Key Derivation Function (HKDF).\r
+\r
+ @param[in] Prk Pointer to the user-supplied key.\r
+ @param[in] PrkSize Key size in bytes.\r
+ @param[in] Info Pointer to the application specific info.\r
+ @param[in] InfoSize Info size in bytes.\r
+ @param[out] Out Pointer to buffer to receive hkdf value.\r
+ @param[in] OutSize Size of hkdf bytes to generate.\r
+\r
+ @retval TRUE Hkdf generated successfully.\r
+ @retval FALSE Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha384Expand (\r
+ IN CONST UINT8 *Prk,\r
+ IN UINTN PrkSize,\r
+ IN CONST UINT8 *Info,\r
+ IN UINTN InfoSize,\r
+ OUT UINT8 *Out,\r
+ IN UINTN OutSize\r
+ );\r
+\r
+// =====================================================================================\r
+// Big number primitives\r
+// =====================================================================================\r
+\r
+/**\r
+ Allocate new Big Number.\r
+\r
+ @retval New BigNum opaque structure or NULL on failure.\r
+**/\r
+VOID *\r
+EFIAPI\r
+BigNumInit (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Allocate new Big Number and assign the provided value to it.\r
+\r
+ @param[in] Buf Big endian encoded buffer.\r
+ @param[in] Len Buffer length.\r
+\r
+ @retval New BigNum opaque structure or NULL on failure.\r
+**/\r
+VOID *\r
+EFIAPI\r
+BigNumFromBin (\r
+ IN CONST UINT8 *Buf,\r
+ IN UINTN Len\r
+ );\r
+\r
+/**\r
+ Convert the absolute value of Bn into big-endian form and store it at Buf.\r
+ The Buf array should have at least BigNumBytes() in it.\r
+\r
+ @param[in] Bn Big number to convert.\r
+ @param[out] Buf Output buffer.\r
+\r
+ @retval The length of the big-endian number placed at Buf or -1 on error.\r
+**/\r
+INTN\r
+EFIAPI\r
+BigNumToBin (\r
+ IN CONST VOID *Bn,\r
+ OUT UINT8 *Buf\r
+ );\r
+\r
+/**\r
+ Free the Big Number.\r
+\r
+ @param[in] Bn Big number to free.\r
+ @param[in] Clear TRUE if the buffer should be cleared.\r
+**/\r
+VOID\r
+EFIAPI\r
+BigNumFree (\r
+ IN VOID *Bn,\r
+ IN BOOLEAN Clear\r
+ );\r
+\r
+/**\r
+ Calculate the sum of two Big Numbers.\r
+ Please note, all "out" Big number arguments should be properly initialized\r
+ by calling to BigNumInit() or BigNumFromBin() functions.\r
+\r
+ @param[in] BnA Big number.\r
+ @param[in] BnB Big number.\r
+ @param[out] BnRes The result of BnA + BnB.\r
+\r
+ @retval TRUE On success.\r
+ @retval FALSE Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BigNumAdd (\r
+ IN CONST VOID *BnA,\r
+ IN CONST VOID *BnB,\r
+ OUT VOID *BnRes\r
+ );\r
+\r
+/**\r
+ Subtract two Big Numbers.\r
+ Please note, all "out" Big number arguments should be properly initialized\r
+ by calling to BigNumInit() or BigNumFromBin() functions.\r
+\r
+ @param[in] BnA Big number.\r
+ @param[in] BnB Big number.\r
+ @param[out] BnRes The result of BnA - BnB.\r
+\r
+ @retval TRUE On success.\r
+ @retval FALSE Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BigNumSub (\r
+ IN CONST VOID *BnA,\r
+ IN CONST VOID *BnB,\r
+ OUT VOID *BnRes\r
+ );\r
+\r
+/**\r
+ Calculate remainder: BnRes = BnA % BnB.\r
+ Please note, all "out" Big number arguments should be properly initialized\r
+ by calling to BigNumInit() or BigNumFromBin() functions.\r
+\r
+ @param[in] BnA Big number.\r
+ @param[in] BnB Big number.\r
+ @param[out] BnRes The result of BnA % BnB.\r
+\r
+ @retval TRUE On success.\r
+ @retval FALSE Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BigNumMod (\r
+ IN CONST VOID *BnA,\r
+ IN CONST VOID *BnB,\r
+ OUT VOID *BnRes\r
+ );\r
+\r
+/**\r
+ Compute BnA to the BnP-th power modulo BnM.\r
+ Please note, all "out" Big number arguments should be properly initialized\r
+ by calling to BigNumInit() or BigNumFromBin() functions.\r
+\r
+ @param[in] BnA Big number.\r
+ @param[in] BnP Big number (power).\r
+ @param[in] BnM Big number (modulo).\r
+ @param[out] BnRes The result of (BnA ^ BnP) % BnM.\r
+\r
+ @retval TRUE On success.\r
+ @retval FALSE Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BigNumExpMod (\r
+ IN CONST VOID *BnA,\r
+ IN CONST VOID *BnP,\r
+ IN CONST VOID *BnM,\r
+ OUT VOID *BnRes\r
+ );\r
+\r
+/**\r
+ Compute BnA inverse modulo BnM.\r
+ Please note, all "out" Big number arguments should be properly initialized\r
+ by calling to BigNumInit() or BigNumFromBin() functions.\r
+\r
+ @param[in] BnA Big number.\r
+ @param[in] BnM Big number (modulo).\r
+ @param[out] BnRes The result, such that (BnA * BnRes) % BnM == 1.\r
+\r
+ @retval TRUE On success.\r
+ @retval FALSE Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BigNumInverseMod (\r
+ IN CONST VOID *BnA,\r
+ IN CONST VOID *BnM,\r
+ OUT VOID *BnRes\r
+ );\r
+\r
+/**\r
+ Divide two Big Numbers.\r
+ Please note, all "out" Big number arguments should be properly initialized\r
+ by calling to BigNumInit() or BigNumFromBin() functions.\r
+\r
+ @param[in] BnA Big number.\r
+ @param[in] BnB Big number.\r
+ @param[out] BnRes The result, such that BnA / BnB.\r
+\r
+ @retval TRUE On success.\r
+ @retval FALSE Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BigNumDiv (\r
+ IN CONST VOID *BnA,\r
+ IN CONST VOID *BnB,\r
+ OUT VOID *BnRes\r
+ );\r
+\r
+/**\r
+ Multiply two Big Numbers modulo BnM.\r
+ Please note, all "out" Big number arguments should be properly initialized\r
+ by calling to BigNumInit() or BigNumFromBin() functions.\r
+\r
+ @param[in] BnA Big number.\r
+ @param[in] BnB Big number.\r
+ @param[in] BnM Big number (modulo).\r
+ @param[out] BnRes The result, such that (BnA * BnB) % BnM.\r
+\r
+ @retval TRUE On success.\r
+ @retval FALSE Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BigNumMulMod (\r
+ IN CONST VOID *BnA,\r
+ IN CONST VOID *BnB,\r
+ IN CONST VOID *BnM,\r
+ OUT VOID *BnRes\r
+ );\r
+\r
+/**\r
+ Compare two Big Numbers.\r
+\r
+ @param[in] BnA Big number.\r
+ @param[in] BnB Big number.\r
+\r
+ @retval 0 BnA == BnB.\r
+ @retval 1 BnA > BnB.\r
+ @retval -1 BnA < BnB.\r
+**/\r
+INTN\r
+EFIAPI\r
+BigNumCmp (\r
+ IN CONST VOID *BnA,\r
+ IN CONST VOID *BnB\r
+ );\r
+\r
+/**\r
+ Get number of bits in Bn.\r
+\r
+ @param[in] Bn Big number.\r
+\r
+ @retval Number of bits.\r
+**/\r
+\r
+UINTN\r
+EFIAPI\r
+BigNumBits (\r
+ IN CONST VOID *Bn\r
+ );\r
+\r
+/**\r
+ Get number of bytes in Bn.\r
+\r
+ @param[in] Bn Big number.\r
+\r
+ @retval Number of bytes.\r
+**/\r
+UINTN\r
+EFIAPI\r
+BigNumBytes (\r
+ IN CONST VOID *Bn\r
+ );\r
+\r
+/**\r
+ Checks if Big Number equals to the given Num.\r
+\r
+ @param[in] Bn Big number.\r
+ @param[in] Num Number.\r
+\r
+ @retval TRUE iff Bn == Num.\r
+ @retval FALSE otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BigNumIsWord (\r
+ IN CONST VOID *Bn,\r
+ IN UINTN Num\r
+ );\r
+\r
+/**\r
+ Checks if Big Number is odd.\r
+\r
+ @param[in] Bn Big number.\r
+\r
+ @retval TRUE Bn is odd (Bn % 2 == 1).\r
+ @retval FALSE otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BigNumIsOdd (\r
+ IN CONST VOID *Bn\r
+ );\r
+\r
+/**\r
+ Copy Big number.\r
+\r
+ @param[out] BnDst Destination.\r
+ @param[in] BnSrc Source.\r
+\r
+ @retval BnDst on success.\r
+ @retval NULL otherwise.\r
+**/\r
+VOID *\r
+EFIAPI\r
+BigNumCopy (\r
+ OUT VOID *BnDst,\r
+ IN CONST VOID *BnSrc\r
+ );\r
+\r
+/**\r
+ Get constant Big number with value of "1".\r
+ This may be used to save expensive allocations.\r
+\r
+ @retval Big Number with value of 1.\r
+**/\r
+CONST VOID *\r
+EFIAPI\r
+BigNumValueOne (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Shift right Big Number.\r
+ Please note, all "out" Big number arguments should be properly initialized\r
+ by calling to BigNumInit() or BigNumFromBin() functions.\r
+\r
+ @param[in] Bn Big number.\r
+ @param[in] N Number of bits to shift.\r
+ @param[out] BnRes The result.\r
+\r
+ @retval TRUE On success.\r
+ @retval FALSE Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BigNumRShift (\r
+ IN CONST VOID *Bn,\r
+ IN UINTN N,\r
+ OUT VOID *BnRes\r
+ );\r
+\r
+/**\r
+ Mark Big Number for constant time computations.\r
+ This function should be called before any constant time computations are\r
+ performed on the given Big number.\r
+\r
+ @param[in] Bn Big number.\r
+**/\r
+VOID\r
+EFIAPI\r
+BigNumConstTime (\r
+ IN VOID *Bn\r
+ );\r
+\r
+/**\r
+ Calculate square modulo.\r
+ Please note, all "out" Big number arguments should be properly initialized\r
+ by calling to BigNumInit() or BigNumFromBin() functions.\r
+\r
+ @param[in] BnA Big number.\r
+ @param[in] BnM Big number (modulo).\r
+ @param[out] BnRes The result, such that (BnA ^ 2) % BnM.\r
+\r
+ @retval TRUE On success.\r
+ @retval FALSE Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BigNumSqrMod (\r
+ IN CONST VOID *BnA,\r
+ IN CONST VOID *BnM,\r
+ OUT VOID *BnRes\r
+ );\r
+\r
+/**\r
+ Create new Big Number computation context. This is an opaque structure\r
+ which should be passed to any function that requires it. The BN context is\r
+ needed to optimize calculations and expensive allocations.\r
+\r
+ @retval Big Number context struct or NULL on failure.\r
+**/\r
+VOID *\r
+EFIAPI\r
+BigNumNewContext (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Free Big Number context that was allocated with BigNumNewContext().\r
+\r
+ @param[in] BnCtx Big number context to free.\r
+**/\r
+VOID\r
+EFIAPI\r
+BigNumContextFree (\r
+ IN VOID *BnCtx\r
+ );\r
+\r
+/**\r
+ Set Big Number to a given value.\r
+\r
+ @param[in] Bn Big number to set.\r
+ @param[in] Val Value to set.\r
+\r
+ @retval TRUE On success.\r
+ @retval FALSE Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BigNumSetUint (\r
+ IN VOID *Bn,\r
+ IN UINTN Val\r
+ );\r
+\r
+/**\r
+ Add two Big Numbers modulo BnM.\r
+\r
+ @param[in] BnA Big number.\r
+ @param[in] BnB Big number.\r
+ @param[in] BnM Big number (modulo).\r
+ @param[out] BnRes The result, such that (BnA + BnB) % BnM.\r
+\r
+ @retval TRUE On success.\r
+ @retval FALSE Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+BigNumAddMod (\r
+ IN CONST VOID *BnA,\r
+ IN CONST VOID *BnB,\r
+ IN CONST VOID *BnM,\r
+ OUT VOID *BnRes\r
+ );\r
+\r
#endif // __BASE_CRYPT_LIB_H__\r