@@ -2649,7 +2649,7 @@ static CK_RV rsa_pkcs15_sig_test(CK_SESSION_HANDLE session,
26492649 }
26502650 if (ret == CKR_OK ) {
26512651 ret = funcList -> C_VerifyInit (session , & mech , pub );
2652- CHECK_CKR (ret , "RSA PKCS#1.5 Verify Init bad hash" );
2652+ CHECK_CKR (ret , "RSA PKCS#1.5 Verify Init before bad hash" );
26532653 }
26542654 if (ret == CKR_OK ) {
26552655 ret = funcList -> C_Verify (session , badHash , sizeof (badHash ), out , outSz );
@@ -2713,7 +2713,7 @@ static CK_RV rsa_pss_test(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE priv,
27132713 }
27142714 if (ret == CKR_OK ) {
27152715 ret = funcList -> C_VerifyInit (session , & mech , pub );
2716- CHECK_CKR (ret , "RSA PKCS#1 PSS Verify Init bad hash" );
2716+ CHECK_CKR (ret , "RSA PKCS#1 PSS Verify Init before bad hash" );
27172717 }
27182718 if (ret == CKR_OK ) {
27192719 ret = funcList -> C_Verify (session , badHash , hashSz , out , outSz );
@@ -3842,15 +3842,15 @@ static CK_RV ecdsa_test(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE privKey,
38423842 }
38433843 if (ret == CKR_OK ) {
38443844 ret = funcList -> C_VerifyInit (session , & mech , pubKey );
3845- CHECK_CKR (ret , "ECDSA Verify Init bad hash" );
3845+ CHECK_CKR (ret , "ECDSA Verify Init before bad hash" );
38463846 }
38473847 if (ret == CKR_OK ) {
38483848 ret = funcList -> C_Verify (session , hash , hashSz - 1 , out , outSz );
38493849 CHECK_CKR_FAIL (ret , CKR_SIGNATURE_INVALID , "ECDSA Verify bad hash" );
38503850 }
38513851 if (ret == CKR_OK ) {
38523852 ret = funcList -> C_VerifyInit (session , & mech , pubKey );
3853- CHECK_CKR (ret , "ECDSA Verify Init bad sig" );
3853+ CHECK_CKR (ret , "ECDSA Verify Init before bad sig" );
38543854 }
38553855 if (ret == CKR_OK ) {
38563856 outSz = 1 ;
@@ -6644,6 +6644,106 @@ static CK_RV find_mlkem_priv_key(CK_SESSION_HANDLE session,
66446644 return ret ;
66456645}
66466646
6647+ static CK_RV mlkem_encap_decap (CK_SESSION_HANDLE session ,
6648+ CK_OBJECT_HANDLE pubKey ,
6649+ CK_OBJECT_HANDLE privKey )
6650+ {
6651+ CK_RV ret = CKR_OK ;
6652+ CK_INTERFACE * interface = NULL ;
6653+ CK_FUNCTION_LIST_3_2 * funcListExt = NULL ;
6654+ CK_VERSION version = { 3 , 2 };
6655+ CK_MECHANISM mech ;
6656+
6657+ #ifndef HAVE_PKCS11_STATIC
6658+ {
6659+ CK_C_GetInterface getInterface ;
6660+ getInterface = (CK_C_GetInterface )dlsym (dlib , "C_GetInterface" );
6661+ if (getInterface == NULL )
6662+ return CKR_FUNCTION_NOT_SUPPORTED ;
6663+ ret = getInterface ((CK_UTF8CHAR_PTR )"PKCS 11" , & version ,
6664+ & interface , 0 );
6665+ }
6666+ #else
6667+ ret = C_GetInterface ((CK_UTF8CHAR_PTR )"PKCS 11" , & version ,
6668+ & interface , 0 );
6669+ #endif
6670+ CHECK_CKR (ret , "ML-KEM Get v3.2 Interface" );
6671+ if (ret == CKR_OK )
6672+ funcListExt = (CK_FUNCTION_LIST_3_2 * )interface -> pFunctionList ;
6673+ CK_OBJECT_CLASS secClass = CKO_SECRET_KEY ;
6674+ CK_BBOOL extr = CK_TRUE ;
6675+ CK_ATTRIBUTE secretTmpl [] = {
6676+ { CKA_CLASS , & secClass , sizeof (secClass ) },
6677+ { CKA_KEY_TYPE , & genericKeyType , sizeof (genericKeyType ) },
6678+ { CKA_EXTRACTABLE , & extr , sizeof (extr ) },
6679+ };
6680+ CK_ULONG secretTmplCnt = sizeof (secretTmpl ) / sizeof (* secretTmpl );
6681+ CK_OBJECT_HANDLE encapKey = CK_INVALID_HANDLE ;
6682+ CK_OBJECT_HANDLE decapKey = CK_INVALID_HANDLE ;
6683+ CK_BYTE * ciphertext = NULL ;
6684+ CK_ULONG ctLen = 0 ;
6685+ CK_BYTE ss1 [64 ];
6686+ CK_BYTE ss2 [64 ];
6687+ CK_ULONG ss1Len = sizeof (ss1 );
6688+ CK_ULONG ss2Len = sizeof (ss2 );
6689+ CK_ATTRIBUTE getValueTmpl [] = { { CKA_VALUE , NULL , 0 } };
6690+
6691+ mech .mechanism = CKM_ML_KEM ;
6692+ mech .pParameter = NULL ;
6693+ mech .ulParameterLen = 0 ;
6694+
6695+ ret = funcListExt -> C_EncapsulateKey (session , & mech , pubKey , secretTmpl ,
6696+ secretTmplCnt , NULL , & ctLen , & encapKey );
6697+ CHECK_CKR (ret , "ML-KEM Encapsulate size query" );
6698+
6699+ if (ret == CKR_OK ) {
6700+ ciphertext = (CK_BYTE * )malloc (ctLen );
6701+ if (ciphertext == NULL )
6702+ ret = CKR_HOST_MEMORY ;
6703+ }
6704+ if (ret == CKR_OK ) {
6705+ ret = funcListExt -> C_EncapsulateKey (session , & mech , pubKey , secretTmpl ,
6706+ secretTmplCnt , ciphertext , & ctLen ,
6707+ & encapKey );
6708+ CHECK_CKR (ret , "ML-KEM Encapsulate" );
6709+ }
6710+ if (ret == CKR_OK ) {
6711+ ret = funcListExt -> C_DecapsulateKey (session , & mech , privKey , secretTmpl ,
6712+ secretTmplCnt , ciphertext , ctLen ,
6713+ & decapKey );
6714+ CHECK_CKR (ret , "ML-KEM Decapsulate" );
6715+ }
6716+ if (ret == CKR_OK ) {
6717+ getValueTmpl [0 ].pValue = ss1 ;
6718+ getValueTmpl [0 ].ulValueLen = ss1Len ;
6719+ ret = funcList -> C_GetAttributeValue (session , encapKey , getValueTmpl , 1 );
6720+ CHECK_CKR (ret , "ML-KEM Get encap shared secret" );
6721+ if (ret == CKR_OK )
6722+ ss1Len = getValueTmpl [0 ].ulValueLen ;
6723+ }
6724+ if (ret == CKR_OK ) {
6725+ getValueTmpl [0 ].pValue = ss2 ;
6726+ getValueTmpl [0 ].ulValueLen = ss2Len ;
6727+ ret = funcList -> C_GetAttributeValue (session , decapKey , getValueTmpl , 1 );
6728+ CHECK_CKR (ret , "ML-KEM Get decap shared secret" );
6729+ if (ret == CKR_OK )
6730+ ss2Len = getValueTmpl [0 ].ulValueLen ;
6731+ }
6732+ if (ret == CKR_OK ) {
6733+ CHECK_COND (ss1Len == ss2Len && XMEMCMP (ss1 , ss2 , ss1Len ) == 0 ,
6734+ ret , "ML-KEM Shared secrets match" );
6735+ }
6736+
6737+ if (ciphertext != NULL )
6738+ free (ciphertext );
6739+ if (encapKey != CK_INVALID_HANDLE )
6740+ funcList -> C_DestroyObject (session , encapKey );
6741+ if (decapKey != CK_INVALID_HANDLE )
6742+ funcList -> C_DestroyObject (session , decapKey );
6743+
6744+ return ret ;
6745+ }
6746+
66476747static CK_RV test_mlkem_gen_keys (void * args )
66486748{
66496749 CK_SESSION_HANDLE session = * (CK_SESSION_HANDLE * )args ;
@@ -6653,9 +6753,11 @@ static CK_RV test_mlkem_gen_keys(void* args)
66536753 unsigned char * privId = (unsigned char * )"123mlkemmttpriv" ;
66546754 int privIdLen = (int )strlen ((char * )privId );
66556755
6656- /* Generate key pair */
6756+ /* Generate key pair and exercise encap/decap */
66576757 ret = gen_mlkem_keys (session , CKP_ML_KEM_512 , & pub , & priv , NULL , 0 ,
66586758 NULL , 0 , 0 );
6759+ if (ret == CKR_OK )
6760+ ret = mlkem_encap_decap (session , pub , priv );
66596761
66606762 funcList -> C_DestroyObject (session , pub );
66616763 funcList -> C_DestroyObject (session , priv );
0 commit comments