@@ -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,87 @@ 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_FUNCTION_LIST_3_2 * funcListExt = (CK_FUNCTION_LIST_3_2 * )funcList ;
6653+ CK_MECHANISM mech ;
6654+ CK_OBJECT_CLASS secClass = CKO_SECRET_KEY ;
6655+ CK_BBOOL extr = CK_TRUE ;
6656+ CK_ATTRIBUTE secretTmpl [] = {
6657+ { CKA_CLASS , & secClass , sizeof (secClass ) },
6658+ { CKA_KEY_TYPE , & genericKeyType , sizeof (genericKeyType ) },
6659+ { CKA_EXTRACTABLE , & extr , sizeof (extr ) },
6660+ };
6661+ CK_ULONG secretTmplCnt = sizeof (secretTmpl ) / sizeof (* secretTmpl );
6662+ CK_OBJECT_HANDLE encapKey = CK_INVALID_HANDLE ;
6663+ CK_OBJECT_HANDLE decapKey = CK_INVALID_HANDLE ;
6664+ CK_BYTE * ciphertext = NULL ;
6665+ CK_ULONG ctLen = 0 ;
6666+ CK_BYTE ss1 [64 ];
6667+ CK_BYTE ss2 [64 ];
6668+ CK_ULONG ss1Len = sizeof (ss1 );
6669+ CK_ULONG ss2Len = sizeof (ss2 );
6670+ CK_ATTRIBUTE getValueTmpl [] = { { CKA_VALUE , NULL , 0 } };
6671+
6672+ mech .mechanism = CKM_ML_KEM ;
6673+ mech .pParameter = NULL ;
6674+ mech .ulParameterLen = 0 ;
6675+
6676+ ret = funcListExt -> C_EncapsulateKey (session , & mech , pubKey , secretTmpl ,
6677+ secretTmplCnt , NULL , & ctLen , & encapKey );
6678+ CHECK_CKR (ret , "ML-KEM Encapsulate size query" );
6679+
6680+ if (ret == CKR_OK ) {
6681+ ciphertext = (CK_BYTE * )malloc (ctLen );
6682+ if (ciphertext == NULL )
6683+ ret = CKR_HOST_MEMORY ;
6684+ }
6685+ if (ret == CKR_OK ) {
6686+ ret = funcListExt -> C_EncapsulateKey (session , & mech , pubKey , secretTmpl ,
6687+ secretTmplCnt , ciphertext , & ctLen ,
6688+ & encapKey );
6689+ CHECK_CKR (ret , "ML-KEM Encapsulate" );
6690+ }
6691+ if (ret == CKR_OK ) {
6692+ ret = funcListExt -> C_DecapsulateKey (session , & mech , privKey , secretTmpl ,
6693+ secretTmplCnt , ciphertext , ctLen ,
6694+ & decapKey );
6695+ CHECK_CKR (ret , "ML-KEM Decapsulate" );
6696+ }
6697+ if (ret == CKR_OK ) {
6698+ getValueTmpl [0 ].pValue = ss1 ;
6699+ getValueTmpl [0 ].ulValueLen = ss1Len ;
6700+ ret = funcList -> C_GetAttributeValue (session , encapKey , getValueTmpl , 1 );
6701+ CHECK_CKR (ret , "ML-KEM Get encap shared secret" );
6702+ if (ret == CKR_OK )
6703+ ss1Len = getValueTmpl [0 ].ulValueLen ;
6704+ }
6705+ if (ret == CKR_OK ) {
6706+ getValueTmpl [0 ].pValue = ss2 ;
6707+ getValueTmpl [0 ].ulValueLen = ss2Len ;
6708+ ret = funcList -> C_GetAttributeValue (session , decapKey , getValueTmpl , 1 );
6709+ CHECK_CKR (ret , "ML-KEM Get decap shared secret" );
6710+ if (ret == CKR_OK )
6711+ ss2Len = getValueTmpl [0 ].ulValueLen ;
6712+ }
6713+ if (ret == CKR_OK ) {
6714+ CHECK_COND (ss1Len == ss2Len && XMEMCMP (ss1 , ss2 , ss1Len ) == 0 ,
6715+ ret , "ML-KEM Shared secrets match" );
6716+ }
6717+
6718+ if (ciphertext != NULL )
6719+ free (ciphertext );
6720+ if (encapKey != CK_INVALID_HANDLE )
6721+ funcList -> C_DestroyObject (session , encapKey );
6722+ if (decapKey != CK_INVALID_HANDLE )
6723+ funcList -> C_DestroyObject (session , decapKey );
6724+
6725+ return ret ;
6726+ }
6727+
66476728static CK_RV test_mlkem_gen_keys (void * args )
66486729{
66496730 CK_SESSION_HANDLE session = * (CK_SESSION_HANDLE * )args ;
@@ -6653,9 +6734,11 @@ static CK_RV test_mlkem_gen_keys(void* args)
66536734 unsigned char * privId = (unsigned char * )"123mlkemmttpriv" ;
66546735 int privIdLen = (int )strlen ((char * )privId );
66556736
6656- /* Generate key pair */
6737+ /* Generate key pair and exercise encap/decap */
66576738 ret = gen_mlkem_keys (session , CKP_ML_KEM_512 , & pub , & priv , NULL , 0 ,
66586739 NULL , 0 , 0 );
6740+ if (ret == CKR_OK )
6741+ ret = mlkem_encap_decap (session , pub , priv );
66596742
66606743 funcList -> C_DestroyObject (session , pub );
66616744 funcList -> C_DestroyObject (session , priv );
0 commit comments