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 );

see attached patch for a experimental implementation

Cheers,
Nils
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;
+
+static 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 +80,11 @@
        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,51 +94,51 @@
        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;
+               return r;
        }
-       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;
-       }
-       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)
-               card->last_update = strdup((char *)last_update);
+       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[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,
@@ -489,6 +500,7 @@
        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,8 +630,19 @@
                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:
        if (!ok) {
_______________________________________________
opensc-devel mailing list
opensc-devel@lists.opensc-project.org
http://www.opensc-project.org/mailman/listinfo/opensc-devel

Reply via email to