@@ -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
44234475CK_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)
0 commit comments