Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C++] Programmare Smart Card

    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

    Vi posto quello che ho provato a scrivere ma premetto che sarą tutto sbagliato e comunque non č completo....
    codice:
    	//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

  2. #2
    Non ho la risposta che cerchi, ma ti uppo perchč la cosa interessa molto anche me

  3. #3
    up

  4. #4
    Originariamente inviato da Kociss.Net
    up
    potresti indicarmi dove hai comprato il lettore? magari anche in pvt. Thx.

  5. #5
    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

  6. #6
    Utente di HTML.it L'avatar di MMarzia
    Registrato dal
    Mar 2001
    Messaggi
    1,781
    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
    io sono festosamente cicciottello :: e. cartman

    t'amo senza sapere come, nč quando nč da dove,
    t'amo direttamente senza problemi nč orgoglio:
    cosģ ti amo perchč non so amare altrimenti

  7. #7
    Scusa....ho pensato che potesse servire anche a qualcun'altro.

  8. #8
    Ho modificato il mio codice in questo modo

    codice:
    //-----------------------------------------------------------------------------
    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

  9. #9
    up

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2001
    Messaggi
    532
    up

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.