Blob Blame History Raw
diff -up ./lib/softoken/pkcs11u.c.pkcs12_indicator ./lib/softoken/pkcs11u.c
--- ./lib/softoken/pkcs11u.c.pkcs12_indicator	2023-08-03 10:50:37.067109367 -0700
+++ ./lib/softoken/pkcs11u.c	2023-08-03 11:41:55.641541953 -0700
@@ -2429,7 +2429,7 @@ sftk_handleSpecial(SFTKSlot *slot, CK_ME
             return PR_FALSE;
         case SFTKFIPSECC:
             /* we've already handled the curve selection in the 'getlength'
-          * function */
+             * function */
             return PR_TRUE;
         case SFTKFIPSAEAD: {
             if (mech->ulParameterLen == 0) {
@@ -2463,6 +2463,29 @@ sftk_handleSpecial(SFTKSlot *slot, CK_ME
             }
             return PR_TRUE;
         }
+        case SFTKFIPSPBKDF2: {
+            /* PBKDF2 must have the following addition restrictions
+             * (independent of keysize).
+             *    1. iteration count must be at least 1000.
+             *    2. salt must be at least 128 bits (16 bytes).
+             *    3. password must match the length specified in the SP
+             */
+             CK_PKCS5_PBKD2_PARAMS *pbkdf2 = (CK_PKCS5_PBKD2_PARAMS *)
+                                                    mech->pParameter;
+             if (mech->ulParameterLen != sizeof(*pbkdf2)) {
+                 return PR_FALSE;
+             }
+             if (pbkdf2->iterations < 1000) {
+                 return PR_FALSE;
+             }
+             if (pbkdf2->ulSaltSourceDataLen < 16) {
+                 return PR_FALSE;
+             }
+             if (*(pbkdf2->ulPasswordLen) < SFTKFIPS_PBKDF2_MIN_PW_LEN) {
+                 return PR_FALSE;
+             }
+             return PR_TRUE;
+        }
         default:
             break;
     }