PDA

Visualizza la versione completa : [C] PCSC e smart card SLE4442


charlieroot
23-12-2010, 15:49
Ciao a tutti, per un cliente dovrei sviluppare del software per interagire con le suddette card. E' un campo dove non sono molto competente, lo ammetto.

Fino ad ora riesco a:

Stabilire il collegamento con il lettore ( SCardEstablishContext e SCardConnect )

in modalità direct con modalità di accesso raw ( trattasi in realtà di scheda di memoria e non "vera" smart card ).

NON riesco a inizializzare la carta SCardTransmit. Il buffer inviato da datasheet è corretto

{0xFF,0xA4,0x00,0x00,0x01,0x06}

l'errore riscontrato è proprio relativo al protocollo di trasmissione (SCardTransmit: Card protocol mismatch.).

Qualcuno ha qualche idea? :dhò:

Ringrazio anticipatamente, ovviamente posso postare il listato per maggior chiarezza

simo_85
24-12-2010, 02:47
Originariamente inviato da charlieroot
Ciao a tutti, per un cliente dovrei sviluppare del software per interagire con le suddette card.
Fino ad ora riesco a:
Stabilire il collegamento con il lettore ( SCardEstablishContext e SCardConnect )
in modalità direct con modalità di accesso raw ( trattasi in realtà di scheda di memoria e non "vera" smart card ).
NON riesco a inizializzare la carta SCardTransmit. Il buffer inviato da datasheet è corretto
{0xFF,0xA4,0x00,0x00,0x01,0x06}
l'errore riscontrato è proprio relativo al protocollo di trasmissione (SCardTransmit: Card protocol mismatch.).

Accedi al chip con un software particolare?


Ringrazio anticipatamente, ovviamente posso postare il listato per maggior chiarezza
Se il codice non è kilometrico potrebbe essere facile dargli un'occhiata..

charlieroot
24-12-2010, 15:27
Grazie mille per la risposta, davvero, data la specificità del questio immaginavo che non avrei avuto risposta.



Accedi al chip con un software particolare?

No, con le librerie c pcsc già incluse nell mia distro (uso fedora 14). Occhio al fatto che questo modello più che una smart card viene considerata memory card. Di fatto è composta da due aree di memoria, una protetta e una non protetta. Il software lo sto appunto scrivendo io.




Se il codice non è kilometrico potrebbe essere facile dargli un'occhiata..

Purtroppo ho tutto in ufficio. Cerco di passare in questi giorni. Appena lo recupero posto. Grazie ancora

simo_85
25-12-2010, 21:42
Originariamente inviato da charlieroot
No, con le librerie c pcsc.
Per accedere ai dispositivi puoi usare le funzioni di Linux, un esempio è la ioperm che permette la comunicazione con le porte seriali, ma poi non è detto che ti serva esattamente quella.. Il mio è appunto un esempio.
Le librerie pcsc non le conosco..

Purtroppo ho tutto in ufficio. Cerco di passare in questi giorni. Appena lo recupero posto. Grazie ancora
Vedi se puoi allegarlo come zip.
Se ne avrò il tempo cercerò di essere utile..
:ciauz:

charlieroot
27-12-2010, 10:49
Grazie ancora Simo. Ti allego il file. Le righe commentate all'inizio sono quello che potrebbe essere un makefile.

P.s Il dispositivo non è seriale, è usb (ovviamente prima dell'acquisto ho verificato che fosse compatibile con il pinguino)


Se ne avrò il tempo cercerò di essere utile..

E chi pretende di più... :) Ne siamo a corto tutti... e poi mica ti pago la quota per l'assistenza... :)

Mi basta anche solo che qualcuno mi aiuti a capire dove sbaglio, o a capire meglio il meccanismo di queste dannate schedette. :dhò:

Un pò di documentazione (purtroppo non mi fa allegare zip, solo immagini):

Per il device:
http://www.acs.com.hk/index.php?pid=drivers&id=ACR38

Per le librerie:
http://www.linuxnet.com/documentation/files/pcsc-lite-0.7.3.pdf

Il codice:



/*
# Linux
PCSC_CFLAGS := $(shell pkg-config --cflags libpcsclite)
LDFLAGS := $(shell pkg-config --libs libpcsclite)

CFLAGS += $(PCSC_CFLAGS)

sample: sample2.c

clean: rm -f sample2
*/

#include <winscard.h>
#include <stdio.h>
#include <stdlib.h>
#include <usb.h>
#include <pcsclite.h>

#define CHECK(f, rv) \
if (SCARD_S_SUCCESS != rv) \
{ \
printf(f ": %s\n", pcsc_stringify_error(rv)); \
return -1; \
}\
if (SCARD_S_SUCCESS == rv)\
{ \
printf(f ": %s\n", pcsc_stringify_error(rv)); \
}


int main (void)
{
SCARDCONTEXT hContext;
SCARDHANDLE hCard;
unsigned long dwActProtocol;
SCARD_IO_REQUEST ioRequest;
DWORD size = 64, SendLen = 6, RecvLen = 255, retCode;
char RecvBuff;
long rv;
DWORD dwRecvLength;
int i;

//Establish PC/SC Connection Ok
rv = SCardEstablishContext (SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
CHECK("SCardEstablishContext", rv);

//Connect to the reader
rv = SCardConnect(hContext, "Pertosmart Card Reader 00 00", SCARD_SHARE_DIRECT,SCARD_PROTOCOL_RAW, &hCard, &dwActProtocol);
//CHECK("SCardConnect", rv);
printf("Successfully connected to the reader\n\n");



// Manage card by sending 6byte buffer
unsigned char SendBuff[] = {0x3B,0x04,0x92,0x23,0x10,0x91};
rv = SCardControl(hCard, 0x42000001, SendBuff, SendLen, &RecvBuff, 255, &dwRecvLength);
printf("Select card type : ");
CHECK("SCardControl", rv);
printf("Response : ");
printf("%02X ", RecvBuff);
printf("\n\n");

//Disconnect from the reader
rv = SCardDisconnect(hCard, SCARD_UNPOWER_CARD);
CHECK("SCardDisconnect", rv);

//End the established context
rv = SCardReleaseContext(hContext);
CHECK("SCardReleaseContext", rv);

}

charlieroot
27-12-2010, 20:04
Aggorno: con il seguente codice:



/*
# Linux
PCSC_CFLAGS := $(shell pkg-config --cflags libpcsclite)
LDFLAGS := $(shell pkg-config --libs libpcsclite)

CFLAGS += $(PCSC_CFLAGS)

sample: sample2.c

clean: rm -f sample2
*/

#include <winscard.h>
#include <stdio.h>
#include <stdlib.h>
#include <usb.h>
#include <pcsclite.h>

#define CHECK(f, rv) \
if (SCARD_S_SUCCESS != rv) \
{ \
printf(f ": %s\n", pcsc_stringify_error(rv)); \
return -1; \
}\
if (SCARD_S_SUCCESS == rv)\
{ \
printf(f ": %s\n", pcsc_stringify_error(rv)); \
}


int main (void)
{
SCARDCONTEXT hContext;
SCARDHANDLE hCard;
unsigned long dwActProtocol;
SCARD_IO_REQUEST ioRequest;
DWORD size = 64, SendLen = 6, RecvLen = 255, retCode;
char RecvBuff;
long rv;
DWORD dwRecvLength;
int i;

//Establish PC/SC Connection Ok
printf("\n(1). Establish context :\n");
rv = SCardEstablishContext (SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
CHECK("SCardEstablishContext", rv);


//Connect to the reader
printf("(2). Establish connection :\n");
rv = SCardConnect(hContext, "Pertosmart Card Reader 00 00", SCARD_SHARE_DIRECT,SCARD_PROTOCOL_RAW, &hCard, &dwActProtocol);
CHECK("SCardConnect", rv);

//Begin transaction
printf("(3). Begin transaction :\n");
rv = SCardBeginTransaction(hCard);
CHECK("SCardBeginTransaction", rv);

// Manage card by sending 6byte buffer
unsigned char SendBuff[] = {0xFF,0x09,0x00,0x00,0x10};
printf("(4). Send buffer :\n");
rv = SCardControl(hCard, 0x42000001, SendBuff, 5 , &RecvBuff, 255, &dwRecvLength);
CHECK("SCardControl", rv);
printf("%s\n", pcsc_stringify_error(RecvBuff));

//Connect to the reader
printf("(5). release transaction :\n");
rv = SCardEndTransaction( hCard, SCARD_LEAVE_CARD );
CHECK("SCardEndTransaction", rv);

//Disconnect from the reader
printf("(6). Release connection :\n");
rv = SCardDisconnect(hCard, SCARD_UNPOWER_CARD);
CHECK("SCardDisconnect", rv);

//End the established context
printf("(7). Release context :\n");
rv = SCardReleaseContext(hContext);
CHECK("SCardReleaseContext", rv);
printf("\n");
}


Ottengo il seguente output:



(1). Establish context :
SCardEstablishContext: Command successful.
(2). Establish connection :
SCardConnect: Command successful.
(3). Begin transaction :
SCardBeginTransaction: Command successful.
(4). Send buffer :
SCardControl: Command successful.
Unknown error: 0x0000006E
(5). release transaction :
SCardEndTransaction: Command successful.
(6). Release connection :
SCardDisconnect: Command successful.
(7). Release context :
SCardReleaseContext: Command successful.


Adesso sarebbe carino capire se sbaglio i comandi inviati alla card con il mio buffer, o meglio cos'è questo:
Unknown error: 0x0000006E

Chi ne sapesse qualcosa farebbe cosa mooolto gradita a darmi una dritta..

linoma
28-12-2010, 14:57
Credo che sia sbagliata la seguenza di numeri che invii alla device, visto che anche le altre chiamate nn presentano errori.

charlieroot
28-12-2010, 18:05
Eh già... ma a questo ci ero arrivato anch'io..

Il problema è che da datasheet l'apdu inviata è giusta...

E inoltre il lettore dovrebbe nel momento in cui stabilisco la connessione accendere un led verde fisso. Invece continua a lampeggiare.. da qui i miei dubbi. Per questo speravo che rispondesse qualcuno che ha già lavorato con le memory card a tessera.

linoma
28-12-2010, 18:07
é giusto 0x42000001?

charlieroot
28-12-2010, 18:14
Ottima osservazione... Me lo sono chiesto anch'io. Dalle api di pcsc la descrizione del campo è questa :


dwControlCode IN Control code for the operation

Quindi mi sembrerebbe sia un identificativo arbitrario dell'operazione.. Purtroppo a rigurado non ho trovato molto.

Loading