cleanup key usage handling, cleanup

git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@2550 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
nils 2005-09-07 09:32:52 +00:00
parent f9db170520
commit d37315ec35
5 changed files with 69 additions and 50 deletions

View File

@ -102,7 +102,7 @@ struct pkcs15_pubkey_object {
#define pub_p15obj base.p15_object
#define pub_cert base.related_cert
#define __p15_type(obj) (((obj) && (obj)->p15_object)? ((obj)->p15_object->type) : -1)
#define __p15_type(obj) (((obj) && (obj)->p15_object)? ((obj)->p15_object->type) : (unsigned int)-1)
#define is_privkey(obj) (__p15_type(obj) == SC_PKCS15_TYPE_PRKEY_RSA)
#define is_pubkey(obj) (__p15_type(obj) == SC_PKCS15_TYPE_PUBKEY_RSA)
#define is_cert(obj) (__p15_type(obj) == SC_PKCS15_TYPE_CERT_X509)
@ -673,7 +673,7 @@ static CK_RV pkcs15_create_tokens(struct sc_pkcs11_card *p11card)
for (j=0; j < fw_data->num_objects; j++) {
struct pkcs15_any_object *obj = fw_data->objects[j];
if (__p15_type(obj) == -1)
if (__p15_type(obj) == (unsigned int)-1)
continue;
else if (!sc_pkcs15_compare_id(&pin_info->auth_id, &obj->p15_object->auth_id))
continue;
@ -1214,13 +1214,13 @@ get_X509_usage_privk(CK_ATTRIBUTE_PTR pTempl, CK_ULONG ulCount, unsigned long *x
if (val == NULL)
continue;
if (typ == CKA_SIGN && *val)
*x509_usage |= 1;
*x509_usage |= SC_PKCS15INIT_X509_DIGITAL_SIGNATURE;
if (typ == CKA_UNWRAP && *val)
*x509_usage |= 4;
*x509_usage |= SC_PKCS15INIT_X509_KEY_ENCIPHERMENT;
if (typ == CKA_DECRYPT && *val)
*x509_usage |= 8;
*x509_usage |= SC_PKCS15INIT_X509_DATA_ENCIPHERMENT;
if (typ == CKA_DERIVE && *val)
*x509_usage |= 16;
*x509_usage |= SC_PKCS15INIT_X509_KEY_AGREEMENT;
if (typ == CKA_VERIFY || typ == CKA_WRAP || typ == CKA_ENCRYPT) {
sc_debug(context, "get_X509_usage_privk(): invalid typ = 0x%0x\n", typ);
return CKR_ATTRIBUTE_TYPE_INVALID;
@ -1239,13 +1239,13 @@ get_X509_usage_pubk(CK_ATTRIBUTE_PTR pTempl, CK_ULONG ulCount, unsigned long *x5
if (val == NULL)
continue;
if (typ == CKA_VERIFY && *val)
*x509_usage |= 1;
*x509_usage |= SC_PKCS15INIT_X509_DIGITAL_SIGNATURE;
if (typ == CKA_WRAP && *val)
*x509_usage |= 4;
*x509_usage |= SC_PKCS15INIT_X509_KEY_ENCIPHERMENT;
if (typ == CKA_ENCRYPT && *val)
*x509_usage |= 8;
*x509_usage |= SC_PKCS15INIT_X509_DATA_ENCIPHERMENT;
if (typ == CKA_DERIVE && *val)
*x509_usage |= 16;
*x509_usage |= SC_PKCS15INIT_X509_KEY_AGREEMENT;
if (typ == CKA_SIGN || typ == CKA_UNWRAP || typ == CKA_DECRYPT) {
sc_debug(context, "get_X509_usage_pubk(): invalid typ = 0x%0x\n", typ);
return CKR_ATTRIBUTE_TYPE_INVALID;
@ -1649,6 +1649,8 @@ struct sc_pkcs11_object_ops pkcs15_cert_ops = {
pkcs15_cert_cmp_attribute,
NULL,
NULL,
NULL,
NULL,
NULL
};
@ -1933,13 +1935,13 @@ pkcs15_prkey_unwrap(struct sc_pkcs11_session *ses, void *obj,
{
u8 unwrapped_key[256];
CK_ULONG key_len = sizeof(unwrapped_key);
CK_RV rv;
int r;
rv = pkcs15_prkey_decrypt(ses, obj, pMechanism, pData, ulDataLen,
r = pkcs15_prkey_decrypt(ses, obj, pMechanism, pData, ulDataLen,
unwrapped_key, &key_len);
if (rv < 0)
return sc_to_cryptoki_error(rv, ses->slot->card->reader);
if (r < 0)
return sc_to_cryptoki_error(r, ses->slot->card->reader);
return sc_pkcs11_create_secret_key(ses,
unwrapped_key, key_len,
pTemplate, ulAttributeCount,
@ -2084,6 +2086,8 @@ struct sc_pkcs11_object_ops pkcs15_pubkey_ops = {
sc_pkcs11_any_cmp_attribute,
NULL,
NULL,
NULL,
NULL,
NULL
};

View File

@ -869,7 +869,8 @@ static struct sc_pkcs15init_operations sc_pkcs15init_cryptoflex_operations = {
cryptoflex_encode_private_key,
cryptoflex_encode_public_key,
NULL, /* finalize_card */
NULL, NULL, NULL, NULL, NULL /* old style api */
NULL, NULL, NULL, NULL, NULL, /* old style api */
NULL /* delete_object */
};
static struct sc_pkcs15init_operations sc_pkcs15init_cyberflex_operations = {
@ -887,7 +888,7 @@ static struct sc_pkcs15init_operations sc_pkcs15init_cyberflex_operations = {
cyberflex_encode_public_key,
NULL, /* finalize_card */
NULL, NULL, NULL, NULL, NULL, /* old style api */
NULL /* delete_object */
NULL /* delete_object */
};
struct sc_pkcs15init_operations *

View File

@ -13,6 +13,14 @@ extern "C" {
#include <opensc/pkcs15.h>
#define SC_PKCS15INIT_X509_DIGITAL_SIGNATURE 0x0080UL
#define SC_PKCS15INIT_X509_NON_REPUDIATION 0x0040UL
#define SC_PKCS15INIT_X509_KEY_ENCIPHERMENT 0x0020UL
#define SC_PKCS15INIT_X509_DATA_ENCIPHERMENT 0x0010UL
#define SC_PKCS15INIT_X509_KEY_AGREEMENT 0x0008UL
#define SC_PKCS15INIT_X509_KEY_CERT_SIGN 0x0004UL
#define SC_PKCS15INIT_X509_CRL_SIGN 0x0002UL
typedef struct sc_profile sc_profile_t; /* opaque type */
struct sc_pkcs15init_operations {

View File

@ -1679,42 +1679,48 @@ done: if (file)
/*
* Map X509 keyUsage extension bits to PKCS#15 keyUsage bits
*/
static unsigned int x509_to_pkcs15_private_key_usage[16] = {
SC_PKCS15_PRKEY_USAGE_SIGN
| SC_PKCS15_PRKEY_USAGE_SIGNRECOVER, /* digitalSignature */
SC_PKCS15_PRKEY_USAGE_NONREPUDIATION, /* NonRepudiation */
SC_PKCS15_PRKEY_USAGE_UNWRAP, /* keyEncipherment */
SC_PKCS15_PRKEY_USAGE_DECRYPT, /* dataEncipherment */
SC_PKCS15_PRKEY_USAGE_DERIVE, /* keyAgreement */
SC_PKCS15_PRKEY_USAGE_SIGN
| SC_PKCS15_PRKEY_USAGE_SIGNRECOVER, /* keyCertSign */
SC_PKCS15_PRKEY_USAGE_SIGN
| SC_PKCS15_PRKEY_USAGE_SIGNRECOVER, /* cRLSign */
typedef struct {
unsigned long x509_usage;
unsigned int p15_usage;
} sc_usage_map;
static sc_usage_map x509_to_pkcs15_private_key_usage[16] = {
{ SC_PKCS15INIT_X509_DIGITAL_SIGNATURE,
SC_PKCS15_PRKEY_USAGE_SIGN | SC_PKCS15_PRKEY_USAGE_SIGNRECOVER },
{ SC_PKCS15INIT_X509_NON_REPUDIATION, SC_PKCS15_PRKEY_USAGE_NONREPUDIATION },
{ SC_PKCS15INIT_X509_KEY_ENCIPHERMENT, SC_PKCS15_PRKEY_USAGE_UNWRAP },
{ SC_PKCS15INIT_X509_DATA_ENCIPHERMENT, SC_PKCS15_PRKEY_USAGE_DECRYPT },
{ SC_PKCS15INIT_X509_KEY_AGREEMENT, SC_PKCS15_PRKEY_USAGE_DERIVE },
{ SC_PKCS15INIT_X509_KEY_CERT_SIGN,
SC_PKCS15_PRKEY_USAGE_SIGN | SC_PKCS15_PRKEY_USAGE_SIGNRECOVER },
{ SC_PKCS15INIT_X509_CRL_SIGN,
SC_PKCS15_PRKEY_USAGE_SIGN | SC_PKCS15_PRKEY_USAGE_SIGNRECOVER }
};
static unsigned int x509_to_pkcs15_public_key_usage[16] = {
SC_PKCS15_PRKEY_USAGE_VERIFY
| SC_PKCS15_PRKEY_USAGE_VERIFYRECOVER, /* digitalSignature */
SC_PKCS15_PRKEY_USAGE_NONREPUDIATION, /* NonRepudiation */
SC_PKCS15_PRKEY_USAGE_WRAP, /* keyEncipherment */
SC_PKCS15_PRKEY_USAGE_ENCRYPT, /* dataEncipherment */
SC_PKCS15_PRKEY_USAGE_DERIVE, /* keyAgreement */
SC_PKCS15_PRKEY_USAGE_VERIFY
| SC_PKCS15_PRKEY_USAGE_VERIFYRECOVER, /* keyCertSign */
SC_PKCS15_PRKEY_USAGE_VERIFY
| SC_PKCS15_PRKEY_USAGE_VERIFYRECOVER, /* cRLSign */
static sc_usage_map x509_to_pkcs15_public_key_usage[16] = {
{ SC_PKCS15INIT_X509_DIGITAL_SIGNATURE,
SC_PKCS15_PRKEY_USAGE_VERIFY | SC_PKCS15_PRKEY_USAGE_VERIFYRECOVER },
{ SC_PKCS15INIT_X509_NON_REPUDIATION, SC_PKCS15_PRKEY_USAGE_NONREPUDIATION },
{ SC_PKCS15INIT_X509_KEY_ENCIPHERMENT, SC_PKCS15_PRKEY_USAGE_WRAP },
{ SC_PKCS15INIT_X509_DATA_ENCIPHERMENT, SC_PKCS15_PRKEY_USAGE_ENCRYPT },
{ SC_PKCS15INIT_X509_KEY_AGREEMENT, SC_PKCS15_PRKEY_USAGE_DERIVE },
{ SC_PKCS15INIT_X509_KEY_CERT_SIGN,
SC_PKCS15_PRKEY_USAGE_VERIFY | SC_PKCS15_PRKEY_USAGE_VERIFYRECOVER },
{ SC_PKCS15INIT_X509_CRL_SIGN,
SC_PKCS15_PRKEY_USAGE_VERIFY | SC_PKCS15_PRKEY_USAGE_VERIFYRECOVER }
};
static int
sc_pkcs15init_map_usage(unsigned long x509_usage, int _private)
{
unsigned int p15_usage, n, *bits;
unsigned int p15_usage = 0, n;
sc_usage_map *map;
bits = _private? x509_to_pkcs15_private_key_usage
map = _private ? x509_to_pkcs15_private_key_usage
: x509_to_pkcs15_public_key_usage;
for (n = p15_usage = 0; n < 16; n++) {
if (x509_usage & ((0x80 >> (n % 8)) << (n / 8)))
p15_usage |= bits[n];
for (n = 0; n < 16; n++) {
if (x509_usage & map[n].x509_usage)
p15_usage |= map[n].p15_usage;
}
return p15_usage;
}

View File

@ -2047,13 +2047,13 @@ parse_x509_usage(const char *list, unsigned int *res)
const char* name;
unsigned int flag;
} x509_usage_names[] = {
{ "digitalSignature", 0x0080 },
{ "nonRepudiation", 0x0040 },
{ "keyEncipherment", 0x0020 },
{ "dataEncipherment", 0x0010 },
{ "keyAgreement", 0x0008 },
{ "keyCertSign", 0x0004 },
{ "cRLSign", 0x0002 },
{ "digitalSignature", SC_PKCS15INIT_X509_DIGITAL_SIGNATURE },
{ "nonRepudiation", SC_PKCS15INIT_X509_NON_REPUDIATION },
{ "keyEncipherment", SC_PKCS15INIT_X509_KEY_ENCIPHERMENT },
{ "dataEncipherment", SC_PKCS15INIT_X509_DATA_ENCIPHERMENT },
{ "keyAgreement", SC_PKCS15INIT_X509_KEY_AGREEMENT },
{ "keyCertSign", SC_PKCS15INIT_X509_KEY_CERT_SIGN },
{ "cRLSign", SC_PKCS15INIT_X509_CRL_SIGN },
{ NULL, 0 }
};
static struct {