PDA

Visualizza la versione completa : [C++] Programmare Smart Card


Kociss.Net
19-10-2004, 10:16
Buon giorno a tutti, devo includere la gestione delle smart card nel mio progetto ma sono completamente ignorante sulla cosa. Ho tutto quello che mi serve: Lettore GemPC410, card di prova, un manuale sulla programmazione delle smart card di ugo chirico e il software per programmarci sopra scritto sempre da ugo chirico. Nel mio progetto avrei bisogno di leggere/scrivere le informazioni sulla card ma non saprei da dove partire. Esempio: ho intercettato l'evento click di un button e volevo farmi ritornare le informazioni della card da visualizzare in una AfxMessageBox....il problema che ho iniziato a scrivere del codice ma non so effettivamente quando giusto sia. Non c' nessuno che ha fatto delle cose simili? o per lo meno ha del codice, dei link, qualcosa da potermi indicare per avere un riferimento?Al momento mi sto arrampicando sugli specchi :messner:

Vi posto quello che ho provato a scrivere ma premetto che sar tutto sbagliato e comunque non completo....


//Mi restituisce l'handle alla sessione aperta
SCARDCONTEXT hContext;
long nRes;
nRes = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hContext);
if(nRes != SCARD_S_SUCCESS)
return;
//Apro la connessione con la SmartCard
SCARDHANDLE hCard;
LPCTSTR lpszReaderName = _T("Ugo's Virtual Smart Card Reader");
DWORD dwSharedMode = SCARD_SHARE_SHARED;
DWORD dwPreferredProtocol = SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1;
DWORD dwActiveProtocol = SCARD_PROTOCOL_T1;

nRes = SCardConnect(
hContext,
lpszReaderName,
dwSharedMode,
dwPreferredProtocol,
&hCard,
&dwActiveProtocol
);

if(nRes != SCARD_S_SUCCESS)
return;

typedef struct APDU
{
BYTE cla; //classe
BYTE ins; //istruzione
BYTE p1; //P1
BYTE p2; //P2
BYTE lc; //lunghezza del campo data
BYTE data[256]; //Dati
BYTE le; //lunghezza del response
}APDU;
//Lunghezza dei dati da inviare
DWORD dwSendLength;
//Buffer contenente l'APDU
BYTE pbtAPDU[262];
//Lunghezza del campo response
DWORD dwRecvLength;
//Buffer contenente il campo response
BYTE btRecvBuffer[256];

APDU* apdu;
apdu = new APDU;

apdu->cla = 0x00;
apdu->ins = 0xCA;
apdu->p1 = 0x00;
apdu->p2 = 0x81;
apdu->lc = 0x00;
apdu->le = 0x00;

pbtAPDU[0] = apdu->cla;
pbtAPDU[1] = apdu->ins;
pbtAPDU[2] = apdu->p1;
pbtAPDU[3] = apdu->p2;
pbtAPDU[4] = apdu->lc;



mi sono fermata qui....Aiuto per favore Grazie :ciauz:

RaouL_BennetH
19-10-2004, 21:05
Non ho la risposta che cerchi, ma ti uppo perch la cosa interessa molto anche me :)

Kociss.Net
25-10-2004, 09:14
up

RaouL_BennetH
25-10-2004, 17:01
Originariamente inviato da Kociss.Net
up

potresti indicarmi dove hai comprato il lettore? magari anche in pvt. Thx.

Kociss.Net
25-10-2004, 18:06
nessun problema. vai al sito http://www.vimas.it e trovi tutte le informazioni che cerchi. Io ho comprato un pacchetto della Gemplus che si chiama "GemClub-Memo Evalutation kit" da loro che comprende il lettore GemPC410 10 card di prova il software e i manuali. per ho scaricato anche la console per programmare le smartCard di Ugo chirico da qui http://www.ugosweb.com/scemuIta.html nella sezione SmartCardEmulator e il manuale....Anche se tutto questo non servito a risolvere i miei dubbi sull'argomento.....rimane per me un mare aperto...Ciao :ciauz:

MMarzia
25-10-2004, 22:14
Originariamente inviato da RaouL_BennetH
potresti indicarmi dove hai comprato il lettore? magari anche in pvt. Thx.
gli scambi di pvt gestiteveli, appunto, in privato

Kociss.Net
26-10-2004, 08:54
Scusa....ho pensato che potesse servire anche a qualcun'altro. :)

Kociss.Net
27-10-2004, 11:37
Ho modificato il mio codice in questo modo




//-----------------------------------------------------------------------------
DataLng CCTestaMovDoc::RecuperaInformazioniCard()
{
//Mi restituisce l'handle alla sessione aperta
SCARDCONTEXT hContext;
long nRes;
nRes = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hContext);
if(nRes != SCARD_S_SUCCESS)
return nRes;

//Apro la connessione con la SmartCard
SCARDHANDLE hCard;
LPCTSTR lpszReaderName = LPCTSTR(RichiediListaLettori(hContext));
DWORD dwSharedMode = SCARD_SHARE_SHARED;
DWORD dwActiveProtocol = SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1;
DWORD dwPreferredProtocol;

nRes = SCardConnect(
hContext,
lpszReaderName,
dwSharedMode,
dwActiveProtocol,
&hCard,
&dwPreferredProtocol
);

if(nRes != SCARD_S_SUCCESS)
return nRes;

APDU apdu;
BYTE* pbtResponse;
DWORD* pdwRespLen;

apdu.cla = 0x00;
apdu.ins = 0xCA;
apdu.p1 = 0x00;
apdu.p2 = 0x81;
apdu.lc = 0x00;
apdu.le = 0x00;
apdu.data[0] = 0x34;
apdu.data[1] = 0x30;

SendAPDU(hCard,apdu,pbtResponse,pdwRespLen);

//Chiudo la connessione con la SmartCard
DWORD dwDisposition = SCARD_LEAVE_CARD;
nRes = SCardDisconnect(hCard, dwDisposition);
if(nRes != SCARD_S_SUCCESS)
return nRes;

//Chiudo la sessione
nRes = SCardReleaseContext(hContext);
if(nRes != SCARD_S_SUCCESS)
return nRes;
}
//-----------------------------------------------------------------------------
DataLng CCTestaMovDoc::SendAPDU(SCARDHANDLE hCard, APDU apdu, BYTE* pbtResponse, DWORD* pdwRespLen)
{
//Lunghezza dei dati da inviare
DWORD dwSendLength;
//Buffer contenente l'APDU
BYTE pbtAPDU[262]; //5 + 256 + 1
//Lunghezza del response
DWORD dwRecvLength;
//Buffer contenente il response
BYTE btRecvBuffer[258]; //sw1 + sw2 + Response
//Codice di ritorno del Resource Manager
long nRes;
//Codice di ritorno della smart card
BYTE SW1;
BYTE SW2;
UINT nSCCode;
//imposta la lunghezza dei dati da inviare
dwSendLength = 6 + apdu.lc;
//copia l'apdu nel buffer
pbtAPDU[0] = apdu.cla;
pbtAPDU[1] = apdu.ins;
pbtAPDU[2] = apdu.p1;
pbtAPDU[3] = apdu.p2;
pbtAPDU[4] = apdu.lc;

//Copia del campo data
if(apdu.lc !=0)
{
memcpy(pbtAPDU + 5, apdu.data, apdu.lc);
}

pbtAPDU[5 + apdu.lc] = apdu.le;
HANDLE aHandle = SCardAccessStartedEvent();
//Invia l'APDU
nRes = SCardTransmit(hCard,
SCARD_PCI_T1,
pbtAPDU,
dwSendLength,
NULL,
btRecvBuffer,
&dwRecvLength);
DWORD Res = nRes;
if(nRes != SCARD_S_SUCCESS)
return nRes;
//Estrae il codice di ritorno SW1 e SW2 della smart card
SW1 = btRecvBuffer[dwRecvLength -2];
SW2 = btRecvBuffer[dwRecvLength -1];
//Calcola il codice di ritorno
nSCCode = (SW1 * 256 + SW2);
//se diverso da 0x9000 errore della smart card
if(nSCCode != 0x9000)
return nSCCode;
//se il response richiesto copia la risposta nel buffer allocato
if(pbtResponse != NULL)
{
//copia il response
memcpy(pbtResponse, btRecvBuffer, dwRecvLength - 2);
//imposta la lunghezza del response
*pdwRespLen = dwRecvLength - 2;
}
return SCARD_S_SUCCESS;

}

il problema che la funzione SCardTransmit mi ritorna 14 come valore anzich 0. Qualcuno mi s aiutare?
Ho utilizzato Visual Studio .NET 2003
Rigranzio chiunque mi s dare una mano :ciauz:

Kociss.Net
28-10-2004, 12:03
up

samoa
11-06-2005, 16:58
up

Loading