From 9ac41205945f2a47e5b7e16c14a16ddcf4159e0e Mon Sep 17 00:00:00 2001 From: Viktor Tarasov Date: Tue, 5 Apr 2016 19:44:37 +0200 Subject: [PATCH] pkcs15: 'aid' argument for emulator init Allows to PKCS#15 emulator to bind more then one application --- src/libopensc/Makefile.am | 4 +- src/libopensc/Makefile.mak | 2 +- src/libopensc/pkcs15-actalis.c | 5 +- src/libopensc/pkcs15-atrust-acos.c | 3 +- src/libopensc/pkcs15-dnie.c | 1 + src/libopensc/pkcs15-esinit.c | 3 +- src/libopensc/pkcs15-esteid.c | 3 +- src/libopensc/pkcs15-gemsafeGPK.c | 4 +- src/libopensc/pkcs15-gemsafeV1.c | 3 +- src/libopensc/pkcs15-gids.c | 2 + src/libopensc/pkcs15-iasecc.c | 78 +++++ src/libopensc/pkcs15-infocamere.c | 3 +- src/libopensc/pkcs15-itacns.c | 7 +- src/libopensc/pkcs15-oberthur.c | 458 ++++++++++++++--------------- src/libopensc/pkcs15-openpgp.c | 4 +- src/libopensc/pkcs15-piv.c | 6 +- src/libopensc/pkcs15-postecert.c | 3 +- src/libopensc/pkcs15-pteid.c | 4 +- src/libopensc/pkcs15-sc-hsm.c | 1 + src/libopensc/pkcs15-starcert.c | 3 +- src/libopensc/pkcs15-syn.c | 110 ++----- src/libopensc/pkcs15-syn.h | 63 ++++ src/libopensc/pkcs15-tccardos.c | 2 + src/libopensc/pkcs15-tcos.c | 2 + src/libopensc/pkcs15-westcos.c | 3 +- src/libopensc/pkcs15.c | 19 +- src/libopensc/pkcs15.h | 2 +- 27 files changed, 454 insertions(+), 344 deletions(-) create mode 100644 src/libopensc/pkcs15-iasecc.c create mode 100644 src/libopensc/pkcs15-syn.h diff --git a/src/libopensc/Makefile.am b/src/libopensc/Makefile.am index 48c2626d..9d0ad08b 100644 --- a/src/libopensc/Makefile.am +++ b/src/libopensc/Makefile.am @@ -6,7 +6,7 @@ EXTRA_DIST = Makefile.mak lib_LTLIBRARIES = libopensc.la noinst_HEADERS = cards.h ctbcs.h internal.h esteid.h muscle.h muscle-filesystem.h \ - internal-winscard.h p15card-helper.h \ + internal-winscard.h p15card-helper.h pkcs15-syn.h \ opensc.h pkcs15.h \ cardctl.h asn1.h log.h \ errors.h types.h compression.h itacns.h iso7816.h \ @@ -48,7 +48,7 @@ libopensc_la_SOURCES = \ pkcs15-actalis.c pkcs15-atrust-acos.c pkcs15-tccardos.c pkcs15-piv.c \ pkcs15-esinit.c pkcs15-westcos.c pkcs15-pteid.c pkcs15-oberthur.c \ pkcs15-itacns.c pkcs15-gemsafeV1.c pkcs15-sc-hsm.c \ - pkcs15-dnie.c pkcs15-gids.c \ + pkcs15-dnie.c pkcs15-gids.c pkcs15-iasecc.c \ compression.c p15card-helper.c sm.c \ aux-data.c \ libopensc.exports diff --git a/src/libopensc/Makefile.mak b/src/libopensc/Makefile.mak index 845ca39b..a3ad40ea 100644 --- a/src/libopensc/Makefile.mak +++ b/src/libopensc/Makefile.mak @@ -31,7 +31,7 @@ OBJECTS = \ pkcs15-actalis.obj pkcs15-atrust-acos.obj pkcs15-tccardos.obj pkcs15-piv.obj \ pkcs15-esinit.obj pkcs15-westcos.obj pkcs15-pteid.obj pkcs15-oberthur.obj \ pkcs15-itacns.obj pkcs15-gemsafeV1.obj pkcs15-sc-hsm.obj \ - pkcs15-dnie.obj pkcs15-gids.obj \ + pkcs15-dnie.obj pkcs15-gids.obj pkcs15-iasecc.obj \ compression.obj p15card-helper.obj sm.obj \ aux-data.obj \ $(TOPDIR)\win32\versioninfo.res diff --git a/src/libopensc/pkcs15-actalis.c b/src/libopensc/pkcs15-actalis.c index 9391418a..bbe53a09 100644 --- a/src/libopensc/pkcs15-actalis.c +++ b/src/libopensc/pkcs15-actalis.c @@ -37,7 +37,7 @@ #include "libopensc/pkcs15.h" #include "libopensc/log.h" -int sc_pkcs15emu_actalis_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_actalis_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); static int (*set_security_env) (sc_card_t *, const sc_security_env_t *, int); @@ -306,7 +306,8 @@ static int actalis_detect_card(sc_pkcs15_card_t * p15card) } int sc_pkcs15emu_actalis_init_ex(sc_pkcs15_card_t * p15card, - sc_pkcs15emu_opt_t * opts) + struct sc_aid *aid, + sc_pkcs15emu_opt_t * opts) { if (opts && opts->flags & SC_PKCS15EMU_FLAGS_NO_CHECK) return sc_pkcs15emu_actalis_init(p15card); diff --git a/src/libopensc/pkcs15-atrust-acos.c b/src/libopensc/pkcs15-atrust-acos.c index 69bdb50e..f3b44b86 100644 --- a/src/libopensc/pkcs15-atrust-acos.c +++ b/src/libopensc/pkcs15-atrust-acos.c @@ -34,7 +34,7 @@ #define MANU_ID "A-Trust" #define CARD_LABEL "a.sign Premium a" -int sc_pkcs15emu_atrust_acos_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_atrust_acos_init_ex(sc_pkcs15_card_t *, struct sc_aid *aid, sc_pkcs15emu_opt_t *); typedef struct cdata_st { const char *label; @@ -265,6 +265,7 @@ static int sc_pkcs15emu_atrust_acos_init(sc_pkcs15_card_t *p15card) } int sc_pkcs15emu_atrust_acos_init_ex(sc_pkcs15_card_t *p15card, + struct sc_aid *aid, sc_pkcs15emu_opt_t *opts) { diff --git a/src/libopensc/pkcs15-dnie.c b/src/libopensc/pkcs15-dnie.c index d521f994..edccdf8a 100644 --- a/src/libopensc/pkcs15-dnie.c +++ b/src/libopensc/pkcs15-dnie.c @@ -261,6 +261,7 @@ static int sc_pkcs15emu_dnie_init(sc_pkcs15_card_t * p15card) /* public functions for in-built module */ /****************************************/ int sc_pkcs15emu_dnie_init_ex(sc_pkcs15_card_t * p15card, + struct sc_aid *aid, sc_pkcs15emu_opt_t * opts) { int r=SC_SUCCESS; diff --git a/src/libopensc/pkcs15-esinit.c b/src/libopensc/pkcs15-esinit.c index cabdb47e..e4749461 100644 --- a/src/libopensc/pkcs15-esinit.c +++ b/src/libopensc/pkcs15-esinit.c @@ -29,7 +29,7 @@ #define MANU_ID "entersafe" -int sc_pkcs15emu_entersafe_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_entersafe_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); static int entersafe_detect_card( sc_pkcs15_card_t *p15card) { @@ -77,6 +77,7 @@ static int sc_pkcs15emu_entersafe_init( sc_pkcs15_card_t *p15card) } int sc_pkcs15emu_entersafe_init_ex(sc_pkcs15_card_t *p15card, + struct sc_aid *aid, sc_pkcs15emu_opt_t *opts) { SC_FUNC_CALLED(p15card->card->ctx, SC_LOG_DEBUG_VERBOSE); diff --git a/src/libopensc/pkcs15-esteid.c b/src/libopensc/pkcs15-esteid.c index 3b4062f3..7bbba7e8 100644 --- a/src/libopensc/pkcs15-esteid.c +++ b/src/libopensc/pkcs15-esteid.c @@ -39,7 +39,7 @@ #include "pkcs15.h" #include "esteid.h" -int sc_pkcs15emu_esteid_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_esteid_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); static void set_string (char **strp, const char *value) @@ -269,6 +269,7 @@ static int esteid_detect_card(sc_pkcs15_card_t *p15card) } int sc_pkcs15emu_esteid_init_ex(sc_pkcs15_card_t *p15card, + struct sc_aid *aid, sc_pkcs15emu_opt_t *opts) { diff --git a/src/libopensc/pkcs15-gemsafeGPK.c b/src/libopensc/pkcs15-gemsafeGPK.c index 006c488d..abf92df6 100644 --- a/src/libopensc/pkcs15-gemsafeGPK.c +++ b/src/libopensc/pkcs15-gemsafeGPK.c @@ -35,7 +35,7 @@ #define MANU_ID "GemSAFE on GPK16000" -int sc_pkcs15emu_gemsafeGPK_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_gemsafeGPK_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); static int (*pin_cmd_save)(struct sc_card *, struct sc_pin_cmd_data *, int *tries_left); @@ -506,7 +506,7 @@ static int sc_pkcs15emu_gemsafeGPK_init(sc_pkcs15_card_t *p15card) return SC_SUCCESS; } -int sc_pkcs15emu_gemsafeGPK_init_ex(sc_pkcs15_card_t *p15card, +int sc_pkcs15emu_gemsafeGPK_init_ex(sc_pkcs15_card_t *p15card, struct sc_aid *aid, sc_pkcs15emu_opt_t *opts) { sc_card_t *card = p15card->card; diff --git a/src/libopensc/pkcs15-gemsafeV1.c b/src/libopensc/pkcs15-gemsafeV1.c index 43858f13..ac7dab7a 100644 --- a/src/libopensc/pkcs15-gemsafeV1.c +++ b/src/libopensc/pkcs15-gemsafeV1.c @@ -40,7 +40,7 @@ #define GEMSAFE_READ_QUANTUM 248 #define GEMSAFE_MAX_OBJLEN 28672 -int sc_pkcs15emu_gemsafeV1_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_gemsafeV1_init_ex(sc_pkcs15_card_t *, struct sc_aid *,sc_pkcs15emu_opt_t *); static int sc_pkcs15emu_add_cert(sc_pkcs15_card_t *p15card, @@ -434,6 +434,7 @@ static int sc_pkcs15emu_gemsafeV1_init( sc_pkcs15_card_t *p15card) } int sc_pkcs15emu_gemsafeV1_init_ex( sc_pkcs15_card_t *p15card, + struct sc_aid *aid, sc_pkcs15emu_opt_t *opts) { if (opts && opts->flags & SC_PKCS15EMU_FLAGS_NO_CHECK) diff --git a/src/libopensc/pkcs15-gids.c b/src/libopensc/pkcs15-gids.c index ef6fea2e..f0eed06f 100644 --- a/src/libopensc/pkcs15-gids.c +++ b/src/libopensc/pkcs15-gids.c @@ -221,6 +221,7 @@ static int sc_pkcs15emu_gids_init (sc_pkcs15_card_t * p15card) } int sc_pkcs15emu_gids_init_ex(sc_pkcs15_card_t *p15card, + struct sc_aid *aid, sc_pkcs15emu_opt_t *opts) { if (opts && (opts->flags & SC_PKCS15EMU_FLAGS_NO_CHECK)) { @@ -236,6 +237,7 @@ int sc_pkcs15emu_gids_init_ex(sc_pkcs15_card_t *p15card, #else int sc_pkcs15emu_gids_init_ex(sc_pkcs15_card_t *p15card, + struct sc_aid *aid, sc_pkcs15emu_opt_t *opts) { return SC_ERROR_WRONG_CARD; diff --git a/src/libopensc/pkcs15-iasecc.c b/src/libopensc/pkcs15-iasecc.c new file mode 100644 index 00000000..8e8cd3c0 --- /dev/null +++ b/src/libopensc/pkcs15-iasecc.c @@ -0,0 +1,78 @@ +/* + * PKCS15 emulation layer for IAS/ECC card. + * + * Copyright (C) 2016, Viktor Tarasov + * Copyright (C) 2004, Bud P. Bruegger + * Copyright (C) 2004, Antonino Iacono + * Copyright (C) 2003, Olaf Kirch + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#ifdef ENABLE_OPENSSL +#include +#endif + +#include "internal.h" +#include "pkcs15.h" + +int sc_pkcs15emu_iasecc_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); + + +static int +sc_pkcs15emu_iasecc_init (struct sc_pkcs15_card *p15card, struct sc_aid *aid) +{ + struct sc_context *ctx = p15card->card->ctx; + int rv; + + LOG_FUNC_CALLED(ctx); + + rv = sc_pkcs15_bind_internal(p15card, aid); + + LOG_FUNC_RETURN(ctx, rv); +} + + +static int +iasecc_detect_card(sc_pkcs15_card_t *p15card) +{ + if (p15card->card->type < SC_CARD_TYPE_IASECC_BASE) + return SC_ERROR_WRONG_CARD; + + if (p15card->card->type > SC_CARD_TYPE_IASECC_BASE + 10) + return SC_ERROR_WRONG_CARD; + + return SC_SUCCESS; +} + + +int +sc_pkcs15emu_iasecc_init_ex(struct sc_pkcs15_card *p15card, struct sc_aid *aid, struct sc_pkcs15emu_opt *opts) +{ + if (opts && opts->flags & SC_PKCS15EMU_FLAGS_NO_CHECK) + return sc_pkcs15emu_iasecc_init(p15card, aid); + + if (iasecc_detect_card(p15card)) + return SC_ERROR_WRONG_CARD; + + return sc_pkcs15emu_iasecc_init(p15card, aid); +} diff --git a/src/libopensc/pkcs15-infocamere.c b/src/libopensc/pkcs15-infocamere.c index c89fc657..6326b988 100644 --- a/src/libopensc/pkcs15-infocamere.c +++ b/src/libopensc/pkcs15-infocamere.c @@ -36,7 +36,7 @@ #include "pkcs15.h" #include "log.h" -int sc_pkcs15emu_infocamere_init_ex(sc_pkcs15_card_t *, +int sc_pkcs15emu_infocamere_init_ex(sc_pkcs15_card_t *, struct sc_aid *aid, sc_pkcs15emu_opt_t *); static int (*set_security_env) (sc_card_t *, const sc_security_env_t *, @@ -822,6 +822,7 @@ static int infocamere_detect_card(sc_pkcs15_card_t * p15card) } int sc_pkcs15emu_infocamere_init_ex(sc_pkcs15_card_t * p15card, + struct sc_aid *aid, sc_pkcs15emu_opt_t * opts) { diff --git a/src/libopensc/pkcs15-itacns.c b/src/libopensc/pkcs15-itacns.c index 02107cdf..cdb10862 100644 --- a/src/libopensc/pkcs15-itacns.c +++ b/src/libopensc/pkcs15-itacns.c @@ -44,8 +44,7 @@ #include #endif -int sc_pkcs15emu_itacns_init_ex(sc_pkcs15_card_t *, - sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_itacns_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); static const char path_serial[] = "10001003"; @@ -847,8 +846,8 @@ static int itacns_init(sc_pkcs15_card_t *p15card) return r; } -int sc_pkcs15emu_itacns_init_ex(sc_pkcs15_card_t *p15card, - sc_pkcs15emu_opt_t *opts) +int sc_pkcs15emu_itacns_init_ex(sc_pkcs15_card_t *p15card, struct sc_aid *aid, + sc_pkcs15emu_opt_t *opts) { sc_card_t *card = p15card->card; SC_FUNC_CALLED(card->ctx, 1); diff --git a/src/libopensc/pkcs15-oberthur.c b/src/libopensc/pkcs15-oberthur.c index db849930..49df9f4e 100644 --- a/src/libopensc/pkcs15-oberthur.c +++ b/src/libopensc/pkcs15-oberthur.c @@ -25,7 +25,7 @@ #ifdef HAVE_CONFIG_H #include #endif - + #include #include #include @@ -65,7 +65,7 @@ #define PIN_DOMAIN_LABEL "SCM" const unsigned char PinDomainID[3] = {0x53, 0x43, 0x4D}; - + #define AWP_PIN_DF "3F005011" #define AWP_TOKEN_INFO "3F0050111000" #define AWP_PUK_FILE "3F0050112000" @@ -91,7 +91,7 @@ static int sc_pkcs15emu_oberthur_add_pubkey(struct sc_pkcs15_card *, unsigned, u static int sc_pkcs15emu_oberthur_add_cert(struct sc_pkcs15_card *, unsigned); static int sc_pkcs15emu_oberthur_add_data(struct sc_pkcs15_card *, unsigned, unsigned, int); -int sc_pkcs15emu_oberthur_init_ex(struct sc_pkcs15_card *, struct sc_pkcs15emu_opt *); +int sc_pkcs15emu_oberthur_init_ex(struct sc_pkcs15_card *, struct sc_aid *, struct sc_pkcs15emu_opt *); static int sc_oberthur_parse_tokeninfo (struct sc_pkcs15_card *, unsigned char *, size_t, int); static int sc_oberthur_parse_containers (struct sc_pkcs15_card *, unsigned char *, size_t, int); @@ -162,7 +162,7 @@ sc_oberthur_decode_usage(unsigned flags) } -static int +static int sc_oberthur_get_friends (unsigned int id, struct crypto_container *ccont) { struct container *cont; @@ -173,14 +173,14 @@ sc_oberthur_get_friends (unsigned int id, struct crypto_container *ccont) memcpy(ccont, &cont->exchange, sizeof(struct crypto_container)); break; } - + if (cont->sign.id_pub == id || cont->sign.id_prv == id || cont->sign.id_cert == id) { if (ccont) memcpy(ccont, &cont->sign, sizeof(struct crypto_container)); break; } } - + return cont ? 0 : SC_ERROR_TEMPLATE_NOT_FOUND; } @@ -191,7 +191,7 @@ sc_oberthur_get_certificate_authority(struct sc_pkcs15_der *der, int *out_author #ifdef ENABLE_OPENSSL X509 *x; BUF_MEM buf_mem; - BIO *bio = NULL; + BIO *bio = NULL; BASIC_CONSTRAINTS *bs = NULL; if (!der) @@ -204,20 +204,20 @@ sc_oberthur_get_certificate_authority(struct sc_pkcs15_der *der, int *out_author memcpy(buf_mem.data, der->value, der->len); buf_mem.max = buf_mem.length = der->len; - bio = BIO_new(BIO_s_mem()); + bio = BIO_new(BIO_s_mem()); if(!bio) return SC_ERROR_OUT_OF_MEMORY; - + BIO_set_mem_buf(bio, &buf_mem, BIO_NOCLOSE); x = d2i_X509_bio(bio, 0); BIO_free(bio); if (!x) return SC_ERROR_INVALID_DATA; - + bs = (BASIC_CONSTRAINTS *)X509_get_ext_d2i(x, NID_basic_constraints, NULL, NULL); if (out_authority) *out_authority = (bs && bs->ca); - + X509_free(x); return SC_SUCCESS; @@ -227,8 +227,8 @@ sc_oberthur_get_certificate_authority(struct sc_pkcs15_der *der, int *out_author } -static int -sc_oberthur_read_file(struct sc_pkcs15_card *p15card, const char *in_path, +static int +sc_oberthur_read_file(struct sc_pkcs15_card *p15card, const char *in_path, unsigned char **out, size_t *out_len, int verify_pin) { @@ -239,27 +239,27 @@ sc_oberthur_read_file(struct sc_pkcs15_card *p15card, const char *in_path, size_t sz; int rv; - SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_VERBOSE); + LOG_FUNC_CALLED(ctx); if (!in_path || !out || !out_len) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_INVALID_ARGUMENTS, "Cannot read oberthur file"); - - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "read file '%s'; verify_pin:%i", in_path, verify_pin); - + LOG_TEST_RET(ctx, SC_ERROR_INVALID_ARGUMENTS, "Cannot read oberthur file"); + + sc_log(ctx, "read file '%s'; verify_pin:%i", in_path, verify_pin); + *out = NULL; *out_len = 0; - + sc_format_path(in_path, &path); rv = sc_select_file(card, &path, &file); - SC_TEST_RET(card->ctx, SC_LOG_DEBUG_NORMAL, rv, "Cannot select oberthur file to read"); + LOG_TEST_RET(ctx, rv, "Cannot select oberthur file to read"); if (file->ef_structure == SC_FILE_EF_TRANSPARENT) sz = file->size; else sz = (file->record_length + 2) * file->record_count; - + *out = calloc(sz, 1); if (*out == NULL) - SC_TEST_RET(card->ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_OUT_OF_MEMORY, "Cannot read oberthur file"); + LOG_TEST_RET(ctx, SC_ERROR_OUT_OF_MEMORY, "Cannot read oberthur file"); if (file->ef_structure == SC_FILE_EF_TRANSPARENT) { rv = sc_read_binary(card, 0, *out, sz, 0); @@ -268,7 +268,7 @@ sc_oberthur_read_file(struct sc_pkcs15_card *p15card, const char *in_path, int rec; int offs = 0; int rec_len = file->record_length; - + for (rec = 1; ; rec++) { rv = sc_read_record(card, rec, *out + offs + 2, rec_len, SC_RECORD_BY_REC_NR); if (rv == SC_ERROR_RECORD_NOT_FOUND) { @@ -279,29 +279,29 @@ sc_oberthur_read_file(struct sc_pkcs15_card *p15card, const char *in_path, break; } - rec_len = rv; - + rec_len = rv; + *(*out + offs) = 'R'; *(*out + offs + 1) = rv; - + offs += rv + 2; } sz = offs; } - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "read oberthur file result %i", rv); + sc_log(ctx, "read oberthur file result %i", rv); if (verify_pin && rv == SC_ERROR_SECURITY_STATUS_NOT_SATISFIED) { struct sc_pkcs15_object *objs[0x10], *pin_obj = NULL; const struct sc_acl_entry *acl = sc_file_get_acl_entry(file, SC_AC_OP_READ); int ii; rv = sc_pkcs15_get_objects(p15card, SC_PKCS15_TYPE_AUTH_PIN, objs, 0x10); - SC_TEST_RET(card->ctx, SC_LOG_DEBUG_NORMAL, rv, "Cannot read oberthur file: get AUTH objects error"); + LOG_TEST_RET(ctx, rv, "Cannot read oberthur file: get AUTH objects error"); for (ii=0; iidata; - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "compare PIN/ACL refs:%i/%i, method:%i/%i", + sc_log(ctx, "compare PIN/ACL refs:%i/%i, method:%i/%i", auth_info->attrs.pin.reference, acl->key_ref, auth_info->auth_method, acl->method); if (auth_info->attrs.pin.reference == (int)acl->key_ref && auth_info->auth_method == (unsigned)acl->method) { pin_obj = objs[ii]; @@ -318,7 +318,7 @@ sc_oberthur_read_file(struct sc_pkcs15_card *p15card, const char *in_path, rv = sc_oberthur_read_file(p15card, in_path, out, out_len, 0); } }; - + sc_file_free(file); if (rv < 0) { @@ -329,12 +329,12 @@ sc_oberthur_read_file(struct sc_pkcs15_card *p15card, const char *in_path, *out_len = sz; - SC_FUNC_RETURN(card->ctx, SC_LOG_DEBUG_NORMAL, rv); + LOG_FUNC_RETURN(ctx, rv); } -static int -sc_oberthur_parse_tokeninfo (struct sc_pkcs15_card *p15card, +static int +sc_oberthur_parse_tokeninfo (struct sc_pkcs15_card *p15card, unsigned char *buff, size_t len, int postpone_allowed) { struct sc_context *ctx = p15card->card->ctx; @@ -342,9 +342,9 @@ sc_oberthur_parse_tokeninfo (struct sc_pkcs15_card *p15card, unsigned flags; int ii; - SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_VERBOSE); + LOG_FUNC_CALLED(ctx); if (!buff || len < 0x24) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_INVALID_ARGUMENTS, "Cannot parse token info"); + LOG_TEST_RET(ctx, SC_ERROR_INVALID_ARGUMENTS, "Cannot parse token info"); memset(label, 0, sizeof(label)); @@ -355,28 +355,28 @@ sc_oberthur_parse_tokeninfo (struct sc_pkcs15_card *p15card, *(label + ii + 1) = '\0'; flags = *(buff + 0x22) * 0x100 + *(buff + 0x23); - + p15card->tokeninfo->label = strdup(label); p15card->tokeninfo->manufacturer_id = strdup("Oberthur/OpenSC"); if (flags & 0x01) p15card->tokeninfo->flags |= SC_PKCS15_TOKEN_PRN_GENERATION; - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "label %s", p15card->tokeninfo->label); - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "manufacturer_id %s", p15card->tokeninfo->manufacturer_id); - - SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, SC_SUCCESS); + sc_log(ctx, "label %s", p15card->tokeninfo->label); + sc_log(ctx, "manufacturer_id %s", p15card->tokeninfo->manufacturer_id); + + LOG_FUNC_RETURN(ctx, SC_SUCCESS); } -static int -sc_oberthur_parse_containers (struct sc_pkcs15_card *p15card, +static int +sc_oberthur_parse_containers (struct sc_pkcs15_card *p15card, unsigned char *buff, size_t len, int postpone_allowed) { struct sc_context *ctx = p15card->card->ctx; size_t offs; - - SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_VERBOSE); + + LOG_FUNC_CALLED(ctx); while (Containers) { struct container *next = Containers->next; @@ -388,27 +388,27 @@ sc_oberthur_parse_containers (struct sc_pkcs15_card *p15card, for (offs=0; offs < len;) { struct container *cont; unsigned char *ptr = buff + offs + 2; - - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "parse contaniers offs:%i, len:%i", offs, len); + + sc_log(ctx, "parse contaniers offs:%i, len:%i", offs, len); if (*(buff + offs) != 'R') return SC_ERROR_INVALID_DATA; - + cont = (struct container *)calloc(sizeof(struct container), 1); if (!cont) return SC_ERROR_OUT_OF_MEMORY; - + cont->exchange.id_pub = *ptr * 0x100 + *(ptr + 1); ptr += 2; cont->exchange.id_prv = *ptr * 0x100 + *(ptr + 1); ptr += 2; cont->exchange.id_cert = *ptr * 0x100 + *(ptr + 1); ptr += 2; - + cont->sign.id_pub = *ptr * 0x100 + *(ptr + 1); ptr += 2; cont->sign.id_prv = *ptr * 0x100 + *(ptr + 1); ptr += 2; cont->sign.id_cert = *ptr * 0x100 + *(ptr + 1); ptr += 2; - + memcpy(cont->uuid, ptr + 2, 36); - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "UUID: %s; 0x%X, 0x%X, 0x%X", cont->uuid, + sc_log(ctx, "UUID: %s; 0x%X, 0x%X, 0x%X", cont->uuid, cont->exchange.id_pub, cont->exchange.id_prv, cont->exchange.id_cert); - + if (!Containers) { Containers = cont; } @@ -417,59 +417,59 @@ sc_oberthur_parse_containers (struct sc_pkcs15_card *p15card, Containers->prev = (void *)cont; Containers = cont; } - + offs += *(buff + offs + 1) + 2; } - SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, SC_SUCCESS); + LOG_FUNC_RETURN(ctx, SC_SUCCESS); } -static int -sc_oberthur_parse_publicinfo (struct sc_pkcs15_card *p15card, +static int +sc_oberthur_parse_publicinfo (struct sc_pkcs15_card *p15card, unsigned char *buff, size_t len, int postpone_allowed) { struct sc_context *ctx = p15card->card->ctx; size_t ii; int rv; - SC_FUNC_CALLED(p15card->card->ctx, SC_LOG_DEBUG_VERBOSE); + LOG_FUNC_CALLED(ctx); for (ii=0; iicard->ctx, SC_LOG_DEBUG_NORMAL, "add public object(file-id:%04X,size:%X)", file_id, size); + sc_log(ctx, "add public object(file-id:%04X,size:%X)", file_id, size); switch (*(buff+ii + 1)) { case BASE_ID_PUB_RSA : rv = sc_pkcs15emu_oberthur_add_pubkey(p15card, file_id, size); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Cannot parse public key info"); + LOG_TEST_RET(ctx, rv, "Cannot parse public key info"); break; case BASE_ID_CERT : rv = sc_pkcs15emu_oberthur_add_cert(p15card, file_id); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Cannot parse certificate info"); + LOG_TEST_RET(ctx, rv, "Cannot parse certificate info"); break; case BASE_ID_PUB_DES : break; case BASE_ID_PUB_DATA : rv = sc_pkcs15emu_oberthur_add_data(p15card, file_id, size, 0); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Cannot parse data info"); + LOG_TEST_RET(ctx, rv, "Cannot parse data info"); break; default: - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Public object parse error"); + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Public object parse error"); } } - SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, SC_SUCCESS); + LOG_FUNC_RETURN(ctx, SC_SUCCESS); } -static int -sc_oberthur_parse_privateinfo (struct sc_pkcs15_card *p15card, +static int +sc_oberthur_parse_privateinfo (struct sc_pkcs15_card *p15card, unsigned char *buff, size_t len, int postpone_allowed) { struct sc_context *ctx = p15card->card->ctx; @@ -477,17 +477,17 @@ sc_oberthur_parse_privateinfo (struct sc_pkcs15_card *p15card, int rv; int no_more_private_keys = 0, no_more_private_data = 0; - SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_VERBOSE); + LOG_FUNC_CALLED(ctx); for (ii=0; ii), - * ID(len:2,value:(SHA1 value)), + * flags:2, + * CN(len:2,value:), + * ID(len:2,value:(SHA1 value)), * StartDate(Ascii:8) * EndDate(Ascii:8) - * ??(0x00:2) + * ??(0x00:2) */ -static int -sc_pkcs15emu_oberthur_add_pubkey(struct sc_pkcs15_card *p15card, +static int +sc_pkcs15emu_oberthur_add_pubkey(struct sc_pkcs15_card *p15card, unsigned int file_id, unsigned int size) { struct sc_context *ctx = p15card->card->ctx; @@ -555,29 +555,29 @@ sc_pkcs15emu_oberthur_add_pubkey(struct sc_pkcs15_card *p15card, unsigned flags; int rv; - SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_VERBOSE); - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "public key(file-id:%04X,size:%X)", file_id, size); + LOG_FUNC_CALLED(ctx); + sc_log(ctx, "public key(file-id:%04X,size:%X)", file_id, size); memset(&key_info, 0, sizeof(key_info)); memset(&key_obj, 0, sizeof(key_obj)); - + snprintf(ch_tmp, sizeof(ch_tmp), "%s%04X", AWP_OBJECTS_DF_PUB, file_id | 0x100); - rv = sc_oberthur_read_file(p15card, ch_tmp, &info_blob, &info_len, 1); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Failed to add public key: read oberthur file error"); + rv = sc_oberthur_read_file(p15card, ch_tmp, &info_blob, &info_len, 1); + LOG_TEST_RET(ctx, rv, "Failed to add public key: read oberthur file error"); /* Flags */ offs = 2; - if (offs > info_len) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add public key: no 'tag'"); + if (offs > info_len) + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add public key: no 'tag'"); flags = *(info_blob + 0) * 0x100 + *(info_blob + 1); key_info.usage = sc_oberthur_decode_usage(flags); if (flags & OBERTHUR_ATTR_MODIFIABLE) key_obj.flags = SC_PKCS15_CO_FLAG_MODIFIABLE; - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Public key key-usage:%04X", key_info.usage); + sc_log(ctx, "Public key key-usage:%04X", key_info.usage); /* Label */ - if (offs + 2 > info_len) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add public key: no 'Label'"); + if (offs + 2 > info_len) + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add public key: no 'Label'"); len = *(info_blob + offs + 1) + *(info_blob + offs) * 0x100; if (len) { if (len > sizeof(key_obj.label) - 1) @@ -585,40 +585,40 @@ sc_pkcs15emu_oberthur_add_pubkey(struct sc_pkcs15_card *p15card, memcpy(key_obj.label, info_blob + offs + 2, len); } offs += 2 + len; - + /* ID */ - if (offs > info_len) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add public key: no 'ID'"); + if (offs > info_len) + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add public key: no 'ID'"); len = *(info_blob + offs + 1) + *(info_blob + offs) * 0x100; if (!len || len > sizeof(key_info.id.value)) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_INVALID_DATA, "Failed to add public key: invalie 'ID' length"); + LOG_TEST_RET(ctx, SC_ERROR_INVALID_DATA, "Failed to add public key: invalie 'ID' length"); memcpy(key_info.id.value, info_blob + offs + 2, len); key_info.id.len = len; - + /* Ignore Start/End dates */ snprintf(ch_tmp, sizeof(ch_tmp), "%s%04X", AWP_OBJECTS_DF_PUB, file_id); sc_format_path(ch_tmp, &key_info.path); - + key_info.native = 1; key_info.key_reference = file_id & 0xFF; key_info.modulus_length = size; rv = sc_pkcs15emu_add_rsa_pubkey(p15card, &key_obj, &key_info); - SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, rv); + LOG_FUNC_RETURN(ctx, rv); } /* Certificate info: - * flags:2, - * Label(len:2,value:), - * ID(len:2,value:(SHA1 value)), + * flags:2, + * Label(len:2,value:), + * ID(len:2,value:(SHA1 value)), * Subject in ASN.1(len:2,value:) * Issuer in ASN.1(len:2,value:) * Serial encoded in LV or ASN.1 FIXME */ -static int +static int sc_pkcs15emu_oberthur_add_cert(struct sc_pkcs15_card *p15card, unsigned int file_id) { struct sc_context *ctx = p15card->card->ctx; @@ -630,24 +630,24 @@ sc_pkcs15emu_oberthur_add_cert(struct sc_pkcs15_card *p15card, unsigned int file int rv; char ch_tmp[0x20]; - SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_VERBOSE); - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "add certificate(file-id:%04X)", file_id); + LOG_FUNC_CALLED(ctx); + sc_log(ctx, "add certificate(file-id:%04X)", file_id); memset(&cinfo, 0, sizeof(cinfo)); memset(&cobj, 0, sizeof(cobj)); - - snprintf(ch_tmp, sizeof(ch_tmp), "%s%04X", AWP_OBJECTS_DF_PUB, file_id | 0x100); - rv = sc_oberthur_read_file(p15card, ch_tmp, &info_blob, &info_len, 1); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Failed to add certificate: read oberthur file error"); - if (info_len < 2) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add certificate: no 'tag'"); + snprintf(ch_tmp, sizeof(ch_tmp), "%s%04X", AWP_OBJECTS_DF_PUB, file_id | 0x100); + rv = sc_oberthur_read_file(p15card, ch_tmp, &info_blob, &info_len, 1); + LOG_TEST_RET(ctx, rv, "Failed to add certificate: read oberthur file error"); + + if (info_len < 2) + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add certificate: no 'tag'"); flags = *(info_blob + 0) * 0x100 + *(info_blob + 1); offs = 2; /* Label */ - if (offs + 2 > info_len) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add certificate: no 'CN'"); + if (offs + 2 > info_len) + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add certificate: no 'CN'"); len = *(info_blob + offs + 1) + *(info_blob + offs) * 0x100; if (len) { if (len > sizeof(cobj.label) - 1) @@ -655,13 +655,13 @@ sc_pkcs15emu_oberthur_add_cert(struct sc_pkcs15_card *p15card, unsigned int file memcpy(cobj.label, info_blob + offs + 2, len); } offs += 2 + len; - + /* ID */ - if (offs > info_len) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add certificate: no 'ID'"); + if (offs > info_len) + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add certificate: no 'ID'"); len = *(info_blob + offs + 1) + *(info_blob + offs) * 0x100; if (len > sizeof(cinfo.id.value)) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_INVALID_DATA, "Failed to add certificate: invalie 'ID' length"); + LOG_TEST_RET(ctx, SC_ERROR_INVALID_DATA, "Failed to add certificate: invalie 'ID' length"); memcpy(cinfo.id.value, info_blob + offs + 2, len); cinfo.id.len = len; @@ -669,14 +669,14 @@ sc_pkcs15emu_oberthur_add_cert(struct sc_pkcs15_card *p15card, unsigned int file snprintf(ch_tmp, sizeof(ch_tmp), "%s%04X", AWP_OBJECTS_DF_PUB, file_id); sc_format_path(ch_tmp, &cinfo.path); - rv = sc_oberthur_read_file(p15card, ch_tmp, &cert_blob, &cert_len, 1); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Failed to add certificate: read certificate error"); - + rv = sc_oberthur_read_file(p15card, ch_tmp, &cert_blob, &cert_len, 1); + LOG_TEST_RET(ctx, rv, "Failed to add certificate: read certificate error"); + cinfo.value.value = cert_blob; cinfo.value.len = cert_len; rv = sc_oberthur_get_certificate_authority(&cinfo.value, &cinfo.authority); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Failed to add certificate: get certificate attributes error"); + LOG_TEST_RET(ctx, rv, "Failed to add certificate: get certificate attributes error"); if (flags & OBERTHUR_ATTR_MODIFIABLE) cobj.flags |= SC_PKCS15_CO_FLAG_MODIFIABLE; @@ -688,17 +688,17 @@ sc_pkcs15emu_oberthur_add_cert(struct sc_pkcs15_card *p15card, unsigned int file /* Private key info: - * flags:2, - * CN(len:2,value:), - * ID(len:2,value:(SHA1 value)), + * flags:2, + * CN(len:2,value:), + * ID(len:2,value:(SHA1 value)), * StartDate(Ascii:8) * EndDate(Ascii:8) * Subject in ASN.1(len:2,value:) * modulus(value:) * exponent(length:1, value:3) */ -static int -sc_pkcs15emu_oberthur_add_prvkey(struct sc_pkcs15_card *p15card, +static int +sc_pkcs15emu_oberthur_add_prvkey(struct sc_pkcs15_card *p15card, unsigned int file_id, unsigned int size) { struct sc_context *ctx = p15card->card->ctx; @@ -712,82 +712,82 @@ sc_pkcs15emu_oberthur_add_prvkey(struct sc_pkcs15_card *p15card, char ch_tmp[0x100]; int rv; - SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_VERBOSE); - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "add private key(file-id:%04X,size:%04X)", file_id, size); - + LOG_FUNC_CALLED(ctx); + sc_log(ctx, "add private key(file-id:%04X,size:%04X)", file_id, size); + memset(&kinfo, 0, sizeof(kinfo)); memset(&kobj, 0, sizeof(kobj)); memset(&ccont, 0, sizeof(ccont)); - + rv = sc_oberthur_get_friends (file_id, &ccont); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Failed to add private key: get friends error"); + LOG_TEST_RET(ctx, rv, "Failed to add private key: get friends error"); if (ccont.id_cert) { struct sc_pkcs15_object *objs[32]; int ii; - - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "friend certificate %04X", ccont.id_cert); + + sc_log(ctx, "friend certificate %04X", ccont.id_cert); rv = sc_pkcs15_get_objects(p15card, SC_PKCS15_TYPE_CERT_X509, objs, 32); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Failed to add private key: get certificates error"); + LOG_TEST_RET(ctx, rv, "Failed to add private key: get certificates error"); for (ii=0; iidata; struct sc_path path = cert->path; unsigned int id = path.value[path.len - 2] * 0x100 + path.value[path.len - 1]; - + if (id == ccont.id_cert) { strncpy(kobj.label, objs[ii]->label, sizeof(kobj.label) - 1); break; } } - if (ii == rv) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_INCONSISTENT_PROFILE, "Failed to add private key: friend not found"); + if (ii == rv) + LOG_TEST_RET(ctx, SC_ERROR_INCONSISTENT_PROFILE, "Failed to add private key: friend not found"); } snprintf(ch_tmp, sizeof(ch_tmp), "%s%04X", AWP_OBJECTS_DF_PRV, file_id | 0x100); - rv = sc_oberthur_read_file(p15card, ch_tmp, &info_blob, &info_len, 1); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Failed to add private key: read oberthur file error"); + rv = sc_oberthur_read_file(p15card, ch_tmp, &info_blob, &info_len, 1); + LOG_TEST_RET(ctx, rv, "Failed to add private key: read oberthur file error"); if (info_len < 2) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add private key: no 'tag'"); + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add private key: no 'tag'"); flags = *(info_blob + 0) * 0x100 + *(info_blob + 1); offs = 2; /* CN */ - if (offs > info_len) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add private key: no 'CN'"); + if (offs > info_len) + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add private key: no 'CN'"); len = *(info_blob + offs + 1) + *(info_blob + offs) * 0x100; if (len && !strlen(kobj.label)) { - if (len > sizeof(kobj.label) - 1) + if (len > sizeof(kobj.label) - 1) len = sizeof(kobj.label) - 1; strncpy(kobj.label, (char *)(info_blob + offs + 2), len); } offs += 2 + len; - + /* ID */ - if (offs > info_len) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add private key: no 'ID'"); + if (offs > info_len) + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add private key: no 'ID'"); len = *(info_blob + offs + 1) + *(info_blob + offs) * 0x100; if (!len) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add private key: zero length ID"); + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add private key: zero length ID"); else if (len > sizeof(kinfo.id.value)) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_INVALID_DATA, "Failed to add private key: invalid ID length"); + LOG_TEST_RET(ctx, SC_ERROR_INVALID_DATA, "Failed to add private key: invalid ID length"); memcpy(kinfo.id.value, info_blob + offs + 2, len); kinfo.id.len = len; offs += 2 + len; - - /* Ignore Start/End dates */ + + /* Ignore Start/End dates */ offs += 16; - + /* Subject encoded in ASN1 */ - if (offs > info_len) + if (offs > info_len) return SC_ERROR_UNKNOWN_DATA_RECEIVED; len = *(info_blob + offs + 1) + *(info_blob + offs) * 0x100; if (len) { kinfo.subject.value = malloc(len); if (!kinfo.subject.value) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_OUT_OF_MEMORY, "Failed to add private key: memory allocation error"); + LOG_TEST_RET(ctx, SC_ERROR_OUT_OF_MEMORY, "Failed to add private key: memory allocation error"); kinfo.subject.len = len; memcpy(kinfo.subject.value, info_blob + offs + 2, len); } @@ -796,7 +796,7 @@ sc_pkcs15emu_oberthur_add_prvkey(struct sc_pkcs15_card *p15card, snprintf(ch_tmp, sizeof(ch_tmp), "%s%04X", AWP_OBJECTS_DF_PRV, file_id); sc_format_path(ch_tmp, &kinfo.path); - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Private key info path %s", ch_tmp); + sc_log(ctx, "Private key info path %s", ch_tmp); kinfo.modulus_length = size; kinfo.native = 1; @@ -807,19 +807,19 @@ sc_pkcs15emu_oberthur_add_prvkey(struct sc_pkcs15_card *p15card, if (flags & OBERTHUR_ATTR_MODIFIABLE) kobj.flags |= SC_PKCS15_CO_FLAG_MODIFIABLE; - kobj.auth_id.len = sizeof(PinDomainID) > sizeof(kobj.auth_id.value) + kobj.auth_id.len = sizeof(PinDomainID) > sizeof(kobj.auth_id.value) ? sizeof(kobj.auth_id.value) : sizeof(PinDomainID); memcpy(kobj.auth_id.value, PinDomainID, kobj.auth_id.len); - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Parsed private key(reference:%i,usage:%X,flags:%X)", kinfo.key_reference, kinfo.usage, kobj.flags); + sc_log(ctx, "Parsed private key(reference:%i,usage:%X,flags:%X)", kinfo.key_reference, kinfo.usage, kobj.flags); rv = sc_pkcs15emu_add_rsa_prkey(p15card, &kobj, &kinfo); - SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, rv); + LOG_FUNC_RETURN(ctx, rv); } -static int -sc_pkcs15emu_oberthur_add_data(struct sc_pkcs15_card *p15card, +static int +sc_pkcs15emu_oberthur_add_data(struct sc_pkcs15_card *p15card, unsigned int file_id, unsigned int size, int private) { struct sc_context *ctx = p15card->card->ctx; @@ -832,54 +832,54 @@ sc_pkcs15emu_oberthur_add_data(struct sc_pkcs15_card *p15card, int rv; SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_VERBOSE); - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Add data(file-id:%04X,size:%i,is-private:%i)", file_id, size, private); + sc_log(ctx, "Add data(file-id:%04X,size:%i,is-private:%i)", file_id, size, private); memset(&dinfo, 0, sizeof(dinfo)); memset(&dobj, 0, sizeof(dobj)); snprintf(ch_tmp, sizeof(ch_tmp), "%s%04X", private ? AWP_OBJECTS_DF_PRV : AWP_OBJECTS_DF_PUB, file_id | 0x100); - - rv = sc_oberthur_read_file(p15card, ch_tmp, &info_blob, &info_len, 1); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Failed to add data: read oberthur file error"); - if (info_len < 2) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add certificate: no 'tag'"); + rv = sc_oberthur_read_file(p15card, ch_tmp, &info_blob, &info_len, 1); + LOG_TEST_RET(ctx, rv, "Failed to add data: read oberthur file error"); + + if (info_len < 2) + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add certificate: no 'tag'"); flags = *(info_blob + 0) * 0x100 + *(info_blob + 1); offs = 2; /* Label */ - if (offs > info_len) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add data: no 'label'"); + if (offs > info_len) + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add data: no 'label'"); label = info_blob + offs + 2; label_len = *(info_blob + offs + 1) + *(info_blob + offs) * 0x100; if (label_len > sizeof(dobj.label) - 1) label_len = sizeof(dobj.label) - 1; offs += 2 + *(info_blob + offs + 1); - + /* Application */ - if (offs > info_len) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add data: no 'application'"); + if (offs > info_len) + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add data: no 'application'"); app = info_blob + offs + 2; app_len = *(info_blob + offs + 1) + *(info_blob + offs) * 0x100; if (app_len > sizeof(dinfo.app_label) - 1) app_len = sizeof(dinfo.app_label) - 1; offs += 2 + app_len; - + /* OID encode like DER(ASN.1(oid)) */ - if (offs > info_len) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add data: no 'OID'"); + if (offs > info_len) + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add data: no 'OID'"); oid_len = *(info_blob + offs + 1) + *(info_blob + offs) * 0x100; if (oid_len) { oid = info_blob + offs + 2; if (*oid != 0x06 || (*(oid + 1) != oid_len - 2)) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add data: invalid 'OID' format"); + LOG_TEST_RET(ctx, SC_ERROR_UNKNOWN_DATA_RECEIVED, "Failed to add data: invalid 'OID' format"); oid += 2; oid_len -= 2; } - + snprintf(ch_tmp, sizeof(ch_tmp), "%s%04X", private ? AWP_OBJECTS_DF_PRV : AWP_OBJECTS_DF_PUB, file_id); sc_format_path(ch_tmp, &dinfo.path); - + memcpy(dobj.label, label, label_len); memcpy(dinfo.app_label, app, app_len); if (oid_len) @@ -890,7 +890,7 @@ sc_pkcs15emu_oberthur_add_data(struct sc_pkcs15_card *p15card, if (private) { dobj.auth_id.len = sizeof(PinDomainID) > sizeof(dobj.auth_id.value) - ? sizeof(dobj.auth_id.value) : sizeof(PinDomainID); + ? sizeof(dobj.auth_id.value) : sizeof(PinDomainID); memcpy(dobj.auth_id.value, PinDomainID, dobj.auth_id.len); dobj.flags |= SC_PKCS15_CO_FLAG_PRIVATE; @@ -902,7 +902,7 @@ sc_pkcs15emu_oberthur_add_data(struct sc_pkcs15_card *p15card, } -static int +static int sc_pkcs15emu_oberthur_init(struct sc_pkcs15_card * p15card) { struct sc_context *ctx = p15card->card->ctx; @@ -913,20 +913,20 @@ sc_pkcs15emu_oberthur_init(struct sc_pkcs15_card * p15card) int rv, ii, tries_left; char serial[0x10]; unsigned char sopin_reference = 0x04; - + SC_FUNC_CALLED(card->ctx, SC_LOG_DEBUG_VERBOSE); sc_bin_to_hex(card->serialnr.value, card->serialnr.len, serial, sizeof(serial), 0); p15card->tokeninfo->serial_number = strdup(serial); p15card->ops.parse_df = sc_awp_parse_df; p15card->ops.clear = sc_awp_clear; - - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Oberthur init: serial %s", p15card->tokeninfo->serial_number); + + sc_log(ctx, "Oberthur init: serial %s", p15card->tokeninfo->serial_number); sc_format_path(AWP_PIN_DF, &path); rv = sc_select_file(card, &path, NULL); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Oberthur init failed: cannot select PIN dir"); - + LOG_TEST_RET(ctx, rv, "Oberthur init failed: cannot select PIN dir"); + tries_left = -1; rv = sc_verify(card, SC_AC_CHV, sopin_reference, (unsigned char *)"", 0, &tries_left); if (rv && rv != SC_ERROR_PIN_CODE_INCORRECT) { @@ -934,13 +934,13 @@ sc_pkcs15emu_oberthur_init(struct sc_pkcs15_card * p15card) rv = sc_verify(card, SC_AC_CHV, sopin_reference, (unsigned char *)"", 0, &tries_left); } if (rv && rv != SC_ERROR_PIN_CODE_INCORRECT) - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Invalid state of SO-PIN"); + LOG_TEST_RET(ctx, rv, "Invalid state of SO-PIN"); /* add PIN */ memset(&auth_info, 0, sizeof(auth_info)); memset(&obj, 0, sizeof(obj)); - auth_info.auth_type = SC_PKCS15_PIN_AUTH_TYPE_PIN; + auth_info.auth_type = SC_PKCS15_PIN_AUTH_TYPE_PIN; auth_info.auth_method = SC_AC_CHV; auth_info.auth_id.len = 1; auth_info.auth_id.value[0] = 0xFF; @@ -950,19 +950,19 @@ sc_pkcs15emu_oberthur_init(struct sc_pkcs15_card * p15card) auth_info.attrs.pin.type = SC_PKCS15_PIN_TYPE_ASCII_NUMERIC; auth_info.attrs.pin.reference = sopin_reference; auth_info.attrs.pin.pad_char = 0xFF; - auth_info.attrs.pin.flags = SC_PKCS15_PIN_FLAG_CASE_SENSITIVE - | SC_PKCS15_PIN_FLAG_INITIALIZED + auth_info.attrs.pin.flags = SC_PKCS15_PIN_FLAG_CASE_SENSITIVE + | SC_PKCS15_PIN_FLAG_INITIALIZED | SC_PKCS15_PIN_FLAG_NEEDS_PADDING | SC_PKCS15_PIN_FLAG_SO_PIN; auth_info.tries_left = tries_left; - + strncpy(obj.label, "SO PIN", SC_PKCS15_MAX_LABEL_SIZE-1); obj.flags = SC_PKCS15_CO_FLAG_MODIFIABLE | SC_PKCS15_CO_FLAG_PRIVATE; - - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Add PIN(%s,auth_id:%s,reference:%i)", obj.label, + + sc_log(ctx, "Add PIN(%s,auth_id:%s,reference:%i)", obj.label, sc_pkcs15_print_id(&auth_info.auth_id), auth_info.attrs.pin.reference); rv = sc_pkcs15emu_add_pin_obj(p15card, &obj, &auth_info); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Oberthur init failed: cannot add PIN object"); + LOG_TEST_RET(ctx, rv, "Oberthur init failed: cannot add PIN object"); tries_left = -1; rv = sc_verify(card, SC_AC_CHV, 0x81, (unsigned char *)"", 0, &tries_left); @@ -970,8 +970,8 @@ sc_pkcs15emu_oberthur_init(struct sc_pkcs15_card * p15card) /* add PIN */ memset(&auth_info, 0, sizeof(auth_info)); memset(&obj, 0, sizeof(obj)); - - auth_info.auth_id.len = sizeof(PinDomainID) > sizeof(auth_info.auth_id.value) + + auth_info.auth_id.len = sizeof(PinDomainID) > sizeof(auth_info.auth_id.value) ? sizeof(auth_info.auth_id.value) : sizeof(PinDomainID); memcpy(auth_info.auth_id.value, PinDomainID, auth_info.auth_id.len); auth_info.auth_method = SC_AC_CHV; @@ -982,45 +982,45 @@ sc_pkcs15emu_oberthur_init(struct sc_pkcs15_card * p15card) auth_info.attrs.pin.type = SC_PKCS15_PIN_TYPE_ASCII_NUMERIC; auth_info.attrs.pin.reference = 0x81; auth_info.attrs.pin.pad_char = 0xFF; - auth_info.attrs.pin.flags = SC_PKCS15_PIN_FLAG_CASE_SENSITIVE - | SC_PKCS15_PIN_FLAG_INITIALIZED + auth_info.attrs.pin.flags = SC_PKCS15_PIN_FLAG_CASE_SENSITIVE + | SC_PKCS15_PIN_FLAG_INITIALIZED | SC_PKCS15_PIN_FLAG_NEEDS_PADDING | SC_PKCS15_PIN_FLAG_LOCAL; auth_info.tries_left = tries_left; - + strncpy(obj.label, PIN_DOMAIN_LABEL, SC_PKCS15_MAX_LABEL_SIZE-1); obj.flags = SC_PKCS15_CO_FLAG_MODIFIABLE | SC_PKCS15_CO_FLAG_PRIVATE; - - sc_format_path(AWP_PIN_DF, &auth_info.path); + + sc_format_path(AWP_PIN_DF, &auth_info.path); auth_info.path.type = SC_PATH_TYPE_PATH; - - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Add PIN(%s,auth_id:%s,reference:%i)", obj.label, + + sc_log(ctx, "Add PIN(%s,auth_id:%s,reference:%i)", obj.label, sc_pkcs15_print_id(&auth_info.auth_id), auth_info.attrs.pin.reference); rv = sc_pkcs15emu_add_pin_obj(p15card, &obj, &auth_info); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Oberthur init failed: cannot add PIN object"); + LOG_TEST_RET(ctx, rv, "Oberthur init failed: cannot add PIN object"); } else if (rv != SC_ERROR_DATA_OBJECT_NOT_FOUND) { - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Oberthur init failed: cannot verify PIN"); + LOG_TEST_RET(ctx, rv, "Oberthur init failed: cannot verify PIN"); } for (ii=0; oberthur_infos[ii].name; ii++) { - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Oberthur init: read %s file", oberthur_infos[ii].name); + sc_log(ctx, "Oberthur init: read %s file", oberthur_infos[ii].name); rv = sc_oberthur_read_file(p15card, oberthur_infos[ii].path, &oberthur_infos[ii].content, &oberthur_infos[ii].len, 1); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Oberthur init failed: read oberthur file error"); - - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Oberthur init: parse %s file, content length %i", + LOG_TEST_RET(ctx, rv, "Oberthur init failed: read oberthur file error"); + + sc_log(ctx, "Oberthur init: parse %s file, content length %i", oberthur_infos[ii].name, oberthur_infos[ii].len); - rv = oberthur_infos[ii].parser(p15card, oberthur_infos[ii].content, oberthur_infos[ii].len, + rv = oberthur_infos[ii].parser(p15card, oberthur_infos[ii].content, oberthur_infos[ii].len, oberthur_infos[ii].postpone_allowed); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Oberthur init failed: parse error"); + LOG_TEST_RET(ctx, rv, "Oberthur init failed: parse error"); } - SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, SC_SUCCESS); + LOG_FUNC_RETURN(ctx, SC_SUCCESS); } -static int +static int oberthur_detect_card(struct sc_pkcs15_card * p15card) { struct sc_card *card = p15card->card; @@ -1032,13 +1032,13 @@ oberthur_detect_card(struct sc_pkcs15_card * p15card) } -int -sc_pkcs15emu_oberthur_init_ex(struct sc_pkcs15_card * p15card, +int +sc_pkcs15emu_oberthur_init_ex(struct sc_pkcs15_card * p15card, struct sc_aid *aid, struct sc_pkcs15emu_opt * opts) { - int rv; - - SC_FUNC_CALLED(p15card->card->ctx, SC_LOG_DEBUG_VERBOSE); + int rv; + + LOG_FUNC_CALLED(p15card->card->ctx); if (opts && opts->flags & SC_PKCS15EMU_FLAGS_NO_CHECK) { rv = sc_pkcs15emu_oberthur_init(p15card); } @@ -1047,12 +1047,12 @@ sc_pkcs15emu_oberthur_init_ex(struct sc_pkcs15_card * p15card, if (!rv) rv = sc_pkcs15emu_oberthur_init(p15card); } - - SC_FUNC_RETURN(p15card->card->ctx, SC_LOG_DEBUG_NORMAL, rv); + + LOG_FUNC_RETURN(p15card->card->ctx, rv); } -static int +static int sc_awp_parse_df(struct sc_pkcs15_card *p15card, struct sc_pkcs15_df *df) { struct sc_context *ctx = p15card->card->ctx; @@ -1060,15 +1060,15 @@ sc_awp_parse_df(struct sc_pkcs15_card *p15card, struct sc_pkcs15_df *df) size_t buf_len; int rv; - SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_VERBOSE); + LOG_FUNC_CALLED(ctx); if (df->type != SC_PKCS15_PRKDF && df->type != SC_PKCS15_DODF) - SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_NOT_SUPPORTED); + LOG_FUNC_RETURN(ctx, SC_ERROR_NOT_SUPPORTED); if (df->enumerated) - SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, SC_SUCCESS); + LOG_FUNC_RETURN(ctx, SC_SUCCESS); rv = sc_oberthur_read_file(p15card, AWP_OBJECTS_LIST_PRV, &buf, &buf_len, 1); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Parse DF: read pribate objects info failed"); + LOG_TEST_RET(ctx, rv, "Parse DF: read pribate objects info failed"); rv = sc_oberthur_parse_privateinfo(p15card, buf, buf_len, 0); @@ -1076,17 +1076,17 @@ sc_awp_parse_df(struct sc_pkcs15_card *p15card, struct sc_pkcs15_df *df) free(buf); if (rv == SC_ERROR_SECURITY_STATUS_NOT_SATISFIED) - SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, SC_SUCCESS); + LOG_FUNC_RETURN(ctx, SC_SUCCESS); - SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "Parse DF: private info parse error"); + LOG_TEST_RET(ctx, rv, "Parse DF: private info parse error"); df->enumerated = 1; - SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, rv); + LOG_FUNC_RETURN(ctx, rv); } static void sc_awp_clear(struct sc_pkcs15_card *p15card) { - SC_FUNC_CALLED(p15card->card->ctx, SC_LOG_DEBUG_VERBOSE); + LOG_FUNC_CALLED(p15card->card->ctx); } diff --git a/src/libopensc/pkcs15-openpgp.c b/src/libopensc/pkcs15-openpgp.c index 385ae385..20b65663 100644 --- a/src/libopensc/pkcs15-openpgp.c +++ b/src/libopensc/pkcs15-openpgp.c @@ -33,7 +33,7 @@ #include "pkcs15.h" #include "log.h" -int sc_pkcs15emu_openpgp_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_openpgp_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); static int sc_pkcs15emu_openpgp_add_data(sc_pkcs15_card_t *); @@ -429,7 +429,7 @@ static int openpgp_detect_card(sc_pkcs15_card_t *p15card) return SC_ERROR_WRONG_CARD; } -int sc_pkcs15emu_openpgp_init_ex(sc_pkcs15_card_t *p15card, +int sc_pkcs15emu_openpgp_init_ex(sc_pkcs15_card_t *p15card, struct sc_aid *aid, sc_pkcs15emu_opt_t *opts) { if (opts && opts->flags & SC_PKCS15EMU_FLAGS_NO_CHECK) diff --git a/src/libopensc/pkcs15-piv.c b/src/libopensc/pkcs15-piv.c index 8c107f53..8b7d8dba 100644 --- a/src/libopensc/pkcs15-piv.c +++ b/src/libopensc/pkcs15-piv.c @@ -40,7 +40,7 @@ #define MANU_ID "piv_II " -int sc_pkcs15emu_piv_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_piv_init_ex(sc_pkcs15_card_t *, struct sc_aid *aid, sc_pkcs15emu_opt_t *); typedef struct objdata_st { const char *id; @@ -999,7 +999,7 @@ sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL, "DEE Adding pin %d label=%s",i, label); prkey_info.modulus_length= ckis[i].pubkey_len; r = sc_pkcs15emu_add_rsa_prkey(p15card, &prkey_obj, &prkey_info); break; - case SC_ALGORITHM_EC: + case SC_ALGORITHM_EC: prkey_info.usage |= prkeys[i].usage_ec; prkey_info.field_length = ckis[i].pubkey_len; sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL, "DEE added key_alg %2.2x prkey_obj.flags %8.8x", @@ -1020,7 +1020,7 @@ sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL, "DEE Adding pin %d label=%s",i, label); } int sc_pkcs15emu_piv_init_ex(sc_pkcs15_card_t *p15card, - sc_pkcs15emu_opt_t *opts) + struct sc_aid *aid, sc_pkcs15emu_opt_t *opts) { sc_card_t *card = p15card->card; sc_context_t *ctx = card->ctx; diff --git a/src/libopensc/pkcs15-postecert.c b/src/libopensc/pkcs15-postecert.c index 6842bda4..e79cd804 100644 --- a/src/libopensc/pkcs15-postecert.c +++ b/src/libopensc/pkcs15-postecert.c @@ -33,7 +33,7 @@ #include "pkcs15.h" #include "log.h" -int sc_pkcs15emu_postecert_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_postecert_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); static int (*set_security_env) (sc_card_t *, const sc_security_env_t *, int); @@ -354,6 +354,7 @@ static int postecert_detect_card(sc_pkcs15_card_t * p15card) } int sc_pkcs15emu_postecert_init_ex(sc_pkcs15_card_t * p15card, + struct sc_aid *aid, sc_pkcs15emu_opt_t * opts) { if (opts && opts->flags & SC_PKCS15EMU_FLAGS_NO_CHECK) diff --git a/src/libopensc/pkcs15-pteid.c b/src/libopensc/pkcs15-pteid.c index da9c0887..9f1132d9 100644 --- a/src/libopensc/pkcs15-pteid.c +++ b/src/libopensc/pkcs15-pteid.c @@ -50,7 +50,7 @@ #define IAS_CARD 0 #define GEMSAFE_CARD 1 -int sc_pkcs15emu_pteid_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_pteid_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); static int sc_pkcs15emu_pteid_init(sc_pkcs15_card_t * p15card) { @@ -275,7 +275,7 @@ static int pteid_detect_card(sc_pkcs15_card_t *p15card) return SC_ERROR_WRONG_CARD; } -int sc_pkcs15emu_pteid_init_ex(sc_pkcs15_card_t *p15card, sc_pkcs15emu_opt_t *opts) +int sc_pkcs15emu_pteid_init_ex(sc_pkcs15_card_t *p15card, struct sc_aid *aid, sc_pkcs15emu_opt_t *opts) { if (opts != NULL && opts->flags & SC_PKCS15EMU_FLAGS_NO_CHECK) return sc_pkcs15emu_pteid_init(p15card); diff --git a/src/libopensc/pkcs15-sc-hsm.c b/src/libopensc/pkcs15-sc-hsm.c index 3ef82011..2ffed11d 100644 --- a/src/libopensc/pkcs15-sc-hsm.c +++ b/src/libopensc/pkcs15-sc-hsm.c @@ -933,6 +933,7 @@ static int sc_pkcs15emu_sc_hsm_init (sc_pkcs15_card_t * p15card) int sc_pkcs15emu_sc_hsm_init_ex(sc_pkcs15_card_t *p15card, + struct sc_aid *aid, sc_pkcs15emu_opt_t *opts) { if (opts && (opts->flags & SC_PKCS15EMU_FLAGS_NO_CHECK)) { diff --git a/src/libopensc/pkcs15-starcert.c b/src/libopensc/pkcs15-starcert.c index 96e0b8ac..4e19e191 100644 --- a/src/libopensc/pkcs15-starcert.c +++ b/src/libopensc/pkcs15-starcert.c @@ -33,7 +33,7 @@ #define MANU_ID "Giesecke & Devrient GmbH" #define STARCERT "StarCertV2201" -int sc_pkcs15emu_starcert_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_starcert_init_ex(sc_pkcs15_card_t *, struct sc_aid *,sc_pkcs15emu_opt_t *); typedef struct cdata_st { const char *label; @@ -270,6 +270,7 @@ static int sc_pkcs15emu_starcert_init(sc_pkcs15_card_t *p15card) } int sc_pkcs15emu_starcert_init_ex(sc_pkcs15_card_t *p15card, + struct sc_aid *aid, sc_pkcs15emu_opt_t *opts) { diff --git a/src/libopensc/pkcs15-syn.c b/src/libopensc/pkcs15-syn.c index 0ccb944d..853c4f6b 100644 --- a/src/libopensc/pkcs15-syn.c +++ b/src/libopensc/pkcs15-syn.c @@ -32,52 +32,9 @@ #include "internal.h" #include "asn1.h" #include "pkcs15.h" +#include "pkcs15-syn.h" -extern int sc_pkcs15emu_westcos_init_ex(sc_pkcs15_card_t *p15card, - sc_pkcs15emu_opt_t *opts); -extern int sc_pkcs15emu_openpgp_init_ex(sc_pkcs15_card_t *, - sc_pkcs15emu_opt_t *); -extern int sc_pkcs15emu_infocamere_init_ex(sc_pkcs15_card_t *, - sc_pkcs15emu_opt_t *); -extern int sc_pkcs15emu_starcert_init_ex(sc_pkcs15_card_t *, - sc_pkcs15emu_opt_t *); -extern int sc_pkcs15emu_tcos_init_ex(sc_pkcs15_card_t *, - sc_pkcs15emu_opt_t *); -extern int sc_pkcs15emu_esteid_init_ex(sc_pkcs15_card_t *, - sc_pkcs15emu_opt_t *); -extern int sc_pkcs15emu_postecert_init_ex(sc_pkcs15_card_t *, - sc_pkcs15emu_opt_t *); -extern int sc_pkcs15emu_piv_init_ex(sc_pkcs15_card_t *p15card, - sc_pkcs15emu_opt_t *opts); -extern int sc_pkcs15emu_gemsafeGPK_init_ex(sc_pkcs15_card_t *p15card, - sc_pkcs15emu_opt_t *opts); -extern int sc_pkcs15emu_gemsafeV1_init_ex(sc_pkcs15_card_t *p15card, - sc_pkcs15emu_opt_t *opts); -extern int sc_pkcs15emu_actalis_init_ex(sc_pkcs15_card_t *p15card, - sc_pkcs15emu_opt_t *opts); -extern int sc_pkcs15emu_atrust_acos_init_ex(sc_pkcs15_card_t *p15card, - sc_pkcs15emu_opt_t *opts); -extern int sc_pkcs15emu_tccardos_init_ex(sc_pkcs15_card_t *, - sc_pkcs15emu_opt_t *); -extern int sc_pkcs15emu_entersafe_init_ex(sc_pkcs15_card_t *, - sc_pkcs15emu_opt_t *); -extern int sc_pkcs15emu_pteid_init_ex(sc_pkcs15_card_t *, - sc_pkcs15emu_opt_t *); -extern int sc_pkcs15emu_oberthur_init_ex(sc_pkcs15_card_t *, - sc_pkcs15emu_opt_t *); -extern int sc_pkcs15emu_itacns_init_ex(sc_pkcs15_card_t *, - sc_pkcs15emu_opt_t *); -extern int sc_pkcs15emu_sc_hsm_init_ex(sc_pkcs15_card_t *, - sc_pkcs15emu_opt_t *); -extern int sc_pkcs15emu_dnie_init_ex(sc_pkcs15_card_t *, - sc_pkcs15emu_opt_t *); -extern int sc_pkcs15emu_gids_init_ex(sc_pkcs15_card_t *, - sc_pkcs15emu_opt_t *); - -static struct { - const char * name; - int (*handler)(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); -} builtin_emulators[] = { +struct sc_pkcs15_emulator_handler builtin_emulators[] = { { "westcos", sc_pkcs15emu_westcos_init_ex }, { "openpgp", sc_pkcs15emu_openpgp_init_ex }, { "infocamere", sc_pkcs15emu_infocamere_init_ex }, @@ -86,7 +43,7 @@ static struct { { "esteid", sc_pkcs15emu_esteid_init_ex }, { "itacns", sc_pkcs15emu_itacns_init_ex }, { "postecert", sc_pkcs15emu_postecert_init_ex }, - { "PIV-II", sc_pkcs15emu_piv_init_ex }, + { "PIV-II", sc_pkcs15emu_piv_init_ex }, { "gemsafeGPK", sc_pkcs15emu_gemsafeGPK_init_ex }, { "gemsafeV1", sc_pkcs15emu_gemsafeV1_init_ex }, { "actalis", sc_pkcs15emu_actalis_init_ex }, @@ -95,13 +52,14 @@ static struct { { "entersafe", sc_pkcs15emu_entersafe_init_ex }, { "pteid", sc_pkcs15emu_pteid_init_ex }, { "oberthur", sc_pkcs15emu_oberthur_init_ex }, - { "sc-hsm", sc_pkcs15emu_sc_hsm_init_ex }, + { "sc-hsm", sc_pkcs15emu_sc_hsm_init_ex }, { "dnie", sc_pkcs15emu_dnie_init_ex }, { "gids", sc_pkcs15emu_gids_init_ex }, + { "iasecc", sc_pkcs15emu_iasecc_init_ex }, { NULL, NULL } }; -static int parse_emu_block(sc_pkcs15_card_t *, scconf_block *); +static int parse_emu_block(sc_pkcs15_card_t *, struct sc_aid *, scconf_block *); static sc_pkcs15_df_t * sc_pkcs15emu_get_df(sc_pkcs15_card_t *p15card, unsigned int type); @@ -114,7 +72,7 @@ int sc_pkcs15_is_emulation_only(sc_card_t *card) { switch (card->type) { case SC_CARD_TYPE_MCRD_ESTEID_V10: - case SC_CARD_TYPE_MCRD_ESTEID_V11: + case SC_CARD_TYPE_MCRD_ESTEID_V11: case SC_CARD_TYPE_MCRD_ESTEID_V30: case SC_CARD_TYPE_IAS_PTEID: case SC_CARD_TYPE_GEMSAFEV1_PTEID: @@ -134,7 +92,7 @@ int sc_pkcs15_is_emulation_only(sc_card_t *card) } int -sc_pkcs15_bind_synthetic(sc_pkcs15_card_t *p15card) +sc_pkcs15_bind_synthetic(sc_pkcs15_card_t *p15card, struct sc_aid *aid) { sc_context_t *ctx = p15card->card->ctx; scconf_block *conf_block, **blocks, *blk; @@ -149,17 +107,17 @@ sc_pkcs15_bind_synthetic(sc_pkcs15_card_t *p15card) if (!conf_block) { /* no conf file found => try bultin drivers */ - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "no conf file (or section), trying all builtin emulators\n"); + sc_log(ctx, "no conf file (or section), trying all builtin emulators"); for (i = 0; builtin_emulators[i].name; i++) { - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "trying %s\n", builtin_emulators[i].name); - r = builtin_emulators[i].handler(p15card, &opts); + sc_log(ctx, "trying %s", builtin_emulators[i].name); + r = builtin_emulators[i].handler(p15card, aid, &opts); if (r == SC_SUCCESS) /* we got a hit */ goto out; } } else { /* we have a conf file => let's use it */ - int builtin_enabled; + int builtin_enabled; const scconf_list *list, *item; builtin_enabled = scconf_get_bool(conf_block, "enable_builtin_emulation", 1); @@ -171,10 +129,10 @@ sc_pkcs15_bind_synthetic(sc_pkcs15_card_t *p15card) /* go through the list of builtin drivers */ const char *name = item->data; - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "trying %s\n", name); + sc_log(ctx, "trying %s", name); for (i = 0; builtin_emulators[i].name; i++) if (!strcmp(builtin_emulators[i].name, name)) { - r = builtin_emulators[i].handler(p15card, &opts); + r = builtin_emulators[i].handler(p15card, aid, &opts); if (r == SC_SUCCESS) /* we got a hit */ goto out; @@ -182,10 +140,10 @@ sc_pkcs15_bind_synthetic(sc_pkcs15_card_t *p15card) } } else if (builtin_enabled) { - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "no emulator list in config file, trying all builtin emulators\n"); + sc_log(ctx, "no emulator list in config file, trying all builtin emulators"); for (i = 0; builtin_emulators[i].name; i++) { - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "trying %s\n", builtin_emulators[i].name); - r = builtin_emulators[i].handler(p15card, &opts); + sc_log(ctx, "trying %s", builtin_emulators[i].name); + r = builtin_emulators[i].handler(p15card, aid, &opts); if (r == SC_SUCCESS) /* we got a hit */ goto out; @@ -193,13 +151,13 @@ sc_pkcs15_bind_synthetic(sc_pkcs15_card_t *p15card) } /* search for 'emulate foo { ... }' entries in the conf file */ - sc_log(ctx, "searching for 'emulate foo { ... }' blocks\n"); + sc_log(ctx, "searching for 'emulate foo { ... }' blocks"); blocks = scconf_find_blocks(ctx->conf, conf_block, "emulate", NULL); sc_log(ctx, "Blocks: %p", blocks); for (i = 0; blocks && (blk = blocks[i]) != NULL; i++) { const char *name = blk->name->data; sc_log(ctx, "trying %s", name); - r = parse_emu_block(p15card, blk); + r = parse_emu_block(p15card, aid, blk); if (r == SC_SUCCESS) { free(blocks); goto out; @@ -222,14 +180,14 @@ out: } -static int parse_emu_block(sc_pkcs15_card_t *p15card, scconf_block *conf) +static int parse_emu_block(sc_pkcs15_card_t *p15card, struct sc_aid *aid, scconf_block *conf) { sc_card_t *card = p15card->card; sc_context_t *ctx = card->ctx; sc_pkcs15emu_opt_t opts; void *handle = NULL; int (*init_func)(sc_pkcs15_card_t *); - int (*init_func_ex)(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); + int (*init_func_ex)(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); int r; const char *driver, *module_name; @@ -260,13 +218,13 @@ static int parse_emu_block(sc_pkcs15_card_t *p15card, scconf_block *conf) void *address; unsigned int major = 0, minor = 0, fix = 0; - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Loading %s\n", module_name); - + sc_log(ctx, "Loading %s", module_name); + /* try to open dynamic library */ handle = sc_dlopen(module_name); if (!handle) { - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "unable to open dynamic library '%s': %s\n", - module_name, sc_dlerror()); + sc_log(ctx, "unable to open dynamic library '%s': %s", + module_name, sc_dlerror()); return SC_ERROR_INTERNAL; } @@ -274,8 +232,7 @@ static int parse_emu_block(sc_pkcs15_card_t *p15card, scconf_block *conf) get_version = (const char *(*)(void)) sc_dlsym(handle, "sc_driver_version"); if (get_version) { if (3 != sscanf(get_version(), "%u.%u.%u", &major, &minor, &fix)) { - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, - "unable to get modules version number\n"); + sc_log(ctx, "unable to get modules version number"); sc_dlclose(handle); return SC_ERROR_INTERNAL; } @@ -296,24 +253,22 @@ static int parse_emu_block(sc_pkcs15_card_t *p15card, scconf_block *conf) address = sc_dlsym(handle, name); if (address) - init_func_ex = (int (*)(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *)) address; + init_func_ex = (int (*)(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *)) address; } } /* try to initialize the pkcs15 structures */ if (init_func_ex) - r = init_func_ex(p15card, &opts); + r = init_func_ex(p15card, aid, &opts); else if (init_func) r = init_func(p15card); else r = SC_ERROR_WRONG_CARD; if (r >= 0) { - sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL, "%s succeeded, card bound\n", - module_name); + sc_log(card->ctx, "%s succeeded, card bound", module_name); p15card->dll_handle = handle; } else { - sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL, "%s failed: %s\n", - module_name, sc_strerror(r)); + sc_log(card->ctx, "%s failed: %s", module_name, sc_strerror(r)); /* clear pkcs15 card */ sc_pkcs15_card_clear(p15card); if (handle) @@ -405,7 +360,7 @@ int sc_pkcs15emu_add_ec_pubkey(sc_pkcs15_card_t *p15card, const sc_pkcs15_object_t *obj, const sc_pkcs15_pubkey_info_t *in_key) { sc_pkcs15_pubkey_info_t key = *in_key; - + if (key.access_flags == 0) key.access_flags = SC_PKCS15_PRKEY_ACCESS_EXTRACTABLE; @@ -459,8 +414,7 @@ int sc_pkcs15emu_object_add(sc_pkcs15_card_t *p15card, unsigned int type, data_len = sizeof(struct sc_pkcs15_data_info); break; default: - sc_debug(p15card->card->ctx, SC_LOG_DEBUG_NORMAL, - "Unknown PKCS15 object type %d\n", type); + sc_log(p15card->card->ctx, "Unknown PKCS15 object type %d", type); free(obj); return SC_ERROR_INVALID_ARGUMENTS; } diff --git a/src/libopensc/pkcs15-syn.h b/src/libopensc/pkcs15-syn.h new file mode 100644 index 00000000..8a52aa60 --- /dev/null +++ b/src/libopensc/pkcs15-syn.h @@ -0,0 +1,63 @@ +/* + * pkcs15-syn.c: PKCS #15 emulation of non-pkcs15 cards + * + * Copyright (C) 2003 Olaf Kirch + * 2004 Nils Larsch + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef PKCS15_SYN_H +#define PKCS15_SYN_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +int sc_pkcs15emu_westcos_init_ex(sc_pkcs15_card_t *p15card, struct sc_aid *, sc_pkcs15emu_opt_t *opts); +int sc_pkcs15emu_openpgp_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_infocamere_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_starcert_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_tcos_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_esteid_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_postecert_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_piv_init_ex(sc_pkcs15_card_t *p15card, struct sc_aid *, sc_pkcs15emu_opt_t *opts); +int sc_pkcs15emu_gemsafeGPK_init_ex(sc_pkcs15_card_t *p15card, struct sc_aid *, sc_pkcs15emu_opt_t *opts); +int sc_pkcs15emu_gemsafeV1_init_ex(sc_pkcs15_card_t *p15card, struct sc_aid *, sc_pkcs15emu_opt_t *opts); +int sc_pkcs15emu_actalis_init_ex(sc_pkcs15_card_t *p15card, struct sc_aid *, sc_pkcs15emu_opt_t *opts); +int sc_pkcs15emu_atrust_acos_init_ex(sc_pkcs15_card_t *p15card, struct sc_aid *, sc_pkcs15emu_opt_t *opts); +int sc_pkcs15emu_tccardos_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_entersafe_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_pteid_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_oberthur_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_itacns_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_sc_hsm_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_dnie_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_gids_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_iasecc_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); + +struct sc_pkcs15_emulator_handler { + const char *name; + int (*handler)(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/libopensc/pkcs15-tccardos.c b/src/libopensc/pkcs15-tccardos.c index b8bb5e9a..e8017d1a 100644 --- a/src/libopensc/pkcs15-tccardos.c +++ b/src/libopensc/pkcs15-tccardos.c @@ -42,6 +42,7 @@ #define TC_CARDOS_PIN_MASK 0x3000 int sc_pkcs15emu_tccardos_init_ex(sc_pkcs15_card_t *p15card, + struct sc_aid *, sc_pkcs15emu_opt_t *opts); static int read_file(struct sc_card *card, const char *file, u8 *buf, @@ -348,6 +349,7 @@ static int sc_pkcs15_tccardos_init_func(sc_pkcs15_card_t *p15card) } int sc_pkcs15emu_tccardos_init_ex(sc_pkcs15_card_t *p15card, + struct sc_aid *aid, sc_pkcs15emu_opt_t *opts) { return sc_pkcs15_tccardos_init_func(p15card); diff --git a/src/libopensc/pkcs15-tcos.c b/src/libopensc/pkcs15-tcos.c index 29712888..f1415ffb 100644 --- a/src/libopensc/pkcs15-tcos.c +++ b/src/libopensc/pkcs15-tcos.c @@ -35,6 +35,7 @@ int sc_pkcs15emu_tcos_init_ex( sc_pkcs15_card_t *p15card, + struct sc_aid *, sc_pkcs15emu_opt_t *opts); static int insert_cert( @@ -488,6 +489,7 @@ static int detect_unicard( int sc_pkcs15emu_tcos_init_ex( sc_pkcs15_card_t *p15card, + struct sc_aid *aid, sc_pkcs15emu_opt_t *opts ){ sc_card_t *card = p15card->card; diff --git a/src/libopensc/pkcs15-westcos.c b/src/libopensc/pkcs15-westcos.c index 20cfe8b2..a85557a0 100644 --- a/src/libopensc/pkcs15-westcos.c +++ b/src/libopensc/pkcs15-westcos.c @@ -31,7 +31,7 @@ #include "cardctl.h" #include "common/compat_strlcpy.h" -int sc_pkcs15emu_westcos_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); +int sc_pkcs15emu_westcos_init_ex(sc_pkcs15_card_t *, struct sc_aid *, sc_pkcs15emu_opt_t *); static int sc_pkcs15emu_westcos_init(sc_pkcs15_card_t * p15card) { @@ -239,6 +239,7 @@ static int westcos_detect_card(sc_pkcs15_card_t * p15card) } int sc_pkcs15emu_westcos_init_ex(sc_pkcs15_card_t * p15card, + struct sc_aid *aid, sc_pkcs15emu_opt_t * opts) { int r; diff --git a/src/libopensc/pkcs15.c b/src/libopensc/pkcs15.c index c0c7bc31..c1bf176e 100644 --- a/src/libopensc/pkcs15.c +++ b/src/libopensc/pkcs15.c @@ -1223,7 +1223,7 @@ sc_pkcs15_bind(struct sc_card *card, struct sc_aid *aid, sc_log(ctx, "PKCS#15 emulation enabled"); emu_first = scconf_get_bool(conf_block, "try_emulation_first", 0); if (emu_first || sc_pkcs15_is_emulation_only(card)) { - r = sc_pkcs15_bind_synthetic(p15card); + r = sc_pkcs15_bind_synthetic(p15card, aid); if (r == SC_SUCCESS) goto done; r = sc_pkcs15_bind_internal(p15card, aid); @@ -1233,7 +1233,7 @@ sc_pkcs15_bind(struct sc_card *card, struct sc_aid *aid, r = sc_pkcs15_bind_internal(p15card, aid); if (r == SC_SUCCESS) goto done; - r = sc_pkcs15_bind_synthetic(p15card); + r = sc_pkcs15_bind_synthetic(p15card, aid); if (r < 0) goto error; } @@ -1279,6 +1279,7 @@ __sc_pkcs15_search_objects(struct sc_pkcs15_card *p15card, unsigned int class_ma struct sc_pkcs15_df *df = NULL; unsigned int df_mask = 0; size_t match_count = 0; + int r; if (type) class_mask |= SC_PKCS15_TYPE_TO_CLASS(type); @@ -1315,9 +1316,12 @@ __sc_pkcs15_search_objects(struct sc_pkcs15_card *p15card, unsigned int class_ma } if (df->enumerated) continue; - /* Enumerate the DF's, so p15card->obj_list is - * populated. */ - if (SC_SUCCESS != sc_pkcs15_parse_df(p15card, df)) + /* Enumerate the DF's, so p15card->obj_list is populated. */ + if (p15card->ops.parse_df) + r = p15card->ops.parse_df(p15card, df); + else + r = sc_pkcs15_parse_df(p15card, df); + if (r != SC_SUCCESS) continue; } @@ -2022,11 +2026,6 @@ sc_pkcs15_parse_df(struct sc_pkcs15_card *p15card, struct sc_pkcs15_df *df) sc_log(ctx, "called; path=%s, type=%d, enum=%d", sc_print_path(&df->path), df->type, df->enumerated); - if (p15card->ops.parse_df) { - r = p15card->ops.parse_df(p15card, df); - LOG_FUNC_RETURN(ctx, r); - } - if (df->enumerated) LOG_FUNC_RETURN(ctx, SC_SUCCESS); diff --git a/src/libopensc/pkcs15.h b/src/libopensc/pkcs15.h index b8aa6598..42d4fce7 100644 --- a/src/libopensc/pkcs15.h +++ b/src/libopensc/pkcs15.h @@ -945,7 +945,7 @@ typedef struct sc_pkcs15emu_opt { #define SC_PKCS15EMU_FLAGS_NO_CHECK 0x00000001 -extern int sc_pkcs15_bind_synthetic(struct sc_pkcs15_card *); +extern int sc_pkcs15_bind_synthetic(struct sc_pkcs15_card *, struct sc_aid *); extern int sc_pkcs15_is_emulation_only(sc_card_t *); int sc_pkcs15emu_object_add(struct sc_pkcs15_card *, unsigned int,