Hello,
I would put my hand in the fire, and guess that the
following happens with memory cards and protocol RAW:
* The pcsc daemon calls the ifdhandler function
IFDHControl().
* The driver maps the command to a CT command, instead
of a ICC command.
* 6E 00 is returned because this is the CT-BCS return
code when you specify a CLASS byte distinct from 0x20
(wrong class byte for CT-BCS).
It seems that if you specify dwProtocol = 0, then the
pcscd calls the rigth driver function for sending a
ICC command, that is IFDHTransmitToICC()
IMHO think this is a bug in pcscd, because it should
be calling IFDHTransmitToICC() even for memory cards
and IFDHControl() should be used internally by pcscd
but not exported to the user level.
--- [EMAIL PROTECTED] escribió: > Hi,
>
> I got the same problem.
> I'm using a chip drive driver, a SLE 4428 as a smart
> card and
> towitoko2.0.2, and pcsc-lite-0.8.4.
>
> I always got the response 6E 00 when i wanted to
> select the Master File
> (3F00).
> (And even if i change the instruction code or
> whatever)
>
> However the tester provided with towitoko get the
> right answer (90 00).
>
> After searching for 3 days i manage to get the right
> answer using
> pcsc-lite.
>
> Code generating wrong answer :
>
> file sc_filesystem.c
> -------------
> LONG SCSelectFile(SCARDHANDLE hCard, BYTE fileId1,
> BYTE fileId2)
> {
>
> LONG rv; //The response status
> DWORD dwLength = 2;
>
> BYTE bufToRecv[50]={0}; //unsigned char *
> bufToRecv
> BYTE cmdToSend[7]={1};
> SCARD_IO_REQUEST sRecvPci;
> SCARD_IO_REQUEST sSendPci;
> //sRecvPci.dwProtocol = 0;
> //sSendPci.dwProtocol = 0;
> sRecvPci.dwProtocol = SCARD_PROTOCOL_RAW;
> sSendPci.dwProtocol = SCARD_PROTOCOL_RAW;
>
> cmdToSend[0] = 0xC0; // Class (Same result with
> 0x00)
> cmdToSend[1] = 0xa4; // INS : Select APDU
> cmdToSend[2] = 0x00; // P1 : 00 (Select by file
> id)
> cmdToSend[3] = 0x00; // P2 : 00 (Return the FCI)
> cmdToSend[4] = 0x02; // Length of the data field
> (Here 2 bytes)
> cmdToSend[5] = fileId1; // 1st byte of the fileId.
> cmdToSend[6] = fileId2; // 2nd byte of the fileId.
> //cmdToSend[7] = 0x00; // Return up to 256 or
> 65536 response byte.
> //cmdToSend[7] Empty
>
> rv = SCardTransmit(hCard, &sSendPci, cmdToSend, 7,
> &sRecvPci,
> bufToRecv, &dwLength);
>
> if (rv == SCARD_S_SUCCESS && dwLength == 2)
> {
> int i;
> printf("PCSC OK: %s\n",
> pcsc_stringify_error(rv));
> for(i = 0; i < dwLength; i++)
> {
> printf("Result APDU : %x\n",
> bufToRecv[i]);
> }
> return rv;
> }
> else
> {
> printf("PCSC ERROR: %s\n",
> pcsc_stringify_error(rv));
> return rv;
> }
>
> }
>
> Now testLib.c
> ----------
>
> dwShareMode = SCARD_SHARE_SHARED;
> //dwPreferredProtocols = SCARD_PROTOCOL_T0;
>
> printf("Test SCardConnect ... \n");
>
> rv = SCardConnect(hContext, szReader, dwShareMode,
> SCARD_PROTOCOL_RAW,
> &hCard, &dwActiveProtocol);
>
> if ( rv != SCARD_S_SUCCESS )
> {
> printf("PCSC ERROR: %s\n",
> pcsc_stringify_error(rv));
> return 1;
> }
>
> printf("Connection to the Card Successful ...\n");
> printf("Protocol in used : %li ...\n",
> dwActiveProtocol);
>
> printf("Testing SCSelectFile ... \n");
>
> rv = SCSelectFile(hCard, fileId[0], fileId[1]);
>
> if ( rv != SCARD_S_SUCCESS )
> {
> printf("PCSC ERROR: %s\n",
> pcsc_stringify_error(rv));
> return 1;
> }
>
>
----------------------------------------------------------------
>
> When i used this piece of code i always got 6e 00.
> I noticed that the value of dwActiveProtocol was
> equal to 0, whatever
> SCARD_PROTOCOL_xxx
> i used in the SCardCONNECT function.
>
> So i did this few changes in the SCSelectFile
> function
> {
> sRecvPci.dwProtocol = 0;
> sSendPci.dwProtocol = 0;
> //sRecvPci.dwProtocol = SCARD_PROTOCOL_RAW;
> //sSendPci.dwProtocol = SCARD_PROTOCOL_RAW;
> }
>
> I just replace SCARD_PROTOCOL_RAW by 0 and now
> everything is working
> fine.
>
> What i would like to know is why this behavior ?
> Is there a cleaner way to fix that ?
>
> Thanks.
>
> --------------------------------------
> Christian Jean
> Software Engineer
> Celestix Networks PTE LTD : http://www.celestix.com
> ---------------------------------------
>
>
***************************************************************
> Linux Smart Card Developers - M.U.S.C.L.E.
> (Movement for the Use of Smart Cards in a Linux
> Environment)
> http://www.linuxnet.com/smartcard/index.html
>
***************************************************************
__________________________________________________
Do You Yahoo!?
Get email at your own domain with Yahoo! Mail.
http://personal.mail.yahoo.com/
***************************************************************
Linux Smart Card Developers - M.U.S.C.L.E.
(Movement for the Use of Smart Cards in a Linux Environment)
http://www.linuxnet.com/smartcard/index.html
***************************************************************