@@ -65,7 +65,8 @@ static int soPinLen = 14;
6565static byte * userPin = (byte * )"wolfpkcs11-test" ;
6666static int userPinLen ;
6767
68- #if !defined(NO_RSA ) || defined(HAVE_ECC ) || !defined(NO_DH )
68+ #if !defined(NO_RSA ) || defined(HAVE_ECC ) || !defined(NO_DH ) || \
69+ defined(WOLFPKCS11_MLDSA ) || defined(WOLFPKCS11_MLKEM )
6970static CK_OBJECT_CLASS pubKeyClass = CKO_PUBLIC_KEY ;
7071#endif
7172static CK_OBJECT_CLASS privKeyClass = CKO_PRIVATE_KEY ;
@@ -89,6 +90,12 @@ static CK_KEY_TYPE dhKeyType = CKK_DH;
8990static CK_KEY_TYPE aesKeyType = CKK_AES ;
9091#endif
9192static CK_KEY_TYPE genericKeyType = CKK_GENERIC_SECRET ;
93+ #ifdef WOLFPKCS11_MLDSA
94+ static CK_KEY_TYPE mldsaKeyType = CKK_ML_DSA ;
95+ #endif
96+ #ifdef WOLFPKCS11_MLKEM
97+ static CK_KEY_TYPE mlkemKeyType = CKK_ML_KEM ;
98+ #endif
9299
93100
94101static CK_RV test_session (void * args )
@@ -6407,6 +6414,269 @@ static CK_RV test_hmac_sha512_fail(void* args)
64076414#endif
64086415#endif
64096416
6417+ #ifdef WOLFPKCS11_MLDSA
6418+ static CK_RV gen_mldsa_keys (CK_SESSION_HANDLE session ,
6419+ CK_ML_DSA_PARAMETER_SET_TYPE paramSet ,
6420+ CK_OBJECT_HANDLE * pubKey ,
6421+ CK_OBJECT_HANDLE * privKey ,
6422+ unsigned char * privId , int privIdLen ,
6423+ unsigned char * pubId , int pubIdLen , int onToken )
6424+ {
6425+ CK_RV ret = CKR_OK ;
6426+ CK_OBJECT_HANDLE pub = CK_INVALID_HANDLE ;
6427+ CK_OBJECT_HANDLE priv = CK_INVALID_HANDLE ;
6428+ CK_MECHANISM mech ;
6429+ CK_BBOOL token = (CK_BBOOL )onToken ;
6430+ CK_ATTRIBUTE pubKeyTmpl [] = {
6431+ { CKA_PARAMETER_SET , & paramSet , sizeof (paramSet ) },
6432+ { CKA_VERIFY , & ckTrue , sizeof (ckTrue ) },
6433+ { CKA_TOKEN , & token , sizeof (token ) },
6434+ { CKA_ID , pubId , pubIdLen },
6435+ };
6436+ int pubTmplCnt = sizeof (pubKeyTmpl ) / sizeof (* pubKeyTmpl );
6437+ CK_ATTRIBUTE privKeyTmpl [] = {
6438+ { CKA_SIGN , & ckTrue , sizeof (ckTrue ) },
6439+ { CKA_TOKEN , & token , sizeof (token ) },
6440+ { CKA_ID , privId , privIdLen },
6441+ };
6442+ int privTmplCnt = sizeof (privKeyTmpl ) / sizeof (* privKeyTmpl );
6443+
6444+ if (pubId == NULL )
6445+ pubTmplCnt -- ;
6446+ if (privId == NULL )
6447+ privTmplCnt -- ;
6448+
6449+ mech .mechanism = CKM_ML_DSA_KEY_PAIR_GEN ;
6450+ mech .pParameter = NULL ;
6451+ mech .ulParameterLen = 0 ;
6452+
6453+ ret = funcList -> C_GenerateKeyPair (session , & mech , pubKeyTmpl , pubTmplCnt ,
6454+ privKeyTmpl , privTmplCnt , & pub , & priv );
6455+ CHECK_CKR (ret , "ML-DSA Key Generation" );
6456+ if (ret == CKR_OK && pubKey != NULL )
6457+ * pubKey = pub ;
6458+ if (ret == CKR_OK && privKey != NULL )
6459+ * privKey = priv ;
6460+
6461+ return ret ;
6462+ }
6463+
6464+ static CK_RV find_mldsa_priv_key (CK_SESSION_HANDLE session ,
6465+ CK_OBJECT_HANDLE * key , unsigned char * id , int idLen )
6466+ {
6467+ CK_RV ret ;
6468+ CK_ATTRIBUTE tmpl [] = {
6469+ { CKA_CLASS , & privKeyClass , sizeof (privKeyClass ) },
6470+ { CKA_KEY_TYPE , & mldsaKeyType , sizeof (mldsaKeyType ) },
6471+ { CKA_ID , id , idLen },
6472+ };
6473+ CK_ULONG count ;
6474+
6475+ ret = funcList -> C_FindObjectsInit (session , tmpl ,
6476+ sizeof (tmpl ) / sizeof (* tmpl ));
6477+ CHECK_CKR (ret , "ML-DSA Find Priv Objects Init" );
6478+ if (ret == CKR_OK ) {
6479+ ret = funcList -> C_FindObjects (session , key , 1 , & count );
6480+ CHECK_CKR (ret , "ML-DSA Find Priv Objects" );
6481+ }
6482+ if (ret == CKR_OK ) {
6483+ ret = funcList -> C_FindObjectsFinal (session );
6484+ CHECK_CKR (ret , "ML-DSA Find Priv Objects Final" );
6485+ }
6486+ if (ret == CKR_OK && count == 0 ) {
6487+ ret = -1 ;
6488+ CHECK_CKR (ret , "ML-DSA Find Priv Objects Count" );
6489+ }
6490+
6491+ return ret ;
6492+ }
6493+
6494+ static CK_RV mldsa_sign_verify (CK_SESSION_HANDLE session ,
6495+ CK_OBJECT_HANDLE privKey , CK_OBJECT_HANDLE pubKey )
6496+ {
6497+ CK_RV ret ;
6498+ CK_MECHANISM mech ;
6499+ CK_SIGN_ADDITIONAL_CONTEXT signCtx ;
6500+ byte data [64 ];
6501+ byte sig [4672 ]; /* ML-DSA-44 max sig size */
6502+ CK_ULONG sigSz ;
6503+
6504+ XMEMSET (data , 0x5A , sizeof (data ));
6505+ XMEMSET (& signCtx , 0 , sizeof (signCtx ));
6506+ signCtx .hedgeVariant = CKH_HEDGE_REQUIRED ;
6507+ signCtx .pContext = NULL ;
6508+ signCtx .ulContextLen = 0 ;
6509+
6510+ mech .mechanism = CKM_ML_DSA ;
6511+ mech .pParameter = & signCtx ;
6512+ mech .ulParameterLen = sizeof (signCtx );
6513+
6514+ ret = funcList -> C_SignInit (session , & mech , privKey );
6515+ CHECK_CKR (ret , "ML-DSA Sign Init" );
6516+ if (ret == CKR_OK ) {
6517+ sigSz = sizeof (sig );
6518+ ret = funcList -> C_Sign (session , data , sizeof (data ), sig , & sigSz );
6519+ CHECK_CKR (ret , "ML-DSA Sign" );
6520+ }
6521+ if (ret == CKR_OK ) {
6522+ ret = funcList -> C_VerifyInit (session , & mech , pubKey );
6523+ CHECK_CKR (ret , "ML-DSA Verify Init" );
6524+ }
6525+ if (ret == CKR_OK ) {
6526+ ret = funcList -> C_Verify (session , data , sizeof (data ), sig , sigSz );
6527+ CHECK_CKR (ret , "ML-DSA Verify" );
6528+ }
6529+
6530+ return ret ;
6531+ }
6532+
6533+ static CK_RV test_mldsa_gen_keys (void * args )
6534+ {
6535+ CK_SESSION_HANDLE session = * (CK_SESSION_HANDLE * )args ;
6536+ CK_RV ret ;
6537+ CK_OBJECT_HANDLE pub = CK_INVALID_HANDLE ;
6538+ CK_OBJECT_HANDLE priv = CK_INVALID_HANDLE ;
6539+ unsigned char * privId = (unsigned char * )"123mldsamttpriv" ;
6540+ int privIdLen = (int )strlen ((char * )privId );
6541+
6542+ /* Generate and sign/verify */
6543+ ret = gen_mldsa_keys (session , CKP_ML_DSA_44 , & pub , & priv , NULL , 0 ,
6544+ NULL , 0 , 0 );
6545+ if (ret == CKR_OK )
6546+ ret = mldsa_sign_verify (session , priv , pub );
6547+
6548+ funcList -> C_DestroyObject (session , pub );
6549+ funcList -> C_DestroyObject (session , priv );
6550+ pub = CK_INVALID_HANDLE ;
6551+ priv = CK_INVALID_HANDLE ;
6552+
6553+ /* Generate with ID and find */
6554+ if (ret == CKR_OK ) {
6555+ ret = gen_mldsa_keys (session , CKP_ML_DSA_44 , & pub , NULL , privId ,
6556+ privIdLen , NULL , 0 , 0 );
6557+ }
6558+ if (ret == CKR_OK )
6559+ ret = find_mldsa_priv_key (session , & priv , privId , privIdLen );
6560+ if (ret == CKR_OK )
6561+ ret = mldsa_sign_verify (session , priv , pub );
6562+
6563+ funcList -> C_DestroyObject (session , pub );
6564+ funcList -> C_DestroyObject (session , priv );
6565+
6566+ return ret ;
6567+ }
6568+ #endif /* WOLFPKCS11_MLDSA */
6569+
6570+ #ifdef WOLFPKCS11_MLKEM
6571+ static CK_RV gen_mlkem_keys (CK_SESSION_HANDLE session ,
6572+ CK_ML_KEM_PARAMETER_SET_TYPE paramSet ,
6573+ CK_OBJECT_HANDLE * pubKey ,
6574+ CK_OBJECT_HANDLE * privKey ,
6575+ unsigned char * privId , int privIdLen ,
6576+ unsigned char * pubId , int pubIdLen , int onToken )
6577+ {
6578+ CK_RV ret = CKR_OK ;
6579+ CK_OBJECT_HANDLE pub = CK_INVALID_HANDLE ;
6580+ CK_OBJECT_HANDLE priv = CK_INVALID_HANDLE ;
6581+ CK_MECHANISM mech ;
6582+ CK_BBOOL token = (CK_BBOOL )onToken ;
6583+ CK_ATTRIBUTE pubKeyTmpl [] = {
6584+ { CKA_PARAMETER_SET , & paramSet , sizeof (paramSet ) },
6585+ { CKA_ENCAPSULATE , & ckTrue , sizeof (ckTrue ) },
6586+ { CKA_TOKEN , & token , sizeof (token ) },
6587+ { CKA_ID , pubId , pubIdLen },
6588+ };
6589+ int pubTmplCnt = sizeof (pubKeyTmpl ) / sizeof (* pubKeyTmpl );
6590+ CK_ATTRIBUTE privKeyTmpl [] = {
6591+ { CKA_DECAPSULATE , & ckTrue , sizeof (ckTrue ) },
6592+ { CKA_TOKEN , & token , sizeof (token ) },
6593+ { CKA_ID , privId , privIdLen },
6594+ };
6595+ int privTmplCnt = sizeof (privKeyTmpl ) / sizeof (* privKeyTmpl );
6596+
6597+ if (pubId == NULL )
6598+ pubTmplCnt -- ;
6599+ if (privId == NULL )
6600+ privTmplCnt -- ;
6601+
6602+ mech .mechanism = CKM_ML_KEM_KEY_PAIR_GEN ;
6603+ mech .pParameter = NULL ;
6604+ mech .ulParameterLen = 0 ;
6605+
6606+ ret = funcList -> C_GenerateKeyPair (session , & mech , pubKeyTmpl , pubTmplCnt ,
6607+ privKeyTmpl , privTmplCnt , & pub , & priv );
6608+ CHECK_CKR (ret , "ML-KEM Key Generation" );
6609+ if (ret == CKR_OK && pubKey != NULL )
6610+ * pubKey = pub ;
6611+ if (ret == CKR_OK && privKey != NULL )
6612+ * privKey = priv ;
6613+
6614+ return ret ;
6615+ }
6616+
6617+ static CK_RV find_mlkem_priv_key (CK_SESSION_HANDLE session ,
6618+ CK_OBJECT_HANDLE * key , unsigned char * id , int idLen )
6619+ {
6620+ CK_RV ret ;
6621+ CK_ATTRIBUTE tmpl [] = {
6622+ { CKA_CLASS , & privKeyClass , sizeof (privKeyClass ) },
6623+ { CKA_KEY_TYPE , & mlkemKeyType , sizeof (mlkemKeyType ) },
6624+ { CKA_ID , id , idLen },
6625+ };
6626+ CK_ULONG count ;
6627+
6628+ ret = funcList -> C_FindObjectsInit (session , tmpl ,
6629+ sizeof (tmpl ) / sizeof (* tmpl ));
6630+ CHECK_CKR (ret , "ML-KEM Find Priv Objects Init" );
6631+ if (ret == CKR_OK ) {
6632+ ret = funcList -> C_FindObjects (session , key , 1 , & count );
6633+ CHECK_CKR (ret , "ML-KEM Find Priv Objects" );
6634+ }
6635+ if (ret == CKR_OK ) {
6636+ ret = funcList -> C_FindObjectsFinal (session );
6637+ CHECK_CKR (ret , "ML-KEM Find Priv Objects Final" );
6638+ }
6639+ if (ret == CKR_OK && count == 0 ) {
6640+ ret = -1 ;
6641+ CHECK_CKR (ret , "ML-KEM Find Priv Objects Count" );
6642+ }
6643+
6644+ return ret ;
6645+ }
6646+
6647+ static CK_RV test_mlkem_gen_keys (void * args )
6648+ {
6649+ CK_SESSION_HANDLE session = * (CK_SESSION_HANDLE * )args ;
6650+ CK_RV ret ;
6651+ CK_OBJECT_HANDLE pub = CK_INVALID_HANDLE ;
6652+ CK_OBJECT_HANDLE priv = CK_INVALID_HANDLE ;
6653+ unsigned char * privId = (unsigned char * )"123mlkemmttpriv" ;
6654+ int privIdLen = (int )strlen ((char * )privId );
6655+
6656+ /* Generate key pair */
6657+ ret = gen_mlkem_keys (session , CKP_ML_KEM_512 , & pub , & priv , NULL , 0 ,
6658+ NULL , 0 , 0 );
6659+
6660+ funcList -> C_DestroyObject (session , pub );
6661+ funcList -> C_DestroyObject (session , priv );
6662+ pub = CK_INVALID_HANDLE ;
6663+ priv = CK_INVALID_HANDLE ;
6664+
6665+ /* Generate with ID and find */
6666+ if (ret == CKR_OK ) {
6667+ ret = gen_mlkem_keys (session , CKP_ML_KEM_512 , & pub , NULL , privId ,
6668+ privIdLen , NULL , 0 , 0 );
6669+ }
6670+ if (ret == CKR_OK )
6671+ ret = find_mlkem_priv_key (session , & priv , privId , privIdLen );
6672+
6673+ funcList -> C_DestroyObject (session , pub );
6674+ funcList -> C_DestroyObject (session , priv );
6675+
6676+ return ret ;
6677+ }
6678+ #endif /* WOLFPKCS11_MLKEM */
6679+
64106680static CK_RV test_random (void * args )
64116681{
64126682 CK_SESSION_HANDLE session = * (CK_SESSION_HANDLE * )args ;
@@ -6700,6 +6970,12 @@ static TEST_FUNC testFunc[] = {
67006970 PKCS11MTT_CASE (test_hmac_sha512 ),
67016971 PKCS11MTT_CASE (test_hmac_sha512_fail ),
67026972#endif
6973+ #endif
6974+ #ifdef WOLFPKCS11_MLDSA
6975+ PKCS11MTT_CASE (test_mldsa_gen_keys ),
6976+ #endif
6977+ #ifdef WOLFPKCS11_MLKEM
6978+ PKCS11MTT_CASE (test_mlkem_gen_keys ),
67036979#endif
67046980 PKCS11MTT_CASE (test_random ),
67056981};
0 commit comments