From 37cd955055ccd48c5d0a15425e4fa6393ee66628 Mon Sep 17 00:00:00 2001 From: sth Date: Wed, 3 Aug 2005 09:05:09 +0000 Subject: [PATCH] Allow to seach a data object by it's application OID git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@2457 c6295689-39f2-0310-b995-f0e70906c6a9 --- src/libopensc/pkcs15.c | 29 +++++++++++++++++++++++++++++ src/libopensc/pkcs15.h | 4 ++++ 2 files changed, 33 insertions(+) diff --git a/src/libopensc/pkcs15.c b/src/libopensc/pkcs15.c index 6fcc77ab..fcec893b 100644 --- a/src/libopensc/pkcs15.c +++ b/src/libopensc/pkcs15.c @@ -745,6 +745,13 @@ static int compare_obj_id(struct sc_pkcs15_object *obj, const sc_pkcs15_id_t *id return 0; } +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) + return sc_compare_oid(&((struct sc_pkcs15_data_info *) obj->data)->app_oid, app_oid); + return 0; +} + static int compare_obj_usage(sc_pkcs15_object_t *obj, unsigned int mask, unsigned int value) { void *data = obj->data; @@ -826,6 +833,8 @@ static int compare_obj_key(struct sc_pkcs15_object *obj, void *arg) if (sk->id && !compare_obj_id(obj, sk->id)) return 0; + if (sk->app_oid && !sc_obj_app_oid(obj, sk->app_oid)) + return 0; if (sk->usage_mask && !compare_obj_usage(obj, sk->usage_mask, sk->usage_value)) return 0; if (sk->flags_mask && !compare_obj_flags(obj, sk->flags_mask, sk->flags_value)) @@ -939,6 +948,26 @@ int sc_pkcs15_find_data_object_by_id(struct sc_pkcs15_card *p15card, return sc_pkcs15_find_object_by_id(p15card, SC_PKCS15_TYPE_DATA_OBJECT, id, out); } +int sc_pkcs15_find_data_object_by_app_oid(struct sc_pkcs15_card *p15card, + const struct sc_object_id *app_oid, + struct sc_pkcs15_object **out) +{ + sc_pkcs15_search_key_t sk; + int r; + + memset(&sk, 0, sizeof(sk)); + sk.app_oid = app_oid; + + r = __sc_pkcs15_search_objects(p15card, 0, SC_PKCS15_TYPE_DATA_OBJECT, + compare_obj_key, &sk, + out, 1); + if (r < 0) + return r; + if (r == 0) + return SC_ERROR_OBJECT_NOT_FOUND; + return 0; +} + int sc_pkcs15_find_prkey_by_id_usage(struct sc_pkcs15_card *p15card, const struct sc_pkcs15_id *id, unsigned int usage, diff --git a/src/libopensc/pkcs15.h b/src/libopensc/pkcs15.h index bc3e7aae..ac2f420b 100644 --- a/src/libopensc/pkcs15.h +++ b/src/libopensc/pkcs15.h @@ -439,6 +439,9 @@ int sc_pkcs15_read_data_object(struct sc_pkcs15_card *p15card, int sc_pkcs15_find_data_object_by_id(struct sc_pkcs15_card *p15card, const struct sc_pkcs15_id *id, struct sc_pkcs15_object **out); +int sc_pkcs15_find_data_object_by_app_oid(struct sc_pkcs15_card *p15card, + const struct sc_object_id *app_oid, + struct sc_pkcs15_object **out); void sc_pkcs15_free_data_object(struct sc_pkcs15_data *data_object); int sc_pkcs15_read_certificate(struct sc_pkcs15_card *card, @@ -603,6 +606,7 @@ typedef struct sc_pkcs15_search_key { unsigned int class_mask; unsigned int type; const sc_pkcs15_id_t * id; + const struct sc_object_id *app_oid; const sc_path_t * path; unsigned int usage_mask, usage_value; unsigned int flags_mask, flags_value;