@@ -8659,6 +8659,7 @@ int WP11_Object_SetMldsaKey(WP11_Object* object, unsigned char** data,
86598659{
86608660 int ret ;
86618661 MlDsaKey * key ;
8662+ int seedUsed = 0 ;
86628663
86638664 if (object -> onToken )
86648665 WP11_Lock_LockRW (object -> lock );
@@ -8667,19 +8668,71 @@ int WP11_Object_SetMldsaKey(WP11_Object* object, unsigned char** data,
86678668 ret = wc_MlDsaKey_Init (key , NULL , object -> devId );
86688669
86698670 /* Set parameters */
8670- if (ret == 0 ) {
8671+ if (ret == 0 && data [ 0 ] != NULL ) {
86718672 ret = mldsaSetParameters (key ,
86728673 (CK_ML_DSA_PARAMETER_SET_TYPE * )data [0 ],
86738674 (int )len [0 ]);
86748675 }
86758676
8676- /* Set key data */
8677+ /* Set seed (only for private keys) */
86778678 if (ret == 0 && data [1 ] != NULL ) {
8678- if (object -> objClass == CKO_PUBLIC_KEY ) {
8679- ret = wc_MlDsaKey_ImportPubRaw (key , data [1 ], len [1 ]);
8679+ if (object -> objClass != CKO_PRIVATE_KEY ) {
8680+ ret = BAD_FUNC_ARG ;
8681+ }
8682+ else if (len [1 ] != DILITHIUM_SEED_SZ ) {
8683+ ret = BAD_FUNC_ARG ;
86808684 }
86818685 else {
8682- ret = wc_MlDsaKey_ImportPrivRaw (key , data [1 ], len [1 ]);
8686+ ret = wc_dilithium_make_key_from_seed (key , data [1 ]);
8687+ seedUsed = 1 ;
8688+ }
8689+ }
8690+
8691+ /* Set key data */
8692+ if (ret == 0 && data [2 ] != NULL ) {
8693+ if (seedUsed == 0 ) {
8694+ /* Import given public/private key data */
8695+ if (object -> objClass == CKO_PUBLIC_KEY ) {
8696+ ret = wc_MlDsaKey_ImportPubRaw (key , data [2 ], len [2 ]);
8697+ }
8698+ else {
8699+ ret = wc_MlDsaKey_ImportPrivRaw (key , data [2 ], len [2 ]);
8700+ }
8701+ }
8702+ else {
8703+ if (object -> objClass == CKO_PUBLIC_KEY ) {
8704+ /* Seed is only allowed for private keys */
8705+ ret = BAD_FUNC_ARG ;
8706+ }
8707+ else {
8708+ /* Check if the provided expanded private key is identical
8709+ * to the one generated from the seed */
8710+ byte * expandedKey = NULL ;
8711+ word32 expandedKeyLen = 0 ;
8712+
8713+ expandedKeyLen = wc_dilithium_size (key );
8714+ if (expandedKeyLen != len [2 ]) {
8715+ ret = BAD_FUNC_ARG ;
8716+ }
8717+ if (ret == 0 ) {
8718+ expandedKey = XMALLOC (expandedKeyLen , NULL ,
8719+ DYNAMIC_TYPE_TMP_BUFFER );
8720+ if (expandedKey == NULL ) {
8721+ ret = MEMORY_E ;
8722+ }
8723+ }
8724+ if (ret == 0 ) {
8725+ ret = wc_MlDsaKey_ExportPrivRaw (key , expandedKey ,
8726+ & expandedKeyLen );
8727+ if (ret == 0 ) {
8728+ if (WP11_ConstantCompare (expandedKey , data [2 ],
8729+ (int )expandedKeyLen ) != 1 ) {
8730+ ret = BAD_FUNC_ARG ;
8731+ }
8732+ }
8733+ XFREE (expandedKey , NULL , DYNAMIC_TYPE_TMP_BUFFER );
8734+ }
8735+ }
86838736 }
86848737 }
86858738
@@ -9646,6 +9699,9 @@ static int MldsaObject_GetAttr(WP11_Object* object, CK_ATTRIBUTE_TYPE type,
96469699 case CKA_PARAMETER_SET :
96479700 ret = GetMldsaParams (object -> data .mldsaKey , data , len );
96489701 break ;
9702+ case CKA_SEED :
9703+ * len = CK_UNAVAILABLE_INFORMATION ;
9704+ break ;
96499705 case CKA_VALUE :
96509706 if (object -> objClass == CKO_PRIVATE_KEY ) {
96519707 if (noPriv )
@@ -10467,6 +10523,7 @@ int WP11_Object_SetAttr(WP11_Object* object, CK_ATTRIBUTE_TYPE type, byte* data,
1046710523 }
1046810524 break ;
1046910525 case CKA_PARAMETER_SET :
10526+ case CKA_SEED :
1047010527#ifdef WOLFPKCS11_MLDSA
1047110528 if (object -> type != CKK_ML_DSA )
1047210529#endif
@@ -11982,16 +12039,26 @@ int WP11_Mldsa_GenerateKeyPair(WP11_Object* pub, WP11_Object* priv,
1198212039 byte * pubKey = NULL ;
1198312040 word32 pubKeyLen = 0 ;
1198412041 WC_RNG rng ;
12042+ byte level = 0 ;
1198512043
1198612044 /* Both MlDsaKey object inside the pub and priv WP11_Objects are
11987- * already initialized and set to a proper level within
11988- * WP11_Object_SetMldsaKey() based on the given parameter set. */
12045+ * already initialized. The pub key is also set to a proper level
12046+ * within WP11_Object_SetMldsaKey() based on the given parameter
12047+ * set. */
12048+
12049+ /* Copy level from pub to priv */
12050+ ret = wc_MlDsaKey_GetParams (pub -> data .mldsaKey , & level );
12051+ if (ret == 0 ) {
12052+ ret = wc_MlDsaKey_SetParams (priv -> data .mldsaKey , level );
12053+ }
1198912054
1199012055 /* Generate into the private key. */
11991- ret = Rng_New (& slot -> token .rng , & slot -> token .rngLock , & rng );
1199212056 if (ret == 0 ) {
11993- ret = wc_MlDsaKey_MakeKey (priv -> data .mldsaKey , & rng );
11994- Rng_Free (& rng );
12057+ ret = Rng_New (& slot -> token .rng , & slot -> token .rngLock , & rng );
12058+ if (ret == 0 ) {
12059+ ret = wc_MlDsaKey_MakeKey (priv -> data .mldsaKey , & rng );
12060+ Rng_Free (& rng );
12061+ }
1199512062 }
1199612063 if (ret == 0 ) {
1199712064 ret = wc_MlDsaKey_GetPubLen (priv -> data .mldsaKey , (int * )& pubKeyLen );
0 commit comments