]> git.proxmox.com Git - mirror_edk2.git/commitdiff
CryptoPkg: Add EC APIs to DXE and protocol
authorYi Li <yi1.li@intel.com>
Sun, 25 Sep 2022 09:26:19 +0000 (17:26 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Mon, 26 Sep 2022 07:03:56 +0000 (07:03 +0000)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3828

The implementation provides CryptEc library functions
for EFI Driveer and EFI BaseCrypt Protocol.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Xiaoyu Lu <xiaoyu1.lu@intel.com>
Cc: Guomin Jiang <guomin.jiang@intel.com>
Signed-off-by: Yi Li <yi1.li@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
CryptoPkg/CryptoPkg.dsc
CryptoPkg/Driver/Crypto.c
CryptoPkg/Include/Pcd/PcdCryptoServiceFamilyEnable.h
CryptoPkg/Library/BaseCryptLibOnProtocolPpi/CryptLib.c
CryptoPkg/Private/Protocol/Crypto.h

index 7034e8a4120a6e66f85a2b68379bfc98ef67db31..e4e7bc0dbfae8618833d7d5a67c9353a7d9b2ecc 100644 (file)
   gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.ParallelHash.Family                      | PCD_CRYPTO_SERVICE_ENABLE_FAMILY\r
   gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.AeadAesGcm.Family                        | PCD_CRYPTO_SERVICE_ENABLE_FAMILY\r
   gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.Bn.Family                                | PCD_CRYPTO_SERVICE_ENABLE_FAMILY\r
+  gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.Ec.Family                                | 0\r
 !endif\r
 \r
 !if $(CRYPTO_SERVICES) == MIN_PEI\r
index 9872b5bf7064a104e7474cdd6222d4e12df653ae..7a8266aabae910bac1f8d5da3465f3e27242b9ae 100644 (file)
@@ -5519,6 +5519,481 @@ CryptoServiceBigNumAddMod (
   return CALL_BASECRYPTLIB (Bn.Services.AddMod, BigNumAddMod, (BnA, BnB, BnM, BnRes), FALSE);\r
 }\r
 \r
+// =====================================================================================\r
+//    Basic Elliptic Curve Primitives\r
+// =====================================================================================\r
+\r
+/**\r
+  Initialize new opaque EcGroup object. This object represents an EC curve and\r
+  and is used for calculation within this group. This object should be freed\r
+  using EcGroupFree() function.\r
+\r
+  @param[in]  CryptoNid   Identifying number for the ECC curve (Defined in\r
+                          BaseCryptLib.h).\r
+\r
+  @retval EcGroup object  On success.\r
+  @retval NULL            On failure.\r
+**/\r
+VOID *\r
+EFIAPI\r
+CryptoServiceEcGroupInit (\r
+  IN UINTN  CryptoNid\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.GroupInit, EcGroupInit, (CryptoNid), NULL);\r
+}\r
+\r
+/**\r
+  Get EC curve parameters. While elliptic curve equation is Y^2 mod P = (X^3 + AX + B) Mod P.\r
+  This function will set the provided Big Number objects  to the corresponding\r
+  values. The caller needs to make sure all the "out" BigNumber parameters\r
+  are properly initialized.\r
+  @param[in]  EcGroup    EC group object.\r
+  @param[out] BnPrime    Group prime number.\r
+  @param[out] BnA        A coefficient.\r
+  @param[out] BnB        B coefficient.\r
+  @param[in]  BnCtx      BN context.\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceEcGroupGetCurve (\r
+  IN CONST VOID  *EcGroup,\r
+  OUT VOID       *BnPrime,\r
+  OUT VOID       *BnA,\r
+  OUT VOID       *BnB,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.GroupGetCurve, EcGroupGetCurve, (EcGroup, BnPrime, BnA, BnB, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  Get EC group order.\r
+  This function will set the provided Big Number object to the corresponding\r
+  value. The caller needs to make sure that the "out" BigNumber parameter\r
+  is properly initialized.\r
+\r
+  @param[in]  EcGroup   EC group object.\r
+  @param[out] BnOrder   Group prime number.\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceEcGroupGetOrder (\r
+  IN VOID   *EcGroup,\r
+  OUT VOID  *BnOrder\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.GroupGetOrder, EcGroupGetOrder, (EcGroup, BnOrder), FALSE);\r
+}\r
+\r
+/**\r
+  Free previously allocated EC group object using EcGroupInit().\r
+\r
+  @param[in]  EcGroup   EC group object to free.\r
+**/\r
+VOID\r
+EFIAPI\r
+CryptoServiceEcGroupFree (\r
+  IN VOID  *EcGroup\r
+  )\r
+{\r
+  CALL_VOID_BASECRYPTLIB (Ec.Services.GroupFree, EcGroupFree, (EcGroup));\r
+}\r
+\r
+/**\r
+  Initialize new opaque EC Point object. This object represents an EC point\r
+  within the given EC group (curve).\r
+\r
+  @param[in]  EC Group, properly initialized using EcGroupInit().\r
+\r
+  @retval EC Point object  On success.\r
+  @retval NULL             On failure.\r
+**/\r
+VOID *\r
+EFIAPI\r
+CryptoServiceEcPointInit (\r
+  IN CONST VOID  *EcGroup\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointInit, EcPointInit, (EcGroup), NULL);\r
+}\r
+\r
+/**\r
+  Free previously allocated EC Point object using EcPointInit().\r
+\r
+  @param[in]  EcPoint   EC Point to free.\r
+  @param[in]  Clear     TRUE iff the memory should be cleared.\r
+**/\r
+VOID\r
+EFIAPI\r
+CryptoServiceEcPointDeInit (\r
+  IN VOID     *EcPoint,\r
+  IN BOOLEAN  Clear\r
+  )\r
+{\r
+  CALL_VOID_BASECRYPTLIB (Ec.Services.PointDeInit, EcPointDeInit, (EcPoint, Clear));\r
+}\r
+\r
+/**\r
+  Get EC point affine (x,y) coordinates.\r
+  This function will set the provided Big Number objects to the corresponding\r
+  values. The caller needs to make sure all the "out" BigNumber parameters\r
+  are properly initialized.\r
+\r
+  @param[in]  EcGroup    EC group object.\r
+  @param[in]  EcPoint    EC point object.\r
+  @param[out] BnX        X coordinate.\r
+  @param[out] BnY        Y coordinate.\r
+  @param[in]  BnCtx      BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceEcPointGetAffineCoordinates (\r
+  IN CONST VOID  *EcGroup,\r
+  IN CONST VOID  *EcPoint,\r
+  OUT VOID       *BnX,\r
+  OUT VOID       *BnY,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointGetAffineCoordinates, EcPointGetAffineCoordinates, (EcGroup, EcPoint, BnX, BnY, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  Set EC point affine (x,y) coordinates.\r
+\r
+  @param[in]  EcGroup    EC group object.\r
+  @param[in]  EcPoint    EC point object.\r
+  @param[in]  BnX        X coordinate.\r
+  @param[in]  BnY        Y coordinate.\r
+  @param[in]  BnCtx      BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceEcPointSetAffineCoordinates (\r
+  IN CONST VOID  *EcGroup,\r
+  IN VOID        *EcPoint,\r
+  IN CONST VOID  *BnX,\r
+  IN CONST VOID  *BnY,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointSetAffineCoordinates, EcPointSetAffineCoordinates, (EcGroup, EcPoint, BnX, BnY, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  EC Point addition. EcPointResult = EcPointA + EcPointB.\r
+  @param[in]  EcGroup          EC group object.\r
+  @param[out] EcPointResult    EC point to hold the result. The point should\r
+                               be properly initialized.\r
+  @param[in]  EcPointA         EC Point.\r
+  @param[in]  EcPointB         EC Point.\r
+  @param[in]  BnCtx            BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceEcPointAdd (\r
+  IN CONST VOID  *EcGroup,\r
+  OUT VOID       *EcPointResult,\r
+  IN CONST VOID  *EcPointA,\r
+  IN CONST VOID  *EcPointB,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointAdd, EcPointAdd, (EcGroup, EcPointResult, EcPointA, EcPointB, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  Variable EC point multiplication. EcPointResult = EcPoint * BnPScalar.\r
+\r
+  @param[in]  EcGroup          EC group object.\r
+  @param[out] EcPointResult    EC point to hold the result. The point should\r
+                               be properly initialized.\r
+  @param[in]  EcPoint          EC Point.\r
+  @param[in]  BnPScalar        P Scalar.\r
+  @param[in]  BnCtx            BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceEcPointMul (\r
+  IN CONST VOID  *EcGroup,\r
+  OUT VOID       *EcPointResult,\r
+  IN CONST VOID  *EcPoint,\r
+  IN CONST VOID  *BnPScalar,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointMul, EcPointMul, (EcGroup, EcPointResult, EcPoint, BnPScalar, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  Calculate the inverse of the supplied EC point.\r
+\r
+  @param[in]     EcGroup   EC group object.\r
+  @param[in,out] EcPoint   EC point to invert.\r
+  @param[in]     BnCtx     BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceEcPointInvert (\r
+  IN CONST VOID  *EcGroup,\r
+  IN OUT VOID    *EcPoint,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointInvert, EcPointInvert, (EcGroup, EcPoint, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  Check if the supplied point is on EC curve.\r
+\r
+  @param[in]  EcGroup   EC group object.\r
+  @param[in]  EcPoint   EC point to check.\r
+  @param[in]  BnCtx     BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          On curve.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceEcPointIsOnCurve (\r
+  IN CONST VOID  *EcGroup,\r
+  IN CONST VOID  *EcPoint,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointIsOnCurve, EcPointIsOnCurve, (EcGroup, EcPoint, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  Check if the supplied point is at infinity.\r
+\r
+  @param[in]  EcGroup   EC group object.\r
+  @param[in]  EcPoint   EC point to check.\r
+\r
+  @retval TRUE          At infinity.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceEcPointIsAtInfinity (\r
+  IN CONST VOID  *EcGroup,\r
+  IN CONST VOID  *EcPoint\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointIsAtInfinity, EcPointIsAtInfinity, (EcGroup, EcPoint), FALSE);\r
+}\r
+\r
+/**\r
+  Check if EC points are equal.\r
+\r
+  @param[in]  EcGroup   EC group object.\r
+  @param[in]  EcPointA  EC point A.\r
+  @param[in]  EcPointB  EC point B.\r
+  @param[in]  BnCtx     BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          A == B.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceEcPointEqual (\r
+  IN CONST VOID  *EcGroup,\r
+  IN CONST VOID  *EcPointA,\r
+  IN CONST VOID  *EcPointB,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointEqual, EcPointEqual, (EcGroup, EcPointA, EcPointB, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  Set EC point compressed coordinates. Points can be described in terms of\r
+  their compressed coordinates. For a point (x, y), for any given value for x\r
+  such that the point is on the curve there will only ever be two possible\r
+  values for y. Therefore, a point can be set using this function where BnX is\r
+  the x coordinate and YBit is a value 0 or 1 to identify which of the two\r
+  possible values for y should be used.\r
+\r
+  @param[in]  EcGroup    EC group object.\r
+  @param[in]  EcPoint    EC Point.\r
+  @param[in]  BnX        X coordinate.\r
+  @param[in]  YBit       0 or 1 to identify which Y value is used.\r
+  @param[in]  BnCtx      BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceEcPointSetCompressedCoordinates (\r
+  IN CONST VOID  *EcGroup,\r
+  IN VOID        *EcPoint,\r
+  IN CONST VOID  *BnX,\r
+  IN UINT8       YBit,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointSetCompressedCoordinates, EcPointSetCompressedCoordinates, (EcGroup, EcPoint, BnX, YBit, BnCtx), FALSE);\r
+}\r
+\r
+// =====================================================================================\r
+//    Elliptic Curve Diffie Hellman Primitives\r
+// =====================================================================================\r
+\r
+/**\r
+  Allocates and Initializes one Elliptic Curve Context for subsequent use\r
+  with the NID.\r
+\r
+  @param[in]  Nid cipher NID\r
+  @return     Pointer to the Elliptic Curve Context that has been initialized.\r
+              If the allocations fails, EcNewByNid() returns NULL.\r
+**/\r
+VOID *\r
+EFIAPI\r
+CryptoServiceEcNewByNid (\r
+  IN UINTN  Nid\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.NewByNid, EcNewByNid, (Nid), NULL);\r
+}\r
+\r
+/**\r
+  Release the specified EC context.\r
+\r
+  @param[in]  EcContext  Pointer to the EC context to be released.\r
+**/\r
+VOID\r
+EFIAPI\r
+CryptoServiceEcFree (\r
+  IN  VOID  *EcContext\r
+  )\r
+{\r
+  CALL_VOID_BASECRYPTLIB (Ec.Services.Free, EcFree, (EcContext));\r
+}\r
+\r
+/**\r
+  Generates EC key and returns EC public key (X, Y), Please note, this function uses\r
+  pseudo random number generator. The caller must make sure RandomSeed()\r
+  function was properly called before.\r
+  The Ec context should be correctly initialized by EcNewByNid.\r
+  This function generates random secret, and computes the public key (X, Y), which is\r
+  returned via parameter Public, PublicSize.\r
+  X is the first half of Public with size being PublicSize / 2,\r
+  Y is the second half of Public with size being PublicSize / 2.\r
+  EC context is updated accordingly.\r
+  If the Public buffer is too small to hold the public X, Y, FALSE is returned and\r
+  PublicSize is set to the required buffer size to obtain the public X, Y.\r
+  For P-256, the PublicSize is 64. First 32-byte is X, Second 32-byte is Y.\r
+  For P-384, the PublicSize is 96. First 48-byte is X, Second 48-byte is Y.\r
+  For P-521, the PublicSize is 132. First 66-byte is X, Second 66-byte is Y.\r
+  If EcContext is NULL, then return FALSE.\r
+  If PublicSize is NULL, then return FALSE.\r
+  If PublicSize is large enough but Public is NULL, then return FALSE.\r
+  @param[in, out]  EcContext      Pointer to the EC context.\r
+  @param[out]      PublicKey      Pointer to t buffer to receive generated public X,Y.\r
+  @param[in, out]  PublicKeySize  On input, the size of Public buffer in bytes.\r
+                                  On output, the size of data returned in Public buffer in bytes.\r
+  @retval TRUE   EC public X,Y generation succeeded.\r
+  @retval FALSE  EC public X,Y generation failed.\r
+  @retval FALSE  PublicKeySize is not large enough.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceEcGenerateKey (\r
+  IN OUT  VOID   *EcContext,\r
+  OUT     UINT8  *PublicKey,\r
+  IN OUT  UINTN  *PublicKeySize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.GenerateKey, EcGenerateKey, (EcContext, PublicKey, PublicKeySize), FALSE);\r
+}\r
+\r
+/**\r
+  Gets the public key component from the established EC context.\r
+  The Ec context should be correctly initialized by EcNewByNid, and successfully\r
+  generate key pair from EcGenerateKey().\r
+  For P-256, the PublicSize is 64. First 32-byte is X, Second 32-byte is Y.\r
+  For P-384, the PublicSize is 96. First 48-byte is X, Second 48-byte is Y.\r
+  For P-521, the PublicSize is 132. First 66-byte is X, Second 66-byte is Y.\r
+  @param[in, out]  EcContext      Pointer to EC context being set.\r
+  @param[out]      PublicKey      Pointer to t buffer to receive generated public X,Y.\r
+  @param[in, out]  PublicKeySize  On input, the size of Public buffer in bytes.\r
+                                  On output, the size of data returned in Public buffer in bytes.\r
+  @retval  TRUE   EC key component was retrieved successfully.\r
+  @retval  FALSE  Invalid EC key component.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceEcGetPubKey (\r
+  IN OUT  VOID   *EcContext,\r
+  OUT     UINT8  *PublicKey,\r
+  IN OUT  UINTN  *PublicKeySize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.GetPubKey, EcGetPubKey, (EcContext, PublicKey, PublicKeySize), FALSE);\r
+}\r
+\r
+/**\r
+  Computes exchanged common key.\r
+  Given peer's public key (X, Y), this function computes the exchanged common key,\r
+  based on its own context including value of curve parameter and random secret.\r
+  X is the first half of PeerPublic with size being PeerPublicSize / 2,\r
+  Y is the second half of PeerPublic with size being PeerPublicSize / 2.\r
+  If EcContext is NULL, then return FALSE.\r
+  If PeerPublic is NULL, then return FALSE.\r
+  If PeerPublicSize is 0, then return FALSE.\r
+  If Key is NULL, then return FALSE.\r
+  If KeySize is not large enough, then return FALSE.\r
+  For P-256, the PeerPublicSize is 64. First 32-byte is X, Second 32-byte is Y.\r
+  For P-384, the PeerPublicSize is 96. First 48-byte is X, Second 48-byte is Y.\r
+  For P-521, the PeerPublicSize is 132. First 66-byte is X, Second 66-byte is Y.\r
+  @param[in, out]  EcContext          Pointer to the EC context.\r
+  @param[in]       PeerPublic         Pointer to the peer's public X,Y.\r
+  @param[in]       PeerPublicSize     Size of peer's public X,Y in bytes.\r
+  @param[in]       CompressFlag       Flag of PeerPublic is compressed or not.\r
+  @param[out]      Key                Pointer to the buffer to receive generated key.\r
+  @param[in, out]  KeySize            On input, the size of Key buffer in bytes.\r
+                                      On output, the size of data returned in Key buffer in bytes.\r
+  @retval TRUE   EC exchanged key generation succeeded.\r
+  @retval FALSE  EC exchanged key generation failed.\r
+  @retval FALSE  KeySize is not large enough.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceEcDhComputeKey (\r
+  IN OUT  VOID         *EcContext,\r
+  IN      CONST UINT8  *PeerPublic,\r
+  IN      UINTN        PeerPublicSize,\r
+  IN      CONST INT32  *CompressFlag,\r
+  OUT     UINT8        *Key,\r
+  IN OUT  UINTN        *KeySize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Ec.Services.DhComputeKey, EcDhComputeKey, (EcContext, PeerPublic, PeerPublicSize, CompressFlag, Key, KeySize), FALSE);\r
+}\r
+\r
 const EDKII_CRYPTO_PROTOCOL  mEdkiiCrypto = {\r
   /// Version\r
   CryptoServiceGetCryptoVersion,\r
@@ -5770,4 +6245,25 @@ const EDKII_CRYPTO_PROTOCOL  mEdkiiCrypto = {
   CryptoServiceBigNumContextFree,\r
   CryptoServiceBigNumSetUint,\r
   CryptoServiceBigNumAddMod,\r
+  /// EC\r
+  CryptoServiceEcGroupInit,\r
+  CryptoServiceEcGroupGetCurve,\r
+  CryptoServiceEcGroupGetOrder,\r
+  CryptoServiceEcGroupFree,\r
+  CryptoServiceEcPointInit,\r
+  CryptoServiceEcPointDeInit,\r
+  CryptoServiceEcPointGetAffineCoordinates,\r
+  CryptoServiceEcPointSetAffineCoordinates,\r
+  CryptoServiceEcPointAdd,\r
+  CryptoServiceEcPointMul,\r
+  CryptoServiceEcPointInvert,\r
+  CryptoServiceEcPointIsOnCurve,\r
+  CryptoServiceEcPointIsAtInfinity,\r
+  CryptoServiceEcPointEqual,\r
+  CryptoServiceEcPointSetCompressedCoordinates,\r
+  CryptoServiceEcNewByNid,\r
+  CryptoServiceEcFree,\r
+  CryptoServiceEcGenerateKey,\r
+  CryptoServiceEcGetPubKey,\r
+  CryptoServiceEcDhComputeKey,\r
 };\r
index 52b44ca4f8ad274cd392653f18ad18f6b5287e5b..45bafc21611fb06e895dbd7275b8a2e48d931fcc 100644 (file)
@@ -356,6 +356,31 @@ typedef struct {
     } Services;\r
     UINT32    Family;\r
   } Bn;\r
+  union {\r
+    struct {\r
+      UINT8    GroupInit                     : 1;\r
+      UINT8    GroupGetCurve                 : 1;\r
+      UINT8    GroupGetOrder                 : 1;\r
+      UINT8    GroupFree                     : 1;\r
+      UINT8    PointInit                     : 1;\r
+      UINT8    PointDeInit                   : 1;\r
+      UINT8    PointGetAffineCoordinates     : 1;\r
+      UINT8    PointSetAffineCoordinates     : 1;\r
+      UINT8    PointAdd                      : 1;\r
+      UINT8    PointMul                      : 1;\r
+      UINT8    PointInvert                   : 1;\r
+      UINT8    PointIsOnCurve                : 1;\r
+      UINT8    PointIsAtInfinity             : 1;\r
+      UINT8    PointEqual                    : 1;\r
+      UINT8    PointSetCompressedCoordinates : 1;\r
+      UINT8    NewByNid                      : 1;\r
+      UINT8    Free                          : 1;\r
+      UINT8    GenerateKey                   : 1;\r
+      UINT8    GetPubKey                     : 1;\r
+      UINT8    DhComputeKey                  : 1;\r
+    } Services;\r
+    UINT32    Family;\r
+  } Ec;\r
 } PCD_CRYPTO_SERVICE_FAMILY_ENABLE;\r
 \r
 #endif\r
index ce6981f0910fecb820f8b5c47cb1072d35e6185c..791e2ef599f29fe3f4a8d3890b6423d55fc6f88d 100644 (file)
@@ -4553,3 +4553,472 @@ BigNumAddMod (
 {\r
   CALL_CRYPTO_SERVICE (BigNumAddMod, (BnA, BnB, BnM, BnRes), FALSE);\r
 }\r
+\r
+/**\r
+  Initialize new opaque EcGroup object. This object represents an EC curve and\r
+  and is used for calculation within this group. This object should be freed\r
+  using EcGroupFree() function.\r
+\r
+  @param[in]  CryptoNid   Identifying number for the ECC curve (Defined in\r
+                          BaseCryptLib.h).\r
+\r
+  @retval EcGroup object  On success.\r
+  @retval NULL            On failure.\r
+**/\r
+VOID *\r
+EFIAPI\r
+EcGroupInit (\r
+  IN UINTN  CryptoNid\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcGroupInit, (CryptoNid), NULL);\r
+}\r
+\r
+/**\r
+  Get EC curve parameters. While elliptic curve equation is Y^2 mod P = (X^3 + AX + B) Mod P.\r
+  This function will set the provided Big Number objects  to the corresponding\r
+  values. The caller needs to make sure all the "out" BigNumber parameters\r
+  are properly initialized.\r
+\r
+  @param[in]  EcGroup    EC group object.\r
+  @param[out] BnPrime    Group prime number.\r
+  @param[out] BnA        A coefficient.\r
+  @param[out] BnB        B coefficient.\r
+  @param[in]  BnCtx      BN context.\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcGroupGetCurve (\r
+  IN CONST VOID  *EcGroup,\r
+  OUT VOID       *BnPrime,\r
+  OUT VOID       *BnA,\r
+  OUT VOID       *BnB,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcGroupGetCurve, (EcGroup, BnPrime, BnA, BnB, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  Get EC group order.\r
+  This function will set the provided Big Number object to the corresponding\r
+  value. The caller needs to make sure that the "out" BigNumber parameter\r
+  is properly initialized.\r
+\r
+  @param[in]  EcGroup   EC group object.\r
+  @param[out] BnOrder   Group prime number.\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcGroupGetOrder (\r
+  IN VOID   *EcGroup,\r
+  OUT VOID  *BnOrder\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcGroupGetOrder, (EcGroup, BnOrder), FALSE);\r
+}\r
+\r
+/**\r
+  Free previously allocated EC group object using EcGroupInit().\r
+\r
+  @param[in]  EcGroup   EC group object to free.\r
+**/\r
+VOID\r
+EFIAPI\r
+EcGroupFree (\r
+  IN VOID  *EcGroup\r
+  )\r
+{\r
+  CALL_VOID_CRYPTO_SERVICE (EcGroupFree, (EcGroup));\r
+}\r
+\r
+/**\r
+  Initialize new opaque EC Point object. This object represents an EC point\r
+  within the given EC group (curve).\r
+\r
+  @param[in]  EC Group, properly initialized using EcGroupInit().\r
+\r
+  @retval EC Point object  On success.\r
+  @retval NULL             On failure.\r
+**/\r
+VOID *\r
+EFIAPI\r
+EcPointInit (\r
+  IN CONST VOID  *EcGroup\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcPointInit, (EcGroup), NULL);\r
+}\r
+\r
+/**\r
+  Free previously allocated EC Point object using EcPointInit().\r
+\r
+  @param[in]  EcPoint   EC Point to free.\r
+  @param[in]  Clear     TRUE iff the memory should be cleared.\r
+**/\r
+VOID\r
+EFIAPI\r
+EcPointDeInit (\r
+  IN VOID     *EcPoint,\r
+  IN BOOLEAN  Clear\r
+  )\r
+{\r
+  CALL_VOID_CRYPTO_SERVICE (EcPointDeInit, (EcPoint, Clear));\r
+}\r
+\r
+/**\r
+  Get EC point affine (x,y) coordinates.\r
+  This function will set the provided Big Number objects to the corresponding\r
+  values. The caller needs to make sure all the "out" BigNumber parameters\r
+  are properly initialized.\r
+\r
+  @param[in]  EcGroup    EC group object.\r
+  @param[in]  EcPoint    EC point object.\r
+  @param[out] BnX        X coordinate.\r
+  @param[out] BnY        Y coordinate.\r
+  @param[in]  BnCtx      BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcPointGetAffineCoordinates (\r
+  IN CONST VOID  *EcGroup,\r
+  IN CONST VOID  *EcPoint,\r
+  OUT VOID       *BnX,\r
+  OUT VOID       *BnY,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcPointGetAffineCoordinates, (EcGroup, EcPoint, BnX, BnY, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  Set EC point affine (x,y) coordinates.\r
+\r
+  @param[in]  EcGroup    EC group object.\r
+  @param[in]  EcPoint    EC point object.\r
+  @param[in]  BnX        X coordinate.\r
+  @param[in]  BnY        Y coordinate.\r
+  @param[in]  BnCtx      BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcPointSetAffineCoordinates (\r
+  IN CONST VOID  *EcGroup,\r
+  IN VOID        *EcPoint,\r
+  IN CONST VOID  *BnX,\r
+  IN CONST VOID  *BnY,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcPointSetAffineCoordinates, (EcGroup, EcPoint, BnX, BnY, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  EC Point addition. EcPointResult = EcPointA + EcPointB.\r
+\r
+  @param[in]  EcGroup          EC group object.\r
+  @param[out] EcPointResult    EC point to hold the result. The point should\r
+                               be properly initialized.\r
+  @param[in]  EcPointA         EC Point.\r
+  @param[in]  EcPointB         EC Point.\r
+  @param[in]  BnCtx            BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcPointAdd (\r
+  IN CONST VOID  *EcGroup,\r
+  OUT VOID       *EcPointResult,\r
+  IN CONST VOID  *EcPointA,\r
+  IN CONST VOID  *EcPointB,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcPointAdd, (EcGroup, EcPointResult, EcPointA, EcPointB, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  Variable EC point multiplication. EcPointResult = EcPoint * BnPScalar.\r
+\r
+  @param[in]  EcGroup          EC group object.\r
+  @param[out] EcPointResult    EC point to hold the result. The point should\r
+                               be properly initialized.\r
+  @param[in]  EcPoint          EC Point.\r
+  @param[in]  BnPScalar        P Scalar.\r
+  @param[in]  BnCtx            BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcPointMul (\r
+  IN CONST VOID  *EcGroup,\r
+  OUT VOID       *EcPointResult,\r
+  IN CONST VOID  *EcPoint,\r
+  IN CONST VOID  *BnPScalar,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcPointMul, (EcGroup, EcPointResult, EcPoint, BnPScalar, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  Calculate the inverse of the supplied EC point.\r
+\r
+  @param[in]     EcGroup   EC group object.\r
+  @param[in,out] EcPoint   EC point to invert.\r
+  @param[in]     BnCtx     BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcPointInvert (\r
+  IN CONST VOID  *EcGroup,\r
+  IN OUT VOID    *EcPoint,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcPointInvert, (EcGroup, EcPoint, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  Check if the supplied point is on EC curve.\r
+\r
+  @param[in]  EcGroup   EC group object.\r
+  @param[in]  EcPoint   EC point to check.\r
+  @param[in]  BnCtx     BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          On curve.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcPointIsOnCurve (\r
+  IN CONST VOID  *EcGroup,\r
+  IN CONST VOID  *EcPoint,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcPointIsOnCurve, (EcGroup, EcPoint, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  Check if the supplied point is at infinity.\r
+\r
+  @param[in]  EcGroup   EC group object.\r
+  @param[in]  EcPoint   EC point to check.\r
+\r
+  @retval TRUE          At infinity.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcPointIsAtInfinity (\r
+  IN CONST VOID  *EcGroup,\r
+  IN CONST VOID  *EcPoint\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcPointIsAtInfinity, (EcGroup, EcPoint), FALSE);\r
+}\r
+\r
+/**\r
+  Check if EC points are equal.\r
+\r
+  @param[in]  EcGroup   EC group object.\r
+  @param[in]  EcPointA  EC point A.\r
+  @param[in]  EcPointB  EC point B.\r
+  @param[in]  BnCtx     BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          A == B.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcPointEqual (\r
+  IN CONST VOID  *EcGroup,\r
+  IN CONST VOID  *EcPointA,\r
+  IN CONST VOID  *EcPointB,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcPointEqual, (EcGroup, EcPointA, EcPointB, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  Set EC point compressed coordinates. Points can be described in terms of\r
+  their compressed coordinates. For a point (x, y), for any given value for x\r
+  such that the point is on the curve there will only ever be two possible\r
+  values for y. Therefore, a point can be set using this function where BnX is\r
+  the x coordinate and YBit is a value 0 or 1 to identify which of the two\r
+  possible values for y should be used.\r
+\r
+  @param[in]  EcGroup    EC group object.\r
+  @param[in]  EcPoint    EC Point.\r
+  @param[in]  BnX        X coordinate.\r
+  @param[in]  YBit       0 or 1 to identify which Y value is used.\r
+  @param[in]  BnCtx      BN context, created with BigNumNewContext().\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcPointSetCompressedCoordinates (\r
+  IN CONST VOID  *EcGroup,\r
+  IN VOID        *EcPoint,\r
+  IN CONST VOID  *BnX,\r
+  IN UINT8       YBit,\r
+  IN VOID        *BnCtx\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcPointSetCompressedCoordinates, (EcGroup, EcPoint, BnX, YBit, BnCtx), FALSE);\r
+}\r
+\r
+/**\r
+  Allocates and Initializes one Elliptic Curve Context for subsequent use\r
+  with the NID.\r
+\r
+  @param[in]  Nid cipher NID\r
+  @return     Pointer to the Elliptic Curve Context that has been initialized.\r
+              If the allocations fails, EcNewByNid() returns NULL.\r
+**/\r
+VOID *\r
+EFIAPI\r
+EcNewByNid (\r
+  IN UINTN  Nid\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcNewByNid, (Nid), NULL);\r
+}\r
+\r
+/**\r
+  Release the specified EC context.\r
+\r
+  @param[in]  EcContext  Pointer to the EC context to be released.\r
+**/\r
+VOID\r
+EFIAPI\r
+EcFree (\r
+  IN  VOID  *EcContext\r
+  )\r
+{\r
+  CALL_VOID_CRYPTO_SERVICE (EcFree, (EcContext));\r
+}\r
+\r
+/**\r
+  Generates EC key and returns EC public key (X, Y), Please note, this function uses\r
+  pseudo random number generator. The caller must make sure RandomSeed()\r
+  function was properly called before.\r
+  The Ec context should be correctly initialized by EcNewByNid.\r
+  This function generates random secret, and computes the public key (X, Y), which is\r
+  returned via parameter Public, PublicSize.\r
+  X is the first half of Public with size being PublicSize / 2,\r
+  Y is the second half of Public with size being PublicSize / 2.\r
+  EC context is updated accordingly.\r
+  If the Public buffer is too small to hold the public X, Y, FALSE is returned and\r
+  PublicSize is set to the required buffer size to obtain the public X, Y.\r
+  For P-256, the PublicSize is 64. First 32-byte is X, Second 32-byte is Y.\r
+  For P-384, the PublicSize is 96. First 48-byte is X, Second 48-byte is Y.\r
+  For P-521, the PublicSize is 132. First 66-byte is X, Second 66-byte is Y.\r
+  If EcContext is NULL, then return FALSE.\r
+  If PublicSize is NULL, then return FALSE.\r
+  If PublicSize is large enough but Public is NULL, then return FALSE.\r
+  @param[in, out]  EcContext      Pointer to the EC context.\r
+  @param[out]      PublicKey      Pointer to the buffer to receive generated public X,Y.\r
+  @param[in, out]  PublicKeySize  On input, the size of Public buffer in bytes.\r
+                                  On output, the size of data returned in Public buffer in bytes.\r
+  @retval TRUE   EC public X,Y generation succeeded.\r
+  @retval FALSE  EC public X,Y generation failed.\r
+  @retval FALSE  PublicKeySize is not large enough.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcGenerateKey (\r
+  IN OUT  VOID   *EcContext,\r
+  OUT     UINT8  *PublicKey,\r
+  IN OUT  UINTN  *PublicKeySize\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcGenerateKey, (EcContext, PublicKey, PublicKeySize), FALSE);\r
+}\r
+\r
+/**\r
+  Gets the public key component from the established EC context.\r
+  The Ec context should be correctly initialized by EcNewByNid, and successfully\r
+  generate key pair from EcGenerateKey().\r
+  For P-256, the PublicSize is 64. First 32-byte is X, Second 32-byte is Y.\r
+  For P-384, the PublicSize is 96. First 48-byte is X, Second 48-byte is Y.\r
+  For P-521, the PublicSize is 132. First 66-byte is X, Second 66-byte is Y.\r
+  @param[in, out]  EcContext      Pointer to EC context being set.\r
+  @param[out]      PublicKey      Pointer to t buffer to receive generated public X,Y.\r
+  @param[in, out]  PublicKeySize  On input, the size of Public buffer in bytes.\r
+                                  On output, the size of data returned in Public buffer in bytes.\r
+  @retval  TRUE   EC key component was retrieved successfully.\r
+  @retval  FALSE  Invalid EC key component.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcGetPubKey (\r
+  IN OUT  VOID   *EcContext,\r
+  OUT     UINT8  *PublicKey,\r
+  IN OUT  UINTN  *PublicKeySize\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcGetPubKey, (EcContext, PublicKey, PublicKeySize), FALSE);\r
+}\r
+\r
+/**\r
+  Computes exchanged common key.\r
+  Given peer's public key (X, Y), this function computes the exchanged common key,\r
+  based on its own context including value of curve parameter and random secret.\r
+  X is the first half of PeerPublic with size being PeerPublicSize / 2,\r
+  Y is the second half of PeerPublic with size being PeerPublicSize / 2.\r
+  If EcContext is NULL, then return FALSE.\r
+  If PeerPublic is NULL, then return FALSE.\r
+  If PeerPublicSize is 0, then return FALSE.\r
+  If Key is NULL, then return FALSE.\r
+  If KeySize is not large enough, then return FALSE.\r
+  For P-256, the PeerPublicSize is 64. First 32-byte is X, Second 32-byte is Y.\r
+  For P-384, the PeerPublicSize is 96. First 48-byte is X, Second 48-byte is Y.\r
+  For P-521, the PeerPublicSize is 132. First 66-byte is X, Second 66-byte is Y.\r
+  @param[in, out]  EcContext          Pointer to the EC context.\r
+  @param[in]       PeerPublic         Pointer to the peer's public X,Y.\r
+  @param[in]       PeerPublicSize     Size of peer's public X,Y in bytes.\r
+  @param[in]       CompressFlag       Flag of PeerPublic is compressed or not.\r
+  @param[out]      Key                Pointer to the buffer to receive generated key.\r
+  @param[in, out]  KeySize            On input, the size of Key buffer in bytes.\r
+                                      On output, the size of data returned in Key buffer in bytes.\r
+  @retval TRUE   EC exchanged key generation succeeded.\r
+  @retval FALSE  EC exchanged key generation failed.\r
+  @retval FALSE  KeySize is not large enough.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcDhComputeKey (\r
+  IN OUT  VOID         *EcContext,\r
+  IN      CONST UINT8  *PeerPublic,\r
+  IN      UINTN        PeerPublicSize,\r
+  IN      CONST INT32  *CompressFlag,\r
+  OUT     UINT8        *Key,\r
+  IN OUT  UINTN        *KeySize\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcDhComputeKey, (EcContext, PeerPublic, PeerPublicSize, CompressFlag, Key, KeySize), FALSE);\r
+}\r
index 3bf37575e9b01a9752d5a54b89d50d20b617a3ab..2f267c7f5577daed97f2ed8aea76f63b7806cbc9 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  12\r
+#define EDKII_CRYPTO_VERSION  13\r
 \r
 ///\r
 /// EDK II Crypto Protocol forward declaration\r
@@ -4289,240 +4289,671 @@ BOOLEAN
   OUT VOID *BnRes\r
   );\r
 \r
+/**\r
+  Initialize new opaque EcGroup object. This object represents an EC curve and\r
+  and is used for calculation within this group. This object should be freed\r
+  using EcGroupFree() function.\r
+\r
+  @param[in]  CryptoNid   Identifying number for the ECC curve (Defined in\r
+                          BaseCryptLib.h).\r
+\r
+  @retval EcGroup object  On success\r
+  @retval NULL            On failure\r
+**/\r
+typedef\r
+VOID *\r
+(EFIAPI *EDKII_CRYPTO_EC_GROUP_INIT)(\r
+  IN UINTN  CryptoNid\r
+  );\r
+\r
+/**\r
+  Get EC curve parameters. While elliptic curve equation is Y^2 mod P = (X^3 + AX + B) Mod P.\r
+  This function will set the provided Big Number objects  to the corresponding\r
+  values. The caller needs to make sure all the "out" BigNumber parameters\r
+  are properly initialized.\r
+\r
+  @param[in]  EcGroup    EC group object.\r
+  @param[out] BnPrime    Group prime number.\r
+  @param[out] BnA        A coefficient.\r
+  @param[out] BnB        B coefficient.\r
+  @param[in]  BnCtx      BN context.\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_EC_GROUP_GET_CURVE)(\r
+  IN CONST VOID *EcGroup,\r
+  OUT VOID *BnPrime,\r
+  OUT VOID *BnA,\r
+  OUT VOID *BnB,\r
+  IN VOID *BnCtx\r
+  );\r
+\r
+/**\r
+  Get EC group order.\r
+  This function will set the provided Big Number object to the corresponding\r
+  value. The caller needs to make sure that the "out" BigNumber parameter\r
+  is properly initialized.\r
+\r
+  @param[in]  EcGroup   EC group object\r
+  @param[out] BnOrder   Group prime number\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_EC_GROUP_GET_ORDER)(\r
+  IN VOID *EcGroup,\r
+  OUT VOID *BnOrder\r
+  );\r
+\r
+/**\r
+  Free previously allocated EC group object using EcGroupInit()\r
+\r
+  @param[in]  EcGroup   EC group object to free\r
+**/\r
+typedef\r
+VOID\r
+(EFIAPI *EDKII_CRYPTO_EC_GROUP_FREE)(\r
+  IN VOID *EcGroup\r
+  );\r
+\r
+/**\r
+  Initialize new opaque EC Point object. This object represents an EC point\r
+  within the given EC group (curve).\r
+\r
+  @param[in]  EC Group, properly initialized using EcGroupInit()\r
+\r
+  @retval EC Point object  On success\r
+  @retval NULL             On failure\r
+**/\r
+typedef\r
+VOID *\r
+(EFIAPI *EDKII_CRYPTO_EC_POINT_INIT)(\r
+  IN CONST VOID *EcGroup\r
+  );\r
+\r
+/**\r
+  Free previously allocated EC Point object using EcPointInit()\r
+\r
+  @param[in]  EcPoint   EC Point to free\r
+  @param[in]  Clear     TRUE iff the memory should be cleared\r
+**/\r
+typedef\r
+VOID\r
+(EFIAPI *EDKII_CRYPTO_EC_POINT_DE_INIT)(\r
+  IN VOID *EcPoint,\r
+  IN BOOLEAN Clear\r
+  );\r
+\r
+/**\r
+  Get EC point affine (x,y) coordinates.\r
+  This function will set the provided Big Number objects to the corresponding\r
+  values. The caller needs to make sure all the "out" BigNumber parameters\r
+  are properly initialized.\r
+\r
+  @param[in]  EcGroup    EC group object\r
+  @param[in]  EcPoint    EC point object\r
+  @param[out] BnX        X coordinate\r
+  @param[out] BnY        Y coordinate\r
+  @param[in]  BnCtx      BN context, created with BigNumNewContext()\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_EC_POINT_GET_AFFINE_COORDINATES)(\r
+  IN CONST VOID *EcGroup,\r
+  IN CONST VOID *EcPoint,\r
+  OUT VOID *BnX,\r
+  OUT VOID *BnY,\r
+  IN VOID *BnCtx\r
+  );\r
+\r
+/**\r
+  Set EC point affine (x,y) coordinates.\r
+\r
+  @param[in]  EcGroup    EC group object\r
+  @param[in]  EcPoint    EC point object\r
+  @param[in]  BnX        X coordinate\r
+  @param[in]  BnY        Y coordinate\r
+  @param[in]  BnCtx      BN context, created with BigNumNewContext()\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_EC_POINT_SET_AFFINE_COORDINATES)(\r
+  IN CONST VOID *EcGroup,\r
+  IN VOID *EcPoint,\r
+  IN CONST VOID *BnX,\r
+  IN CONST VOID *BnY,\r
+  IN VOID *BnCtx\r
+  );\r
+\r
+/**\r
+  EC Point addition. EcPointResult = EcPointA + EcPointB\r
+\r
+  @param[in]  EcGroup          EC group object\r
+  @param[out] EcPointResult    EC point to hold the result. The point should\r
+                               be properly initialized.\r
+  @param[in]  EcPointA         EC Point\r
+  @param[in]  EcPointB         EC Point\r
+  @param[in]  BnCtx            BN context, created with BigNumNewContext()\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_EC_POINT_ADD)(\r
+  IN CONST VOID *EcGroup,\r
+  OUT VOID *EcPointResult,\r
+  IN CONST VOID *EcPointA,\r
+  IN CONST VOID *EcPointB,\r
+  IN VOID *BnCtx\r
+  );\r
+\r
+/**\r
+  Variable EC point multiplication. EcPointResult = EcPoint * BnPScalar\r
+\r
+  @param[in]  EcGroup          EC group object\r
+  @param[out] EcPointResult    EC point to hold the result. The point should\r
+                               be properly initialized.\r
+  @param[in]  EcPoint          EC Point\r
+  @param[in]  BnPScalar        P Scalar\r
+  @param[in]  BnCtx            BN context, created with BigNumNewContext()\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_EC_POINT_MUL)(\r
+  IN CONST VOID *EcGroup,\r
+  OUT VOID *EcPointResult,\r
+  IN CONST VOID *EcPoint,\r
+  IN CONST VOID *BnPScalar,\r
+  IN VOID *BnCtx\r
+  );\r
+\r
+/**\r
+  Calculate the inverse of the supplied EC point.\r
+\r
+  @param[in]     EcGroup   EC group object\r
+  @param[in,out] EcPoint   EC point to invert\r
+  @param[in]     BnCtx     BN context, created with BigNumNewContext()\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_EC_POINT_INVERT)(\r
+  IN CONST VOID *EcGroup,\r
+  IN OUT VOID *EcPoint,\r
+  IN VOID *BnCtx\r
+  );\r
+\r
+/**\r
+  Check if the supplied point is on EC curve\r
+\r
+  @param[in]  EcGroup   EC group object\r
+  @param[in]  EcPoint   EC point to check\r
+  @param[in]  BnCtx     BN context, created with BigNumNewContext()\r
+\r
+  @retval TRUE           On curve\r
+  @retval FALSE          Otherwise\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_EC_POINT_IS_ON_CURVE)(\r
+  IN CONST VOID *EcGroup,\r
+  IN CONST VOID *EcPoint,\r
+  IN VOID *BnCtx\r
+  );\r
+\r
+/**\r
+  Check if the supplied point is at infinity\r
+\r
+  @param[in]  EcGroup   EC group object\r
+  @param[in]  EcPoint   EC point to check\r
+  @param[in]  BnCtx     BN context, created with BigNumNewContext()\r
+\r
+  @retval TRUE          At infinity\r
+  @retval FALSE         Otherwise\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_EC_POINT_IS_AT_INFINITY)(\r
+  IN CONST VOID *EcGroup,\r
+  IN CONST VOID *EcPoint\r
+  );\r
+\r
+/**\r
+  Check if EC points are equal\r
+\r
+  @param[in]  EcGroup   EC group object\r
+  @param[in]  EcPointA  EC point A\r
+  @param[in]  EcPointB  EC point B\r
+  @param[in]  BnCtx     BN context, created with BigNumNewContext()\r
+\r
+  @retval TRUE          A == B\r
+  @retval FALSE         Otherwise\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_EC_POINT_EQUAL)(\r
+  IN CONST VOID *EcGroup,\r
+  IN CONST VOID *EcPointA,\r
+  IN CONST VOID *EcPointB,\r
+  IN VOID *BnCtx\r
+  );\r
+\r
+/**\r
+  Set EC point compressed coordinates. Points can be described in terms of\r
+  their compressed coordinates. For a point (x, y), for any given value for x\r
+  such that the point is on the curve there will only ever be two possible\r
+  values for y. Therefore, a point can be set using this function where BnX is\r
+  the x coordinate and YBit is a value 0 or 1 to identify which of the two\r
+  possible values for y should be used.\r
+\r
+  @param[in]  EcGroup    EC group object\r
+  @param[in]  EcPoint    EC Point\r
+  @param[in]  BnX        X coordinate\r
+  @param[in]  YBit       0 or 1 to identify which Y value is used\r
+  @param[in]  BnCtx      BN context, created with BigNumNewContext()\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_EC_POINT_SET_COMPRESSED_COORDINATES)(\r
+  IN CONST VOID *EcGroup,\r
+  IN VOID *EcPoint,\r
+  IN CONST VOID *BnX,\r
+  IN UINT8 YBit,\r
+  IN VOID *BnCtx\r
+  );\r
+\r
+/**\r
+  Allocates and Initializes one Elliptic Curve Context for subsequent use\r
+  with the NID.\r
+\r
+  @param[in]  Nid cipher NID\r
+  @return     Pointer to the Elliptic Curve Context that has been initialized.\r
+              If the allocations fails, EcNewByNid() returns NULL.\r
+**/\r
+typedef\r
+VOID *\r
+(EFIAPI *EDKII_CRYPTO_EC_NEW_BY_NID)(\r
+  IN UINTN  Nid\r
+  );\r
+\r
+/**\r
+  Release the specified EC context.\r
+\r
+  @param[in]  EcContext  Pointer to the EC context to be released.\r
+**/\r
+typedef\r
+VOID\r
+(EFIAPI *EDKII_CRYPTO_EC_FREE)(\r
+  IN  VOID  *EcContext\r
+  );\r
+\r
+/**\r
+  Generates EC key and returns EC public key (X, Y), Please note, this function uses\r
+  pseudo random number generator. The caller must make sure RandomSeed()\r
+  function was properly called before.\r
+  The Ec context should be correctly initialized by EcNewByNid.\r
+  This function generates random secret, and computes the public key (X, Y), which is\r
+  returned via parameter Public, PublicSize.\r
+  X is the first half of Public with size being PublicSize / 2,\r
+  Y is the second half of Public with size being PublicSize / 2.\r
+  EC context is updated accordingly.\r
+  If the Public buffer is too small to hold the public X, Y, FALSE is returned and\r
+  PublicSize is set to the required buffer size to obtain the public X, Y.\r
+  For P-256, the PublicSize is 64. First 32-byte is X, Second 32-byte is Y.\r
+  For P-384, the PublicSize is 96. First 48-byte is X, Second 48-byte is Y.\r
+  For P-521, the PublicSize is 132. First 66-byte is X, Second 66-byte is Y.\r
+  If EcContext is NULL, then return FALSE.\r
+  If PublicSize is NULL, then return FALSE.\r
+  If PublicSize is large enough but Public is NULL, then return FALSE.\r
+  @param[in, out]  EcContext      Pointer to the EC context.\r
+  @param[out]      PublicKey      Pointer to t buffer to receive generated public X,Y.\r
+  @param[in, out]  PublicKeySize  On input, the size of Public buffer in bytes.\r
+                                  On output, the size of data returned in Public buffer in bytes.\r
+  @retval TRUE   EC public X,Y generation succeeded.\r
+  @retval FALSE  EC public X,Y generation failed.\r
+  @retval FALSE  PublicKeySize is not large enough.\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_EC_GENERATE_KEY)(\r
+  IN OUT  VOID   *EcContext,\r
+  OUT     UINT8  *PublicKey,\r
+  IN OUT  UINTN  *PublicKeySize\r
+  );\r
+\r
+/**\r
+  Gets the public key component from the established EC context.\r
+  The Ec context should be correctly initialized by EcNewByNid, and successfully\r
+  generate key pair from EcGenerateKey().\r
+  For P-256, the PublicSize is 64. First 32-byte is X, Second 32-byte is Y.\r
+  For P-384, the PublicSize is 96. First 48-byte is X, Second 48-byte is Y.\r
+  For P-521, the PublicSize is 132. First 66-byte is X, Second 66-byte is Y.\r
+  @param[in, out]  EcContext      Pointer to EC context being set.\r
+  @param[out]      PublicKey      Pointer to t buffer to receive generated public X,Y.\r
+  @param[in, out]  PublicKeySize  On input, the size of Public buffer in bytes.\r
+                                  On output, the size of data returned in Public buffer in bytes.\r
+  @retval  TRUE   EC key component was retrieved successfully.\r
+  @retval  FALSE  Invalid EC key component.\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_EC_GET_PUB_KEY)(\r
+  IN OUT  VOID   *EcContext,\r
+  OUT     UINT8  *PublicKey,\r
+  IN OUT  UINTN  *PublicKeySize\r
+  );\r
+\r
+/**\r
+  Computes exchanged common key.\r
+  Given peer's public key (X, Y), this function computes the exchanged common key,\r
+  based on its own context including value of curve parameter and random secret.\r
+  X is the first half of PeerPublic with size being PeerPublicSize / 2,\r
+  Y is the second half of PeerPublic with size being PeerPublicSize / 2.\r
+  If EcContext is NULL, then return FALSE.\r
+  If PeerPublic is NULL, then return FALSE.\r
+  If PeerPublicSize is 0, then return FALSE.\r
+  If Key is NULL, then return FALSE.\r
+  If KeySize is not large enough, then return FALSE.\r
+  For P-256, the PeerPublicSize is 64. First 32-byte is X, Second 32-byte is Y.\r
+  For P-384, the PeerPublicSize is 96. First 48-byte is X, Second 48-byte is Y.\r
+  For P-521, the PeerPublicSize is 132. First 66-byte is X, Second 66-byte is Y.\r
+  @param[in, out]  EcContext          Pointer to the EC context.\r
+  @param[in]       PeerPublic         Pointer to the peer's public X,Y.\r
+  @param[in]       PeerPublicSize     Size of peer's public X,Y in bytes.\r
+  @param[in]       CompressFlag       Flag of PeerPublic is compressed or not.\r
+  @param[out]      Key                Pointer to the buffer to receive generated key.\r
+  @param[in, out]  KeySize            On input, the size of Key buffer in bytes.\r
+                                      On output, the size of data returned in Key buffer in bytes.\r
+  @retval TRUE   EC exchanged key generation succeeded.\r
+  @retval FALSE  EC exchanged key generation failed.\r
+  @retval FALSE  KeySize is not large enough.\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EDKII_CRYPTO_EC_DH_COMPUTE_KEY)(\r
+  IN OUT  VOID         *EcContext,\r
+  IN      CONST UINT8  *PeerPublic,\r
+  IN      UINTN        PeerPublicSize,\r
+  IN      CONST INT32  *CompressFlag,\r
+  OUT     UINT8        *Key,\r
+  IN OUT  UINTN        *KeySize\r
+  );\r
+\r
 ///\r
 /// EDK II Crypto Protocol\r
 ///\r
 struct _EDKII_CRYPTO_PROTOCOL {\r
   /// Version\r
-  EDKII_CRYPTO_GET_VERSION                           GetVersion;\r
+  EDKII_CRYPTO_GET_VERSION                            GetVersion;\r
   /// HMAC MD5 - deprecated and unsupported\r
-  DEPRECATED_EDKII_CRYPTO_HMAC_MD5_NEW               DeprecatedHmacMd5New;\r
-  DEPRECATED_EDKII_CRYPTO_HMAC_MD5_FREE              DeprecatedHmacMd5Free;\r
-  DEPRECATED_EDKII_CRYPTO_HMAC_MD5_SET_KEY           DeprecatedHmacMd5SetKey;\r
-  DEPRECATED_EDKII_CRYPTO_HMAC_MD5_DUPLICATE         DeprecatedHmacMd5Duplicate;\r
-  DEPRECATED_EDKII_CRYPTO_HMAC_MD5_UPDATE            DeprecatedHmacMd5Update;\r
-  DEPRECATED_EDKII_CRYPTO_HMAC_MD5_FINAL             DeprecatedHmacMd5Final;\r
+  DEPRECATED_EDKII_CRYPTO_HMAC_MD5_NEW                DeprecatedHmacMd5New;\r
+  DEPRECATED_EDKII_CRYPTO_HMAC_MD5_FREE               DeprecatedHmacMd5Free;\r
+  DEPRECATED_EDKII_CRYPTO_HMAC_MD5_SET_KEY            DeprecatedHmacMd5SetKey;\r
+  DEPRECATED_EDKII_CRYPTO_HMAC_MD5_DUPLICATE          DeprecatedHmacMd5Duplicate;\r
+  DEPRECATED_EDKII_CRYPTO_HMAC_MD5_UPDATE             DeprecatedHmacMd5Update;\r
+  DEPRECATED_EDKII_CRYPTO_HMAC_MD5_FINAL              DeprecatedHmacMd5Final;\r
   /// HMAC SHA1 - deprecated and unsupported\r
-  DEPRECATED_EDKII_CRYPTO_HMAC_SHA1_NEW              DeprecatedHmacSha1New;\r
-  DEPRECATED_EDKII_CRYPTO_HMAC_SHA1_FREE             DeprecatedHmacSha1Free;\r
-  DEPRECATED_EDKII_CRYPTO_HMAC_SHA1_SET_KEY          DeprecatedHmacSha1SetKey;\r
-  DEPRECATED_EDKII_CRYPTO_HMAC_SHA1_DUPLICATE        DeprecatedHmacSha1Duplicate;\r
-  DEPRECATED_EDKII_CRYPTO_HMAC_SHA1_UPDATE           DeprecatedHmacSha1Update;\r
-  DEPRECATED_EDKII_CRYPTO_HMAC_SHA1_FINAL            DeprecatedHmacSha1Final;\r
+  DEPRECATED_EDKII_CRYPTO_HMAC_SHA1_NEW               DeprecatedHmacSha1New;\r
+  DEPRECATED_EDKII_CRYPTO_HMAC_SHA1_FREE              DeprecatedHmacSha1Free;\r
+  DEPRECATED_EDKII_CRYPTO_HMAC_SHA1_SET_KEY           DeprecatedHmacSha1SetKey;\r
+  DEPRECATED_EDKII_CRYPTO_HMAC_SHA1_DUPLICATE         DeprecatedHmacSha1Duplicate;\r
+  DEPRECATED_EDKII_CRYPTO_HMAC_SHA1_UPDATE            DeprecatedHmacSha1Update;\r
+  DEPRECATED_EDKII_CRYPTO_HMAC_SHA1_FINAL             DeprecatedHmacSha1Final;\r
   /// HMAC SHA256\r
-  EDKII_CRYPTO_HMAC_SHA256_NEW                       HmacSha256New;\r
-  EDKII_CRYPTO_HMAC_SHA256_FREE                      HmacSha256Free;\r
-  EDKII_CRYPTO_HMAC_SHA256_SET_KEY                   HmacSha256SetKey;\r
-  EDKII_CRYPTO_HMAC_SHA256_DUPLICATE                 HmacSha256Duplicate;\r
-  EDKII_CRYPTO_HMAC_SHA256_UPDATE                    HmacSha256Update;\r
-  EDKII_CRYPTO_HMAC_SHA256_FINAL                     HmacSha256Final;\r
+  EDKII_CRYPTO_HMAC_SHA256_NEW                        HmacSha256New;\r
+  EDKII_CRYPTO_HMAC_SHA256_FREE                       HmacSha256Free;\r
+  EDKII_CRYPTO_HMAC_SHA256_SET_KEY                    HmacSha256SetKey;\r
+  EDKII_CRYPTO_HMAC_SHA256_DUPLICATE                  HmacSha256Duplicate;\r
+  EDKII_CRYPTO_HMAC_SHA256_UPDATE                     HmacSha256Update;\r
+  EDKII_CRYPTO_HMAC_SHA256_FINAL                      HmacSha256Final;\r
   /// Md4 - deprecated and unsupported\r
-  DEPRECATED_EDKII_CRYPTO_MD4_GET_CONTEXT_SIZE       DeprecatedMd4GetContextSize;\r
-  DEPRECATED_EDKII_CRYPTO_MD4_INIT                   DeprecatedMd4Init;\r
-  DEPRECATED_EDKII_CRYPTO_MD4_DUPLICATE              DeprecatedMd4Duplicate;\r
-  DEPRECATED_EDKII_CRYPTO_MD4_UPDATE                 DeprecatedMd4Update;\r
-  DEPRECATED_EDKII_CRYPTO_MD4_FINAL                  DeprecatedMd4Final;\r
-  DEPRECATED_EDKII_CRYPTO_MD4_HASH_ALL               DeprecatedMd4HashAll;\r
+  DEPRECATED_EDKII_CRYPTO_MD4_GET_CONTEXT_SIZE        DeprecatedMd4GetContextSize;\r
+  DEPRECATED_EDKII_CRYPTO_MD4_INIT                    DeprecatedMd4Init;\r
+  DEPRECATED_EDKII_CRYPTO_MD4_DUPLICATE               DeprecatedMd4Duplicate;\r
+  DEPRECATED_EDKII_CRYPTO_MD4_UPDATE                  DeprecatedMd4Update;\r
+  DEPRECATED_EDKII_CRYPTO_MD4_FINAL                   DeprecatedMd4Final;\r
+  DEPRECATED_EDKII_CRYPTO_MD4_HASH_ALL                DeprecatedMd4HashAll;\r
   /// Md5\r
-  EDKII_CRYPTO_MD5_GET_CONTEXT_SIZE                  Md5GetContextSize;\r
-  EDKII_CRYPTO_MD5_INIT                              Md5Init;\r
-  EDKII_CRYPTO_MD5_DUPLICATE                         Md5Duplicate;\r
-  EDKII_CRYPTO_MD5_UPDATE                            Md5Update;\r
-  EDKII_CRYPTO_MD5_FINAL                             Md5Final;\r
-  EDKII_CRYPTO_MD5_HASH_ALL                          Md5HashAll;\r
+  EDKII_CRYPTO_MD5_GET_CONTEXT_SIZE                   Md5GetContextSize;\r
+  EDKII_CRYPTO_MD5_INIT                               Md5Init;\r
+  EDKII_CRYPTO_MD5_DUPLICATE                          Md5Duplicate;\r
+  EDKII_CRYPTO_MD5_UPDATE                             Md5Update;\r
+  EDKII_CRYPTO_MD5_FINAL                              Md5Final;\r
+  EDKII_CRYPTO_MD5_HASH_ALL                           Md5HashAll;\r
   /// Pkcs\r
-  EDKII_CRYPTO_PKCS1_ENCRYPT_V2                      Pkcs1v2Encrypt;\r
-  EDKII_CRYPTO_PKCS5_PW_HASH                         Pkcs5HashPassword;\r
-  EDKII_CRYPTO_PKCS7_VERIFY                          Pkcs7Verify;\r
-  EDKII_CRYPTO_PKCS7_VERIFY_EKU                      VerifyEKUsInPkcs7Signature;\r
-  EDKII_CRYPTO_PKCS7_GET_SIGNERS                     Pkcs7GetSigners;\r
-  EDKII_CRYPTO_PKCS7_FREE_SIGNERS                    Pkcs7FreeSigners;\r
-  EDKII_CRYPTO_PKCS7_SIGN                            Pkcs7Sign;\r
-  EDKII_CRYPTO_PKCS7_GET_ATTACHED_CONTENT            Pkcs7GetAttachedContent;\r
-  EDKII_CRYPTO_PKCS7_GET_CERTIFICATES_LIST           Pkcs7GetCertificatesList;\r
-  EDKII_CRYPTO_AUTHENTICODE_VERIFY                   AuthenticodeVerify;\r
-  EDKII_CRYPTO_IMAGE_TIMESTAMP_VERIFY                ImageTimestampVerify;\r
+  EDKII_CRYPTO_PKCS1_ENCRYPT_V2                       Pkcs1v2Encrypt;\r
+  EDKII_CRYPTO_PKCS5_PW_HASH                          Pkcs5HashPassword;\r
+  EDKII_CRYPTO_PKCS7_VERIFY                           Pkcs7Verify;\r
+  EDKII_CRYPTO_PKCS7_VERIFY_EKU                       VerifyEKUsInPkcs7Signature;\r
+  EDKII_CRYPTO_PKCS7_GET_SIGNERS                      Pkcs7GetSigners;\r
+  EDKII_CRYPTO_PKCS7_FREE_SIGNERS                     Pkcs7FreeSigners;\r
+  EDKII_CRYPTO_PKCS7_SIGN                             Pkcs7Sign;\r
+  EDKII_CRYPTO_PKCS7_GET_ATTACHED_CONTENT             Pkcs7GetAttachedContent;\r
+  EDKII_CRYPTO_PKCS7_GET_CERTIFICATES_LIST            Pkcs7GetCertificatesList;\r
+  EDKII_CRYPTO_AUTHENTICODE_VERIFY                    AuthenticodeVerify;\r
+  EDKII_CRYPTO_IMAGE_TIMESTAMP_VERIFY                 ImageTimestampVerify;\r
   /// DH\r
-  EDKII_CRYPTO_DH_NEW                                DhNew;\r
-  EDKII_CRYPTO_DH_FREE                               DhFree;\r
-  EDKII_CRYPTO_DH_GENERATE_PARAMETER                 DhGenerateParameter;\r
-  EDKII_CRYPTO_DH_SET_PARAMETER                      DhSetParameter;\r
-  EDKII_CRYPTO_DH_GENERATE_KEY                       DhGenerateKey;\r
-  EDKII_CRYPTO_DH_COMPUTE_KEY                        DhComputeKey;\r
+  EDKII_CRYPTO_DH_NEW                                 DhNew;\r
+  EDKII_CRYPTO_DH_FREE                                DhFree;\r
+  EDKII_CRYPTO_DH_GENERATE_PARAMETER                  DhGenerateParameter;\r
+  EDKII_CRYPTO_DH_SET_PARAMETER                       DhSetParameter;\r
+  EDKII_CRYPTO_DH_GENERATE_KEY                        DhGenerateKey;\r
+  EDKII_CRYPTO_DH_COMPUTE_KEY                         DhComputeKey;\r
   /// Random\r
-  EDKII_CRYPTO_RANDOM_SEED                           RandomSeed;\r
-  EDKII_CRYPTO_RANDOM_BYTES                          RandomBytes;\r
+  EDKII_CRYPTO_RANDOM_SEED                            RandomSeed;\r
+  EDKII_CRYPTO_RANDOM_BYTES                           RandomBytes;\r
   /// RSA\r
-  EDKII_CRYPTO_RSA_VERIFY_PKCS1                      RsaVerifyPkcs1;\r
-  EDKII_CRYPTO_RSA_NEW                               RsaNew;\r
-  EDKII_CRYPTO_RSA_FREE                              RsaFree;\r
-  EDKII_CRYPTO_RSA_SET_KEY                           RsaSetKey;\r
-  EDKII_CRYPTO_RSA_GET_KEY                           RsaGetKey;\r
-  EDKII_CRYPTO_RSA_GENERATE_KEY                      RsaGenerateKey;\r
-  EDKII_CRYPTO_RSA_CHECK_KEY                         RsaCheckKey;\r
-  EDKII_CRYPTO_RSA_PKCS1_SIGN                        RsaPkcs1Sign;\r
-  EDKII_CRYPTO_RSA_PKCS1_VERIFY                      RsaPkcs1Verify;\r
-  EDKII_CRYPTO_RSA_GET_PRIVATE_KEY_FROM_PEM          RsaGetPrivateKeyFromPem;\r
-  EDKII_CRYPTO_RSA_GET_PUBLIC_KEY_FROM_X509          RsaGetPublicKeyFromX509;\r
+  EDKII_CRYPTO_RSA_VERIFY_PKCS1                       RsaVerifyPkcs1;\r
+  EDKII_CRYPTO_RSA_NEW                                RsaNew;\r
+  EDKII_CRYPTO_RSA_FREE                               RsaFree;\r
+  EDKII_CRYPTO_RSA_SET_KEY                            RsaSetKey;\r
+  EDKII_CRYPTO_RSA_GET_KEY                            RsaGetKey;\r
+  EDKII_CRYPTO_RSA_GENERATE_KEY                       RsaGenerateKey;\r
+  EDKII_CRYPTO_RSA_CHECK_KEY                          RsaCheckKey;\r
+  EDKII_CRYPTO_RSA_PKCS1_SIGN                         RsaPkcs1Sign;\r
+  EDKII_CRYPTO_RSA_PKCS1_VERIFY                       RsaPkcs1Verify;\r
+  EDKII_CRYPTO_RSA_GET_PRIVATE_KEY_FROM_PEM           RsaGetPrivateKeyFromPem;\r
+  EDKII_CRYPTO_RSA_GET_PUBLIC_KEY_FROM_X509           RsaGetPublicKeyFromX509;\r
   /// Sha1\r
-  EDKII_CRYPTO_SHA1_GET_CONTEXT_SIZE                 Sha1GetContextSize;\r
-  EDKII_CRYPTO_SHA1_INIT                             Sha1Init;\r
-  EDKII_CRYPTO_SHA1_DUPLICATE                        Sha1Duplicate;\r
-  EDKII_CRYPTO_SHA1_UPDATE                           Sha1Update;\r
-  EDKII_CRYPTO_SHA1_FINAL                            Sha1Final;\r
-  EDKII_CRYPTO_SHA1_HASH_ALL                         Sha1HashAll;\r
+  EDKII_CRYPTO_SHA1_GET_CONTEXT_SIZE                  Sha1GetContextSize;\r
+  EDKII_CRYPTO_SHA1_INIT                              Sha1Init;\r
+  EDKII_CRYPTO_SHA1_DUPLICATE                         Sha1Duplicate;\r
+  EDKII_CRYPTO_SHA1_UPDATE                            Sha1Update;\r
+  EDKII_CRYPTO_SHA1_FINAL                             Sha1Final;\r
+  EDKII_CRYPTO_SHA1_HASH_ALL                          Sha1HashAll;\r
   /// Sha256\r
-  EDKII_CRYPTO_SHA256_GET_CONTEXT_SIZE               Sha256GetContextSize;\r
-  EDKII_CRYPTO_SHA256_INIT                           Sha256Init;\r
-  EDKII_CRYPTO_SHA256_DUPLICATE                      Sha256Duplicate;\r
-  EDKII_CRYPTO_SHA256_UPDATE                         Sha256Update;\r
-  EDKII_CRYPTO_SHA256_FINAL                          Sha256Final;\r
-  EDKII_CRYPTO_SHA256_HASH_ALL                       Sha256HashAll;\r
+  EDKII_CRYPTO_SHA256_GET_CONTEXT_SIZE                Sha256GetContextSize;\r
+  EDKII_CRYPTO_SHA256_INIT                            Sha256Init;\r
+  EDKII_CRYPTO_SHA256_DUPLICATE                       Sha256Duplicate;\r
+  EDKII_CRYPTO_SHA256_UPDATE                          Sha256Update;\r
+  EDKII_CRYPTO_SHA256_FINAL                           Sha256Final;\r
+  EDKII_CRYPTO_SHA256_HASH_ALL                        Sha256HashAll;\r
   /// Sha384\r
-  EDKII_CRYPTO_SHA384_GET_CONTEXT_SIZE               Sha384GetContextSize;\r
-  EDKII_CRYPTO_SHA384_INIT                           Sha384Init;\r
-  EDKII_CRYPTO_SHA384_DUPLICATE                      Sha384Duplicate;\r
-  EDKII_CRYPTO_SHA384_UPDATE                         Sha384Update;\r
-  EDKII_CRYPTO_SHA384_FINAL                          Sha384Final;\r
-  EDKII_CRYPTO_SHA384_HASH_ALL                       Sha384HashAll;\r
+  EDKII_CRYPTO_SHA384_GET_CONTEXT_SIZE                Sha384GetContextSize;\r
+  EDKII_CRYPTO_SHA384_INIT                            Sha384Init;\r
+  EDKII_CRYPTO_SHA384_DUPLICATE                       Sha384Duplicate;\r
+  EDKII_CRYPTO_SHA384_UPDATE                          Sha384Update;\r
+  EDKII_CRYPTO_SHA384_FINAL                           Sha384Final;\r
+  EDKII_CRYPTO_SHA384_HASH_ALL                        Sha384HashAll;\r
   /// Sha512\r
-  EDKII_CRYPTO_SHA512_GET_CONTEXT_SIZE               Sha512GetContextSize;\r
-  EDKII_CRYPTO_SHA512_INIT                           Sha512Init;\r
-  EDKII_CRYPTO_SHA512_DUPLICATE                      Sha512Duplicate;\r
-  EDKII_CRYPTO_SHA512_UPDATE                         Sha512Update;\r
-  EDKII_CRYPTO_SHA512_FINAL                          Sha512Final;\r
-  EDKII_CRYPTO_SHA512_HASH_ALL                       Sha512HashAll;\r
+  EDKII_CRYPTO_SHA512_GET_CONTEXT_SIZE                Sha512GetContextSize;\r
+  EDKII_CRYPTO_SHA512_INIT                            Sha512Init;\r
+  EDKII_CRYPTO_SHA512_DUPLICATE                       Sha512Duplicate;\r
+  EDKII_CRYPTO_SHA512_UPDATE                          Sha512Update;\r
+  EDKII_CRYPTO_SHA512_FINAL                           Sha512Final;\r
+  EDKII_CRYPTO_SHA512_HASH_ALL                        Sha512HashAll;\r
   /// X509\r
-  EDKII_CRYPTO_X509_GET_SUBJECT_NAME                 X509GetSubjectName;\r
-  EDKII_CRYPTO_X509_GET_COMMON_NAME                  X509GetCommonName;\r
-  EDKII_CRYPTO_X509_GET_ORGANIZATION_NAME            X509GetOrganizationName;\r
-  EDKII_CRYPTO_X509_VERIFY_CERT                      X509VerifyCert;\r
-  EDKII_CRYPTO_X509_CONSTRUCT_CERTIFICATE            X509ConstructCertificate;\r
-  EDKII_CRYPTO_X509_CONSTRUCT_CERTIFICATE_STACK      X509ConstructCertificateStack;\r
-  EDKII_CRYPTO_X509_FREE                             X509Free;\r
-  EDKII_CRYPTO_X509_STACK_FREE                       X509StackFree;\r
-  EDKII_CRYPTO_X509_GET_TBS_CERT                     X509GetTBSCert;\r
+  EDKII_CRYPTO_X509_GET_SUBJECT_NAME                  X509GetSubjectName;\r
+  EDKII_CRYPTO_X509_GET_COMMON_NAME                   X509GetCommonName;\r
+  EDKII_CRYPTO_X509_GET_ORGANIZATION_NAME             X509GetOrganizationName;\r
+  EDKII_CRYPTO_X509_VERIFY_CERT                       X509VerifyCert;\r
+  EDKII_CRYPTO_X509_CONSTRUCT_CERTIFICATE             X509ConstructCertificate;\r
+  EDKII_CRYPTO_X509_CONSTRUCT_CERTIFICATE_STACK       X509ConstructCertificateStack;\r
+  EDKII_CRYPTO_X509_FREE                              X509Free;\r
+  EDKII_CRYPTO_X509_STACK_FREE                        X509StackFree;\r
+  EDKII_CRYPTO_X509_GET_TBS_CERT                      X509GetTBSCert;\r
   /// TDES - deprecated and unsupported\r
-  DEPRECATED_EDKII_CRYPTO_TDES_GET_CONTEXT_SIZE      DeprecatedTdesGetContextSize;\r
-  DEPRECATED_EDKII_CRYPTO_TDES_INIT                  DeprecatedTdesInit;\r
-  DEPRECATED_EDKII_CRYPTO_TDES_ECB_ENCRYPT           DeprecatedTdesEcbEncrypt;\r
-  DEPRECATED_EDKII_CRYPTO_TDES_ECB_DECRYPT           DeprecatedTdesEcbDecrypt;\r
-  DEPRECATED_EDKII_CRYPTO_TDES_CBC_ENCRYPT           DeprecatedTdesCbcEncrypt;\r
-  DEPRECATED_EDKII_CRYPTO_TDES_CBC_DECRYPT           DeprecatedTdesCbcDecrypt;\r
+  DEPRECATED_EDKII_CRYPTO_TDES_GET_CONTEXT_SIZE       DeprecatedTdesGetContextSize;\r
+  DEPRECATED_EDKII_CRYPTO_TDES_INIT                   DeprecatedTdesInit;\r
+  DEPRECATED_EDKII_CRYPTO_TDES_ECB_ENCRYPT            DeprecatedTdesEcbEncrypt;\r
+  DEPRECATED_EDKII_CRYPTO_TDES_ECB_DECRYPT            DeprecatedTdesEcbDecrypt;\r
+  DEPRECATED_EDKII_CRYPTO_TDES_CBC_ENCRYPT            DeprecatedTdesCbcEncrypt;\r
+  DEPRECATED_EDKII_CRYPTO_TDES_CBC_DECRYPT            DeprecatedTdesCbcDecrypt;\r
   /// AES - ECB Mode is deprecated and unsupported\r
-  EDKII_CRYPTO_AES_GET_CONTEXT_SIZE                  AesGetContextSize;\r
-  EDKII_CRYPTO_AES_INIT                              AesInit;\r
-  DEPRECATED_EDKII_CRYPTO_AES_ECB_ENCRYPT            DeprecatedAesEcbEncrypt;\r
-  DEPRECATED_EDKII_CRYPTO_AES_ECB_DECRYPT            DeprecatedAesEcbDecrypt;\r
-  EDKII_CRYPTO_AES_CBC_ENCRYPT                       AesCbcEncrypt;\r
-  EDKII_CRYPTO_AES_CBC_DECRYPT                       AesCbcDecrypt;\r
+  EDKII_CRYPTO_AES_GET_CONTEXT_SIZE                   AesGetContextSize;\r
+  EDKII_CRYPTO_AES_INIT                               AesInit;\r
+  DEPRECATED_EDKII_CRYPTO_AES_ECB_ENCRYPT             DeprecatedAesEcbEncrypt;\r
+  DEPRECATED_EDKII_CRYPTO_AES_ECB_DECRYPT             DeprecatedAesEcbDecrypt;\r
+  EDKII_CRYPTO_AES_CBC_ENCRYPT                        AesCbcEncrypt;\r
+  EDKII_CRYPTO_AES_CBC_DECRYPT                        AesCbcDecrypt;\r
   /// Arc4 - deprecated and unsupported\r
-  DEPRECATED_EDKII_CRYPTO_ARC4_GET_CONTEXT_SIZE      DeprecatedArc4GetContextSize;\r
-  DEPRECATED_EDKII_CRYPTO_ARC4_INIT                  DeprecatedArc4Init;\r
-  DEPRECATED_EDKII_CRYPTO_ARC4_ENCRYPT               DeprecatedArc4Encrypt;\r
-  DEPRECATED_EDKII_CRYPTO_ARC4_DECRYPT               DeprecatedArc4Decrypt;\r
-  DEPRECATED_EDKII_CRYPTO_ARC4_RESET                 DeprecatedArc4Reset;\r
+  DEPRECATED_EDKII_CRYPTO_ARC4_GET_CONTEXT_SIZE       DeprecatedArc4GetContextSize;\r
+  DEPRECATED_EDKII_CRYPTO_ARC4_INIT                   DeprecatedArc4Init;\r
+  DEPRECATED_EDKII_CRYPTO_ARC4_ENCRYPT                DeprecatedArc4Encrypt;\r
+  DEPRECATED_EDKII_CRYPTO_ARC4_DECRYPT                DeprecatedArc4Decrypt;\r
+  DEPRECATED_EDKII_CRYPTO_ARC4_RESET                  DeprecatedArc4Reset;\r
   /// SM3\r
-  EDKII_CRYPTO_SM3_GET_CONTEXT_SIZE                  Sm3GetContextSize;\r
-  EDKII_CRYPTO_SM3_INIT                              Sm3Init;\r
-  EDKII_CRYPTO_SM3_DUPLICATE                         Sm3Duplicate;\r
-  EDKII_CRYPTO_SM3_UPDATE                            Sm3Update;\r
-  EDKII_CRYPTO_SM3_FINAL                             Sm3Final;\r
-  EDKII_CRYPTO_SM3_HASH_ALL                          Sm3HashAll;\r
+  EDKII_CRYPTO_SM3_GET_CONTEXT_SIZE                   Sm3GetContextSize;\r
+  EDKII_CRYPTO_SM3_INIT                               Sm3Init;\r
+  EDKII_CRYPTO_SM3_DUPLICATE                          Sm3Duplicate;\r
+  EDKII_CRYPTO_SM3_UPDATE                             Sm3Update;\r
+  EDKII_CRYPTO_SM3_FINAL                              Sm3Final;\r
+  EDKII_CRYPTO_SM3_HASH_ALL                           Sm3HashAll;\r
   /// HKDF\r
-  EDKII_CRYPTO_HKDF_SHA_256_EXTRACT_AND_EXPAND       HkdfSha256ExtractAndExpand;\r
+  EDKII_CRYPTO_HKDF_SHA_256_EXTRACT_AND_EXPAND        HkdfSha256ExtractAndExpand;\r
   /// X509 (Continued)\r
-  EDKII_CRYPTO_X509_CONSTRUCT_CERTIFICATE_STACK_V    X509ConstructCertificateStackV;\r
+  EDKII_CRYPTO_X509_CONSTRUCT_CERTIFICATE_STACK_V     X509ConstructCertificateStackV;\r
   /// TLS\r
-  EDKII_CRYPTO_TLS_INITIALIZE                        TlsInitialize;\r
-  EDKII_CRYPTO_TLS_CTX_FREE                          TlsCtxFree;\r
-  EDKII_CRYPTO_TLS_CTX_NEW                           TlsCtxNew;\r
-  EDKII_CRYPTO_TLS_FREE                              TlsFree;\r
-  EDKII_CRYPTO_TLS_NEW                               TlsNew;\r
-  EDKII_CRYPTO_TLS_IN_HANDSHAKE                      TlsInHandshake;\r
-  EDKII_CRYPTO_TLS_DO_HANDSHAKE                      TlsDoHandshake;\r
-  EDKII_CRYPTO_TLS_HANDLE_ALERT                      TlsHandleAlert;\r
-  EDKII_CRYPTO_TLS_CLOSE_NOTIFY                      TlsCloseNotify;\r
-  EDKII_CRYPTO_TLS_CTRL_TRAFFIC_OUT                  TlsCtrlTrafficOut;\r
-  EDKII_CRYPTO_TLS_CTRL_TRAFFIC_IN                   TlsCtrlTrafficIn;\r
-  EDKII_CRYPTO_TLS_READ                              TlsRead;\r
-  EDKII_CRYPTO_TLS_WRITE                             TlsWrite;\r
+  EDKII_CRYPTO_TLS_INITIALIZE                         TlsInitialize;\r
+  EDKII_CRYPTO_TLS_CTX_FREE                           TlsCtxFree;\r
+  EDKII_CRYPTO_TLS_CTX_NEW                            TlsCtxNew;\r
+  EDKII_CRYPTO_TLS_FREE                               TlsFree;\r
+  EDKII_CRYPTO_TLS_NEW                                TlsNew;\r
+  EDKII_CRYPTO_TLS_IN_HANDSHAKE                       TlsInHandshake;\r
+  EDKII_CRYPTO_TLS_DO_HANDSHAKE                       TlsDoHandshake;\r
+  EDKII_CRYPTO_TLS_HANDLE_ALERT                       TlsHandleAlert;\r
+  EDKII_CRYPTO_TLS_CLOSE_NOTIFY                       TlsCloseNotify;\r
+  EDKII_CRYPTO_TLS_CTRL_TRAFFIC_OUT                   TlsCtrlTrafficOut;\r
+  EDKII_CRYPTO_TLS_CTRL_TRAFFIC_IN                    TlsCtrlTrafficIn;\r
+  EDKII_CRYPTO_TLS_READ                               TlsRead;\r
+  EDKII_CRYPTO_TLS_WRITE                              TlsWrite;\r
   /// TLS Set\r
-  EDKII_CRYPTO_TLS_SET_VERSION                       TlsSetVersion;\r
-  EDKII_CRYPTO_TLS_SET_CONNECTION_END                TlsSetConnectionEnd;\r
-  EDKII_CRYPTO_TLS_SET_CIPHER_LIST                   TlsSetCipherList;\r
-  EDKII_CRYPTO_TLS_SET_COMPRESSION_METHOD            TlsSetCompressionMethod;\r
-  EDKII_CRYPTO_TLS_SET_VERIFY                        TlsSetVerify;\r
-  EDKII_CRYPTO_TLS_SET_VERIFY_HOST                   TlsSetVerifyHost;\r
-  EDKII_CRYPTO_TLS_SET_SESSIONID                     TlsSetSessionId;\r
-  EDKII_CRYPTO_TLS_SET_CA_CERTIFICATE                TlsSetCaCertificate;\r
-  EDKII_CRYPTO_TLS_SET_HOST_PUBLIC_CERT              TlsSetHostPublicCert;\r
-  EDKII_CRYPTO_TLS_SET_HOST_PRIVATE_KEY              TlsSetHostPrivateKey;\r
-  EDKII_CRYPTO_TLS_SET_CERT_REVOCATION_LIST          TlsSetCertRevocationList;\r
+  EDKII_CRYPTO_TLS_SET_VERSION                        TlsSetVersion;\r
+  EDKII_CRYPTO_TLS_SET_CONNECTION_END                 TlsSetConnectionEnd;\r
+  EDKII_CRYPTO_TLS_SET_CIPHER_LIST                    TlsSetCipherList;\r
+  EDKII_CRYPTO_TLS_SET_COMPRESSION_METHOD             TlsSetCompressionMethod;\r
+  EDKII_CRYPTO_TLS_SET_VERIFY                         TlsSetVerify;\r
+  EDKII_CRYPTO_TLS_SET_VERIFY_HOST                    TlsSetVerifyHost;\r
+  EDKII_CRYPTO_TLS_SET_SESSIONID                      TlsSetSessionId;\r
+  EDKII_CRYPTO_TLS_SET_CA_CERTIFICATE                 TlsSetCaCertificate;\r
+  EDKII_CRYPTO_TLS_SET_HOST_PUBLIC_CERT               TlsSetHostPublicCert;\r
+  EDKII_CRYPTO_TLS_SET_HOST_PRIVATE_KEY               TlsSetHostPrivateKey;\r
+  EDKII_CRYPTO_TLS_SET_CERT_REVOCATION_LIST           TlsSetCertRevocationList;\r
   /// TLS Get\r
-  EDKII_CRYPTO_TLS_GET_VERSION                       TlsGetVersion;\r
-  EDKII_CRYPTO_TLS_GET_CONNECTION_END                TlsGetConnectionEnd;\r
-  EDKII_CRYPTO_TLS_GET_CURRENT_CIPHER                TlsGetCurrentCipher;\r
-  EDKII_CRYPTO_TLS_GET_CURRENT_COMPRESSION_ID        TlsGetCurrentCompressionId;\r
-  EDKII_CRYPTO_TLS_GET_VERIFY                        TlsGetVerify;\r
-  EDKII_CRYPTO_TLS_GET_SESSION_ID                    TlsGetSessionId;\r
-  EDKII_CRYPTO_TLS_GET_CLIENT_RANDOM                 TlsGetClientRandom;\r
-  EDKII_CRYPTO_TLS_GET_SERVER_RANDOM                 TlsGetServerRandom;\r
-  EDKII_CRYPTO_TLS_GET_KEY_MATERIAL                  TlsGetKeyMaterial;\r
-  EDKII_CRYPTO_TLS_GET_CA_CERTIFICATE                TlsGetCaCertificate;\r
-  EDKII_CRYPTO_TLS_GET_HOST_PUBLIC_CERT              TlsGetHostPublicCert;\r
-  EDKII_CRYPTO_TLS_GET_HOST_PRIVATE_KEY              TlsGetHostPrivateKey;\r
-  EDKII_CRYPTO_TLS_GET_CERT_REVOCATION_LIST          TlsGetCertRevocationList;\r
+  EDKII_CRYPTO_TLS_GET_VERSION                        TlsGetVersion;\r
+  EDKII_CRYPTO_TLS_GET_CONNECTION_END                 TlsGetConnectionEnd;\r
+  EDKII_CRYPTO_TLS_GET_CURRENT_CIPHER                 TlsGetCurrentCipher;\r
+  EDKII_CRYPTO_TLS_GET_CURRENT_COMPRESSION_ID         TlsGetCurrentCompressionId;\r
+  EDKII_CRYPTO_TLS_GET_VERIFY                         TlsGetVerify;\r
+  EDKII_CRYPTO_TLS_GET_SESSION_ID                     TlsGetSessionId;\r
+  EDKII_CRYPTO_TLS_GET_CLIENT_RANDOM                  TlsGetClientRandom;\r
+  EDKII_CRYPTO_TLS_GET_SERVER_RANDOM                  TlsGetServerRandom;\r
+  EDKII_CRYPTO_TLS_GET_KEY_MATERIAL                   TlsGetKeyMaterial;\r
+  EDKII_CRYPTO_TLS_GET_CA_CERTIFICATE                 TlsGetCaCertificate;\r
+  EDKII_CRYPTO_TLS_GET_HOST_PUBLIC_CERT               TlsGetHostPublicCert;\r
+  EDKII_CRYPTO_TLS_GET_HOST_PRIVATE_KEY               TlsGetHostPrivateKey;\r
+  EDKII_CRYPTO_TLS_GET_CERT_REVOCATION_LIST           TlsGetCertRevocationList;\r
   /// RSA PSS\r
-  EDKII_CRYPTO_RSA_PSS_SIGN                          RsaPssSign;\r
-  EDKII_CRYPTO_RSA_PSS_VERIFY                        RsaPssVerify;\r
+  EDKII_CRYPTO_RSA_PSS_SIGN                           RsaPssSign;\r
+  EDKII_CRYPTO_RSA_PSS_VERIFY                         RsaPssVerify;\r
   /// Parallel hash\r
-  EDKII_CRYPTO_PARALLEL_HASH_ALL                     ParallelHash256HashAll;\r
+  EDKII_CRYPTO_PARALLEL_HASH_ALL                      ParallelHash256HashAll;\r
   /// HMAC SHA256 (continued)\r
-  EDKII_CRYPTO_HMAC_SHA256_ALL                       HmacSha256All;\r
+  EDKII_CRYPTO_HMAC_SHA256_ALL                        HmacSha256All;\r
   /// HMAC SHA384\r
-  EDKII_CRYPTO_HMAC_SHA384_NEW                       HmacSha384New;\r
-  EDKII_CRYPTO_HMAC_SHA384_FREE                      HmacSha384Free;\r
-  EDKII_CRYPTO_HMAC_SHA384_SET_KEY                   HmacSha384SetKey;\r
-  EDKII_CRYPTO_HMAC_SHA384_DUPLICATE                 HmacSha384Duplicate;\r
-  EDKII_CRYPTO_HMAC_SHA384_UPDATE                    HmacSha384Update;\r
-  EDKII_CRYPTO_HMAC_SHA384_FINAL                     HmacSha384Final;\r
-  EDKII_CRYPTO_HMAC_SHA384_ALL                       HmacSha384All;\r
+  EDKII_CRYPTO_HMAC_SHA384_NEW                        HmacSha384New;\r
+  EDKII_CRYPTO_HMAC_SHA384_FREE                       HmacSha384Free;\r
+  EDKII_CRYPTO_HMAC_SHA384_SET_KEY                    HmacSha384SetKey;\r
+  EDKII_CRYPTO_HMAC_SHA384_DUPLICATE                  HmacSha384Duplicate;\r
+  EDKII_CRYPTO_HMAC_SHA384_UPDATE                     HmacSha384Update;\r
+  EDKII_CRYPTO_HMAC_SHA384_FINAL                      HmacSha384Final;\r
+  EDKII_CRYPTO_HMAC_SHA384_ALL                        HmacSha384All;\r
   /// HKDF (continued)\r
-  EDKII_CRYPTO_HKDF_SHA_256_EXTRACT                  HkdfSha256Extract;\r
-  EDKII_CRYPTO_HKDF_SHA_256_EXPAND                   HkdfSha256Expand;\r
-  EDKII_CRYPTO_HKDF_SHA_384_EXTRACT_AND_EXPAND       HkdfSha384ExtractAndExpand;\r
-  EDKII_CRYPTO_HKDF_SHA_384_EXTRACT                  HkdfSha384Extract;\r
-  EDKII_CRYPTO_HKDF_SHA_384_EXPAND                   HkdfSha384Expand;\r
+  EDKII_CRYPTO_HKDF_SHA_256_EXTRACT                   HkdfSha256Extract;\r
+  EDKII_CRYPTO_HKDF_SHA_256_EXPAND                    HkdfSha256Expand;\r
+  EDKII_CRYPTO_HKDF_SHA_384_EXTRACT_AND_EXPAND        HkdfSha384ExtractAndExpand;\r
+  EDKII_CRYPTO_HKDF_SHA_384_EXTRACT                   HkdfSha384Extract;\r
+  EDKII_CRYPTO_HKDF_SHA_384_EXPAND                    HkdfSha384Expand;\r
   /// AEAD AES-GCM\r
-  EDKII_AEAD_AES_GCM_ENCRYPT                         AeadAesGcmEncrypt;\r
-  EDKII_AEAD_AES_GCM_DECRYPT                         AeadAesGcmDecrypt;\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
+  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
+  /// EC\r
+  EDKII_CRYPTO_EC_GROUP_INIT                          EcGroupInit;\r
+  EDKII_CRYPTO_EC_GROUP_GET_CURVE                     EcGroupGetCurve;\r
+  EDKII_CRYPTO_EC_GROUP_GET_ORDER                     EcGroupGetOrder;\r
+  EDKII_CRYPTO_EC_GROUP_FREE                          EcGroupFree;\r
+  EDKII_CRYPTO_EC_POINT_INIT                          EcPointInit;\r
+  EDKII_CRYPTO_EC_POINT_DE_INIT                       EcPointDeInit;\r
+  EDKII_CRYPTO_EC_POINT_GET_AFFINE_COORDINATES        EcPointGetAffineCoordinates;\r
+  EDKII_CRYPTO_EC_POINT_SET_AFFINE_COORDINATES        EcPointSetAffineCoordinates;\r
+  EDKII_CRYPTO_EC_POINT_ADD                           EcPointAdd;\r
+  EDKII_CRYPTO_EC_POINT_MUL                           EcPointMul;\r
+  EDKII_CRYPTO_EC_POINT_INVERT                        EcPointInvert;\r
+  EDKII_CRYPTO_EC_POINT_IS_ON_CURVE                   EcPointIsOnCurve;\r
+  EDKII_CRYPTO_EC_POINT_IS_AT_INFINITY                EcPointIsAtInfinity;\r
+  EDKII_CRYPTO_EC_POINT_EQUAL                         EcPointEqual;\r
+  EDKII_CRYPTO_EC_POINT_SET_COMPRESSED_COORDINATES    EcPointSetCompressedCoordinates;\r
+  EDKII_CRYPTO_EC_NEW_BY_NID                          EcNewByNid;\r
+  EDKII_CRYPTO_EC_FREE                                EcFree;\r
+  EDKII_CRYPTO_EC_GENERATE_KEY                        EcGenerateKey;\r
+  EDKII_CRYPTO_EC_GET_PUB_KEY                         EcGetPubKey;\r
+  EDKII_CRYPTO_EC_DH_COMPUTE_KEY                      EcDhComputeKey;\r
 };\r
 \r
 extern GUID  gEdkiiCryptoProtocolGuid;\r