]> git.proxmox.com Git - mirror_edk2.git/blobdiff - CryptoPkg/Private/Protocol/Crypto.h
CryptoPkg: Add BigNum API to DXE and protocol
[mirror_edk2.git] / CryptoPkg / Private / Protocol / Crypto.h
index a66be2c388d382c9c0b996e14e207a625dd61bb5..3bf37575e9b01a9752d5a54b89d50d20b617a3ab 100644 (file)
@@ -21,7 +21,7 @@
 /// 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
@@ -3888,6 +3888,407 @@ BOOLEAN
   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
@@ -4096,6 +4497,32 @@ struct _EDKII_CRYPTO_PROTOCOL {
   /// 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