]> git.proxmox.com Git - mirror_edk2.git/blobdiff - CryptoPkg/Library/BaseCryptLibOnProtocolPpi/CryptLib.c
CryptoPkg: Add EC key interface to DXE and protocol
[mirror_edk2.git] / CryptoPkg / Library / BaseCryptLibOnProtocolPpi / CryptLib.c
index 52b934a5456a38f6d4cd644773c85d77f5b802cb..48ec6d35288f1e25a07e13c41341df99ebcc5982 100644 (file)
@@ -5164,3 +5164,139 @@ EcDhComputeKey (
 {\r
   CALL_CRYPTO_SERVICE (EcDhComputeKey, (EcContext, PeerPublic, PeerPublicSize, CompressFlag, Key, KeySize), FALSE);\r
 }\r
+\r
+/**\r
+  Retrieve the EC Public Key from one DER-encoded X509 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] 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
+  If Cert is NULL, then return FALSE.\r
+  If EcContext is NULL, then return FALSE.\r
+\r
+  @retval  TRUE   EC Public Key was retrieved successfully.\r
+  @retval  FALSE  Fail to retrieve EC public key from X509 certificate.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcGetPublicKeyFromX509 (\r
+  IN   CONST UINT8  *Cert,\r
+  IN   UINTN        CertSize,\r
+  OUT  VOID         **EcContext\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcGetPublicKeyFromX509, (Cert, CertSize, EcContext), FALSE);\r
+}\r
+\r
+/**\r
+  Retrieve the EC Private Key from the password-protected PEM key data.\r
+\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
+  If PemData is NULL, then return FALSE.\r
+  If EcContext is NULL, then return FALSE.\r
+\r
+  @retval  TRUE   EC Private Key was retrieved successfully.\r
+  @retval  FALSE  Invalid PEM key data or incorrect password.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+EcGetPrivateKeyFromPem (\r
+  IN   CONST UINT8  *PemData,\r
+  IN   UINTN        PemSize,\r
+  IN   CONST CHAR8  *Password,\r
+  OUT  VOID         **EcContext\r
+  )\r
+{\r
+  CALL_CRYPTO_SERVICE (EcGetPrivateKeyFromPem, (PemData, PemSize, Password, EcContext), FALSE);\r
+}\r
+\r
+/**\r
+  Carries out the EC-DSA signature.\r
+\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
+  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
+  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
+BOOLEAN\r
+EFIAPI\r
+EcDsaSign (\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
+  CALL_CRYPTO_SERVICE (EcDsaSign, (EcContext, HashNid, MessageHash, HashSize, Signature, SigSize), FALSE);\r
+}\r
+\r
+/**\r
+  Verifies the EC-DSA signature.\r
+\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
+  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 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
+BOOLEAN\r
+EFIAPI\r
+EcDsaVerify (\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
+  CALL_CRYPTO_SERVICE (EcDsaVerify, (EcContext, HashNid, MessageHash, HashSize, Signature, SigSize), FALSE);\r
+}\r