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