This patch is used to retrieve EC key from PEM and X509 and carry out the EC-DSA signature and verify it. REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4102 Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Jian J Wang <jian.j.wang@intel.com> Cc: Xiaoyu Lu <xiaoyu1.lu@intel.com> Cc: Guomin Jiang <guomin.jiang@intel.com> Signed-off-by: Qi Zhang <qi1.zhang@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
		
			
				
	
	
		
			579 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			579 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Elliptic Curve and ECDH API implementation based on OpenSSL
 | |
| 
 | |
|   Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include <Library/BaseCryptLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| 
 | |
| /**
 | |
|   Initialize new opaque EcGroup object. This object represents an EC curve and
 | |
|   and is used for calculation within this group. This object should be freed
 | |
|   using EcGroupFree() function.
 | |
| 
 | |
|   @param[in]  CryptoNid   Identifying number for the ECC curve (Defined in
 | |
|                           BaseCryptLib.h).
 | |
| 
 | |
|   @retval EcGroup object  On success.
 | |
|   @retval NULL            On failure.
 | |
| **/
 | |
| VOID *
 | |
| EFIAPI
 | |
| EcGroupInit (
 | |
|   IN UINTN  CryptoNid
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return NULL;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Get EC curve parameters. While elliptic curve equation is Y^2 mod P = (X^3 + AX + B) Mod P.
 | |
|   This function will set the provided Big Number objects  to the corresponding
 | |
|   values. The caller needs to make sure all the "out" BigNumber parameters
 | |
|   are properly initialized.
 | |
| 
 | |
|   @param[in]  EcGroup    EC group object.
 | |
|   @param[out] BnPrime    Group prime number.
 | |
|   @param[out] BnA        A coefficient.
 | |
|   @param[out] BnB        B coefficient..
 | |
|   @param[in]  BnCtx      BN context.
 | |
| 
 | |
|   @retval TRUE          On success.
 | |
|   @retval FALSE         Otherwise.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcGroupGetCurve (
 | |
|   IN CONST VOID  *EcGroup,
 | |
|   OUT VOID       *BnPrime,
 | |
|   OUT VOID       *BnA,
 | |
|   OUT VOID       *BnB,
 | |
|   IN VOID        *BnCtx
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Get EC group order.
 | |
|   This function will set the provided Big Number object to the corresponding
 | |
|   value. The caller needs to make sure that the "out" BigNumber parameter
 | |
|   is properly initialized.
 | |
| 
 | |
|   @param[in]  EcGroup   EC group object.
 | |
|   @param[out] BnOrder   Group prime number.
 | |
| 
 | |
|   @retval TRUE          On success.
 | |
|   @retval FALSE         Otherwise.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcGroupGetOrder (
 | |
|   IN VOID   *EcGroup,
 | |
|   OUT VOID  *BnOrder
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Free previously allocated EC group object using EcGroupInit().
 | |
| 
 | |
|   @param[in]  EcGroup   EC group object to free.
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| EcGroupFree (
 | |
|   IN VOID  *EcGroup
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Initialize new opaque EC Point object. This object represents an EC point
 | |
|   within the given EC group (curve).
 | |
| 
 | |
|   @param[in]  EC Group, properly initialized using EcGroupInit().
 | |
| 
 | |
|   @retval EC Point object  On success.
 | |
|   @retval NULL             On failure.
 | |
| **/
 | |
| VOID *
 | |
| EFIAPI
 | |
| EcPointInit (
 | |
|   IN CONST VOID  *EcGroup
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return NULL;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Free previously allocated EC Point object using EcPointInit().
 | |
| 
 | |
|   @param[in]  EcPoint   EC Point to free.
 | |
|   @param[in]  Clear     TRUE iff the memory should be cleared.
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| EcPointDeInit (
 | |
|   IN VOID     *EcPoint,
 | |
|   IN BOOLEAN  Clear
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Get EC point affine (x,y) coordinates.
 | |
|   This function will set the provided Big Number objects to the corresponding
 | |
|   values. The caller needs to make sure all the "out" BigNumber parameters
 | |
|   are properly initialized.
 | |
| 
 | |
|   @param[in]  EcGroup    EC group object.
 | |
|   @param[in]  EcPoint    EC point object.
 | |
|   @param[out] BnX        X coordinate.
 | |
|   @param[out] BnY        Y coordinate.
 | |
|   @param[in]  BnCtx      BN context, created with BigNumNewContext().
 | |
| 
 | |
|   @retval TRUE          On success.
 | |
|   @retval FALSE         Otherwise.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcPointGetAffineCoordinates (
 | |
|   IN CONST VOID  *EcGroup,
 | |
|   IN CONST VOID  *EcPoint,
 | |
|   OUT VOID       *BnX,
 | |
|   OUT VOID       *BnY,
 | |
|   IN VOID        *BnCtx
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Set EC point affine (x,y) coordinates.
 | |
| 
 | |
|   @param[in]  EcGroup    EC group object.
 | |
|   @param[in]  EcPoint    EC point object.
 | |
|   @param[in]  BnX        X coordinate.
 | |
|   @param[in]  BnY        Y coordinate.
 | |
|   @param[in]  BnCtx      BN context, created with BigNumNewContext().
 | |
| 
 | |
|   @retval TRUE          On success.
 | |
|   @retval FALSE         Otherwise.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcPointSetAffineCoordinates (
 | |
|   IN CONST VOID  *EcGroup,
 | |
|   IN VOID        *EcPoint,
 | |
|   IN CONST VOID  *BnX,
 | |
|   IN CONST VOID  *BnY,
 | |
|   IN VOID        *BnCtx
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   EC Point addition. EcPointResult = EcPointA + EcPointB.
 | |
| 
 | |
|   @param[in]  EcGroup          EC group object.
 | |
|   @param[out] EcPointResult    EC point to hold the result. The point should
 | |
|                                be properly initialized.
 | |
|   @param[in]  EcPointA         EC Point.
 | |
|   @param[in]  EcPointB         EC Point.
 | |
|   @param[in]  BnCtx            BN context, created with BigNumNewContext().
 | |
| 
 | |
|   @retval TRUE          On success.
 | |
|   @retval FALSE         Otherwise.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcPointAdd (
 | |
|   IN CONST VOID  *EcGroup,
 | |
|   OUT VOID       *EcPointResult,
 | |
|   IN CONST VOID  *EcPointA,
 | |
|   IN CONST VOID  *EcPointB,
 | |
|   IN VOID        *BnCtx
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Variable EC point multiplication. EcPointResult = EcPoint * BnPScalar.
 | |
| 
 | |
|   @param[in]  EcGroup          EC group object.
 | |
|   @param[out] EcPointResult    EC point to hold the result. The point should
 | |
|                                be properly initialized.
 | |
|   @param[in]  EcPoint          EC Point.
 | |
|   @param[in]  BnPScalar        P Scalar.
 | |
|   @param[in]  BnCtx            BN context, created with BigNumNewContext().
 | |
| 
 | |
|   @retval TRUE          On success.
 | |
|   @retval FALSE         Otherwise.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcPointMul (
 | |
|   IN CONST VOID  *EcGroup,
 | |
|   OUT VOID       *EcPointResult,
 | |
|   IN CONST VOID  *EcPoint,
 | |
|   IN CONST VOID  *BnPScalar,
 | |
|   IN VOID        *BnCtx
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Calculate the inverse of the supplied EC point.
 | |
| 
 | |
|   @param[in]     EcGroup   EC group object.
 | |
|   @param[in,out] EcPoint   EC point to invert.
 | |
|   @param[in]     BnCtx     BN context, created with BigNumNewContext().
 | |
| 
 | |
|   @retval TRUE          On success.
 | |
|   @retval FALSE         Otherwise.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcPointInvert (
 | |
|   IN CONST VOID  *EcGroup,
 | |
|   IN OUT VOID    *EcPoint,
 | |
|   IN VOID        *BnCtx
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Check if the supplied point is on EC curve.
 | |
| 
 | |
|   @param[in]  EcGroup   EC group object.
 | |
|   @param[in]  EcPoint   EC point to check.
 | |
|   @param[in]  BnCtx     BN context, created with BigNumNewContext().
 | |
| 
 | |
|   @retval TRUE          On curve.
 | |
|   @retval FALSE         Otherwise.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcPointIsOnCurve (
 | |
|   IN CONST VOID  *EcGroup,
 | |
|   IN CONST VOID  *EcPoint,
 | |
|   IN VOID        *BnCtx
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Check if the supplied point is at infinity.
 | |
| 
 | |
|   @param[in]  EcGroup   EC group object.
 | |
|   @param[in]  EcPoint   EC point to check.
 | |
| 
 | |
|   @retval TRUE          At infinity.
 | |
|   @retval FALSE         Otherwise.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcPointIsAtInfinity (
 | |
|   IN CONST VOID  *EcGroup,
 | |
|   IN CONST VOID  *EcPoint
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Check if EC points are equal.
 | |
| 
 | |
|   @param[in]  EcGroup   EC group object.
 | |
|   @param[in]  EcPointA  EC point A.
 | |
|   @param[in]  EcPointB  EC point B.
 | |
|   @param[in]  BnCtx     BN context, created with BigNumNewContext().
 | |
| 
 | |
|   @retval TRUE          A == B.
 | |
|   @retval FALSE         Otherwise.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcPointEqual (
 | |
|   IN CONST VOID  *EcGroup,
 | |
|   IN CONST VOID  *EcPointA,
 | |
|   IN CONST VOID  *EcPointB,
 | |
|   IN VOID        *BnCtx
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Set EC point compressed coordinates. Points can be described in terms of
 | |
|   their compressed coordinates. For a point (x, y), for any given value for x
 | |
|   such that the point is on the curve there will only ever be two possible
 | |
|   values for y. Therefore, a point can be set using this function where BnX is
 | |
|   the x coordinate and YBit is a value 0 or 1 to identify which of the two
 | |
|   possible values for y should be used.
 | |
| 
 | |
|   @param[in]  EcGroup    EC group object.
 | |
|   @param[in]  EcPoint    EC Point.
 | |
|   @param[in]  BnX        X coordinate.
 | |
|   @param[in]  YBit       0 or 1 to identify which Y value is used.
 | |
|   @param[in]  BnCtx      BN context, created with BigNumNewContext().
 | |
| 
 | |
|   @retval TRUE          On success.
 | |
|   @retval FALSE         Otherwise.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcPointSetCompressedCoordinates (
 | |
|   IN CONST VOID  *EcGroup,
 | |
|   IN VOID        *EcPoint,
 | |
|   IN CONST VOID  *BnX,
 | |
|   IN UINT8       YBit,
 | |
|   IN VOID        *BnCtx
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Allocates and Initializes one Elliptic Curve Context for subsequent use
 | |
|   with the NID.
 | |
| 
 | |
|   @param[in]  Nid cipher NID
 | |
|   @return     Pointer to the Elliptic Curve Context that has been initialized.
 | |
|               If the allocations fails, EcNewByNid() returns NULL.
 | |
| **/
 | |
| VOID *
 | |
| EFIAPI
 | |
| EcNewByNid (
 | |
|   IN UINTN  Nid
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return NULL;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Release the specified EC context.
 | |
| 
 | |
|   @param[in]  EcContext  Pointer to the EC context to be released.
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| EcFree (
 | |
|   IN  VOID  *EcContext
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Generates EC key and returns EC public key (X, Y), Please note, this function uses
 | |
|   pseudo random number generator. The caller must make sure RandomSeed()
 | |
|   function was properly called before.
 | |
|   The Ec context should be correctly initialized by EcNewByNid.
 | |
|   This function generates random secret, and computes the public key (X, Y), which is
 | |
|   returned via parameter Public, PublicSize.
 | |
|   X is the first half of Public with size being PublicSize / 2,
 | |
|   Y is the second half of Public with size being PublicSize / 2.
 | |
|   EC context is updated accordingly.
 | |
|   If the Public buffer is too small to hold the public X, Y, FALSE is returned and
 | |
|   PublicSize is set to the required buffer size to obtain the public X, Y.
 | |
|   For P-256, the PublicSize is 64. First 32-byte is X, Second 32-byte is Y.
 | |
|   For P-384, the PublicSize is 96. First 48-byte is X, Second 48-byte is Y.
 | |
|   For P-521, the PublicSize is 132. First 66-byte is X, Second 66-byte is Y.
 | |
|   If EcContext is NULL, then return FALSE.
 | |
|   If PublicSize is NULL, then return FALSE.
 | |
|   If PublicSize is large enough but Public is NULL, then return FALSE.
 | |
|   @param[in, out]  EcContext      Pointer to the EC context.
 | |
|   @param[out]      PublicKey      Pointer to t buffer to receive generated public X,Y.
 | |
|   @param[in, out]  PublicKeySize  On input, the size of Public buffer in bytes.
 | |
|                                   On output, the size of data returned in Public buffer in bytes.
 | |
|   @retval TRUE   EC public X,Y generation succeeded.
 | |
|   @retval FALSE  EC public X,Y generation failed.
 | |
|   @retval FALSE  PublicKeySize is not large enough.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcGenerateKey (
 | |
|   IN OUT  VOID   *EcContext,
 | |
|   OUT     UINT8  *PublicKey,
 | |
|   IN OUT  UINTN  *PublicKeySize
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Gets the public key component from the established EC context.
 | |
|   The Ec context should be correctly initialized by EcNewByNid, and successfully
 | |
|   generate key pair from EcGenerateKey().
 | |
|   For P-256, the PublicSize is 64. First 32-byte is X, Second 32-byte is Y.
 | |
|   For P-384, the PublicSize is 96. First 48-byte is X, Second 48-byte is Y.
 | |
|   For P-521, the PublicSize is 132. First 66-byte is X, Second 66-byte is Y.
 | |
|   @param[in, out]  EcContext      Pointer to EC context being set.
 | |
|   @param[out]      PublicKey      Pointer to t buffer to receive generated public X,Y.
 | |
|   @param[in, out]  PublicKeySize  On input, the size of Public buffer in bytes.
 | |
|                                   On output, the size of data returned in Public buffer in bytes.
 | |
|   @retval  TRUE   EC key component was retrieved successfully.
 | |
|   @retval  FALSE  Invalid EC key component.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcGetPubKey (
 | |
|   IN OUT  VOID   *EcContext,
 | |
|   OUT     UINT8  *PublicKey,
 | |
|   IN OUT  UINTN  *PublicKeySize
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Computes exchanged common key.
 | |
|   Given peer's public key (X, Y), this function computes the exchanged common key,
 | |
|   based on its own context including value of curve parameter and random secret.
 | |
|   X is the first half of PeerPublic with size being PeerPublicSize / 2,
 | |
|   Y is the second half of PeerPublic with size being PeerPublicSize / 2.
 | |
|   If EcContext is NULL, then return FALSE.
 | |
|   If PeerPublic is NULL, then return FALSE.
 | |
|   If PeerPublicSize is 0, then return FALSE.
 | |
|   If Key is NULL, then return FALSE.
 | |
|   If KeySize is not large enough, then return FALSE.
 | |
|   For P-256, the PeerPublicSize is 64. First 32-byte is X, Second 32-byte is Y.
 | |
|   For P-384, the PeerPublicSize is 96. First 48-byte is X, Second 48-byte is Y.
 | |
|   For P-521, the PeerPublicSize is 132. First 66-byte is X, Second 66-byte is Y.
 | |
|   @param[in, out]  EcContext          Pointer to the EC context.
 | |
|   @param[in]       PeerPublic         Pointer to the peer's public X,Y.
 | |
|   @param[in]       PeerPublicSize     Size of peer's public X,Y in bytes.
 | |
|   @param[in]       CompressFlag       Flag of PeerPublic is compressed or not.
 | |
|   @param[out]      Key                Pointer to the buffer to receive generated key.
 | |
|   @param[in, out]  KeySize            On input, the size of Key buffer in bytes.
 | |
|                                       On output, the size of data returned in Key buffer in bytes.
 | |
|   @retval TRUE   EC exchanged key generation succeeded.
 | |
|   @retval FALSE  EC exchanged key generation failed.
 | |
|   @retval FALSE  KeySize is not large enough.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcDhComputeKey (
 | |
|   IN OUT  VOID         *EcContext,
 | |
|   IN      CONST UINT8  *PeerPublic,
 | |
|   IN      UINTN        PeerPublicSize,
 | |
|   IN      CONST INT32  *CompressFlag,
 | |
|   OUT     UINT8        *Key,
 | |
|   IN OUT  UINTN        *KeySize
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Carries out the EC-DSA signature.
 | |
| 
 | |
|   This function carries out the EC-DSA signature.
 | |
|   If the Signature buffer is too small to hold the contents of signature, FALSE
 | |
|   is returned and SigSize is set to the required buffer size to obtain the signature.
 | |
| 
 | |
|   If EcContext is NULL, then return FALSE.
 | |
|   If MessageHash is NULL, then return FALSE.
 | |
|   If HashSize need match the HashNid. HashNid could be SHA256, SHA384, SHA512, SHA3_256, SHA3_384, SHA3_512.
 | |
|   If SigSize is large enough but Signature is NULL, then return FALSE.
 | |
| 
 | |
|   For P-256, the SigSize is 64. First 32-byte is R, Second 32-byte is S.
 | |
|   For P-384, the SigSize is 96. First 48-byte is R, Second 48-byte is S.
 | |
|   For P-521, the SigSize is 132. First 66-byte is R, Second 66-byte is S.
 | |
| 
 | |
|   @param[in]       EcContext    Pointer to EC context for signature generation.
 | |
|   @param[in]       HashNid      hash NID
 | |
|   @param[in]       MessageHash  Pointer to octet message hash to be signed.
 | |
|   @param[in]       HashSize     Size of the message hash in bytes.
 | |
|   @param[out]      Signature    Pointer to buffer to receive EC-DSA signature.
 | |
|   @param[in, out]  SigSize      On input, the size of Signature buffer in bytes.
 | |
|                                 On output, the size of data returned in Signature buffer in bytes.
 | |
| 
 | |
|   @retval  TRUE   Signature successfully generated in EC-DSA.
 | |
|   @retval  FALSE  Signature generation failed.
 | |
|   @retval  FALSE  SigSize is too small.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcDsaSign (
 | |
|   IN      VOID         *EcContext,
 | |
|   IN      UINTN        HashNid,
 | |
|   IN      CONST UINT8  *MessageHash,
 | |
|   IN      UINTN        HashSize,
 | |
|   OUT     UINT8        *Signature,
 | |
|   IN OUT  UINTN        *SigSize
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Verifies the EC-DSA signature.
 | |
| 
 | |
|   If EcContext is NULL, then return FALSE.
 | |
|   If MessageHash is NULL, then return FALSE.
 | |
|   If Signature is NULL, then return FALSE.
 | |
|   If HashSize need match the HashNid. HashNid could be SHA256, SHA384, SHA512, SHA3_256, SHA3_384, SHA3_512.
 | |
| 
 | |
|   For P-256, the SigSize is 64. First 32-byte is R, Second 32-byte is S.
 | |
|   For P-384, the SigSize is 96. First 48-byte is R, Second 48-byte is S.
 | |
|   For P-521, the SigSize is 132. First 66-byte is R, Second 66-byte is S.
 | |
| 
 | |
|   @param[in]  EcContext    Pointer to EC context for signature verification.
 | |
|   @param[in]  HashNid      hash NID
 | |
|   @param[in]  MessageHash  Pointer to octet message hash to be checked.
 | |
|   @param[in]  HashSize     Size of the message hash in bytes.
 | |
|   @param[in]  Signature    Pointer to EC-DSA signature to be verified.
 | |
|   @param[in]  SigSize      Size of signature in bytes.
 | |
| 
 | |
|   @retval  TRUE   Valid signature encoded in EC-DSA.
 | |
|   @retval  FALSE  Invalid signature or invalid EC context.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EcDsaVerify (
 | |
|   IN  VOID         *EcContext,
 | |
|   IN  UINTN        HashNid,
 | |
|   IN  CONST UINT8  *MessageHash,
 | |
|   IN  UINTN        HashSize,
 | |
|   IN  CONST UINT8  *Signature,
 | |
|   IN  UINTN        SigSize
 | |
|   )
 | |
| {
 | |
|   ASSERT (FALSE);
 | |
|   return FALSE;
 | |
| }
 |