From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by mx.groups.io with SMTP id smtpd.web12.28466.1661238389086803848 for ; Tue, 23 Aug 2022 00:06:30 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=dL5+vJr9; spf=pass (domain: intel.com, ip: 134.134.136.65, mailfrom: qi1.zhang@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1661238390; x=1692774390; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=cIq+omuyD4oLfwL36IbzCFNAeD5Be/J3OC5Yt4Mx7UA=; b=dL5+vJr9xi5uJasLRDobk6BavZx/s7TbBss7qkCZSxECaReidVrSGLTj I4s9P+8Ugkv24GPpIrM1qPOtCjni9Ffo4Gm3y9jMigf7cahnyuUKqTzWb HTThWDunrmvwI/kzGzuhMVZ7ko4LblLtnl8CzdIWr0wjHUWrxcSKxg/Ez f5UesznjQYnqnhh1sfhc4OzcRZskystUVi7TUdah7mQLs1yrD07CD8Ti/ lsGArWQ20ZbTXALj1qXUiFAGAriPRXwJg7bSoO65ZYNbTSoGB3jZAgDBl PtDjbH/fveonaeTT1HIJC4wE4R3y0NnBTPDomB5p49fnRAnIelGrQTKZK g==; X-IronPort-AV: E=McAfee;i="6500,9779,10447"; a="294893661" X-IronPort-AV: E=Sophos;i="5.93,256,1654585200"; d="scan'208";a="294893661" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Aug 2022 00:06:30 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,256,1654585200"; d="scan'208";a="677512592" Received: from shwdesssddpdqi.ccr.corp.intel.com ([10.239.157.129]) by fmsmga004.fm.intel.com with ESMTP; 23 Aug 2022 00:06:28 -0700 From: "Qi Zhang" To: devel@edk2.groups.io Cc: Qi Zhang , Jiewen Yao , Jian J Wang , Xiaoyu Lu , Guomin Jiang Subject: [PATCH 1/5] CryptoPkg: Add new hmac definition to cryptlib Date: Tue, 23 Aug 2022 15:06:19 +0800 Message-Id: <20220823070623.7002-2-qi1.zhang@intel.com> X-Mailer: git-send-email 2.26.2.windows.1 In-Reply-To: <20220823070623.7002-1-qi1.zhang@intel.com> References: <20220823070623.7002-1-qi1.zhang@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D4025 Signed-off-by: Qi Zhang Cc: Jiewen Yao Cc: Jian J Wang Cc: Xiaoyu Lu Cc: Guomin Jiang --- CryptoPkg/Include/Library/BaseCryptLib.h | 188 +++++++++++++++++ .../Pcd/PcdCryptoServiceFamilyEnable.h | 13 ++ CryptoPkg/Private/Protocol/Crypto.h | 197 ++++++++++++++++++ 3 files changed, 398 insertions(+) diff --git a/CryptoPkg/Include/Library/BaseCryptLib.h b/CryptoPkg/Include/L= ibrary/BaseCryptLib.h index 7d1499350a..3a42e3494f 100644 --- a/CryptoPkg/Include/Library/BaseCryptLib.h +++ b/CryptoPkg/Include/Library/BaseCryptLib.h @@ -1045,6 +1045,194 @@ HmacSha256Final ( OUT UINT8 *HmacValue=0D );=0D =0D +/**=0D + Computes the HMAC-SHA256 digest of a input data buffer.=0D +=0D + This function performs the HMAC-SHA256 digest of a given data buffer, an= d places=0D + the digest value into the specified memory.=0D +=0D + If this interface is not supported, then return FALSE.=0D +=0D + @param[in] Data Pointer to the buffer containing the data to be= digested.=0D + @param[in] DataSize Size of Data buffer in bytes.=0D + @param[in] Key Pointer to the user-supplied key.=0D + @param[in] KeySize Key size in bytes.=0D + @param[out] HashValue Pointer to a buffer that receives the HMAC-SHA2= 56 digest=0D + value (32 bytes).=0D +=0D + @retval TRUE HMAC-SHA256 digest computation succeeded.=0D + @retval FALSE HMAC-SHA256 digest computation failed.=0D + @retval FALSE This interface is not supported.=0D +=0D +**/=0D +BOOLEAN=0D +EFIAPI=0D +HmacSha256All (=0D + IN CONST VOID *Data,=0D + IN UINTN DataSize,=0D + IN CONST UINT8 *Key,=0D + IN UINTN KeySize,=0D + OUT UINT8 *HmacValue=0D + );=0D +=0D +/**=0D + Allocates and initializes one HMAC_CTX context for subsequent HMAC-SHA38= 4 use.=0D +=0D + @return Pointer to the HMAC_CTX context that has been initialized.=0D + If the allocations fails, HmacSha384New() returns NULL.=0D +=0D +**/=0D +VOID *=0D +EFIAPI=0D +HmacSha384New (=0D + VOID=0D + );=0D +=0D +/**=0D + Release the specified HMAC_CTX context.=0D +=0D + @param[in] HmacSha384Ctx Pointer to the HMAC_CTX context to be release= d.=0D +=0D +**/=0D +VOID=0D +EFIAPI=0D +HmacSha384Free (=0D + IN VOID *HmacSha384Ctx=0D + );=0D +=0D +/**=0D + Set user-supplied key for subsequent use. It must be done before any=0D + calling to HmacSha384Update().=0D +=0D + If HmacSha384Context is NULL, then return FALSE.=0D + If this interface is not supported, then return FALSE.=0D +=0D + @param[out] HmacSha384Context Pointer to HMAC-SHA384 context.=0D + @param[in] Key Pointer to the user-supplied key.=0D + @param[in] KeySize Key size in bytes.=0D +=0D + @retval TRUE The Key is set successfully.=0D + @retval FALSE The Key is set unsuccessfully.=0D + @retval FALSE This interface is not supported.=0D +=0D +**/=0D +BOOLEAN=0D +EFIAPI=0D +HmacSha384SetKey (=0D + OUT VOID *HmacSha384Context,=0D + IN CONST UINT8 *Key,=0D + IN UINTN KeySize=0D + );=0D +=0D +/**=0D + Makes a copy of an existing HMAC-SHA384 context.=0D +=0D + If HmacSha384Context is NULL, then return FALSE.=0D + If NewHmacSha384Context is NULL, then return FALSE.=0D + If this interface is not supported, then return FALSE.=0D +=0D + @param[in] HmacSha384Context Pointer to HMAC-SHA384 context being c= opied.=0D + @param[out] NewHmacSha384Context Pointer to new HMAC-SHA384 context.=0D +=0D + @retval TRUE HMAC-SHA384 context copy succeeded.=0D + @retval FALSE HMAC-SHA384 context copy failed.=0D + @retval FALSE This interface is not supported.=0D +=0D +**/=0D +BOOLEAN=0D +EFIAPI=0D +HmacSha384Duplicate (=0D + IN CONST VOID *HmacSha384Context,=0D + OUT VOID *NewHmacSha384Context=0D + );=0D +=0D +/**=0D + Digests the input data and updates HMAC-SHA384 context.=0D +=0D + This function performs HMAC-SHA384 digest on a data buffer of the specif= ied size.=0D + It can be called multiple times to compute the digest of long or discont= inuous data streams.=0D + HMAC-SHA384 context should be initialized by HmacSha384New(), and should= not be finalized=0D + by HmacSha384Final(). Behavior with invalid context is undefined.=0D +=0D + If HmacSha384Context is NULL, then return FALSE.=0D + If this interface is not supported, then return FALSE.=0D +=0D + @param[in, out] HmacSha384Context Pointer to the HMAC-SHA384 context.=0D + @param[in] Data Pointer to the buffer containing the = data to be digested.=0D + @param[in] DataSize Size of Data buffer in bytes.=0D +=0D + @retval TRUE HMAC-SHA384 data digest succeeded.=0D + @retval FALSE HMAC-SHA384 data digest failed.=0D + @retval FALSE This interface is not supported.=0D +=0D +**/=0D +BOOLEAN=0D +EFIAPI=0D +HmacSha384Update (=0D + IN OUT VOID *HmacSha384Context,=0D + IN CONST VOID *Data,=0D + IN UINTN DataSize=0D + );=0D +=0D +/**=0D + Completes computation of the HMAC-SHA384 digest value.=0D +=0D + This function completes HMAC-SHA384 hash computation and retrieves the d= igest value into=0D + the specified memory. After this function has been called, the HMAC-SHA3= 84 context cannot=0D + be used again.=0D + HMAC-SHA384 context should be initialized by HmacSha384New(), and should= not be finalized=0D + by HmacSha384Final(). Behavior with invalid HMAC-SHA384 context is undef= ined.=0D +=0D + If HmacSha384Context is NULL, then return FALSE.=0D + If HmacValue is NULL, then return FALSE.=0D + If this interface is not supported, then return FALSE.=0D +=0D + @param[in, out] HmacSha384Context Pointer to the HMAC-SHA384 context.= =0D + @param[out] HmacValue Pointer to a buffer that receives th= e HMAC-SHA384 digest=0D + value (48 bytes).=0D +=0D + @retval TRUE HMAC-SHA384 digest computation succeeded.=0D + @retval FALSE HMAC-SHA384 digest computation failed.=0D + @retval FALSE This interface is not supported.=0D +=0D +**/=0D +BOOLEAN=0D +EFIAPI=0D +HmacSha384Final (=0D + IN OUT VOID *HmacSha384Context,=0D + OUT UINT8 *HmacValue=0D + );=0D +=0D +/**=0D + Computes the HMAC-SHA384 digest of a input data buffer.=0D +=0D + This function performs the HMAC-SHA384 digest of a given data buffer, an= d places=0D + the digest value into the specified memory.=0D +=0D + If this interface is not supported, then return FALSE.=0D +=0D + @param[in] Data Pointer to the buffer containing the data to be= digested.=0D + @param[in] DataSize Size of Data buffer in bytes.=0D + @param[in] Key Pointer to the user-supplied key.=0D + @param[in] KeySize Key size in bytes.=0D + @param[out] HashValue Pointer to a buffer that receives the HMAC-SHA3= 84 digest=0D + value (48 bytes).=0D +=0D + @retval TRUE HMAC-SHA384 digest computation succeeded.=0D + @retval FALSE HMAC-SHA384 digest computation failed.=0D + @retval FALSE This interface is not supported.=0D +=0D +**/=0D +BOOLEAN=0D +EFIAPI=0D +HmacSha384All (=0D + IN CONST VOID *Data,=0D + IN UINTN DataSize,=0D + IN CONST UINT8 *Key,=0D + IN UINTN KeySize,=0D + OUT UINT8 *HmacValue=0D + );=0D +=0D // =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0D // Symmetric Cryptography Primitive=0D // =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0D diff --git a/CryptoPkg/Include/Pcd/PcdCryptoServiceFamilyEnable.h b/CryptoP= kg/Include/Pcd/PcdCryptoServiceFamilyEnable.h index 3d53c2f105..e646d8ac05 100644 --- a/CryptoPkg/Include/Pcd/PcdCryptoServiceFamilyEnable.h +++ b/CryptoPkg/Include/Pcd/PcdCryptoServiceFamilyEnable.h @@ -53,9 +53,22 @@ typedef struct { UINT8 Duplicate : 1;=0D UINT8 Update : 1;=0D UINT8 Final : 1;=0D + UINT8 All : 1;=0D } Services;=0D UINT32 Family;=0D } HmacSha256;=0D + union {=0D + struct {=0D + UINT8 New : 1;=0D + UINT8 Free : 1;=0D + UINT8 SetKey : 1;=0D + UINT8 Duplicate : 1;=0D + UINT8 Update : 1;=0D + UINT8 Final : 1;=0D + UINT8 All : 1;=0D + } Services;=0D + UINT32 Family;=0D + } HmacSha384;=0D union {=0D struct {=0D UINT8 GetContextSize : 1;=0D diff --git a/CryptoPkg/Private/Protocol/Crypto.h b/CryptoPkg/Private/Protoc= ol/Crypto.h index c417568e96..6c14cdedca 100644 --- a/CryptoPkg/Private/Protocol/Crypto.h +++ b/CryptoPkg/Private/Protocol/Crypto.h @@ -266,6 +266,194 @@ BOOLEAN OUT UINT8 *HmacValue=0D );=0D =0D +/**=0D + Computes the HMAC-SHA256 digest of a input data buffer.=0D +=0D + This function performs the HMAC-SHA256 digest of a given data buffer, an= d places=0D + the digest value into the specified memory.=0D +=0D + If this interface is not supported, then return FALSE.=0D +=0D + @param[in] Data Pointer to the buffer containing the data to be= digested.=0D + @param[in] DataSize Size of Data buffer in bytes.=0D + @param[in] Key Pointer to the user-supplied key.=0D + @param[in] KeySize Key size in bytes.=0D + @param[out] HmacValue Pointer to a buffer that receives the HMAC-SHA2= 56 digest=0D + value (32 bytes).=0D +=0D + @retval TRUE HMAC-SHA256 digest computation succeeded.=0D + @retval FALSE HMAC-SHA256 digest computation failed.=0D + @retval FALSE This interface is not supported.=0D +=0D +**/=0D +typedef=0D +BOOLEAN=0D +(EFIAPI *EDKII_CRYPTO_HMAC_SHA256_ALL)(=0D + IN CONST VOID *Data,=0D + IN UINTN DataSize,=0D + IN CONST UINT8 *Key,=0D + IN UINTN KeySize,=0D + OUT UINT8 *HmacValue=0D + );=0D +=0D +/**=0D + Allocates and initializes one HMAC_CTX context for subsequent HMAC-SHA38= 4 use.=0D +=0D + @return Pointer to the HMAC_CTX context that has been initialized.=0D + If the allocations fails, HmacSha384New() returns NULL.=0D +=0D +**/=0D +typedef=0D +VOID *=0D +(EFIAPI *EDKII_CRYPTO_HMAC_SHA384_NEW)(=0D + VOID=0D + );=0D +=0D +/**=0D + Release the specified HMAC_CTX context.=0D +=0D + @param[in] HmacSha384Ctx Pointer to the HMAC_CTX context to be release= d.=0D +=0D +**/=0D +typedef=0D +VOID=0D +(EFIAPI *EDKII_CRYPTO_HMAC_SHA384_FREE)(=0D + IN VOID *HmacSha384Ctx=0D + );=0D +=0D +/**=0D + Set user-supplied key for subsequent use. It must be done before any=0D + calling to HmacSha384Update().=0D +=0D + If HmacSha384Context is NULL, then return FALSE.=0D + If this interface is not supported, then return FALSE.=0D +=0D + @param[out] HmacSha384Context Pointer to HMAC-SHA384 context.=0D + @param[in] Key Pointer to the user-supplied key.=0D + @param[in] KeySize Key size in bytes.=0D +=0D + @retval TRUE The Key is set successfully.=0D + @retval FALSE The Key is set unsuccessfully.=0D + @retval FALSE This interface is not supported.=0D +=0D +**/=0D +typedef=0D +BOOLEAN=0D +(EFIAPI *EDKII_CRYPTO_HMAC_SHA384_SET_KEY)(=0D + OUT VOID *HmacSha384Context,=0D + IN CONST UINT8 *Key,=0D + IN UINTN KeySize=0D + );=0D +=0D +/**=0D + Makes a copy of an existing HMAC-SHA384 context.=0D +=0D + If HmacSha384Context is NULL, then return FALSE.=0D + If NewHmacSha384Context is NULL, then return FALSE.=0D + If this interface is not supported, then return FALSE.=0D +=0D + @param[in] HmacSha384Context Pointer to HMAC-SHA384 context being c= opied.=0D + @param[out] NewHmacSha384Context Pointer to new HMAC-SHA384 context.=0D +=0D + @retval TRUE HMAC-SHA384 context copy succeeded.=0D + @retval FALSE HMAC-SHA384 context copy failed.=0D + @retval FALSE This interface is not supported.=0D +=0D +**/=0D +typedef=0D +BOOLEAN=0D +(EFIAPI *EDKII_CRYPTO_HMAC_SHA384_DUPLICATE)(=0D + IN CONST VOID *HmacSha384Context,=0D + OUT VOID *NewHmacSha384Context=0D + );=0D +=0D +/**=0D + Digests the input data and updates HMAC-SHA384 context.=0D +=0D + This function performs HMAC-SHA384 digest on a data buffer of the specif= ied size.=0D + It can be called multiple times to compute the digest of long or discont= inuous data streams.=0D + HMAC-SHA384 context should be initialized by HmacSha384New(), and should= not be finalized=0D + by HmacSha384Final(). Behavior with invalid context is undefined.=0D +=0D + If HmacSha384Context is NULL, then return FALSE.=0D + If this interface is not supported, then return FALSE.=0D +=0D + @param[in, out] HmacSha384Context Pointer to the HMAC-SHA384 context.=0D + @param[in] Data Pointer to the buffer containing the = data to be digested.=0D + @param[in] DataSize Size of Data buffer in bytes.=0D +=0D + @retval TRUE HMAC-SHA384 data digest succeeded.=0D + @retval FALSE HMAC-SHA384 data digest failed.=0D + @retval FALSE This interface is not supported.=0D +=0D +**/=0D +typedef=0D +BOOLEAN=0D +(EFIAPI *EDKII_CRYPTO_HMAC_SHA384_UPDATE)(=0D + IN OUT VOID *HmacSha384Context,=0D + IN CONST VOID *Data,=0D + IN UINTN DataSize=0D + );=0D +=0D +/**=0D + Completes computation of the HMAC-SHA384 digest value.=0D +=0D + This function completes HMAC-SHA384 hash computation and retrieves the d= igest value into=0D + the specified memory. After this function has been called, the HMAC-SHA3= 84 context cannot=0D + be used again.=0D + HMAC-SHA384 context should be initialized by HmacSha384New(), and should= not be finalized=0D + by HmacSha384Final(). Behavior with invalid HMAC-SHA384 context is undef= ined.=0D +=0D + If HmacSha384Context is NULL, then return FALSE.=0D + If HmacValue is NULL, then return FALSE.=0D + If this interface is not supported, then return FALSE.=0D +=0D + @param[in, out] HmacSha384Context Pointer to the HMAC-SHA384 context.= =0D + @param[out] HmacValue Pointer to a buffer that receives th= e HMAC-SHA384 digest=0D + value (48 bytes).=0D +=0D + @retval TRUE HMAC-SHA384 digest computation succeeded.=0D + @retval FALSE HMAC-SHA384 digest computation failed.=0D + @retval FALSE This interface is not supported.=0D +=0D +**/=0D +typedef=0D +BOOLEAN=0D +(EFIAPI *EDKII_CRYPTO_HMAC_SHA384_FINAL)(=0D + IN OUT VOID *HmacSha384Context,=0D + OUT UINT8 *HmacValue=0D + );=0D +=0D +/**=0D + Computes the HMAC-SHA384 digest of a input data buffer.=0D +=0D + This function performs the HMAC-SHA384 digest of a given data buffer, an= d places=0D + the digest value into the specified memory.=0D +=0D + If this interface is not supported, then return FALSE.=0D +=0D + @param[in] Data Pointer to the buffer containing the data to be= digested.=0D + @param[in] DataSize Size of Data buffer in bytes.=0D + @param[in] Key Pointer to the user-supplied key.=0D + @param[in] KeySize Key size in bytes.=0D + @param[out] HmacValue Pointer to a buffer that receives the HMAC-SHA3= 84 digest=0D + value (48 bytes).=0D +=0D + @retval TRUE HMAC-SHA384 digest computation succeeded.=0D + @retval FALSE HMAC-SHA384 digest computation failed.=0D + @retval FALSE This interface is not supported.=0D +=0D +**/=0D +typedef=0D +BOOLEAN=0D +(EFIAPI *EDKII_CRYPTO_HMAC_SHA384_ALL)(=0D + IN CONST VOID *Data,=0D + IN UINTN DataSize,=0D + IN CONST UINT8 *Key,=0D + IN UINTN KeySize,=0D + OUT UINT8 *HmacValue=0D + );=0D +=0D // =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0D // One-Way Cryptographic Hash Primitives=0D // =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0D @@ -3513,6 +3701,15 @@ struct _EDKII_CRYPTO_PROTOCOL { EDKII_CRYPTO_HMAC_SHA256_DUPLICATE HmacSha256Duplicate;= =0D EDKII_CRYPTO_HMAC_SHA256_UPDATE HmacSha256Update;=0D EDKII_CRYPTO_HMAC_SHA256_FINAL HmacSha256Final;=0D + EDKII_CRYPTO_HMAC_SHA256_ALL HmacSha256All;=0D + /// HMAC SHA384=0D + EDKII_CRYPTO_HMAC_SHA384_NEW HmacSha384New;=0D + EDKII_CRYPTO_HMAC_SHA384_FREE HmacSha384Free;=0D + EDKII_CRYPTO_HMAC_SHA384_SET_KEY HmacSha384SetKey;=0D + EDKII_CRYPTO_HMAC_SHA384_DUPLICATE HmacSha384Duplicate;= =0D + EDKII_CRYPTO_HMAC_SHA384_UPDATE HmacSha384Update;=0D + EDKII_CRYPTO_HMAC_SHA384_FINAL HmacSha384Final;=0D + EDKII_CRYPTO_HMAC_SHA384_ALL HmacSha384All;=0D /// Md4 - deprecated and unsupported=0D DEPRECATED_EDKII_CRYPTO_MD4_GET_CONTEXT_SIZE DeprecatedMd4GetConte= xtSize;=0D DEPRECATED_EDKII_CRYPTO_MD4_INIT DeprecatedMd4Init;=0D --=20 2.26.2.windows.1