|
62 | 62 | #include "DHPrivateKey.h" |
63 | 63 | #include "GOSTPublicKey.h" |
64 | 64 | #include "GOSTPrivateKey.h" |
65 | | -#ifdef WITH_ML_DSA |
66 | 65 | #include "MLDSAParameters.h" |
67 | 66 | #include "MLDSAPublicKey.h" |
68 | 67 | #include "MLDSAPrivateKey.h" |
69 | 68 | #include "MLDSAUtil.h" |
70 | | -#endif |
| 69 | + |
71 | 70 | #include "cryptoki.h" |
72 | 71 | #include "SoftHSM.h" |
73 | 72 | #include "osmutex.h" |
@@ -948,6 +947,7 @@ CK_RV SoftHSM::C_GetMechanismInfo(CK_SLOT_ID slotID, CK_MECHANISM_TYPE type, CK_ |
948 | 947 | unsigned long eddsaMinSize = 0, eddsaMaxSize = 0; |
949 | 948 | #endif |
950 | 949 | #ifdef WITH_ML_DSA |
| 950 | + // ML‑DSA min/max sizes are bytes (PKCS#11 v3.2). |
951 | 951 | unsigned long mldsaMinSize = 0, mldsaMaxSize = 0; |
952 | 952 | #endif |
953 | 953 |
|
@@ -1050,15 +1050,13 @@ CK_RV SoftHSM::C_GetMechanismInfo(CK_SLOT_ID slotID, CK_MECHANISM_TYPE type, CK_ |
1050 | 1050 | #endif |
1051 | 1051 | #ifdef WITH_ML_DSA |
1052 | 1052 | AsymmetricAlgorithm* mldsa = CryptoFactory::i()->getAsymmetricAlgorithm(AsymAlgo::MLDSA); |
1053 | | - if (mldsa != NULL) |
1054 | | - { |
1055 | | - mldsaMinSize = mldsa->getMinKeySize(); |
1056 | | - mldsaMaxSize = mldsa->getMaxKeySize(); |
1057 | | - } |
1058 | | - else |
| 1053 | + if (mldsa == NULL) |
1059 | 1054 | { |
1060 | 1055 | return CKR_GENERAL_ERROR; |
1061 | 1056 | } |
| 1057 | + // ML‑DSA min/max sizes are bytes (PKCS#11 v3.2). |
| 1058 | + mldsaMinSize = mldsa->getMinKeySize(); |
| 1059 | + mldsaMaxSize = mldsa->getMaxKeySize(); |
1062 | 1060 | CryptoFactory::i()->recycleAsymmetricAlgorithm(mldsa); |
1063 | 1061 | #endif |
1064 | 1062 | pInfo->flags = 0; // initialize flags |
@@ -1353,6 +1351,7 @@ CK_RV SoftHSM::C_GetMechanismInfo(CK_SLOT_ID slotID, CK_MECHANISM_TYPE type, CK_ |
1353 | 1351 | #endif |
1354 | 1352 | #ifdef WITH_ML_DSA |
1355 | 1353 | case CKM_ML_DSA_KEY_PAIR_GEN: |
| 1354 | + // ML‑DSA min/max sizes are bytes (PKCS#11 v3.2). |
1356 | 1355 | pInfo->ulMinKeySize = mldsaMinSize; |
1357 | 1356 | pInfo->ulMaxKeySize = mldsaMaxSize; |
1358 | 1357 | pInfo->flags = CKF_GENERATE_KEY_PAIR; |
@@ -4195,7 +4194,9 @@ CK_RV SoftHSM::AsymSignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechan |
4195 | 4194 | #endif |
4196 | 4195 | #ifdef WITH_ML_DSA |
4197 | 4196 | bool isMLDSA = false; |
4198 | | - SIGN_ADDITIONAL_CONTEXT additionalContext = {}; |
| 4197 | + SIGN_ADDITIONAL_CONTEXT mldsaParam; |
| 4198 | + void* additionalContext = NULL; |
| 4199 | + size_t additionalContextLen = 0; |
4199 | 4200 | #endif |
4200 | 4201 | switch(pMechanism->mechanism) { |
4201 | 4202 | case CKM_RSA_PKCS: |
@@ -4468,50 +4469,31 @@ CK_RV SoftHSM::AsymSignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechan |
4468 | 4469 | mechanism = AsymMech::MLDSA; |
4469 | 4470 | bAllowMultiPartOp = false; |
4470 | 4471 | isMLDSA = true; |
4471 | | - if (pMechanism->pParameter != NULL_PTR) { |
4472 | | - if(pMechanism->ulParameterLen != sizeof(CK_SIGN_ADDITIONAL_CONTEXT)) |
| 4472 | + if (pMechanism->pParameter == NULL_PTR) |
| 4473 | + { |
| 4474 | + if (pMechanism->ulParameterLen != 0) |
4473 | 4475 | { |
4474 | 4476 | ERROR_MSG("Invalid parameters"); |
4475 | 4477 | return CKR_ARGUMENTS_BAD; |
4476 | 4478 | } |
4477 | | - else |
| 4479 | + } |
| 4480 | + else |
| 4481 | + { |
| 4482 | + if (pMechanism->ulParameterLen != sizeof(CK_SIGN_ADDITIONAL_CONTEXT)) |
4478 | 4483 | { |
4479 | | - const CK_SIGN_ADDITIONAL_CONTEXT* ckSignAdditionalContext = (const CK_SIGN_ADDITIONAL_CONTEXT*) pMechanism->pParameter; |
4480 | | - if (ckSignAdditionalContext->ulContextLen > 255) |
4481 | | - { |
4482 | | - ERROR_MSG("ML-DSA: Invalid parameters, context length > 255"); |
4483 | | - return CKR_ARGUMENTS_BAD; |
4484 | | - } |
4485 | | - |
4486 | | - // Always initialize context fields |
4487 | | - additionalContext.contextAsChar = NULL; |
4488 | | - additionalContext.contextLength = 0; |
4489 | | - if (ckSignAdditionalContext->ulContextLen > 0) |
4490 | | - { |
4491 | | - if (ckSignAdditionalContext->pContext == NULL) |
4492 | | - { |
4493 | | - ERROR_MSG("ML-DSA: Invalid parameters, pContext is NULL"); |
4494 | | - return CKR_ARGUMENTS_BAD; |
4495 | | - } |
4496 | | - additionalContext.contextAsChar = (unsigned char*) ckSignAdditionalContext->pContext; |
4497 | | - additionalContext.contextLength = ckSignAdditionalContext->ulContextLen; |
4498 | | - } |
4499 | | - switch (ckSignAdditionalContext->hedgeVariant) { |
4500 | | - case CKH_HEDGE_REQUIRED: |
4501 | | - additionalContext.hedgeType = Hedge::HEDGE_REQUIRED; |
4502 | | - break; |
4503 | | - case CKH_DETERMINISTIC_REQUIRED: |
4504 | | - additionalContext.hedgeType = Hedge::DETERMINISTIC_REQUIRED; |
4505 | | - break; |
4506 | | - case CKH_HEDGE_PREFERRED: |
4507 | | - // Per PKCS11v3.2 section 6.67.5 |
4508 | | - // "If no parameter is supplied the hedgeVariant will be CKH_HEDGE_PREFERRED" |
4509 | | - default: |
4510 | | - additionalContext.hedgeType = Hedge::HEDGE_PREFERRED; |
4511 | | - } |
4512 | | - param = &additionalContext; |
4513 | | - paramLen = sizeof(SIGN_ADDITIONAL_CONTEXT); |
| 4484 | + ERROR_MSG("Invalid parameters"); |
| 4485 | + return CKR_ARGUMENTS_BAD; |
4514 | 4486 | } |
| 4487 | + CK_SIGN_ADDITIONAL_CONTEXT* ckSignAdditionalContext = (CK_SIGN_ADDITIONAL_CONTEXT*) pMechanism->pParameter; |
| 4488 | + CK_RV rv = MLDSAUtil::setHedge(ckSignAdditionalContext->hedgeVariant, &mldsaParam); |
| 4489 | + if (rv != CKR_OK) { |
| 4490 | + ERROR_MSG("Invalid parameters"); |
| 4491 | + return CKR_ARGUMENTS_BAD; |
| 4492 | + } |
| 4493 | + additionalContext = ckSignAdditionalContext->pContext; |
| 4494 | + additionalContextLen = ckSignAdditionalContext->ulContextLen; |
| 4495 | + param = &mldsaParam; |
| 4496 | + paramLen = sizeof(mldsaParam); |
4515 | 4497 | } |
4516 | 4498 | break; |
4517 | 4499 | #endif |
@@ -4664,6 +4646,9 @@ CK_RV SoftHSM::AsymSignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechan |
4664 | 4646 | session->setAsymmetricCryptoOp(asymCrypto); |
4665 | 4647 | session->setMechanism(mechanism); |
4666 | 4648 | session->setParameters(param, paramLen); |
| 4649 | +#ifdef WITH_ML_DSA |
| 4650 | + session->setAdditionalContext(additionalContext, additionalContextLen); |
| 4651 | +#endif |
4667 | 4652 | session->setAllowMultiPartOp(bAllowMultiPartOp); |
4668 | 4653 | session->setAllowSinglePartOp(true); |
4669 | 4654 | session->setPrivateKey(privateKey); |
@@ -4745,6 +4730,8 @@ static CK_RV AsymSign(Session* session, CK_BYTE_PTR pData, CK_ULONG ulDataLen, C |
4745 | 4730 | PrivateKey* privateKey = session->getPrivateKey(); |
4746 | 4731 | size_t paramLen; |
4747 | 4732 | void* param = session->getParameters(paramLen); |
| 4733 | + size_t additionalContextLen; |
| 4734 | + void* additionalContext = session->getAdditionalContext(additionalContextLen); |
4748 | 4735 | if (asymCrypto == NULL || !session->getAllowSinglePartOp() || privateKey == NULL) |
4749 | 4736 | { |
4750 | 4737 | session->resetOp(); |
@@ -4794,7 +4781,7 @@ static CK_RV AsymSign(Session* session, CK_BYTE_PTR pData, CK_ULONG ulDataLen, C |
4794 | 4781 | return CKR_GENERAL_ERROR; |
4795 | 4782 | } |
4796 | 4783 | } |
4797 | | - else if (!asymCrypto->sign(privateKey,data,signature,mechanism,param,paramLen)) |
| 4784 | + else if (!asymCrypto->sign(privateKey,data,signature,mechanism,param,paramLen,additionalContext,additionalContextLen)) |
4798 | 4785 | { |
4799 | 4786 | session->resetOp(); |
4800 | 4787 | return CKR_GENERAL_ERROR; |
@@ -5275,7 +5262,9 @@ CK_RV SoftHSM::AsymVerifyInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMech |
5275 | 5262 | #endif |
5276 | 5263 | #ifdef WITH_ML_DSA |
5277 | 5264 | bool isMLDSA = false; |
5278 | | - SIGN_ADDITIONAL_CONTEXT additionalContext = {}; |
| 5265 | + SIGN_ADDITIONAL_CONTEXT mldsaParam; |
| 5266 | + void* additionalContext = NULL; |
| 5267 | + size_t additionalContextLen = 0; |
5279 | 5268 | #endif |
5280 | 5269 | switch(pMechanism->mechanism) { |
5281 | 5270 | case CKM_RSA_PKCS: |
@@ -5546,48 +5535,31 @@ CK_RV SoftHSM::AsymVerifyInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMech |
5546 | 5535 | mechanism = AsymMech::MLDSA; |
5547 | 5536 | bAllowMultiPartOp = false; |
5548 | 5537 | isMLDSA = true; |
5549 | | - if (pMechanism->pParameter != NULL_PTR) { |
5550 | | - if(pMechanism->ulParameterLen != sizeof(CK_SIGN_ADDITIONAL_CONTEXT)) |
| 5538 | + if (pMechanism->pParameter == NULL_PTR) |
| 5539 | + { |
| 5540 | + if (pMechanism->ulParameterLen != 0) |
5551 | 5541 | { |
5552 | 5542 | ERROR_MSG("Invalid parameters"); |
5553 | 5543 | return CKR_ARGUMENTS_BAD; |
5554 | 5544 | } |
5555 | | - else |
| 5545 | + } |
| 5546 | + else |
| 5547 | + { |
| 5548 | + if(pMechanism->ulParameterLen != sizeof(CK_SIGN_ADDITIONAL_CONTEXT)) |
5556 | 5549 | { |
5557 | | - const CK_SIGN_ADDITIONAL_CONTEXT* ckSignAdditionalContext = (const CK_SIGN_ADDITIONAL_CONTEXT*) pMechanism->pParameter; |
5558 | | - if (ckSignAdditionalContext->ulContextLen > 255) { |
5559 | | - ERROR_MSG("ML-DSA: Invalid parameters, context length > 255"); |
5560 | | - return CKR_ARGUMENTS_BAD; |
5561 | | - } |
5562 | | - // Always initialize context fields |
5563 | | - additionalContext.contextAsChar = NULL; |
5564 | | - additionalContext.contextLength = 0; |
5565 | | - if (ckSignAdditionalContext->ulContextLen > 0) { |
5566 | | - if (ckSignAdditionalContext->pContext == NULL) |
5567 | | - { |
5568 | | - ERROR_MSG("ML-DSA: Invalid parameters, pContext is NULL"); |
5569 | | - return CKR_ARGUMENTS_BAD; |
5570 | | - } |
5571 | | - additionalContext.contextAsChar = (unsigned char*) ckSignAdditionalContext->pContext; |
5572 | | - additionalContext.contextLength = ckSignAdditionalContext->ulContextLen; |
5573 | | - } |
5574 | | - |
5575 | | - switch (ckSignAdditionalContext->hedgeVariant) { |
5576 | | - case CKH_HEDGE_REQUIRED: |
5577 | | - additionalContext.hedgeType = Hedge::HEDGE_REQUIRED; |
5578 | | - break; |
5579 | | - case CKH_DETERMINISTIC_REQUIRED: |
5580 | | - additionalContext.hedgeType = Hedge::DETERMINISTIC_REQUIRED; |
5581 | | - break; |
5582 | | - // Per PKCS11v3.2 section 6.67.5 |
5583 | | - // "If no parameter is supplied the hedgeVariant will be CKH_HEDGE_PREFERRED" |
5584 | | - case CKH_HEDGE_PREFERRED: |
5585 | | - default: |
5586 | | - additionalContext.hedgeType = Hedge::HEDGE_PREFERRED; |
5587 | | - } |
5588 | | - param = &additionalContext; |
5589 | | - paramLen = sizeof(SIGN_ADDITIONAL_CONTEXT); |
| 5550 | + ERROR_MSG("Invalid parameters"); |
| 5551 | + return CKR_ARGUMENTS_BAD; |
| 5552 | + } |
| 5553 | + CK_SIGN_ADDITIONAL_CONTEXT* ckSignAdditionalContext = (CK_SIGN_ADDITIONAL_CONTEXT*) pMechanism->pParameter; |
| 5554 | + CK_RV rv = MLDSAUtil::setHedge(ckSignAdditionalContext->hedgeVariant, &mldsaParam); |
| 5555 | + if (rv != CKR_OK) { |
| 5556 | + ERROR_MSG("Invalid parameters"); |
| 5557 | + return CKR_ARGUMENTS_BAD; |
5590 | 5558 | } |
| 5559 | + additionalContext = ckSignAdditionalContext->pContext; |
| 5560 | + additionalContextLen = ckSignAdditionalContext->ulContextLen; |
| 5561 | + param = &mldsaParam; |
| 5562 | + paramLen = sizeof(mldsaParam); |
5591 | 5563 | } |
5592 | 5564 | break; |
5593 | 5565 | #endif |
@@ -5734,6 +5706,9 @@ CK_RV SoftHSM::AsymVerifyInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMech |
5734 | 5706 | session->setAsymmetricCryptoOp(asymCrypto); |
5735 | 5707 | session->setMechanism(mechanism); |
5736 | 5708 | session->setParameters(param, paramLen); |
| 5709 | +#ifdef WITH_ML_DSA |
| 5710 | + session->setAdditionalContext(additionalContext, additionalContextLen); |
| 5711 | +#endif |
5737 | 5712 | session->setAllowMultiPartOp(bAllowMultiPartOp); |
5738 | 5713 | session->setAllowSinglePartOp(true); |
5739 | 5714 | session->setPublicKey(publicKey); |
@@ -5803,6 +5778,8 @@ static CK_RV AsymVerify(Session* session, CK_BYTE_PTR pData, CK_ULONG ulDataLen, |
5803 | 5778 | PublicKey* publicKey = session->getPublicKey(); |
5804 | 5779 | size_t paramLen; |
5805 | 5780 | void* param = session->getParameters(paramLen); |
| 5781 | + size_t additionalContextLen; |
| 5782 | + void* additionalContext = session->getAdditionalContext(additionalContextLen); |
5806 | 5783 | if (asymCrypto == NULL || !session->getAllowSinglePartOp() || publicKey == NULL) |
5807 | 5784 | { |
5808 | 5785 | session->resetOp(); |
@@ -5842,7 +5819,7 @@ static CK_RV AsymVerify(Session* session, CK_BYTE_PTR pData, CK_ULONG ulDataLen, |
5842 | 5819 | return CKR_SIGNATURE_INVALID; |
5843 | 5820 | } |
5844 | 5821 | } |
5845 | | - else if (!asymCrypto->verify(publicKey,data,signature,mechanism,param,paramLen)) |
| 5822 | + else if (!asymCrypto->verify(publicKey,data,signature,mechanism,param,paramLen,additionalContext,additionalContextLen)) |
5846 | 5823 | { |
5847 | 5824 | session->resetOp(); |
5848 | 5825 | return CKR_SIGNATURE_INVALID; |
@@ -7149,7 +7126,7 @@ CK_RV SoftHSM::UnwrapKeySym |
7149 | 7126 | SymWrap::Type mode = SymWrap::Unknown; |
7150 | 7127 | size_t bb = 8; |
7151 | 7128 | size_t blocksize = 0; |
7152 | | - |
| 7129 | + |
7153 | 7130 | switch(pMechanism->mechanism) { |
7154 | 7131 | #ifdef HAVE_AES_KEY_WRAP |
7155 | 7132 | case CKM_AES_KEY_WRAP: |
@@ -7195,14 +7172,14 @@ CK_RV SoftHSM::UnwrapKeySym |
7195 | 7172 | ByteString iv; |
7196 | 7173 | ByteString decryptedFinal; |
7197 | 7174 | CK_RV rv = CKR_OK; |
7198 | | - |
| 7175 | + |
7199 | 7176 | switch(pMechanism->mechanism) { |
7200 | 7177 |
|
7201 | 7178 | case CKM_AES_CBC_PAD: |
7202 | 7179 | case CKM_DES3_CBC_PAD: |
7203 | 7180 | iv.resize(blocksize); |
7204 | 7181 | memcpy(&iv[0], pMechanism->pParameter, blocksize); |
7205 | | - |
| 7182 | + |
7206 | 7183 | if (!cipher->decryptInit(unwrappingkey, SymMode::CBC, iv, false)) |
7207 | 7184 | { |
7208 | 7185 | cipher->recycleKey(unwrappingkey); |
@@ -7231,7 +7208,7 @@ CK_RV SoftHSM::UnwrapKeySym |
7231 | 7208 | return CKR_GENERAL_ERROR; // TODO should be another error |
7232 | 7209 | } |
7233 | 7210 | break; |
7234 | | - |
| 7211 | + |
7235 | 7212 | default: |
7236 | 7213 | // Unwrap the key |
7237 | 7214 | rv = CKR_OK; |
@@ -7522,7 +7499,7 @@ CK_RV SoftHSM::C_UnwrapKey |
7522 | 7499 | pMechanism->ulParameterLen != 8) |
7523 | 7500 | return CKR_ARGUMENTS_BAD; |
7524 | 7501 | break; |
7525 | | - |
| 7502 | + |
7526 | 7503 | default: |
7527 | 7504 | return CKR_MECHANISM_INVALID; |
7528 | 7505 | } |
@@ -7566,7 +7543,7 @@ CK_RV SoftHSM::C_UnwrapKey |
7566 | 7543 | if (pMechanism->mechanism == CKM_DES3_CBC && (unwrapKey->getUnsignedLongValue(CKA_KEY_TYPE, CKK_VENDOR_DEFINED) != CKK_DES2 || |
7567 | 7544 | unwrapKey->getUnsignedLongValue(CKA_KEY_TYPE, CKK_VENDOR_DEFINED) != CKK_DES3)) |
7568 | 7545 | return CKR_WRAPPING_KEY_TYPE_INCONSISTENT; |
7569 | | - |
| 7546 | + |
7570 | 7547 | // Check if the unwrapping key can be used for unwrapping |
7571 | 7548 | if (unwrapKey->getBooleanValue(CKA_UNWRAP, false) == false) |
7572 | 7549 | return CKR_KEY_FUNCTION_NOT_PERMITTED; |
@@ -8377,11 +8354,11 @@ CK_RV SoftHSM::generateAES |
8377 | 8354 | if (rv == CKR_OK) |
8378 | 8355 | { |
8379 | 8356 | OSObject* osobject = (OSObject*)handleManager->getObject(*phKey); |
8380 | | - if (osobject == NULL_PTR || !osobject->isValid()) |
| 8357 | + if (osobject == NULL_PTR || !osobject->isValid()) |
8381 | 8358 | { |
8382 | 8359 | rv = CKR_FUNCTION_FAILED; |
8383 | | - } |
8384 | | - else if (osobject->startTransaction()) |
| 8360 | + } |
| 8361 | + else if (osobject->startTransaction()) |
8385 | 8362 | { |
8386 | 8363 | bool bOK = true; |
8387 | 8364 |
|
@@ -10209,7 +10186,7 @@ CK_RV SoftHSM::generateMLDSA |
10209 | 10186 |
|
10210 | 10187 | // The parameters must be specified to be able to generate a key pair. |
10211 | 10188 | if (paramSet == 0) { |
10212 | | - INFO_MSG("Missing parameter(s) in pPublicKeyTemplate"); |
| 10189 | + INFO_MSG("Missing parameter(s) CKA_PARAMETER_SET in pPublicKeyTemplate"); |
10213 | 10190 | return CKR_TEMPLATE_INCOMPLETE; |
10214 | 10191 | } |
10215 | 10192 |
|
@@ -13150,8 +13127,6 @@ CK_RV SoftHSM::getEDPublicKey(EDPublicKey* publicKey, Token* token, OSObject* ke |
13150 | 13127 | return CKR_OK; |
13151 | 13128 | } |
13152 | 13129 |
|
13153 | | - |
13154 | | - |
13155 | 13130 | CK_RV SoftHSM::getDHPrivateKey(DHPrivateKey* privateKey, Token* token, OSObject* key) |
13156 | 13131 | { |
13157 | 13132 | if (privateKey == NULL) return CKR_ARGUMENTS_BAD; |
|
0 commit comments