On 02/03/06, Nils Larsch <[EMAIL PROTECTED]> wrote: > Nils Larsch wrote: > > Ludovic Rousseau wrote: > > > >> Hello, > >> > >> I would like to use the function parse_tokeninfo() wich is defined > >> static in libopensc/pkcs15.c. > >> > >> In order to keep the same naming scheme I propose to rename it in > >> sc_pkcs15_parse_tokeninfo(). I added its definition in > >> libopensc/pkcs15.h > >> > >> This function is only used once so the impacts on the code are very > >> limited. > >> Patch included. > >> > >> Any comment or objection? > > > > > > well parse_tokeninfo() isn't really a function I would like to > > export as the return parameter, the sc_pkcs15_card_t object, is > > not really suitable for this function. Better would be something > > like > > > > typedef struct { > > unsigned int version; > > the various tokenInfo fields > > } sc_token_info_t; > > > > int sc_pkcs15_parse_tokeninfo(sc_token_info_t *ti, > > const unsigned char * , size_t );
That would be great. > see attached patch for a experimental implementation > Index: src/libopensc/pkcs15.c > =================================================================== > --- src/libopensc/pkcs15.c (Revision 2861) > +++ src/libopensc/pkcs15.c (Arbeitskopie) > @@ -49,19 +49,30 @@ > { NULL, 0, 0, 0, NULL, NULL } > }; > > -static void parse_tokeninfo(struct sc_pkcs15_card *card, const u8 * buf, > size_t buflen) > +typedef struct { > + unsigned int version; > + unsigned int flags; > + char *label; > + char *serial_number; > + char *manufacturer_id; > + char *last_update; > + char *preferred_language; > +} sc_pkcs15_tokeninfo_t; I may also need the supportedAlgorithms field. This field exists in sc_pkcs15_card_t as: struct sc_pkcs15_algorithm_info alg_info[1]; but I could not find where this structure is filled or used. I would also need to add the objId field in struct sc_pkcs15_algorithm_info. In a similar way (and for the symmetry of the API) the function sc_pkcs15_encode_tokeninfo() should be changed to use the new type sc_pkcs15_tokeninfo_t instead of a struct sc_pkcs15_card. Patch attached. It contains Nils patch with some changes: - declare sc_pkcs15_tokeninfo_t in src/libopensc/pkcs15.h instead of src/libopensc/pkcs15.c - sc_pkcs15_parse_tokeninfo() is not static - add sc_pkcs15_parse_tokeninfo() in src/libopensc/pkcs15.h plus my paches: - change sc_pkcs15_encode_tokeninfo API - use the new API in sc_pkcs15init_update_tokeninf() I would like to commit this patch first and then work on other changes. Bye, -- Dr. Ludovic Rousseau
Index: src/pkcs15init/pkcs15-lib.c =================================================================== --- src/pkcs15init/pkcs15-lib.c (révision 2865) +++ src/pkcs15init/pkcs15-lib.c (copie de travail) @@ -2387,6 +2387,7 @@ static int sc_pkcs15init_update_tokeninf struct sc_profile *profile) { struct sc_card *card = p15card->card; + sc_pkcs15_tokeninfo_t tokeninfo; u8 *buf = NULL; size_t size; int r; @@ -2398,7 +2399,16 @@ static int sc_pkcs15init_update_tokeninf if (p15card->last_update == NULL) return SC_ERROR_INTERNAL; - r = sc_pkcs15_encode_tokeninfo(card->ctx, p15card, &buf, &size); + /* create a temporary tokeninfo structure */ + tokeninfo.version = p15card->version; + tokeninfo.flags = p15card->flags; + tokeninfo.label = p15card->label; + tokeninfo.serial_number = p15card->serial_number; + tokeninfo.manufacturer_id = p15card->manufacturer_id; + tokeninfo.last_update = p15card->last_update; + tokeninfo.preferred_language = p15card->preferred_language; + + r = sc_pkcs15_encode_tokeninfo(card->ctx, &tokeninfo, &buf, &size); if (r >= 0) r = sc_pkcs15init_update_file(profile, card, p15card->file_tokeninfo, buf, size); Index: src/libopensc/pkcs15.c =================================================================== --- src/libopensc/pkcs15.c (révision 2865) +++ src/libopensc/pkcs15.c (copie de travail) @@ -49,19 +49,20 @@ static const struct sc_asn1_entry c_asn1 { NULL, 0, 0, 0, NULL, NULL } }; -static void parse_tokeninfo(struct sc_pkcs15_card *card, const u8 * buf, size_t buflen) +int sc_pkcs15_parse_tokeninfo(sc_context_t *ctx, + sc_pkcs15_tokeninfo_t *ti, const u8 *buf, size_t blen) { int r; u8 serial[128]; size_t i; size_t serial_len = sizeof(serial); u8 mnfid[SC_PKCS15_MAX_LABEL_SIZE]; - size_t mnfid_len = sizeof(mnfid); + size_t mnfid_len = sizeof(mnfid); u8 label[SC_PKCS15_MAX_LABEL_SIZE]; size_t label_len = sizeof(label); u8 last_update[32]; size_t lupdate_len = sizeof(last_update) - 1; - size_t flags_len = sizeof(card->flags); + size_t flags_len = sizeof(ti->flags); struct sc_asn1_entry asn1_toki[13], asn1_tokeninfo[3]; u8 preferred_language[3]; size_t lang_length = sizeof(preferred_language); @@ -69,11 +70,11 @@ static void parse_tokeninfo(struct sc_pk memset(last_update, 0, sizeof(last_update)); sc_copy_asn1_entry(c_asn1_toki, asn1_toki); sc_copy_asn1_entry(c_asn1_tokeninfo, asn1_tokeninfo); - sc_format_asn1_entry(asn1_toki + 0, &card->version, NULL, 0); + sc_format_asn1_entry(asn1_toki + 0, &ti->version, NULL, 0); sc_format_asn1_entry(asn1_toki + 1, serial, &serial_len, 0); sc_format_asn1_entry(asn1_toki + 2, mnfid, &mnfid_len, 0); sc_format_asn1_entry(asn1_toki + 3, label, &label_len, 0); - sc_format_asn1_entry(asn1_toki + 4, &card->flags, &flags_len, 0); + sc_format_asn1_entry(asn1_toki + 4, &ti->flags, &flags_len, 0); sc_format_asn1_entry(asn1_toki + 5, NULL, NULL, 0); sc_format_asn1_entry(asn1_toki + 6, NULL, NULL, 0); sc_format_asn1_entry(asn1_toki + 7, NULL, NULL, 0); @@ -83,59 +84,59 @@ static void parse_tokeninfo(struct sc_pk sc_format_asn1_entry(asn1_toki + 11, preferred_language, &lang_length, 0); sc_format_asn1_entry(asn1_tokeninfo, asn1_toki, NULL, 0); - r = sc_asn1_decode(card->card->ctx, asn1_tokeninfo, buf, buflen, NULL, NULL); + r = sc_asn1_decode(ctx, asn1_tokeninfo, buf, blen, NULL, NULL); if (r) { - sc_error(card->card->ctx, - "ASN.1 parsing of EF(TokenInfo) failed: %s\n", + sc_error(ctx, "ASN.1 parsing of EF(TokenInfo) failed: %s\n", sc_strerror(r)); - goto err; - } - card->version += 1; - card->serial_number = (char *) malloc(serial_len * 2 + 1); - if (!card->serial_number) { - sc_error(card->card->ctx, "Memory allocation failed\n"); - goto err; + return r; } - card->serial_number[0] = 0; + ti->version += 1; + ti->serial_number = (char *) malloc(serial_len * 2 + 1); + if (ti->serial_number == NULL) + return SC_ERROR_OUT_OF_MEMORY; + ti->serial_number[0] = 0; for (i = 0; i < serial_len; i++) { char byte[3]; sprintf(byte, "%02X", serial[i]); - strcat(card->serial_number, byte); + strcat(ti->serial_number, byte); } - if (card->manufacturer_id == NULL) { + if (ti->manufacturer_id == NULL) { if (asn1_toki[2].flags & SC_ASN1_PRESENT) - card->manufacturer_id = strdup((char *) mnfid); + ti->manufacturer_id = strdup((char *) mnfid); else - card->manufacturer_id = strdup("(unknown)"); + ti->manufacturer_id = strdup("(unknown)"); + if (ti->manufacturer_id == NULL) + return SC_ERROR_OUT_OF_MEMORY; } - if (card->label == NULL) { + if (ti->label == NULL) { if (asn1_toki[3].flags & SC_ASN1_PRESENT) - card->label = strdup((char *) label); + ti->label = strdup((char *) label); else - card->label = strdup("(unknown)"); + ti->label = strdup("(unknown)"); + if (ti->label == NULL) + return SC_ERROR_OUT_OF_MEMORY; + } + if (asn1_toki[10].flags & SC_ASN1_PRESENT) { + ti->last_update = strdup((char *)last_update); + if (ti->last_update == NULL) + return SC_ERROR_OUT_OF_MEMORY; } - if (asn1_toki[10].flags & SC_ASN1_PRESENT) - card->last_update = strdup((char *)last_update); if (asn1_toki[11].flags & SC_ASN1_PRESENT) { preferred_language[2] = 0; - card->preferred_language = strdup((char *)preferred_language); + ti->preferred_language = strdup((char *)preferred_language); + if (ti->preferred_language == NULL) + return SC_ERROR_OUT_OF_MEMORY; } - return; -err: - if (card->serial_number == NULL) - card->serial_number = strdup("(unknown)"); - if (card->manufacturer_id == NULL) - card->manufacturer_id = strdup("(unknown)"); - return; + return SC_SUCCESS; } int sc_pkcs15_encode_tokeninfo(sc_context_t *ctx, - struct sc_pkcs15_card *card, + sc_pkcs15_tokeninfo_t *ti, u8 **buf, size_t *buflen) { int r; - int version = card->version; + int version = ti->version; size_t serial_len, mnfid_len, label_len, flags_len, last_upd_len; struct sc_asn1_entry asn1_toki[13], asn1_tokeninfo[2]; @@ -144,30 +145,30 @@ int sc_pkcs15_encode_tokeninfo(sc_contex sc_copy_asn1_entry(c_asn1_tokeninfo, asn1_tokeninfo); version--; sc_format_asn1_entry(asn1_toki + 0, &version, NULL, 1); - if (card->serial_number != NULL) { + if (ti->serial_number != NULL) { u8 serial[128]; serial_len = 0; - if (strlen(card->serial_number)/2 > sizeof(serial)) + if (strlen(ti->serial_number)/2 > sizeof(serial)) return SC_ERROR_BUFFER_TOO_SMALL; serial_len = sizeof(serial); - if (sc_hex_to_bin(card->serial_number, serial, &serial_len) < 0) + if (sc_hex_to_bin(ti->serial_number, serial, &serial_len) < 0) return SC_ERROR_INVALID_ARGUMENTS; sc_format_asn1_entry(asn1_toki + 1, serial, &serial_len, 1); } else sc_format_asn1_entry(asn1_toki + 1, NULL, NULL, 0); - if (card->manufacturer_id != NULL) { - mnfid_len = strlen(card->manufacturer_id); - sc_format_asn1_entry(asn1_toki + 2, card->manufacturer_id, &mnfid_len, 1); + if (ti->manufacturer_id != NULL) { + mnfid_len = strlen(ti->manufacturer_id); + sc_format_asn1_entry(asn1_toki + 2, ti->manufacturer_id, &mnfid_len, 1); } else sc_format_asn1_entry(asn1_toki + 2, NULL, NULL, 0); - if (card->label != NULL) { - label_len = strlen(card->label); - sc_format_asn1_entry(asn1_toki + 3, card->label, &label_len, 1); + if (ti->label != NULL) { + label_len = strlen(ti->label); + sc_format_asn1_entry(asn1_toki + 3, ti->label, &label_len, 1); } else sc_format_asn1_entry(asn1_toki + 3, NULL, NULL, 0); - if (card->flags) { - flags_len = sizeof(card->flags); - sc_format_asn1_entry(asn1_toki + 4, &card->flags, &flags_len, 1); + if (ti->flags) { + flags_len = sizeof(ti->flags); + sc_format_asn1_entry(asn1_toki + 4, &ti->flags, &flags_len, 1); } else sc_format_asn1_entry(asn1_toki + 4, NULL, NULL, 0); sc_format_asn1_entry(asn1_toki + 5, NULL, NULL, 0); @@ -175,9 +176,9 @@ int sc_pkcs15_encode_tokeninfo(sc_contex sc_format_asn1_entry(asn1_toki + 7, NULL, NULL, 0); sc_format_asn1_entry(asn1_toki + 8, NULL, NULL, 0); sc_format_asn1_entry(asn1_toki + 9, NULL, NULL, 0); - if (card->last_update != NULL) { - last_upd_len = strlen(card->last_update); - sc_format_asn1_entry(asn1_toki + 10, card->last_update, &last_upd_len, 1); + if (ti->last_update != NULL) { + last_upd_len = strlen(ti->last_update); + sc_format_asn1_entry(asn1_toki + 10, ti->last_update, &last_upd_len, 1); } else sc_format_asn1_entry(asn1_toki + 10, NULL, NULL, 0); sc_format_asn1_entry(asn1_toki + 11, NULL, NULL, 0); @@ -489,6 +490,7 @@ static int sc_pkcs15_bind_internal(sc_pk sc_path_t tmppath; sc_card_t *card = p15card->card; sc_context_t *ctx = card->ctx; + sc_pkcs15_tokeninfo_t tokeninfo; if (ctx->debug > 4) sc_debug(ctx, "trying normal pkcs15 processing\n"); @@ -618,7 +620,18 @@ static int sc_pkcs15_bind_internal(sc_pk err = SC_ERROR_PKCS15_APP_NOT_FOUND; goto end; } - parse_tokeninfo(p15card, buf, (size_t)err); + + memset(&tokeninfo, 0, sizeof(tokeninfo)); + err = sc_pkcs15_parse_tokeninfo(ctx, &tokeninfo, buf, (size_t)err); + if (err != SC_SUCCESS) + goto end; + p15card->version = tokeninfo.version; + p15card->label = tokeninfo.label; + p15card->serial_number = tokeninfo.serial_number; + p15card->manufacturer_id = tokeninfo.manufacturer_id; + p15card->last_update = tokeninfo.last_update; + p15card->flags = tokeninfo.flags; + p15card->preferred_language = tokeninfo.preferred_language; ok = 1; end: Index: src/libopensc/pkcs15.h =================================================================== --- src/libopensc/pkcs15.h (révision 2865) +++ src/libopensc/pkcs15.h (copie de travail) @@ -343,6 +343,16 @@ typedef struct sc_pkcs15_unusedspace sc_ #define SC_PKCS15_CARD_MAGIC 0x10203040 +typedef struct { + unsigned int version; + unsigned int flags; + char *label; + char *serial_number; + char *manufacturer_id; + char *last_update; + char *preferred_language; +} sc_pkcs15_tokeninfo_t; + typedef struct sc_pkcs15_card { sc_card_t *card; char *label; @@ -507,8 +517,11 @@ int sc_pkcs15_find_so_pin(struct sc_pkcs int sc_pkcs15_encode_dir(struct sc_context *ctx, struct sc_pkcs15_card *card, u8 **buf, size_t *buflen); +int sc_pkcs15_parse_tokeninfo(sc_context_t *ctx, + sc_pkcs15_tokeninfo_t *ti, + const u8 *buf, size_t blen); int sc_pkcs15_encode_tokeninfo(struct sc_context *ctx, - struct sc_pkcs15_card *card, + sc_pkcs15_tokeninfo_t *ti, u8 **buf, size_t *buflen); int sc_pkcs15_encode_odf(struct sc_context *ctx, struct sc_pkcs15_card *card,
_______________________________________________ opensc-devel mailing list opensc-devel@lists.opensc-project.org http://www.opensc-project.org/mailman/listinfo/opensc-devel