Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
287 changes: 253 additions & 34 deletions src/crypto.c

Large diffs are not rendered by default.

460 changes: 357 additions & 103 deletions src/internal.c

Large diffs are not rendered by default.

11 changes: 11 additions & 0 deletions src/slot.c
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,9 @@ static CK_MECHANISM_TYPE mechanismList[] = {
CKM_TLS_MAC,
#endif
CKM_GENERIC_SECRET_KEY_GEN,
CKM_CONCATENATE_BASE_AND_KEY,
CKM_CONCATENATE_BASE_AND_DATA,
CKM_CONCATENATE_DATA_AND_BASE,
#ifndef NO_HMAC
CKM_PKCS5_PBKD2
#endif
Expand Down Expand Up @@ -909,6 +912,9 @@ static CK_MECHANISM_INFO sha3MechInfo = {
static CK_MECHANISM_INFO genSecKeyGenMechInfo = {
8, WP11_MAX_SYM_KEY_SZ * 8, CKF_GENERATE
};
static CK_MECHANISM_INFO concatMechInfo = {
8, WP11_MAX_SYM_KEY_SZ * 8, CKF_DERIVE
};

#ifndef NO_HMAC
static CK_MECHANISM_INFO pkcs5Pbkdf2MechInfo = {
Expand Down Expand Up @@ -1293,6 +1299,11 @@ CK_RV C_GetMechanismInfo(CK_SLOT_ID slotID, CK_MECHANISM_TYPE type,
XMEMCPY(pInfo, &genSecKeyGenMechInfo,
sizeof(CK_MECHANISM_INFO));
break;
case CKM_CONCATENATE_BASE_AND_KEY:
case CKM_CONCATENATE_BASE_AND_DATA:
case CKM_CONCATENATE_DATA_AND_BASE:
XMEMCPY(pInfo, &concatMechInfo, sizeof(CK_MECHANISM_INFO));
break;
#ifndef NO_HMAC
case CKM_PKCS5_PBKD2:
XMEMCPY(pInfo, &pkcs5Pbkdf2MechInfo,
Expand Down
287 changes: 287 additions & 0 deletions tests/pkcs11str.c
Original file line number Diff line number Diff line change
Expand Up @@ -961,6 +961,268 @@ static CK_RV find_mlkem_pub_key(CK_SESSION_HANDLE session,
}
#endif /* WOLFPKCS11_MLKEM */

#ifndef WOLFPKCS11_NO_STORE
static unsigned char secretKeyId[] = "123secretkey";

static CK_RV create_public_secret_key(CK_SESSION_HANDLE session)
{
CK_RV ret;
CK_OBJECT_CLASS keyClass = CKO_SECRET_KEY;
CK_BBOOL ckFalse = CK_FALSE;
unsigned char value[16] = { 0 };
CK_OBJECT_HANDLE key;
CK_ATTRIBUTE tmpl[] = {
{ CKA_CLASS, &keyClass, sizeof(keyClass) },
{ CKA_KEY_TYPE, &genericKeyType, sizeof(genericKeyType) },
{ CKA_TOKEN, &ckTrue, sizeof(ckTrue) },
{ CKA_PRIVATE, &ckFalse, sizeof(ckFalse) },
{ CKA_DERIVE, &ckTrue, sizeof(ckTrue) },
{ CKA_SIGN, &ckTrue, sizeof(ckTrue) },
{ CKA_ID, secretKeyId, sizeof(secretKeyId) - 1 },
{ CKA_VALUE, value, sizeof(value) },
};

ret = funcList->C_CreateObject(session, tmpl,
sizeof(tmpl) / sizeof(*tmpl), &key);
CHECK_CKR(ret, "Create public secret key");

return ret;
}

#if defined(HAVE_ECC) || !defined(NO_DH)
#ifdef HAVE_ECC
static unsigned char ecPublicId[] = "123ecpublic";
#endif
#ifndef NO_DH
static unsigned char dhPublicId[] = "123dhpublic";
#endif

static CK_RV create_public_asym_keys(CK_SESSION_HANDLE session)
{
CK_RV ret = CKR_OK;
CK_BBOOL ckFalse = CK_FALSE;
CK_OBJECT_HANDLE key;
#ifdef HAVE_ECC
CK_ATTRIBUTE tmpl[] = {
{ CKA_CLASS, &privKeyClass, sizeof(privKeyClass) },
{ CKA_KEY_TYPE, &eccKeyType, sizeof(eccKeyType) },
{ CKA_PRIVATE, &ckFalse, sizeof(ckFalse) },
{ CKA_EC_PARAMS, ecc_p256_params, sizeof(ecc_p256_params) },
{ CKA_VALUE, ecc_p256_priv, sizeof(ecc_p256_priv) },
{ CKA_TOKEN, &ckTrue, sizeof(ckTrue) },
{ CKA_ID, ecPublicId, sizeof(ecPublicId) - 1 },
};
CK_ATTRIBUTE pubTmpl[] = {
{ CKA_CLASS, &pubKeyClass, sizeof(pubKeyClass) },
{ CKA_KEY_TYPE, &eccKeyType, sizeof(eccKeyType) },
{ CKA_EC_PARAMS, ecc_p256_params, sizeof(ecc_p256_params) },
{ CKA_EC_POINT, ecc_p256_pub, sizeof(ecc_p256_pub) },
{ CKA_TOKEN, &ckTrue, sizeof(ckTrue) },
{ CKA_ID, ecPublicId, sizeof(ecPublicId) - 1 },
};
#endif
#ifndef NO_DH
CK_ATTRIBUTE dhTmpl[] = {
{ CKA_CLASS, &privKeyClass, sizeof(privKeyClass) },
{ CKA_KEY_TYPE, &dhKeyType, sizeof(dhKeyType) },
{ CKA_PRIVATE, &ckFalse, sizeof(ckFalse) },
{ CKA_PRIME, dh_ffdhe2048_p, sizeof(dh_ffdhe2048_p) },
{ CKA_BASE, dh_ffdhe2048_g, sizeof(dh_ffdhe2048_g) },
{ CKA_VALUE, dh_2048_priv, sizeof(dh_2048_priv) },
{ CKA_TOKEN, &ckTrue, sizeof(ckTrue) },
{ CKA_ID, dhPublicId, sizeof(dhPublicId) - 1 },
};
#endif

#ifdef HAVE_ECC
ret = funcList->C_CreateObject(session, tmpl,
sizeof(tmpl) / sizeof(*tmpl), &key);
CHECK_CKR(ret, "Create public EC private key");
if (ret == CKR_OK) {
ret = funcList->C_CreateObject(session, pubTmpl,
sizeof(pubTmpl) / sizeof(*pubTmpl),
&key);
CHECK_CKR(ret, "Create EC public key");
}
#endif
#ifndef NO_DH
if (ret == CKR_OK) {
ret = funcList->C_CreateObject(session, dhTmpl,
sizeof(dhTmpl) / sizeof(*dhTmpl), &key);
CHECK_CKR(ret, "Create public DH private key");
}
#endif

return ret;
}

static CK_RV find_public_object(CK_SESSION_HANDLE session,
CK_OBJECT_CLASS objClass, unsigned char* id,
CK_ULONG idLen, CK_OBJECT_HANDLE* obj)
{
CK_RV ret;
CK_ULONG count = 0;
CK_ATTRIBUTE findTmpl[] = {
{ CKA_CLASS, &objClass, sizeof(objClass) },
{ CKA_ID, id, idLen },
};

ret = funcList->C_FindObjectsInit(session, findTmpl,
sizeof(findTmpl) / sizeof(*findTmpl));
CHECK_CKR(ret, "Find public object init");
if (ret == CKR_OK) {
ret = funcList->C_FindObjects(session, obj, 1, &count);
CHECK_CKR(ret, "Find public object");
funcList->C_FindObjectsFinal(session);
}
if (ret == CKR_OK && count != 1) {
ret = -1;
CHECK_CKR(ret, "Find public object count");
}

return ret;
}
#endif

static CK_RV undecoded_key_before_login(void)
{
CK_RV ret;
CK_OBJECT_CLASS keyClass = CKO_SECRET_KEY;
CK_BBOOL ckFalse = CK_FALSE;
CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
CK_OBJECT_HANDLE key = CK_INVALID_HANDLE;
CK_OBJECT_HANDLE derived = CK_INVALID_HANDLE;
CK_ULONG count = 0;
unsigned char data[4] = { 0xd0, 0xd1, 0xd2, 0xd3 };
CK_KEY_DERIVATION_STRING_DATA params = { data, sizeof(data) };
CK_MECHANISM mech = { CKM_CONCATENATE_BASE_AND_DATA, &params,
sizeof(params) };
#ifndef NO_HMAC
CK_MECHANISM macMech = { CKM_SHA256_HMAC, NULL, 0 };
#endif
CK_ATTRIBUTE findTmpl[] = {
{ CKA_CLASS, &keyClass, sizeof(keyClass) },
{ CKA_ID, secretKeyId, sizeof(secretKeyId) - 1 },
};
#ifdef HAVE_ECC
CK_OBJECT_HANDLE ecKey = CK_INVALID_HANDLE;
unsigned char ecParams[16];
CK_ATTRIBUTE paramsTmpl = { CKA_EC_PARAMS, ecParams, sizeof(ecParams) };
CK_OBJECT_HANDLE ecPub = CK_INVALID_HANDLE;
unsigned char ecPoint[sizeof(ecc_p256_pub)];
CK_ATTRIBUTE pointTmpl = { CKA_EC_POINT, ecPoint, sizeof(ecPoint) };
#endif
#ifndef NO_DH
CK_OBJECT_HANDLE dhKey = CK_INVALID_HANDLE;
unsigned char prime[sizeof(dh_ffdhe2048_p)];
unsigned char dhValue[sizeof(dh_2048_priv)];
CK_ATTRIBUTE primeTmpl = { CKA_PRIME, prime, sizeof(prime) };
CK_ATTRIBUTE dhValueTmpl = { CKA_VALUE, dhValue, sizeof(dhValue) };
#endif
CK_ULONG valueLen = 16 + sizeof(data);
CK_ULONG keyLen = 0;
CK_ATTRIBUTE lenTmpl = { CKA_VALUE_LEN, &keyLen, sizeof(keyLen) };
CK_ATTRIBUTE tmpl[] = {
{ CKA_CLASS, &keyClass, sizeof(keyClass) },
{ CKA_KEY_TYPE, &genericKeyType, sizeof(genericKeyType) },
{ CKA_PRIVATE, &ckFalse, sizeof(ckFalse) },
{ CKA_VALUE_LEN, &valueLen, sizeof(valueLen) },
};

ret = funcList->C_OpenSession(slot, CKF_SERIAL_SESSION | CKF_RW_SESSION,
NULL, NULL, &session);
CHECK_CKR(ret, "Open session before login");
if (ret == CKR_OK) {
ret = funcList->C_FindObjectsInit(session, findTmpl,
sizeof(findTmpl) / sizeof(*findTmpl));
CHECK_CKR(ret, "Find public secret key init");
}
if (ret == CKR_OK) {
ret = funcList->C_FindObjects(session, &key, 1, &count);
CHECK_CKR(ret, "Find public secret key");
funcList->C_FindObjectsFinal(session);
}
if (ret == CKR_OK && count != 1) {
ret = -1;
CHECK_CKR(ret, "Find public secret key count");
}
if (ret == CKR_OK) {
ret = funcList->C_GetAttributeValue(session, key, &lenTmpl, 1);
CHECK_CKR(ret, "Key length of undecoded key before login");
}
CHECK_COND(ret != CKR_OK || keyLen == 16, ret,
"Key length value before login");
if (ret == CKR_OK) {
ret = funcList->C_DeriveKey(session, &mech, key, tmpl,
sizeof(tmpl) / sizeof(*tmpl), &derived);
CHECK_CKR_FAIL(ret, CKR_USER_NOT_LOGGED_IN,
"Concatenate undecoded key before login");
}
#ifndef NO_HMAC
if (ret == CKR_OK) {
ret = funcList->C_SignInit(session, &macMech, key);
CHECK_CKR_FAIL(ret, CKR_USER_NOT_LOGGED_IN,
"HMAC sign with undecoded key before login");
}
#endif
#ifdef HAVE_ECC
if (ret == CKR_OK) {
ret = find_public_object(session, CKO_PRIVATE_KEY, ecPublicId,
sizeof(ecPublicId) - 1, &ecKey);
}
if (ret == CKR_OK) {
ret = funcList->C_GetAttributeValue(session, ecKey, &paramsTmpl, 1);
CHECK_CKR_FAIL(ret, CKR_ATTRIBUTE_SENSITIVE,
"EC parameters of undecoded key before login");
}
if (ret == CKR_OK) {
ret = find_public_object(session, CKO_PUBLIC_KEY, ecPublicId,
sizeof(ecPublicId) - 1, &ecPub);
}
if (ret == CKR_OK) {
ret = funcList->C_GetAttributeValue(session, ecPub, &pointTmpl, 1);
CHECK_CKR(ret, "EC point of public key before login");
}
CHECK_COND(ret != CKR_OK ||
(pointTmpl.ulValueLen == sizeof(ecc_p256_pub) &&
XMEMCMP(ecPoint, ecc_p256_pub, sizeof(ecPoint)) == 0), ret,
"EC point value before login");
if (ret == CKR_OK) {
paramsTmpl.ulValueLen = sizeof(ecParams);
ret = funcList->C_GetAttributeValue(session, ecPub, &paramsTmpl, 1);
CHECK_CKR(ret, "EC parameters of public key before login");
}
CHECK_COND(ret != CKR_OK ||
(paramsTmpl.ulValueLen == sizeof(ecc_p256_params) &&
XMEMCMP(ecParams, ecc_p256_params,
sizeof(ecc_p256_params)) == 0), ret,
"EC parameters value before login");
#endif
#ifndef NO_DH
if (ret == CKR_OK) {
ret = find_public_object(session, CKO_PRIVATE_KEY, dhPublicId,
sizeof(dhPublicId) - 1, &dhKey);
}
if (ret == CKR_OK) {
ret = funcList->C_GetAttributeValue(session, dhKey, &primeTmpl, 1);
CHECK_CKR(ret, "DH prime of undecoded key before login");
}
CHECK_COND(ret != CKR_OK || (primeTmpl.ulValueLen == sizeof(prime) &&
XMEMCMP(prime, dh_ffdhe2048_p, sizeof(prime)) == 0), ret,
"DH prime value before login");
if (ret == CKR_OK) {
ret = funcList->C_GetAttributeValue(session, dhKey, &dhValueTmpl, 1);
CHECK_CKR_FAIL(ret, CKR_ATTRIBUTE_SENSITIVE,
"DH value of undecoded key before login");
}
#endif
if (session != CK_INVALID_HANDLE)
funcList->C_CloseSession(session);

return ret;
}
#endif

static CK_RV pkcs11_test(int slotId, int setPin, int closeDl)
{
CK_RV ret;
Expand Down Expand Up @@ -1131,6 +1393,24 @@ static CK_RV pkcs11_test(int slotId, int setPin, int closeDl)
printf("Done\n");
}
}
#endif
#ifndef WOLFPKCS11_NO_STORE
if (ret == CKR_OK && userPinLen != 0) {
printf("Create public secret key ... ");
ret = create_public_secret_key(session);
if (ret == CKR_OK) {
printf("Done\n");
}
}
#if defined(HAVE_ECC) || !defined(NO_DH)
if (ret == CKR_OK && userPinLen != 0) {
printf("Create public asymmetric keys ... ");
ret = create_public_asym_keys(session);
if (ret == CKR_OK) {
printf("Done\n");
}
}
#endif
#endif
pkcs11_close_session(session);
}
Expand All @@ -1155,6 +1435,13 @@ static CK_RV pkcs11_test(int slotId, int setPin, int closeDl)
printf("Done\n");
}
}
if (ret == CKR_OK && userPinLen != 0) {
printf("Use undecoded key before login ... ");
ret = undecoded_key_before_login();
if (ret == CKR_OK) {
printf("Done\n");
}
}
#endif
if (ret == CKR_OK) {
inited = 1;
Expand Down
Loading
Loading