summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorwyllys <none@none>2007-09-25 11:12:45 -0700
committerwyllys <none@none>2007-09-25 11:12:45 -0700
commit4ba70ed0e487727de98a6297bc6d0a827001a390 (patch)
tree7cdfe6a16bcdec7d58adbe3011c6a94099c75915 /usr/src
parentcf5b5989488984444a152faba2a8183a71dcf485 (diff)
downloadillumos-joyent-4ba70ed0e487727de98a6297bc6d0a827001a390.tar.gz
6607135 KMF incorrectly labels public keys as private
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/cmd-crypto/pktool/list.c1
-rw-r--r--usr/src/lib/libkmf/plugins/kmf_pkcs11/common/pkcs11_spi.c41
2 files changed, 39 insertions, 3 deletions
diff --git a/usr/src/cmd/cmd-crypto/pktool/list.c b/usr/src/cmd/cmd-crypto/pktool/list.c
index 01dc537c8b..c138532b86 100644
--- a/usr/src/cmd/cmd-crypto/pktool/list.c
+++ b/usr/src/cmd/cmd-crypto/pktool/list.c
@@ -406,6 +406,7 @@ list_pk11_objects(KMF_HANDLE_T kmfhandle, char *token, int oclass,
if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
int num = numattr;
+ private = B_FALSE;
keyclass = KMF_ASYM_PUB;
kmf_set_attr_at_index(attrlist, num,
KMF_KEYCLASS_ATTR, &keyclass,
diff --git a/usr/src/lib/libkmf/plugins/kmf_pkcs11/common/pkcs11_spi.c b/usr/src/lib/libkmf/plugins/kmf_pkcs11/common/pkcs11_spi.c
index 3d7cfae6d2..189412acb7 100644
--- a/usr/src/lib/libkmf/plugins/kmf_pkcs11/common/pkcs11_spi.c
+++ b/usr/src/lib/libkmf/plugins/kmf_pkcs11/common/pkcs11_spi.c
@@ -1877,6 +1877,7 @@ getObjectKeytype(KMF_HANDLE_T handle, CK_OBJECT_HANDLE obj,
return (rv);
}
+
static CK_RV
getObjectLabel(KMF_HANDLE_T handle, CK_OBJECT_HANDLE obj,
char **outlabel)
@@ -1901,6 +1902,33 @@ getObjectLabel(KMF_HANDLE_T handle, CK_OBJECT_HANDLE obj,
return (rv);
}
+static CK_RV
+getObjectKeyclass(KMF_HANDLE_T handle, CK_OBJECT_HANDLE obj,
+ KMF_KEY_CLASS *keyclass)
+{
+ CK_RV rv = CKR_OK;
+ CK_ATTRIBUTE templ;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ CK_OBJECT_CLASS class;
+
+ templ.type = CKA_CLASS;
+ templ.pValue = &class;
+ templ.ulValueLen = sizeof (CK_OBJECT_CLASS);
+
+ rv = C_GetAttributeValue(kmfh->pk11handle, obj, &templ, 1);
+ if (rv == CKR_OK) {
+ if (class == CKO_PUBLIC_KEY) {
+ *keyclass = KMF_ASYM_PUB;
+ } else if (class == CKO_PRIVATE_KEY) {
+ *keyclass = KMF_ASYM_PRI;
+ } else if (class == CKO_SECRET_KEY) {
+ *keyclass = KMF_SYMMETRIC;
+ }
+ } else {
+ *keyclass = KMF_KEYCLASS_NONE;
+ }
+ return (rv);
+}
KMF_RETURN
KMFPK11_FindPrikeyByCert(KMF_HANDLE_T handle, int numattr,
@@ -2695,7 +2723,6 @@ KMFPK11_FindKey(KMF_HANDLE_T handle,
if (keys != NULL) {
CK_ULONG keytype;
keys[n].kstype = KMF_KEYSTORE_PK11TOKEN;
- keys[n].keyclass = keyclass;
keys[n].israw = FALSE;
keys[n].keyp = (void *)hObj;
@@ -2711,12 +2738,20 @@ KMFPK11_FindKey(KMF_HANDLE_T handle,
if (ckrv != CKR_OK)
goto end;
+ if (keyclass == KMF_KEYCLASS_NONE) {
+ ckrv = getObjectKeyclass(handle,
+ (CK_OBJECT_HANDLE)
+ keys[n].keyp,
+ &(keys[n].keyclass));
+ if (ckrv != CKR_OK)
+ goto end;
+ } else {
+ keys[n].keyclass = keyclass;
+ }
if (keytype == CKK_RSA) {
keys[n].keyalg = KMF_RSA;
- keys[n].keyclass = KMF_ASYM_PRI;
} else if (keytype == CKK_DSA) {
keys[n].keyalg = KMF_DSA;
- keys[n].keyclass = KMF_ASYM_PRI;
} else if (keytype == CKK_AES) {
keys[n].keyalg = KMF_AES;
keys[n].keyclass =