6363#include " GOSTPublicKey.h"
6464#include " GOSTPrivateKey.h"
6565#include " MLDSAParameters.h"
66+ #include " MLDSAMechanismParam.h"
6667#include " MLDSAPublicKey.h"
6768#include " MLDSAPrivateKey.h"
6869#include " MLDSAUtil.h"
@@ -4182,6 +4183,7 @@ CK_RV SoftHSM::AsymSignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechan
41824183 AsymMech::Type mechanism = AsymMech::Unknown;
41834184 void * param = NULL ;
41844185 size_t paramLen = 0 ;
4186+ MechanismParam* mechanismParam = NULL ;
41854187 RSA_PKCS_PSS_PARAMS pssParam;
41864188 bool bAllowMultiPartOp;
41874189 bool isRSA = false ;
@@ -4194,7 +4196,7 @@ CK_RV SoftHSM::AsymSignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechan
41944196#endif
41954197#ifdef WITH_ML_DSA
41964198 bool isMLDSA = false ;
4197- SIGN_ADDITIONAL_CONTEXT mldsaParam;
4199+ MLDSAMechanismParam mldsaParam;
41984200#endif
41994201 switch (pMechanism->mechanism ) {
42004202 case CKM_RSA_PKCS:
@@ -4493,12 +4495,13 @@ CK_RV SoftHSM::AsymSignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechan
44934495 ERROR_MSG (" Invalid parameters" );
44944496 return CKR_ARGUMENTS_BAD;
44954497 }
4496- mldsaParam.additionalContext = new ByteString (ckSignAdditionalContext->pContext , ckSignAdditionalContext->ulContextLen );
4497- } else {
4498- mldsaParam.additionalContext = NULL ;
4498+ if (ckSignAdditionalContext->ulContextLen > 255 ) {
4499+ ERROR_MSG (" Invalid parameters" );
4500+ return CKR_ARGUMENTS_BAD;
4501+ }
4502+ mldsaParam.additionalContext = ByteString (ckSignAdditionalContext->pContext , ckSignAdditionalContext->ulContextLen );
44994503 }
4500- param = &mldsaParam;
4501- paramLen = sizeof (mldsaParam);
4504+ mechanismParam = &mldsaParam;
45024505 }
45034506 break ;
45044507#endif
@@ -4651,6 +4654,7 @@ CK_RV SoftHSM::AsymSignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechan
46514654 session->setAsymmetricCryptoOp (asymCrypto);
46524655 session->setMechanism (mechanism);
46534656 session->setParameters (param, paramLen);
4657+ session->setMechanismParam (mechanismParam);
46544658 session->setAllowMultiPartOp (bAllowMultiPartOp);
46554659 session->setAllowSinglePartOp (true );
46564660 session->setPrivateKey (privateKey);
@@ -4732,6 +4736,7 @@ static CK_RV AsymSign(Session* session, CK_BYTE_PTR pData, CK_ULONG ulDataLen, C
47324736 PrivateKey* privateKey = session->getPrivateKey ();
47334737 size_t paramLen;
47344738 void * param = session->getParameters (paramLen);
4739+ MechanismParam* mechanismParam = session->getMechanismParam ();
47354740 if (asymCrypto == NULL || !session->getAllowSinglePartOp () || privateKey == NULL )
47364741 {
47374742 session->resetOp ();
@@ -4781,7 +4786,7 @@ static CK_RV AsymSign(Session* session, CK_BYTE_PTR pData, CK_ULONG ulDataLen, C
47814786 return CKR_GENERAL_ERROR;
47824787 }
47834788 }
4784- else if (!asymCrypto->sign (privateKey,data,signature,mechanism,param,paramLen))
4789+ else if (!asymCrypto->sign (privateKey,data,signature,mechanism,param,paramLen,mechanismParam ))
47854790 {
47864791 session->resetOp ();
47874792 return CKR_GENERAL_ERROR;
@@ -5250,6 +5255,7 @@ CK_RV SoftHSM::AsymVerifyInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMech
52505255 AsymMech::Type mechanism = AsymMech::Unknown;
52515256 void * param = NULL ;
52525257 size_t paramLen = 0 ;
5258+ MechanismParam* mechanismParam = NULL ;
52535259 RSA_PKCS_PSS_PARAMS pssParam;
52545260 bool bAllowMultiPartOp;
52555261 bool isRSA = false ;
@@ -5262,7 +5268,7 @@ CK_RV SoftHSM::AsymVerifyInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMech
52625268#endif
52635269#ifdef WITH_ML_DSA
52645270 bool isMLDSA = false ;
5265- SIGN_ADDITIONAL_CONTEXT mldsaParam;
5271+ MLDSAMechanismParam mldsaParam;
52665272#endif
52675273 switch (pMechanism->mechanism ) {
52685274 case CKM_RSA_PKCS:
@@ -5555,12 +5561,17 @@ CK_RV SoftHSM::AsymVerifyInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMech
55555561 return CKR_ARGUMENTS_BAD;
55565562 }
55575563 if (ckSignAdditionalContext->ulContextLen > 0 ) {
5558- mldsaParam.additionalContext = new ByteString (ckSignAdditionalContext->pContext , ckSignAdditionalContext->ulContextLen );
5559- } else {
5560- mldsaParam.additionalContext = NULL ;
5564+ if (ckSignAdditionalContext->pContext == NULL_PTR) {
5565+ ERROR_MSG (" Invalid parameters" );
5566+ return CKR_ARGUMENTS_BAD;
5567+ }
5568+ if (ckSignAdditionalContext->ulContextLen > 255 ) {
5569+ ERROR_MSG (" Invalid parameters" );
5570+ return CKR_ARGUMENTS_BAD;
5571+ }
5572+ mldsaParam.additionalContext = ByteString (ckSignAdditionalContext->pContext , ckSignAdditionalContext->ulContextLen );
55615573 }
5562- param = &mldsaParam;
5563- paramLen = sizeof (mldsaParam);
5574+ mechanismParam = &mldsaParam;
55645575 }
55655576 break ;
55665577#endif
@@ -5707,6 +5718,7 @@ CK_RV SoftHSM::AsymVerifyInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMech
57075718 session->setAsymmetricCryptoOp (asymCrypto);
57085719 session->setMechanism (mechanism);
57095720 session->setParameters (param, paramLen);
5721+ session->setMechanismParam (mechanismParam);
57105722 session->setAllowMultiPartOp (bAllowMultiPartOp);
57115723 session->setAllowSinglePartOp (true );
57125724 session->setPublicKey (publicKey);
@@ -5776,6 +5788,7 @@ static CK_RV AsymVerify(Session* session, CK_BYTE_PTR pData, CK_ULONG ulDataLen,
57765788 PublicKey* publicKey = session->getPublicKey ();
57775789 size_t paramLen;
57785790 void * param = session->getParameters (paramLen);
5791+ MechanismParam* mechanismParam = session->getMechanismParam ();
57795792 if (asymCrypto == NULL || !session->getAllowSinglePartOp () || publicKey == NULL )
57805793 {
57815794 session->resetOp ();
@@ -5815,7 +5828,7 @@ static CK_RV AsymVerify(Session* session, CK_BYTE_PTR pData, CK_ULONG ulDataLen,
58155828 return CKR_SIGNATURE_INVALID;
58165829 }
58175830 }
5818- else if (!asymCrypto->verify (publicKey,data,signature,mechanism,param,paramLen))
5831+ else if (!asymCrypto->verify (publicKey,data,signature,mechanism,param,paramLen,mechanismParam ))
58195832 {
58205833 session->resetOp ();
58215834 return CKR_SIGNATURE_INVALID;
0 commit comments