From 27e105540e01f50db4f6e7f3ea6197561b52f964 Mon Sep 17 00:00:00 2001 From: okir Date: Thu, 15 May 2003 11:27:38 +0000 Subject: [PATCH] - added sc_pkcs15_find_pin_by_reference git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@1114 c6295689-39f2-0310-b995-f0e70906c6a9 --- src/libopensc/pkcs15.c | 33 +++++++++++++++++++++++++++++++++ src/libopensc/pkcs15.h | 3 +++ 2 files changed, 36 insertions(+) diff --git a/src/libopensc/pkcs15.c b/src/libopensc/pkcs15.c index 94fbcd10..fcc37a68 100644 --- a/src/libopensc/pkcs15.c +++ b/src/libopensc/pkcs15.c @@ -33,6 +33,9 @@ struct sc_pkcs15_search_key { const struct sc_pkcs15_id * id; unsigned int usage_mask, usage_value; unsigned int flags_mask, flags_value; + + unsigned int match_reference : 1; + int reference; }; static int sc_pkcs15_bind_synthetic(struct sc_pkcs15_card *); @@ -747,6 +750,21 @@ static int compare_obj_flags(sc_pkcs15_object_t *obj, unsigned int mask, unsigne return !((flags ^ value) & mask); } +static int compare_obj_reference(sc_pkcs15_object_t *obj, int value) +{ + void *data = obj->data; + int reference; + + switch (obj->type) { + case SC_PKCS15_TYPE_AUTH_PIN: + reference = ((struct sc_pkcs15_pin_info *) data)->reference; + break; + default: + return 0; + } + return reference == value; +} + static int compare_obj_key(struct sc_pkcs15_object *obj, void *arg) { struct sc_pkcs15_search_key *sk = (struct sc_pkcs15_search_key *) arg; @@ -757,6 +775,8 @@ static int compare_obj_key(struct sc_pkcs15_object *obj, void *arg) return 0; if (sk->flags_mask && !compare_obj_flags(obj, sk->flags_mask, sk->flags_value)) return 0; + if (sk->match_reference && !compare_obj_reference(obj, sk->reference)) + return 0; return 1; } @@ -814,6 +834,19 @@ int sc_pkcs15_find_pin_by_auth_id(struct sc_pkcs15_card *p15card, return find_by_id(p15card, SC_PKCS15_TYPE_AUTH_PIN, id, out); } +int sc_pkcs15_find_pin_by_reference(struct sc_pkcs15_card *p15card, + int reference, + struct sc_pkcs15_object **out) +{ + struct sc_pkcs15_search_key sk; + + memset(&sk, 0, sizeof(sk)); + sk.match_reference = 1; + sk.reference = reference; + + return find_by_key(p15card, SC_PKCS15_TYPE_AUTH_PIN, &sk, out); +} + int sc_pkcs15_find_data_object_by_id(struct sc_pkcs15_card *p15card, const struct sc_pkcs15_id *id, struct sc_pkcs15_object **out) diff --git a/src/libopensc/pkcs15.h b/src/libopensc/pkcs15.h index 573e63a0..f2b80f6f 100644 --- a/src/libopensc/pkcs15.h +++ b/src/libopensc/pkcs15.h @@ -465,6 +465,9 @@ int sc_pkcs15_unblock_pin(struct sc_pkcs15_card *card, int sc_pkcs15_find_pin_by_auth_id(struct sc_pkcs15_card *card, const struct sc_pkcs15_id *id, struct sc_pkcs15_object **out); +int sc_pkcs15_find_pin_by_reference(struct sc_pkcs15_card *card, + int reference, + struct sc_pkcs15_object **out); int sc_pkcs15_find_so_pin(struct sc_pkcs15_card *card, struct sc_pkcs15_object **out);