Ludovic Rousseau wrote:
Le Saturday 28 August 2004 � 23:34:15, Daniel Breest a �crit:

hi list,


Hello,


After having some problems with libpcsclite1/pcscd (1.2.9-beta6-1), i.e. the pcscd debug output always says "Active protocol: unknown -2" after a call to SCardConnect,


Can you tell us/me a bit more about this error?
How do you use SCardConnect? Can you send me a sample source code
exhibiting this error?

What is your card ATR?
Can you send me the complete debug output of pcscd (1.2.9-beta6-1)?

Thanks,


Hi,
i will try to give you a more detailed description. I used the debian packages libpcsclite1 and pcscd both version 1.2.9-beta6-1. Also the package libpcsclite0 version 1.2.0-stable-2 is installed. After having problems with almost every tool i tried out, i.e. cryptoflex-tool for example, which brings error messages like "unresponsive card" or "protocol mismatch", i decide to write my own little test program using pc/sc api. By the way i have an omnikey cardman 4000 and when i put the card, a cryptoflex 32k e-gate, into the reader the cards atr is recognized. The cards ATR is 3B 95 18 40 FF 62 01 02 01 04.
I will provide you a short code snippet to show how i used the SCardConnect function.


-->code begin

/* Verify CHV command APDU with example PIN not the real ;) */
unsigned char APDU[] = {0xC0, 0x20, 0x00, 0x01, 0x08, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x00, 0x00};


result = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &context);

        if (result == SCARD_S_SUCCESS){
                printf("connection to ressource manager established...\n");

                SCardListReaders(context, NULL, NULL, &dwReaders);
                mszReaders = (LPSTR)malloc(sizeof(char)*dwReaders);
                SCardListReaders(context, NULL, mszReaders, &dwReaders);

                readerState[0].szReader = &mszReaders[0];
                readerState[0].dwCurrentState = SCARD_STATE_EMPTY;

                printf("please provide chipcard ... \n");
                SCardGetStatusChange(context, INFINITE, readerState, 1);

                /*try to connect to card here */
                result = SCardConnect(context,
                                &mszReaders[0], SCARD_SHARE_SHARED,
                                SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
                                &CardHandle, &Protocol);

                printf("active protocol: %i\n", Protocol);

                if (result == SCARD_S_SUCCESS){
                        printf("card connection successful...\n");

responseLength = sizeof(response);
result = SCardTransmit(CardHandle, SCARD_PCI_T0, APDU, sizeof(APDU), NULL, response, &responseLength);


if (result == SCARD_S_SUCCESS){
printf("response trailer SW1=%.2xh SW2=%.2xh\n", response[0], response[1]);
}else if (result == SCARD_E_PROTO_MISMATCH)
printf("protocol mismatch...\n");
else
printf("transmit failed %x...\n", result);
}else
printf("card connection failed %x...\n", result);


                SCardReleaseContext(context);
        }else
                printf("unable to connect to ressource manager...\n");
<-- code end

The following is the pcscd output to syslog when my program is executed. Note that the first time the programs runs the protocol negotiation fails. The second time everything seems to be fine but not APDU is exchanged and the transmission generally fails.

-->pcscd syslog first run
pcscd: winscard_msg.c:191:SHMProcessEventsServer Common channel packet arrival
pcscd: winscard_msg.c:198:SHMProcessEventsServer SHMProcessCommonChannelRequest detects: 7
pcscd: pcscdaemon.c:136:SVCServiceRunLoop A new context thread creation is requested: 7
pcscd: winscard_svc.c:102:ContextThread Thread is started: 7
pcscd: winscard_msg.c:252:SHMProcessEventsContext correctly processed client: 7
pcscd: winscard.c:68:SCardEstablishContext Establishing Context: 17021595
pcscd: eventhandler.c:407:EHStatusHandlerThread Card inserted into OMNIKEY Cardman 4000 Socket 0 00 00
pcscd: Card ATR: 3B 95 18 40 FF 62 01 02 01 04
pcscd: winscard_msg.c:252:SHMProcessEventsContext correctly processed client: 7
pcscd: winscard.c:121:SCardConnect Attempting Connect to OMNIKEY Cardman 4000 Socket 0 00 00
pcscd: prothandler.c:126:PHSetProtocol Attempting PTS to T=0
pcscd: prothandler.c:138:PHSetProtocol PTS failed, using T=0
pcscd: winscard_msg.c:252:SHMProcessEventsContext correctly processed client: 7
pcscd: winscard.c:79:SCardReleaseContext Releasing Context: 17021595
pcscd: winscard_msg.c:241:SHMProcessEventsContext Client has disappeared: 7
pcscd: winscard_svc.c:114:ContextThread Client die: 7
<--pcscd syslog first run end


-->pcscd syslog second run start
pcscd: winscard_msg.c:191:SHMProcessEventsServer Common channel packet arrival
pcscd: winscard_msg.c:198:SHMProcessEventsServer SHMProcessCommonChannelRequest detects: 7
pcscd: pcscdaemon.c:136:SVCServiceRunLoop A new context thread creation is requested: 7
pcscd: winscard_svc.c:102:ContextThread Thread is started: 7
pcscd: winscard_msg.c:252:SHMProcessEventsContext correctly processed client: 7
pcscd: winscard.c:68:SCardEstablishContext Establishing Context: 16996639
pcscd: winscard_msg.c:252:SHMProcessEventsContext correctly processed client: 7
pcscd: winscard.c:121:SCardConnect Attempting Connect to OMNIKEY Cardman 4000 Socket 0 00 00
pcscd: winscard.c:221:SCardConnect Active Protocol: unknown -2
pcscd: winscard.c:231:SCardConnect hCard Identity: 1eeea
pcscd: winscard_msg.c:252:SHMProcessEventsContext correctly processed client: 7
pcscd: winscard_msg.c:252:SHMProcessEventsContext correctly processed client: 7
pcscd: winscard.c:79:SCardReleaseContext Releasing Context: 16996639
pcscd: winscard.c:607:SCardDisconnect Active Contexts: 1
pcscd: winscard.c:666:SCardDisconnect Reset complete.
pcscd: winscard_msg.c:241:SHMProcessEventsContext Client has disappeared: 7
pcscd: winscard_svc.c:114:ContextThread Client die: 7
<--pcscd syslog second run end


It should be mentioned, that the cryptoflex card only understands the T0 protocol. But when i select SCARD_PROTOCOL_T0 in the call to SCardConnect it is the same, i.e. it doesn`t work.

As i wrote in my first mail, after switching to pcsclite version 1.2.0 everything works fine. Now i have the problem, that i don`t know how to issue the "Verify CHV" command correctly, as it requires a pin of 8 byte length, but the pre-personalized pin is only of 6 byte length. I cannot use tools like cryptoflex-tool or muscleTool as they are based on libpcsclite1.

Well, i hope i was able to provide some usefull information.

--
El
_______________________________________________
Muscle mailing list
[EMAIL PROTECTED]
http://lists.drizzle.com/mailman/listinfo/muscle

Reply via email to