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

Reply via email to