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

    [C] [linux] pcsc e smart card sle4442

    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?

    Ringrazio anticipatamente, ovviamente posso postare il listato per maggior chiarezza

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466

    Re: [C] [linux] pcsc e smart card sle4442

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

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

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    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..

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

    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/documentatio...lite-0.7.3.pdf

    Il codice:

    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);
    
    		}

  6. #6

    aggiornamento

    Aggorno: con il seguente codice:

    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:

    codice:
     
    (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..

  7. #7
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Credo che sia sbagliata la seguenza di numeri che invii alla device, visto che anche le altre chiamate nn presentano errori.
    Per gli Spartani e Sparta usa spartan Il mio github

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

  9. #9
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    é giusto 0x42000001?
    Per gli Spartani e Sparta usa spartan Il mio github

  10. #10
    Ottima osservazione... Me lo sono chiesto anch'io. Dalle api di pcsc la descrizione del campo è questa :

    codice:
    dwControlCode 	IN 	Control code for the operation
    Quindi mi sembrerebbe sia un identificativo arbitrario dell'operazione.. Purtroppo a rigurado non ho trovato molto.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.