]> git.proxmox.com Git - mirror_edk2.git/blobdiff - CryptoPkg/Driver/Crypto.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / CryptoPkg / Driver / Crypto.c
index d9096ea6037c94e04ac576ea49cdc3a76de8652e..bdbb4863a97e31511d6137c067d0c28134eaa7a9 100644 (file)
@@ -3,7 +3,7 @@
   from BaseCryptLib and TlsLib.\r
 \r
   Copyright (C) Microsoft Corporation. All rights reserved.\r
-  Copyright (c) 2019 - 2020, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2019 - 2022, Intel Corporation. All rights reserved.<BR>\r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -18,7 +18,7 @@
   A macro used to retrieve the FixedAtBuild PcdCryptoServiceFamilyEnable with a\r
   typecast to its associcted structure type PCD_CRYPTO_SERVICE_FAMILY_ENABLE.\r
 **/\r
-#define EDKII_CRYPTO_PCD ((const PCD_CRYPTO_SERVICE_FAMILY_ENABLE *) \\r
+#define EDKII_CRYPTO_PCD  ((const PCD_CRYPTO_SERVICE_FAMILY_ENABLE *)\\r
   (FixedPcdGetPtr (PcdCryptoServiceFamilyEnable)))\r
 \r
 /**\r
@@ -119,9 +119,9 @@ CryptoServiceGetCryptoVersion (
   return EDKII_CRYPTO_VERSION;\r
 }\r
 \r
-//=====================================================================================\r
+// =====================================================================================\r
 //    One-Way Cryptographic Hash Primitives\r
-//=====================================================================================\r
+// =====================================================================================\r
 \r
 /**\r
   MD4 is deprecated and unsupported any longer.\r
@@ -243,7 +243,8 @@ DeprecatedCryptoServiceMd4HashAll (
   return BaseCryptLibServiceDeprecated ("Md4HashAll"), FALSE;\r
 }\r
 \r
-#ifdef DISABLE_MD5_DEPRECATED_INTERFACES\r
+#ifndef ENABLE_MD5_DEPRECATED_INTERFACES\r
+\r
 /**\r
   Retrieves the size, in bytes, of the context buffer required for MD5 hash operations.\r
 \r
@@ -390,7 +391,9 @@ DeprecatedCryptoServiceMd5HashAll (
 {\r
   return BaseCryptLibServiceDeprecated ("Md5HashAll"), FALSE;\r
 }\r
+\r
 #else\r
+\r
 /**\r
   Retrieves the size, in bytes, of the context buffer required for MD5 hash operations.\r
 \r
@@ -548,9 +551,11 @@ CryptoServiceMd5HashAll (
 {\r
   return CALL_BASECRYPTLIB (Md5.Services.HashAll, Md5HashAll, (Data, DataSize, HashValue), FALSE);\r
 }\r
+\r
 #endif\r
 \r
 #ifdef DISABLE_SHA1_DEPRECATED_INTERFACES\r
+\r
 /**\r
   Retrieves the size, in bytes, of the context buffer required for SHA-1 hash operations.\r
 \r
@@ -699,7 +704,9 @@ DeprecatedCryptoServiceSha1HashAll (
 {\r
   return BaseCryptLibServiceDeprecated ("Sha1HashAll"), FALSE;\r
 }\r
+\r
 #else\r
+\r
 /**\r
   Retrieves the size, in bytes, of the context buffer required for SHA-1 hash operations.\r
 \r
@@ -857,6 +864,7 @@ CryptoServiceSha1HashAll (
 {\r
   return CALL_BASECRYPTLIB (Sha1.Services.HashAll, Sha1HashAll, (Data, DataSize, HashValue), FALSE);\r
 }\r
+\r
 #endif\r
 \r
 /**\r
@@ -1455,9 +1463,9 @@ CryptoServiceSm3HashAll (
   return CALL_BASECRYPTLIB (Sm3.Services.HashAll, Sm3HashAll, (Data, DataSize, HashValue), FALSE);\r
 }\r
 \r
-//=====================================================================================\r
+// =====================================================================================\r
 //    MAC (Message Authentication Code) Primitive\r
-//=====================================================================================\r
+// =====================================================================================\r
 \r
 /**\r
   HMAC MD5 is deprecated and unsupported any longer.\r
@@ -1839,9 +1847,221 @@ CryptoServiceHmacSha256Final (
   return CALL_BASECRYPTLIB (HmacSha256.Services.Final, HmacSha256Final, (HmacSha256Context, HmacValue), FALSE);\r
 }\r
 \r
-//=====================================================================================\r
+/**\r
+  Computes the HMAC-SHA256 digest of a input data buffer.\r
+\r
+  This function performs the HMAC-SHA256 digest of a given data buffer, and places\r
+  the digest value into the specified memory.\r
+\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[in]   Data        Pointer to the buffer containing the data to be digested.\r
+  @param[in]   DataSize    Size of Data buffer in bytes.\r
+  @param[in]   Key         Pointer to the user-supplied key.\r
+  @param[in]   KeySize     Key size in bytes.\r
+  @param[out]  HmacValue   Pointer to a buffer that receives the HMAC-SHA256 digest\r
+                           value (32 bytes).\r
+\r
+  @retval TRUE   HMAC-SHA256 digest computation succeeded.\r
+  @retval FALSE  HMAC-SHA256 digest computation failed.\r
+  @retval FALSE  This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceHmacSha256All (\r
+  IN   CONST VOID   *Data,\r
+  IN   UINTN        DataSize,\r
+  IN   CONST UINT8  *Key,\r
+  IN   UINTN        KeySize,\r
+  OUT  UINT8        *HmacValue\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (HmacSha256.Services.All, HmacSha256All, (Data, DataSize, Key, KeySize, HmacValue), FALSE);\r
+}\r
+\r
+/**\r
+  Allocates and initializes one HMAC_CTX context for subsequent HMAC-SHA384 use.\r
+\r
+  @return  Pointer to the HMAC_CTX context that has been initialized.\r
+           If the allocations fails, HmacSha384New() returns NULL.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+CryptoServiceHmacSha384New (\r
+  VOID\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (HmacSha384.Services.New, HmacSha384New, (), NULL);\r
+}\r
+\r
+/**\r
+  Release the specified HMAC_CTX context.\r
+\r
+  @param[in]  HmacSha384Ctx  Pointer to the HMAC_CTX context to be released.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CryptoServiceHmacSha384Free (\r
+  IN  VOID  *HmacSha384Ctx\r
+  )\r
+{\r
+  CALL_VOID_BASECRYPTLIB (HmacSha384.Services.Free, HmacSha384Free, (HmacSha384Ctx));\r
+}\r
+\r
+/**\r
+  Set user-supplied key for subsequent use. It must be done before any\r
+  calling to HmacSha384Update().\r
+\r
+  If HmacSha384Context is NULL, then return FALSE.\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[out]  HmacSha384Context  Pointer to HMAC-SHA384 context.\r
+  @param[in]   Key                Pointer to the user-supplied key.\r
+  @param[in]   KeySize            Key size in bytes.\r
+\r
+  @retval TRUE   The Key is set successfully.\r
+  @retval FALSE  The Key is set unsuccessfully.\r
+  @retval FALSE  This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceHmacSha384SetKey (\r
+  OUT  VOID         *HmacSha384Context,\r
+  IN   CONST UINT8  *Key,\r
+  IN   UINTN        KeySize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (HmacSha384.Services.SetKey, HmacSha384SetKey, (HmacSha384Context, Key, KeySize), FALSE);\r
+}\r
+\r
+/**\r
+  Makes a copy of an existing HMAC-SHA384 context.\r
+\r
+  If HmacSha384Context is NULL, then return FALSE.\r
+  If NewHmacSha384Context is NULL, then return FALSE.\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[in]  HmacSha384Context     Pointer to HMAC-SHA384 context being copied.\r
+  @param[out] NewHmacSha384Context  Pointer to new HMAC-SHA384 context.\r
+\r
+  @retval TRUE   HMAC-SHA384 context copy succeeded.\r
+  @retval FALSE  HMAC-SHA384 context copy failed.\r
+  @retval FALSE  This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceHmacSha384Duplicate (\r
+  IN   CONST VOID  *HmacSha384Context,\r
+  OUT  VOID        *NewHmacSha384Context\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (HmacSha384.Services.Duplicate, HmacSha256Duplicate, (HmacSha384Context, NewHmacSha384Context), FALSE);\r
+}\r
+\r
+/**\r
+  Digests the input data and updates HMAC-SHA384 context.\r
+\r
+  This function performs HMAC-SHA384 digest on a data buffer of the specified size.\r
+  It can be called multiple times to compute the digest of long or discontinuous data streams.\r
+  HMAC-SHA384 context should be initialized by HmacSha384New(), and should not be finalized\r
+  by HmacSha384Final(). Behavior with invalid context is undefined.\r
+\r
+  If HmacSha384Context is NULL, then return FALSE.\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[in, out]  HmacSha384Context Pointer to the HMAC-SHA384 context.\r
+  @param[in]       Data              Pointer to the buffer containing the data to be digested.\r
+  @param[in]       DataSize          Size of Data buffer in bytes.\r
+\r
+  @retval TRUE   HMAC-SHA384 data digest succeeded.\r
+  @retval FALSE  HMAC-SHA384 data digest failed.\r
+  @retval FALSE  This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceHmacSha384Update (\r
+  IN OUT  VOID        *HmacSha384Context,\r
+  IN      CONST VOID  *Data,\r
+  IN      UINTN       DataSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (HmacSha384.Services.Update, HmacSha384Update, (HmacSha384Context, Data, DataSize), FALSE);\r
+}\r
+\r
+/**\r
+  Completes computation of the HMAC-SHA384 digest value.\r
+\r
+  This function completes HMAC-SHA384 hash computation and retrieves the digest value into\r
+  the specified memory. After this function has been called, the HMAC-SHA384 context cannot\r
+  be used again.\r
+  HMAC-SHA384 context should be initialized by HmacSha384New(), and should not be finalized\r
+  by HmacSha384Final(). Behavior with invalid HMAC-SHA384 context is undefined.\r
+\r
+  If HmacSha384Context is NULL, then return FALSE.\r
+  If HmacValue is NULL, then return FALSE.\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[in, out]  HmacSha384Context  Pointer to the HMAC-SHA384 context.\r
+  @param[out]      HmacValue          Pointer to a buffer that receives the HMAC-SHA384 digest\r
+                                      value (48 bytes).\r
+\r
+  @retval TRUE   HMAC-SHA384 digest computation succeeded.\r
+  @retval FALSE  HMAC-SHA384 digest computation failed.\r
+  @retval FALSE  This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceHmacSha384Final (\r
+  IN OUT  VOID   *HmacSha384Context,\r
+  OUT     UINT8  *HmacValue\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (HmacSha384.Services.Final, HmacSha384Final, (HmacSha384Context, HmacValue), FALSE);\r
+}\r
+\r
+/**\r
+  Computes the HMAC-SHA384 digest of a input data buffer.\r
+\r
+  This function performs the HMAC-SHA384 digest of a given data buffer, and places\r
+  the digest value into the specified memory.\r
+\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[in]   Data        Pointer to the buffer containing the data to be digested.\r
+  @param[in]   DataSize    Size of Data buffer in bytes.\r
+  @param[in]   Key         Pointer to the user-supplied key.\r
+  @param[in]   KeySize     Key size in bytes.\r
+  @param[out]  HmacValue   Pointer to a buffer that receives the HMAC-SHA384 digest\r
+                           value (48 bytes).\r
+\r
+  @retval TRUE   HMAC-SHA384 digest computation succeeded.\r
+  @retval FALSE  HMAC-SHA384 digest computation failed.\r
+  @retval FALSE  This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceHmacSha384All (\r
+  IN   CONST VOID   *Data,\r
+  IN   UINTN        DataSize,\r
+  IN   CONST UINT8  *Key,\r
+  IN   UINTN        KeySize,\r
+  OUT  UINT8        *HmacValue\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (HmacSha384.Services.All, HmacSha384All, (Data, DataSize, Key, KeySize, HmacValue), FALSE);\r
+}\r
+\r
+// =====================================================================================\r
 //    Symmetric Cryptography Primitive\r
-//=====================================================================================\r
+// =====================================================================================\r
 \r
 /**\r
   TDES is deprecated and unsupported any longer.\r
@@ -2268,9 +2488,9 @@ DeprecatedCryptoServiceArc4Reset (
   return BaseCryptLibServiceDeprecated ("Arc4Reset"), FALSE;\r
 }\r
 \r
-//=====================================================================================\r
+// =====================================================================================\r
 //    Asymmetric Cryptography Primitive\r
-//=====================================================================================\r
+// =====================================================================================\r
 \r
 /**\r
   Allocates and initializes one RSA context for subsequent use.\r
@@ -2638,7 +2858,7 @@ EFIAPI
 CryptoServiceX509GetCommonName (\r
   IN      CONST UINT8  *Cert,\r
   IN      UINTN        CertSize,\r
-  OUT     CHAR8        *CommonName,  OPTIONAL\r
+  OUT     CHAR8        *CommonName   OPTIONAL,\r
   IN OUT  UINTN        *CommonNameSize\r
   )\r
 {\r
@@ -2674,10 +2894,10 @@ CryptoServiceX509GetCommonName (
 RETURN_STATUS\r
 EFIAPI\r
 CryptoServiceX509GetOrganizationName (\r
-  IN      CONST UINT8   *Cert,\r
-  IN      UINTN         CertSize,\r
-  OUT     CHAR8         *NameBuffer,  OPTIONAL\r
-  IN OUT  UINTN         *NameBufferSize\r
+  IN      CONST UINT8  *Cert,\r
+  IN      UINTN        CertSize,\r
+  OUT     CHAR8        *NameBuffer   OPTIONAL,\r
+  IN OUT  UINTN        *NameBufferSize\r
   )\r
 {\r
   return CALL_BASECRYPTLIB (X509.Services.GetOrganizationName, X509GetOrganizationName, (Cert, CertSize, NameBuffer, NameBufferSize), RETURN_UNSUPPORTED);\r
@@ -2867,1603 +3087,3608 @@ CryptoServiceX509GetTBSCert (
 }\r
 \r
 /**\r
-  Derives a key from a password using a salt and iteration count, based on PKCS#5 v2.0\r
-  password based encryption key derivation function PBKDF2, as specified in RFC 2898.\r
+  Retrieve the version from one X.509 certificate.\r
 \r
-  If Password or Salt or OutKey is NULL, then return FALSE.\r
-  If the hash algorithm could not be determined, then return FALSE.\r
+  If Cert is NULL, then return FALSE.\r
+  If CertSize is 0, then return FALSE.\r
   If this interface is not supported, then return FALSE.\r
 \r
-  @param[in]  PasswordLength  Length of input password in bytes.\r
-  @param[in]  Password        Pointer to the array for the password.\r
-  @param[in]  SaltLength      Size of the Salt in bytes.\r
-  @param[in]  Salt            Pointer to the Salt.\r
-  @param[in]  IterationCount  Number of iterations to perform. Its value should be\r
-                              greater than or equal to 1.\r
-  @param[in]  DigestSize      Size of the message digest to be used (eg. SHA256_DIGEST_SIZE).\r
-                              NOTE: DigestSize will be used to determine the hash algorithm.\r
-                                    Only SHA1_DIGEST_SIZE or SHA256_DIGEST_SIZE is supported.\r
-  @param[in]  KeyLength       Size of the derived key buffer in bytes.\r
-  @param[out] OutKey          Pointer to the output derived key buffer.\r
+  @param[in]      Cert         Pointer to the DER-encoded X509 certificate.\r
+  @param[in]      CertSize     Size of the X509 certificate in bytes.\r
+  @param[out]     Version      Pointer to the retrieved version integer.\r
 \r
-  @retval  TRUE   A key was derived successfully.\r
-  @retval  FALSE  One of the pointers was NULL or one of the sizes was too large.\r
-  @retval  FALSE  The hash algorithm could not be determined from the digest size.\r
-  @retval  FALSE  The key derivation operation failed.\r
-  @retval  FALSE  This interface is not supported.\r
+  @retval TRUE           The certificate version retrieved successfully.\r
+  @retval FALSE          If  Cert is NULL or CertSize is Zero.\r
+  @retval FALSE          The operation is not supported.\r
 \r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServicePkcs5HashPassword (\r
-  IN  UINTN        PasswordLength,\r
-  IN  CONST CHAR8  *Password,\r
-  IN  UINTN        SaltLength,\r
-  IN  CONST UINT8  *Salt,\r
-  IN  UINTN        IterationCount,\r
-  IN  UINTN        DigestSize,\r
-  IN  UINTN        KeyLength,\r
-  OUT UINT8        *OutKey\r
+CryptoServiceX509GetVersion (\r
+  IN      CONST UINT8  *Cert,\r
+  IN      UINTN        CertSize,\r
+  OUT     UINTN        *Version\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Pkcs.Services.Pkcs5HashPassword, Pkcs5HashPassword, (PasswordLength, Password, SaltLength, Salt, IterationCount, DigestSize, KeyLength, OutKey), FALSE);\r
+  return CALL_BASECRYPTLIB (X509.Services.GetVersion, X509GetVersion, (Cert, CertSize, Version), FALSE);\r
 }\r
 \r
 /**\r
-  Encrypts a blob using PKCS1v2 (RSAES-OAEP) schema. On success, will return the\r
-  encrypted message in a newly allocated buffer.\r
-\r
-  Things that can cause a failure include:\r
-  - X509 key size does not match any known key size.\r
-  - Fail to parse X509 certificate.\r
-  - Fail to allocate an intermediate buffer.\r
-  - Null pointer provided for a non-optional parameter.\r
-  - Data size is too large for the provided key size (max size is a function of key size\r
-    and hash digest size).\r
+  Retrieve the serialNumber from one X.509 certificate.\r
 \r
-  @param[in]  PublicKey           A pointer to the DER-encoded X509 certificate that\r
-                                  will be used to encrypt the data.\r
-  @param[in]  PublicKeySize       Size of the X509 cert buffer.\r
-  @param[in]  InData              Data to be encrypted.\r
-  @param[in]  InDataSize          Size of the data buffer.\r
-  @param[in]  PrngSeed            [Optional] If provided, a pointer to a random seed buffer\r
-                                  to be used when initializing the PRNG. NULL otherwise.\r
-  @param[in]  PrngSeedSize        [Optional] If provided, size of the random seed buffer.\r
-                                  0 otherwise.\r
-  @param[out] EncryptedData       Pointer to an allocated buffer containing the encrypted\r
-                                  message.\r
-  @param[out] EncryptedDataSize   Size of the encrypted message buffer.\r
+  If Cert is NULL, then return FALSE.\r
+  If CertSize is 0, then return FALSE.\r
+  If this interface is not supported, then return FALSE.\r
 \r
-  @retval     TRUE                Encryption was successful.\r
-  @retval     FALSE               Encryption failed.\r
+  @param[in]      Cert         Pointer to the DER-encoded X509 certificate.\r
+  @param[in]      CertSize     Size of the X509 certificate in bytes.\r
+  @param[out]     SerialNumber  Pointer to the retrieved certificate SerialNumber bytes.\r
+  @param[in, out] SerialNumberSize  The size in bytes of the SerialNumber buffer on input,\r
+                               and the size of buffer returned SerialNumber on output.\r
 \r
+  @retval TRUE                     The certificate serialNumber retrieved successfully.\r
+  @retval FALSE                    If Cert is NULL or CertSize is Zero.\r
+                                   If SerialNumberSize is NULL.\r
+                                   If Certificate is invalid.\r
+  @retval FALSE                    If no SerialNumber exists.\r
+  @retval FALSE                    If the SerialNumber is NULL. The required buffer size\r
+                                   (including the final null) is returned in the\r
+                                   SerialNumberSize parameter.\r
+  @retval FALSE                    The operation is not supported.\r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServicePkcs1v2Encrypt (\r
-  IN   CONST UINT8  *PublicKey,\r
-  IN   UINTN        PublicKeySize,\r
-  IN   UINT8        *InData,\r
-  IN   UINTN        InDataSize,\r
-  IN   CONST UINT8  *PrngSeed,  OPTIONAL\r
-  IN   UINTN        PrngSeedSize,  OPTIONAL\r
-  OUT  UINT8        **EncryptedData,\r
-  OUT  UINTN        *EncryptedDataSize\r
+CryptoServiceX509GetSerialNumber (\r
+  IN      CONST UINT8 *Cert,\r
+  IN      UINTN CertSize,\r
+  OUT     UINT8 *SerialNumber, OPTIONAL\r
+  IN OUT  UINTN         *SerialNumberSize\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Pkcs.Services.Pkcs1v2Encrypt, Pkcs1v2Encrypt, (PublicKey, PublicKeySize, InData, InDataSize, PrngSeed, PrngSeedSize, EncryptedData, EncryptedDataSize), FALSE);\r
+  return CALL_BASECRYPTLIB (X509.Services.GetSerialNumber, X509GetSerialNumber, (Cert, CertSize, SerialNumber, SerialNumberSize), FALSE);\r
 }\r
 \r
 /**\r
-  Get the signer's certificates from PKCS#7 signed data as described in "PKCS #7:\r
-  Cryptographic Message Syntax Standard". The input signed data could be wrapped\r
-  in a ContentInfo structure.\r
+  Retrieve the issuer bytes from one X.509 certificate.\r
 \r
-  If P7Data, CertStack, StackLength, TrustedCert or CertLength is NULL, then\r
-  return FALSE. If P7Length overflow, then return FALSE.\r
+  If Cert is NULL, then return FALSE.\r
+  If CertIssuerSize is NULL, then return FALSE.\r
   If this interface is not supported, then return FALSE.\r
 \r
-  @param[in]  P7Data       Pointer to the PKCS#7 message to verify.\r
-  @param[in]  P7Length     Length of the PKCS#7 message in bytes.\r
-  @param[out] CertStack    Pointer to Signer's certificates retrieved from P7Data.\r
-                           It's caller's responsibility to free the buffer with\r
-                           Pkcs7FreeSigners().\r
-                           This data structure is EFI_CERT_STACK type.\r
-  @param[out] StackLength  Length of signer's certificates in bytes.\r
-  @param[out] TrustedCert  Pointer to a trusted certificate from Signer's certificates.\r
-                           It's caller's responsibility to free the buffer with\r
-                           Pkcs7FreeSigners().\r
-  @param[out] CertLength   Length of the trusted certificate in bytes.\r
+  @param[in]      Cert         Pointer to the DER-encoded X509 certificate.\r
+  @param[in]      CertSize     Size of the X509 certificate in bytes.\r
+  @param[out]     CertIssuer  Pointer to the retrieved certificate subject bytes.\r
+  @param[in, out] CertIssuerSize  The size in bytes of the CertIssuer buffer on input,\r
+                               and the size of buffer returned CertSubject on output.\r
 \r
-  @retval  TRUE            The operation is finished successfully.\r
-  @retval  FALSE           Error occurs during the operation.\r
-  @retval  FALSE           This interface is not supported.\r
+  @retval  TRUE   The certificate issuer retrieved successfully.\r
+  @retval  FALSE  Invalid certificate, or the CertIssuerSize is too small for the result.\r
+                  The CertIssuerSize will be updated with the required size.\r
+  @retval  FALSE  This interface is not supported.\r
 \r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServicePkcs7GetSigners (\r
-  IN  CONST UINT8  *P7Data,\r
-  IN  UINTN        P7Length,\r
-  OUT UINT8        **CertStack,\r
-  OUT UINTN        *StackLength,\r
-  OUT UINT8        **TrustedCert,\r
-  OUT UINTN        *CertLength\r
+CryptoServiceX509GetIssuerName (\r
+  IN      CONST UINT8  *Cert,\r
+  IN      UINTN        CertSize,\r
+  OUT     UINT8        *CertIssuer,\r
+  IN OUT  UINTN        *CertIssuerSize\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Pkcs.Services.Pkcs7GetSigners, Pkcs7GetSigners, (P7Data, P7Length, CertStack, StackLength, TrustedCert, CertLength), FALSE);\r
+  return CALL_BASECRYPTLIB (X509.Services.GetIssuerName, X509GetIssuerName, (Cert, CertSize, CertIssuer, CertIssuerSize), FALSE);\r
 }\r
 \r
 /**\r
-  Wrap function to use free() to free allocated memory for certificates.\r
+  Retrieve the Signature Algorithm from one X.509 certificate.\r
 \r
-  If this interface is not supported, then ASSERT().\r
-\r
-  @param[in]  Certs        Pointer to the certificates to be freed.\r
+  @param[in]      Cert             Pointer to the DER-encoded X509 certificate.\r
+  @param[in]      CertSize         Size of the X509 certificate in bytes.\r
+  @param[out]     Oid              Signature Algorithm Object identifier buffer.\r
+  @param[in,out]  OidSize          Signature Algorithm Object identifier buffer size\r
 \r
+  @retval TRUE                     The certificate Extension data retrieved successfully.\r
+  @retval FALSE                    If Cert is NULL.\r
+                                   If OidSize is NULL.\r
+                                   If Oid is not NULL and *OidSize is 0.\r
+                                   If Certificate is invalid.\r
+  @retval FALSE                    If no SignatureType.\r
+  @retval FALSE                    If the Oid is NULL. The required buffer size\r
+                                   is returned in the OidSize.\r
+  @retval FALSE                    The operation is not supported.\r
 **/\r
-VOID\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServicePkcs7FreeSigners (\r
-  IN  UINT8        *Certs\r
+CryptoServiceX509GetSignatureAlgorithm (\r
+  IN CONST UINT8 *Cert,\r
+  IN       UINTN CertSize,\r
+  OUT   UINT8 *Oid, OPTIONAL\r
+  IN OUT   UINTN       *OidSize\r
   )\r
 {\r
-  CALL_VOID_BASECRYPTLIB (Pkcs.Services.Pkcs7FreeSigners, Pkcs7FreeSigners, (Certs));\r
+  return CALL_BASECRYPTLIB (X509.Services.GetSignatureAlgorithm, X509GetSignatureAlgorithm, (Cert, CertSize, Oid, OidSize), FALSE);\r
 }\r
 \r
 /**\r
-  Retrieves all embedded certificates from PKCS#7 signed data as described in "PKCS #7:\r
-  Cryptographic Message Syntax Standard", and outputs two certificate lists chained and\r
-  unchained to the signer's certificates.\r
-  The input signed data could be wrapped in a ContentInfo structure.\r
+  Retrieve Extension data from one X.509 certificate.\r
 \r
-  @param[in]  P7Data            Pointer to the PKCS#7 message.\r
-  @param[in]  P7Length          Length of the PKCS#7 message in bytes.\r
-  @param[out] SignerChainCerts  Pointer to the certificates list chained to signer's\r
-                                certificate. It's caller's responsibility to free the buffer\r
-                                with Pkcs7FreeSigners().\r
-                                This data structure is EFI_CERT_STACK type.\r
-  @param[out] ChainLength       Length of the chained certificates list buffer in bytes.\r
-  @param[out] UnchainCerts      Pointer to the unchained certificates lists. It's caller's\r
-                                responsibility to free the buffer with Pkcs7FreeSigners().\r
-                                This data structure is EFI_CERT_STACK type.\r
-  @param[out] UnchainLength     Length of the unchained certificates list buffer in bytes.\r
+  @param[in]      Cert             Pointer to the DER-encoded X509 certificate.\r
+  @param[in]      CertSize         Size of the X509 certificate in bytes.\r
+  @param[in]      Oid              Object identifier buffer\r
+  @param[in]      OidSize          Object identifier buffer size\r
+  @param[out]     ExtensionData    Extension bytes.\r
+  @param[in, out] ExtensionDataSize Extension bytes size.\r
+\r
+  @retval TRUE                     The certificate Extension data retrieved successfully.\r
+  @retval FALSE                    If Cert is NULL.\r
+                                   If ExtensionDataSize is NULL.\r
+                                   If ExtensionData is not NULL and *ExtensionDataSize is 0.\r
+                                   If Certificate is invalid.\r
+  @retval FALSE                    If no Extension entry match Oid.\r
+  @retval FALSE                    If the ExtensionData is NULL. The required buffer size\r
+                                   is returned in the ExtensionDataSize parameter.\r
+  @retval FALSE                    The operation is not supported.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceX509GetExtensionData (\r
+  IN     CONST UINT8  *Cert,\r
+  IN     UINTN        CertSize,\r
+  IN     CONST UINT8  *Oid,\r
+  IN     UINTN        OidSize,\r
+  OUT UINT8           *ExtensionData,\r
+  IN OUT UINTN        *ExtensionDataSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (X509.Services.GetExtensionData, X509GetExtensionData, (Cert, CertSize, Oid, OidSize, ExtensionData, ExtensionDataSize), FALSE);\r
+}\r
 \r
-  @retval  TRUE         The operation is finished successfully.\r
-  @retval  FALSE        Error occurs during the operation.\r
+/**\r
+  Retrieve the Extended Key Usage from one X.509 certificate.\r
 \r
+  @param[in]      Cert             Pointer to the DER-encoded X509 certificate.\r
+  @param[in]      CertSize         Size of the X509 certificate in bytes.\r
+  @param[out]     Usage            Key Usage bytes.\r
+  @param[in, out] UsageSize        Key Usage buffer sizs in bytes.\r
+\r
+  @retval TRUE                     The Usage bytes retrieve successfully.\r
+  @retval FALSE                    If Cert is NULL.\r
+                                   If CertSize is NULL.\r
+                                   If Usage is not NULL and *UsageSize is 0.\r
+                                   If Cert is invalid.\r
+  @retval FALSE                    If the Usage is NULL. The required buffer size\r
+                                   is returned in the UsageSize parameter.\r
+  @retval FALSE                    The operation is not supported.\r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServicePkcs7GetCertificatesList (\r
-  IN  CONST UINT8  *P7Data,\r
-  IN  UINTN        P7Length,\r
-  OUT UINT8        **SignerChainCerts,\r
-  OUT UINTN        *ChainLength,\r
-  OUT UINT8        **UnchainCerts,\r
-  OUT UINTN        *UnchainLength\r
+CryptoServiceX509GetExtendedKeyUsage (\r
+  IN     CONST UINT8  *Cert,\r
+  IN     UINTN        CertSize,\r
+  OUT UINT8           *Usage,\r
+  IN OUT UINTN        *UsageSize\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Pkcs.Services.Pkcs7GetCertificatesList, Pkcs7GetCertificatesList, (P7Data, P7Length, SignerChainCerts, ChainLength, UnchainCerts, UnchainLength), FALSE);\r
+  return CALL_BASECRYPTLIB (X509.Services.GetExtendedKeyUsage, X509GetExtendedKeyUsage, (Cert, CertSize, Usage, UsageSize), FALSE);\r
 }\r
 \r
 /**\r
-  Creates a PKCS#7 signedData as described in "PKCS #7: Cryptographic Message\r
-  Syntax Standard, version 1.5". This interface is only intended to be used for\r
-  application to perform PKCS#7 functionality validation.\r
+  Retrieve the Validity from one X.509 certificate\r
 \r
+  If Cert is NULL, then return FALSE.\r
+  If CertIssuerSize is NULL, then return FALSE.\r
   If this interface is not supported, then return FALSE.\r
 \r
-  @param[in]  PrivateKey       Pointer to the PEM-formatted private key data for\r
-                               data signing.\r
-  @param[in]  PrivateKeySize   Size of the PEM private key data in bytes.\r
-  @param[in]  KeyPassword      NULL-terminated passphrase used for encrypted PEM\r
-                               key data.\r
-  @param[in]  InData           Pointer to the content to be signed.\r
-  @param[in]  InDataSize       Size of InData in bytes.\r
-  @param[in]  SignCert         Pointer to signer's DER-encoded certificate to sign with.\r
-  @param[in]  OtherCerts       Pointer to an optional additional set of certificates to\r
-                               include in the PKCS#7 signedData (e.g. any intermediate\r
-                               CAs in the chain).\r
-  @param[out] SignedData       Pointer to output PKCS#7 signedData. It's caller's\r
-                               responsibility to free the buffer with FreePool().\r
-  @param[out] SignedDataSize   Size of SignedData in bytes.\r
+  @param[in]      Cert         Pointer to the DER-encoded X509 certificate.\r
+  @param[in]      CertSize     Size of the X509 certificate in bytes.\r
+  @param[in]      From         notBefore Pointer to DateTime object.\r
+  @param[in,out]  FromSize     notBefore DateTime object size.\r
+  @param[in]      To           notAfter Pointer to DateTime object.\r
+  @param[in,out]  ToSize       notAfter DateTime object size.\r
 \r
-  @retval     TRUE             PKCS#7 data signing succeeded.\r
-  @retval     FALSE            PKCS#7 data signing failed.\r
-  @retval     FALSE            This interface is not supported.\r
+  Note: X509CompareDateTime to compare DateTime oject\r
+        x509SetDateTime to get a DateTime object from a DateTimeStr\r
 \r
+  @retval  TRUE   The certificate Validity retrieved successfully.\r
+  @retval  FALSE  Invalid certificate, or Validity retrieve failed.\r
+  @retval  FALSE  This interface is not supported.\r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServicePkcs7Sign (\r
-  IN   CONST UINT8  *PrivateKey,\r
-  IN   UINTN        PrivateKeySize,\r
-  IN   CONST UINT8  *KeyPassword,\r
-  IN   UINT8        *InData,\r
-  IN   UINTN        InDataSize,\r
-  IN   UINT8        *SignCert,\r
-  IN   UINT8        *OtherCerts      OPTIONAL,\r
-  OUT  UINT8        **SignedData,\r
-  OUT  UINTN        *SignedDataSize\r
+CryptoServiceX509GetValidity  (\r
+  IN     CONST UINT8  *Cert,\r
+  IN     UINTN        CertSize,\r
+  IN     UINT8        *From,\r
+  IN OUT UINTN        *FromSize,\r
+  IN     UINT8        *To,\r
+  IN OUT UINTN        *ToSize\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Pkcs.Services.Pkcs7Sign, Pkcs7Sign, (PrivateKey, PrivateKeySize, KeyPassword, InData, InDataSize, SignCert, OtherCerts, SignedData, SignedDataSize), FALSE);\r
+  return CALL_BASECRYPTLIB (X509.Services.GetValidity, X509GetValidity, (Cert, CertSize, From, FromSize, To, ToSize), FALSE);\r
 }\r
 \r
 /**\r
-  Verifies the validity of a PKCS#7 signed data as described in "PKCS #7:\r
-  Cryptographic Message Syntax Standard". The input signed data could be wrapped\r
-  in a ContentInfo structure.\r
+  Format a DateTimeStr to DataTime object in DataTime Buffer\r
 \r
-  If P7Data, TrustedCert or InData is NULL, then return FALSE.\r
-  If P7Length, CertLength or DataLength overflow, then return FALSE.\r
+  If DateTimeStr is NULL, then return FALSE.\r
+  If DateTimeSize is NULL, then return FALSE.\r
   If this interface is not supported, then return FALSE.\r
 \r
-  @param[in]  P7Data       Pointer to the PKCS#7 message to verify.\r
-  @param[in]  P7Length     Length of the PKCS#7 message in bytes.\r
-  @param[in]  TrustedCert  Pointer to a trusted/root certificate encoded in DER, which\r
-                           is used for certificate chain verification.\r
-  @param[in]  CertLength   Length of the trusted certificate in bytes.\r
-  @param[in]  InData       Pointer to the content to be verified.\r
-  @param[in]  DataLength   Length of InData in bytes.\r
-\r
-  @retval  TRUE  The specified PKCS#7 signed data is valid.\r
-  @retval  FALSE Invalid PKCS#7 signed data.\r
-  @retval  FALSE This interface is not supported.\r
-\r
+  @param[in]      DateTimeStr      DateTime string like YYYYMMDDhhmmssZ\r
+                                   Ref: https://www.w3.org/TR/NOTE-datetime\r
+                                   Z stand for UTC time\r
+  @param[out]     DateTime         Pointer to a DateTime object.\r
+  @param[in,out]  DateTimeSize     DateTime object buffer size.\r
+\r
+  @retval TRUE                     The DateTime object create successfully.\r
+  @retval FALSE                    If DateTimeStr is NULL.\r
+                                   If DateTimeSize is NULL.\r
+                                   If DateTime is not NULL and *DateTimeSize is 0.\r
+                                   If Year Month Day Hour Minute Second combination is invalid datetime.\r
+  @retval FALSE                    If the DateTime is NULL. The required buffer size\r
+                                   (including the final null) is returned in the\r
+                                   DateTimeSize parameter.\r
+  @retval FALSE                    The operation is not supported.\r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServicePkcs7Verify (\r
-  IN  CONST UINT8  *P7Data,\r
-  IN  UINTN        P7Length,\r
-  IN  CONST UINT8  *TrustedCert,\r
-  IN  UINTN        CertLength,\r
-  IN  CONST UINT8  *InData,\r
-  IN  UINTN        DataLength\r
+CryptoServiceX509FormatDateTime (\r
+  IN CONST CHAR8  *DateTimeStr,\r
+  OUT VOID        *DateTime,\r
+  IN OUT UINTN    *DateTimeSize\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Pkcs.Services.Pkcs7Verify, Pkcs7Verify, (P7Data, P7Length, TrustedCert, CertLength, InData, DataLength), FALSE);\r
+  return CALL_BASECRYPTLIB (X509.Services.FormatDateTime, X509FormatDateTime, (DateTimeStr, DateTime, DateTimeSize), FALSE);\r
 }\r
 \r
 /**\r
-  This function receives a PKCS7 formatted signature, and then verifies that\r
-  the specified Enhanced or Extended Key Usages (EKU's) are present in the end-entity\r
-  leaf signing certificate.\r
-  Note that this function does not validate the certificate chain.\r
+  Compare DateTime1 object and DateTime2 object.\r
 \r
-  Applications for custom EKU's are quite flexible. For example, a policy EKU\r
-  may be present in an Issuing Certificate Authority (CA), and any sub-ordinate\r
-  certificate issued might also contain this EKU, thus constraining the\r
-  sub-ordinate certificate.  Other applications might allow a certificate\r
-  embedded in a device to specify that other Object Identifiers (OIDs) are\r
-  present which contains binary data specifying custom capabilities that\r
-  the device is able to do.\r
-\r
-  @param[in]  Pkcs7Signature       The PKCS#7 signed information content block. An array\r
-                                   containing the content block with both the signature,\r
-                                   the signer's certificate, and any necessary intermediate\r
-                                   certificates.\r
-  @param[in]  Pkcs7SignatureSize   Number of bytes in Pkcs7Signature.\r
-  @param[in]  RequiredEKUs         Array of null-terminated strings listing OIDs of\r
-                                   required EKUs that must be present in the signature.\r
-  @param[in]  RequiredEKUsSize     Number of elements in the RequiredEKUs string array.\r
-  @param[in]  RequireAllPresent    If this is TRUE, then all of the specified EKU's\r
-                                   must be present in the leaf signer.  If it is\r
-                                   FALSE, then we will succeed if we find any\r
-                                   of the specified EKU's.\r
+  If DateTime1 is NULL, then return -2.\r
+  If DateTime2 is NULL, then return -2.\r
+  If DateTime1 == DateTime2, then return 0\r
+  If DateTime1 > DateTime2, then return 1\r
+  If DateTime1 < DateTime2, then return -1\r
 \r
-  @retval EFI_SUCCESS              The required EKUs were found in the signature.\r
-  @retval EFI_INVALID_PARAMETER    A parameter was invalid.\r
-  @retval EFI_NOT_FOUND            One or more EKU's were not found in the signature.\r
+  @param[in]      DateTime1         Pointer to a DateTime Ojbect\r
+  @param[in]      DateTime2         Pointer to a DateTime Object\r
 \r
+  @retval  0      If DateTime1 == DateTime2\r
+  @retval  1      If DateTime1 > DateTime2\r
+  @retval  -1     If DateTime1 < DateTime2\r
 **/\r
-RETURN_STATUS\r
+INT32\r
 EFIAPI\r
-CryptoServiceVerifyEKUsInPkcs7Signature (\r
-  IN  CONST UINT8   *Pkcs7Signature,\r
-  IN  CONST UINT32  SignatureSize,\r
-  IN  CONST CHAR8   *RequiredEKUs[],\r
-  IN  CONST UINT32  RequiredEKUsSize,\r
-  IN  BOOLEAN       RequireAllPresent\r
+CryptoServiceX509CompareDateTime (\r
+  IN  CONST VOID  *DateTime1,\r
+  IN  CONST VOID  *DateTime2\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Pkcs.Services.VerifyEKUsInPkcs7Signature, VerifyEKUsInPkcs7Signature, (Pkcs7Signature, SignatureSize, RequiredEKUs, RequiredEKUsSize, RequireAllPresent), FALSE);\r
+  return CALL_BASECRYPTLIB (X509.Services.CompareDateTime, X509CompareDateTime, (DateTime1, DateTime2), FALSE);\r
 }\r
 \r
-\r
 /**\r
-  Extracts the attached content from a PKCS#7 signed data if existed. The input signed\r
-  data could be wrapped in a ContentInfo structure.\r
-\r
-  If P7Data, Content, or ContentSize is NULL, then return FALSE. If P7Length overflow,\r
-  then return FALSE. If the P7Data is not correctly formatted, then return FALSE.\r
-\r
-  Caution: This function may receive untrusted input. So this function will do\r
-           basic check for PKCS#7 data structure.\r
+  Retrieve the Key Usage from one X.509 certificate.\r
 \r
-  @param[in]   P7Data       Pointer to the PKCS#7 signed data to process.\r
-  @param[in]   P7Length     Length of the PKCS#7 signed data in bytes.\r
-  @param[out]  Content      Pointer to the extracted content from the PKCS#7 signedData.\r
-                            It's caller's responsibility to free the buffer with FreePool().\r
-  @param[out]  ContentSize  The size of the extracted content in bytes.\r
-\r
-  @retval     TRUE          The P7Data was correctly formatted for processing.\r
-  @retval     FALSE         The P7Data was not correctly formatted for processing.\r
+  @param[in]      Cert             Pointer to the DER-encoded X509 certificate.\r
+  @param[in]      CertSize         Size of the X509 certificate in bytes.\r
+  @param[out]     Usage            Key Usage (CRYPTO_X509_KU_*)\r
 \r
+  @retval  TRUE   The certificate Key Usage retrieved successfully.\r
+  @retval  FALSE  Invalid certificate, or Usage is NULL\r
+  @retval  FALSE  This interface is not supported.\r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServicePkcs7GetAttachedContent (\r
-  IN  CONST UINT8  *P7Data,\r
-  IN  UINTN        P7Length,\r
-  OUT VOID         **Content,\r
-  OUT UINTN        *ContentSize\r
+CryptoServiceX509GetKeyUsage (\r
+  IN    CONST UINT8  *Cert,\r
+  IN    UINTN        CertSize,\r
+  OUT   UINTN        *Usage\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Pkcs.Services.Pkcs7GetAttachedContent, Pkcs7GetAttachedContent, (P7Data, P7Length, Content, ContentSize), FALSE);\r
+  return CALL_BASECRYPTLIB (X509.Services.GetKeyUsage, X509GetKeyUsage, (Cert, CertSize, Usage), FALSE);\r
 }\r
 \r
 /**\r
-  Verifies the validity of a PE/COFF Authenticode Signature as described in "Windows\r
-  Authenticode Portable Executable Signature Format".\r
-\r
-  If AuthData is NULL, then return FALSE.\r
-  If ImageHash is NULL, then return FALSE.\r
-  If this interface is not supported, then return FALSE.\r
-\r
-  @param[in]  AuthData     Pointer to the Authenticode Signature retrieved from signed\r
-                           PE/COFF image to be verified.\r
-  @param[in]  DataSize     Size of the Authenticode Signature in bytes.\r
-  @param[in]  TrustedCert  Pointer to a trusted/root certificate encoded in DER, which\r
-                           is used for certificate chain verification.\r
-  @param[in]  CertSize     Size of the trusted certificate in bytes.\r
-  @param[in]  ImageHash    Pointer to the original image file hash value. The procedure\r
-                           for calculating the image hash value is described in Authenticode\r
-                           specification.\r
-  @param[in]  HashSize     Size of Image hash value in bytes.\r
+  Verify one X509 certificate was issued by the trusted CA.\r
+  @param[in]      RootCert          Trusted Root Certificate buffer\r
 \r
-  @retval  TRUE   The specified Authenticode Signature is valid.\r
-  @retval  FALSE  Invalid Authenticode Signature.\r
-  @retval  FALSE  This interface is not supported.\r
+  @param[in]      RootCertLength    Trusted Root Certificate buffer length\r
+  @param[in]      CertChain         One or more ASN.1 DER-encoded X.509 certificates\r
+                                    where the first certificate is signed by the Root\r
+                                    Certificate or is the Root Cerificate itself. and\r
+                                    subsequent cerificate is signed by the preceding\r
+                                    cerificate.\r
+  @param[in]      CertChainLength   Total length of the certificate chain, in bytes.\r
 \r
+  @retval  TRUE   All cerificates was issued by the first certificate in X509Certchain.\r
+  @retval  FALSE  Invalid certificate or the certificate was not issued by the given\r
+                  trusted CA.\r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServiceAuthenticodeVerify (\r
-  IN  CONST UINT8  *AuthData,\r
-  IN  UINTN        DataSize,\r
-  IN  CONST UINT8  *TrustedCert,\r
-  IN  UINTN        CertSize,\r
-  IN  CONST UINT8  *ImageHash,\r
-  IN  UINTN        HashSize\r
+CryptoServiceX509VerifyCertChain (\r
+  IN CONST UINT8  *RootCert,\r
+  IN UINTN        RootCertLength,\r
+  IN CONST UINT8  *CertChain,\r
+  IN UINTN        CertChainLength\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Pkcs.Services.AuthenticodeVerify, AuthenticodeVerify, (AuthData, DataSize, TrustedCert, CertSize, ImageHash, HashSize), FALSE);\r
+  return CALL_BASECRYPTLIB (X509.Services.VerifyCertChain, X509VerifyCertChain, (RootCert, RootCertLength, CertChain, CertChainLength), FALSE);\r
 }\r
 \r
 /**\r
-  Verifies the validity of a RFC3161 Timestamp CounterSignature embedded in PE/COFF Authenticode\r
-  signature.\r
+  Get one X509 certificate from CertChain.\r
 \r
-  If AuthData is NULL, then return FALSE.\r
-  If this interface is not supported, then return FALSE.\r
+  @param[in]      CertChain         One or more ASN.1 DER-encoded X.509 certificates\r
+                                    where the first certificate is signed by the Root\r
+                                    Certificate or is the Root Cerificate itself. and\r
+                                    subsequent cerificate is signed by the preceding\r
+                                    cerificate.\r
+  @param[in]      CertChainLength   Total length of the certificate chain, in bytes.\r
 \r
-  @param[in]  AuthData     Pointer to the Authenticode Signature retrieved from signed\r
-                           PE/COFF image to be verified.\r
-  @param[in]  DataSize     Size of the Authenticode Signature in bytes.\r
-  @param[in]  TsaCert      Pointer to a trusted/root TSA certificate encoded in DER, which\r
-                           is used for TSA certificate chain verification.\r
-  @param[in]  CertSize     Size of the trusted certificate in bytes.\r
-  @param[out] SigningTime  Return the time of timestamp generation time if the timestamp\r
-                           signature is valid.\r
+  @param[in]      CertIndex         Index of certificate.\r
 \r
-  @retval  TRUE   The specified Authenticode includes a valid RFC3161 Timestamp CounterSignature.\r
-  @retval  FALSE  No valid RFC3161 Timestamp CounterSignature in the specified Authenticode data.\r
+  @param[out]     Cert              The certificate at the index of CertChain.\r
+  @param[out]     CertLength        The length certificate at the index of CertChain.\r
 \r
+  @retval  TRUE   Success.\r
+  @retval  FALSE  Failed to get certificate from certificate chain.\r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServiceImageTimestampVerify (\r
-  IN  CONST UINT8  *AuthData,\r
-  IN  UINTN        DataSize,\r
-  IN  CONST UINT8  *TsaCert,\r
-  IN  UINTN        CertSize,\r
-  OUT EFI_TIME     *SigningTime\r
+CryptoServiceX509GetCertFromCertChain (\r
+  IN CONST UINT8   *CertChain,\r
+  IN UINTN         CertChainLength,\r
+  IN CONST INT32   CertIndex,\r
+  OUT CONST UINT8  **Cert,\r
+  OUT UINTN        *CertLength\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Pkcs.Services.ImageTimestampVerify, ImageTimestampVerify, (AuthData, DataSize, TsaCert, CertSize, SigningTime), FALSE);\r
+  return CALL_BASECRYPTLIB (X509.Services.GetCertFromCertChain, X509GetCertFromCertChain, (CertChain, CertChainLength, CertIndex, Cert, CertLength), FALSE);\r
 }\r
 \r
-//=====================================================================================\r
-//    DH Key Exchange Primitive\r
-//=====================================================================================\r
-\r
 /**\r
-  Allocates and Initializes one Diffie-Hellman Context for subsequent use.\r
+  Retrieve the tag and length of the tag.\r
 \r
-  @return  Pointer to the Diffie-Hellman Context that has been initialized.\r
-           If the allocations fails, DhNew() returns NULL.\r
-           If the interface is not supported, DhNew() returns NULL.\r
+  @param Ptr      The position in the ASN.1 data\r
+  @param End      End of data\r
+  @param Length   The variable that will receive the length\r
+  @param Tag      The expected tag\r
 \r
+  @retval      TRUE   Get tag successful\r
+  @retval      FALSe  Failed to get tag or tag not match\r
 **/\r
-VOID *\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceDhNew (\r
-  VOID\r
+CryptoServiceAsn1GetTag (\r
+  IN OUT UINT8    **Ptr,\r
+  IN CONST UINT8  *End,\r
+  OUT UINTN       *Length,\r
+  IN     UINT32   Tag\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Dh.Services.New, DhNew, (), NULL);\r
+  return CALL_BASECRYPTLIB (X509.Services.Asn1GetTag, Asn1GetTag, (Ptr, End, Length, Tag), FALSE);\r
 }\r
 \r
 /**\r
-  Release the specified DH context.\r
-\r
-  If the interface is not supported, then ASSERT().\r
+  Retrieve the basic constraints from one X.509 certificate.\r
 \r
-  @param[in]  DhContext  Pointer to the DH context to be released.\r
+  @param[in]      Cert                     Pointer to the DER-encoded X509 certificate.\r
+  @param[in]      CertSize                 size of the X509 certificate in bytes.\r
+  @param[out]     BasicConstraints         basic constraints bytes.\r
+  @param[in, out] BasicConstraintsSize     basic constraints buffer sizs in bytes.\r
 \r
-**/\r
-VOID\r
+  @retval TRUE                     The basic constraints retrieve successfully.\r
+  @retval FALSE                    If cert is NULL.\r
+                                   If cert_size is NULL.\r
+                                   If basic_constraints is not NULL and *basic_constraints_size is 0.\r
+                                   If cert is invalid.\r
+  @retval FALSE                    The required buffer size is small.\r
+                                   The return buffer size is basic_constraints_size parameter.\r
+  @retval FALSE                    If no Extension entry match oid.\r
+  @retval FALSE                    The operation is not supported.\r
+ **/\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceDhFree (\r
-  IN  VOID  *DhContext\r
+CryptoServiceX509GetExtendedBasicConstraints             (\r
+  CONST UINT8  *Cert,\r
+  UINTN        CertSize,\r
+  UINT8        *BasicConstraints,\r
+  UINTN        *BasicConstraintsSize\r
   )\r
 {\r
-  CALL_VOID_BASECRYPTLIB (Dh.Services.Free, DhFree, (DhContext));\r
+  return CALL_BASECRYPTLIB (X509.Services.GetExtendedBasicConstraints, X509GetExtendedBasicConstraints, (Cert, CertSize, BasicConstraints, BasicConstraintsSize), FALSE);\r
 }\r
 \r
 /**\r
-  Generates DH parameter.\r
-\r
-  Given generator g, and length of prime number p in bits, this function generates p,\r
-  and sets DH context according to value of g and p.\r
-\r
-  Before this function can be invoked, pseudorandom number generator must be correctly\r
-  initialized by RandomSeed().\r
+  Derives a key from a password using a salt and iteration count, based on PKCS#5 v2.0\r
+  password based encryption key derivation function PBKDF2, as specified in RFC 2898.\r
 \r
-  If DhContext is NULL, then return FALSE.\r
-  If Prime is NULL, then return FALSE.\r
+  If Password or Salt or OutKey is NULL, then return FALSE.\r
+  If the hash algorithm could not be determined, then return FALSE.\r
   If this interface is not supported, then return FALSE.\r
 \r
-  @param[in, out]  DhContext    Pointer to the DH context.\r
-  @param[in]       Generator    Value of generator.\r
-  @param[in]       PrimeLength  Length in bits of prime to be generated.\r
-  @param[out]      Prime        Pointer to the buffer to receive the generated prime number.\r
+  @param[in]  PasswordLength  Length of input password in bytes.\r
+  @param[in]  Password        Pointer to the array for the password.\r
+  @param[in]  SaltLength      Size of the Salt in bytes.\r
+  @param[in]  Salt            Pointer to the Salt.\r
+  @param[in]  IterationCount  Number of iterations to perform. Its value should be\r
+                              greater than or equal to 1.\r
+  @param[in]  DigestSize      Size of the message digest to be used (eg. SHA256_DIGEST_SIZE).\r
+                              NOTE: DigestSize will be used to determine the hash algorithm.\r
+                                    Only SHA1_DIGEST_SIZE or SHA256_DIGEST_SIZE is supported.\r
+  @param[in]  KeyLength       Size of the derived key buffer in bytes.\r
+  @param[out] OutKey          Pointer to the output derived key buffer.\r
 \r
-  @retval TRUE   DH parameter generation succeeded.\r
-  @retval FALSE  Value of Generator is not supported.\r
-  @retval FALSE  PRNG fails to generate random prime number with PrimeLength.\r
-  @retval FALSE  This interface is not supported.\r
+  @retval  TRUE   A key was derived successfully.\r
+  @retval  FALSE  One of the pointers was NULL or one of the sizes was too large.\r
+  @retval  FALSE  The hash algorithm could not be determined from the digest size.\r
+  @retval  FALSE  The key derivation operation failed.\r
+  @retval  FALSE  This interface is not supported.\r
 \r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServiceDhGenerateParameter (\r
-  IN OUT  VOID   *DhContext,\r
-  IN      UINTN  Generator,\r
-  IN      UINTN  PrimeLength,\r
-  OUT     UINT8  *Prime\r
+CryptoServicePkcs5HashPassword (\r
+  IN  UINTN        PasswordLength,\r
+  IN  CONST CHAR8  *Password,\r
+  IN  UINTN        SaltLength,\r
+  IN  CONST UINT8  *Salt,\r
+  IN  UINTN        IterationCount,\r
+  IN  UINTN        DigestSize,\r
+  IN  UINTN        KeyLength,\r
+  OUT UINT8        *OutKey\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Dh.Services.GenerateParameter, DhGenerateParameter, (DhContext, Generator, PrimeLength, Prime), FALSE);\r
+  return CALL_BASECRYPTLIB (Pkcs.Services.Pkcs5HashPassword, Pkcs5HashPassword, (PasswordLength, Password, SaltLength, Salt, IterationCount, DigestSize, KeyLength, OutKey), FALSE);\r
 }\r
 \r
 /**\r
-  Sets generator and prime parameters for DH.\r
+  Encrypts a blob using PKCS1v2 (RSAES-OAEP) schema. On success, will return the\r
+  encrypted message in a newly allocated buffer.\r
 \r
-  Given generator g, and prime number p, this function and sets DH\r
-  context accordingly.\r
+  Things that can cause a failure include:\r
+  - X509 key size does not match any known key size.\r
+  - Fail to parse X509 certificate.\r
+  - Fail to allocate an intermediate buffer.\r
+  - Null pointer provided for a non-optional parameter.\r
+  - Data size is too large for the provided key size (max size is a function of key size\r
+    and hash digest size).\r
 \r
-  If DhContext is NULL, then return FALSE.\r
-  If Prime is NULL, then return FALSE.\r
+  @param[in]  PublicKey           A pointer to the DER-encoded X509 certificate that\r
+                                  will be used to encrypt the data.\r
+  @param[in]  PublicKeySize       Size of the X509 cert buffer.\r
+  @param[in]  InData              Data to be encrypted.\r
+  @param[in]  InDataSize          Size of the data buffer.\r
+  @param[in]  PrngSeed            [Optional] If provided, a pointer to a random seed buffer\r
+                                  to be used when initializing the PRNG. NULL otherwise.\r
+  @param[in]  PrngSeedSize        [Optional] If provided, size of the random seed buffer.\r
+                                  0 otherwise.\r
+  @param[out] EncryptedData       Pointer to an allocated buffer containing the encrypted\r
+                                  message.\r
+  @param[out] EncryptedDataSize   Size of the encrypted message buffer.\r
+\r
+  @retval     TRUE                Encryption was successful.\r
+  @retval     FALSE               Encryption failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServicePkcs1v2Encrypt (\r
+  IN   CONST UINT8  *PublicKey,\r
+  IN   UINTN        PublicKeySize,\r
+  IN   UINT8        *InData,\r
+  IN   UINTN        InDataSize,\r
+  IN   CONST UINT8  *PrngSeed   OPTIONAL,\r
+  IN   UINTN        PrngSeedSize   OPTIONAL,\r
+  OUT  UINT8        **EncryptedData,\r
+  OUT  UINTN        *EncryptedDataSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Pkcs.Services.Pkcs1v2Encrypt, Pkcs1v2Encrypt, (PublicKey, PublicKeySize, InData, InDataSize, PrngSeed, PrngSeedSize, EncryptedData, EncryptedDataSize), FALSE);\r
+}\r
+\r
+/**\r
+  Get the signer's certificates from PKCS#7 signed data as described in "PKCS #7:\r
+  Cryptographic Message Syntax Standard". The input signed data could be wrapped\r
+  in a ContentInfo structure.\r
+\r
+  If P7Data, CertStack, StackLength, TrustedCert or CertLength is NULL, then\r
+  return FALSE. If P7Length overflow, then return FALSE.\r
   If this interface is not supported, then return FALSE.\r
 \r
-  @param[in, out]  DhContext    Pointer to the DH context.\r
-  @param[in]       Generator    Value of generator.\r
-  @param[in]       PrimeLength  Length in bits of prime to be generated.\r
-  @param[in]       Prime        Pointer to the prime number.\r
+  @param[in]  P7Data       Pointer to the PKCS#7 message to verify.\r
+  @param[in]  P7Length     Length of the PKCS#7 message in bytes.\r
+  @param[out] CertStack    Pointer to Signer's certificates retrieved from P7Data.\r
+                           It's caller's responsibility to free the buffer with\r
+                           Pkcs7FreeSigners().\r
+                           This data structure is EFI_CERT_STACK type.\r
+  @param[out] StackLength  Length of signer's certificates in bytes.\r
+  @param[out] TrustedCert  Pointer to a trusted certificate from Signer's certificates.\r
+                           It's caller's responsibility to free the buffer with\r
+                           Pkcs7FreeSigners().\r
+  @param[out] CertLength   Length of the trusted certificate in bytes.\r
 \r
-  @retval TRUE   DH parameter setting succeeded.\r
-  @retval FALSE  Value of Generator is not supported.\r
-  @retval FALSE  Value of Generator is not suitable for the Prime.\r
-  @retval FALSE  Value of Prime is not a prime number.\r
-  @retval FALSE  Value of Prime is not a safe prime number.\r
-  @retval FALSE  This interface is not supported.\r
+  @retval  TRUE            The operation is finished successfully.\r
+  @retval  FALSE           Error occurs during the operation.\r
+  @retval  FALSE           This interface is not supported.\r
 \r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServiceDhSetParameter (\r
-  IN OUT  VOID         *DhContext,\r
-  IN      UINTN        Generator,\r
-  IN      UINTN        PrimeLength,\r
-  IN      CONST UINT8  *Prime\r
+CryptoServicePkcs7GetSigners (\r
+  IN  CONST UINT8  *P7Data,\r
+  IN  UINTN        P7Length,\r
+  OUT UINT8        **CertStack,\r
+  OUT UINTN        *StackLength,\r
+  OUT UINT8        **TrustedCert,\r
+  OUT UINTN        *CertLength\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Dh.Services.SetParameter, DhSetParameter, (DhContext, Generator, PrimeLength, Prime), FALSE);\r
+  return CALL_BASECRYPTLIB (Pkcs.Services.Pkcs7GetSigners, Pkcs7GetSigners, (P7Data, P7Length, CertStack, StackLength, TrustedCert, CertLength), FALSE);\r
+}\r
+\r
+/**\r
+  Wrap function to use free() to free allocated memory for certificates.\r
+\r
+  If this interface is not supported, then ASSERT().\r
+\r
+  @param[in]  Certs        Pointer to the certificates to be freed.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CryptoServicePkcs7FreeSigners (\r
+  IN  UINT8  *Certs\r
+  )\r
+{\r
+  CALL_VOID_BASECRYPTLIB (Pkcs.Services.Pkcs7FreeSigners, Pkcs7FreeSigners, (Certs));\r
+}\r
+\r
+/**\r
+  Retrieves all embedded certificates from PKCS#7 signed data as described in "PKCS #7:\r
+  Cryptographic Message Syntax Standard", and outputs two certificate lists chained and\r
+  unchained to the signer's certificates.\r
+  The input signed data could be wrapped in a ContentInfo structure.\r
+\r
+  @param[in]  P7Data            Pointer to the PKCS#7 message.\r
+  @param[in]  P7Length          Length of the PKCS#7 message in bytes.\r
+  @param[out] SignerChainCerts  Pointer to the certificates list chained to signer's\r
+                                certificate. It's caller's responsibility to free the buffer\r
+                                with Pkcs7FreeSigners().\r
+                                This data structure is EFI_CERT_STACK type.\r
+  @param[out] ChainLength       Length of the chained certificates list buffer in bytes.\r
+  @param[out] UnchainCerts      Pointer to the unchained certificates lists. It's caller's\r
+                                responsibility to free the buffer with Pkcs7FreeSigners().\r
+                                This data structure is EFI_CERT_STACK type.\r
+  @param[out] UnchainLength     Length of the unchained certificates list buffer in bytes.\r
+\r
+  @retval  TRUE         The operation is finished successfully.\r
+  @retval  FALSE        Error occurs during the operation.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServicePkcs7GetCertificatesList (\r
+  IN  CONST UINT8  *P7Data,\r
+  IN  UINTN        P7Length,\r
+  OUT UINT8        **SignerChainCerts,\r
+  OUT UINTN        *ChainLength,\r
+  OUT UINT8        **UnchainCerts,\r
+  OUT UINTN        *UnchainLength\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Pkcs.Services.Pkcs7GetCertificatesList, Pkcs7GetCertificatesList, (P7Data, P7Length, SignerChainCerts, ChainLength, UnchainCerts, UnchainLength), FALSE);\r
+}\r
+\r
+/**\r
+  Creates a PKCS#7 signedData as described in "PKCS #7: Cryptographic Message\r
+  Syntax Standard, version 1.5". This interface is only intended to be used for\r
+  application to perform PKCS#7 functionality validation.\r
+\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[in]  PrivateKey       Pointer to the PEM-formatted private key data for\r
+                               data signing.\r
+  @param[in]  PrivateKeySize   Size of the PEM private key data in bytes.\r
+  @param[in]  KeyPassword      NULL-terminated passphrase used for encrypted PEM\r
+                               key data.\r
+  @param[in]  InData           Pointer to the content to be signed.\r
+  @param[in]  InDataSize       Size of InData in bytes.\r
+  @param[in]  SignCert         Pointer to signer's DER-encoded certificate to sign with.\r
+  @param[in]  OtherCerts       Pointer to an optional additional set of certificates to\r
+                               include in the PKCS#7 signedData (e.g. any intermediate\r
+                               CAs in the chain).\r
+  @param[out] SignedData       Pointer to output PKCS#7 signedData. It's caller's\r
+                               responsibility to free the buffer with FreePool().\r
+  @param[out] SignedDataSize   Size of SignedData in bytes.\r
+\r
+  @retval     TRUE             PKCS#7 data signing succeeded.\r
+  @retval     FALSE            PKCS#7 data signing failed.\r
+  @retval     FALSE            This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServicePkcs7Sign (\r
+  IN   CONST UINT8  *PrivateKey,\r
+  IN   UINTN        PrivateKeySize,\r
+  IN   CONST UINT8  *KeyPassword,\r
+  IN   UINT8        *InData,\r
+  IN   UINTN        InDataSize,\r
+  IN   UINT8        *SignCert,\r
+  IN   UINT8        *OtherCerts      OPTIONAL,\r
+  OUT  UINT8        **SignedData,\r
+  OUT  UINTN        *SignedDataSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Pkcs.Services.Pkcs7Sign, Pkcs7Sign, (PrivateKey, PrivateKeySize, KeyPassword, InData, InDataSize, SignCert, OtherCerts, SignedData, SignedDataSize), FALSE);\r
+}\r
+\r
+/**\r
+  Verifies the validity of a PKCS#7 signed data as described in "PKCS #7:\r
+  Cryptographic Message Syntax Standard". The input signed data could be wrapped\r
+  in a ContentInfo structure.\r
+\r
+  If P7Data, TrustedCert or InData is NULL, then return FALSE.\r
+  If P7Length, CertLength or DataLength overflow, then return FALSE.\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[in]  P7Data       Pointer to the PKCS#7 message to verify.\r
+  @param[in]  P7Length     Length of the PKCS#7 message in bytes.\r
+  @param[in]  TrustedCert  Pointer to a trusted/root certificate encoded in DER, which\r
+                           is used for certificate chain verification.\r
+  @param[in]  CertLength   Length of the trusted certificate in bytes.\r
+  @param[in]  InData       Pointer to the content to be verified.\r
+  @param[in]  DataLength   Length of InData in bytes.\r
+\r
+  @retval  TRUE  The specified PKCS#7 signed data is valid.\r
+  @retval  FALSE Invalid PKCS#7 signed data.\r
+  @retval  FALSE This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServicePkcs7Verify (\r
+  IN  CONST UINT8  *P7Data,\r
+  IN  UINTN        P7Length,\r
+  IN  CONST UINT8  *TrustedCert,\r
+  IN  UINTN        CertLength,\r
+  IN  CONST UINT8  *InData,\r
+  IN  UINTN        DataLength\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Pkcs.Services.Pkcs7Verify, Pkcs7Verify, (P7Data, P7Length, TrustedCert, CertLength, InData, DataLength), FALSE);\r
+}\r
+\r
+/**\r
+  This function receives a PKCS7 formatted signature, and then verifies that\r
+  the specified Enhanced or Extended Key Usages (EKU's) are present in the end-entity\r
+  leaf signing certificate.\r
+  Note that this function does not validate the certificate chain.\r
+\r
+  Applications for custom EKU's are quite flexible. For example, a policy EKU\r
+  may be present in an Issuing Certificate Authority (CA), and any sub-ordinate\r
+  certificate issued might also contain this EKU, thus constraining the\r
+  sub-ordinate certificate.  Other applications might allow a certificate\r
+  embedded in a device to specify that other Object Identifiers (OIDs) are\r
+  present which contains binary data specifying custom capabilities that\r
+  the device is able to do.\r
+\r
+  @param[in]  Pkcs7Signature       The PKCS#7 signed information content block. An array\r
+                                   containing the content block with both the signature,\r
+                                   the signer's certificate, and any necessary intermediate\r
+                                   certificates.\r
+  @param[in]  Pkcs7SignatureSize   Number of bytes in Pkcs7Signature.\r
+  @param[in]  RequiredEKUs         Array of null-terminated strings listing OIDs of\r
+                                   required EKUs that must be present in the signature.\r
+  @param[in]  RequiredEKUsSize     Number of elements in the RequiredEKUs string array.\r
+  @param[in]  RequireAllPresent    If this is TRUE, then all of the specified EKU's\r
+                                   must be present in the leaf signer.  If it is\r
+                                   FALSE, then we will succeed if we find any\r
+                                   of the specified EKU's.\r
+\r
+  @retval EFI_SUCCESS              The required EKUs were found in the signature.\r
+  @retval EFI_INVALID_PARAMETER    A parameter was invalid.\r
+  @retval EFI_NOT_FOUND            One or more EKU's were not found in the signature.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+CryptoServiceVerifyEKUsInPkcs7Signature (\r
+  IN  CONST UINT8   *Pkcs7Signature,\r
+  IN  CONST UINT32  SignatureSize,\r
+  IN  CONST CHAR8   *RequiredEKUs[],\r
+  IN  CONST UINT32  RequiredEKUsSize,\r
+  IN  BOOLEAN       RequireAllPresent\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Pkcs.Services.VerifyEKUsInPkcs7Signature, VerifyEKUsInPkcs7Signature, (Pkcs7Signature, SignatureSize, RequiredEKUs, RequiredEKUsSize, RequireAllPresent), FALSE);\r
+}\r
+\r
+/**\r
+  Extracts the attached content from a PKCS#7 signed data if existed. The input signed\r
+  data could be wrapped in a ContentInfo structure.\r
+\r
+  If P7Data, Content, or ContentSize is NULL, then return FALSE. If P7Length overflow,\r
+  then return FALSE. If the P7Data is not correctly formatted, then return FALSE.\r
+\r
+  Caution: This function may receive untrusted input. So this function will do\r
+           basic check for PKCS#7 data structure.\r
+\r
+  @param[in]   P7Data       Pointer to the PKCS#7 signed data to process.\r
+  @param[in]   P7Length     Length of the PKCS#7 signed data in bytes.\r
+  @param[out]  Content      Pointer to the extracted content from the PKCS#7 signedData.\r
+                            It's caller's responsibility to free the buffer with FreePool().\r
+  @param[out]  ContentSize  The size of the extracted content in bytes.\r
+\r
+  @retval     TRUE          The P7Data was correctly formatted for processing.\r
+  @retval     FALSE         The P7Data was not correctly formatted for processing.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServicePkcs7GetAttachedContent (\r
+  IN  CONST UINT8  *P7Data,\r
+  IN  UINTN        P7Length,\r
+  OUT VOID         **Content,\r
+  OUT UINTN        *ContentSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Pkcs.Services.Pkcs7GetAttachedContent, Pkcs7GetAttachedContent, (P7Data, P7Length, Content, ContentSize), FALSE);\r
+}\r
+\r
+/**\r
+  Verifies the validity of a PE/COFF Authenticode Signature as described in "Windows\r
+  Authenticode Portable Executable Signature Format".\r
+\r
+  If AuthData is NULL, then return FALSE.\r
+  If ImageHash is NULL, then return FALSE.\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[in]  AuthData     Pointer to the Authenticode Signature retrieved from signed\r
+                           PE/COFF image to be verified.\r
+  @param[in]  DataSize     Size of the Authenticode Signature in bytes.\r
+  @param[in]  TrustedCert  Pointer to a trusted/root certificate encoded in DER, which\r
+                           is used for certificate chain verification.\r
+  @param[in]  CertSize     Size of the trusted certificate in bytes.\r
+  @param[in]  ImageHash    Pointer to the original image file hash value. The procedure\r
+                           for calculating the image hash value is described in Authenticode\r
+                           specification.\r
+  @param[in]  HashSize     Size of Image hash value in bytes.\r
+\r
+  @retval  TRUE   The specified Authenticode Signature is valid.\r
+  @retval  FALSE  Invalid Authenticode Signature.\r
+  @retval  FALSE  This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceAuthenticodeVerify (\r
+  IN  CONST UINT8  *AuthData,\r
+  IN  UINTN        DataSize,\r
+  IN  CONST UINT8  *TrustedCert,\r
+  IN  UINTN        CertSize,\r
+  IN  CONST UINT8  *ImageHash,\r
+  IN  UINTN        HashSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Pkcs.Services.AuthenticodeVerify, AuthenticodeVerify, (AuthData, DataSize, TrustedCert, CertSize, ImageHash, HashSize), FALSE);\r
+}\r
+\r
+/**\r
+  Verifies the validity of a RFC3161 Timestamp CounterSignature embedded in PE/COFF Authenticode\r
+  signature.\r
+\r
+  If AuthData is NULL, then return FALSE.\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[in]  AuthData     Pointer to the Authenticode Signature retrieved from signed\r
+                           PE/COFF image to be verified.\r
+  @param[in]  DataSize     Size of the Authenticode Signature in bytes.\r
+  @param[in]  TsaCert      Pointer to a trusted/root TSA certificate encoded in DER, which\r
+                           is used for TSA certificate chain verification.\r
+  @param[in]  CertSize     Size of the trusted certificate in bytes.\r
+  @param[out] SigningTime  Return the time of timestamp generation time if the timestamp\r
+                           signature is valid.\r
+\r
+  @retval  TRUE   The specified Authenticode includes a valid RFC3161 Timestamp CounterSignature.\r
+  @retval  FALSE  No valid RFC3161 Timestamp CounterSignature in the specified Authenticode data.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceImageTimestampVerify (\r
+  IN  CONST UINT8  *AuthData,\r
+  IN  UINTN        DataSize,\r
+  IN  CONST UINT8  *TsaCert,\r
+  IN  UINTN        CertSize,\r
+  OUT EFI_TIME     *SigningTime\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Pkcs.Services.ImageTimestampVerify, ImageTimestampVerify, (AuthData, DataSize, TsaCert, CertSize, SigningTime), FALSE);\r
+}\r
+\r
+// =====================================================================================\r
+//    DH Key Exchange Primitive\r
+// =====================================================================================\r
+\r
+/**\r
+  Allocates and Initializes one Diffie-Hellman Context for subsequent use.\r
+\r
+  @return  Pointer to the Diffie-Hellman Context that has been initialized.\r
+           If the allocations fails, DhNew() returns NULL.\r
+           If the interface is not supported, DhNew() returns NULL.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+CryptoServiceDhNew (\r
+  VOID\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Dh.Services.New, DhNew, (), NULL);\r
+}\r
+\r
+/**\r
+  Release the specified DH context.\r
+\r
+  If the interface is not supported, then ASSERT().\r
+\r
+  @param[in]  DhContext  Pointer to the DH context to be released.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CryptoServiceDhFree (\r
+  IN  VOID  *DhContext\r
+  )\r
+{\r
+  CALL_VOID_BASECRYPTLIB (Dh.Services.Free, DhFree, (DhContext));\r
+}\r
+\r
+/**\r
+  Generates DH parameter.\r
+\r
+  Given generator g, and length of prime number p in bits, this function generates p,\r
+  and sets DH context according to value of g and p.\r
+\r
+  Before this function can be invoked, pseudorandom number generator must be correctly\r
+  initialized by RandomSeed().\r
+\r
+  If DhContext is NULL, then return FALSE.\r
+  If Prime is NULL, then return FALSE.\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[in, out]  DhContext    Pointer to the DH context.\r
+  @param[in]       Generator    Value of generator.\r
+  @param[in]       PrimeLength  Length in bits of prime to be generated.\r
+  @param[out]      Prime        Pointer to the buffer to receive the generated prime number.\r
+\r
+  @retval TRUE   DH parameter generation succeeded.\r
+  @retval FALSE  Value of Generator is not supported.\r
+  @retval FALSE  PRNG fails to generate random prime number with PrimeLength.\r
+  @retval FALSE  This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceDhGenerateParameter (\r
+  IN OUT  VOID   *DhContext,\r
+  IN      UINTN  Generator,\r
+  IN      UINTN  PrimeLength,\r
+  OUT     UINT8  *Prime\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Dh.Services.GenerateParameter, DhGenerateParameter, (DhContext, Generator, PrimeLength, Prime), FALSE);\r
+}\r
+\r
+/**\r
+  Sets generator and prime parameters for DH.\r
+\r
+  Given generator g, and prime number p, this function and sets DH\r
+  context accordingly.\r
+\r
+  If DhContext is NULL, then return FALSE.\r
+  If Prime is NULL, then return FALSE.\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[in, out]  DhContext    Pointer to the DH context.\r
+  @param[in]       Generator    Value of generator.\r
+  @param[in]       PrimeLength  Length in bits of prime to be generated.\r
+  @param[in]       Prime        Pointer to the prime number.\r
+\r
+  @retval TRUE   DH parameter setting succeeded.\r
+  @retval FALSE  Value of Generator is not supported.\r
+  @retval FALSE  Value of Generator is not suitable for the Prime.\r
+  @retval FALSE  Value of Prime is not a prime number.\r
+  @retval FALSE  Value of Prime is not a safe prime number.\r
+  @retval FALSE  This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceDhSetParameter (\r
+  IN OUT  VOID         *DhContext,\r
+  IN      UINTN        Generator,\r
+  IN      UINTN        PrimeLength,\r
+  IN      CONST UINT8  *Prime\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Dh.Services.SetParameter, DhSetParameter, (DhContext, Generator, PrimeLength, Prime), FALSE);\r
+}\r
+\r
+/**\r
+  Generates DH public key.\r
+\r
+  This function generates random secret exponent, and computes the public key, which is\r
+  returned via parameter PublicKey and PublicKeySize. DH context is updated accordingly.\r
+  If the PublicKey buffer is too small to hold the public key, FALSE is returned and\r
+  PublicKeySize is set to the required buffer size to obtain the public key.\r
+\r
+  If DhContext is NULL, then return FALSE.\r
+  If PublicKeySize is NULL, then return FALSE.\r
+  If PublicKeySize is large enough but PublicKey is NULL, then return FALSE.\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[in, out]  DhContext      Pointer to the DH context.\r
+  @param[out]      PublicKey      Pointer to the buffer to receive generated public key.\r
+  @param[in, out]  PublicKeySize  On input, the size of PublicKey buffer in bytes.\r
+                                 On output, the size of data returned in PublicKey buffer in bytes.\r
+\r
+  @retval TRUE   DH public key generation succeeded.\r
+  @retval FALSE  DH public key generation failed.\r
+  @retval FALSE  PublicKeySize is not large enough.\r
+  @retval FALSE  This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceDhGenerateKey (\r
+  IN OUT  VOID   *DhContext,\r
+  OUT     UINT8  *PublicKey,\r
+  IN OUT  UINTN  *PublicKeySize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Dh.Services.GenerateKey, DhGenerateKey, (DhContext, PublicKey, PublicKeySize), FALSE);\r
+}\r
+\r
+/**\r
+  Computes exchanged common key.\r
+\r
+  Given peer's public key, this function computes the exchanged common key, based on its own\r
+  context including value of prime modulus and random secret exponent.\r
+\r
+  If DhContext is NULL, then return FALSE.\r
+  If PeerPublicKey is NULL, then return FALSE.\r
+  If KeySize is NULL, then return FALSE.\r
+  If Key is NULL, then return FALSE.\r
+  If KeySize is not large enough, then return FALSE.\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[in, out]  DhContext          Pointer to the DH context.\r
+  @param[in]       PeerPublicKey      Pointer to the peer's public key.\r
+  @param[in]       PeerPublicKeySize  Size of peer's public key in bytes.\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
+\r
+  @retval TRUE   DH exchanged key generation succeeded.\r
+  @retval FALSE  DH exchanged key generation failed.\r
+  @retval FALSE  KeySize is not large enough.\r
+  @retval FALSE  This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceDhComputeKey (\r
+  IN OUT  VOID         *DhContext,\r
+  IN      CONST UINT8  *PeerPublicKey,\r
+  IN      UINTN        PeerPublicKeySize,\r
+  OUT     UINT8        *Key,\r
+  IN OUT  UINTN        *KeySize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Dh.Services.ComputeKey, DhComputeKey, (DhContext, PeerPublicKey, PeerPublicKeySize, Key, KeySize), FALSE);\r
+}\r
+\r
+// =====================================================================================\r
+//    Pseudo-Random Generation Primitive\r
+// =====================================================================================\r
+\r
+/**\r
+  Sets up the seed value for the pseudorandom number generator.\r
+\r
+  This function sets up the seed value for the pseudorandom number generator.\r
+  If Seed is not NULL, then the seed passed in is used.\r
+  If Seed is NULL, then default seed is used.\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[in]  Seed      Pointer to seed value.\r
+                        If NULL, default seed is used.\r
+  @param[in]  SeedSize  Size of seed value.\r
+                        If Seed is NULL, this parameter is ignored.\r
+\r
+  @retval TRUE   Pseudorandom number generator has enough entropy for random generation.\r
+  @retval FALSE  Pseudorandom number generator does not have enough entropy for random generation.\r
+  @retval FALSE  This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceRandomSeed (\r
+  IN  CONST  UINT8  *Seed  OPTIONAL,\r
+  IN  UINTN         SeedSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Random.Services.Seed, RandomSeed, (Seed, SeedSize), FALSE);\r
+}\r
+\r
+/**\r
+  Generates a pseudorandom byte stream of the specified size.\r
+\r
+  If Output is NULL, then return FALSE.\r
+  If this interface is not supported, then return FALSE.\r
+\r
+  @param[out]  Output  Pointer to buffer to receive random value.\r
+  @param[in]   Size    Size of random bytes to generate.\r
+\r
+  @retval TRUE   Pseudorandom byte stream generated successfully.\r
+  @retval FALSE  Pseudorandom number generator fails to generate due to lack of entropy.\r
+  @retval FALSE  This interface is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceRandomBytes (\r
+  OUT  UINT8  *Output,\r
+  IN   UINTN  Size\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Random.Services.Bytes, RandomBytes, (Output, Size), FALSE);\r
+}\r
+\r
+// =====================================================================================\r
+//    Key Derivation Function Primitive\r
+// =====================================================================================\r
+\r
+/**\r
+  Derive key data using HMAC-SHA256 based KDF.\r
+\r
+  @param[in]   Key              Pointer to the user-supplied key.\r
+  @param[in]   KeySize          Key size in bytes.\r
+  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
+  @param[in]   SaltSize         Salt size in bytes.\r
+  @param[in]   Info             Pointer to the application specific info.\r
+  @param[in]   InfoSize         Info size in bytes.\r
+  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
+  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+\r
+  @retval TRUE   Hkdf generated successfully.\r
+  @retval FALSE  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceHkdfSha256ExtractAndExpand (\r
+  IN   CONST UINT8  *Key,\r
+  IN   UINTN        KeySize,\r
+  IN   CONST UINT8  *Salt,\r
+  IN   UINTN        SaltSize,\r
+  IN   CONST UINT8  *Info,\r
+  IN   UINTN        InfoSize,\r
+  OUT  UINT8        *Out,\r
+  IN   UINTN        OutSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Hkdf.Services.Sha256ExtractAndExpand, HkdfSha256ExtractAndExpand, (Key, KeySize, Salt, SaltSize, Info, InfoSize, Out, OutSize), FALSE);\r
+}\r
+\r
+/**\r
+  Derive SHA256 HMAC-based Extract key Derivation Function (HKDF).\r
+\r
+  @param[in]   Key              Pointer to the user-supplied key.\r
+  @param[in]   KeySize          key size in bytes.\r
+  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
+  @param[in]   SaltSize         salt size in bytes.\r
+  @param[out]  PrkOut           Pointer to buffer to receive hkdf value.\r
+  @param[in]   PrkOutSize       size of hkdf bytes to generate.\r
+\r
+  @retval true   Hkdf generated successfully.\r
+  @retval false  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceHkdfSha256Extract (\r
+  IN CONST UINT8  *Key,\r
+  IN UINTN        KeySize,\r
+  IN CONST UINT8  *Salt,\r
+  IN UINTN        SaltSize,\r
+  OUT UINT8       *PrkOut,\r
+  UINTN           PrkOutSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Hkdf.Services.Sha256Extract, HkdfSha256Extract, (Key, KeySize, Salt, SaltSize, PrkOut, PrkOutSize), FALSE);\r
+}\r
+\r
+/**\r
+  Derive SHA256 HMAC-based Expand Key Derivation Function (HKDF).\r
+\r
+  @param[in]   Prk              Pointer to the user-supplied key.\r
+  @param[in]   PrkSize          Key size in bytes.\r
+  @param[in]   Info             Pointer to the application specific info.\r
+  @param[in]   InfoSize         Info size in bytes.\r
+  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
+  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+\r
+  @retval TRUE   Hkdf generated successfully.\r
+  @retval FALSE  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceHkdfSha256Expand (\r
+  IN   CONST UINT8  *Prk,\r
+  IN   UINTN        PrkSize,\r
+  IN   CONST UINT8  *Info,\r
+  IN   UINTN        InfoSize,\r
+  OUT  UINT8        *Out,\r
+  IN   UINTN        OutSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Hkdf.Services.Sha256Expand, HkdfSha256Expand, (Prk, PrkSize, Info, InfoSize, Out, OutSize), FALSE);\r
+}\r
+\r
+/**\r
+  Derive SHA384 HMAC-based Extract-and-Expand Key Derivation Function (HKDF).\r
+\r
+  @param[in]   Key              Pointer to the user-supplied key.\r
+  @param[in]   KeySize          Key size in bytes.\r
+  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
+  @param[in]   SaltSize         Salt size in bytes.\r
+  @param[in]   Info             Pointer to the application specific info.\r
+  @param[in]   InfoSize         Info size in bytes.\r
+  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
+  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+\r
+  @retval TRUE   Hkdf generated successfully.\r
+  @retval FALSE  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceHkdfSha384ExtractAndExpand (\r
+  IN   CONST UINT8  *Key,\r
+  IN   UINTN        KeySize,\r
+  IN   CONST UINT8  *Salt,\r
+  IN   UINTN        SaltSize,\r
+  IN   CONST UINT8  *Info,\r
+  IN   UINTN        InfoSize,\r
+  OUT  UINT8        *Out,\r
+  IN   UINTN        OutSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Hkdf.Services.Sha384ExtractAndExpand, HkdfSha384ExtractAndExpand, (Key, KeySize, Salt, SaltSize, Info, InfoSize, Out, OutSize), FALSE);\r
+}\r
+\r
+/**\r
+  Derive SHA384 HMAC-based Extract key Derivation Function (HKDF).\r
+\r
+  @param[in]   Key              Pointer to the user-supplied key.\r
+  @param[in]   KeySize          key size in bytes.\r
+  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
+  @param[in]   SaltSize         salt size in bytes.\r
+  @param[out]  PrkOut           Pointer to buffer to receive hkdf value.\r
+  @param[in]   PrkOutSize       size of hkdf bytes to generate.\r
+\r
+  @retval true   Hkdf generated successfully.\r
+  @retval false  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceHkdfSha384Extract (\r
+  IN CONST UINT8  *Key,\r
+  IN UINTN        KeySize,\r
+  IN CONST UINT8  *Salt,\r
+  IN UINTN        SaltSize,\r
+  OUT UINT8       *PrkOut,\r
+  UINTN           PrkOutSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Hkdf.Services.Sha384Extract, HkdfSha384Extract, (Key, KeySize, Salt, SaltSize, PrkOut, PrkOutSize), FALSE);\r
+}\r
+\r
+/**\r
+  Derive SHA384 HMAC-based Expand Key Derivation Function (HKDF).\r
+\r
+  @param[in]   Prk              Pointer to the user-supplied key.\r
+  @param[in]   PrkSize          Key size in bytes.\r
+  @param[in]   Info             Pointer to the application specific info.\r
+  @param[in]   InfoSize         Info size in bytes.\r
+  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
+  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+\r
+  @retval TRUE   Hkdf generated successfully.\r
+  @retval FALSE  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceHkdfSha384Expand (\r
+  IN   CONST UINT8  *Prk,\r
+  IN   UINTN        PrkSize,\r
+  IN   CONST UINT8  *Info,\r
+  IN   UINTN        InfoSize,\r
+  OUT  UINT8        *Out,\r
+  IN   UINTN        OutSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Hkdf.Services.Sha384Expand, HkdfSha384Expand, (Prk, PrkSize, Info, InfoSize, Out, OutSize), FALSE);\r
+}\r
+\r
+/**\r
+  Initializes the OpenSSL library.\r
+\r
+  This function registers ciphers and digests used directly and indirectly\r
+  by SSL/TLS, and initializes the readable error messages.\r
+  This function must be called before any other action takes places.\r
+\r
+  @retval TRUE   The OpenSSL library has been initialized.\r
+  @retval FALSE  Failed to initialize the OpenSSL library.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceTlsInitialize (\r
+  VOID\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Tls.Services.Initialize, TlsInitialize, (), FALSE);\r
+}\r
+\r
+/**\r
+  Free an allocated SSL_CTX object.\r
+\r
+  @param[in]  TlsCtx    Pointer to the SSL_CTX object to be released.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CryptoServiceTlsCtxFree (\r
+  IN   VOID  *TlsCtx\r
+  )\r
+{\r
+  CALL_VOID_BASECRYPTLIB (Tls.Services.CtxFree, TlsCtxFree, (TlsCtx));\r
+}\r
+\r
+/**\r
+  Creates a new SSL_CTX object as framework to establish TLS/SSL enabled\r
+  connections.\r
+\r
+  @param[in]  MajorVer    Major Version of TLS/SSL Protocol.\r
+  @param[in]  MinorVer    Minor Version of TLS/SSL Protocol.\r
+\r
+  @return  Pointer to an allocated SSL_CTX object.\r
+           If the creation failed, TlsCtxNew() returns NULL.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+CryptoServiceTlsCtxNew (\r
+  IN     UINT8  MajorVer,\r
+  IN     UINT8  MinorVer\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Tls.Services.CtxNew, TlsCtxNew, (MajorVer, MinorVer), NULL);\r
+}\r
+\r
+/**\r
+  Free an allocated TLS object.\r
+\r
+  This function removes the TLS object pointed to by Tls and frees up the\r
+  allocated memory. If Tls is NULL, nothing is done.\r
+\r
+  @param[in]  Tls    Pointer to the TLS object to be freed.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CryptoServiceTlsFree (\r
+  IN     VOID  *Tls\r
+  )\r
+{\r
+  CALL_VOID_BASECRYPTLIB (Tls.Services.Free, TlsFree, (Tls));\r
+}\r
+\r
+/**\r
+  Create a new TLS object for a connection.\r
+\r
+  This function creates a new TLS object for a connection. The new object\r
+  inherits the setting of the underlying context TlsCtx: connection method,\r
+  options, verification setting.\r
+\r
+  @param[in]  TlsCtx    Pointer to the SSL_CTX object.\r
+\r
+  @return  Pointer to an allocated SSL object.\r
+           If the creation failed, TlsNew() returns NULL.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+CryptoServiceTlsNew (\r
+  IN     VOID  *TlsCtx\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Tls.Services.New, TlsNew, (TlsCtx), NULL);\r
+}\r
+\r
+/**\r
+  Checks if the TLS handshake was done.\r
+\r
+  This function will check if the specified TLS handshake was done.\r
+\r
+  @param[in]  Tls    Pointer to the TLS object for handshake state checking.\r
+\r
+  @retval  TRUE     The TLS handshake was done.\r
+  @retval  FALSE    The TLS handshake was not done.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceTlsInHandshake (\r
+  IN     VOID  *Tls\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Tls.Services.InHandshake, TlsInHandshake, (Tls), FALSE);\r
+}\r
+\r
+/**\r
+  Perform a TLS/SSL handshake.\r
+\r
+  This function will perform a TLS/SSL handshake.\r
+\r
+  @param[in]       Tls            Pointer to the TLS object for handshake operation.\r
+  @param[in]       BufferIn       Pointer to the most recently received TLS Handshake packet.\r
+  @param[in]       BufferInSize   Packet size in bytes for the most recently received TLS\r
+                                  Handshake packet.\r
+  @param[out]      BufferOut      Pointer to the buffer to hold the built packet.\r
+  @param[in, out]  BufferOutSize  Pointer to the buffer size in bytes. On input, it is\r
+                                  the buffer size provided by the caller. On output, it\r
+                                  is the buffer size in fact needed to contain the\r
+                                  packet.\r
+\r
+  @retval EFI_SUCCESS             The required TLS packet is built successfully.\r
+  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:\r
+                                  Tls is NULL.\r
+                                  BufferIn is NULL but BufferInSize is NOT 0.\r
+                                  BufferInSize is 0 but BufferIn is NOT NULL.\r
+                                  BufferOutSize is NULL.\r
+                                  BufferOut is NULL if *BufferOutSize is not zero.\r
+  @retval EFI_BUFFER_TOO_SMALL    BufferOutSize is too small to hold the response packet.\r
+  @retval EFI_ABORTED             Something wrong during handshake.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsDoHandshake (\r
+  IN     VOID   *Tls,\r
+  IN     UINT8  *BufferIn  OPTIONAL,\r
+  IN     UINTN  BufferInSize  OPTIONAL,\r
+  OUT UINT8     *BufferOut  OPTIONAL,\r
+  IN OUT UINTN  *BufferOutSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Tls.Services.DoHandshake, TlsDoHandshake, (Tls, BufferIn, BufferInSize, BufferOut, BufferOutSize), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Handle Alert message recorded in BufferIn. If BufferIn is NULL and BufferInSize is zero,\r
+  TLS session has errors and the response packet needs to be Alert message based on error type.\r
+\r
+  @param[in]       Tls            Pointer to the TLS object for state checking.\r
+  @param[in]       BufferIn       Pointer to the most recently received TLS Alert packet.\r
+  @param[in]       BufferInSize   Packet size in bytes for the most recently received TLS\r
+                                  Alert packet.\r
+  @param[out]      BufferOut      Pointer to the buffer to hold the built packet.\r
+  @param[in, out]  BufferOutSize  Pointer to the buffer size in bytes. On input, it is\r
+                                  the buffer size provided by the caller. On output, it\r
+                                  is the buffer size in fact needed to contain the\r
+                                  packet.\r
+\r
+  @retval EFI_SUCCESS             The required TLS packet is built successfully.\r
+  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:\r
+                                  Tls is NULL.\r
+                                  BufferIn is NULL but BufferInSize is NOT 0.\r
+                                  BufferInSize is 0 but BufferIn is NOT NULL.\r
+                                  BufferOutSize is NULL.\r
+                                  BufferOut is NULL if *BufferOutSize is not zero.\r
+  @retval EFI_ABORTED             An error occurred.\r
+  @retval EFI_BUFFER_TOO_SMALL    BufferOutSize is too small to hold the response packet.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsHandleAlert (\r
+  IN     VOID   *Tls,\r
+  IN     UINT8  *BufferIn  OPTIONAL,\r
+  IN     UINTN  BufferInSize  OPTIONAL,\r
+  OUT UINT8     *BufferOut  OPTIONAL,\r
+  IN OUT UINTN  *BufferOutSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Tls.Services.HandleAlert, TlsHandleAlert, (Tls, BufferIn, BufferInSize, BufferOut, BufferOutSize), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Build the CloseNotify packet.\r
+\r
+  @param[in]       Tls            Pointer to the TLS object for state checking.\r
+  @param[in, out]  Buffer         Pointer to the buffer to hold the built packet.\r
+  @param[in, out]  BufferSize     Pointer to the buffer size in bytes. On input, it is\r
+                                  the buffer size provided by the caller. On output, it\r
+                                  is the buffer size in fact needed to contain the\r
+                                  packet.\r
+\r
+  @retval EFI_SUCCESS             The required TLS packet is built successfully.\r
+  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:\r
+                                  Tls is NULL.\r
+                                  BufferSize is NULL.\r
+                                  Buffer is NULL if *BufferSize is not zero.\r
+  @retval EFI_BUFFER_TOO_SMALL    BufferSize is too small to hold the response packet.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsCloseNotify (\r
+  IN     VOID   *Tls,\r
+  IN OUT UINT8  *Buffer,\r
+  IN OUT UINTN  *BufferSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Tls.Services.CloseNotify, TlsCloseNotify, (Tls, Buffer, BufferSize), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Attempts to read bytes from one TLS object and places the data in Buffer.\r
+\r
+  This function will attempt to read BufferSize bytes from the TLS object\r
+  and places the data in Buffer.\r
+\r
+  @param[in]      Tls           Pointer to the TLS object.\r
+  @param[in,out]  Buffer        Pointer to the buffer to store the data.\r
+  @param[in]      BufferSize    The size of Buffer in bytes.\r
+\r
+  @retval  >0    The amount of data successfully read from the TLS object.\r
+  @retval  <=0   No data was successfully read.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+CryptoServiceTlsCtrlTrafficOut (\r
+  IN     VOID   *Tls,\r
+  IN OUT VOID   *Buffer,\r
+  IN     UINTN  BufferSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Tls.Services.CtrlTrafficOut, TlsCtrlTrafficOut, (Tls, Buffer, BufferSize), 0);\r
+}\r
+\r
+/**\r
+  Attempts to write data from the buffer to TLS object.\r
+\r
+  This function will attempt to write BufferSize bytes data from the Buffer\r
+  to the TLS object.\r
+\r
+  @param[in]  Tls           Pointer to the TLS object.\r
+  @param[in]  Buffer        Pointer to the data buffer.\r
+  @param[in]  BufferSize    The size of Buffer in bytes.\r
+\r
+  @retval  >0    The amount of data successfully written to the TLS object.\r
+  @retval <=0    No data was successfully written.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+CryptoServiceTlsCtrlTrafficIn (\r
+  IN     VOID   *Tls,\r
+  IN     VOID   *Buffer,\r
+  IN     UINTN  BufferSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Tls.Services.CtrlTrafficIn, TlsCtrlTrafficIn, (Tls, Buffer, BufferSize), 0);\r
+}\r
+\r
+/**\r
+  Attempts to read bytes from the specified TLS connection into the buffer.\r
+\r
+  This function tries to read BufferSize bytes data from the specified TLS\r
+  connection into the Buffer.\r
+\r
+  @param[in]      Tls           Pointer to the TLS connection for data reading.\r
+  @param[in,out]  Buffer        Pointer to the data buffer.\r
+  @param[in]      BufferSize    The size of Buffer in bytes.\r
+\r
+  @retval  >0    The read operation was successful, and return value is the\r
+                 number of bytes actually read from the TLS connection.\r
+  @retval  <=0   The read operation was not successful.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+CryptoServiceTlsRead (\r
+  IN     VOID   *Tls,\r
+  IN OUT VOID   *Buffer,\r
+  IN     UINTN  BufferSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Tls.Services.Read, TlsRead, (Tls, Buffer, BufferSize), 0);\r
+}\r
+\r
+/**\r
+  Attempts to write data to a TLS connection.\r
+\r
+  This function tries to write BufferSize bytes data from the Buffer into the\r
+  specified TLS connection.\r
+\r
+  @param[in]  Tls           Pointer to the TLS connection for data writing.\r
+  @param[in]  Buffer        Pointer to the data buffer.\r
+  @param[in]  BufferSize    The size of Buffer in bytes.\r
+\r
+  @retval  >0    The write operation was successful, and return value is the\r
+                 number of bytes actually written to the TLS connection.\r
+  @retval <=0    The write operation was not successful.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+CryptoServiceTlsWrite (\r
+  IN     VOID   *Tls,\r
+  IN     VOID   *Buffer,\r
+  IN     UINTN  BufferSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Tls.Services.Write, TlsWrite, (Tls, Buffer, BufferSize), 0);\r
+}\r
+\r
+/**\r
+  Shutdown a TLS connection.\r
+\r
+  Shutdown the TLS connection without releasing the resources, meaning a new\r
+  connection can be started without calling TlsNew() and without setting\r
+  certificates etc.\r
+\r
+  @param[in]       Tls            Pointer to the TLS object to shutdown.\r
+\r
+  @retval EFI_SUCCESS             The TLS is shutdown successfully.\r
+  @retval EFI_INVALID_PARAMETER   Tls is NULL.\r
+  @retval EFI_PROTOCOL_ERROR      Some other error occurred.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsShutdown (\r
+  IN     VOID  *Tls\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Tls.Services.Shutdown, TlsShutdown, (Tls), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Set a new TLS/SSL method for a particular TLS object.\r
+\r
+  This function sets a new TLS/SSL method for a particular TLS object.\r
+\r
+  @param[in]  Tls         Pointer to a TLS object.\r
+  @param[in]  MajorVer    Major Version of TLS/SSL Protocol.\r
+  @param[in]  MinorVer    Minor Version of TLS/SSL Protocol.\r
+\r
+  @retval  EFI_SUCCESS           The TLS/SSL method was set successfully.\r
+  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
+  @retval  EFI_UNSUPPORTED       Unsupported TLS/SSL method.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsSetVersion (\r
+  IN     VOID   *Tls,\r
+  IN     UINT8  MajorVer,\r
+  IN     UINT8  MinorVer\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsSet.Services.Version, TlsSetVersion, (Tls, MajorVer, MinorVer), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Set TLS object to work in client or server mode.\r
+\r
+  This function prepares a TLS object to work in client or server mode.\r
+\r
+  @param[in]  Tls         Pointer to a TLS object.\r
+  @param[in]  IsServer    Work in server mode.\r
+\r
+  @retval  EFI_SUCCESS           The TLS/SSL work mode was set successfully.\r
+  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
+  @retval  EFI_UNSUPPORTED       Unsupported TLS/SSL work mode.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsSetConnectionEnd (\r
+  IN     VOID     *Tls,\r
+  IN     BOOLEAN  IsServer\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsSet.Services.ConnectionEnd, TlsSetConnectionEnd, (Tls, IsServer), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Set the ciphers list to be used by the TLS object.\r
+\r
+  This function sets the ciphers for use by a specified TLS object.\r
+\r
+  @param[in]  Tls          Pointer to a TLS object.\r
+  @param[in]  CipherId     Array of UINT16 cipher identifiers. Each UINT16\r
+                           cipher identifier comes from the TLS Cipher Suite\r
+                           Registry of the IANA, interpreting Byte1 and Byte2\r
+                           in network (big endian) byte order.\r
+  @param[in]  CipherNum    The number of cipher in the list.\r
+\r
+  @retval  EFI_SUCCESS           The ciphers list was set successfully.\r
+  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
+  @retval  EFI_UNSUPPORTED       No supported TLS cipher was found in CipherId.\r
+  @retval  EFI_OUT_OF_RESOURCES  Memory allocation failed.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsSetCipherList (\r
+  IN     VOID    *Tls,\r
+  IN     UINT16  *CipherId,\r
+  IN     UINTN   CipherNum\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsSet.Services.CipherList, TlsSetCipherList, (Tls, CipherId, CipherNum), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Set the compression method for TLS/SSL operations.\r
+\r
+  This function handles TLS/SSL integrated compression methods.\r
+\r
+  @param[in]  CompMethod    The compression method ID.\r
+\r
+  @retval  EFI_SUCCESS        The compression method for the communication was\r
+                              set successfully.\r
+  @retval  EFI_UNSUPPORTED    Unsupported compression method.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsSetCompressionMethod (\r
+  IN     UINT8  CompMethod\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsSet.Services.CompressionMethod, TlsSetCompressionMethod, (CompMethod), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Set peer certificate verification mode for the TLS connection.\r
+\r
+  This function sets the verification mode flags for the TLS connection.\r
+\r
+  @param[in]  Tls           Pointer to the TLS object.\r
+  @param[in]  VerifyMode    A set of logically or'ed verification mode flags.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CryptoServiceTlsSetVerify (\r
+  IN     VOID    *Tls,\r
+  IN     UINT32  VerifyMode\r
+  )\r
+{\r
+  CALL_VOID_BASECRYPTLIB (TlsSet.Services.Verify, TlsSetVerify, (Tls, VerifyMode));\r
+}\r
+\r
+/**\r
+  Set the specified host name to be verified.\r
+\r
+  @param[in]  Tls           Pointer to the TLS object.\r
+  @param[in]  Flags         The setting flags during the validation.\r
+  @param[in]  HostName      The specified host name to be verified.\r
+\r
+  @retval  EFI_SUCCESS           The HostName setting was set successfully.\r
+  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
+  @retval  EFI_ABORTED           Invalid HostName setting.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsSetVerifyHost (\r
+  IN     VOID    *Tls,\r
+  IN     UINT32  Flags,\r
+  IN     CHAR8   *HostName\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsSet.Services.VerifyHost, TlsSetVerifyHost, (Tls, Flags, HostName), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Sets a TLS/SSL session ID to be used during TLS/SSL connect.\r
+\r
+  This function sets a session ID to be used when the TLS/SSL connection is\r
+  to be established.\r
+\r
+  @param[in]  Tls             Pointer to the TLS object.\r
+  @param[in]  SessionId       Session ID data used for session resumption.\r
+  @param[in]  SessionIdLen    Length of Session ID in bytes.\r
+\r
+  @retval  EFI_SUCCESS           Session ID was set successfully.\r
+  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
+  @retval  EFI_UNSUPPORTED       No available session for ID setting.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsSetSessionId (\r
+  IN     VOID    *Tls,\r
+  IN     UINT8   *SessionId,\r
+  IN     UINT16  SessionIdLen\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsSet.Services.SessionId, TlsSetSessionId, (Tls, SessionId, SessionIdLen), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Adds the CA to the cert store when requesting Server or Client authentication.\r
+\r
+  This function adds the CA certificate to the list of CAs when requesting\r
+  Server or Client authentication for the chosen TLS connection.\r
+\r
+  @param[in]  Tls         Pointer to the TLS object.\r
+  @param[in]  Data        Pointer to the data buffer of a DER-encoded binary\r
+                          X.509 certificate or PEM-encoded X.509 certificate.\r
+  @param[in]  DataSize    The size of data buffer in bytes.\r
+\r
+  @retval  EFI_SUCCESS             The operation succeeded.\r
+  @retval  EFI_INVALID_PARAMETER   The parameter is invalid.\r
+  @retval  EFI_OUT_OF_RESOURCES    Required resources could not be allocated.\r
+  @retval  EFI_ABORTED             Invalid X.509 certificate.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsSetCaCertificate (\r
+  IN     VOID   *Tls,\r
+  IN     VOID   *Data,\r
+  IN     UINTN  DataSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsSet.Services.CaCertificate, TlsSetCaCertificate, (Tls, Data, DataSize), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Loads the local public certificate into the specified TLS object.\r
+\r
+  This function loads the X.509 certificate into the specified TLS object\r
+  for TLS negotiation.\r
+\r
+  @param[in]  Tls         Pointer to the TLS object.\r
+  @param[in]  Data        Pointer to the data buffer of a DER-encoded binary\r
+                          X.509 certificate or PEM-encoded X.509 certificate.\r
+  @param[in]  DataSize    The size of data buffer in bytes.\r
+\r
+  @retval  EFI_SUCCESS             The operation succeeded.\r
+  @retval  EFI_INVALID_PARAMETER   The parameter is invalid.\r
+  @retval  EFI_OUT_OF_RESOURCES    Required resources could not be allocated.\r
+  @retval  EFI_ABORTED             Invalid X.509 certificate.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsSetHostPublicCert (\r
+  IN     VOID   *Tls,\r
+  IN     VOID   *Data,\r
+  IN     UINTN  DataSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsSet.Services.HostPublicCert, TlsSetHostPublicCert, (Tls, Data, DataSize), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Adds the local private key to the specified TLS object.\r
+\r
+  This function adds the local private key (DER-encoded or PEM-encoded or PKCS#8 private\r
+  key) into the specified TLS object for TLS negotiation.\r
+\r
+  @param[in]  Tls         Pointer to the TLS object.\r
+  @param[in]  Data        Pointer to the data buffer of a DER-encoded or PEM-encoded\r
+                          or PKCS#8 private key.\r
+  @param[in]  DataSize    The size of data buffer in bytes.\r
+  @param[in]  Password    Pointer to NULL-terminated private key password, set it to NULL\r
+                          if private key not encrypted.\r
+\r
+  @retval  EFI_SUCCESS     The operation succeeded.\r
+  @retval  EFI_UNSUPPORTED This function is not supported.\r
+  @retval  EFI_ABORTED     Invalid private key data.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsSetHostPrivateKeyEx (\r
+  IN     VOID   *Tls,\r
+  IN     VOID   *Data,\r
+  IN     UINTN  DataSize,\r
+  IN     VOID   *Password  OPTIONAL\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsSet.Services.HostPrivateKeyEx, TlsSetHostPrivateKeyEx, (Tls, Data, DataSize, Password), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Adds the local private key to the specified TLS object.\r
+\r
+  This function adds the local private key (DER-encoded or PEM-encoded or PKCS#8 private\r
+  key) into the specified TLS object for TLS negotiation.\r
+\r
+  @param[in]  Tls         Pointer to the TLS object.\r
+  @param[in]  Data        Pointer to the data buffer of a DER-encoded or PEM-encoded\r
+                          or PKCS#8 private key.\r
+  @param[in]  DataSize    The size of data buffer in bytes.\r
+\r
+  @retval  EFI_SUCCESS     The operation succeeded.\r
+  @retval  EFI_UNSUPPORTED This function is not supported.\r
+  @retval  EFI_ABORTED     Invalid private key data.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsSetHostPrivateKey (\r
+  IN     VOID   *Tls,\r
+  IN     VOID   *Data,\r
+  IN     UINTN  DataSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsSet.Services.HostPrivateKey, TlsSetHostPrivateKey, (Tls, Data, DataSize), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Adds the CA-supplied certificate revocation list for certificate validation.\r
+\r
+  This function adds the CA-supplied certificate revocation list data for\r
+  certificate validity checking.\r
+\r
+  @param[in]  Data        Pointer to the data buffer of a DER-encoded CRL data.\r
+  @param[in]  DataSize    The size of data buffer in bytes.\r
+\r
+  @retval  EFI_SUCCESS     The operation succeeded.\r
+  @retval  EFI_UNSUPPORTED This function is not supported.\r
+  @retval  EFI_ABORTED     Invalid CRL data.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsSetCertRevocationList (\r
+  IN     VOID   *Data,\r
+  IN     UINTN  DataSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsSet.Services.CertRevocationList, TlsSetCertRevocationList, (Data, DataSize), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Set the signature algorithm list to used by the TLS object.\r
+\r
+  This function sets the signature algorithms for use by a specified TLS object.\r
+\r
+  @param[in]  Tls                Pointer to a TLS object.\r
+  @param[in]  Data               Array of UINT8 of signature algorithms. The array consists of\r
+                                 pairs of the hash algorithm and the signature algorithm as defined\r
+                                 in RFC 5246\r
+  @param[in]  DataSize           The length the SignatureAlgoList. Must be divisible by 2.\r
+\r
+  @retval  EFI_SUCCESS           The signature algorithm list was set successfully.\r
+  @retval  EFI_INVALID_PARAMETER The parameters are invalid.\r
+  @retval  EFI_UNSUPPORTED       No supported TLS signature algorithm was found in SignatureAlgoList\r
+  @retval  EFI_OUT_OF_RESOURCES  Memory allocation failed.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsSetSignatureAlgoList (\r
+  IN     VOID   *Tls,\r
+  IN     UINT8  *Data,\r
+  IN     UINTN  DataSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsSet.Services.SignatureAlgoList, TlsSetSignatureAlgoList, (Tls, Data, DataSize), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Set the EC curve to be used for TLS flows\r
+\r
+  This function sets the EC curve to be used for TLS flows.\r
+\r
+  @param[in]  Tls                Pointer to a TLS object.\r
+  @param[in]  Data               An EC named curve as defined in section 5.1.1 of RFC 4492.\r
+  @param[in]  DataSize           Size of Data, it should be sizeof (UINT32)\r
+\r
+  @retval  EFI_SUCCESS           The EC curve was set successfully.\r
+  @retval  EFI_INVALID_PARAMETER The parameters are invalid.\r
+  @retval  EFI_UNSUPPORTED       The requested TLS EC curve is not supported\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsSetEcCurve (\r
+  IN     VOID   *Tls,\r
+  IN     UINT8  *Data,\r
+  IN     UINTN  DataSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsSet.Services.EcCurve, TlsSetEcCurve, (Tls, Data, DataSize), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Gets the protocol version used by the specified TLS connection.\r
+\r
+  This function returns the protocol version used by the specified TLS\r
+  connection.\r
+\r
+  If Tls is NULL, then ASSERT().\r
+\r
+  @param[in]  Tls    Pointer to the TLS object.\r
+\r
+  @return  The protocol version of the specified TLS connection.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+CryptoServiceTlsGetVersion (\r
+  IN     VOID  *Tls\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsGet.Services.Version, TlsGetVersion, (Tls), 0);\r
+}\r
+\r
+/**\r
+  Gets the connection end of the specified TLS connection.\r
+\r
+  This function returns the connection end (as client or as server) used by\r
+  the specified TLS connection.\r
+\r
+  If Tls is NULL, then ASSERT().\r
+\r
+  @param[in]  Tls    Pointer to the TLS object.\r
+\r
+  @return  The connection end used by the specified TLS connection.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+CryptoServiceTlsGetConnectionEnd (\r
+  IN     VOID  *Tls\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsGet.Services.ConnectionEnd, TlsGetConnectionEnd, (Tls), 0);\r
+}\r
+\r
+/**\r
+  Gets the cipher suite used by the specified TLS connection.\r
+\r
+  This function returns current cipher suite used by the specified\r
+  TLS connection.\r
+\r
+  @param[in]      Tls         Pointer to the TLS object.\r
+  @param[in,out]  CipherId    The cipher suite used by the TLS object.\r
+\r
+  @retval  EFI_SUCCESS           The cipher suite was returned successfully.\r
+  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
+  @retval  EFI_UNSUPPORTED       Unsupported cipher suite.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsGetCurrentCipher (\r
+  IN     VOID    *Tls,\r
+  IN OUT UINT16  *CipherId\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsGet.Services.CurrentCipher, TlsGetCurrentCipher, (Tls, CipherId), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Gets the compression methods used by the specified TLS connection.\r
+\r
+  This function returns current integrated compression methods used by\r
+  the specified TLS connection.\r
+\r
+  @param[in]      Tls              Pointer to the TLS object.\r
+  @param[in,out]  CompressionId    The current compression method used by\r
+                                   the TLS object.\r
+\r
+  @retval  EFI_SUCCESS           The compression method was returned successfully.\r
+  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
+  @retval  EFI_ABORTED           Invalid Compression method.\r
+  @retval  EFI_UNSUPPORTED       This function is not supported.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsGetCurrentCompressionId (\r
+  IN     VOID   *Tls,\r
+  IN OUT UINT8  *CompressionId\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsGet.Services.CurrentCompressionId, TlsGetCurrentCompressionId, (Tls, CompressionId), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Gets the verification mode currently set in the TLS connection.\r
+\r
+  This function returns the peer verification mode currently set in the\r
+  specified TLS connection.\r
+\r
+  If Tls is NULL, then ASSERT().\r
+\r
+  @param[in]  Tls    Pointer to the TLS object.\r
+\r
+  @return  The verification mode set in the specified TLS connection.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+CryptoServiceTlsGetVerify (\r
+  IN     VOID  *Tls\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsGet.Services.Verify, TlsGetVerify, (Tls), 0);\r
+}\r
+\r
+/**\r
+  Gets the session ID used by the specified TLS connection.\r
+\r
+  This function returns the TLS/SSL session ID currently used by the\r
+  specified TLS connection.\r
+\r
+  @param[in]      Tls             Pointer to the TLS object.\r
+  @param[in,out]  SessionId       Buffer to contain the returned session ID.\r
+  @param[in,out]  SessionIdLen    The length of Session ID in bytes.\r
+\r
+  @retval  EFI_SUCCESS           The Session ID was returned successfully.\r
+  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
+  @retval  EFI_UNSUPPORTED       Invalid TLS/SSL session.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsGetSessionId (\r
+  IN     VOID    *Tls,\r
+  IN OUT UINT8   *SessionId,\r
+  IN OUT UINT16  *SessionIdLen\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsGet.Services.SessionId, TlsGetSessionId, (Tls, SessionId, SessionIdLen), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Gets the client random data used in the specified TLS connection.\r
+\r
+  This function returns the TLS/SSL client random data currently used in\r
+  the specified TLS connection.\r
+\r
+  @param[in]      Tls             Pointer to the TLS object.\r
+  @param[in,out]  ClientRandom    Buffer to contain the returned client\r
+                                  random data (32 bytes).\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CryptoServiceTlsGetClientRandom (\r
+  IN     VOID   *Tls,\r
+  IN OUT UINT8  *ClientRandom\r
+  )\r
+{\r
+  CALL_VOID_BASECRYPTLIB (TlsGet.Services.ClientRandom, TlsGetClientRandom, (Tls, ClientRandom));\r
+}\r
+\r
+/**\r
+  Gets the server random data used in the specified TLS connection.\r
+\r
+  This function returns the TLS/SSL server random data currently used in\r
+  the specified TLS connection.\r
+\r
+  @param[in]      Tls             Pointer to the TLS object.\r
+  @param[in,out]  ServerRandom    Buffer to contain the returned server\r
+                                  random data (32 bytes).\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CryptoServiceTlsGetServerRandom (\r
+  IN     VOID   *Tls,\r
+  IN OUT UINT8  *ServerRandom\r
+  )\r
+{\r
+  CALL_VOID_BASECRYPTLIB (TlsGet.Services.ServerRandom, TlsGetServerRandom, (Tls, ServerRandom));\r
+}\r
+\r
+/**\r
+  Gets the master key data used in the specified TLS connection.\r
+\r
+  This function returns the TLS/SSL master key material currently used in\r
+  the specified TLS connection.\r
+\r
+  @param[in]      Tls            Pointer to the TLS object.\r
+  @param[in,out]  KeyMaterial    Buffer to contain the returned key material.\r
+\r
+  @retval  EFI_SUCCESS           Key material was returned successfully.\r
+  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
+  @retval  EFI_UNSUPPORTED       Invalid TLS/SSL session.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsGetKeyMaterial (\r
+  IN     VOID   *Tls,\r
+  IN OUT UINT8  *KeyMaterial\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsGet.Services.KeyMaterial, TlsGetKeyMaterial, (Tls, KeyMaterial), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Gets the CA Certificate from the cert store.\r
+\r
+  This function returns the CA certificate for the chosen\r
+  TLS connection.\r
+\r
+  @param[in]      Tls         Pointer to the TLS object.\r
+  @param[out]     Data        Pointer to the data buffer to receive the CA\r
+                              certificate data sent to the client.\r
+  @param[in,out]  DataSize    The size of data buffer in bytes.\r
+\r
+  @retval  EFI_SUCCESS             The operation succeeded.\r
+  @retval  EFI_UNSUPPORTED         This function is not supported.\r
+  @retval  EFI_BUFFER_TOO_SMALL    The Data is too small to hold the data.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsGetCaCertificate (\r
+  IN     VOID   *Tls,\r
+  OUT    VOID   *Data,\r
+  IN OUT UINTN  *DataSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsGet.Services.CaCertificate, TlsGetCaCertificate, (Tls, Data, DataSize), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Gets the local public Certificate set in the specified TLS object.\r
+\r
+  This function returns the local public certificate which was currently set\r
+  in the specified TLS object.\r
+\r
+  @param[in]      Tls         Pointer to the TLS object.\r
+  @param[out]     Data        Pointer to the data buffer to receive the local\r
+                              public certificate.\r
+  @param[in,out]  DataSize    The size of data buffer in bytes.\r
+\r
+  @retval  EFI_SUCCESS             The operation succeeded.\r
+  @retval  EFI_INVALID_PARAMETER   The parameter is invalid.\r
+  @retval  EFI_NOT_FOUND           The certificate is not found.\r
+  @retval  EFI_BUFFER_TOO_SMALL    The Data is too small to hold the data.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsGetHostPublicCert (\r
+  IN     VOID   *Tls,\r
+  OUT    VOID   *Data,\r
+  IN OUT UINTN  *DataSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsGet.Services.HostPublicCert, TlsGetHostPublicCert, (Tls, Data, DataSize), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Gets the local private key set in the specified TLS object.\r
+\r
+  This function returns the local private key data which was currently set\r
+  in the specified TLS object.\r
+\r
+  @param[in]      Tls         Pointer to the TLS object.\r
+  @param[out]     Data        Pointer to the data buffer to receive the local\r
+                              private key data.\r
+  @param[in,out]  DataSize    The size of data buffer in bytes.\r
+\r
+  @retval  EFI_SUCCESS             The operation succeeded.\r
+  @retval  EFI_UNSUPPORTED         This function is not supported.\r
+  @retval  EFI_BUFFER_TOO_SMALL    The Data is too small to hold the data.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsGetHostPrivateKey (\r
+  IN     VOID   *Tls,\r
+  OUT    VOID   *Data,\r
+  IN OUT UINTN  *DataSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsGet.Services.HostPrivateKey, TlsGetHostPrivateKey, (Tls, Data, DataSize), EFI_UNSUPPORTED);\r
+}\r
+\r
+/**\r
+  Gets the CA-supplied certificate revocation list data set in the specified\r
+  TLS object.\r
+\r
+  This function returns the CA-supplied certificate revocation list data which\r
+  was currently set in the specified TLS object.\r
+\r
+  @param[out]     Data        Pointer to the data buffer to receive the CRL data.\r
+  @param[in,out]  DataSize    The size of data buffer in bytes.\r
+\r
+  @retval  EFI_SUCCESS             The operation succeeded.\r
+  @retval  EFI_UNSUPPORTED         This function is not supported.\r
+  @retval  EFI_BUFFER_TOO_SMALL    The Data is too small to hold the data.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CryptoServiceTlsGetCertRevocationList (\r
+  OUT    VOID   *Data,\r
+  IN OUT UINTN  *DataSize\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (TlsGet.Services.CertRevocationList, TlsGetCertRevocationList, (Data, DataSize), EFI_UNSUPPORTED);\r
 }\r
 \r
 /**\r
-  Generates DH public key.\r
-\r
-  This function generates random secret exponent, and computes the public key, which is\r
-  returned via parameter PublicKey and PublicKeySize. DH context is updated accordingly.\r
-  If the PublicKey buffer is too small to hold the public key, FALSE is returned and\r
-  PublicKeySize is set to the required buffer size to obtain the public key.\r
+  Derive keying material from a TLS connection.\r
 \r
-  If DhContext is NULL, then return FALSE.\r
-  If PublicKeySize is NULL, then return FALSE.\r
-  If PublicKeySize is large enough but PublicKey is NULL, then return FALSE.\r
-  If this interface is not supported, then return FALSE.\r
+  This function exports keying material using the mechanism described in RFC\r
+  5705.\r
 \r
-  @param[in, out]  DhContext      Pointer to the DH context.\r
-  @param[out]      PublicKey      Pointer to the buffer to receive generated public key.\r
-  @param[in, out]  PublicKeySize  On input, the size of PublicKey buffer in bytes.\r
-                                 On output, the size of data returned in PublicKey buffer in bytes.\r
+  @param[in]      Tls          Pointer to the TLS object\r
+  @param[in]      Label        Description of the key for the PRF function\r
+  @param[in]      Context      Optional context\r
+  @param[in]      ContextLen   The length of the context value in bytes\r
+  @param[out]     KeyBuffer    Buffer to hold the output of the TLS-PRF\r
+  @param[in]      KeyBufferLen The length of the KeyBuffer\r
 \r
-  @retval TRUE   DH public key generation succeeded.\r
-  @retval FALSE  DH public key generation failed.\r
-  @retval FALSE  PublicKeySize is not large enough.\r
-  @retval FALSE  This interface is not supported.\r
+  @retval  EFI_SUCCESS             The operation succeeded.\r
+  @retval  EFI_INVALID_PARAMETER   The TLS object is invalid.\r
+  @retval  EFI_PROTOCOL_ERROR      Some other error occurred.\r
 \r
 **/\r
-BOOLEAN\r
+EFI_STATUS\r
 EFIAPI\r
-CryptoServiceDhGenerateKey (\r
-  IN OUT  VOID   *DhContext,\r
-  OUT     UINT8  *PublicKey,\r
-  IN OUT  UINTN  *PublicKeySize\r
+CryptoServiceTlsGetExportKey (\r
+  IN     VOID        *Tls,\r
+  IN     CONST VOID  *Label,\r
+  IN     CONST VOID  *Context,\r
+  IN     UINTN       ContextLen,\r
+  OUT    VOID        *KeyBuffer,\r
+  IN     UINTN       KeyBufferLen\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Dh.Services.GenerateKey, DhGenerateKey, (DhContext, PublicKey, PublicKeySize), FALSE);\r
+  return CALL_BASECRYPTLIB (\r
+           TlsGet.Services.ExportKey,\r
+           TlsGetExportKey,\r
+           (Tls, Label, Context, ContextLen,\r
+            KeyBuffer, KeyBufferLen),\r
+           EFI_UNSUPPORTED\r
+           );\r
 }\r
 \r
 /**\r
-  Computes exchanged common key.\r
+  Carries out the RSA-SSA signature generation with EMSA-PSS encoding scheme.\r
 \r
-  Given peer's public key, this function computes the exchanged common key, based on its own\r
-  context including value of prime modulus and random secret exponent.\r
+  This function carries out the RSA-SSA signature generation with EMSA-PSS encoding scheme defined in\r
+  RFC 8017.\r
+  Mask generation function is the same as the message digest algorithm.\r
+  If the Signature buffer is too small to hold the contents of signature, FALSE\r
+  is returned and SigSize is set to the required buffer size to obtain the signature.\r
 \r
-  If DhContext is NULL, then return FALSE.\r
-  If PeerPublicKey is NULL, then return FALSE.\r
-  If KeySize is NULL, then return FALSE.\r
-  If Key is NULL, then return FALSE.\r
-  If KeySize is not large enough, then return FALSE.\r
+  If RsaContext is NULL, then return FALSE.\r
+  If Message is NULL, then return FALSE.\r
+  If MsgSize is zero or > INT_MAX, then return FALSE.\r
+  If DigestLen is NOT 32, 48 or 64, return FALSE.\r
+  If SaltLen is not equal to DigestLen, then return FALSE.\r
+  If SigSize is large enough but Signature is NULL, then return FALSE.\r
   If this interface is not supported, then return FALSE.\r
 \r
-  @param[in, out]  DhContext          Pointer to the DH context.\r
-  @param[in]       PeerPublicKey      Pointer to the peer's public key.\r
-  @param[in]       PeerPublicKeySize  Size of peer's public key in bytes.\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
+  @param[in]      RsaContext   Pointer to RSA context for signature generation.\r
+  @param[in]      Message      Pointer to octet message to be signed.\r
+  @param[in]      MsgSize      Size of the message in bytes.\r
+  @param[in]      DigestLen    Length of the digest in bytes to be used for RSA signature operation.\r
+  @param[in]      SaltLen      Length of the salt in bytes to be used for PSS encoding.\r
+  @param[out]     Signature    Pointer to buffer to receive RSA PSS signature.\r
+  @param[in, out] SigSize      On input, the size of Signature buffer in bytes.\r
+                               On output, the size of data returned in Signature buffer in bytes.\r
 \r
-  @retval TRUE   DH exchanged key generation succeeded.\r
-  @retval FALSE  DH exchanged key generation failed.\r
-  @retval FALSE  KeySize is not large enough.\r
-  @retval FALSE  This interface is not supported.\r
+  @retval  TRUE   Signature successfully generated in RSASSA-PSS.\r
+  @retval  FALSE  Signature generation failed.\r
+  @retval  FALSE  SigSize is too small.\r
+  @retval  FALSE  This interface is not supported.\r
 \r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServiceDhComputeKey (\r
-  IN OUT  VOID         *DhContext,\r
-  IN      CONST UINT8  *PeerPublicKey,\r
-  IN      UINTN        PeerPublicKeySize,\r
-  OUT     UINT8        *Key,\r
-  IN OUT  UINTN        *KeySize\r
+CryptoServiceRsaPssSign (\r
+  IN      VOID         *RsaContext,\r
+  IN      CONST UINT8  *Message,\r
+  IN      UINTN        MsgSize,\r
+  IN      UINT16       DigestLen,\r
+  IN      UINT16       SaltLen,\r
+  OUT     UINT8        *Signature,\r
+  IN OUT  UINTN        *SigSize\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Dh.Services.ComputeKey, DhComputeKey, (DhContext, PeerPublicKey, PeerPublicKeySize, Key, KeySize), FALSE);\r
+  return CALL_BASECRYPTLIB (RsaPss.Services.Sign, RsaPssSign, (RsaContext, Message, MsgSize, DigestLen, SaltLen, Signature, SigSize), FALSE);\r
 }\r
 \r
-//=====================================================================================\r
-//    Pseudo-Random Generation Primitive\r
-//=====================================================================================\r
-\r
 /**\r
-  Sets up the seed value for the pseudorandom number generator.\r
-\r
-  This function sets up the seed value for the pseudorandom number generator.\r
-  If Seed is not NULL, then the seed passed in is used.\r
-  If Seed is NULL, then default seed is used.\r
-  If this interface is not supported, then return FALSE.\r
+  Verifies the RSA signature with RSASSA-PSS signature scheme defined in RFC 8017.\r
+  Implementation determines salt length automatically from the signature encoding.\r
+  Mask generation function is the same as the message digest algorithm.\r
+  Salt length should be equal to digest length.\r
 \r
-  @param[in]  Seed      Pointer to seed value.\r
-                        If NULL, default seed is used.\r
-  @param[in]  SeedSize  Size of seed value.\r
-                        If Seed is NULL, this parameter is ignored.\r
+  @param[in]  RsaContext      Pointer to RSA context for signature verification.\r
+  @param[in]  Message         Pointer to octet message to be verified.\r
+  @param[in]  MsgSize         Size of the message in bytes.\r
+  @param[in]  Signature       Pointer to RSASSA-PSS signature to be verified.\r
+  @param[in]  SigSize         Size of signature in bytes.\r
+  @param[in]  DigestLen       Length of digest for RSA operation.\r
+  @param[in]  SaltLen         Salt length for PSS encoding.\r
 \r
-  @retval TRUE   Pseudorandom number generator has enough entropy for random generation.\r
-  @retval FALSE  Pseudorandom number generator does not have enough entropy for random generation.\r
-  @retval FALSE  This interface is not supported.\r
+  @retval  TRUE   Valid signature encoded in RSASSA-PSS.\r
+  @retval  FALSE  Invalid signature or invalid RSA context.\r
 \r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServiceRandomSeed (\r
-  IN  CONST  UINT8  *Seed  OPTIONAL,\r
-  IN  UINTN         SeedSize\r
+CryptoServiceRsaPssVerify (\r
+  IN  VOID         *RsaContext,\r
+  IN  CONST UINT8  *Message,\r
+  IN  UINTN        MsgSize,\r
+  IN  CONST UINT8  *Signature,\r
+  IN  UINTN        SigSize,\r
+  IN  UINT16       DigestLen,\r
+  IN  UINT16       SaltLen\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Random.Services.Seed, RandomSeed, (Seed, SeedSize), FALSE);\r
+  return CALL_BASECRYPTLIB (RsaPss.Services.Verify, RsaPssVerify, (RsaContext, Message, MsgSize, Signature, SigSize, DigestLen, SaltLen), FALSE);\r
 }\r
 \r
 /**\r
-  Generates a pseudorandom byte stream of the specified size.\r
-\r
-  If Output is NULL, then return FALSE.\r
-  If this interface is not supported, then return FALSE.\r
+  Parallel hash function ParallelHash256, as defined in NIST's Special Publication 800-185,\r
+  published December 2016.\r
 \r
-  @param[out]  Output  Pointer to buffer to receive random value.\r
-  @param[in]   Size    Size of random bytes to generate.\r
+  @param[in]   Input            Pointer to the input message (X).\r
+  @param[in]   InputByteLen     The number(>0) of input bytes provided for the input data.\r
+  @param[in]   BlockSize        The size of each block (B).\r
+  @param[out]  Output           Pointer to the output buffer.\r
+  @param[in]   OutputByteLen    The desired number of output bytes (L).\r
+  @param[in]   Customization    Pointer to the customization string (S).\r
+  @param[in]   CustomByteLen    The length of the customization string in bytes.\r
 \r
-  @retval TRUE   Pseudorandom byte stream generated successfully.\r
-  @retval FALSE  Pseudorandom number generator fails to generate due to lack of entropy.\r
+  @retval TRUE   ParallelHash256 digest computation succeeded.\r
+  @retval FALSE  ParallelHash256 digest computation failed.\r
   @retval FALSE  This interface is not supported.\r
 \r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServiceRandomBytes (\r
-  OUT  UINT8  *Output,\r
-  IN   UINTN  Size\r
+CryptoServiceParallelHash256HashAll (\r
+  IN CONST VOID   *Input,\r
+  IN       UINTN  InputByteLen,\r
+  IN       UINTN  BlockSize,\r
+  OUT      VOID   *Output,\r
+  IN       UINTN  OutputByteLen,\r
+  IN CONST VOID   *Customization,\r
+  IN       UINTN  CustomByteLen\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Random.Services.Bytes, RandomBytes, (Output, Size), FALSE);\r
+  return CALL_BASECRYPTLIB (ParallelHash.Services.HashAll, ParallelHash256HashAll, (Input, InputByteLen, BlockSize, Output, OutputByteLen, Customization, CustomByteLen), FALSE);\r
 }\r
 \r
-//=====================================================================================\r
-//    Key Derivation Function Primitive\r
-//=====================================================================================\r
-\r
 /**\r
-  Derive key data using HMAC-SHA256 based KDF.\r
+  Performs AEAD AES-GCM authenticated encryption on a data buffer and additional authenticated data (AAD).\r
 \r
-  @param[in]   Key              Pointer to the user-supplied key.\r
-  @param[in]   KeySize          Key size in bytes.\r
-  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
-  @param[in]   SaltSize         Salt size in bytes.\r
-  @param[in]   Info             Pointer to the application specific info.\r
-  @param[in]   InfoSize         Info size in bytes.\r
-  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
-  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+  IvSize must be 12, otherwise FALSE is returned.\r
+  KeySize must be 16, 24 or 32, otherwise FALSE is returned.\r
+  TagSize must be 12, 13, 14, 15, 16, otherwise FALSE is returned.\r
 \r
-  @retval TRUE   Hkdf generated successfully.\r
-  @retval FALSE  Hkdf generation failed.\r
+  @param[in]   Key         Pointer to the encryption key.\r
+  @param[in]   KeySize     Size of the encryption key in bytes.\r
+  @param[in]   Iv          Pointer to the IV value.\r
+  @param[in]   IvSize      Size of the IV value in bytes.\r
+  @param[in]   AData       Pointer to the additional authenticated data (AAD).\r
+  @param[in]   ADataSize   Size of the additional authenticated data (AAD) in bytes.\r
+  @param[in]   DataIn      Pointer to the input data buffer to be encrypted.\r
+  @param[in]   DataInSize  Size of the input data buffer in bytes.\r
+  @param[out]  TagOut      Pointer to a buffer that receives the authentication tag output.\r
+  @param[in]   TagSize     Size of the authentication tag in bytes.\r
+  @param[out]  DataOut     Pointer to a buffer that receives the encryption output.\r
+  @param[out]  DataOutSize Size of the output data buffer in bytes.\r
+\r
+  @retval TRUE   AEAD AES-GCM authenticated encryption succeeded.\r
+  @retval FALSE  AEAD AES-GCM authenticated encryption failed.\r
 \r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServiceHkdfSha256ExtractAndExpand (\r
+CryptoServiceAeadAesGcmEncrypt (\r
   IN   CONST UINT8  *Key,\r
   IN   UINTN        KeySize,\r
-  IN   CONST UINT8  *Salt,\r
-  IN   UINTN        SaltSize,\r
-  IN   CONST UINT8  *Info,\r
-  IN   UINTN        InfoSize,\r
-  OUT  UINT8        *Out,\r
-  IN   UINTN        OutSize\r
+  IN   CONST UINT8  *Iv,\r
+  IN   UINTN        IvSize,\r
+  IN   CONST UINT8  *AData,\r
+  IN   UINTN        ADataSize,\r
+  IN   CONST UINT8  *DataIn,\r
+  IN   UINTN        DataInSize,\r
+  OUT  UINT8        *TagOut,\r
+  IN   UINTN        TagSize,\r
+  OUT  UINT8        *DataOut,\r
+  OUT  UINTN        *DataOutSize\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Hkdf.Services.Sha256ExtractAndExpand, HkdfSha256ExtractAndExpand, (Key, KeySize, Salt, SaltSize, Info, InfoSize, Out, OutSize), FALSE);\r
+  return CALL_BASECRYPTLIB (AeadAesGcm.Services.Encrypt, AeadAesGcmEncrypt, (Key, KeySize, Iv, IvSize, AData, ADataSize, DataIn, DataInSize, TagOut, TagSize, DataOut, DataOutSize), FALSE);\r
 }\r
 \r
 /**\r
-  Initializes the OpenSSL library.\r
+  Performs AEAD AES-GCM authenticated decryption on a data buffer and additional authenticated data (AAD).\r
 \r
-  This function registers ciphers and digests used directly and indirectly\r
-  by SSL/TLS, and initializes the readable error messages.\r
-  This function must be called before any other action takes places.\r
+  IvSize must be 12, otherwise FALSE is returned.\r
+  KeySize must be 16, 24 or 32, otherwise FALSE is returned.\r
+  TagSize must be 12, 13, 14, 15, 16, otherwise FALSE is returned.\r
+  If additional authenticated data verification fails, FALSE is returned.\r
 \r
-  @retval TRUE   The OpenSSL library has been initialized.\r
-  @retval FALSE  Failed to initialize the OpenSSL library.\r
+  @param[in]   Key         Pointer to the encryption key.\r
+  @param[in]   KeySize     Size of the encryption key in bytes.\r
+  @param[in]   Iv          Pointer to the IV value.\r
+  @param[in]   IvSize      Size of the IV value in bytes.\r
+  @param[in]   AData       Pointer to the additional authenticated data (AAD).\r
+  @param[in]   ADataSize   Size of the additional authenticated data (AAD) in bytes.\r
+  @param[in]   DataIn      Pointer to the input data buffer to be decrypted.\r
+  @param[in]   DataInSize  Size of the input data buffer in bytes.\r
+  @param[in]   Tag         Pointer to a buffer that contains the authentication tag.\r
+  @param[in]   TagSize     Size of the authentication tag in bytes.\r
+  @param[out]  DataOut     Pointer to a buffer that receives the decryption output.\r
+  @param[out]  DataOutSize Size of the output data buffer in bytes.\r
+\r
+  @retval TRUE   AEAD AES-GCM authenticated decryption succeeded.\r
+  @retval FALSE  AEAD AES-GCM authenticated decryption failed.\r
 \r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsInitialize (\r
-  VOID\r
+CryptoServiceAeadAesGcmDecrypt (\r
+  IN   CONST UINT8  *Key,\r
+  IN   UINTN        KeySize,\r
+  IN   CONST UINT8  *Iv,\r
+  IN   UINTN        IvSize,\r
+  IN   CONST UINT8  *AData,\r
+  IN   UINTN        ADataSize,\r
+  IN   CONST UINT8  *DataIn,\r
+  IN   UINTN        DataInSize,\r
+  IN   CONST UINT8  *Tag,\r
+  IN   UINTN        TagSize,\r
+  OUT  UINT8        *DataOut,\r
+  OUT  UINTN        *DataOutSize\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Tls.Services.Initialize, TlsInitialize, (), FALSE);\r
+  return CALL_BASECRYPTLIB (AeadAesGcm.Services.Decrypt, AeadAesGcmDecrypt, (Key, KeySize, Iv, IvSize, AData, ADataSize, DataIn, DataInSize, Tag, TagSize, DataOut, DataOutSize), FALSE);\r
 }\r
 \r
-/**\r
-  Free an allocated SSL_CTX object.\r
+// =====================================================================================\r
+//    Big number primitives\r
+// =====================================================================================\r
 \r
-  @param[in]  TlsCtx    Pointer to the SSL_CTX object to be released.\r
+/**\r
+  Allocate new Big Number.\r
 \r
+  @retval New BigNum opaque structure or NULL on failure.\r
 **/\r
-VOID\r
+VOID *\r
 EFIAPI\r
-CryptoServiceTlsCtxFree (\r
-  IN   VOID                  *TlsCtx\r
+CryptoServiceBigNumInit (\r
+  VOID\r
   )\r
 {\r
-  CALL_VOID_BASECRYPTLIB (Tls.Services.CtxFree, TlsCtxFree, (TlsCtx));\r
+  return CALL_BASECRYPTLIB (Bn.Services.Init, BigNumInit, (), NULL);\r
 }\r
 \r
 /**\r
-  Creates a new SSL_CTX object as framework to establish TLS/SSL enabled\r
-  connections.\r
-\r
-  @param[in]  MajorVer    Major Version of TLS/SSL Protocol.\r
-  @param[in]  MinorVer    Minor Version of TLS/SSL Protocol.\r
+  Allocate new Big Number and assign the provided value to it.\r
 \r
-  @return  Pointer to an allocated SSL_CTX object.\r
-           If the creation failed, TlsCtxNew() returns NULL.\r
+  @param[in]   Buf    Big endian encoded buffer.\r
+  @param[in]   Len    Buffer length.\r
 \r
+  @retval New BigNum opaque structure or NULL on failure.\r
 **/\r
 VOID *\r
 EFIAPI\r
-CryptoServiceTlsCtxNew (\r
-  IN     UINT8                    MajorVer,\r
-  IN     UINT8                    MinorVer\r
+CryptoServiceBigNumFromBin (\r
+  IN CONST UINT8  *Buf,\r
+  IN UINTN        Len\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Tls.Services.CtxNew, TlsCtxNew, (MajorVer, MinorVer), NULL);\r
+  return CALL_BASECRYPTLIB (Bn.Services.FromBin, BigNumFromBin, (Buf, Len), NULL);\r
 }\r
 \r
 /**\r
-  Free an allocated TLS object.\r
-\r
-  This function removes the TLS object pointed to by Tls and frees up the\r
-  allocated memory. If Tls is NULL, nothing is done.\r
+  Convert the absolute value of Bn into big-endian form and store it at Buf.\r
+  The Buf array should have at least BigNumBytes() in it.\r
 \r
-  @param[in]  Tls    Pointer to the TLS object to be freed.\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
-VOID\r
+INTN\r
 EFIAPI\r
-CryptoServiceTlsFree (\r
-  IN     VOID                     *Tls\r
+CryptoServiceBigNumToBin (\r
+  IN CONST VOID  *Bn,\r
+  OUT UINT8      *Buf\r
   )\r
 {\r
-  CALL_VOID_BASECRYPTLIB (Tls.Services.Free, TlsFree, (Tls));\r
+  return CALL_BASECRYPTLIB (Bn.Services.ToBin, BigNumToBin, (Bn, Buf), -1);\r
 }\r
 \r
 /**\r
-  Create a new TLS object for a connection.\r
+  Free the Big Number.\r
 \r
-  This function creates a new TLS object for a connection. The new object\r
-  inherits the setting of the underlying context TlsCtx: connection method,\r
-  options, verification setting.\r
+  @param[in]   Bn      Big number to free.\r
+  @param[in]   Clear   TRUE if the buffer should be cleared.\r
+**/\r
+VOID\r
+EFIAPI\r
+CryptoServiceBigNumFree (\r
+  IN VOID     *Bn,\r
+  IN BOOLEAN  Clear\r
+  )\r
+{\r
+  CALL_VOID_BASECRYPTLIB (Bn.Services.Free, BigNumFree, (Bn, Clear));\r
+}\r
 \r
-  @param[in]  TlsCtx    Pointer to the SSL_CTX object.\r
+/**\r
+  Calculate the sum of two Big Numbers.\r
+  Please note, all "out" Big number arguments should be properly initialized\r
+  by calling to BigNumInit() or BigNumFromBin() functions.\r
 \r
-  @return  Pointer to an allocated SSL object.\r
-           If the creation failed, TlsNew() returns NULL.\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
-VOID *\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsNew (\r
-  IN     VOID                     *TlsCtx\r
+CryptoServiceBigNumAdd (\r
+  IN CONST VOID  *BnA,\r
+  IN CONST VOID  *BnB,\r
+  OUT VOID       *BnRes\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Tls.Services.New, TlsNew, (TlsCtx), NULL);\r
+  return CALL_BASECRYPTLIB (Bn.Services.Add, BigNumAdd, (BnA, BnB, BnRes), FALSE);\r
 }\r
 \r
 /**\r
-  Checks if the TLS handshake was done.\r
-\r
-  This function will check if the specified TLS handshake was done.\r
+  Subtract two Big Numbers.\r
+  Please note, all "out" Big number arguments should be properly initialized\r
+  by calling to BigNumInit() or BigNumFromBin() functions.\r
 \r
-  @param[in]  Tls    Pointer to the TLS object for handshake state checking.\r
-\r
-  @retval  TRUE     The TLS handshake was done.\r
-  @retval  FALSE    The TLS handshake was not done.\r
+  @param[in]   BnA     Big number.\r
+  @param[in]   BnB     Big number.\r
+  @param[out]  BnRes   The result of BnA - BnB.\r
 \r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
 **/\r
 BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsInHandshake (\r
-  IN     VOID                     *Tls\r
+CryptoServiceBigNumSub (\r
+  IN CONST VOID  *BnA,\r
+  IN CONST VOID  *BnB,\r
+  OUT VOID       *BnRes\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Tls.Services.InHandshake, TlsInHandshake, (Tls), FALSE);\r
+  return CALL_BASECRYPTLIB (Bn.Services.Sub, BigNumSub, (BnA, BnB, BnRes), FALSE);\r
 }\r
 \r
 /**\r
-  Perform a TLS/SSL handshake.\r
-\r
-  This function will perform a TLS/SSL handshake.\r
-\r
-  @param[in]       Tls            Pointer to the TLS object for handshake operation.\r
-  @param[in]       BufferIn       Pointer to the most recently received TLS Handshake packet.\r
-  @param[in]       BufferInSize   Packet size in bytes for the most recently received TLS\r
-                                  Handshake packet.\r
-  @param[out]      BufferOut      Pointer to the buffer to hold the built packet.\r
-  @param[in, out]  BufferOutSize  Pointer to the buffer size in bytes. On input, it is\r
-                                  the buffer size provided by the caller. On output, it\r
-                                  is the buffer size in fact needed to contain the\r
-                                  packet.\r
+  Calculate remainder: BnRes = BnA % BnB.\r
+  Please note, all "out" Big number arguments should be properly initialized\r
+  by calling to BigNumInit() or BigNumFromBin() functions.\r
 \r
-  @retval EFI_SUCCESS             The required TLS packet is built successfully.\r
-  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:\r
-                                  Tls is NULL.\r
-                                  BufferIn is NULL but BufferInSize is NOT 0.\r
-                                  BufferInSize is 0 but BufferIn is NOT NULL.\r
-                                  BufferOutSize is NULL.\r
-                                  BufferOut is NULL if *BufferOutSize is not zero.\r
-  @retval EFI_BUFFER_TOO_SMALL    BufferOutSize is too small to hold the response packet.\r
-  @retval EFI_ABORTED             Something wrong during handshake.\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
-EFI_STATUS\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsDoHandshake (\r
-  IN     VOID                     *Tls,\r
-  IN     UINT8                    *BufferIn, OPTIONAL\r
-  IN     UINTN                    BufferInSize, OPTIONAL\r
-     OUT UINT8                    *BufferOut, OPTIONAL\r
-  IN OUT UINTN                    *BufferOutSize\r
+CryptoServiceBigNumMod (\r
+  IN CONST VOID  *BnA,\r
+  IN CONST VOID  *BnB,\r
+  OUT VOID       *BnRes\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Tls.Services.DoHandshake, TlsDoHandshake, (Tls, BufferIn, BufferInSize, BufferOut, BufferOutSize), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Bn.Services.Mod, BigNumMod, (BnA, BnB, BnRes), FALSE);\r
 }\r
 \r
 /**\r
-  Handle Alert message recorded in BufferIn. If BufferIn is NULL and BufferInSize is zero,\r
-  TLS session has errors and the response packet needs to be Alert message based on error type.\r
-\r
-  @param[in]       Tls            Pointer to the TLS object for state checking.\r
-  @param[in]       BufferIn       Pointer to the most recently received TLS Alert packet.\r
-  @param[in]       BufferInSize   Packet size in bytes for the most recently received TLS\r
-                                  Alert packet.\r
-  @param[out]      BufferOut      Pointer to the buffer to hold the built packet.\r
-  @param[in, out]  BufferOutSize  Pointer to the buffer size in bytes. On input, it is\r
-                                  the buffer size provided by the caller. On output, it\r
-                                  is the buffer size in fact needed to contain the\r
-                                  packet.\r
+  Compute BnA to the BnP-th power modulo BnM.\r
+  Please note, all "out" Big number arguments should be properly initialized.\r
+  by calling to BigNumInit() or BigNumFromBin() functions.\r
 \r
-  @retval EFI_SUCCESS             The required TLS packet is built successfully.\r
-  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:\r
-                                  Tls is NULL.\r
-                                  BufferIn is NULL but BufferInSize is NOT 0.\r
-                                  BufferInSize is 0 but BufferIn is NOT NULL.\r
-                                  BufferOutSize is NULL.\r
-                                  BufferOut is NULL if *BufferOutSize is not zero.\r
-  @retval EFI_ABORTED             An error occurred.\r
-  @retval EFI_BUFFER_TOO_SMALL    BufferOutSize is too small to hold the response packet.\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
-EFI_STATUS\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsHandleAlert (\r
-  IN     VOID                     *Tls,\r
-  IN     UINT8                    *BufferIn, OPTIONAL\r
-  IN     UINTN                    BufferInSize, OPTIONAL\r
-     OUT UINT8                    *BufferOut, OPTIONAL\r
-  IN OUT UINTN                    *BufferOutSize\r
+CryptoServiceBigNumExpMod (\r
+  IN CONST VOID  *BnA,\r
+  IN CONST VOID  *BnP,\r
+  IN CONST VOID  *BnM,\r
+  OUT VOID       *BnRes\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Tls.Services.HandleAlert, TlsHandleAlert, (Tls, BufferIn, BufferInSize, BufferOut, BufferOutSize), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Bn.Services.ExpMod, BigNumExpMod, (BnA, BnP, BnM, BnRes), FALSE);\r
 }\r
 \r
 /**\r
-  Build the CloseNotify packet.\r
+  Compute BnA inverse modulo BnM.\r
+  Please note, all "out" Big number arguments should be properly initialized\r
+  by calling to BigNumInit() or BigNumFromBin() functions.\r
 \r
-  @param[in]       Tls            Pointer to the TLS object for state checking.\r
-  @param[in, out]  Buffer         Pointer to the buffer to hold the built packet.\r
-  @param[in, out]  BufferSize     Pointer to the buffer size in bytes. On input, it is\r
-                                  the buffer size provided by the caller. On output, it\r
-                                  is the buffer size in fact needed to contain the\r
-                                  packet.\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 EFI_SUCCESS             The required TLS packet is built successfully.\r
-  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:\r
-                                  Tls is NULL.\r
-                                  BufferSize is NULL.\r
-                                  Buffer is NULL if *BufferSize is not zero.\r
-  @retval EFI_BUFFER_TOO_SMALL    BufferSize is too small to hold the response packet.\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceBigNumInverseMod (\r
+  IN CONST VOID  *BnA,\r
+  IN CONST VOID  *BnM,\r
+  OUT VOID       *BnRes\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Bn.Services.InverseMod, BigNumInverseMod, (BnA, BnM, BnRes), FALSE);\r
+}\r
 \r
+/**\r
+  Divide two Big Numbers.\r
+  Please note, all "out" Big number arguments should be properly initialized\r
+  by calling to BigNumInit() or BigNumFromBin() functions.\r
+\r
+  @param[in]   BnA     Big number.\r
+  @param[in]   BnB     Big number.\r
+  @param[out]  BnRes   The result, such that BnA / BnB.\r
+\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
 **/\r
-EFI_STATUS\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsCloseNotify (\r
-  IN     VOID                     *Tls,\r
-  IN OUT UINT8                    *Buffer,\r
-  IN OUT UINTN                    *BufferSize\r
+CryptoServiceBigNumDiv (\r
+  IN CONST VOID  *BnA,\r
+  IN CONST VOID  *BnB,\r
+  OUT VOID       *BnRes\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Tls.Services.CloseNotify, TlsCloseNotify, (Tls, Buffer, BufferSize), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Bn.Services.Div, BigNumDiv, (BnA, BnB, BnRes), FALSE);\r
 }\r
 \r
 /**\r
-  Attempts to read bytes from one TLS object and places the data in Buffer.\r
+  Multiply two Big Numbers modulo BnM.\r
+  Please note, all "out" Big number arguments should be properly initialized\r
+  by calling to BigNumInit() or BigNumFromBin() functions.\r
 \r
-  This function will attempt to read BufferSize bytes from the TLS object\r
-  and places the data in Buffer.\r
-\r
-  @param[in]      Tls           Pointer to the TLS object.\r
-  @param[in,out]  Buffer        Pointer to the buffer to store the data.\r
-  @param[in]      BufferSize    The size of Buffer in bytes.\r
-\r
-  @retval  >0    The amount of data successfully read from the TLS object.\r
-  @retval  <=0   No data was successfully read.\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
-INTN\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsCtrlTrafficOut (\r
-  IN     VOID                     *Tls,\r
-  IN OUT VOID                     *Buffer,\r
-  IN     UINTN                    BufferSize\r
+CryptoServiceBigNumMulMod (\r
+  IN CONST VOID  *BnA,\r
+  IN CONST VOID  *BnB,\r
+  IN CONST VOID  *BnM,\r
+  OUT VOID       *BnRes\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Tls.Services.CtrlTrafficOut, TlsCtrlTrafficOut, (Tls, Buffer, BufferSize), 0);\r
+  return CALL_BASECRYPTLIB (Bn.Services.MulMod, BigNumMulMod, (BnA, BnB, BnM, BnRes), FALSE);\r
 }\r
 \r
 /**\r
-  Attempts to write data from the buffer to TLS object.\r
-\r
-  This function will attempt to write BufferSize bytes data from the Buffer\r
-  to the TLS object.\r
-\r
-  @param[in]  Tls           Pointer to the TLS object.\r
-  @param[in]  Buffer        Pointer to the data buffer.\r
-  @param[in]  BufferSize    The size of Buffer in bytes.\r
+  Compare two Big Numbers.\r
 \r
-  @retval  >0    The amount of data successfully written to the TLS object.\r
-  @retval <=0    No data was successfully written.\r
+  @param[in]   BnA     Big number.\r
+  @param[in]   BnB     Big number.\r
 \r
+  @retval 0          BnA == BnB.\r
+  @retval 1          BnA > BnB.\r
+  @retval -1         BnA < BnB.\r
 **/\r
 INTN\r
 EFIAPI\r
-CryptoServiceTlsCtrlTrafficIn (\r
-  IN     VOID                     *Tls,\r
-  IN     VOID                     *Buffer,\r
-  IN     UINTN                    BufferSize\r
+CryptoServiceBigNumCmp (\r
+  IN CONST VOID  *BnA,\r
+  IN CONST VOID  *BnB\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Tls.Services.CtrlTrafficIn, TlsCtrlTrafficIn, (Tls, Buffer, BufferSize), 0);\r
+  return CALL_BASECRYPTLIB (Bn.Services.Cmp, BigNumCmp, (BnA, BnB), 0);\r
 }\r
 \r
 /**\r
-  Attempts to read bytes from the specified TLS connection into the buffer.\r
+  Get number of bits in Bn.\r
 \r
-  This function tries to read BufferSize bytes data from the specified TLS\r
-  connection into the Buffer.\r
+  @param[in]   Bn     Big number.\r
 \r
-  @param[in]      Tls           Pointer to the TLS connection for data reading.\r
-  @param[in,out]  Buffer        Pointer to the data buffer.\r
-  @param[in]      BufferSize    The size of Buffer in bytes.\r
+  @retval Number of bits.\r
+**/\r
+UINTN\r
+EFIAPI\r
+CryptoServiceBigNumBits (\r
+  IN CONST VOID  *Bn\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Bn.Services.Bits, BigNumBits, (Bn), 0);\r
+}\r
 \r
-  @retval  >0    The read operation was successful, and return value is the\r
-                 number of bytes actually read from the TLS connection.\r
-  @retval  <=0   The read operation was not successful.\r
+/**\r
+  Get number of bytes in Bn.\r
+\r
+  @param[in]   Bn     Big number.\r
 \r
+  @retval Number of bytes.\r
 **/\r
-INTN\r
+UINTN\r
 EFIAPI\r
-CryptoServiceTlsRead (\r
-  IN     VOID                     *Tls,\r
-  IN OUT VOID                     *Buffer,\r
-  IN     UINTN                    BufferSize\r
+CryptoServiceBigNumBytes (\r
+  IN CONST VOID  *Bn\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Tls.Services.Read, TlsRead, (Tls, Buffer, BufferSize), 0);\r
+  return CALL_BASECRYPTLIB (Bn.Services.Bytes, BigNumBytes, (Bn), 0);\r
 }\r
 \r
 /**\r
-  Attempts to write data to a TLS connection.\r
+  Checks if Big Number equals to the given Num.\r
 \r
-  This function tries to write BufferSize bytes data from the Buffer into the\r
-  specified TLS connection.\r
+  @param[in]   Bn     Big number.\r
+  @param[in]   Num    Number.\r
 \r
-  @param[in]  Tls           Pointer to the TLS connection for data writing.\r
-  @param[in]  Buffer        Pointer to the data buffer.\r
-  @param[in]  BufferSize    The size of Buffer in bytes.\r
+  @retval TRUE   iff Bn == Num.\r
+  @retval FALSE  otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceBigNumIsWord (\r
+  IN CONST VOID  *Bn,\r
+  IN UINTN       Num\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Bn.Services.IsWord, BigNumIsWord, (Bn, Num), FALSE);\r
+}\r
 \r
-  @retval  >0    The write operation was successful, and return value is the\r
-                 number of bytes actually written to the TLS connection.\r
-  @retval <=0    The write operation was not successful.\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
-INTN\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsWrite (\r
-  IN     VOID                     *Tls,\r
-  IN     VOID                     *Buffer,\r
-  IN     UINTN                    BufferSize\r
+CryptoServiceBigNumIsOdd (\r
+  IN CONST VOID  *Bn\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (Tls.Services.Write, TlsWrite, (Tls, Buffer, BufferSize), 0);\r
+  return CALL_BASECRYPTLIB (Bn.Services.IsOdd, BigNumIsOdd, (Bn), FALSE);\r
 }\r
 \r
 /**\r
-  Set a new TLS/SSL method for a particular TLS object.\r
+  Copy Big number.\r
 \r
-  This function sets a new TLS/SSL method for a particular TLS object.\r
+  @param[out]  BnDst     Destination.\r
+  @param[in]   BnSrc     Source.\r
 \r
-  @param[in]  Tls         Pointer to a TLS object.\r
-  @param[in]  MajorVer    Major Version of TLS/SSL Protocol.\r
-  @param[in]  MinorVer    Minor Version of TLS/SSL Protocol.\r
+  @retval BnDst on success.\r
+  @retval NULL otherwise.\r
+**/\r
+VOID *\r
+EFIAPI\r
+CryptoServiceBigNumCopy (\r
+  OUT VOID       *BnDst,\r
+  IN CONST VOID  *BnSrc\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Bn.Services.Copy, BigNumCopy, (BnDst, BnSrc), NULL);\r
+}\r
 \r
-  @retval  EFI_SUCCESS           The TLS/SSL method was set successfully.\r
-  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
-  @retval  EFI_UNSUPPORTED       Unsupported TLS/SSL method.\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
-EFI_STATUS\r
+CONST VOID *\r
 EFIAPI\r
-CryptoServiceTlsSetVersion (\r
-  IN     VOID                     *Tls,\r
-  IN     UINT8                    MajorVer,\r
-  IN     UINT8                    MinorVer\r
+CryptoServiceBigNumValueOne (\r
+  VOID\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (TlsSet.Services.Version, TlsSetVersion, (Tls, MajorVer, MinorVer), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Bn.Services.ValueOne, BigNumValueOne, (), NULL);\r
 }\r
 \r
 /**\r
-  Set TLS object to work in client or server mode.\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
-  This function prepares a TLS object to work in client or server mode.\r
+  @param[in]   Bn      Big number.\r
+  @param[in]   N       Number of bits to shift.\r
+  @param[out]  BnRes   The result.\r
 \r
-  @param[in]  Tls         Pointer to a TLS object.\r
-  @param[in]  IsServer    Work in server mode.\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceBigNumRShift (\r
+  IN CONST VOID  *Bn,\r
+  IN UINTN       N,\r
+  OUT VOID       *BnRes\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Bn.Services.RShift, BigNumRShift, (Bn, N, BnRes), FALSE);\r
+}\r
 \r
-  @retval  EFI_SUCCESS           The TLS/SSL work mode was set successfully.\r
-  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
-  @retval  EFI_UNSUPPORTED       Unsupported TLS/SSL work mode.\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
-EFI_STATUS\r
+VOID\r
 EFIAPI\r
-CryptoServiceTlsSetConnectionEnd (\r
-  IN     VOID                     *Tls,\r
-  IN     BOOLEAN                  IsServer\r
+CryptoServiceBigNumConstTime (\r
+  IN VOID  *Bn\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (TlsSet.Services.ConnectionEnd, TlsSetConnectionEnd, (Tls, IsServer), EFI_UNSUPPORTED);\r
+  CALL_VOID_BASECRYPTLIB (Bn.Services.ConstTime, BigNumConstTime, (Bn));\r
 }\r
 \r
 /**\r
-  Set the ciphers list to be used by the TLS object.\r
+  Calculate square modulo.\r
+  Please note, all "out" Big number arguments should be properly initialized\r
+  by calling to BigNumInit() or BigNumFromBin() functions.\r
 \r
-  This function sets the ciphers for use by a specified TLS object.\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
-  @param[in]  Tls          Pointer to a TLS object.\r
-  @param[in]  CipherId     Array of UINT16 cipher identifiers. Each UINT16\r
-                           cipher identifier comes from the TLS Cipher Suite\r
-                           Registry of the IANA, interpreting Byte1 and Byte2\r
-                           in network (big endian) byte order.\r
-  @param[in]  CipherNum    The number of cipher in the list.\r
+  @retval TRUE          On success.\r
+  @retval FALSE         Otherwise.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CryptoServiceBigNumSqrMod (\r
+  IN CONST VOID  *BnA,\r
+  IN CONST VOID  *BnM,\r
+  OUT VOID       *BnRes\r
+  )\r
+{\r
+  return CALL_BASECRYPTLIB (Bn.Services.SqrMod, BigNumSqrMod, (BnA, BnM, BnRes), FALSE);\r
+}\r
 \r
-  @retval  EFI_SUCCESS           The ciphers list was set successfully.\r
-  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
-  @retval  EFI_UNSUPPORTED       No supported TLS cipher was found in CipherId.\r
-  @retval  EFI_OUT_OF_RESOURCES  Memory allocation failed.\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
-EFI_STATUS\r
+VOID *\r
 EFIAPI\r
-CryptoServiceTlsSetCipherList (\r
-  IN     VOID                     *Tls,\r
-  IN     UINT16                   *CipherId,\r
-  IN     UINTN                    CipherNum\r
+CryptoServiceBigNumNewContext (\r
+  VOID\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (TlsSet.Services.CipherList, TlsSetCipherList, (Tls, CipherId, CipherNum), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Bn.Services.NewContext, BigNumNewContext, (), NULL);\r
 }\r
 \r
 /**\r
-  Set the compression method for TLS/SSL operations.\r
+  Free Big Number context that was allocated with BigNumNewContext().\r
 \r
-  This function handles TLS/SSL integrated compression methods.\r
+  @param[in]   BnCtx     Big number context to free.\r
+**/\r
+VOID\r
+EFIAPI\r
+CryptoServiceBigNumContextFree (\r
+  IN VOID  *BnCtx\r
+  )\r
+{\r
+  CALL_VOID_BASECRYPTLIB (Bn.Services.ContextFree, BigNumContextFree, (BnCtx));\r
+}\r
 \r
-  @param[in]  CompMethod    The compression method ID.\r
+/**\r
+  Set Big Number to a given value.\r
 \r
-  @retval  EFI_SUCCESS        The compression method for the communication was\r
-                              set successfully.\r
-  @retval  EFI_UNSUPPORTED    Unsupported compression method.\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
-EFI_STATUS\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsSetCompressionMethod (\r
-  IN     UINT8                    CompMethod\r
+CryptoServiceBigNumSetUint (\r
+  IN VOID   *Bn,\r
+  IN UINTN  Val\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (TlsSet.Services.CompressionMethod, TlsSetCompressionMethod, (CompMethod), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Bn.Services.SetUint, BigNumSetUint, (Bn, Val), FALSE);\r
 }\r
 \r
 /**\r
-  Set peer certificate verification mode for the TLS connection.\r
-\r
-  This function sets the verification mode flags for the TLS connection.\r
+  Add two Big Numbers modulo BnM.\r
 \r
-  @param[in]  Tls           Pointer to the TLS object.\r
-  @param[in]  VerifyMode    A set of logically or'ed verification mode flags.\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
-VOID\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsSetVerify (\r
-  IN     VOID                     *Tls,\r
-  IN     UINT32                   VerifyMode\r
+CryptoServiceBigNumAddMod (\r
+  IN CONST VOID  *BnA,\r
+  IN CONST VOID  *BnB,\r
+  IN CONST VOID  *BnM,\r
+  OUT VOID       *BnRes\r
   )\r
 {\r
-  CALL_VOID_BASECRYPTLIB (TlsSet.Services.Verify, TlsSetVerify, (Tls, VerifyMode));\r
+  return CALL_BASECRYPTLIB (Bn.Services.AddMod, BigNumAddMod, (BnA, BnB, BnM, BnRes), FALSE);\r
 }\r
 \r
-/**\r
-  Set the specified host name to be verified.\r
+// =====================================================================================\r
+//    Basic Elliptic Curve Primitives\r
+// =====================================================================================\r
 \r
-  @param[in]  Tls           Pointer to the TLS object.\r
-  @param[in]  Flags         The setting flags during the validation.\r
-  @param[in]  HostName      The specified host name to be verified.\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
-  @retval  EFI_SUCCESS           The HostName setting was set successfully.\r
-  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
-  @retval  EFI_ABORTED           Invalid HostName setting.\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
-EFI_STATUS\r
+VOID *\r
 EFIAPI\r
-CryptoServiceTlsSetVerifyHost (\r
-  IN     VOID                     *Tls,\r
-  IN     UINT32                   Flags,\r
-  IN     CHAR8                    *HostName\r
+CryptoServiceEcGroupInit (\r
+  IN UINTN  CryptoNid\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (TlsSet.Services.VerifyHost, TlsSetVerifyHost, (Tls, Flags, HostName), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Ec.Services.GroupInit, EcGroupInit, (CryptoNid), NULL);\r
 }\r
 \r
 /**\r
-  Sets a TLS/SSL session ID to be used during TLS/SSL connect.\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
-  This function sets a session ID to be used when the TLS/SSL connection is\r
-  to be established.\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
-  @param[in]  Tls             Pointer to the TLS object.\r
-  @param[in]  SessionId       Session ID data used for session resumption.\r
-  @param[in]  SessionIdLen    Length of Session ID in bytes.\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
-  @retval  EFI_SUCCESS           Session ID was set successfully.\r
-  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
-  @retval  EFI_UNSUPPORTED       No available session for ID setting.\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
-EFI_STATUS\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsSetSessionId (\r
-  IN     VOID                     *Tls,\r
-  IN     UINT8                    *SessionId,\r
-  IN     UINT16                   SessionIdLen\r
+CryptoServiceEcGroupGetOrder (\r
+  IN VOID   *EcGroup,\r
+  OUT VOID  *BnOrder\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (TlsSet.Services.SessionId, TlsSetSessionId, (Tls, SessionId, SessionIdLen), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Ec.Services.GroupGetOrder, EcGroupGetOrder, (EcGroup, BnOrder), FALSE);\r
 }\r
 \r
 /**\r
-  Adds the CA to the cert store when requesting Server or Client authentication.\r
+  Free previously allocated EC group object using EcGroupInit().\r
 \r
-  This function adds the CA certificate to the list of CAs when requesting\r
-  Server or Client authentication for the chosen TLS connection.\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
-  @param[in]  Tls         Pointer to the TLS object.\r
-  @param[in]  Data        Pointer to the data buffer of a DER-encoded binary\r
-                          X.509 certificate or PEM-encoded X.509 certificate.\r
-  @param[in]  DataSize    The size of data buffer in bytes.\r
+/**\r
+  Initialize new opaque EC Point object. This object represents an EC point\r
+  within the given EC group (curve).\r
 \r
-  @retval  EFI_SUCCESS             The operation succeeded.\r
-  @retval  EFI_INVALID_PARAMETER   The parameter is invalid.\r
-  @retval  EFI_OUT_OF_RESOURCES    Required resources could not be allocated.\r
-  @retval  EFI_ABORTED             Invalid X.509 certificate.\r
+  @param[in]  EC Group, properly initialized using EcGroupInit().\r
 \r
+  @retval EC Point object  On success.\r
+  @retval NULL             On failure.\r
 **/\r
-EFI_STATUS\r
+VOID *\r
 EFIAPI\r
-CryptoServiceTlsSetCaCertificate (\r
-  IN     VOID                     *Tls,\r
-  IN     VOID                     *Data,\r
-  IN     UINTN                    DataSize\r
+CryptoServiceEcPointInit (\r
+  IN CONST VOID  *EcGroup\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (TlsSet.Services.CaCertificate, TlsSetCaCertificate, (Tls, Data, DataSize), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointInit, EcPointInit, (EcGroup), NULL);\r
 }\r
 \r
 /**\r
-  Loads the local public certificate into the specified TLS object.\r
+  Free previously allocated EC Point object using EcPointInit().\r
 \r
-  This function loads the X.509 certificate into the specified TLS object\r
-  for TLS negotiation.\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
-  @param[in]  Tls         Pointer to the TLS object.\r
-  @param[in]  Data        Pointer to the data buffer of a DER-encoded binary\r
-                          X.509 certificate or PEM-encoded X.509 certificate.\r
-  @param[in]  DataSize    The size of data buffer in bytes.\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
-  @retval  EFI_SUCCESS             The operation succeeded.\r
-  @retval  EFI_INVALID_PARAMETER   The parameter is invalid.\r
-  @retval  EFI_OUT_OF_RESOURCES    Required resources could not be allocated.\r
-  @retval  EFI_ABORTED             Invalid X.509 certificate.\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
-EFI_STATUS\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsSetHostPublicCert (\r
-  IN     VOID                     *Tls,\r
-  IN     VOID                     *Data,\r
-  IN     UINTN                    DataSize\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 (TlsSet.Services.HostPublicCert, TlsSetHostPublicCert, (Tls, Data, DataSize), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointGetAffineCoordinates, EcPointGetAffineCoordinates, (EcGroup, EcPoint, BnX, BnY, BnCtx), FALSE);\r
 }\r
 \r
 /**\r
-  Adds the local private key to the specified TLS object.\r
+  Set EC point affine (x,y) coordinates.\r
 \r
-  This function adds the local private key (PEM-encoded RSA or PKCS#8 private\r
-  key) into the specified TLS object for TLS negotiation.\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
-  @param[in]  Tls         Pointer to the TLS object.\r
-  @param[in]  Data        Pointer to the data buffer of a PEM-encoded RSA\r
-                          or PKCS#8 private key.\r
-  @param[in]  DataSize    The size of data buffer in bytes.\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
-  @retval  EFI_SUCCESS     The operation succeeded.\r
-  @retval  EFI_UNSUPPORTED This function is not supported.\r
-  @retval  EFI_ABORTED     Invalid private key data.\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
-EFI_STATUS\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsSetHostPrivateKey (\r
-  IN     VOID                     *Tls,\r
-  IN     VOID                     *Data,\r
-  IN     UINTN                    DataSize\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 (TlsSet.Services.HostPrivateKey, TlsSetHostPrivateKey, (Tls, Data, DataSize), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointAdd, EcPointAdd, (EcGroup, EcPointResult, EcPointA, EcPointB, BnCtx), FALSE);\r
 }\r
 \r
 /**\r
-  Adds the CA-supplied certificate revocation list for certificate validation.\r
-\r
-  This function adds the CA-supplied certificate revocation list data for\r
-  certificate validity checking.\r
-\r
-  @param[in]  Data        Pointer to the data buffer of a DER-encoded CRL data.\r
-  @param[in]  DataSize    The size of data buffer in bytes.\r
+  Variable EC point multiplication. EcPointResult = EcPoint * BnPScalar.\r
 \r
-  @retval  EFI_SUCCESS     The operation succeeded.\r
-  @retval  EFI_UNSUPPORTED This function is not supported.\r
-  @retval  EFI_ABORTED     Invalid CRL data.\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
-EFI_STATUS\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsSetCertRevocationList (\r
-  IN     VOID                     *Data,\r
-  IN     UINTN                    DataSize\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 (TlsSet.Services.CertRevocationList, TlsSetCertRevocationList, (Data, DataSize), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointMul, EcPointMul, (EcGroup, EcPointResult, EcPoint, BnPScalar, BnCtx), FALSE);\r
 }\r
 \r
 /**\r
-  Gets the protocol version used by the specified TLS connection.\r
-\r
-  This function returns the protocol version used by the specified TLS\r
-  connection.\r
-\r
-  If Tls is NULL, then ASSERT().\r
-\r
-  @param[in]  Tls    Pointer to the TLS object.\r
+  Calculate the inverse of the supplied EC point.\r
 \r
-  @return  The protocol version of the specified TLS connection.\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
-UINT16\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsGetVersion (\r
-  IN     VOID                     *Tls\r
+CryptoServiceEcPointInvert (\r
+  IN CONST VOID  *EcGroup,\r
+  IN OUT VOID    *EcPoint,\r
+  IN VOID        *BnCtx\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (TlsGet.Services.Version, TlsGetVersion, (Tls), 0);\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointInvert, EcPointInvert, (EcGroup, EcPoint, BnCtx), FALSE);\r
 }\r
 \r
 /**\r
-  Gets the connection end of the specified TLS connection.\r
-\r
-  This function returns the connection end (as client or as server) used by\r
-  the specified TLS connection.\r
-\r
-  If Tls is NULL, then ASSERT().\r
-\r
-  @param[in]  Tls    Pointer to the TLS object.\r
+  Check if the supplied point is on EC curve.\r
 \r
-  @return  The connection end used by the specified TLS connection.\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
-UINT8\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsGetConnectionEnd (\r
-  IN     VOID                     *Tls\r
+CryptoServiceEcPointIsOnCurve (\r
+  IN CONST VOID  *EcGroup,\r
+  IN CONST VOID  *EcPoint,\r
+  IN VOID        *BnCtx\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (TlsGet.Services.ConnectionEnd, TlsGetConnectionEnd, (Tls), 0);\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointIsOnCurve, EcPointIsOnCurve, (EcGroup, EcPoint, BnCtx), FALSE);\r
 }\r
 \r
 /**\r
-  Gets the cipher suite used by the specified TLS connection.\r
-\r
-  This function returns current cipher suite used by the specified\r
-  TLS connection.\r
-\r
-  @param[in]      Tls         Pointer to the TLS object.\r
-  @param[in,out]  CipherId    The cipher suite used by the TLS object.\r
+  Check if the supplied point is at infinity.\r
 \r
-  @retval  EFI_SUCCESS           The cipher suite was returned successfully.\r
-  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
-  @retval  EFI_UNSUPPORTED       Unsupported cipher suite.\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
-EFI_STATUS\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsGetCurrentCipher (\r
-  IN     VOID                     *Tls,\r
-  IN OUT UINT16                   *CipherId\r
+CryptoServiceEcPointIsAtInfinity (\r
+  IN CONST VOID  *EcGroup,\r
+  IN CONST VOID  *EcPoint\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (TlsGet.Services.CurrentCipher, TlsGetCurrentCipher, (Tls, CipherId), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointIsAtInfinity, EcPointIsAtInfinity, (EcGroup, EcPoint), FALSE);\r
 }\r
 \r
 /**\r
-  Gets the compression methods used by the specified TLS connection.\r
-\r
-  This function returns current integrated compression methods used by\r
-  the specified TLS connection.\r
-\r
-  @param[in]      Tls              Pointer to the TLS object.\r
-  @param[in,out]  CompressionId    The current compression method used by\r
-                                   the TLS object.\r
+  Check if EC points are equal.\r
 \r
-  @retval  EFI_SUCCESS           The compression method was returned successfully.\r
-  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
-  @retval  EFI_ABORTED           Invalid Compression method.\r
-  @retval  EFI_UNSUPPORTED       This function is not supported.\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
-EFI_STATUS\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsGetCurrentCompressionId (\r
-  IN     VOID                     *Tls,\r
-  IN OUT UINT8                    *CompressionId\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 (TlsGet.Services.CurrentCompressionId, TlsGetCurrentCompressionId, (Tls, CompressionId), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointEqual, EcPointEqual, (EcGroup, EcPointA, EcPointB, BnCtx), FALSE);\r
 }\r
 \r
 /**\r
-  Gets the verification mode currently set in the TLS connection.\r
-\r
-  This function returns the peer verification mode currently set in the\r
-  specified TLS connection.\r
-\r
-  If Tls is NULL, then ASSERT().\r
-\r
-  @param[in]  Tls    Pointer to the TLS object.\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
-  @return  The verification mode set in the specified TLS connection.\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
-UINT32\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsGetVerify (\r
-  IN     VOID                     *Tls\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 (TlsGet.Services.Verify, TlsGetVerify, (Tls), 0);\r
+  return CALL_BASECRYPTLIB (Ec.Services.PointSetCompressedCoordinates, EcPointSetCompressedCoordinates, (EcGroup, EcPoint, BnX, YBit, BnCtx), FALSE);\r
 }\r
 \r
-/**\r
-  Gets the session ID used by the specified TLS connection.\r
-\r
-  This function returns the TLS/SSL session ID currently used by the\r
-  specified TLS connection.\r
-\r
-  @param[in]      Tls             Pointer to the TLS object.\r
-  @param[in,out]  SessionId       Buffer to contain the returned session ID.\r
-  @param[in,out]  SessionIdLen    The length of Session ID in bytes.\r
+// =====================================================================================\r
+//    Elliptic Curve Diffie Hellman Primitives\r
+// =====================================================================================\r
 \r
-  @retval  EFI_SUCCESS           The Session ID was returned successfully.\r
-  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
-  @retval  EFI_UNSUPPORTED       Invalid TLS/SSL session.\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
-EFI_STATUS\r
+VOID *\r
 EFIAPI\r
-CryptoServiceTlsGetSessionId (\r
-  IN     VOID                     *Tls,\r
-  IN OUT UINT8                    *SessionId,\r
-  IN OUT UINT16                   *SessionIdLen\r
+CryptoServiceEcNewByNid (\r
+  IN UINTN  Nid\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (TlsGet.Services.SessionId, TlsGetSessionId, (Tls, SessionId, SessionIdLen), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Ec.Services.NewByNid, EcNewByNid, (Nid), NULL);\r
 }\r
 \r
 /**\r
-  Gets the client random data used in the specified TLS connection.\r
-\r
-  This function returns the TLS/SSL client random data currently used in\r
-  the specified TLS connection.\r
-\r
-  @param[in]      Tls             Pointer to the TLS object.\r
-  @param[in,out]  ClientRandom    Buffer to contain the returned client\r
-                                  random data (32 bytes).\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
-CryptoServiceTlsGetClientRandom (\r
-  IN     VOID                     *Tls,\r
-  IN OUT UINT8                    *ClientRandom\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
-  CALL_VOID_BASECRYPTLIB (TlsGet.Services.ClientRandom, TlsGetClientRandom, (Tls, ClientRandom));\r
+  return CALL_BASECRYPTLIB (Ec.Services.GenerateKey, EcGenerateKey, (EcContext, PublicKey, PublicKeySize), FALSE);\r
 }\r
 \r
 /**\r
-  Gets the server random data used in the specified TLS connection.\r
-\r
-  This function returns the TLS/SSL server random data currently used in\r
-  the specified TLS connection.\r
-\r
-  @param[in]      Tls             Pointer to the TLS object.\r
-  @param[in,out]  ServerRandom    Buffer to contain the returned server\r
-                                  random data (32 bytes).\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
-VOID\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsGetServerRandom (\r
-  IN     VOID                     *Tls,\r
-  IN OUT UINT8                    *ServerRandom\r
+CryptoServiceEcGetPubKey (\r
+  IN OUT  VOID   *EcContext,\r
+  OUT     UINT8  *PublicKey,\r
+  IN OUT  UINTN  *PublicKeySize\r
   )\r
 {\r
-  CALL_VOID_BASECRYPTLIB (TlsGet.Services.ServerRandom, TlsGetServerRandom, (Tls, ServerRandom));\r
+  return CALL_BASECRYPTLIB (Ec.Services.GetPubKey, EcGetPubKey, (EcContext, PublicKey, PublicKeySize), FALSE);\r
 }\r
 \r
 /**\r
-  Gets the master key data used in the specified TLS connection.\r
-\r
-  This function returns the TLS/SSL master key material currently used in\r
-  the specified TLS connection.\r
-\r
-  @param[in]      Tls            Pointer to the TLS object.\r
-  @param[in,out]  KeyMaterial    Buffer to contain the returned key material.\r
-\r
-  @retval  EFI_SUCCESS           Key material was returned successfully.\r
-  @retval  EFI_INVALID_PARAMETER The parameter is invalid.\r
-  @retval  EFI_UNSUPPORTED       Invalid TLS/SSL session.\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
-EFI_STATUS\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsGetKeyMaterial (\r
-  IN     VOID                     *Tls,\r
-  IN OUT UINT8                    *KeyMaterial\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 (TlsGet.Services.KeyMaterial, TlsGetKeyMaterial, (Tls, KeyMaterial), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Ec.Services.DhComputeKey, EcDhComputeKey, (EcContext, PeerPublic, PeerPublicSize, CompressFlag, Key, KeySize), FALSE);\r
 }\r
 \r
 /**\r
-  Gets the CA Certificate from the cert store.\r
+  Retrieve the EC Public Key from one DER-encoded X509 certificate.\r
 \r
-  This function returns the CA certificate for the chosen\r
-  TLS connection.\r
+  @param[in]  Cert         Pointer to the DER-encoded X509 certificate.\r
+  @param[in]  CertSize     Size of the X509 certificate in bytes.\r
+  @param[out] EcContext    Pointer to new-generated EC DSA context which contain the retrieved\r
+                           EC public key component. Use EcFree() function to free the\r
+                           resource.\r
 \r
-  @param[in]      Tls         Pointer to the TLS object.\r
-  @param[out]     Data        Pointer to the data buffer to receive the CA\r
-                              certificate data sent to the client.\r
-  @param[in,out]  DataSize    The size of data buffer in bytes.\r
+  If Cert is NULL, then return FALSE.\r
+  If EcContext is NULL, then return FALSE.\r
 \r
-  @retval  EFI_SUCCESS             The operation succeeded.\r
-  @retval  EFI_UNSUPPORTED         This function is not supported.\r
-  @retval  EFI_BUFFER_TOO_SMALL    The Data is too small to hold the data.\r
+  @retval  TRUE   EC Public Key was retrieved successfully.\r
+  @retval  FALSE  Fail to retrieve EC public key from X509 certificate.\r
 \r
 **/\r
-EFI_STATUS\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsGetCaCertificate (\r
-  IN     VOID                     *Tls,\r
-  OUT    VOID                     *Data,\r
-  IN OUT UINTN                    *DataSize\r
+CryptoServiceEcGetPublicKeyFromX509 (\r
+  IN   CONST UINT8  *Cert,\r
+  IN   UINTN        CertSize,\r
+  OUT  VOID         **EcContext\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (TlsGet.Services.CaCertificate, TlsGetCaCertificate, (Tls, Data, DataSize), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Ec.Services.GetPublicKeyFromX509, EcGetPublicKeyFromX509, (Cert, CertSize, EcContext), FALSE);\r
 }\r
 \r
 /**\r
-  Gets the local public Certificate set in the specified TLS object.\r
+  Retrieve the EC Private Key from the password-protected PEM key data.\r
 \r
-  This function returns the local public certificate which was currently set\r
-  in the specified TLS object.\r
+  @param[in]  PemData      Pointer to the PEM-encoded key data to be retrieved.\r
+  @param[in]  PemSize      Size of the PEM key data in bytes.\r
+  @param[in]  Password     NULL-terminated passphrase used for encrypted PEM key data.\r
+  @param[out] EcContext    Pointer to new-generated EC DSA context which contain the retrieved\r
+                           EC private key component. Use EcFree() function to free the\r
+                           resource.\r
 \r
-  @param[in]      Tls         Pointer to the TLS object.\r
-  @param[out]     Data        Pointer to the data buffer to receive the local\r
-                              public certificate.\r
-  @param[in,out]  DataSize    The size of data buffer in bytes.\r
+  If PemData is NULL, then return FALSE.\r
+  If EcContext is NULL, then return FALSE.\r
 \r
-  @retval  EFI_SUCCESS             The operation succeeded.\r
-  @retval  EFI_INVALID_PARAMETER   The parameter is invalid.\r
-  @retval  EFI_NOT_FOUND           The certificate is not found.\r
-  @retval  EFI_BUFFER_TOO_SMALL    The Data is too small to hold the data.\r
+  @retval  TRUE   EC Private Key was retrieved successfully.\r
+  @retval  FALSE  Invalid PEM key data or incorrect password.\r
 \r
 **/\r
-EFI_STATUS\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsGetHostPublicCert (\r
-  IN     VOID                     *Tls,\r
-  OUT    VOID                     *Data,\r
-  IN OUT UINTN                    *DataSize\r
+CryptoServiceEcGetPrivateKeyFromPem (\r
+  IN   CONST UINT8  *PemData,\r
+  IN   UINTN        PemSize,\r
+  IN   CONST CHAR8  *Password,\r
+  OUT  VOID         **EcContext\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (TlsGet.Services.HostPublicCert, TlsGetHostPublicCert, (Tls, Data, DataSize), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Ec.Services.GetPrivateKeyFromPem, EcGetPrivateKeyFromPem, (PemData, PemSize, Password, EcContext), FALSE);\r
 }\r
 \r
 /**\r
-  Gets the local private key set in the specified TLS object.\r
+  Carries out the EC-DSA signature.\r
 \r
-  This function returns the local private key data which was currently set\r
-  in the specified TLS object.\r
+  This function carries out the EC-DSA signature.\r
+  If the Signature buffer is too small to hold the contents of signature, FALSE\r
+  is returned and SigSize is set to the required buffer size to obtain the signature.\r
 \r
-  @param[in]      Tls         Pointer to the TLS object.\r
-  @param[out]     Data        Pointer to the data buffer to receive the local\r
-                              private key data.\r
-  @param[in,out]  DataSize    The size of data buffer in bytes.\r
+  If EcContext is NULL, then return FALSE.\r
+  If MessageHash is NULL, then return FALSE.\r
+  If HashSize need match the HashNid. HashNid could be SHA256, SHA384, SHA512, SHA3_256, SHA3_384, SHA3_512.\r
+  If SigSize is large enough but Signature is NULL, then return FALSE.\r
 \r
-  @retval  EFI_SUCCESS             The operation succeeded.\r
-  @retval  EFI_UNSUPPORTED         This function is not supported.\r
-  @retval  EFI_BUFFER_TOO_SMALL    The Data is too small to hold the data.\r
+  For P-256, the SigSize is 64. First 32-byte is R, Second 32-byte is S.\r
+  For P-384, the SigSize is 96. First 48-byte is R, Second 48-byte is S.\r
+  For P-521, the SigSize is 132. First 66-byte is R, Second 66-byte is S.\r
+\r
+  @param[in]       EcContext    Pointer to EC context for signature generation.\r
+  @param[in]       HashNid      hash NID\r
+  @param[in]       MessageHash  Pointer to octet message hash to be signed.\r
+  @param[in]       HashSize     Size of the message hash in bytes.\r
+  @param[out]      Signature    Pointer to buffer to receive EC-DSA signature.\r
+  @param[in, out]  SigSize      On input, the size of Signature buffer in bytes.\r
+                                On output, the size of data returned in Signature buffer in bytes.\r
+\r
+  @retval  TRUE   Signature successfully generated in EC-DSA.\r
+  @retval  FALSE  Signature generation failed.\r
+  @retval  FALSE  SigSize is too small.\r
 \r
 **/\r
-EFI_STATUS\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsGetHostPrivateKey (\r
-  IN     VOID                     *Tls,\r
-  OUT    VOID                     *Data,\r
-  IN OUT UINTN                    *DataSize\r
+CryptoServiceEcDsaSign (\r
+  IN      VOID         *EcContext,\r
+  IN      UINTN        HashNid,\r
+  IN      CONST UINT8  *MessageHash,\r
+  IN      UINTN        HashSize,\r
+  OUT     UINT8        *Signature,\r
+  IN OUT  UINTN        *SigSize\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (TlsGet.Services.HostPrivateKey, TlsGetHostPrivateKey, (Tls, Data, DataSize), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Ec.Services.DsaSign, EcDsaSign, (EcContext, HashNid, MessageHash, HashSize, Signature, SigSize), FALSE);\r
 }\r
 \r
 /**\r
-  Gets the CA-supplied certificate revocation list data set in the specified\r
-  TLS object.\r
+  Verifies the EC-DSA signature.\r
 \r
-  This function returns the CA-supplied certificate revocation list data which\r
-  was currently set in the specified TLS object.\r
+  If EcContext is NULL, then return FALSE.\r
+  If MessageHash is NULL, then return FALSE.\r
+  If Signature is NULL, then return FALSE.\r
+  If HashSize need match the HashNid. HashNid could be SHA256, SHA384, SHA512, SHA3_256, SHA3_384, SHA3_512.\r
 \r
-  @param[out]     Data        Pointer to the data buffer to receive the CRL data.\r
-  @param[in,out]  DataSize    The size of data buffer in bytes.\r
+  For P-256, the SigSize is 64. First 32-byte is R, Second 32-byte is S.\r
+  For P-384, the SigSize is 96. First 48-byte is R, Second 48-byte is S.\r
+  For P-521, the SigSize is 132. First 66-byte is R, Second 66-byte is S.\r
 \r
-  @retval  EFI_SUCCESS             The operation succeeded.\r
-  @retval  EFI_UNSUPPORTED         This function is not supported.\r
-  @retval  EFI_BUFFER_TOO_SMALL    The Data is too small to hold the data.\r
+  @param[in]  EcContext    Pointer to EC context for signature verification.\r
+  @param[in]  HashNid      hash NID\r
+  @param[in]  MessageHash  Pointer to octet message hash to be checked.\r
+  @param[in]  HashSize     Size of the message hash in bytes.\r
+  @param[in]  Signature    Pointer to EC-DSA signature to be verified.\r
+  @param[in]  SigSize      Size of signature in bytes.\r
+\r
+  @retval  TRUE   Valid signature encoded in EC-DSA.\r
+  @retval  FALSE  Invalid signature or invalid EC context.\r
 \r
 **/\r
-EFI_STATUS\r
+BOOLEAN\r
 EFIAPI\r
-CryptoServiceTlsGetCertRevocationList (\r
-  OUT    VOID                     *Data,\r
-  IN OUT UINTN                    *DataSize\r
+CryptoServiceEcDsaVerify (\r
+  IN  VOID         *EcContext,\r
+  IN  UINTN        HashNid,\r
+  IN  CONST UINT8  *MessageHash,\r
+  IN  UINTN        HashSize,\r
+  IN  CONST UINT8  *Signature,\r
+  IN  UINTN        SigSize\r
   )\r
 {\r
-  return CALL_BASECRYPTLIB (TlsGet.Services.CertRevocationList, TlsGetCertRevocationList, (Data, DataSize), EFI_UNSUPPORTED);\r
+  return CALL_BASECRYPTLIB (Ec.Services.DsaVerify, EcDsaVerify, (EcContext, HashNid, MessageHash, HashSize, Signature, SigSize), FALSE);\r
 }\r
 \r
-const EDKII_CRYPTO_PROTOCOL mEdkiiCrypto = {\r
+const EDKII_CRYPTO_PROTOCOL  mEdkiiCrypto = {\r
   /// Version\r
   CryptoServiceGetCryptoVersion,\r
   /// HMAC MD5 - deprecated and unsupported\r
@@ -4494,7 +6719,7 @@ const EDKII_CRYPTO_PROTOCOL mEdkiiCrypto = {
   DeprecatedCryptoServiceMd4Update,\r
   DeprecatedCryptoServiceMd4Final,\r
   DeprecatedCryptoServiceMd4HashAll,\r
-#ifdef DISABLE_MD5_DEPRECATED_INTERFACES\r
+ #ifndef ENABLE_MD5_DEPRECATED_INTERFACES\r
   /// Md5 - deprecated and unsupported\r
   DeprecatedCryptoServiceMd5GetContextSize,\r
   DeprecatedCryptoServiceMd5Init,\r
@@ -4502,7 +6727,7 @@ const EDKII_CRYPTO_PROTOCOL mEdkiiCrypto = {
   DeprecatedCryptoServiceMd5Update,\r
   DeprecatedCryptoServiceMd5Final,\r
   DeprecatedCryptoServiceMd5HashAll,\r
-#else\r
+ #else\r
   /// Md5\r
   CryptoServiceMd5GetContextSize,\r
   CryptoServiceMd5Init,\r
@@ -4510,7 +6735,7 @@ const EDKII_CRYPTO_PROTOCOL mEdkiiCrypto = {
   CryptoServiceMd5Update,\r
   CryptoServiceMd5Final,\r
   CryptoServiceMd5HashAll,\r
-#endif\r
+ #endif\r
   /// Pkcs\r
   CryptoServicePkcs1v2Encrypt,\r
   CryptoServicePkcs5HashPassword,\r
@@ -4545,7 +6770,7 @@ const EDKII_CRYPTO_PROTOCOL mEdkiiCrypto = {
   CryptoServiceRsaPkcs1Verify,\r
   CryptoServiceRsaGetPrivateKeyFromPem,\r
   CryptoServiceRsaGetPublicKeyFromX509,\r
-#ifdef DISABLE_SHA1_DEPRECATED_INTERFACES\r
+ #ifdef DISABLE_SHA1_DEPRECATED_INTERFACES\r
   /// Sha1 - deprecated and unsupported\r
   DeprecatedCryptoServiceSha1GetContextSize,\r
   DeprecatedCryptoServiceSha1Init,\r
@@ -4553,7 +6778,7 @@ const EDKII_CRYPTO_PROTOCOL mEdkiiCrypto = {
   DeprecatedCryptoServiceSha1Update,\r
   DeprecatedCryptoServiceSha1Final,\r
   DeprecatedCryptoServiceSha1HashAll,\r
-#else\r
+ #else\r
   /// Sha1\r
   CryptoServiceSha1GetContextSize,\r
   CryptoServiceSha1Init,\r
@@ -4561,7 +6786,7 @@ const EDKII_CRYPTO_PROTOCOL mEdkiiCrypto = {
   CryptoServiceSha1Update,\r
   CryptoServiceSha1Final,\r
   CryptoServiceSha1HashAll,\r
-#endif\r
+ #endif\r
   /// Sha256\r
   CryptoServiceSha256GetContextSize,\r
   CryptoServiceSha256Init,\r
@@ -4663,5 +6888,104 @@ const EDKII_CRYPTO_PROTOCOL mEdkiiCrypto = {
   CryptoServiceTlsGetCaCertificate,\r
   CryptoServiceTlsGetHostPublicCert,\r
   CryptoServiceTlsGetHostPrivateKey,\r
-  CryptoServiceTlsGetCertRevocationList\r
+  CryptoServiceTlsGetCertRevocationList,\r
+  /// RSA PSS\r
+  CryptoServiceRsaPssSign,\r
+  CryptoServiceRsaPssVerify,\r
+  /// Parallel hash\r
+  CryptoServiceParallelHash256HashAll,\r
+  /// HMAC SHA256 (continued)\r
+  CryptoServiceHmacSha256All,\r
+  /// HMAC SHA384\r
+  CryptoServiceHmacSha384New,\r
+  CryptoServiceHmacSha384Free,\r
+  CryptoServiceHmacSha384SetKey,\r
+  CryptoServiceHmacSha384Duplicate,\r
+  CryptoServiceHmacSha384Update,\r
+  CryptoServiceHmacSha384Final,\r
+  CryptoServiceHmacSha384All,\r
+  /// HKDF (continued)\r
+  CryptoServiceHkdfSha256Extract,\r
+  CryptoServiceHkdfSha256Expand,\r
+  CryptoServiceHkdfSha384ExtractAndExpand,\r
+  CryptoServiceHkdfSha384Extract,\r
+  CryptoServiceHkdfSha384Expand,\r
+  /// Aead Aes GCM\r
+  CryptoServiceAeadAesGcmEncrypt,\r
+  CryptoServiceAeadAesGcmDecrypt,\r
+  /// Big Numbers\r
+  CryptoServiceBigNumInit,\r
+  CryptoServiceBigNumFromBin,\r
+  CryptoServiceBigNumToBin,\r
+  CryptoServiceBigNumFree,\r
+  CryptoServiceBigNumAdd,\r
+  CryptoServiceBigNumSub,\r
+  CryptoServiceBigNumMod,\r
+  CryptoServiceBigNumExpMod,\r
+  CryptoServiceBigNumInverseMod,\r
+  CryptoServiceBigNumDiv,\r
+  CryptoServiceBigNumMulMod,\r
+  CryptoServiceBigNumCmp,\r
+  CryptoServiceBigNumBits,\r
+  CryptoServiceBigNumBytes,\r
+  CryptoServiceBigNumIsWord,\r
+  CryptoServiceBigNumIsOdd,\r
+  CryptoServiceBigNumCopy,\r
+  CryptoServiceBigNumValueOne,\r
+  CryptoServiceBigNumRShift,\r
+  CryptoServiceBigNumConstTime,\r
+  CryptoServiceBigNumSqrMod,\r
+  CryptoServiceBigNumNewContext,\r
+  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
+  /// TLS (continued)\r
+  CryptoServiceTlsShutdown,\r
+  /// TLS Set (continued)\r
+  CryptoServiceTlsSetHostPrivateKeyEx,\r
+  CryptoServiceTlsSetSignatureAlgoList,\r
+  CryptoServiceTlsSetEcCurve,\r
+  /// TLS Get (continued)\r
+  CryptoServiceTlsGetExportKey,\r
+  /// Ec (Continued)\r
+  CryptoServiceEcGetPublicKeyFromX509,\r
+  CryptoServiceEcGetPrivateKeyFromPem,\r
+  CryptoServiceEcDsaSign,\r
+  CryptoServiceEcDsaVerify,\r
+  /// X509 (Continued)\r
+  CryptoServiceX509GetVersion,\r
+  CryptoServiceX509GetSerialNumber,\r
+  CryptoServiceX509GetIssuerName,\r
+  CryptoServiceX509GetSignatureAlgorithm,\r
+  CryptoServiceX509GetExtensionData,\r
+  CryptoServiceX509GetExtendedKeyUsage,\r
+  CryptoServiceX509GetValidity,\r
+  CryptoServiceX509FormatDateTime,\r
+  CryptoServiceX509CompareDateTime,\r
+  CryptoServiceX509GetKeyUsage,\r
+  CryptoServiceX509VerifyCertChain,\r
+  CryptoServiceX509GetCertFromCertChain,\r
+  CryptoServiceAsn1GetTag,\r
+  CryptoServiceX509GetExtendedBasicConstraints\r
 };\r