Skip to content

Commit 679d063

Browse files
Antoine LochetAntoine Lochet
authored andcommitted
Pulled PR softhsm#583 for more RSA OAEP algorithms support
1 parent 72a069c commit 679d063

File tree

9 files changed

+346
-92
lines changed

9 files changed

+346
-92
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ SoftHSM depends on a cryptographic library, Botan or OpenSSL.
3737
Minimum required versions:
3838

3939
- Botan 2.0.0
40-
- OpenSSL 1.0.0
40+
- OpenSSL 1.0.2
4141

4242
If you are using Botan, use at least version 2.6.0. This will improve
4343
the performance when doing public key operations.

m4/acx_crypto_backend.m4

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,11 @@ AC_DEFUN([ACX_CRYPTO_BACKEND],[
7575
AC_MSG_RESULT(OpenSSL)
7676
7777
if test "x${enable_fips}" = "xyes"; then
78-
ACX_OPENSSL(1,0,1)
78+
# needed for FIPS compliance, so change only when FIPS requirements change
79+
ACX_OPENSSL(1,0,2)
7980
else
80-
ACX_OPENSSL(1,0,0)
81+
# increase this as features from newer versions needed
82+
ACX_OPENSSL(1,0,2)
8183
fi
8284
8385
CRYPTO_INCLUDES=$OPENSSL_INCLUDES

src/lib/SoftHSM.cpp

Lines changed: 156 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2668,6 +2668,7 @@ CK_RV SoftHSM::AsymEncryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMec
26682668

26692669
// Get the asymmetric algorithm matching the mechanism
26702670
AsymMech::Type mechanism;
2671+
unsigned long expectedMgf;
26712672
bool isRSA = false;
26722673
switch(pMechanism->mechanism) {
26732674
case CKM_RSA_PKCS:
@@ -2689,7 +2690,37 @@ CK_RV SoftHSM::AsymEncryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMec
26892690
if (rv != CKR_OK)
26902691
return rv;
26912692

2692-
mechanism = AsymMech::RSA_PKCS_OAEP;
2693+
switch(CK_RSA_PKCS_OAEP_PARAMS_PTR(pMechanism->pParameter)->hashAlg) {
2694+
case CKM_SHA_1:
2695+
mechanism = AsymMech::RSA_PKCS_OAEP_SHA1;
2696+
expectedMgf = CKG_MGF1_SHA1;
2697+
break;
2698+
case CKM_SHA224:
2699+
mechanism = AsymMech::RSA_PKCS_OAEP_SHA224;
2700+
expectedMgf = CKG_MGF1_SHA224;
2701+
break;
2702+
case CKM_SHA256:
2703+
mechanism = AsymMech::RSA_PKCS_OAEP_SHA256;
2704+
expectedMgf = CKG_MGF1_SHA256;
2705+
break;
2706+
case CKM_SHA384:
2707+
mechanism = AsymMech::RSA_PKCS_OAEP_SHA384;
2708+
expectedMgf = CKG_MGF1_SHA384;
2709+
break;
2710+
case CKM_SHA512:
2711+
mechanism = AsymMech::RSA_PKCS_OAEP_SHA512;
2712+
expectedMgf = CKG_MGF1_SHA512;
2713+
break;
2714+
default:
2715+
DEBUG_MSG("hashAlg must be one of: CKM_SHA_1, CKM_SHA224, CKM_SHA256, CKM_SHA384, CKM_SHA512");
2716+
return CKR_ARGUMENTS_BAD;
2717+
}
2718+
2719+
if(CK_RSA_PKCS_OAEP_PARAMS_PTR(pMechanism->pParameter)->mgf != expectedMgf) {
2720+
ERROR_MSG("Hash and MGF don't match");
2721+
return CKR_ARGUMENTS_BAD;
2722+
}
2723+
26932724
isRSA = true;
26942725
break;
26952726
default:
@@ -3455,6 +3486,7 @@ CK_RV SoftHSM::AsymDecryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMec
34553486

34563487
// Get the asymmetric algorithm matching the mechanism
34573488
AsymMech::Type mechanism = AsymMech::Unknown;
3489+
unsigned long expectedMgf;
34583490
bool isRSA = false;
34593491
switch(pMechanism->mechanism) {
34603492
case CKM_RSA_PKCS:
@@ -3478,18 +3510,38 @@ CK_RV SoftHSM::AsymDecryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMec
34783510
DEBUG_MSG("pParameter must be of type CK_RSA_PKCS_OAEP_PARAMS");
34793511
return CKR_ARGUMENTS_BAD;
34803512
}
3481-
if (CK_RSA_PKCS_OAEP_PARAMS_PTR(pMechanism->pParameter)->hashAlg != CKM_SHA_1)
3482-
{
3483-
DEBUG_MSG("hashAlg must be CKM_SHA_1");
3484-
return CKR_ARGUMENTS_BAD;
3513+
3514+
switch(CK_RSA_PKCS_OAEP_PARAMS_PTR(pMechanism->pParameter)->hashAlg) {
3515+
case CKM_SHA_1:
3516+
mechanism = AsymMech::RSA_PKCS_OAEP_SHA1;
3517+
expectedMgf = CKG_MGF1_SHA1;
3518+
break;
3519+
case CKM_SHA224:
3520+
mechanism = AsymMech::RSA_PKCS_OAEP_SHA224;
3521+
expectedMgf = CKG_MGF1_SHA224;
3522+
break;
3523+
case CKM_SHA256:
3524+
mechanism = AsymMech::RSA_PKCS_OAEP_SHA256;
3525+
expectedMgf = CKG_MGF1_SHA256;
3526+
break;
3527+
case CKM_SHA384:
3528+
mechanism = AsymMech::RSA_PKCS_OAEP_SHA384;
3529+
expectedMgf = CKG_MGF1_SHA384;
3530+
break;
3531+
case CKM_SHA512:
3532+
mechanism = AsymMech::RSA_PKCS_OAEP_SHA512;
3533+
expectedMgf = CKG_MGF1_SHA512;
3534+
break;
3535+
default:
3536+
DEBUG_MSG("hashAlg must be one of: CKM_SHA_1, CKM_SHA224, CKM_SHA256, CKM_SHA384, CKM_SHA512");
3537+
return CKR_ARGUMENTS_BAD;
34853538
}
3486-
if (CK_RSA_PKCS_OAEP_PARAMS_PTR(pMechanism->pParameter)->mgf != CKG_MGF1_SHA1)
3487-
{
3488-
DEBUG_MSG("mgf must be CKG_MGF1_SHA1");
3539+
3540+
if (CK_RSA_PKCS_OAEP_PARAMS_PTR(pMechanism->pParameter)->mgf != expectedMgf) {
3541+
ERROR_MSG("Hash and MGF don't match");
34893542
return CKR_ARGUMENTS_BAD;
34903543
}
34913544

3492-
mechanism = AsymMech::RSA_PKCS_OAEP;
34933545
isRSA = true;
34943546
break;
34953547
default:
@@ -4422,7 +4474,7 @@ CK_RV SoftHSM::MacSignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechani
44224474

44234475
CK_RV SoftHSM::GmacSignInit(Token* token, Session* session, CK_MECHANISM_PTR pMechanism, OSObject *key)
44244476
{
4425-
4477+
44264478
// Get key info
44274479
CK_KEY_TYPE keyType = key->getUnsignedLongValue(CKA_KEY_TYPE, CKK_VENDOR_DEFINED);
44284480

@@ -4475,7 +4527,7 @@ CK_RV SoftHSM::GmacSignInit(Token* token, Session* session, CK_MECHANISM_PTR pMe
44754527
CryptoFactory::i()->recycleSymmetricAlgorithm(cipher);
44764528
return CKR_MECHANISM_INVALID;
44774529
}
4478-
4530+
44794531
session->setOpType(SESSION_OP_SIGN);
44804532
session->setSymmetricCryptoOp(cipher);
44814533
session->setAllowMultiPartOp(false);
@@ -4537,7 +4589,7 @@ CK_RV SoftHSM::GmacVerifyInit(Token* token, Session* session, CK_MECHANISM_PTR p
45374589
CryptoFactory::i()->recycleSymmetricAlgorithm(cipher);
45384590
return CKR_MECHANISM_INVALID;
45394591
}
4540-
4592+
45414593
session->setOpType(SESSION_OP_VERIFY);
45424594
session->setSymmetricCryptoOp(cipher);
45434595
session->setAllowMultiPartOp(false);
@@ -5100,7 +5152,7 @@ static CK_RV GmacSign(Session* session, CK_BYTE_PTR pSignature, CK_ULONG_PTR pul
51005152
*pulSignatureLen = maxSize;
51015153
return CKR_BUFFER_TOO_SMALL;
51025154
}
5103-
5155+
51045156
// Finalize encryption
51055157
ByteString encryptedData;
51065158
if (!cipher->encryptFinal(encryptedData))
@@ -5203,7 +5255,7 @@ CK_RV SoftHSM::C_Sign(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ul
52035255
if (mockReturnCode != CKR_OK) {
52045256
return mockErrorCode;
52055257
}
5206-
5258+
52075259
// Get the session
52085260
Session* session = (Session*)handleManager->getSession(hSession);
52095261
if (session == NULL) return CKR_SESSION_HANDLE_INVALID;
@@ -5213,7 +5265,7 @@ CK_RV SoftHSM::C_Sign(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ul
52135265
if (pData == NULL_PTR) return CKR_ARGUMENTS_BAD;
52145266
if (pulSignatureLen == NULL_PTR) return CKR_ARGUMENTS_BAD;
52155267
}
5216-
5268+
52175269
// Check if we are doing the correct operation
52185270
if (session->getOpType() != SESSION_OP_SIGN)
52195271
return CKR_OPERATION_NOT_INITIALIZED;
@@ -6243,7 +6295,7 @@ CK_RV SoftHSM::C_Verify(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG
62436295
return mockErrorCode;
62446296
}
62456297

6246-
6298+
62476299
// Get the session
62486300
Session* session = (Session*)handleManager->getSession(hSession);
62496301
if (session == NULL) return CKR_SESSION_HANDLE_INVALID;
@@ -7083,6 +7135,7 @@ CK_RV SoftHSM::WrapKeyAsym
70837135
const size_t bb = 8;
70847136
AsymAlgo::Type algo = AsymAlgo::Unknown;
70857137
AsymMech::Type mech = AsymMech::Unknown;
7138+
unsigned long expectedMgf;
70867139

70877140
CK_ULONG modulus_length;
70887141
switch(pMechanism->mechanism) {
@@ -7109,11 +7162,51 @@ CK_RV SoftHSM::WrapKeyAsym
71097162
break;
71107163

71117164
case CKM_RSA_PKCS_OAEP:
7112-
mech = AsymMech::RSA_PKCS_OAEP;
7113-
// SHA-1 is the only supported option
7114-
// PKCS#11 2.40 draft 2 section 2.1.8: input length <= k-2-2hashLen
7115-
if (keydata.size() > modulus_length - 2 - 2 * 160 / 8)
7116-
return CKR_KEY_SIZE_RANGE;
7165+
switch(CK_RSA_PKCS_OAEP_PARAMS_PTR(pMechanism->pParameter)->hashAlg) {
7166+
case CKM_SHA_1:
7167+
mech = AsymMech::RSA_PKCS_OAEP_SHA1;
7168+
expectedMgf = CKG_MGF1_SHA1;
7169+
// PKCS#11 2.40 draft 2 section 2.1.8: input length <= k-2-2hashLen
7170+
if (keydata.size() > modulus_length - 2 - 2 * 160 / 8)
7171+
return CKR_KEY_SIZE_RANGE;
7172+
break;
7173+
case CKM_SHA224:
7174+
mech = AsymMech::RSA_PKCS_OAEP_SHA224;
7175+
expectedMgf = CKG_MGF1_SHA224;
7176+
// PKCS#11 2.40 draft 2 section 2.1.8: input length <= k-2-2hashLen
7177+
if (keydata.size() > modulus_length - 2 - 2 * 224 / 8)
7178+
return CKR_KEY_SIZE_RANGE;
7179+
break;
7180+
case CKM_SHA256:
7181+
mech = AsymMech::RSA_PKCS_OAEP_SHA256;
7182+
expectedMgf = CKG_MGF1_SHA256;
7183+
// PKCS#11 2.40 draft 2 section 2.1.8: input length <= k-2-2hashLen
7184+
if (keydata.size() > modulus_length - 2 - 2 * 256 / 8)
7185+
return CKR_KEY_SIZE_RANGE;
7186+
break;
7187+
case CKM_SHA384:
7188+
mech = AsymMech::RSA_PKCS_OAEP_SHA384;
7189+
expectedMgf = CKG_MGF1_SHA384;
7190+
// PKCS#11 2.40 draft 2 section 2.1.8: input length <= k-2-2hashLen
7191+
if (keydata.size() > modulus_length - 2 - 2 * 384 / 8)
7192+
return CKR_KEY_SIZE_RANGE;
7193+
break;
7194+
case CKM_SHA512:
7195+
mech = AsymMech::RSA_PKCS_OAEP_SHA512;
7196+
expectedMgf = CKG_MGF1_SHA512;
7197+
// PKCS#11 2.40 draft 2 section 2.1.8: input length <= k-2-2hashLen
7198+
if (keydata.size() > modulus_length - 2 - 2 * 512 / 8)
7199+
return CKR_KEY_SIZE_RANGE;
7200+
break;
7201+
default:
7202+
return CKR_MECHANISM_INVALID;
7203+
}
7204+
7205+
if(CK_RSA_PKCS_OAEP_PARAMS_PTR(pMechanism->pParameter)->mgf != expectedMgf) {
7206+
ERROR_MSG("Hash and MGF don't match");
7207+
return CKR_ARGUMENTS_BAD;
7208+
}
7209+
71177210
break;
71187211

71197212
default:
@@ -7676,6 +7769,7 @@ CK_RV SoftHSM::UnwrapKeyAsym
76767769
// Get the symmetric algorithm matching the mechanism
76777770
AsymAlgo::Type algo = AsymAlgo::Unknown;
76787771
AsymMech::Type mode = AsymMech::Unknown;
7772+
unsigned long expectedMgf;
76797773
switch(pMechanism->mechanism) {
76807774
case CKM_RSA_PKCS:
76817775
algo = AsymAlgo::RSA;
@@ -7684,7 +7778,35 @@ CK_RV SoftHSM::UnwrapKeyAsym
76847778

76857779
case CKM_RSA_PKCS_OAEP:
76867780
algo = AsymAlgo::RSA;
7687-
mode = AsymMech::RSA_PKCS_OAEP;
7781+
switch(CK_RSA_PKCS_OAEP_PARAMS_PTR(pMechanism->pParameter)->hashAlg) {
7782+
case CKM_SHA_1:
7783+
mode = AsymMech::RSA_PKCS_OAEP_SHA1;
7784+
expectedMgf = CKG_MGF1_SHA1;
7785+
break;
7786+
case CKM_SHA224:
7787+
mode = AsymMech::RSA_PKCS_OAEP_SHA224;
7788+
expectedMgf = CKG_MGF1_SHA224;
7789+
break;
7790+
case CKM_SHA256:
7791+
mode = AsymMech::RSA_PKCS_OAEP_SHA256;
7792+
expectedMgf = CKG_MGF1_SHA256;
7793+
break;
7794+
case CKM_SHA384:
7795+
mode = AsymMech::RSA_PKCS_OAEP_SHA384;
7796+
expectedMgf = CKG_MGF1_SHA384;
7797+
break;
7798+
case CKM_SHA512:
7799+
mode = AsymMech::RSA_PKCS_OAEP_SHA512;
7800+
expectedMgf = CKG_MGF1_SHA512;
7801+
break;
7802+
default:
7803+
return CKR_MECHANISM_INVALID;
7804+
}
7805+
7806+
if (CK_RSA_PKCS_PSS_PARAMS_PTR(pMechanism->pParameter)->mgf != expectedMgf) {
7807+
ERROR_MSG("Hash and MGF don't match");
7808+
return CKR_ARGUMENTS_BAD;
7809+
}
76887810
break;
76897811

76907812
default:
@@ -13992,14 +14114,22 @@ CK_RV SoftHSM::MechParamCheckRSAPKCSOAEP(CK_MECHANISM_PTR pMechanism)
1399214114
}
1399314115

1399414116
CK_RSA_PKCS_OAEP_PARAMS_PTR params = (CK_RSA_PKCS_OAEP_PARAMS_PTR)pMechanism->pParameter;
13995-
if (params->hashAlg != CKM_SHA_1)
14117+
if (params->hashAlg != CKM_SHA_1 &&
14118+
params->hashAlg != CKM_SHA224 &&
14119+
params->hashAlg != CKM_SHA256 &&
14120+
params->hashAlg != CKM_SHA384 &&
14121+
params->hashAlg != CKM_SHA512)
1399614122
{
13997-
ERROR_MSG("hashAlg must be CKM_SHA_1");
14123+
ERROR_MSG("hashAlg must be one of: CKM_SHA_1, CKM_SHA224, CKM_SHA256, CKM_SHA384, CKM_SHA512");
1399814124
return CKR_ARGUMENTS_BAD;
1399914125
}
14000-
if (params->mgf != CKG_MGF1_SHA1)
14126+
if (params->mgf != CKG_MGF1_SHA1 &&
14127+
params->mgf != CKG_MGF1_SHA224 &&
14128+
params->mgf != CKG_MGF1_SHA256 &&
14129+
params->mgf != CKG_MGF1_SHA384 &&
14130+
params->mgf != CKG_MGF1_SHA512)
1400114131
{
14002-
ERROR_MSG("mgf must be CKG_MGF1_SHA1");
14132+
ERROR_MSG("mgf must be onf of: CKG_MGF1_SHA1, CKM_MGF1_SHA224, CKM_MGF1_SHA256, CKM_MGF1_SHA384, CKM_MGF1_SHA512");
1400314133
return CKR_ARGUMENTS_BAD;
1400414134
}
1400514135
if (params->source != CKZ_DATA_SPECIFIED)

src/lib/crypto/AsymmetricAlgorithm.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,11 @@ bool AsymmetricAlgorithm::isWrappingMech(AsymMech::Type padding)
152152
{
153153
case AsymMech::RSA:
154154
case AsymMech::RSA_PKCS:
155-
case AsymMech::RSA_PKCS_OAEP:
155+
case AsymMech::RSA_PKCS_OAEP_SHA1:
156+
case AsymMech::RSA_PKCS_OAEP_SHA224:
157+
case AsymMech::RSA_PKCS_OAEP_SHA256:
158+
case AsymMech::RSA_PKCS_OAEP_SHA384:
159+
case AsymMech::RSA_PKCS_OAEP_SHA512:
156160
return true;
157161

158162
default:

src/lib/crypto/AsymmetricAlgorithm.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,11 @@ struct AsymMech
6565
RSA,
6666
RSA_MD5_PKCS,
6767
RSA_PKCS,
68-
RSA_PKCS_OAEP,
68+
RSA_PKCS_OAEP_SHA1,
69+
RSA_PKCS_OAEP_SHA224,
70+
RSA_PKCS_OAEP_SHA256,
71+
RSA_PKCS_OAEP_SHA384,
72+
RSA_PKCS_OAEP_SHA512,
6973
RSA_SHA1_PKCS,
7074
RSA_SHA224_PKCS,
7175
RSA_SHA256_PKCS,

src/lib/crypto/BotanRSA.cpp

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -761,8 +761,20 @@ bool BotanRSA::encrypt(PublicKey* publicKey, const ByteString& data,
761761
case AsymMech::RSA_PKCS:
762762
eme = "PKCS1v15";
763763
break;
764-
case AsymMech::RSA_PKCS_OAEP:
765-
eme = "EME1(SHA-160)";
764+
case AsymMech::RSA_PKCS_OAEP_SHA1:
765+
eme = "EME1(SHA-1)";
766+
break;
767+
case AsymMech::RSA_PKCS_OAEP_SHA224:
768+
eme = "EME1(SHA-224)";
769+
break;
770+
case AsymMech::RSA_PKCS_OAEP_SHA256:
771+
eme = "EME1(SHA-256)";
772+
break;
773+
case AsymMech::RSA_PKCS_OAEP_SHA384:
774+
eme = "EME1(SHA-384)";
775+
break;
776+
case AsymMech::RSA_PKCS_OAEP_SHA512:
777+
eme = "EME1(SHA-512)";
766778
break;
767779
case AsymMech::RSA:
768780
eme = "Raw";
@@ -855,8 +867,20 @@ bool BotanRSA::decrypt(PrivateKey* privateKey, const ByteString& encryptedData,
855867
case AsymMech::RSA_PKCS:
856868
eme = "PKCS1v15";
857869
break;
858-
case AsymMech::RSA_PKCS_OAEP:
859-
eme = "EME1(SHA-160)";
870+
case AsymMech::RSA_PKCS_OAEP_SHA1:
871+
eme = "EME1(SHA-1)";
872+
break;
873+
case AsymMech::RSA_PKCS_OAEP_SHA224:
874+
eme = "EME1(SHA-224)";
875+
break;
876+
case AsymMech::RSA_PKCS_OAEP_SHA256:
877+
eme = "EME1(SHA-256)";
878+
break;
879+
case AsymMech::RSA_PKCS_OAEP_SHA384:
880+
eme = "EME1(SHA-384)";
881+
break;
882+
case AsymMech::RSA_PKCS_OAEP_SHA512:
883+
eme = "EME1(SHA-512)";
860884
break;
861885
case AsymMech::RSA:
862886
eme = "Raw";

0 commit comments

Comments
 (0)