save the mechs supported when initing the token, print them in printinfo.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@17972 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -48,6 +48,11 @@ struct p11_slot {
|
|||||||
char *name;
|
char *name;
|
||||||
hx509_certs certs;
|
hx509_certs certs;
|
||||||
char *pin;
|
char *pin;
|
||||||
|
struct {
|
||||||
|
CK_MECHANISM_TYPE_PTR list;
|
||||||
|
CK_ULONG num;
|
||||||
|
CK_MECHANISM_INFO_PTR *infos;
|
||||||
|
} mechs;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct p11_module {
|
struct p11_module {
|
||||||
@@ -224,6 +229,70 @@ static const RSA_METHOD rsa_pkcs1_method = {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static int
|
||||||
|
p11_mech_info(hx509_context context,
|
||||||
|
struct p11_module *p,
|
||||||
|
struct p11_slot *slot,
|
||||||
|
int num)
|
||||||
|
{
|
||||||
|
CK_ULONG i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = P11FUNC(p, GetMechanismList, (slot->id, NULL_PTR, &i));
|
||||||
|
if (ret) {
|
||||||
|
hx509_set_error_string(context, 0, EINVAL,
|
||||||
|
"Failed to get mech list count for slot %d",
|
||||||
|
num);
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
if (i == 0) {
|
||||||
|
hx509_set_error_string(context, 0, EINVAL,
|
||||||
|
"no mech supported for slot %d", num);
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
slot->mechs.list = calloc(i, sizeof(slot->mechs.list[0]));
|
||||||
|
if (slot->mechs.list == NULL) {
|
||||||
|
hx509_set_error_string(context, 0, ENOMEM,
|
||||||
|
"out of memory");
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
slot->mechs.num = i;
|
||||||
|
ret = P11FUNC(p, GetMechanismList, (slot->id, slot->mechs.list, &i));
|
||||||
|
if (ret) {
|
||||||
|
hx509_set_error_string(context, 0, EINVAL,
|
||||||
|
"Failed to get mech list for slot %d",
|
||||||
|
num);
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
assert(i == slot->mechs.num);
|
||||||
|
|
||||||
|
slot->mechs.infos = calloc(i, sizeof(*slot->mechs.infos));
|
||||||
|
if (slot->mechs.list == NULL) {
|
||||||
|
hx509_set_error_string(context, 0, ENOMEM,
|
||||||
|
"out of memory");
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < slot->mechs.num; i++) {
|
||||||
|
slot->mechs.infos[i] = calloc(1, sizeof(*(slot->mechs.infos[0])));
|
||||||
|
if (slot->mechs.infos[i] == NULL) {
|
||||||
|
hx509_set_error_string(context, 0, ENOMEM,
|
||||||
|
"out of memory");
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
ret = P11FUNC(p, GetMechanismInfo, (slot->id, slot->mechs.list[i],
|
||||||
|
slot->mechs.infos[i]));
|
||||||
|
if (ret) {
|
||||||
|
hx509_set_error_string(context, 0, EINVAL,
|
||||||
|
"Failed to get mech info for slot %d",
|
||||||
|
num);
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
p11_init_slot(hx509_context context,
|
p11_init_slot(hx509_context context,
|
||||||
struct p11_module *p,
|
struct p11_module *p,
|
||||||
@@ -281,7 +350,13 @@ p11_init_slot(hx509_context context,
|
|||||||
num);
|
num);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = p11_mech_info(context, p, slot, num);
|
||||||
|
if (ret)
|
||||||
|
goto out;
|
||||||
|
|
||||||
ret = p11_list_keys(context, p, slot, session, lock, &slot->certs);
|
ret = p11_list_keys(context, p, slot, session, lock, &slot->certs);
|
||||||
|
out:
|
||||||
p11_put_session(p, slot, session);
|
p11_put_session(p, slot, session);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -535,9 +610,12 @@ collect_private_key(struct p11_module *p, struct p11_slot *slot,
|
|||||||
rsa->n = getattr_bn(p, slot, session, object, CKA_MODULUS);
|
rsa->n = getattr_bn(p, slot, session, object, CKA_MODULUS);
|
||||||
if (rsa->n == NULL)
|
if (rsa->n == NULL)
|
||||||
_hx509_abort("CKA_MODULUS missing");
|
_hx509_abort("CKA_MODULUS missing");
|
||||||
|
/*
|
||||||
|
* The exponent should always be present according to the pkcs11
|
||||||
|
* specification, but some smartcards leaves it out, let ignore
|
||||||
|
* any failure to fetch it.
|
||||||
|
*/
|
||||||
rsa->e = getattr_bn(p, slot, session, object, CKA_PUBLIC_EXPONENT);
|
rsa->e = getattr_bn(p, slot, session, object, CKA_PUBLIC_EXPONENT);
|
||||||
if (rsa->e == NULL)
|
|
||||||
_hx509_abort("CKA_PUBLIC_EXPONENT missing");
|
|
||||||
|
|
||||||
p11rsa = calloc(1, sizeof(*p11rsa));
|
p11rsa = calloc(1, sizeof(*p11rsa));
|
||||||
if (p11rsa == NULL)
|
if (p11rsa == NULL)
|
||||||
@@ -821,6 +899,7 @@ static void
|
|||||||
p11_release_module(struct p11_module *p)
|
p11_release_module(struct p11_module *p)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (p->refcount == 0)
|
if (p->refcount == 0)
|
||||||
_hx509_abort("pkcs11 refcount to low");
|
_hx509_abort("pkcs11 refcount to low");
|
||||||
if (--p->refcount > 0)
|
if (--p->refcount > 0)
|
||||||
@@ -838,6 +917,17 @@ p11_release_module(struct p11_module *p)
|
|||||||
memset(p->slot[i].pin, 0, strlen(p->slot[i].pin));
|
memset(p->slot[i].pin, 0, strlen(p->slot[i].pin));
|
||||||
free(p->slot[i].pin);
|
free(p->slot[i].pin);
|
||||||
}
|
}
|
||||||
|
if (p->slot[i].mechs.num) {
|
||||||
|
free(p->slot[i].mechs.list);
|
||||||
|
|
||||||
|
if (p->slot[i].mechs.infos) {
|
||||||
|
int j;
|
||||||
|
|
||||||
|
for (j = 0 ; j < p->slot[i].mechs.num ; j++)
|
||||||
|
free(p->slot[i].mechs.infos[i]);
|
||||||
|
free(p->slot[i].mechs.infos);
|
||||||
|
}
|
||||||
|
}
|
||||||
free(p->slot);
|
free(p->slot);
|
||||||
}
|
}
|
||||||
memset(p, 0, sizeof(*p));
|
memset(p, 0, sizeof(*p));
|
||||||
@@ -915,6 +1005,70 @@ p11_iter_end(hx509_context context,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct units mechflags[] = {
|
||||||
|
{"derive", 0x80000 },
|
||||||
|
{"unwrap", 0x40000 },
|
||||||
|
{"wrap", 0x20000 },
|
||||||
|
{"genereate-key-pair", 0x10000 },
|
||||||
|
{"generate", 0x08000 },
|
||||||
|
{"verify-recover", 0x04000 },
|
||||||
|
{"verify", 0x02000 },
|
||||||
|
{"sign-recover", 0x01000 },
|
||||||
|
{"sign", 0x00800 },
|
||||||
|
{"digest", 0x00400 },
|
||||||
|
{"decrypt", 0x00200 },
|
||||||
|
{"encrypt", 0x00100 },
|
||||||
|
{"hw", 0x00001 },
|
||||||
|
{ NULL, 0x00000 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
p11_printinfo(hx509_context context,
|
||||||
|
hx509_certs certs,
|
||||||
|
void *data,
|
||||||
|
int (*func)(void *, char *),
|
||||||
|
void *ctx)
|
||||||
|
{
|
||||||
|
struct p11_module *p = data;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
_hx509_pi_printf(func, ctx, "pkcs11 driver with %d slots", p->num_slots);
|
||||||
|
|
||||||
|
for (i = 0; i < p->num_slots; i++) {
|
||||||
|
struct p11_slot *s = &p->slot[i];
|
||||||
|
|
||||||
|
_hx509_pi_printf(func, ctx, "slot %d: id: %d name: %s flags: %08x",
|
||||||
|
i, (int)s->id, s->name, s->flags);
|
||||||
|
|
||||||
|
_hx509_pi_printf(func, ctx, "number of supported mechanisms: %lu",
|
||||||
|
(unsigned long)s->mechs.num);
|
||||||
|
for (j = 0; j < s->mechs.num; j++) {
|
||||||
|
const char *mechname = "unknown";
|
||||||
|
char flags[256];
|
||||||
|
#define MECHNAME(s,n) case s: mechname = n; break
|
||||||
|
switch(s->mechs.list[j]) {
|
||||||
|
MECHNAME(CKM_RSA_PKCS_KEY_PAIR_GEN, "rsa-pkcs-key-pair-gen");
|
||||||
|
MECHNAME(CKM_RSA_PKCS, "rsa-pkcs");
|
||||||
|
MECHNAME(CKM_RSA_X_509, "rsa-x-509");
|
||||||
|
MECHNAME(CKM_MD5_RSA_PKCS, "md5-rsa-pkcs");
|
||||||
|
MECHNAME(CKM_SHA1_RSA_PKCS, "sha1-rsa-pkcs");
|
||||||
|
}
|
||||||
|
#undef MECHNAME
|
||||||
|
unparse_flags(s->mechs.infos[j]->flags, mechflags,
|
||||||
|
flags, sizeof(flags));
|
||||||
|
|
||||||
|
_hx509_pi_printf(func, ctx,
|
||||||
|
" %lu (%s) flags: (0x%08x) %s",
|
||||||
|
(unsigned long)s->mechs.list[j],
|
||||||
|
mechname,
|
||||||
|
(unsigned long)s->mechs.infos[j]->flags,
|
||||||
|
flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static struct hx509_keyset_ops keyset_pkcs11 = {
|
static struct hx509_keyset_ops keyset_pkcs11 = {
|
||||||
"PKCS11",
|
"PKCS11",
|
||||||
0,
|
0,
|
||||||
@@ -924,7 +1078,8 @@ static struct hx509_keyset_ops keyset_pkcs11 = {
|
|||||||
NULL,
|
NULL,
|
||||||
p11_iter_start,
|
p11_iter_start,
|
||||||
p11_iter,
|
p11_iter,
|
||||||
p11_iter_end
|
p11_iter_end,
|
||||||
|
p11_printinfo
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Reference in New Issue
Block a user