Dear OpenSC developers,

the patch I proposed is mostly complete. The total count of lines is
huge, but individual changes are trivial. An exception to this is the
pkcs15 emulation related to the Oberthur cards. It makes heavy use of
flags before writing the TokenInfo to the card. Since the two different
kinds of flags are now divided, this required more changes than on other
places. Therefore it would be helpful if someone could test the
initialisation of oberthur cards after applying the attached patch.

For now I would like to know, if there are any complains about the patch
and your opinion about renaming the TokenInfo related flags to something
like SC_TOKENINFO_FLAGS.

Kind Regards
Andre Zepezauer
Index: src/tools/pkcs15-crypt.c
===================================================================
--- src/tools/pkcs15-crypt.c	(revision 4777)
+++ src/tools/pkcs15-crypt.c	(working copy)
@@ -583,7 +583,7 @@
 		goto end;
 	}
 	if (verbose)
-		fprintf(stderr, "Found %s!\n", p15card->label);
+		fprintf(stderr, "Found %s!\n", p15card->tokeninfo->label);
 
 	if (do_decipher) {
 		if ((err = get_key(SC_PKCS15_PRKEY_USAGE_DECRYPT, &key))
Index: src/tools/pkcs15-init.c
===================================================================
--- src/tools/pkcs15-init.c	(revision 4777)
+++ src/tools/pkcs15-init.c	(working copy)
@@ -462,7 +462,7 @@
 			 * sure we're not messing things up */
 
 			if (verbose)
-				printf("Found %s\n", p15card->label);
+				printf("Found %s\n", p15card->tokeninfo->label);
 
 			sc_pkcs15init_set_p15card(profile, p15card);
 
@@ -627,7 +627,7 @@
 
 	p15card = sc_pkcs15_card_new();
 	p15card->card = in_card;
-	p15card->label = strdup("Dummy PKCS#15 object");
+	p15card->tokeninfo->label = strdup("Dummy PKCS#15 object");
 
 	ignore_cmdline_pins++;
 	r = sc_pkcs15init_erase_card(p15card, profile);
Index: src/tools/pkcs15-tool.c
===================================================================
--- src/tools/pkcs15-tool.c	(revision 4777)
+++ src/tools/pkcs15-tool.c	(working copy)
@@ -1105,17 +1105,17 @@
 
 	int i, count = 0;
 
-	printf("PKCS#15 Card [%s]:\n", p15card->label);
-	printf("\tVersion        : %d\n", p15card->version);
-	printf("\tSerial number  : %s\n", p15card->serial_number);
-	printf("\tManufacturer ID: %s\n", p15card->manufacturer_id);
-	if (p15card->last_update)
-		printf("\tLast update    : %s\n", p15card->last_update);
-	if (p15card->preferred_language)
-		printf("\tLanguage       : %s\n", p15card->preferred_language);
+	printf("PKCS#15 Card [%s]:\n", p15card->tokeninfo->label);
+	printf("\tVersion        : %d\n", p15card->tokeninfo->version);
+	printf("\tSerial number  : %s\n", p15card->tokeninfo->serial_number);
+	printf("\tManufacturer ID: %s\n", p15card->tokeninfo->manufacturer_id);
+	if (p15card->tokeninfo->last_update)
+		printf("\tLast update    : %s\n", p15card->tokeninfo->last_update);
+	if (p15card->tokeninfo->preferred_language)
+		printf("\tLanguage       : %s\n", p15card->tokeninfo->preferred_language);
 	printf("\tFlags          : ");
 	for (i = 0; i < 4; i++) {
-		if ((p15card->flags >> i) & 1) {
+		if ((p15card->tokeninfo->flags >> i) & 1) {
 			if (count)
 				printf(", ");
 			printf("%s", flags[i]);
@@ -1731,7 +1731,7 @@
 	if (opt_no_cache)
 		p15card->opts.use_file_cache = 0;
 	if (verbose)
-		fprintf(stderr, "Found %s!\n", p15card->label);
+		fprintf(stderr, "Found %s!\n", p15card->tokeninfo->label);
 	
 	if (do_verify_pin)
 		if ((err = verify_pin()))
Index: src/pkcs11/framework-pkcs15.c
===================================================================
--- src/pkcs11/framework-pkcs15.c	(revision 4777)
+++ src/pkcs11/framework-pkcs15.c	(working copy)
@@ -192,7 +192,7 @@
 
 static void pkcs15_init_token_info(struct sc_pkcs15_card *p15card, CK_TOKEN_INFO_PTR pToken)
 {
-	strcpy_bp(pToken->manufacturerID, p15card->manufacturer_id, 32);
+	strcpy_bp(pToken->manufacturerID, p15card->tokeninfo->manufacturer_id, 32);
 	if (p15card->flags & SC_PKCS15_CARD_FLAG_EMULATED)
 		strcpy_bp(pToken->model, "PKCS#15 emulated", 16);
 	else
@@ -203,13 +203,13 @@
 	 * _Assuming_ that the serial number is a Big Endian counter, this
 	 * will assure that the serial within each type of card will be
 	 * unique in pkcs11 (at least for the first 8^16 cards :-) */
-	if (p15card->serial_number != NULL) {
-		int sn_start = strlen(p15card->serial_number) - 16;
+	if (p15card->tokeninfo->serial_number != NULL) {
+		int sn_start = strlen(p15card->tokeninfo->serial_number) - 16;
 
 		if (sn_start < 0)
 			sn_start = 0;
 		strcpy_bp(pToken->serialNumber,
-			p15card->serial_number + sn_start,
+			p15card->tokeninfo->serial_number + sn_start,
 			16);
 	}
 
@@ -791,13 +791,13 @@
 
 		if (auth->label[0]) {
 			snprintf(tmp, sizeof(tmp), "%s (%s)",
-				p15card->label, auth->label);
+				p15card->tokeninfo->label, auth->label);
 		} else {
-			snprintf(tmp, sizeof(tmp), "%s", p15card->label);
+			snprintf(tmp, sizeof(tmp), "%s", p15card->tokeninfo->label);
 		}
 		slot->token_info.flags |= CKF_LOGIN_REQUIRED;
 	} else
-		snprintf(tmp, sizeof(tmp), "%s", p15card->label);
+		snprintf(tmp, sizeof(tmp), "%s", p15card->tokeninfo->label);
 	strcpy_bp(slot->token_info.label, tmp, 32);
 
 	if (pin_info && pin_info->magic == SC_PKCS15_PIN_MAGIC) {
Index: src/tests/print.c
===================================================================
--- src/tests/print.c	(revision 4777)
+++ src/tests/print.c	(working copy)
@@ -25,15 +25,15 @@
 	int i, count = 0;
 
 	assert(mycard != NULL);
-	printf("PKCS#15 Card [%s]:\n", mycard->label);
-	printf("\tVersion        : %d\n", mycard->version);
-	printf("\tSerial number  : %s\n", mycard->serial_number);
-	printf("\tManufacturer ID: %s\n", mycard->manufacturer_id);
-	if (mycard->preferred_language)
-		printf("\tLanguage       : %s\n", mycard->preferred_language);
+	printf("PKCS#15 Card [%s]:\n", mycard->tokeninfo->label);
+	printf("\tVersion        : %d\n", mycard->tokeninfo->version);
+	printf("\tSerial number  : %s\n", mycard->tokeninfo->serial_number);
+	printf("\tManufacturer ID: %s\n", mycard->tokeninfo->manufacturer_id);
+	if (mycard->tokeninfo->preferred_language)
+		printf("\tLanguage       : %s\n", mycard->tokeninfo->preferred_language);
 	printf("\tFlags          : ");
 	for (i = 0; i < 4; i++) {
-		if ((mycard->flags >> i) & 1) {
+		if ((mycard->tokeninfo->flags >> i) & 1) {
 			if (count)
 				printf(", ");
 			printf("%s", flags[i]);
Index: src/pkcs15init/pkcs15-oberthur.c
===================================================================
--- src/pkcs15init/pkcs15-oberthur.c	(revision 4777)
+++ src/pkcs15init/pkcs15-oberthur.c	(working copy)
@@ -61,14 +61,12 @@
 
 static int 
 cosm_write_tokeninfo (struct sc_pkcs15_card *p15card, struct sc_profile *profile, 
-		char *label, unsigned p15_flags)
+		char *label, unsigned card_flags, unsigned tinfo_flags)
 {
 	struct sc_context *ctx = p15card->card->ctx;
 	struct sc_file *file = NULL;
-	unsigned mask = SC_PKCS15_CARD_FLAG_PRN_GENERATION 
-		| SC_PKCS15_CARD_FLAG_LOGIN_REQUIRED 
-		| SC_PKCS15_CARD_FLAG_USER_PIN_INITIALIZED 
-		| SC_PKCS15_CARD_FLAG_TOKEN_INITIALIZED;
+	unsigned int card_mask = SC_PKCS15_CARD_FLAG_USER_PIN_INITIALIZED | SC_PKCS15_CARD_FLAG_TOKEN_INITIALIZED;
+	unsigned int tinfo_mask = SC_PKCS15_CARD_FLAG_PRN_GENERATION | SC_PKCS15_CARD_FLAG_LOGIN_REQUIRED;
 	int rv, flags = 0;
 	size_t sz;
 	char *buffer = NULL;
@@ -77,7 +75,7 @@
 		return SC_ERROR_INVALID_ARGUMENTS;
 	
 	SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_VERBOSE);
-	sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "cosm_write_tokeninfo() label '%s'; flags 0x%X", label, p15_flags);
+	sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "cosm_write_tokeninfo() label '%s'; card_flags 0x%X; tinfo_flags  0x%X", label, card_flags, tinfo_flags);
 	if (sc_profile_get_file(profile, COSM_TITLE"-token-info", &file))
 		SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_INCONSISTENT_PROFILE, "Cannot find "COSM_TITLE"-token-info");
 
@@ -90,10 +88,10 @@
 
 	if (label)   
 		strncpy(buffer, label, file->size - 4);
-	else if (p15card->label)
-		snprintf(buffer, file->size - 4, "%s", p15card->label);
-	else if (profile->p15_spec && profile->p15_spec->label)
-		snprintf(buffer, file->size - 4, "%s", profile->p15_spec->label);
+	else if (p15card->tokeninfo->label)
+		snprintf(buffer, file->size - 4, "%s", p15card->tokeninfo->label);
+	else if (profile->p15_spec && profile->p15_spec->tokeninfo->label)
+		snprintf(buffer, file->size - 4, "%s", profile->p15_spec->tokeninfo->label);
 	else
 		snprintf(buffer, file->size - 4, "OpenSC-Token");
 
@@ -101,16 +99,16 @@
 	if (sz < file->size - 4)
 		memset(buffer + sz, ' ', file->size - sz);
 
-	if (p15_flags & SC_PKCS15_CARD_FLAG_PRN_GENERATION)
+	if (tinfo_flags & SC_PKCS15_CARD_FLAG_PRN_GENERATION)
 		flags |= COSM_TOKEN_FLAG_PRN_GENERATION;
 	
-	if (p15_flags & SC_PKCS15_CARD_FLAG_LOGIN_REQUIRED)
+	if (tinfo_flags & SC_PKCS15_CARD_FLAG_LOGIN_REQUIRED)
 		flags |= COSM_TOKEN_FLAG_LOGIN_REQUIRED;
 	
-	if (p15_flags & SC_PKCS15_CARD_FLAG_USER_PIN_INITIALIZED)
+	if (card_flags & SC_PKCS15_CARD_FLAG_USER_PIN_INITIALIZED)
 		flags |= COSM_TOKEN_FLAG_USER_PIN_INITIALIZED;
 	
-	if (p15_flags & SC_PKCS15_CARD_FLAG_TOKEN_INITIALIZED)
+	if (card_flags & SC_PKCS15_CARD_FLAG_TOKEN_INITIALIZED)
 		flags |= COSM_TOKEN_FLAG_TOKEN_INITIALIZED;
 
 	sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "cosm_write_tokeninfo() token label '%s'; oberthur flags 0x%X", buffer, flags);
@@ -123,10 +121,13 @@
 	if (rv > 0)
 		rv = 0;
 
-	p15card->flags = (p15card->flags & ~mask) | p15_flags;
+	p15card->flags = (p15card->flags & ~card_mask) | card_flags;
+	p15card->tokeninfo->flags = (p15card->tokeninfo->flags & ~tinfo_mask) | tinfo_flags;
 
-	if (profile->p15_spec)
-		profile->p15_spec->flags = (profile->p15_spec->flags & ~mask) | p15_flags;
+	if (profile->p15_spec) {
+		profile->p15_spec->flags = (profile->p15_spec->flags & ~card_mask) | card_flags;
+		profile->p15_spec->tokeninfo->flags = (profile->p15_spec->tokeninfo->flags & ~tinfo_mask) | tinfo_flags;
+	}
 
 	free(buffer);
 	SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, rv);
@@ -282,7 +283,7 @@
 	}
 
 	rv = cosm_write_tokeninfo(p15card, profile, NULL,
-		SC_PKCS15_CARD_FLAG_TOKEN_INITIALIZED | SC_PKCS15_CARD_FLAG_PRN_GENERATION);
+		SC_PKCS15_CARD_FLAG_TOKEN_INITIALIZED, SC_PKCS15_CARD_FLAG_PRN_GENERATION);
 
 	SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, rv);
 }
@@ -386,10 +387,8 @@
 		SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "cosm_update_pin() failed to change PIN");
 
 		rv = cosm_write_tokeninfo(p15card, profile, NULL,
-			SC_PKCS15_CARD_FLAG_TOKEN_INITIALIZED 
-			| SC_PKCS15_CARD_FLAG_PRN_GENERATION
-			| SC_PKCS15_CARD_FLAG_LOGIN_REQUIRED
-			| SC_PKCS15_CARD_FLAG_USER_PIN_INITIALIZED);
+			SC_PKCS15_CARD_FLAG_TOKEN_INITIALIZED | SC_PKCS15_CARD_FLAG_USER_PIN_INITIALIZED,
+			SC_PKCS15_CARD_FLAG_PRN_GENERATION | SC_PKCS15_CARD_FLAG_LOGIN_REQUIRED);
 		SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, rv, "cosm_update_pin() failed to update tokeninfo");
 	}
 
@@ -839,10 +838,10 @@
 	memcpy(buf, tinfo->label, label_len);
 	memset(buf  + label_len, ' ', file->size - 4 - label_len);
 
-	if (p15card->flags & SC_PKCS15_CARD_FLAG_PRN_GENERATION)
+	if (p15card->tokeninfo->flags & SC_PKCS15_CARD_FLAG_PRN_GENERATION)
 		flags |= 0x01;
 	
-	if (p15card->flags & SC_PKCS15_CARD_FLAG_LOGIN_REQUIRED)
+	if (p15card->tokeninfo->flags & SC_PKCS15_CARD_FLAG_LOGIN_REQUIRED)
 		flags |= 0x04;
 	
 	if (p15card->flags & SC_PKCS15_CARD_FLAG_USER_PIN_INITIALIZED)
Index: src/pkcs15init/profile.c
===================================================================
--- src/pkcs15init/profile.c	(revision 4777)
+++ src/pkcs15init/profile.c	(working copy)
@@ -283,11 +283,11 @@
 	pro->pkcs15.do_last_update = 1;
 
 	if (p15card) {
-		p15card->label = strdup("OpenSC Card");
-		p15card->manufacturer_id = strdup("OpenSC Project");
-		p15card->serial_number = strdup("0000");
-		p15card->flags = SC_PKCS15_CARD_FLAG_EID_COMPLIANT;
-		p15card->version = 1;
+		p15card->tokeninfo->label = strdup("OpenSC Card");
+		p15card->tokeninfo->manufacturer_id = strdup("OpenSC Project");
+		p15card->tokeninfo->serial_number = strdup("0000");
+		p15card->tokeninfo->flags = SC_PKCS15_CARD_FLAG_EID_COMPLIANT;
+		p15card->tokeninfo->version = 1;
 
 		/* Set up EF(TokenInfo) and EF(ODF) */
 		p15card->file_tokeninfo = init_file(SC_FILE_TYPE_WORKING_EF);
@@ -822,7 +822,7 @@
 {
 	struct sc_pkcs15_card	*p15card = cur->profile->p15_spec;
 
-	return setstr(&p15card->label, argv[0]);
+	return setstr(&p15card->tokeninfo->label, argv[0]);
 }
 
 static int
@@ -830,7 +830,7 @@
 {
 	struct sc_pkcs15_card	*p15card = cur->profile->p15_spec;
 
-	return setstr(&p15card->manufacturer_id, argv[0]);
+	return setstr(&p15card->tokeninfo->manufacturer_id, argv[0]);
 }
 
 /*
Index: src/pkcs15init/pkcs15-lib.c
===================================================================
--- src/pkcs15init/pkcs15-lib.c	(revision 4777)
+++ src/pkcs15init/pkcs15-lib.c	(working copy)
@@ -781,11 +781,11 @@
 	}
 
 	if (args->label) {
-		if (p15card->label)
-			free(p15card->label);
-		p15card->label = strdup(args->label);
+		if (p15card->tokeninfo->label)
+			free(p15card->tokeninfo->label);
+		p15card->tokeninfo->label = strdup(args->label);
 	}
-	app->label = strdup(p15card->label);
+	app->label = strdup(p15card->tokeninfo->label);
 
 	/* See if we've set an SO PIN */
 	r = sc_pkcs15init_add_object(p15card, profile, SC_PKCS15_AODF, pin_obj);
@@ -2408,21 +2408,13 @@
 	int		r;
 
 	/* set lastUpdate field */
-	if (p15card->last_update != NULL)
-		free(p15card->last_update);
-	p15card->last_update = get_generalized_time(card->ctx);
-	if (p15card->last_update == NULL)
+	if (p15card->tokeninfo->last_update != NULL)
+		free(p15card->tokeninfo->last_update);
+	p15card->tokeninfo->last_update = get_generalized_time(card->ctx);
+	if (p15card->tokeninfo->last_update == NULL)
 		return SC_ERROR_INTERNAL;
 
-	/* create a temporary tokeninfo structure */
-	tokeninfo.version = p15card->version;
-	/* ugly opensc hack, we use the some high flags internaly */
-	tokeninfo.flags = p15card->flags & 0xffffff; 
-	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;
+	tokeninfo = *(p15card->tokeninfo);
 
 	if (profile->ops->emu_update_tokeninfo)
 		return profile->ops->emu_update_tokeninfo(profile, p15card, &tokeninfo);
@@ -3443,15 +3435,14 @@
 int
 sc_pkcs15init_get_manufacturer(struct sc_profile *profile, const char **res)
 {
-	*res = profile->p15_spec->manufacturer_id;
+	*res = profile->p15_spec->tokeninfo->manufacturer_id;
 	return 0;
 }
 
-
 int
 sc_pkcs15init_get_serial(struct sc_profile *profile, const char **res)
 {
-	*res = profile->p15_spec->serial_number;
+	*res = profile->p15_spec->tokeninfo->serial_number;
 	return 0;
 }
 
@@ -3459,9 +3450,9 @@
 int
 sc_pkcs15init_set_serial(struct sc_profile *profile, const char *serial)
 {
-	if (profile->p15_spec->serial_number)
-		free(profile->p15_spec->serial_number);
-	profile->p15_spec->serial_number = strdup(serial);
+	if (profile->p15_spec->tokeninfo->serial_number)
+		free(profile->p15_spec->tokeninfo->serial_number);
+	profile->p15_spec->tokeninfo->serial_number = strdup(serial);
 
 	return 0;
 }
@@ -3470,7 +3461,7 @@
 int
 sc_pkcs15init_get_label(struct sc_profile *profile, const char **res)
 {
-	*res = profile->p15_spec->label;
+	*res = profile->p15_spec->tokeninfo->label;
 	return 0;
 }
 
Index: src/libopensc/pkcs15-oberthur.c
===================================================================
--- src/libopensc/pkcs15-oberthur.c	(revision 4777)
+++ src/libopensc/pkcs15-oberthur.c	(working copy)
@@ -360,14 +360,14 @@
 
 	flags = *(buff + 0x22) * 0x100 + *(buff + 0x23);
 	
-	p15card->label = strdup(label);
-	p15card->manufacturer_id = strdup("Oberthur/OpenSC");
+	p15card->tokeninfo->label = strdup(label);
+	p15card->tokeninfo->manufacturer_id = strdup("Oberthur/OpenSC");
 
 	if (flags & 0x01)
-		p15card->flags |= SC_PKCS15_CARD_FLAG_PRN_GENERATION;
+		p15card->tokeninfo->flags |= SC_PKCS15_CARD_FLAG_PRN_GENERATION;
 
 	if (flags & 0x04)
-		p15card->flags |= SC_PKCS15_CARD_FLAG_LOGIN_REQUIRED;
+		p15card->tokeninfo->flags |= SC_PKCS15_CARD_FLAG_LOGIN_REQUIRED;
 
 	if (flags & 0x0C)
 		p15card->flags |= SC_PKCS15_CARD_FLAG_USER_PIN_INITIALIZED;
@@ -375,8 +375,8 @@
 	if (flags & 0x0400)
 		p15card->flags |= SC_PKCS15_CARD_FLAG_TOKEN_INITIALIZED;
 
-	sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "label %s", p15card->label);
-	sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "manufacturer_id %s", p15card->manufacturer_id);
+	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);
 }
@@ -938,12 +938,12 @@
 	
 	SC_FUNC_CALLED(card->ctx, SC_LOG_DEBUG_VERBOSE);
 	sc_bin_to_hex(card->serialnr.value, card->serialnr.len, serial, sizeof(serial), 0);
-	p15card->serial_number = strdup(serial);
+	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->serial_number);
+	sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Oberthur init: serial %s", p15card->tokeninfo->serial_number);
 
 	sc_format_path(AWP_PIN_DF, &path);
 	rv = sc_select_file(card, &path, NULL);
Index: src/libopensc/pkcs15-cache.c
===================================================================
--- src/libopensc/pkcs15-cache.c	(revision 4777)
+++ src/libopensc/pkcs15-cache.c	(working copy)
@@ -58,14 +58,14 @@
 	}
 	for (i = 0; i < pathlen; i++)
 		sprintf(pathname + 2*i, "%02X", pathptr[i]);
-	if (p15card->serial_number != NULL) {
-		if (p15card->last_update != NULL)
+	if (p15card->tokeninfo->serial_number != NULL) {
+		if (p15card->tokeninfo->last_update != NULL)
 			r = snprintf(buf, bufsize, "%s/%s_%s_%s", dir,
-			     p15card->serial_number, p15card->last_update,
+			     p15card->tokeninfo->serial_number, p15card->tokeninfo->last_update,
 			     pathname);
 		else
 			r = snprintf(buf, bufsize, "%s/%s_DATE_%s", dir,
-			     p15card->serial_number, pathname);
+			     p15card->tokeninfo->serial_number, pathname);
 		if (r < 0)
 			return SC_ERROR_BUFFER_TOO_SMALL;
 	} else
Index: src/libopensc/pkcs15-openpgp.c
===================================================================
--- src/libopensc/pkcs15-openpgp.c	(revision 4777)
+++ src/libopensc/pkcs15-openpgp.c	(working copy)
@@ -87,23 +87,23 @@
 	size_t		length;
 	int		r, i;
 
-	set_string(&p15card->label, "OpenPGP Card");
-	set_string(&p15card->manufacturer_id, "OpenPGP project");
+	set_string(&p15card->tokeninfo->label, "OpenPGP Card");
+	set_string(&p15card->tokeninfo->manufacturer_id, "OpenPGP project");
 
 	if ((r = read_file(card, "004f", buffer, sizeof(buffer))) < 0)
 		goto failed;
 	sc_bin_to_hex(buffer, (size_t)r, string, sizeof(string), 0);
-	set_string(&p15card->serial_number, string);
-	p15card->version = (buffer[6] << 8) | buffer[7];
+	set_string(&p15card->tokeninfo->serial_number, string);
+	p15card->tokeninfo->version = (buffer[6] << 8) | buffer[7];
 
-	p15card->flags = SC_PKCS15_CARD_FLAG_PRN_GENERATION | SC_PKCS15_CARD_FLAG_EID_COMPLIANT;
+	p15card->tokeninfo->flags = SC_PKCS15_CARD_FLAG_PRN_GENERATION | SC_PKCS15_CARD_FLAG_EID_COMPLIANT;
 
 	/* Extract preferred language */
 	r = read_file(card, "00655f2d", string, sizeof(string)-1);
 	if (r < 0)
 		goto failed;
 	string[r] = '\0';
-	set_string(&p15card->preferred_language, string);
+	set_string(&p15card->tokeninfo->preferred_language, string);
 
 	/* Get Application Related Data (006E) */
 	if ((r = sc_get_data(card, 0x006E, buffer, sizeof(buffer))) < 0)
Index: src/libopensc/pkcs15-postecert.c
===================================================================
--- src/libopensc/pkcs15-postecert.c	(revision 4777)
+++ src/libopensc/pkcs15-postecert.c	(working copy)
@@ -193,9 +193,9 @@
 		goto failed;
 	}
 
-	set_string(&p15card->label, "Postecert & Cnipa Card");
-	set_string(&p15card->manufacturer_id, "Postecert");
-	set_string(&p15card->serial_number, "0000");
+	set_string(&p15card->tokeninfo->label, "Postecert & Cnipa Card");
+	set_string(&p15card->tokeninfo->manufacturer_id, "Postecert");
+	set_string(&p15card->tokeninfo->serial_number, "0000");
 
 	sc_read_binary(card, 0, certlen, 2, 0);
 
Index: src/libopensc/pkcs15-tcos.c
===================================================================
--- src/libopensc/pkcs15-tcos.c	(revision 4777)
+++ src/libopensc/pkcs15-tcos.c	(working copy)
@@ -279,8 +279,8 @@
 	sprintf(dir,"%04X", f->id);
 	sc_file_free(f);
 
-	p15card->manufacturer_id = strdup("TeleSec GmbH");
-	p15card->label = strdup(card->type==SC_CARD_TYPE_TCOS_V3 ? "NetKey V3 Card" : "NetKey Card");
+	p15card->tokeninfo->manufacturer_id = strdup("TeleSec GmbH");
+	p15card->tokeninfo->label = strdup(card->type==SC_CARD_TYPE_TCOS_V3 ? "NetKey V3 Card" : "NetKey Card");
 	keylen= card->type==SC_CARD_TYPE_TCOS_V3 ? 2048 : 1024;
 	c_auth= card->type==SC_CARD_TYPE_TCOS_V3 ? "C500" : "C100";
 
@@ -360,8 +360,8 @@
 	sc_pkcs15_card_t *p15card
 ){
 	if(insert_cert(p15card,"8000DF01C000", 0x45, 1, "Signatur Zertifikat")) return 1;
-	p15card->manufacturer_id = strdup("Deutsche Post");
-	p15card->label = strdup("SignTrust Card");
+	p15card->tokeninfo->manufacturer_id = strdup("Deutsche Post");
+	p15card->tokeninfo->label = strdup("SignTrust Card");
 
 	insert_cert(p15card,"800082008220", 0x46, 1, "Verschluesselungs Zertifikat");
 	insert_cert(p15card,"800083008320", 0x47, 1, "Authentifizierungs Zertifikat");
@@ -390,8 +390,8 @@
 	sc_pkcs15_card_t *p15card
 ){
 	if(insert_cert(p15card,"3000C500", 0x45, 0, "Signatur Zertifikat")) return 1;
-	p15card->manufacturer_id = strdup("DATEV");
-	p15card->label = strdup("DATEV Classic");
+	p15card->tokeninfo->manufacturer_id = strdup("DATEV");
+	p15card->tokeninfo->label = strdup("DATEV Classic");
 
 	insert_cert(p15card,"DF02C200", 0x46, 0, "Verschluesselungs Zertifikat");
 	insert_cert(p15card,"DF02C500", 0x47, 0, "Authentifizierungs Zertifikat");
@@ -412,8 +412,8 @@
 	sc_pkcs15_card_t *p15card
 ){
 	if(!insert_cert(p15card,"41004352", 0x45, 1, "Zertifikat 1")){
-		p15card->manufacturer_id = strdup("JLU Giessen");
-		p15card->label = strdup("JLU Giessen Card");
+		p15card->tokeninfo->manufacturer_id = strdup("JLU Giessen");
+		p15card->tokeninfo->label = strdup("JLU Giessen Card");
 
 		insert_cert(p15card,"41004353", 0x46, 1, "Zertifikat 2");
 		insert_cert(p15card,"41004354", 0x47, 1, "Zertifikat 3");
@@ -422,8 +422,8 @@
 		insert_key(p15card,"41005105", 0x47, 0x85, 1024, 1, "Schluessel 3");
 
 	} else if(!insert_cert(p15card,"41014352", 0x45, 1, "Zertifikat 1")){
-		p15card->manufacturer_id = strdup("TU Darmstadt");
-		p15card->label = strdup("TUD Card");
+		p15card->tokeninfo->manufacturer_id = strdup("TU Darmstadt");
+		p15card->tokeninfo->label = strdup("TUD Card");
 
 		insert_cert(p15card,"41014353", 0x46, 1, "Zertifikat 2");
 		insert_cert(p15card,"41014354", 0x47, 1, "Zertifikat 3");
@@ -467,7 +467,7 @@
 	}
         sc_bin_to_hex(serialnr.value, serialnr.len , serial, sizeof(serial), 0);
 	serial[19] = '\0';
-        p15card->serial_number = strdup(serial);
+        p15card->tokeninfo->serial_number = strdup(serial);
 
 	if(!detect_netkey(p15card)) return SC_SUCCESS;
 	if(!detect_signtrust(p15card)) return SC_SUCCESS;
Index: src/libopensc/pkcs15-esinit.c
===================================================================
--- src/libopensc/pkcs15-esinit.c	(revision 4777)
+++ src/libopensc/pkcs15-esinit.c	(working copy)
@@ -56,20 +56,20 @@
 	r = sc_bin_to_hex(serial.value, serial.len, buf, sizeof(buf), 0);
 	if (r != SC_SUCCESS)
 		return SC_ERROR_INTERNAL;
-	if (p15card->serial_number)
-		free(p15card->serial_number);
-	p15card->serial_number = malloc(strlen(buf) + 1);
-	if (!p15card->serial_number)
+	if (p15card->tokeninfo->serial_number)
+		free(p15card->tokeninfo->serial_number);
+	p15card->tokeninfo->serial_number = malloc(strlen(buf) + 1);
+	if (!p15card->tokeninfo->serial_number)
 		return SC_ERROR_INTERNAL;
-	strcpy(p15card->serial_number, buf);
+	strcpy(p15card->tokeninfo->serial_number, buf);
 
 	/* the manufacturer ID, in this case Giesecke & Devrient GmbH */
-	if (p15card->manufacturer_id)
-		free(p15card->manufacturer_id);
-	p15card->manufacturer_id = malloc(strlen(MANU_ID) + 1);
-	if (!p15card->manufacturer_id)
+	if (p15card->tokeninfo->manufacturer_id)
+		free(p15card->tokeninfo->manufacturer_id);
+	p15card->tokeninfo->manufacturer_id = malloc(strlen(MANU_ID) + 1);
+	if (!p15card->tokeninfo->manufacturer_id)
 		return SC_ERROR_INTERNAL;
-	strcpy(p15card->manufacturer_id, MANU_ID);
+	strcpy(p15card->tokeninfo->manufacturer_id, MANU_ID);
 
 	return SC_SUCCESS;
 }
Index: src/libopensc/pkcs15-piv.c
===================================================================
--- src/libopensc/pkcs15-piv.c	(revision 4777)
+++ src/libopensc/pkcs15-piv.c	(working copy)
@@ -433,8 +433,8 @@
 	/* could read this off card if needed */
 
 	/* CSP does not like a - in the name */
-	p15card->label = strdup("PIV_II");
-	p15card->manufacturer_id = strdup(MANU_ID);
+	p15card->tokeninfo->label = strdup("PIV_II");
+	p15card->tokeninfo->manufacturer_id = strdup(MANU_ID);
 
 	/*
 	 * get serial number 
@@ -446,10 +446,10 @@
 	r = sc_card_ctl(card, SC_CARDCTL_GET_SERIALNR, &serial);
 	if (r < 0) {
 		sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL,"sc_card_ctl rc=%d",r);
-		p15card->serial_number = strdup("00000000");
+		p15card->tokeninfo->serial_number = strdup("00000000");
 	} else {
 		sc_bin_to_hex(serial.value, serial.len, buf, sizeof(buf), 0);
-		p15card->serial_number = strdup(buf);
+		p15card->tokeninfo->serial_number = strdup(buf);
 	}
 
 	sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL, "PIV-II adding objects...");
Index: src/libopensc/pkcs15.c
===================================================================
--- src/libopensc/pkcs15.c	(revision 4777)
+++ src/libopensc/pkcs15.c	(working copy)
@@ -458,6 +458,13 @@
 	p15card = calloc(1, sizeof(struct sc_pkcs15_card));
 	if (p15card == NULL)
 		return NULL;
+
+	p15card->tokeninfo = calloc(1, sizeof(struct sc_pkcs15_tokeninfo));
+	if (p15card->tokeninfo == NULL) {
+		free(p15card);
+		return NULL;
+	}
+
 	p15card->magic = SC_PKCS15_CARD_MAGIC;
 	return p15card;
 }
@@ -493,21 +500,22 @@
 	if (p15card->file_unusedspace != NULL)
 		sc_file_free(p15card->file_unusedspace);
 	p15card->magic = 0;
-	if (p15card->label != NULL)
-		free(p15card->label);
-	if (p15card->serial_number != NULL)
-		free(p15card->serial_number);
-	if (p15card->manufacturer_id != NULL)
-		free(p15card->manufacturer_id);
-	if (p15card->last_update != NULL)
-		free(p15card->last_update);
-	if (p15card->preferred_language != NULL)
-		free(p15card->preferred_language);
-	if (p15card->seInfo != NULL) {
-		for (i = 0; i < p15card->num_seInfo; i++)
-			free(p15card->seInfo[i]);
-		free(p15card->seInfo);
+	if (p15card->tokeninfo->label != NULL)
+		free(p15card->tokeninfo->label);
+	if (p15card->tokeninfo->serial_number != NULL)
+		free(p15card->tokeninfo->serial_number);
+	if (p15card->tokeninfo->manufacturer_id != NULL)
+		free(p15card->tokeninfo->manufacturer_id);
+	if (p15card->tokeninfo->last_update != NULL)
+		free(p15card->tokeninfo->last_update);
+	if (p15card->tokeninfo->preferred_language != NULL)
+		free(p15card->tokeninfo->preferred_language);
+	if (p15card->tokeninfo->seInfo != NULL) {
+		for (i = 0; i < p15card->tokeninfo->num_seInfo; i++)
+			free(p15card->tokeninfo->seInfo[i]);
+		free(p15card->tokeninfo->seInfo);
 	}
+	free(p15card->tokeninfo);
 	free(p15card);
 }
 
@@ -519,8 +527,9 @@
 	if (p15card->ops.clear)
 		p15card->ops.clear(p15card);
 
-	p15card->version = 0;
-	p15card->flags   = 0;
+	p15card->flags = 0;
+	p15card->tokeninfo->version = 0;
+	p15card->tokeninfo->flags   = 0;
 	while (p15card->obj_list)   {
 		struct sc_pkcs15_object *obj = p15card->obj_list;
 
@@ -547,33 +556,33 @@
 		sc_file_free(p15card->file_unusedspace);
 		p15card->file_unusedspace = NULL;
 	}
-	if (p15card->label != NULL) {
-		free(p15card->label);
-		p15card->label = NULL;
+	if (p15card->tokeninfo->label != NULL) {
+		free(p15card->tokeninfo->label);
+		p15card->tokeninfo->label = NULL;
 	}
-	if (p15card->serial_number != NULL) {
-		free(p15card->serial_number);
-		p15card->serial_number = NULL;
+	if (p15card->tokeninfo->serial_number != NULL) {
+		free(p15card->tokeninfo->serial_number);
+		p15card->tokeninfo->serial_number = NULL;
 	}
-	if (p15card->manufacturer_id != NULL) {
-		free(p15card->manufacturer_id);
-		p15card->manufacturer_id = NULL;
+	if (p15card->tokeninfo->manufacturer_id != NULL) {
+		free(p15card->tokeninfo->manufacturer_id);
+		p15card->tokeninfo->manufacturer_id = NULL;
 	}
-	if (p15card->last_update != NULL) {
-		free(p15card->last_update);
-		p15card->last_update = NULL;
+	if (p15card->tokeninfo->last_update != NULL) {
+		free(p15card->tokeninfo->last_update);
+		p15card->tokeninfo->last_update = NULL;
 	}
-	if (p15card->preferred_language != NULL) {
-		free(p15card->preferred_language);
-		p15card->preferred_language = NULL;
+	if (p15card->tokeninfo->preferred_language != NULL) {
+		free(p15card->tokeninfo->preferred_language);
+		p15card->tokeninfo->preferred_language = NULL;
 	}
-	if (p15card->seInfo != NULL) {
+	if (p15card->tokeninfo->seInfo != NULL) {
 		size_t i;
-		for (i = 0; i < p15card->num_seInfo; i++)
-			free(p15card->seInfo[i]);
-		free(p15card->seInfo);
-		p15card->seInfo     = NULL;
-		p15card->num_seInfo = 0;
+		for (i = 0; i < p15card->tokeninfo->num_seInfo; i++)
+			free(p15card->tokeninfo->seInfo[i]);
+		free(p15card->tokeninfo->seInfo);
+		p15card->tokeninfo->seInfo     = NULL;
+		p15card->tokeninfo->num_seInfo = 0;
 	}
 }
 
@@ -724,33 +733,16 @@
 	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;
-	p15card->seInfo          = tokeninfo.seInfo;
-	p15card->num_seInfo      = tokeninfo.num_seInfo;
 
-	memcpy(&p15card->supported_algos, &tokeninfo.supported_algos, sizeof(p15card->supported_algos));
+	*(p15card->tokeninfo) = tokeninfo;
+
+/* would be placed better in pkcs15-tool
 	for (ii=0; ii<SC_MAX_SUPPORTED_ALGORITHMS && p15card->supported_algos[ii].reference; ii++)
 		sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "algo[%i]: ref:0x%X;mech:0x%X;op:0x%X;algo_ref:0x%X", ii,
 				p15card->supported_algos[ii].reference, p15card->supported_algos[ii].mechanism,
 				p15card->supported_algos[ii].operations, p15card->supported_algos[ii].algo_ref);
+*/
 
-	if (!p15card->serial_number && card->serialnr.len)   {
-		char *serial = calloc(1, card->serialnr.len*2 + 1);
-		size_t ii;
-		
-		for(ii=0;ii<card->serialnr.len;ii++)
-			sprintf(serial + ii*2, "%02X", *(card->serialnr.value + ii));
-
-		p15card->serial_number = serial;
-		sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "p15card->serial_number %s", p15card->serial_number);
-	}
-
 	ok = 1;
 end:
 	if(buf != NULL)
@@ -834,12 +826,12 @@
 	if (strcmp(p15card->card->driver->short_name,"cardos") == 0) {
 
 		/* D-Trust cards (D-TRUST, D-SIGN) */
-		if (strstr(p15card->label,"D-TRUST") != NULL
-			|| strstr(p15card->label,"D-SIGN") != NULL) {
+		if (strstr(p15card->tokeninfo->label,"D-TRUST") != NULL
+			|| strstr(p15card->tokeninfo->label,"D-SIGN") != NULL) {
 
 			/* D-TRUST Card 2.0 2cc (standard cards, which always add
 			 * SHA1 prefix itself */
-			if (strstr(p15card->label, "2cc") != NULL) {
+			if (strstr(p15card->tokeninfo->label, "2cc") != NULL) {
 				p15card->card->caps |= SC_CARD_CAP_ONLY_RAW_HASH_STRIPPED;
 				sc_debug(p15card->card->ctx, SC_LOG_DEBUG_NORMAL, "D-TRUST 2cc card detected, only SHA1 works with this card");
 				/* XXX: add detection when other hash than SHA1 is used with
@@ -849,7 +841,7 @@
 
 			/* D-SIGN multicard 2.0 2ca (cards working with all types of hashes
 			 * and no addition of prefix) */
-			else if (strstr(p15card->label, "2ca") != NULL) {
+			else if (strstr(p15card->tokeninfo->label, "2ca") != NULL) {
 				p15card->card->caps |= SC_CARD_CAP_ONLY_RAW_HASH;
 				sc_debug(p15card->card->ctx, SC_LOG_DEBUG_NORMAL, "D-TRUST 2ca card detected");
 			}
Index: src/libopensc/pkcs15.h
===================================================================
--- src/libopensc/pkcs15.h	(revision 4777)
+++ src/libopensc/pkcs15.h	(working copy)
@@ -434,21 +434,14 @@
 
 typedef struct sc_pkcs15_card {
 	sc_card_t *card;
-	char *label;
-	/* fields from TokenInfo: */
-	int version;
-	char *serial_number, *manufacturer_id;
-	char *last_update;
 	unsigned int flags;
 
-	struct sc_supported_algo_info supported_algos[SC_MAX_SUPPORTED_ALGORITHMS];
-
 	sc_file_t *file_app;
 	sc_file_t *file_tokeninfo, *file_odf, *file_unusedspace;
 
 	struct sc_pkcs15_df *df_list;
 	struct sc_pkcs15_object *obj_list;
-	int record_lengths[SC_PKCS15_DF_TYPE_COUNT];
+	sc_pkcs15_tokeninfo_t *tokeninfo;
 	sc_pkcs15_unusedspace_t *unusedspace_list;
 	int unusedspace_read;
 
@@ -458,22 +451,23 @@
 		int pin_cache_counter;
 	} opts;
 
-	sc_pkcs15_sec_env_info_t **seInfo;
-	size_t num_seInfo;
 
 	unsigned int magic;
 
 	void *dll_handle;		/* shared lib for emulated cards */
-	char *preferred_language;
 
 	struct sc_pkcs15_operations ops;
 
 } sc_pkcs15_card_t;
 
+/* flags suitable for sc_pkcs15_tokeninfo_t */
+/* should be renamed to SC_PKCS15_TOKENINFO_FLAG_ */
 #define SC_PKCS15_CARD_FLAG_READONLY			0x01
 #define SC_PKCS15_CARD_FLAG_LOGIN_REQUIRED		0x02 /* Don't use */
 #define SC_PKCS15_CARD_FLAG_PRN_GENERATION		0x04
 #define SC_PKCS15_CARD_FLAG_EID_COMPLIANT		0x08
+
+/* flags suitable for sc_pkcs15_card_t */
 #define SC_PKCS15_CARD_FLAG_EMULATED			0x02000000
 #define SC_PKCS15_CARD_FLAG_FIX_INTEGERS		0x04000000
 #define SC_PKCS15_CARD_FLAG_USER_PIN_INITIALIZED	0x08000000
Index: src/libopensc/pkcs15-infocamere.c
===================================================================
--- src/libopensc/pkcs15-infocamere.c	(revision 4777)
+++ src/libopensc/pkcs15-infocamere.c	(working copy)
@@ -287,16 +287,16 @@
 		return SC_ERROR_WRONG_CARD;
 	}
 
-	set_string(&p15card->serial_number, serial);
+	set_string(&p15card->tokeninfo->serial_number, serial);
 
 	if (ef_gdo[len_iccsn + 6] == 0x02)
-		set_string(&p15card->label, "Infocamere 1202 Card");
+		set_string(&p15card->tokeninfo->label, "Infocamere 1202 Card");
 	else {
-		set_string(&p15card->label, "Infocamere 1203 Card");
+		set_string(&p15card->tokeninfo->label, "Infocamere 1203 Card");
 		change_sign = 1;
 	}
 
-	set_string(&p15card->manufacturer_id, "Infocamere");
+	set_string(&p15card->tokeninfo->manufacturer_id, "Infocamere");
 
 	authority = 0;
 
@@ -599,9 +599,9 @@
 	sc_read_binary(card, 15, serial, 15, 0);
 	serial[15] = '\0';
 
-	set_string(&p15card->serial_number, (char *)serial);
-	set_string(&p15card->label, "Infocamere 1400 Card");
-	set_string(&p15card->manufacturer_id, "Infocamere");
+	set_string(&p15card->tokeninfo->serial_number, (char *)serial);
+	set_string(&p15card->tokeninfo->label, "Infocamere 1400 Card");
+	set_string(&p15card->tokeninfo->manufacturer_id, "Infocamere");
 
 	if ((r = loadCertificate(p15card, 0, certPath[0], certLabel[0])) !=
 	    SC_SUCCESS) {
@@ -724,9 +724,9 @@
 	sc_read_binary(card, 30, serial, 16, 0);
 	serial[16] = '\0';
 
-	set_string(&p15card->serial_number, (char *) serial);
-	set_string(&p15card->label, "Infocamere 1600 Card");
-	set_string(&p15card->manufacturer_id, "Infocamere");
+	set_string(&p15card->tokeninfo->serial_number, (char *) serial);
+	set_string(&p15card->tokeninfo->label, "Infocamere 1600 Card");
+	set_string(&p15card->tokeninfo->manufacturer_id, "Infocamere");
 
 	/* Adding certificates.
 	 * Certificates are stored in a ZLib compressed form with
Index: src/libopensc/pkcs15-actalis.c
===================================================================
--- src/libopensc/pkcs15-actalis.c	(revision 4777)
+++ src/libopensc/pkcs15-actalis.c	(working copy)
@@ -191,9 +191,9 @@
 		return SC_ERROR_WRONG_CARD;
 	
 			
-	set_string(&p15card->label, "Actalis");
-	set_string(&p15card->manufacturer_id, "Actalis");
-	set_string(&p15card->serial_number, (char *)serial);
+	set_string(&p15card->tokeninfo->label, "Actalis");
+	set_string(&p15card->tokeninfo->manufacturer_id, "Actalis");
+	set_string(&p15card->tokeninfo->serial_number, (char *)serial);
 
 #ifdef ENABLE_ZLIB
 	for (i = 0; i < 3; i++) {
Index: src/libopensc/pkcs15-starcert.c
===================================================================
--- src/libopensc/pkcs15-starcert.c	(revision 4777)
+++ src/libopensc/pkcs15-starcert.c	(working copy)
@@ -165,21 +165,21 @@
 	r = sc_bin_to_hex(serial.value, serial.len, buf, sizeof(buf), 0);
 	if (r != SC_SUCCESS)
 		return SC_ERROR_INTERNAL;
-	if (p15card->serial_number)
-		free(p15card->serial_number);
-	p15card->serial_number = malloc(strlen(buf) + 1);
-	if (!p15card->serial_number)
+	if (p15card->tokeninfo->serial_number)
+		free(p15card->tokeninfo->serial_number);
+	p15card->tokeninfo->serial_number = malloc(strlen(buf) + 1);
+	if (!p15card->tokeninfo->serial_number)
 		return SC_ERROR_INTERNAL;
-	strcpy(p15card->serial_number, buf);
+	strcpy(p15card->tokeninfo->serial_number, buf);
 	/* the TokenInfo version number */
-	p15card->version = 0;
+	p15card->tokeninfo->version = 0;
 	/* the manufacturer ID, in this case Giesecke & Devrient GmbH */
-	if (p15card->manufacturer_id)
-		free(p15card->manufacturer_id);
-	p15card->manufacturer_id = malloc(strlen(MANU_ID) + 1);
-	if (!p15card->manufacturer_id)
+	if (p15card->tokeninfo->manufacturer_id)
+		free(p15card->tokeninfo->manufacturer_id);
+	p15card->tokeninfo->manufacturer_id = malloc(strlen(MANU_ID) + 1);
+	if (!p15card->tokeninfo->manufacturer_id)
 		return SC_ERROR_INTERNAL;
-	strcpy(p15card->manufacturer_id, MANU_ID);
+	strcpy(p15card->tokeninfo->manufacturer_id, MANU_ID);
 
 	/* set certs */
 	for (i = 0; certs[i].label; i++) {
Index: src/libopensc/pkcs15-tccardos.c
===================================================================
--- src/libopensc/pkcs15-tccardos.c	(revision 4777)
+++ src/libopensc/pkcs15-tccardos.c	(working copy)
@@ -306,27 +306,27 @@
 	if (r != SC_SUCCESS)
 		return r;
 	/* set card label */
-	if (p15card->label != NULL)
-		free(p15card->label);
-	p15card->label = strdup(TC_CARDOS_LABEL);
-	if (p15card->label == NULL)
+	if (p15card->tokeninfo->label != NULL)
+		free(p15card->tokeninfo->label);
+	p15card->tokeninfo->label = strdup(TC_CARDOS_LABEL);
+	if (p15card->tokeninfo->label == NULL)
 		return SC_ERROR_OUT_OF_MEMORY;
 	/* set the manufacturer ID */
-	if (p15card->manufacturer_id != NULL)
-		free(p15card->manufacturer_id);
-	p15card->manufacturer_id = strdup(MANU_ID);
-	if (p15card->manufacturer_id == NULL)
+	if (p15card->tokeninfo->manufacturer_id != NULL)
+		free(p15card->tokeninfo->manufacturer_id);
+	p15card->tokeninfo->manufacturer_id = strdup(MANU_ID);
+	if (p15card->tokeninfo->manufacturer_id == NULL)
 		return SC_ERROR_OUT_OF_MEMORY;
 	/* set the serial number */
 	r = read_file(p15card->card, "3F002F02", gdo, &gdo_len);
 	if (r != SC_SUCCESS)
 		return SC_ERROR_INTERNAL;
 	sc_bin_to_hex(gdo + 7, 8, hex_buf, sizeof(hex_buf), 0);
-	p15card->serial_number = strdup(hex_buf);
-	if (p15card->serial_number == NULL)
+	p15card->tokeninfo->serial_number = strdup(hex_buf);
+	if (p15card->tokeninfo->serial_number == NULL)
 		return SC_ERROR_OUT_OF_MEMORY;
 	/* the TokenInfo version number */
-	p15card->version = 0;
+	p15card->tokeninfo->version = 0;
 	/* select the application DF */
 	sc_format_path(TC_CARDOS_APP_DF, &path);
 	r = sc_select_file(card, &path, &file);
Index: src/libopensc/pkcs15-atrust-acos.c
===================================================================
--- src/libopensc/pkcs15-atrust-acos.c	(revision 4777)
+++ src/libopensc/pkcs15-atrust-acos.c	(working copy)
@@ -173,31 +173,31 @@
 	r = sc_bin_to_hex(buf, 8, buf2, sizeof(buf2), 0);
 	if (r != SC_SUCCESS)
 		return SC_ERROR_INTERNAL;
-	if (p15card->serial_number)
-		free(p15card->serial_number);
-	p15card->serial_number = malloc(strlen(buf2) + 1);
-	if (!p15card->serial_number)
+	if (p15card->tokeninfo->serial_number)
+		free(p15card->tokeninfo->serial_number);
+	p15card->tokeninfo->serial_number = malloc(strlen(buf2) + 1);
+	if (!p15card->tokeninfo->serial_number)
 		return SC_ERROR_INTERNAL;
-	strcpy(p15card->serial_number, buf2);
+	strcpy(p15card->tokeninfo->serial_number, buf2);
 
 	/* the TokenInfo version number */
-	p15card->version = 0;
+	p15card->tokeninfo->version = 0;
 
 	/* manufacturer ID */
-	if (p15card->manufacturer_id)
-		free(p15card->manufacturer_id);
-	p15card->manufacturer_id = malloc(strlen(MANU_ID) + 1);
-	if (!p15card->manufacturer_id)
+	if (p15card->tokeninfo->manufacturer_id)
+		free(p15card->tokeninfo->manufacturer_id);
+	p15card->tokeninfo->manufacturer_id = malloc(strlen(MANU_ID) + 1);
+	if (!p15card->tokeninfo->manufacturer_id)
 		return SC_ERROR_INTERNAL;
-	strcpy(p15card->manufacturer_id, MANU_ID);
+	strcpy(p15card->tokeninfo->manufacturer_id, MANU_ID);
 
 	/* card label */
-	if (p15card->label)
-		free(p15card->label);
-	p15card->label = malloc(strlen(CARD_LABEL) + 1);
-	if (!p15card->label)
+	if (p15card->tokeninfo->label)
+		free(p15card->tokeninfo->label);
+	p15card->tokeninfo->label = malloc(strlen(CARD_LABEL) + 1);
+	if (!p15card->tokeninfo->label)
 		return SC_ERROR_INTERNAL;
-	strcpy(p15card->label, CARD_LABEL);
+	strcpy(p15card->tokeninfo->label, CARD_LABEL);
 
 	/* set certs */
 	for (i = 0; certs[i].label; i++) {
Index: src/libopensc/pkcs15-gemsafeV1.c
===================================================================
--- src/libopensc/pkcs15-gemsafeV1.c	(revision 4777)
+++ src/libopensc/pkcs15-gemsafeV1.c	(working copy)
@@ -231,19 +231,19 @@
 
     sc_debug(p15card->card->ctx, SC_LOG_DEBUG_NORMAL, "%s: Setting pkcs15 parameters\n", fn_name);
 
-    if (p15card->label)
-    	free(p15card->label);
-    p15card->label = malloc(strlen(APPLET_NAME) + 1);
-    if (!p15card->label)
+    if (p15card->tokeninfo->label)
+    	free(p15card->tokeninfo->label);
+    p15card->tokeninfo->label = malloc(strlen(APPLET_NAME) + 1);
+    if (!p15card->tokeninfo->label)
     	return SC_ERROR_INTERNAL;
-    strcpy(p15card->label, APPLET_NAME);
+    strcpy(p15card->tokeninfo->label, APPLET_NAME);
 
-    if (p15card->serial_number)
-	    free(p15card->serial_number);
-    p15card->serial_number = malloc(strlen(DRIVER_SERIAL_NUMBER) + 1);
-    if (!p15card->serial_number)
+    if (p15card->tokeninfo->serial_number)
+	    free(p15card->tokeninfo->serial_number);
+    p15card->tokeninfo->serial_number = malloc(strlen(DRIVER_SERIAL_NUMBER) + 1);
+    if (!p15card->tokeninfo->serial_number)
 	    return SC_ERROR_INTERNAL;
-    strcpy(p15card->serial_number, DRIVER_SERIAL_NUMBER);
+    strcpy(p15card->tokeninfo->serial_number, DRIVER_SERIAL_NUMBER);
 
     /* the GemSAFE applet version number */
     sc_format_apdu(card, &apdu, SC_APDU_CASE_2_SHORT, 0xca, 0xdf, 0x03);
@@ -264,15 +264,15 @@
     version = strtod( (const char *)(apdu.resp + 4), &endptr);
     sc_debug(p15card->card->ctx, SC_LOG_DEBUG_NORMAL, "%s: version (float): %f, version (int): %d\n",
     	    fn_name, version, (int)version);
-    p15card->version = (int)version;
+    p15card->tokeninfo->version = (int)version;
 
     /* the manufacturer ID, in this case GemPlus */
-    if (p15card->manufacturer_id)
-	    free(p15card->manufacturer_id);
-    p15card->manufacturer_id = malloc(strlen(MANU_ID) + 1);
-    if (!p15card->manufacturer_id)
+    if (p15card->tokeninfo->manufacturer_id)
+	    free(p15card->tokeninfo->manufacturer_id);
+    p15card->tokeninfo->manufacturer_id = malloc(strlen(MANU_ID) + 1);
+    if (!p15card->tokeninfo->manufacturer_id)
 	    return SC_ERROR_INTERNAL;
-    strcpy(p15card->manufacturer_id, MANU_ID);
+    strcpy(p15card->tokeninfo->manufacturer_id, MANU_ID);
 
     /* set certs */
     sc_debug(p15card->card->ctx, SC_LOG_DEBUG_NORMAL, "%s: Setting certificate\n", fn_name);
Index: src/libopensc/pkcs15-pteid.c
===================================================================
--- src/libopensc/pkcs15-pteid.c	(revision 4777)
+++ src/libopensc/pkcs15-pteid.c	(working copy)
@@ -83,16 +83,9 @@
 	r = sc_pkcs15_parse_tokeninfo(ctx, &tokeninfo, buf, (size_t) r);
 	if (r != 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;
-	p15card->seInfo          = tokeninfo.seInfo;
-	p15card->num_seInfo      = tokeninfo.num_seInfo;
 
+	*(p15card->tokeninfo) = tokeninfo;
+
 	/* Card type detection */
 	if (card->type == SC_CARD_TYPE_IAS_PTEID)
 		type = IAS_CARD;
@@ -103,9 +96,9 @@
 		goto end;
 	}
 
-	p15card->flags = SC_PKCS15_CARD_FLAG_PRN_GENERATION
-	                 | SC_PKCS15_CARD_FLAG_EID_COMPLIANT
-	                 | SC_PKCS15_CARD_FLAG_READONLY;
+	p15card->tokeninfo->flags = SC_PKCS15_CARD_FLAG_PRN_GENERATION
+				  | SC_PKCS15_CARD_FLAG_EID_COMPLIANT
+				  | SC_PKCS15_CARD_FLAG_READONLY;
 
 	/* TODO: Use the cardholder's name?  */
 	/* TODO: Use Portuguese descriptions? */
Index: src/libopensc/pkcs15-gemsafeGPK.c
===================================================================
--- src/libopensc/pkcs15-gemsafeGPK.c	(revision 4777)
+++ src/libopensc/pkcs15-gemsafeGPK.c	(working copy)
@@ -219,14 +219,14 @@
 
 	/* could read this off card if needed */
 
-	p15card->label = strdup("GemSAFE");
-	p15card->manufacturer_id = strdup(MANU_ID);
+	p15card->tokeninfo->label = strdup("GemSAFE");
+	p15card->tokeninfo->manufacturer_id = strdup(MANU_ID);
 	/* get serial number */
         r = sc_card_ctl(card, SC_CARDCTL_GET_SERIALNR, &serial);
         r = sc_bin_to_hex(serial.value, serial.len, buf, sizeof(buf), 0);
         if (r != SC_SUCCESS)
                 return SC_ERROR_INTERNAL;
-        p15card->serial_number = strdup(buf);
+        p15card->tokeninfo->serial_number = strdup(buf);
 
 	/* test if we have a gemsafe app df */
 	memset(&path, 0, sizeof(path));
Index: src/libopensc/pkcs15-esteid.c
===================================================================
--- src/libopensc/pkcs15-esteid.c	(revision 4777)
+++ src/libopensc/pkcs15-esteid.c	(working copy)
@@ -72,9 +72,9 @@
 	int r, i, flags;
 	sc_path_t tmppath;
 
-	set_string (&p15card->label, "ID-kaart");
-	set_string (&p15card->manufacturer_id, "AS Sertifitseerimiskeskus");
-	p15card->version = 2; /* Increases as the code changes for EstEID happen, not only in this file */
+	set_string (&p15card->tokeninfo->label, "ID-kaart");
+	set_string (&p15card->tokeninfo->manufacturer_id, "AS Sertifitseerimiskeskus");
+	p15card->tokeninfo->version = 2; /* Increases as the code changes for EstEID happen, not only in this file */
 
 	/* Select application directory */
 	sc_format_path ("3f00eeee5044", &tmppath);
@@ -85,7 +85,7 @@
 	r = sc_read_record (card, SC_ESTEID_PD_DOCUMENT_NR, buff, sizeof(buff), SC_RECORD_BY_REC_NR);
 	SC_TEST_RET(card->ctx, SC_LOG_DEBUG_NORMAL, r, "read document number failed");
 	buff[r] = '\0';
-	set_string (&p15card->serial_number, (const char *) buff);
+	set_string (&p15card->tokeninfo->serial_number, (const char *) buff);
 
 #ifdef ENABLE_ICONV
 	/* Read the name of the cardholder and convert it into UTF-8 */
@@ -116,11 +116,11 @@
 	*outptr = '\0';
 	iconv_close(iso_utf);
 	snprintf(label, sizeof(label), "%s %s", name1, name2);
-	set_string (&p15card->label, label);
+	set_string (&p15card->tokeninfo->label, label);
 #endif
-	p15card->flags = SC_PKCS15_CARD_FLAG_PRN_GENERATION
-	                 | SC_PKCS15_CARD_FLAG_EID_COMPLIANT
-	                 | SC_PKCS15_CARD_FLAG_READONLY;
+	p15card->tokeninfo->flags = SC_PKCS15_CARD_FLAG_PRN_GENERATION
+				  | SC_PKCS15_CARD_FLAG_EID_COMPLIANT
+				  | SC_PKCS15_CARD_FLAG_READONLY;
 
 	/* EstEID uses 1024b RSA */
 	card->algorithm_count = 0;
Index: src/libopensc/pkcs15-itacns.c
===================================================================
--- src/libopensc/pkcs15-itacns.c	(revision 4777)
+++ src/libopensc/pkcs15-itacns.c	(working copy)
@@ -505,7 +505,7 @@
 			sc_pkcs15_free_data_object(p15_personaldata);
 			return SC_SUCCESS;
 		}
-		set_string(&p15card->label, fullname);
+		set_string(&p15card->tokeninfo->label, fullname);
 	}
 	sc_pkcs15_free_data_object(p15_personaldata);
 	return SC_SUCCESS;
@@ -703,7 +703,7 @@
 
 	SC_FUNC_CALLED(p15card->card->ctx, 1);
 
-	set_string(&p15card->label, p15card->card->name);
+	set_string(&p15card->tokeninfo->label, p15card->card->name);
 	if(p15card->card->drv_data) {
 		unsigned int mask_code, ic_code;
 		char buffer[256];
@@ -718,8 +718,8 @@
 		snprintf(buffer, sizeof(buffer), "IC: %s; mask: %s",
 			iso7816_ic_manufacturers[ic_code],
 			itacns_mask_manufacturers[mask_code]);
-		set_string(&p15card->manufacturer_id, buffer);
-		p15card->version = (data->os_version_h << 8
+		set_string(&p15card->tokeninfo->manufacturer_id, buffer);
+		p15card->tokeninfo->version = (data->os_version_h << 8
 			| data->os_version_l);
 	}
 
@@ -732,7 +732,7 @@
 		if (bytes < 0) return bytes;
 		if (bytes > 16) return -1;
 		serial[bytes] = '\0';
-		set_string(&p15card->serial_number, (char*)serial);
+		set_string(&p15card->tokeninfo->serial_number, (char*)serial);
 	}
 
 	/* Is the card a CIE v1? */
Index: src/libopensc/pkcs15-westcos.c
===================================================================
--- src/libopensc/pkcs15-westcos.c	(revision 4777)
+++ src/libopensc/pkcs15-westcos.c	(working copy)
@@ -47,22 +47,22 @@
 	if (file)
 		sc_file_free(file);
 	file = NULL;
-	if (p15card->label != NULL)
-		free(p15card->label);
-	p15card->label = strdup("westcos");
-	if (p15card->manufacturer_id != NULL)
-		free(p15card->manufacturer_id);
-	p15card->manufacturer_id = strdup("CEV");
+	if (p15card->tokeninfo->label != NULL)
+		free(p15card->tokeninfo->label);
+	p15card->tokeninfo->label = strdup("westcos");
+	if (p15card->tokeninfo->manufacturer_id != NULL)
+		free(p15card->tokeninfo->manufacturer_id);
+	p15card->tokeninfo->manufacturer_id = strdup("CEV");
 
 	/* get serial number */
 	r = sc_card_ctl(card, SC_CARDCTL_GET_SERIALNR, &serial);
 	r = sc_bin_to_hex(serial.value, serial.len, buf, sizeof(buf), 0);
 	if (r)
 		goto out;
-	if (p15card->serial_number != NULL)
-		free(p15card->serial_number);
-	p15card->serial_number = strdup(buf);
-	p15card->version = buf[6];
+	if (p15card->tokeninfo->serial_number != NULL)
+		free(p15card->tokeninfo->serial_number);
+	p15card->tokeninfo->serial_number = strdup(buf);
+	p15card->tokeninfo->version = buf[6];
 	sc_format_path("AAAA", &path);
 	r = sc_select_file(card, &path, &file);
 	if (r) 
_______________________________________________
opensc-devel mailing list
opensc-devel@lists.opensc-project.org
http://www.opensc-project.org/mailman/listinfo/opensc-devel

Reply via email to