From 76d59158fe2b5be0095e198d398daa6cc30afc2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Ter=C3=A4s?= Date: Thu, 15 Dec 2016 14:22:08 +0200 Subject: [PATCH] pkcs15: fix and simplify object type class comparisons --- src/libopensc/pkcs15.c | 89 ++++++++++++++++-------------------------- src/libopensc/pkcs15.h | 2 +- 2 files changed, 34 insertions(+), 57 deletions(-) diff --git a/src/libopensc/pkcs15.c b/src/libopensc/pkcs15.c index ad2a0ee5..f2249db3 100644 --- a/src/libopensc/pkcs15.c +++ b/src/libopensc/pkcs15.c @@ -1369,26 +1369,16 @@ compare_obj_id(struct sc_pkcs15_object *obj, const struct sc_pkcs15_id *id) { void *data = obj->data; - switch (obj->type) { - case SC_PKCS15_TYPE_CERT_X509: + switch (obj->type & SC_PKCS15_TYPE_CLASS_MASK) { + case SC_PKCS15_TYPE_CERT: return sc_pkcs15_compare_id(&((struct sc_pkcs15_cert_info *) data)->id, id); - case SC_PKCS15_TYPE_PRKEY_RSA: - case SC_PKCS15_TYPE_PRKEY_DSA: - case SC_PKCS15_TYPE_PRKEY_GOSTR3410: - case SC_PKCS15_TYPE_PRKEY_EC: + case SC_PKCS15_TYPE_PRKEY: return sc_pkcs15_compare_id(&((struct sc_pkcs15_prkey_info *) data)->id, id); - case SC_PKCS15_TYPE_PUBKEY_RSA: - case SC_PKCS15_TYPE_PUBKEY_DSA: - case SC_PKCS15_TYPE_PUBKEY_GOSTR3410: - case SC_PKCS15_TYPE_PUBKEY_EC: + case SC_PKCS15_TYPE_PUBKEY: return sc_pkcs15_compare_id(&((struct sc_pkcs15_pubkey_info *) data)->id, id); - case SC_PKCS15_TYPE_SKEY_DES: - case SC_PKCS15_TYPE_SKEY_2DES: - case SC_PKCS15_TYPE_SKEY_3DES: + case SC_PKCS15_TYPE_SKEY: return sc_pkcs15_compare_id(&((struct sc_pkcs15_skey_info *) data)->id, id); - case SC_PKCS15_TYPE_AUTH_PIN: - case SC_PKCS15_TYPE_AUTH_BIO: - case SC_PKCS15_TYPE_AUTH_AUTHKEY: + case SC_PKCS15_TYPE_AUTH: return sc_pkcs15_compare_id(&((struct sc_pkcs15_auth_info *) data)->auth_id, id); case SC_PKCS15_TYPE_DATA_OBJECT: return sc_pkcs15_compare_id(&((struct sc_pkcs15_data_info *) data)->id, id); @@ -1400,7 +1390,7 @@ compare_obj_id(struct sc_pkcs15_object *obj, const struct sc_pkcs15_id *id) static int sc_obj_app_oid(struct sc_pkcs15_object *obj, const struct sc_object_id *app_oid) { - if (obj->type & SC_PKCS15_TYPE_DATA_OBJECT) + if ((obj->type & SC_PKCS15_TYPE_CLASS_MASK) == SC_PKCS15_TYPE_DATA_OBJECT) return sc_compare_oid(&((struct sc_pkcs15_data_info *) obj->data)->app_oid, app_oid); return 0; } @@ -1412,17 +1402,11 @@ compare_obj_usage(struct sc_pkcs15_object *obj, unsigned int mask, unsigned int void *data = obj->data; unsigned int usage; - switch (obj->type) { - case SC_PKCS15_TYPE_PRKEY_RSA: - case SC_PKCS15_TYPE_PRKEY_DSA: - case SC_PKCS15_TYPE_PRKEY_GOSTR3410: - case SC_PKCS15_TYPE_PRKEY_EC: + switch (obj->type & SC_PKCS15_TYPE_CLASS_MASK) { + case SC_PKCS15_TYPE_PRKEY: usage = ((struct sc_pkcs15_prkey_info *) data)->usage; break; - case SC_PKCS15_TYPE_PUBKEY_RSA: - case SC_PKCS15_TYPE_PUBKEY_DSA: - case SC_PKCS15_TYPE_PUBKEY_GOSTR3410: - case SC_PKCS15_TYPE_PUBKEY_EC: + case SC_PKCS15_TYPE_PUBKEY: usage = ((struct sc_pkcs15_pubkey_info *) data)->usage; break; default: @@ -1438,7 +1422,7 @@ compare_obj_flags(struct sc_pkcs15_object *obj, unsigned int mask, unsigned int struct sc_pkcs15_auth_info *auth_info; unsigned int flags; - switch (obj->type) { + switch (obj->type & SC_PKCS15_TYPE_CLASS_MASK) { case SC_PKCS15_TYPE_AUTH_PIN: auth_info = (struct sc_pkcs15_auth_info *) obj->data; if (auth_info->auth_type != SC_PKCS15_PIN_AUTH_TYPE_PIN) @@ -1459,17 +1443,14 @@ compare_obj_reference(struct sc_pkcs15_object *obj, int value) void *data = obj->data; int reference; - switch (obj->type) { + switch (obj->type & SC_PKCS15_TYPE_CLASS_MASK) { case SC_PKCS15_TYPE_AUTH_PIN: auth_info = (struct sc_pkcs15_auth_info *) obj->data; if (auth_info->auth_type != SC_PKCS15_PIN_AUTH_TYPE_PIN) return 0; reference = auth_info->attrs.pin.reference; break; - case SC_PKCS15_TYPE_PRKEY_RSA: - case SC_PKCS15_TYPE_PRKEY_DSA: - case SC_PKCS15_TYPE_PRKEY_GOSTR3410: - case SC_PKCS15_TYPE_PRKEY_EC: + case SC_PKCS15_TYPE_PRKEY: reference = ((struct sc_pkcs15_prkey_info *) data)->key_reference; break; default: @@ -1484,19 +1465,15 @@ compare_obj_path(struct sc_pkcs15_object *obj, const struct sc_path *path) { void *data = obj->data; - switch (obj->type) { - case SC_PKCS15_TYPE_CERT_X509: - return sc_compare_path(&((struct sc_pkcs15_cert_info *) data)->path, path); - case SC_PKCS15_TYPE_PRKEY_RSA: - case SC_PKCS15_TYPE_PRKEY_DSA: - case SC_PKCS15_TYPE_PRKEY_GOSTR3410: - case SC_PKCS15_TYPE_PRKEY_EC: + switch (obj->type & SC_PKCS15_TYPE_CLASS_MASK) { + case SC_PKCS15_TYPE_PRKEY: return sc_compare_path(&((struct sc_pkcs15_prkey_info *) data)->path, path); - case SC_PKCS15_TYPE_PUBKEY_RSA: - case SC_PKCS15_TYPE_PUBKEY_DSA: - case SC_PKCS15_TYPE_PUBKEY_GOSTR3410: - case SC_PKCS15_TYPE_PUBKEY_EC: + case SC_PKCS15_TYPE_PUBKEY: return sc_compare_path(&((struct sc_pkcs15_pubkey_info *) data)->path, path); + case SC_PKCS15_TYPE_SKEY: + return sc_compare_path(&((struct sc_pkcs15_skey_info *) data)->path, path); + case SC_PKCS15_TYPE_CERT: + return sc_compare_path(&((struct sc_pkcs15_cert_info *) data)->path, path); case SC_PKCS15_TYPE_AUTH_PIN: return sc_compare_path(&((struct sc_pkcs15_auth_info *) data)->path, path); case SC_PKCS15_TYPE_DATA_OBJECT: @@ -2622,13 +2599,16 @@ sc_pkcs15_add_supported_algo_ref(struct sc_pkcs15_object *obj, struct sc_support if (!algo) return SC_SUCCESS; - switch (obj->type) { - case SC_PKCS15_TYPE_PRKEY_RSA: + switch (obj->type & SC_PKCS15_TYPE_CLASS_MASK) { + case SC_PKCS15_TYPE_PRKEY: algo_refs = ((struct sc_pkcs15_prkey_info *)obj->data)->algo_refs; break; - case SC_PKCS15_TYPE_PUBKEY_RSA: + case SC_PKCS15_TYPE_PUBKEY: algo_refs = ((struct sc_pkcs15_pubkey_info *)obj->data)->algo_refs; break; + case SC_PKCS15_TYPE_SKEY: + algo_refs = ((struct sc_pkcs15_skey_info *)obj->data)->algo_refs; + break; } if (!algo_refs) return SC_ERROR_NOT_SUPPORTED; @@ -2654,22 +2634,19 @@ sc_pkcs15_get_object_id(const struct sc_pkcs15_object *obj, struct sc_pkcs15_id if (!obj || !out) return SC_ERROR_INVALID_ARGUMENTS; - switch (obj->type) { - case SC_PKCS15_TYPE_CERT_X509: + switch (obj->type & SC_PKCS15_TYPE_CLASS_MASK) { + case SC_PKCS15_TYPE_CERT: *out = ((struct sc_pkcs15_cert_info *) obj->data)->id; break; - case SC_PKCS15_TYPE_PRKEY_RSA: - case SC_PKCS15_TYPE_PRKEY_DSA: - case SC_PKCS15_TYPE_PRKEY_GOSTR3410: - case SC_PKCS15_TYPE_PRKEY_EC: + case SC_PKCS15_TYPE_PRKEY: *out = ((struct sc_pkcs15_prkey_info *) obj->data)->id; break; - case SC_PKCS15_TYPE_PUBKEY_RSA: - case SC_PKCS15_TYPE_PUBKEY_DSA: - case SC_PKCS15_TYPE_PUBKEY_GOSTR3410: - case SC_PKCS15_TYPE_PUBKEY_EC: + case SC_PKCS15_TYPE_PUBKEY: *out = ((struct sc_pkcs15_pubkey_info *) obj->data)->id; break; + case SC_PKCS15_TYPE_SKEY: + *out = ((struct sc_pkcs15_skey_info *) obj->data)->id; + break; case SC_PKCS15_TYPE_AUTH_PIN: *out = ((struct sc_pkcs15_auth_info *) obj->data)->auth_id; break; diff --git a/src/libopensc/pkcs15.h b/src/libopensc/pkcs15.h index 84f13056..1199ca83 100644 --- a/src/libopensc/pkcs15.h +++ b/src/libopensc/pkcs15.h @@ -423,7 +423,7 @@ struct sc_pkcs15_skey_info { int native, key_reference; size_t value_len; unsigned long key_type; - int algo_refs[SC_MAX_SUPPORTED_ALGORITHMS]; + unsigned int algo_refs[SC_MAX_SUPPORTED_ALGORITHMS]; struct sc_path path; /* if on card */ struct sc_pkcs15_der data; };