From 35ac889e310dd68b0069b1085e9070c45878918e Mon Sep 17 00:00:00 2001 From: Martin Paljak Date: Fri, 8 Feb 2019 11:41:41 +0200 Subject: [PATCH 1/3] Add wrap support with CKM_AES_CBC --- src/lib/SoftHSM.cpp | 63 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/src/lib/SoftHSM.cpp b/src/lib/SoftHSM.cpp index b9b8234b4..1a6aeade7 100644 --- a/src/lib/SoftHSM.cpp +++ b/src/lib/SoftHSM.cpp @@ -1045,8 +1045,9 @@ CK_RV SoftHSM::C_GetMechanismInfo(CK_SLOT_ID slotID, CK_MECHANISM_TYPE type, CK_ pInfo->ulMaxKeySize = 32; pInfo->flags = CKF_GENERATE; break; - case CKM_AES_ECB: case CKM_AES_CBC: + pInfo->flags = CKF_WRAP; + case CKM_AES_ECB: case CKM_AES_CBC_PAD: case CKM_AES_CTR: #ifdef WITH_AES_GCM @@ -1054,7 +1055,7 @@ CK_RV SoftHSM::C_GetMechanismInfo(CK_SLOT_ID slotID, CK_MECHANISM_TYPE type, CK_ #endif pInfo->ulMinKeySize = 16; pInfo->ulMaxKeySize = 32; - pInfo->flags = CKF_ENCRYPT | CKF_DECRYPT; + pInfo->flags |= CKF_ENCRYPT | CKF_DECRYPT; break; case CKM_AES_KEY_WRAP: pInfo->ulMinKeySize = 16; @@ -5998,6 +5999,9 @@ CK_RV SoftHSM::WrapKeySym mode = SymWrap::AES_KEYWRAP_PAD; break; #endif + case CKM_AES_CBC: + algo = SymAlgo::AES; + break; default: return CKR_MECHANISM_INVALID; } @@ -6016,12 +6020,43 @@ CK_RV SoftHSM::WrapKeySym // adjust key bit length wrappingkey->setBitLen(wrappingkey->getKeyBits().size() * bb); - // Wrap the key - if (!cipher->wrapKey(wrappingkey, mode, keydata, wrapped)) - { - cipher->recycleKey(wrappingkey); - CryptoFactory::i()->recycleSymmetricAlgorithm(cipher); - return CKR_GENERAL_ERROR; + ByteString iv; + ByteString encryptedFinal; + + switch(pMechanism->mechanism) { + case CKM_AES_CBC: + iv.resize(16); + memcpy(&iv[0], pMechanism->pParameter, 16); + if (!cipher->encryptInit(wrappingkey, SymMode::CBC, iv, false)) + { + cipher->recycleKey(wrappingkey); + CryptoFactory::i()->recycleSymmetricAlgorithm(cipher); + return CKR_MECHANISM_INVALID; + } + if (!cipher->encryptUpdate(keydata, wrapped)) + { + cipher->recycleKey(wrappingkey); + CryptoFactory::i()->recycleSymmetricAlgorithm(cipher); + return CKR_GENERAL_ERROR; + } + // Finalize encryption + + if (!cipher->encryptFinal(encryptedFinal)) + { + cipher->recycleKey(wrappingkey); + CryptoFactory::i()->recycleSymmetricAlgorithm(cipher); + return CKR_GENERAL_ERROR; + } + wrapped += encryptedFinal; + break; + default: + // Wrap the key + if (!cipher->wrapKey(wrappingkey, mode, keydata, wrapped)) + { + cipher->recycleKey(wrappingkey); + CryptoFactory::i()->recycleSymmetricAlgorithm(cipher); + return CKR_GENERAL_ERROR; + } } cipher->recycleKey(wrappingkey); @@ -6159,7 +6194,11 @@ CK_RV SoftHSM::C_WrapKey if (rv != CKR_OK) return rv; break; - + case CKM_AES_CBC: + if (pMechanism->pParameter == NULL_PTR || + pMechanism->ulParameterLen != 16) + return CKR_ARGUMENTS_BAD; + break; default: return CKR_MECHANISM_INVALID; } @@ -6196,13 +6235,15 @@ CK_RV SoftHSM::C_WrapKey return CKR_WRAPPING_KEY_TYPE_INCONSISTENT; if ((pMechanism->mechanism == CKM_RSA_PKCS || pMechanism->mechanism == CKM_RSA_PKCS_OAEP) && wrapKey->getUnsignedLongValue(CKA_KEY_TYPE, CKK_VENDOR_DEFINED) != CKK_RSA) return CKR_WRAPPING_KEY_TYPE_INCONSISTENT; + if (pMechanism->mechanism == CKM_AES_CBC && wrapKey->getUnsignedLongValue(CKA_KEY_TYPE, CKK_VENDOR_DEFINED) != CKK_AES) + return CKR_WRAPPING_KEY_TYPE_INCONSISTENT; // Check if the wrapping key can be used for wrapping if (wrapKey->getBooleanValue(CKA_WRAP, false) == false) return CKR_KEY_FUNCTION_NOT_PERMITTED; - // Check if the specified mechanism is allowed for the wrapping key - if (!isMechanismPermitted(wrapKey, pMechanism)) + // Check if the specified mechanism is allowed for the wrapping key + if (!isMechanismPermitted(wrapKey, pMechanism)) return CKR_MECHANISM_INVALID; // Check the to be wrapped key handle. From 823dd59ccfdbf0f73152d69559d758c42a76abb3 Mon Sep 17 00:00:00 2001 From: Martin Paljak Date: Wed, 13 Feb 2019 07:50:07 +0200 Subject: [PATCH 2/3] Add CKM_DES3_CBC wrapping support --- src/lib/SoftHSM.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/lib/SoftHSM.cpp b/src/lib/SoftHSM.cpp index 1a6aeade7..0228065b1 100644 --- a/src/lib/SoftHSM.cpp +++ b/src/lib/SoftHSM.cpp @@ -1026,13 +1026,14 @@ CK_RV SoftHSM::C_GetMechanismInfo(CK_SLOT_ID slotID, CK_MECHANISM_TYPE type, CK_ case CKM_DES_CBC: case CKM_DES_CBC_PAD: #endif - case CKM_DES3_ECB: case CKM_DES3_CBC: + pInfo->flags = CKF_WRAP; + case CKM_DES3_ECB: case CKM_DES3_CBC_PAD: // Key size is not in use pInfo->ulMinKeySize = 0; pInfo->ulMaxKeySize = 0; - pInfo->flags = CKF_ENCRYPT | CKF_DECRYPT; + pInfo->flags |= CKF_ENCRYPT | CKF_DECRYPT; break; case CKM_DES3_CMAC: // Key size is not in use @@ -6002,6 +6003,9 @@ CK_RV SoftHSM::WrapKeySym case CKM_AES_CBC: algo = SymAlgo::AES; break; + case CKM_DES3_CBC: + algo = SymAlgo::DES3; + break; default: return CKR_MECHANISM_INVALID; } @@ -6023,10 +6027,17 @@ CK_RV SoftHSM::WrapKeySym ByteString iv; ByteString encryptedFinal; + if (pMechanism->mechanism == CKM_AES_CBC) { + iv.resize(16); + memcpy(&iv[0], pMechanism->pParameter, 16); + } else if (pMechanism->mechanism == CKM_DES3_CBC){ + iv.resize(8); + memcpy(&iv[0], pMechanism->pParameter, 8); + } switch(pMechanism->mechanism) { + case CKM_AES_CBC: - iv.resize(16); - memcpy(&iv[0], pMechanism->pParameter, 16); + case CKM_DES3_CBC: if (!cipher->encryptInit(wrappingkey, SymMode::CBC, iv, false)) { cipher->recycleKey(wrappingkey); @@ -6040,7 +6051,6 @@ CK_RV SoftHSM::WrapKeySym return CKR_GENERAL_ERROR; } // Finalize encryption - if (!cipher->encryptFinal(encryptedFinal)) { cipher->recycleKey(wrappingkey); @@ -6237,6 +6247,9 @@ CK_RV SoftHSM::C_WrapKey return CKR_WRAPPING_KEY_TYPE_INCONSISTENT; if (pMechanism->mechanism == CKM_AES_CBC && wrapKey->getUnsignedLongValue(CKA_KEY_TYPE, CKK_VENDOR_DEFINED) != CKK_AES) return CKR_WRAPPING_KEY_TYPE_INCONSISTENT; + if (pMechanism->mechanism == CKM_DES3_CBC && (wrapKey->getUnsignedLongValue(CKA_KEY_TYPE, CKK_VENDOR_DEFINED) != CKK_DES2 || + wrapKey->getUnsignedLongValue(CKA_KEY_TYPE, CKK_VENDOR_DEFINED) != CKK_DES3)) + return CKR_WRAPPING_KEY_TYPE_INCONSISTENT; // Check if the wrapping key can be used for wrapping if (wrapKey->getBooleanValue(CKA_WRAP, false) == false) From eec37b94358e9e5df0772c8d6aa318f6eb691b26 Mon Sep 17 00:00:00 2001 From: Martin Paljak Date: Wed, 13 Feb 2019 11:37:52 +0200 Subject: [PATCH 3/3] Make autogen.sh executable --- autogen.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 autogen.sh diff --git a/autogen.sh b/autogen.sh old mode 100644 new mode 100755