Blame SOURCES/nss-softokn-3.16-add_encrypt_derive.patch

dbb9a2
diff -up nss/lib/softoken/pkcs11.c.add_encrypt_derive nss/lib/softoken/pkcs11.c
dbb9a2
--- nss/lib/softoken/pkcs11.c.add_encrypt_derive	2018-02-27 15:47:47.000000000 +0100
dbb9a2
+++ nss/lib/softoken/pkcs11.c	2018-03-01 16:01:05.853165433 +0100
dbb9a2
@@ -426,6 +426,8 @@ static const struct mechanismList mechan
dbb9a2
     { CKM_CONCATENATE_DATA_AND_BASE, { 1, 32, CKF_DERIVE }, PR_FALSE },
dbb9a2
     { CKM_XOR_BASE_AND_DATA, { 1, 32, CKF_DERIVE }, PR_FALSE },
dbb9a2
     { CKM_EXTRACT_KEY_FROM_KEY, { 1, 32, CKF_DERIVE }, PR_FALSE },
dbb9a2
+    { CKM_DES_ECB_ENCRYPT_DATA, { 1, 32, CKF_DERIVE }, PR_FALSE },
dbb9a2
+    { CKM_DES_CBC_ENCRYPT_DATA, { 1, 32, CKF_DERIVE }, PR_FALSE },
dbb9a2
     { CKM_DES3_ECB_ENCRYPT_DATA, { 1, 32, CKF_DERIVE }, PR_FALSE },
dbb9a2
     { CKM_DES3_CBC_ENCRYPT_DATA, { 1, 32, CKF_DERIVE }, PR_FALSE },
dbb9a2
     { CKM_AES_ECB_ENCRYPT_DATA, { 1, 32, CKF_DERIVE }, PR_FALSE },
dbb9a2
diff -up nss/lib/softoken/pkcs11c.c.add_encrypt_derive nss/lib/softoken/pkcs11c.c
dbb9a2
--- nss/lib/softoken/pkcs11c.c.add_encrypt_derive	2018-02-27 15:47:47.000000000 +0100
dbb9a2
+++ nss/lib/softoken/pkcs11c.c	2018-03-01 16:01:18.468880916 +0100
dbb9a2
@@ -6935,6 +6935,43 @@ NSC_DeriveKey(CK_SESSION_HANDLE hSession
dbb9a2
             break;
dbb9a2
         }
dbb9a2
 
dbb9a2
+        case CKM_DES_ECB_ENCRYPT_DATA:
dbb9a2
+        case CKM_DES_CBC_ENCRYPT_DATA: {
dbb9a2
+            void *cipherInfo;
dbb9a2
+            CK_DES_CBC_ENCRYPT_DATA_PARAMS *desEncryptPtr;
dbb9a2
+            int mode;
dbb9a2
+            unsigned char *iv;
dbb9a2
+            unsigned char *data;
dbb9a2
+            CK_ULONG len;
dbb9a2
+
dbb9a2
+            if (mechanism == CKM_DES_ECB_ENCRYPT_DATA) {
dbb9a2
+                stringPtr = (CK_KEY_DERIVATION_STRING_DATA *)
dbb9a2
+                                pMechanism->pParameter;
dbb9a2
+                mode = NSS_DES;
dbb9a2
+                iv = NULL;
dbb9a2
+                data = stringPtr->pData;
dbb9a2
+                len = stringPtr->ulLen;
dbb9a2
+            } else {
dbb9a2
+                mode = NSS_DES_CBC;
dbb9a2
+                desEncryptPtr =
dbb9a2
+                    (CK_DES_CBC_ENCRYPT_DATA_PARAMS *)
dbb9a2
+                        pMechanism->pParameter;
dbb9a2
+                iv = desEncryptPtr->iv;
dbb9a2
+                data = desEncryptPtr->pData;
dbb9a2
+                len = desEncryptPtr->length;
dbb9a2
+            }
dbb9a2
+            cipherInfo = DES_CreateContext((unsigned char *)att->attrib.pValue, iv, mode, PR_TRUE);
dbb9a2
+            if (cipherInfo == NULL) {
dbb9a2
+                crv = CKR_HOST_MEMORY;
dbb9a2
+                break;
dbb9a2
+            }
dbb9a2
+            crv = sftk_DeriveEncrypt((SFTKCipher)DES_Encrypt,
dbb9a2
+                                     cipherInfo, 8, key, keySize,
dbb9a2
+                                     data, len);
dbb9a2
+            DES_DestroyContext(cipherInfo, PR_TRUE);
dbb9a2
+            break;
dbb9a2
+        }
dbb9a2
+
dbb9a2
         case CKM_DES3_ECB_ENCRYPT_DATA:
dbb9a2
         case CKM_DES3_CBC_ENCRYPT_DATA: {
dbb9a2
             void *cipherInfo;