/// the EDK II Crypto Protocol is extended, this version define must be\r
/// increased.\r
///\r
-#define EDKII_CRYPTO_VERSION 11\r
+#define EDKII_CRYPTO_VERSION 12\r
\r
///\r
/// EDK II Crypto Protocol forward declaration\r
OUT UINTN *DataOutSize\r
);\r
\r
+// =====================================================================================\r
+// Big Number Primitive\r
+// =====================================================================================\r
+\r
+/**\r
+ Allocate new Big Number.\r
+\r
+ @retval New BigNum opaque structure or NULL on failure.\r
+**/\r
+typedef\r
+VOID *\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_INIT)(\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 EDKII_CRYPTO_BIGNUM_ opaque structure or NULL on failure.\r
+**/\r
+typedef\r
+VOID *\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_FROM_BIN)(\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 EDKII_CRYPTO_BIGNUM_Bytes() 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
+typedef\r
+INTN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_TO_BIN)(\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
+typedef\r
+VOID\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_FREE)(\r
+ IN VOID *Bn,\r
+ IN BOOLEAN Clear\r
+ );\r
+\r
+/**\r
+ Calculate the sum of two Big Numbers.\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
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_ADD)(\r
+ IN CONST VOID *BnA,\r
+ IN CONST VOID *BnB,\r
+ OUT VOID *BnRes\r
+ );\r
+\r
+/**\r
+ Subtract two Big Numbers.\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
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_SUB)(\r
+ IN CONST VOID *BnA,\r
+ IN CONST VOID *BnB,\r
+ OUT VOID *BnRes\r
+ );\r
+\r
+/**\r
+ Calculate remainder: BnRes = BnA % BnB.\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
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_MOD)(\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
+\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
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_EXP_MOD)(\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
+\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
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_INVERSE_MOD)(\r
+ IN CONST VOID *BnA,\r
+ IN CONST VOID *BnM,\r
+ OUT VOID *BnRes\r
+ );\r
+\r
+/**\r
+ Divide two Big Numbers.\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
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_DIV)(\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
+\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
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_MUL_MOD)(\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
+typedef\r
+INTN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_CMP)(\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
+typedef\r
+UINTN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_BITS)(\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
+typedef\r
+UINTN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_BYTES)(\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
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_IS_WORD)(\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
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_IS_ODD)(\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
+typedef\r
+VOID *\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_COPY)(\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
+typedef\r
+CONST VOID *\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_VALUE_ONE)(\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
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_R_SHIFT)(\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
+typedef\r
+VOID\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_CONST_TIME)(\r
+ IN VOID *Bn\r
+ );\r
+\r
+/**\r
+ Calculate square modulo.\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
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_SQR_MOD)(\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
+typedef\r
+VOID *\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_NEW_CONTEXT)(\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Free Big Number context that was allocated with EDKII_CRYPTO_BIGNUM_NewContext().\r
+\r
+ @param[in] BnCtx Big number context to free.\r
+**/\r
+typedef\r
+VOID\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_CONTEXT_FREE)(\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
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_SET_UINT)(\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
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_BIGNUM_ADD_MOD)(\r
+ IN CONST VOID *BnA,\r
+ IN CONST VOID *BnB,\r
+ IN CONST VOID *BnM,\r
+ OUT VOID *BnRes\r
+ );\r
+\r
///\r
/// EDK II Crypto Protocol\r
///\r
/// AEAD AES-GCM\r
EDKII_AEAD_AES_GCM_ENCRYPT AeadAesGcmEncrypt;\r
EDKII_AEAD_AES_GCM_DECRYPT AeadAesGcmDecrypt;\r
+ /// BIGNUM\r
+ EDKII_CRYPTO_BIGNUM_INIT BigNumInit;\r
+ EDKII_CRYPTO_BIGNUM_FROM_BIN BigNumFromBin;\r
+ EDKII_CRYPTO_BIGNUM_TO_BIN BigNumToBin;\r
+ EDKII_CRYPTO_BIGNUM_FREE BigNumFree;\r
+ EDKII_CRYPTO_BIGNUM_ADD BigNumAdd;\r
+ EDKII_CRYPTO_BIGNUM_SUB BigNumSub;\r
+ EDKII_CRYPTO_BIGNUM_MOD BigNumMod;\r
+ EDKII_CRYPTO_BIGNUM_EXP_MOD BigNumExpMod;\r
+ EDKII_CRYPTO_BIGNUM_INVERSE_MOD BigNumInverseMod;\r
+ EDKII_CRYPTO_BIGNUM_DIV BigNumDiv;\r
+ EDKII_CRYPTO_BIGNUM_MUL_MOD BigNumMulMod;\r
+ EDKII_CRYPTO_BIGNUM_CMP BigNumCmp;\r
+ EDKII_CRYPTO_BIGNUM_BITS BigNumBits;\r
+ EDKII_CRYPTO_BIGNUM_BYTES BigNumBytes;\r
+ EDKII_CRYPTO_BIGNUM_IS_WORD BigNumIsWord;\r
+ EDKII_CRYPTO_BIGNUM_IS_ODD BigNumIsOdd;\r
+ EDKII_CRYPTO_BIGNUM_COPY BigNumCopy;\r
+ EDKII_CRYPTO_BIGNUM_VALUE_ONE BigNumValueOne;\r
+ EDKII_CRYPTO_BIGNUM_R_SHIFT BigNumRShift;\r
+ EDKII_CRYPTO_BIGNUM_CONST_TIME BigNumConstTime;\r
+ EDKII_CRYPTO_BIGNUM_SQR_MOD BigNumSqrMod;\r
+ EDKII_CRYPTO_BIGNUM_NEW_CONTEXT BigNumNewContext;\r
+ EDKII_CRYPTO_BIGNUM_CONTEXT_FREE BigNumContextFree;\r
+ EDKII_CRYPTO_BIGNUM_SET_UINT BigNumSetUint;\r
+ EDKII_CRYPTO_BIGNUM_ADD_MOD BigNumAddMod;\r
};\r
\r
extern GUID gEdkiiCryptoProtocolGuid;\r