Hello William,
Le 26/05/2011 20:38, Viktor TARASOV a écrit :
I'm also actually looking into this logs and it seems strange the after
releasing of context it starts to read the cardcf .
In any case the 'zero' cardcf can be disturbing for baseCSP.
Another 'feature' is when the 'HANDLES CHANGED' event happens, the
disassociate/associate card procedures pair called,
and 'cardcf' content is cleaned but not re-initialized. That's where from there
is 'zero' content.
Could you please try the following test patch .
With this patch the cardcf content is deduced from the 'last_update' attribute
of the token info data,
and not from the minidriver internal data. So that we'll avoid a 'zero' content
of cardcf.
Also the initialization of 'cardcf' content is moved from CardAcquireContext()
to the associate_card() procedure .
Kind regards,
Viktor.
Index: src/minidriver/minidriver.c
===================================================================
--- src/minidriver/minidriver.c (révision 5514)
+++ src/minidriver/minidriver.c (copie de travail)
@@ -95,7 +95,7 @@
{
va_list arg;
VENDOR_SPECIFIC *vs;
-/* #define CARDMOD_LOW_LEVEL_DEBUG 1 */
+#define CARDMOD_LOW_LEVEL_DEBUG 1
#ifdef CARDMOD_LOW_LEVEL_DEBUG
/* Use a simplied log to get all messages including messages
* before opensc is loaded. The file must be modifiable by all
@@ -378,6 +378,35 @@
}
+static void set_cardcf(PCARD_CACHE_FILE_FORMAT pcardcf, char *last_update)
+{
+ WORD cf = 0, ff = 0;
+
+ if (!pcardcf)
+ return;
+
+ if (!last_update || strlen(last_update) < 4*sizeof(WORD)) {
+ cf = rand()%0x7FFF;
+ ff = rand()%0x7FFF;
+ }
+ else {
+ int ii;
+
+ if (strlen(last_update) > 4*sizeof(WORD))
+ last_update += strlen(last_update) - 4*sizeof(WORD) - 1;
+
+ for (ii=0; ii < 2*sizeof(WORD); ii++) {
+ cf += (WORD)(*(last_update + ii)&0x0F) << (4*ii);
+ ff += (WORD)(*(last_update + ii + 2*sizeof(WORD))&0x0F)
<< (4*ii);
+ }
+ }
+
+ pcardcf->wContainersFreshness = cf;
+ pcardcf->wFilesFreshness = ff;
+ pcardcf->bVersion = CARD_CACHE_FILE_CURRENT_VERSION;
+}
+
+
DWORD WINAPI CardDeleteContext(__inout PCARD_DATA pCardData)
{
VENDOR_SPECIFIC *vs = NULL;
@@ -787,9 +816,7 @@
*pcbData = sizeof(vs->cardFiles.file_cardcf);
*ppbData = pCardData->pfnCspAlloc(*pcbData);
if(!*ppbData)
- {
return SCARD_E_NO_MEMORY;
- }
memcpy(*ppbData, &(vs->cardFiles.file_cardcf),
*pcbData);
@@ -1887,17 +1914,6 @@
logprintf(pCardData, 1, "OpenSC init done.\n");
- if(sc_get_challenge(vs->p15card->card, challenge, sizeof(challenge)))
- {
- vs->cardFiles.file_cardcf.wContainersFreshness = rand()%30000;
- vs->cardFiles.file_cardcf.wFilesFreshness = rand()%30000;
- }
- else
- {
- vs->cardFiles.file_cardcf.wContainersFreshness =
challenge[0]*256+challenge[1];
- vs->cardFiles.file_cardcf.wFilesFreshness =
challenge[3]*256+challenge[4];
- }
-
if (suppliedVersion > 4) {
pCardData->pfnCardDeriveKey = CardDeriveKey;
pCardData->pfnCardDestroyDHAgreement = CardDestroyDHAgreement;
@@ -1964,11 +1980,14 @@
}
}
- if(vs->card == NULL || vs->p15card == NULL)
- {
+ if(vs->card == NULL || vs->p15card == NULL) {
logprintf(pCardData, 0, "Card unknow.\n");
return SCARD_E_UNKNOWN_CARD;
}
+ else if (vs->p15card->tokeninfo == NULL) {
+ logprintf(pCardData, 0, "Invalid PKCS#15 card: no token info
data\n");
+ return SCARD_E_UNKNOWN_CARD;
+ }
/*
* We want a 16 byte unique serial number
@@ -1980,7 +1999,7 @@
* TODO needs to be looked at closer
*/
- if (vs->p15card->tokeninfo && vs->p15card->tokeninfo->serial_number) {
+ if (vs->p15card->tokeninfo->serial_number) {
size_t len1, len2;
char * cserial;
@@ -1997,9 +2016,9 @@
loghex(pCardData, 7, vs->cardFiles.file_cardid,
sizeof(vs->cardFiles.file_cardid));
}
+ set_cardcf(&(vs->cardFiles.file_cardcf),
vs->p15card->tokeninfo->last_update);
- r = sc_pkcs15_get_objects(vs->p15card, SC_PKCS15_TYPE_CERT_X509, \
- vs->cert_objs, 32);
+ r = sc_pkcs15_get_objects(vs->p15card, SC_PKCS15_TYPE_CERT_X509,
vs->cert_objs, 32);
if (r < 0)
{
logprintf(pCardData, 0, "Certificate enumeration failed: %s\n",
\
_______________________________________________
opensc-devel mailing list
[email protected]
http://www.opensc-project.org/mailman/listinfo/opensc-devel