CryptoPkg/BaseCryptLib: Add NULL pointer checks in DH and P7Verify
[mirror_edk2.git] / CryptoPkg / Library / BaseCryptLib / Pk / CryptDh.c
index 942b3d1..391efd5 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Diffie-Hellman Wrapper Implementation over OpenSSL.\r
 \r
 /** @file\r
   Diffie-Hellman Wrapper Implementation over OpenSSL.\r
 \r
-Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -13,9 +13,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 \r
 #include "InternalCryptLib.h"\r
 **/\r
 \r
 #include "InternalCryptLib.h"\r
+#include <openssl/bn.h>\r
 #include <openssl/dh.h>\r
 \r
 #include <openssl/dh.h>\r
 \r
-\r
 /**\r
   Allocates and Initializes one Diffie-Hellman Context for subsequent use.\r
 \r
 /**\r
   Allocates and Initializes one Diffie-Hellman Context for subsequent use.\r
 \r
@@ -72,7 +72,7 @@ DhFree (
   @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
   @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 pamameter generation succeeded.\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
 \r
   @retval FALSE  Value of Generator is not supported.\r
   @retval FALSE  PRNG fails to generate random prime number with PrimeLength.\r
 \r
@@ -87,6 +87,7 @@ DhGenerateParameter (
   )\r
 {\r
   BOOLEAN RetVal;\r
   )\r
 {\r
   BOOLEAN RetVal;\r
+  BIGNUM  *BnP;\r
 \r
   //\r
   // Check input parameters.\r
 \r
   //\r
   // Check input parameters.\r
@@ -104,7 +105,8 @@ DhGenerateParameter (
     return FALSE;\r
   }\r
 \r
     return FALSE;\r
   }\r
 \r
-  BN_bn2bin (((DH *) DhContext)->p, Prime);\r
+  DH_get0_pqg (DhContext, (const BIGNUM **)&BnP, NULL, NULL);\r
+  BN_bn2bin (BnP, Prime);\r
 \r
   return TRUE;\r
 }\r
 \r
   return TRUE;\r
 }\r
@@ -123,7 +125,7 @@ DhGenerateParameter (
   @param[in]       PrimeLength  Length in bits of prime to be generated.\r
   @param[in]       Prime        Pointer to the prime number.\r
 \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 pamameter setting succeeded.\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 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
@@ -140,7 +142,8 @@ DhSetParameter (
   )\r
 {\r
   DH      *Dh;\r
   )\r
 {\r
   DH      *Dh;\r
-  BIGNUM  *Bn;\r
+  BIGNUM  *BnP;\r
+  BIGNUM  *BnG;\r
 \r
   //\r
   // Check input parameters.\r
 \r
   //\r
   // Check input parameters.\r
@@ -148,50 +151,27 @@ DhSetParameter (
   if (DhContext == NULL || Prime == NULL || PrimeLength > INT_MAX) {\r
     return FALSE;\r
   }\r
   if (DhContext == NULL || Prime == NULL || PrimeLength > INT_MAX) {\r
     return FALSE;\r
   }\r
-  \r
+\r
   if (Generator != DH_GENERATOR_2 && Generator != DH_GENERATOR_5) {\r
     return FALSE;\r
   }\r
 \r
   if (Generator != DH_GENERATOR_2 && Generator != DH_GENERATOR_5) {\r
     return FALSE;\r
   }\r
 \r
-  Bn = NULL;\r
-\r
-  Dh = (DH *) DhContext;\r
-  Dh->g = NULL;\r
-  Dh->p = BN_new ();\r
-  if (Dh->p == NULL) {\r
-    goto Error;\r
-  }\r
-  \r
-  Dh->g = BN_new ();\r
-  if (Dh->g == NULL) {\r
-    goto Error;\r
-  }\r
-\r
-  Bn = BN_bin2bn (Prime, (UINT32) (PrimeLength / 8), Dh->p);\r
-  if (Bn == NULL) {\r
-    goto Error;\r
-  }\r
-\r
-  if (BN_set_word (Dh->g, (UINT32) Generator) == 0) {\r
+  //\r
+  // Set the generator and prime parameters for DH object.\r
+  //\r
+  Dh  = (DH *)DhContext;\r
+  BnP = BN_bin2bn ((const unsigned char *)Prime, (int)(PrimeLength / 8), NULL);\r
+  BnG = BN_bin2bn ((const unsigned char *)&Generator, 1, NULL);\r
+  if ((BnP == NULL) || (BnG == NULL) || !DH_set0_pqg (Dh, BnP, NULL, BnG)) {\r
     goto Error;\r
   }\r
 \r
   return TRUE;\r
 \r
 Error:\r
     goto Error;\r
   }\r
 \r
   return TRUE;\r
 \r
 Error:\r
+  BN_free (BnP);\r
+  BN_free (BnG);\r
 \r
 \r
-  if (Dh->p != NULL) {\r
-    BN_free (Dh->p);\r
-  }\r
-\r
-  if (Dh->g != NULL) {\r
-    BN_free (Dh->g);\r
-  }\r
-\r
-  if (Bn != NULL) {\r
-    BN_free (Bn);\r
-  }\r
-  \r
   return FALSE;\r
 }\r
 \r
   return FALSE;\r
 }\r
 \r
@@ -227,6 +207,7 @@ DhGenerateKey (
 {\r
   BOOLEAN RetVal;\r
   DH      *Dh;\r
 {\r
   BOOLEAN RetVal;\r
   DH      *Dh;\r
+  BIGNUM  *DhPubKey;\r
   INTN    Size;\r
 \r
   //\r
   INTN    Size;\r
 \r
   //\r
@@ -239,18 +220,21 @@ DhGenerateKey (
   if (PublicKey == NULL && *PublicKeySize != 0) {\r
     return FALSE;\r
   }\r
   if (PublicKey == NULL && *PublicKeySize != 0) {\r
     return FALSE;\r
   }\r
-  \r
+\r
   Dh = (DH *) DhContext;\r
 \r
   RetVal = (BOOLEAN) DH_generate_key (DhContext);\r
   if (RetVal) {\r
   Dh = (DH *) DhContext;\r
 \r
   RetVal = (BOOLEAN) DH_generate_key (DhContext);\r
   if (RetVal) {\r
-    Size = BN_num_bytes (Dh->pub_key);\r
+    DH_get0_key (Dh, (const BIGNUM **)&DhPubKey, NULL);\r
+    Size = BN_num_bytes (DhPubKey);\r
     if ((Size > 0) && (*PublicKeySize < (UINTN) Size)) {\r
       *PublicKeySize = Size;\r
       return FALSE;\r
     }\r
     if ((Size > 0) && (*PublicKeySize < (UINTN) Size)) {\r
       *PublicKeySize = Size;\r
       return FALSE;\r
     }\r
-    \r
-    BN_bn2bin (Dh->pub_key, PublicKey);\r
+\r
+    if (PublicKey != NULL) {\r
+      BN_bn2bin (DhPubKey, PublicKey);\r
+    }\r
     *PublicKeySize = Size;\r
   }\r
 \r
     *PublicKeySize = Size;\r
   }\r
 \r