Revision: 13958
          http://edk2.svn.sourceforge.net/edk2/?rev=13958&view=rev
Author:   tye1
Date:     2012-11-22 05:07:22 +0000 (Thu, 22 Nov 2012)
Log Message:
-----------
Fix issue that RsaPkcs1Verify() may not work in PEI phase.

Signed-off-by: Ye Ting <[email protected]>
Reviewed-by: Yao Jiewen <[email protected]>
Reviewed-by: Long Qin <[email protected]>

Modified Paths:
--------------
    trunk/edk2/CryptoPkg/CryptRuntimeDxe/CryptRuntime.c
    trunk/edk2/CryptoPkg/CryptRuntimeDxe/CryptRuntime.h
    trunk/edk2/CryptoPkg/Include/Library/BaseCryptLib.h
    trunk/edk2/CryptoPkg/Include/Protocol/RuntimeCrypt.h
    trunk/edk2/CryptoPkg/Library/BaseCryptLib/Pk/CryptRsaBasic.c
    
trunk/edk2/CryptoPkg/Library/BaseCryptLibRuntimeCryptProtocol/RuntimeDxeIpfCryptLib.c

Modified: trunk/edk2/CryptoPkg/CryptRuntimeDxe/CryptRuntime.c
===================================================================
--- trunk/edk2/CryptoPkg/CryptRuntimeDxe/CryptRuntime.c 2012-11-21 08:06:02 UTC 
(rev 13957)
+++ trunk/edk2/CryptoPkg/CryptRuntimeDxe/CryptRuntime.c 2012-11-22 05:07:22 UTC 
(rev 13958)
@@ -205,7 +205,7 @@
   IN  VOID         *RsaContext,
   IN  CONST UINT8  *MessageHash,
   IN  UINTN        HashLength,
-  IN  UINT8        *Signature,
+  IN  CONST UINT8  *Signature,
   IN  UINTN        SigLength
   )
 {

Modified: trunk/edk2/CryptoPkg/CryptRuntimeDxe/CryptRuntime.h
===================================================================
--- trunk/edk2/CryptoPkg/CryptRuntimeDxe/CryptRuntime.h 2012-11-21 08:06:02 UTC 
(rev 13957)
+++ trunk/edk2/CryptoPkg/CryptRuntimeDxe/CryptRuntime.h 2012-11-22 05:07:22 UTC 
(rev 13958)
@@ -179,7 +179,7 @@
   IN  VOID         *RsaContext,
   IN  CONST UINT8  *MessageHash,
   IN  UINTN        HashLength,
-  IN  UINT8        *Signature,
+  IN  CONST UINT8  *Signature,
   IN  UINTN        SigLength
   );
 

Modified: trunk/edk2/CryptoPkg/Include/Library/BaseCryptLib.h
===================================================================
--- trunk/edk2/CryptoPkg/Include/Library/BaseCryptLib.h 2012-11-21 08:06:02 UTC 
(rev 13957)
+++ trunk/edk2/CryptoPkg/Include/Library/BaseCryptLib.h 2012-11-22 05:07:22 UTC 
(rev 13958)
@@ -1498,7 +1498,7 @@
   IN  VOID         *RsaContext,
   IN  CONST UINT8  *MessageHash,
   IN  UINTN        HashSize,
-  IN  UINT8        *Signature,
+  IN  CONST UINT8  *Signature,
   IN  UINTN        SigSize
   );
 

Modified: trunk/edk2/CryptoPkg/Include/Protocol/RuntimeCrypt.h
===================================================================
--- trunk/edk2/CryptoPkg/Include/Protocol/RuntimeCrypt.h        2012-11-21 
08:06:02 UTC (rev 13957)
+++ trunk/edk2/CryptoPkg/Include/Protocol/RuntimeCrypt.h        2012-11-22 
05:07:22 UTC (rev 13958)
@@ -181,7 +181,7 @@
   IN  VOID         *RsaContext,
   IN  CONST UINT8  *MessageHash,
   IN  UINTN        HashLength,
-  IN  UINT8        *Signature,
+  IN  CONST UINT8  *Signature,
   IN  UINTN        SigLength
   );
 

Modified: trunk/edk2/CryptoPkg/Library/BaseCryptLib/Pk/CryptRsaBasic.c
===================================================================
--- trunk/edk2/CryptoPkg/Library/BaseCryptLib/Pk/CryptRsaBasic.c        
2012-11-21 08:06:02 UTC (rev 13957)
+++ trunk/edk2/CryptoPkg/Library/BaseCryptLib/Pk/CryptRsaBasic.c        
2012-11-22 05:07:22 UTC (rev 13958)
@@ -285,19 +285,23 @@
   IN  VOID         *RsaContext,
   IN  CONST UINT8  *MessageHash,
   IN  UINTN        HashSize,
-  IN  UINT8        *Signature,
+  IN  CONST UINT8  *Signature,
   IN  UINTN        SigSize
   )
 {
   INTN     Length;
+  UINT8    *DecryptedSigature;
 
   //
   // Check input parameters.
   //
-  if (RsaContext == NULL || MessageHash == NULL || Signature == NULL || 
SigSize > INT_MAX) {
+  if (RsaContext == NULL || MessageHash == NULL || Signature == NULL) {
     return FALSE;
   }
 
+  if (SigSize > INT_MAX || SigSize == 0) {
+    return FALSE;
+  }
   
   //
   // Check for unsupported hash size:
@@ -306,14 +310,22 @@
   if (HashSize != MD5_DIGEST_SIZE && HashSize != SHA1_DIGEST_SIZE && HashSize 
!= SHA256_DIGEST_SIZE) {
     return FALSE;
   }
-  
+
   //
+  // Prepare buffer to store decrypted signature.
+  //
+  DecryptedSigature = (UINT8 *) malloc (SigSize);
+  if (DecryptedSigature == NULL) {
+    return FALSE;
+  }
+
+  //
   // RSA PKCS#1 Signature Decoding using OpenSSL RSA Decryption with Public Key
   //
   Length = RSA_public_decrypt (
              (UINT32) SigSize,
              Signature,
-             Signature,
+             DecryptedSigature,
              RsaContext,
              RSA_PKCS1_PADDING
              );
@@ -324,6 +336,7 @@
   //       Ignore more strict length checking here.
   //
   if (Length < (INTN) HashSize) {
+    free (DecryptedSigature);
     return FALSE;
   }
 
@@ -337,15 +350,17 @@
   //       Then Memory Comparing should skip the DER value of the underlying 
SEQUENCE
   //       type and AlgorithmIdentifier.
   //
-  if (CompareMem (MessageHash, Signature + Length - HashSize, HashSize) == 0) {
+  if (CompareMem (MessageHash, DecryptedSigature + Length - HashSize, 
HashSize) == 0) {
     //
     // Valid RSA PKCS#1 Signature
     //
+    free (DecryptedSigature);
     return TRUE;
   } else {
     //
     // Failed to verification
     //
+    free (DecryptedSigature);
     return FALSE;
   }
 }

Modified: 
trunk/edk2/CryptoPkg/Library/BaseCryptLibRuntimeCryptProtocol/RuntimeDxeIpfCryptLib.c
===================================================================
--- 
trunk/edk2/CryptoPkg/Library/BaseCryptLibRuntimeCryptProtocol/RuntimeDxeIpfCryptLib.c
       2012-11-21 08:06:02 UTC (rev 13957)
+++ 
trunk/edk2/CryptoPkg/Library/BaseCryptLibRuntimeCryptProtocol/RuntimeDxeIpfCryptLib.c
       2012-11-22 05:07:22 UTC (rev 13958)
@@ -401,7 +401,7 @@
   IN  VOID         *RsaContext,
   IN  CONST UINT8  *MessageHash,
   IN  UINTN        HashSize,
-  IN  UINT8        *Signature,
+  IN  CONST UINT8  *Signature,
   IN  UINTN        SigSize
   )
 {

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to