Skip to content

Commit c60eacb

Browse files
committed
Add CKA_SEED support for ML-DSA private key import
1 parent b47176d commit c60eacb

4 files changed

Lines changed: 529 additions & 363 deletions

File tree

src/crypto.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ static CK_ATTRIBUTE_TYPE ecKeyParams[] = {
9191
/* ML-DSA key data attributes. */
9292
static CK_ATTRIBUTE_TYPE mldsaKeyParams[] = {
9393
CKA_PARAMETER_SET,
94+
CKA_SEED,
9495
CKA_VALUE
9596
};
9697
/* Count of ML-DSA key data attributes. */
@@ -235,6 +236,7 @@ static AttributeType attrType[] = {
235236
{ CKA_NAME_HASH_ALGORITHM, ATTR_TYPE_ULONG },
236237
{ CKA_CHECK_VALUE, ATTR_TYPE_DATA },
237238
{ CKA_PARAMETER_SET, ATTR_TYPE_ULONG },
239+
{ CKA_SEED, ATTR_TYPE_DATA },
238240
#ifdef WOLFPKCS11_NSS
239241
{ CKA_CERT_SHA1_HASH, ATTR_TYPE_DATA },
240242
{ CKA_CERT_MD5_HASH, ATTR_TYPE_DATA },

src/internal.c

Lines changed: 77 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)