]> git.proxmox.com Git - libtpms.git/blobdiff - src/tpm2/crypto/openssl/CryptRsa.c
tpm2: Only call EVP_PKEY_CTX_set0_rsa_oaep_label when label != NULL (OSSL 3)
[libtpms.git] / src / tpm2 / crypto / openssl / CryptRsa.c
index 51726ceb0e19ff94fc0407fd8d73d50cdc37870f..4ed04384feb0f69c0d9affec47266946a0dc4336 100644 (file)
@@ -3,7 +3,7 @@
 /*             Implementation of cryptographic primitives for RSA              */
 /*                          Written by Ken Goldman                             */
 /*                    IBM Thomas J. Watson Research Center                     */
-/*            $Id: CryptRsa.c 1594 2020-03-26 22:15:48Z kgoldman $             */
+/*            $Id: CryptRsa.c 1658 2021-01-22 23:14:01Z kgoldman $             */
 /*                                                                             */
 /*  Licenses and Notices                                                       */
 /*                                                                             */
@@ -55,7 +55,7 @@
 /*    arising in any way out of use or reliance upon this specification or any         */
 /*    information herein.                                                      */
 /*                                                                             */
-/*  (c) Copyright IBM Corp. and others, 2016 - 2020                            */
+/*  (c) Copyright IBM Corp. and others, 2016 - 2021                            */
 /*                                                                             */
 /********************************************************************************/
 
@@ -482,7 +482,7 @@ RSAES_Decode(
     // Make sure that pSize has not gone over the end and that there are at least 8
     // bytes of pad data.
     fail = (pSize > coded->size) | fail;
-    fail = ((pSize - 2) < 8) | fail;
+    fail = ((pSize - 2) <= 8) | fail;
     if((message->size < (UINT16)(coded->size - pSize)) || fail)
        return TPM_RC_VALUE;
     message->size = coded->size - pSize;
@@ -880,7 +880,7 @@ CryptRsaLoadPrivateExponent(
     TPM_RC          retVal = TPM_RC_SUCCESS;
     if(!rsaKey->attributes.privateExp)
        {
-           TEST(ALG_NULL_VALUE);
+           TEST(TPM_ALG_NULL);
            // Make sure that the bigNum used for the exponent is properly initialized
            RsaInitializeExponent(&rsaKey->privateExponent);
            // Find the second prime by division
@@ -938,7 +938,7 @@ CryptRsaEncrypt(
     TEST(scheme->scheme);
     switch(scheme->scheme)
        {
-         case ALG_NULL_VALUE:  // 'raw' encryption
+         case TPM_ALG_NULL:  // 'raw' encryption
              {
                  INT32            i;
                  INT32            dSize = dIn->size;
@@ -957,10 +957,10 @@ CryptRsaEncrypt(
                  // the modulus. If it is, then RSAEP() will catch it.
              }
              break;
-         case ALG_RSAES_VALUE:
+         case TPM_ALG_RSAES:
            retVal = RSAES_PKCS1v1_5Encode(&cOut->b, dIn, rand);
            break;
-         case ALG_OAEP_VALUE:
+         case TPM_ALG_OAEP:
            retVal = OaepEncode(&cOut->b, scheme->details.oaep.hashAlg, label, dIn,
                                rand);
            break;
@@ -1008,15 +1008,15 @@ CryptRsaDecrypt(
            // Remove padding
            switch(scheme->scheme)
                {
-                 case ALG_NULL_VALUE:
+                 case TPM_ALG_NULL:
                    if(dOut->size < cIn->size)
                        return TPM_RC_VALUE;
                    MemoryCopy2B(dOut, cIn, dOut->size);
                    break;
-                 case ALG_RSAES_VALUE:
+                 case TPM_ALG_RSAES:
                    retVal = RSAES_Decode(dOut, cIn);
                    break;
-                 case ALG_OAEP_VALUE:
+                 case TPM_ALG_OAEP:
                    retVal = OaepDecode(dOut, scheme->details.oaep.hashAlg, label, cIn);
                    break;
                  default:
@@ -1051,14 +1051,14 @@ CryptRsaSign(
     TEST(sigOut->sigAlg);
     switch(sigOut->sigAlg)
        {
-         case ALG_NULL_VALUE:
+         case TPM_ALG_NULL:
            sigOut->signature.rsapss.sig.t.size = 0;
            return TPM_RC_SUCCESS;
-         case ALG_RSAPSS_VALUE:
+         case TPM_ALG_RSAPSS:
            retVal = PssEncode(&sigOut->signature.rsapss.sig.b,
                               sigOut->signature.rsapss.hash, &hIn->b, rand);
            break;
-         case ALG_RSASSA_VALUE:
+         case TPM_ALG_RSASSA:
            retVal = RSASSA_Encode(&sigOut->signature.rsassa.sig.b,
                                   sigOut->signature.rsassa.hash, &hIn->b);
            break;
@@ -1092,8 +1092,8 @@ CryptRsaValidateSignature(
     pAssert(key != NULL && sig != NULL && digest != NULL);
     switch(sig->sigAlg)
        {
-         case ALG_RSAPSS_VALUE:
-         case ALG_RSASSA_VALUE:
+         case TPM_ALG_RSAPSS:
+         case TPM_ALG_RSASSA:
            break;
          default:
            return TPM_RC_SCHEME;
@@ -1108,11 +1108,11 @@ CryptRsaValidateSignature(
        {
            switch(sig->sigAlg)
                {
-                 case ALG_RSAPSS_VALUE:
+                 case TPM_ALG_RSAPSS:
                    retVal = PssDecode(sig->signature.any.hashAlg, &digest->b,
                                       &sig->signature.rsassa.sig.b);
                    break;
-                 case ALG_RSASSA_VALUE:
+                 case TPM_ALG_RSASSA:
                    retVal = RSASSA_Decode(sig->signature.any.hashAlg, &digest->b,
                                           &sig->signature.rsassa.sig.b);
                    break;
@@ -1182,7 +1182,7 @@ CryptRsaGenerateKey(
        return TPM_RC_SUCCESS;
 #endif
     // Make sure that key generation has been tested
-    TEST(ALG_NULL_VALUE);
+    TEST(TPM_ALG_NULL);
 #if USE_OPENSSL_FUNCTIONS_RSA          // libtpms added begin
     if (rand == NULL)
         return OpenSSLCryptRsaGenerateKey(rsaKey, e, keySizeInBits);
@@ -1313,7 +1313,7 @@ CryptRsaEncrypt(
 
     switch(scheme->scheme)
        {
-          case ALG_NULL_VALUE:  // 'raw' encryption
+          case TPM_ALG_NULL:  // 'raw' encryption
            {
                INT32                 i;
                INT32                 dSize = dIn->size;
@@ -1336,11 +1336,11 @@ CryptRsaEncrypt(
             if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_NO_PADDING) <= 0)
                 ERROR_RETURN(TPM_RC_FAILURE);
             break;
-          case ALG_RSAES_VALUE:
+          case TPM_ALG_RSAES:
             if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) <= 0)
                 ERROR_RETURN(TPM_RC_FAILURE);
             break;
-          case ALG_OAEP_VALUE:
+          case TPM_ALG_OAEP:
             digestname = GetDigestNameByHashAlg(scheme->details.oaep.hashAlg);
             if (digestname == NULL)
                 ERROR_RETURN(TPM_RC_VALUE);
@@ -1419,15 +1419,15 @@ CryptRsaDecrypt(
 
     switch(scheme->scheme)
        {
-         case ALG_NULL_VALUE:  // 'raw' encryption
+         case TPM_ALG_NULL:  // 'raw' encryption
             if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_NO_PADDING) <= 0)
                 ERROR_RETURN(TPM_RC_FAILURE);
             break;
-         case ALG_RSAES_VALUE:
+         case TPM_ALG_RSAES:
             if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) <= 0)
                 ERROR_RETURN(TPM_RC_FAILURE);
             break;
-         case ALG_OAEP_VALUE:
+         case TPM_ALG_OAEP:
             digestname = GetDigestNameByHashAlg(scheme->details.oaep.hashAlg);
             if (digestname == NULL)
                 ERROR_RETURN(TPM_RC_VALUE);
@@ -1443,11 +1443,11 @@ CryptRsaDecrypt(
                 if (tmp == NULL)
                     ERROR_RETURN(TPM_RC_FAILURE);
                 memcpy(tmp, label->buffer, label->size);
-            }
 
-            if (EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, tmp, label->size) <= 0)
-                ERROR_RETURN(TPM_RC_FAILURE);
-            tmp = NULL;
+                if (EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, tmp, label->size) <= 0)
+                    ERROR_RETURN(TPM_RC_FAILURE);
+                tmp = NULL;
+            }
             break;
          default:
             ERROR_RETURN(TPM_RC_SCHEME);
@@ -1504,14 +1504,14 @@ CryptRsaSign(
 
     switch(sigOut->sigAlg)
          {
-          case ALG_NULL_VALUE:
+          case TPM_ALG_NULL:
             sigOut->signature.rsapss.sig.t.size = 0;
             return TPM_RC_SUCCESS;
-          case ALG_RSAPSS_VALUE:
+          case TPM_ALG_RSAPSS:
             padding = RSA_PKCS1_PSS_PADDING;
             hashAlg = sigOut->signature.rsapss.hash;
             break;
-          case ALG_RSASSA_VALUE:
+          case TPM_ALG_RSASSA:
             padding = RSA_PKCS1_PADDING;
             hashAlg = sigOut->signature.rsassa.hash;
             break;
@@ -1584,10 +1584,10 @@ CryptRsaValidateSignature(
     pAssert(key != NULL && sig != NULL && digest != NULL);
     switch(sig->sigAlg)
        {
-         case ALG_RSAPSS_VALUE:
+         case TPM_ALG_RSAPSS:
            padding = RSA_PKCS1_PSS_PADDING;
            break;
-         case ALG_RSASSA_VALUE:
+         case TPM_ALG_RSASSA:
            padding = RSA_PKCS1_PADDING;
            break;
          default: