@@ -4204,6 +4204,7 @@ CK_RV SoftHSM::AsymSignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechan
42044204#endif
42054205#ifdef WITH_ML_DSA
42064206 bool isMLDSA = false ;
4207+ SIGN_ADDITIONAL_CONTEXT additionalContext;
42074208#endif
42084209 switch (pMechanism->mechanism ) {
42094210 case CKM_RSA_PKCS:
@@ -4476,6 +4477,48 @@ CK_RV SoftHSM::AsymSignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechan
44764477 mechanism = AsymMech::MLDSA;
44774478 bAllowMultiPartOp = false ;
44784479 isMLDSA = true ;
4480+ if (pMechanism->pParameter != NULL_PTR) {
4481+ if (pMechanism->ulParameterLen != sizeof (CK_SIGN_ADDITIONAL_CONTEXT))
4482+ {
4483+ ERROR_MSG (" Invalid parameters" );
4484+ return CKR_ARGUMENTS_BAD;
4485+ }
4486+ else
4487+ {
4488+ const CK_SIGN_ADDITIONAL_CONTEXT* ckSignAdditionalContext = (const CK_SIGN_ADDITIONAL_CONTEXT*) pMechanism->pParameter ;
4489+ if (ckSignAdditionalContext->ulContextLen > 255 )
4490+ {
4491+ ERROR_MSG (" ML-DSA: Invalid parameters, context length > 255" );
4492+ return CKR_ARGUMENTS_BAD;
4493+ }
4494+
4495+ if (ckSignAdditionalContext->ulContextLen > 0 )
4496+ {
4497+ if (ckSignAdditionalContext->pContext == NULL )
4498+ {
4499+ ERROR_MSG (" ML-DSA: Invalid parameters, pContext is NULL" );
4500+ return CKR_ARGUMENTS_BAD;
4501+ }
4502+ additionalContext.contextAsChar = (unsigned char *) ckSignAdditionalContext->pContext ;
4503+ additionalContext.contextLength = ckSignAdditionalContext->ulContextLen ;
4504+ }
4505+ switch (ckSignAdditionalContext->hedgeVariant ) {
4506+ case CKH_HEDGE_REQUIRED:
4507+ additionalContext.hedgeType = Hedge::HEDGE_REQUIRED;
4508+ break ;
4509+ case CKH_DETERMINISTIC_REQUIRED:
4510+ additionalContext.hedgeType = Hedge::DETERMINISTIC_REQUIRED;
4511+ break ;
4512+ case CKH_HEDGE_PREFERRED:
4513+ // Per PKCS11v3.2 section 6.67.5
4514+ // "If no parameter is supplied the hedgeVariant will be CKH_HEDGE_PREFERRED"
4515+ default :
4516+ additionalContext.hedgeType = Hedge::HEDGE_PREFERRED;
4517+ }
4518+ param = &additionalContext;
4519+ paramLen = sizeof (SIGN_ADDITIONAL_CONTEXT);
4520+ }
4521+ }
44794522 break ;
44804523#endif
44814524 default :
@@ -5238,6 +5281,7 @@ CK_RV SoftHSM::AsymVerifyInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMech
52385281#endif
52395282#ifdef WITH_ML_DSA
52405283 bool isMLDSA = false ;
5284+ SIGN_ADDITIONAL_CONTEXT additionalContext;
52415285#endif
52425286 switch (pMechanism->mechanism ) {
52435287 case CKM_RSA_PKCS:
@@ -5508,6 +5552,46 @@ CK_RV SoftHSM::AsymVerifyInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMech
55085552 mechanism = AsymMech::MLDSA;
55095553 bAllowMultiPartOp = false ;
55105554 isMLDSA = true ;
5555+ if (pMechanism->pParameter != NULL_PTR) {
5556+ if (pMechanism->ulParameterLen != sizeof (CK_SIGN_ADDITIONAL_CONTEXT))
5557+ {
5558+ ERROR_MSG (" Invalid parameters" );
5559+ return CKR_ARGUMENTS_BAD;
5560+ }
5561+ else
5562+ {
5563+ const CK_SIGN_ADDITIONAL_CONTEXT* ckSignAdditionalContext = (const CK_SIGN_ADDITIONAL_CONTEXT*) pMechanism->pParameter ;
5564+ if (ckSignAdditionalContext->ulContextLen > 255 ) {
5565+ ERROR_MSG (" ML-DSA: Invalid parameters, context length > 255" );
5566+ return CKR_ARGUMENTS_BAD;
5567+ }
5568+
5569+ if (ckSignAdditionalContext->ulContextLen > 0 ) {
5570+ if (ckSignAdditionalContext->pContext == NULL )
5571+ {
5572+ ERROR_MSG (" ML-DSA: Invalid parameters, pContext is NULL" );
5573+ return CKR_ARGUMENTS_BAD;
5574+ }
5575+ additionalContext.contextAsChar = (unsigned char *) ckSignAdditionalContext->pContext ;
5576+ additionalContext.contextLength = ckSignAdditionalContext->ulContextLen ;
5577+ }
5578+ switch (ckSignAdditionalContext->hedgeVariant ) {
5579+ case CKH_HEDGE_REQUIRED:
5580+ additionalContext.hedgeType = Hedge::HEDGE_REQUIRED;
5581+ break ;
5582+ case CKH_DETERMINISTIC_REQUIRED:
5583+ additionalContext.hedgeType = Hedge::DETERMINISTIC_REQUIRED;
5584+ break ;
5585+ // Per PKCS11v3.2 section 6.67.5
5586+ // "If no parameter is supplied the hedgeVariant will be CKH_HEDGE_PREFERRED"
5587+ case CKH_HEDGE_PREFERRED:
5588+ default :
5589+ additionalContext.hedgeType = Hedge::HEDGE_PREFERRED;
5590+ }
5591+ param = &additionalContext;
5592+ paramLen = sizeof (SIGN_ADDITIONAL_CONTEXT);
5593+ }
5594+ }
55115595 break ;
55125596#endif
55135597 default :
@@ -10283,7 +10367,6 @@ CK_RV SoftHSM::generateMLDSA
1028310367 bOK = bOK && osobject->setAttribute (CKA_NEVER_EXTRACTABLE, bNeverExtractable);
1028410368
1028510369 // MLDSA Private Key Attributes
10286- ByteString parameterSet;
1028710370 ByteString value;
1028810371 ByteString seed;
1028910372 if (isPrivateKeyPrivate)
0 commit comments