Communiquer avec module USB RFID (ACR 122 et autres)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Re: Communiquer avec module USB RFID ACR 122?

Message par totorcalais »

En revenant sur le code avec le wrapper (winscard.dll), j'ai un peu bricolé le code sachant que je ne comprenais pas pourquoi il faisait référence à @"TOWITOKO CHIPDRIVE 0" lorsqu'il cherchait à se connecter (et que les variables de retour restaient désespérément vides).

Je me suis dit, il attend le nom du périphérique (que l'on a récupéré précédemment avec la fonction ListReaders(hCTX,0,@Buf,@L)).

Je me suis aperçu aussi qu'en changeant la valeur hCTX par 0, au niveau de la fonction listreaders, le buffer contenait une version plus longue du nom qui correspond parfaitement à celui obtenu par le moniteur fourni par le fabricant (voir un des posts précédents)

En fait, en modifiant ce code (à l'arrache, je l'avoue), j'ai obtenu une avancée remarquable :

Lecteur avec carte (led verte) :
résultat 1 :
dll ok
Scard : : 0 hCTX: FFFFFFFFCD010000
hCTX: FFFFFFFFCD010000 -Reader : 0 buffer: ACS ACR122 0
Connect : valeur A : 0 : hcard : FFFFFFFFEA010000 : valeur AP : 2
Status : valeur A : 0 : valeur S : 6 : valeur AP : 2 : valeur ATRL : 14 : valeur ATR : 0
Disconnect : valeur A : 0
Connect : valeur A : 0
Status : valeur A : 0 : valeur S : 6 : valeur AP : 2 : valeur ATRL : 14 : valeur ATR : 1808F3B
Transmit : valeur A : 16 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
...
Lecteur sans carte (led rouge) :
dll ok
Scard : : 0 hCTX: FFFFFFFFCD010000
hCTX: FFFFFFFFCD010000 -Reader : 0 buffer: ACS ACR122 0
Connect : valeur A : FFFFFFFF80100069 : hcard : 0 : valeur AP : 0
Status : valeur A : 6 : valeur S : 0 : valeur AP : 0 : valeur ATRL : 0 : valeur ATR : 0
Disconnect : valeur A : 6
Connect : valeur A : FFFFFFFF80100069
Status : valeur A : 6 : valeur S : 0 : valeur AP : 0 : valeur ATRL : 0 : valeur ATR : 0
Transmit : valeur A : 16 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
...
Eh oui, il y a du changement.

avec une autre carte que la précédente (led verte) :
dll ok
Scard : : 0 hCTX: FFFFFFFFCD010000
hCTX: FFFFFFFFCD010000 -Reader : 0 buffer: ACS ACR122 0
Connect : valeur A : 0 : hcard : FFFFFFFFEA010000 : valeur AP : 2
Status : valeur A : 0 : valeur S : 6 : valeur AP : 2 : valeur ATRL : 14 : valeur ATR : 0
Disconnect : valeur A : 0
Connect : valeur A : 0
Status : valeur A : 0 : valeur S : 6 : valeur AP : 2 : valeur ATRL : 14 : valeur ATR : 1808F3B
Transmit : valeur A : 16 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
...
Ce qui veut dire que l'on détecte ou pas la présence d'une carte mais qu'on n'arrive toujours pas discriminer l'une de l'autre.

Mais je trouve que ça progresse et surtout, ça répond aux sollicitations.

EDIT : un petit détail supplémentaire, quant on compare les 3 sorties du débogueur (avec ou sans carte1 ou 2), la version sans carte fait apparaître un résultat A qui n'existe pas dans les deux autres cas. Quesako?

Comme dans la chanson de regiani, "...Y'a quelque chose qui cloche là-dedans, J'y retourne immédiatement!"



Le code modifié :

Code : Tout sélectionner

;*******************************************************
;
;  PureBasic : PCSC Wrapper
;  Author : Leo Mijnders
;  Date : 29 March 2004
;  Doc : http://msdn.microsoft.com/library/en-us/security/security/authentication_functions.asp?frame=true#smart_card_functions
;
;*******************************************************

#SCARD_SHARE_EXCLUSIVE = 1 ; This application is not willing To share this
                           ; // card with other applications.
#SCARD_SHARE_SHARED = 2    ; This application is willing To share this
                           ; // card with other applications.
#SCARD_SHARE_DIRECT = 3    ; // This application demands direct control of

#SCARD_PROTOCOL_T0               =$0001   ;/* T=0 active protocol. */
#SCARD_PROTOCOL_T1               =$0002   ;/* T=1 active protocol. */
#SCARD_PROTOCOL_RAW              =$0004   ;/* Raw active protocol. */


#SCARD_UNKNOWN                   =$0001   ;/* Unknown state */
#SCARD_ABSENT                    =$0002   ;/* Card is absent */
#SCARD_PRESENT                   =$0004   ;/* Card is present */
#SCARD_SWALLOWED                 =$0008   ;/* Card not powered */
#SCARD_POWERED                   =$0010   ;/* Card is powered */
#SCARD_NEGOTIABLE                =$0020   ;/* Ready For PTS */
#SCARD_SPECIFIC                  =$0040   ;/* PTS has been set */

#SCARD_LEAVE_CARD                =$0000   ;/* Do nothing on close */
#SCARD_RESET_CARD                =$0001   ;/* Reset on close */
#SCARD_UNPOWER_CARD              =$0002   ;/* Power down on close */
#SCARD_EJECT_CARD                =$0003   ;/* Eject on close */

#SCARD_S_SUCCESS                 =$00000000
#SCARD_E_CANCELLED               =$80100002
#SCARD_E_CANT_DISPOSE            =$8010000E
#SCARD_E_INSUFFICIENT_BUFFER     =$80100008
#SCARD_E_INVALID_ATR             =$80100015
#SCARD_E_INVALID_HANDLE          =$80100003
#SCARD_E_INVALID_PARAMETER       =$80100004
#SCARD_E_INVALID_TARGET          =$80100005
#SCARD_E_INVALID_VALUE           =$80100011
#SCARD_E_NO_MEMORY               =$80100006
#SCARD_F_COMM_ERROR              =$80100013
#SCARD_F_INTERNAL_ERROR          =$80100001
#SCARD_F_UNKNOWN_ERROR           =$80100014
#SCARD_F_WAITED_TOO_LONG         =$80100007
#SCARD_E_UNKNOWN_READER          =$80100009
#SCARD_E_TIMEOUT                 =$8010000A
#SCARD_E_SHARING_VIOLATION       =$8010000B
#SCARD_E_NO_SMARTCARD            =$8010000C
#SCARD_E_UNKNOWN_CARD            =$8010000D
#SCARD_E_PROTO_MISMATCH          =$8010000F
#SCARD_E_NOT_READY               =$80100010
#SCARD_E_SYSTEM_CANCELLED        =$80100012
#SCARD_E_NOT_TRANSACTED          =$80100016
#SCARD_E_READER_UNAVAILABLE      =$80100017


Enumeration
  #SCARD_SCOPE_USER            ;    0x0000/* Scope in user space */
  #SCARD_SCOPE_TERMINAL        ;    0x0001/* Scope in terminal */
  #SCARD_SCOPE_SYSTEM          ;    0x0002/* Scope in system */
EndEnumeration 


Global fSCardEstablishContext, fSCardConnect, fSCardStatus, fSCardDisconnect, fSCardTransmit
Global fSCardListReaders

Global g_rgSCardT0Pci, g_rgSCardT1Pci, g_rgSCardRawPci

Procedure.l InitPCSC(Lib.l)
  If OpenLibrary(Lib, "WinSCard.dll")
    Debug "dll ok"
    ; Pointers to SCARD_IO_REQUEST structures
    
    g_rgSCardT0Pci= GetFunction(Lib,"g_rgSCardT0Pci")
    g_rgSCardT1Pci= GetFunction(Lib,"g_rgSCardT1Pci")
    g_rgSCardRawPci= GetFunction(Lib,"g_rgSCardRawPci")
    
    ; Pointers to Basic PCSC Functions
    
    fSCardEstablishContext= GetFunction(Lib,"SCardEstablishContext")
    fSCardConnect= GetFunction(Lib,"SCardConnectA")
    fSCardStatus= GetFunction(Lib,"SCardStatusA")
    fSCardDisconnect= GetFunction(Lib,"SCardDisconnect")
    fSCardTransmit= GetFunction(Lib,"SCardTransmit")
    fSCardListReaders= GetFunction(Lib,"SCardListReadersA")
    
    ProcedureReturn 0
  EndIf
  ProcedureReturn -1
EndProcedure 

Procedure.l sSCardEstablishContext(self.l, a.l, b.l, c.l, d.l)
  ProcedureReturn CallFunctionFast(fSCardEstablishContext, a, b, c, d)
EndProcedure

Procedure.l sSCardConnect(self.l, a.l, b.l, c.l, d.l, e.l, f.l)
  ProcedureReturn CallFunctionFast(fSCardConnect, a, b, c, d, e, f)
EndProcedure

Procedure.l sSCardStatus(self.l, a.l, b.l, c.l, d.l, e.l, f.l, g.l)
  ProcedureReturn CallFunctionFast(fSCardStatus, a, b, c, d, e, f, g)
EndProcedure

Procedure.l sSCardDisconnect(self.l, a.l, b.l)
  ProcedureReturn CallFunctionFast(fSCardDisconnect, a, b)
EndProcedure

Procedure.l sSCardTransmit(self.l, a.l, b.l, c.l, d.l, e.l, f.l, g.l)
  ProcedureReturn CallFunctionFast(fSCardTransmit, a, b, c, d, e, f, g)
EndProcedure

Procedure.l sSCardListReaders(self.l, a.l, b.l, c.l, d.l)
  ProcedureReturn CallFunctionFast(fSCardListReaders, a, b, c, d)
EndProcedure

Interface IF_PCSC
  EstablishContext(a.l, b.l, c.l, d.l)
  Connect(a.l, b.l, c.l, d.l, e.l, f.l)
  Status(a.l, b.l, c.l, d.l, e.l, f.l, g.l)
  Disconnect(a.l, b.l)
  Transmit(a.l, b.l, c.l, d.l, e.l, f.l, g.l)
  ListReaders(a.l, b.l, c.l, d.l)
EndInterface

Structure strucInterface
  a.l
  b.l
  c.l
  d.l
  e.l
  f.l
EndStructure

SCard.IF_PCSC
Struc.strucInterface

Struc\a=@sSCardEstablishContext()
Struc\b=@sSCardConnect()
Struc\c=@sSCardStatus()
Struc\d=@sSCardDisconnect()
Struc\e=@sSCardTransmit()
Struc\f=@sSCardListReaders()

AddStruc.l=@Struc
PokeL(@SCard,@AddStruc)

Structure IO_REQ
  P.l
  A.l
  B.b[512]
EndStructure

outPCI_T0.IO_REQ

outPCI_T0\P=1
outPCI_T0\A=512


; *************************** CompilerIf 0 if used as IncludeFile  or  1 = if test IncludeFile
Procedure.s StringConvert(stext.s, format.l = #PB_Unicode)
;
  Define *mem
  Define result.s

  *mem = AllocateMemory(StringByteLength(stext, format)+2)
  PokeS(*mem, stext, format)
  result = PeekS(*mem, StringByteLength(stext, format)+2, format)
  ;FreeMemory(*mem)
  ProcedureReturn result
  
EndProcedure

Procedure.s HexString(Source.l, L.l) 
  result.s = ""
  For i = 0 To L-1
    result = result + Right("00" + Hex(PeekB(Source+i)), 2) 
  Next i
  ProcedureReturn result
EndProcedure

hCTX.l
Buf.s=Space(10000)
ATRL.l
*ATR=AllocateMemory(1000)
hCARD.l
AP.l
L.l
S.L
*IN=AllocateMemory(1000)
*OUT=AllocateMemory(1000)
OutL.l

; APDU to genarate 8 byte Random at TB100 smartcard

PokeB(*IN,$BC)
PokeB(*IN+1,$C4)
PokeB(*IN+2,$00)
PokeB(*IN+3,$00)
PokeB(*IN+4,$08)

If InitPCSC(10)=0
  A=SCard\EstablishContext(0,0,0,@hCTX)
  ;MessageRequester("hCTX", Hex(A)+" "+Hex(hCTX),0)
   Debug "Scard :" + " : "+ Hex(A)+ "    hCTX: "+Hex(hCTX)
   
   
   L.l=10000
  A=SCard\ListReaders(0,0,@Buf,@L)
  ;MessageRequester("Reader", Hex(A)+" "+Buf,0)
  buf$=StringConvert(buf, #PB_Ascii)
  Debug "    hCTX: "+Hex(hCTX) + " -Reader" + " : "+ Hex(A)+ "    buffer: "+ buf$
  
  A=SCard\Connect(hCTX,@buf,#SCARD_SHARE_SHARED,#SCARD_PROTOCOL_T0 | #SCARD_PROTOCOL_T1,@hCARD,@AP)
  ;MessageRequester("Connect", Hex(A),0)
  Debug "Connect"+ " : valeur A : "+Hex(A)+" : hcard : "+Hex(hCARD)+ " : valeur AP : "+Hex(AP)
  
  
  A=SCard\Status(hCARD,@Buf,@L,@S,@AP,*ATR,@ATRL)
  ;MessageRequester("Status", Hex(A)+" "+Hex(S)+" "+Hex(AP)+" "+Hex(ATRL)+" "+Hex(PeekL(*ATR)),0)
  Debug "Status"+ " : valeur A : "+Hex(A)+ " : valeur S : "+Hex(S)+ " : valeur AP : "+Hex(AP)+ " : valeur ATRL : "+Hex(ATRL)+ " : valeur ATR : "+Hex(PeekL(*ATR))
  
  
  A=SCard\DisConnect(hCARD,#SCARD_RESET_CARD)
  ;MessageRequester("Disconnect", Hex(A))
  Debug "Disconnect"+ " : valeur A : "+Hex(A)
  
  
  A=SCard\Connect(hCTX,@buf,#SCARD_SHARE_SHARED,#SCARD_PROTOCOL_T0 | #SCARD_PROTOCOL_T1,@hCARD,@AP)
  ;MessageRequester("Connect", Hex(A),0)
  Debug "Connect"+ " : valeur A : "+Hex(A)
  
  
  A=SCard\Status(hCARD,@Buf,@L,@S,@AP,*ATR,@ATRL)
  ;MessageRequester("Status", Hex(A)+" "+Hex(S)+" "+Hex(AP)+" "+Hex(ATRL)+" "+HexString(*ATR,ATRL),0)
  Debug "Status"+ " : valeur A : "+Hex(A)+ " : valeur S : "+Hex(S)+ " : valeur AP : "+Hex(AP)+ " : valeur ATRL : "+Hex(ATRL)+ " : valeur ATR : "+Hex(PeekL(*ATR))
  For I=1 To 10
    OutL=10
    A=SCard\Transmit(hCARD, g_rgSCardT0Pci, *IN, 5, @outPCI_T0, *OUT, @OutL)
   ; MessageRequester("Transmit", Hex(A)+" "+HexString(*OUT,OutL)+" "+Hex(OutL),0)
    Debug "Transmit"+ " : valeur A : "+Hex(A)+ " : valeur OUT,Outl : "+HexString(*OUT,OutL)+ " : valeur Outl : "+Hex(OutL)
  Next  
  
  
  A=SCard\DisConnect(hCARD,#SCARD_RESET_CARD)
  ;MessageRequester("Disconnect", Hex(A))
Else
  MessageRequester("Error", "Lib not loaded",0)
EndIf 
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Re: Communiquer avec module USB RFID ACR 122?

Message par totorcalais »

Je viens de m'apercevoir que la valeur ATR qui apparaît lors d'un changement de carte est en fait la valeur inversée du début de l'ATR que j'ai (toujours par le moniteur de smartcard fourni).
Il commence par 3B 8F 80 01 80 4F...

et cet ATR (lors de la présence d'une carte est la chaine inversée avec 3B en dernier.

Bon, ce n'est pas cela qui va me permettre la discrimination, mais disons que cela devient rigolo :)
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Communiquer avec module USB RFID ACR 122?

Message par Marc56 »

Ou bien j'ai loupé la réponse, ou bien tu ne nous a pas dit la marque de ton lecteur ? :oops:
(D'après d'autres forums il y en a de plus ou moins compatibles du modèle ACR122U)
ACS "semble" être l'original, mais est-il vendu en marque blanche à d'autres distributeurs (kkmoon, Yosoo etc)
ou sont-ce des copies plus ou moins compatibles ?
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Re: Communiquer avec module USB RFID ACR 122?

Message par totorcalais »

il s'agit d'un yosoo :

Celui là précisément :
https://www.amazon.fr/gp/product/B00VSM ... UTF8&psc=1
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Communiquer avec module USB RFID ACR 122?

Message par Marc56 »

Merci :)

J'étais tombé sur le site officiel, mais je ne le trouve plus :|

Mais une idée en attendant: s'il est fourni avec un outils en ligne de commande qui fonctionne, tu peux toujours l'encapsuler avec RunProgram() en fenêtre cachée et traiter la sortie console de même.

:wink:
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Communiquer avec module USB RFID ACR 122?

Message par Mesa »

Pour les codes erreur à cause du format .a de RET et des nombres négatifs des variables erreurs, j'ai pu trouver la correspondance entre ce qui est affiché dans debug et le code d'erreur d'origine.
;// Error codes
; OK=0;#define OK 0 ///< Function CALL was successful.
; ERR_INVALID =-1 mais le debug affichera 255 ///< Invalid parameter Or value.
; ERR_CT = -8 mais le debug affichera 248 ///< CT error.
; ERR_TRANS = -10 mais le debug affichera 246 ///< Non-eliminable transmission error.
; ERR_MEMORY= -11 mais le debug affichera 245 ///< Memory assignment error IN HTSI.
; ERR_HOST = -127 et le debug affichera 127 ///< Abort of function by host/OS.
; ERR_HTSI = -128 mais le debug affichera 126 ///< HTSI error.





Peux-tu remplacer test.pb par:

Code : Tout sélectionner

;// Error codes
; Ici je préfère créer des variables globales plutôt que des constante
; OK=0;#define OK              0       ///< Function CALL was successful.
; ERR_INVALID =-1 mais le logiciel affichera 255    ///< Invalid parameter Or value.
; ERR_CT =     -8 mais le logiciel affichera 248    ///< CT error.
; ERR_TRANS = -10 mais le logiciel affichera 246    ///< Non-eliminable transmission error.
; ERR_MEMORY= -11 mais le logiciel affichera 245    ///< Memory assignment error IN HTSI.
; ERR_HOST = -127 mais le logiciel affichera 127    ///< Abort of function by host/OS.
; ERR_HTSI = -128 mais le logiciel affichera 126    ///< HTSI error.

;exemple trouvé dans le chm
;#include <stdio.h>
IncludeFile "ct_api.pbi" ; #include <ct_api.h>

;INT main(INT argc, char *argv[])
;  {
RET.a ;char RET;
ct.u  ;unsigned short ctn;
pn.u  ;unsigned short pn;
sad.u ;unsigned short sad;
dad.u ;unsigned short dad;

;// REQUEST ICC
*command=AllocateMemory(5);unsigned char command[] = { 0x20, 0x12, 0x01, 0x00, 0x00 };
PokeA(*command,$20)
PokeA(*command+1,$12)
PokeA(*command+2,$01)
PokeA(*command+3,$00)
PokeA(*command+4,$00)

lenc.u=MemorySize(*command);unsigned short lenc = SizeOf(command);

*reponse=AllocateMemory(300);unsigned char response[300];
lenr.u=MemorySize(*reponse) ;unsigned short lenr = SizeOf(response);

ctn = 1;
pn = 1 ;

;// Initialize card terminal
RET = CT_init(ctn, pn);
If RET <> OK          ;If (RET != OK)
                      ;{
  Debug "Error: CT_init failed with error " + Str(RET);printf("Error: CT_init failed With error %d\n", RET);
                                                      ;Retour=1;Return 1;
EndIf                                                 ;}

sad = 2; // Source = Host
dad = 1; // Destination = Card Terminal

;// Send command;ProtoCT_data(ctn.u, *dad, *sad, lenc.u, *command, *lenr, *response)
RET = CT_data(ctn, @dad, @sad, lenc, *command, @lenr, *reponse);RET = CT_data(ctn, &dad, &sad, lenc, command, &lenr, response);
If RET <> OK                                                  ;If (RET != OK)
  Debug "Error: CT_data failed With error " +  Str(RET)       ;printf("Error: CT_data failed With error %d\n", RET);
Else
  ;{
  ;// Display response
  Debug "Response: ";printf("Response: ");
  For i = 0 To lenr -1; i++);For (i = 0; i < lenr; i++)
    Debug Hex(PeekA(*reponse+i),#PB_Ascii);printf("%02X ", response[i]);
                                           ;printf("\n");
  Next i
EndIf;}

;// Close card terminal
RET = CT_close(ctn);
If RET <> OK       ;If (RET != OK)
  Debug "Error: CT_close failed With error "  +  Str(RET);printf("Error: CT_close failed With error %d\n", RET);
EndIf
;Retour=0;Return 0;
;}

Peux-tu tester ce nouveau fichier nommé Test2.pb

Code : Tout sélectionner

;// Error codes
; Ici je préfère créer des variables globales plutôt que des constante
; OK=0;#define OK              0       ///< Function CALL was successful.
; ERR_INVALID =-1 mais le logiciel affichera 255    ///< Invalid parameter Or value.
; ERR_CT =     -8 mais le logiciel affichera 248    ///< CT error.
; ERR_TRANS = -10 mais le logiciel affichera 246    ///< Non-eliminable transmission error.
; ERR_MEMORY= -11 mais le logiciel affichera 245    ///< Memory assignment error IN HTSI.
; ERR_HOST = -127 mais le logiciel affichera 127    ///< Abort of function by host/OS.
; ERR_HTSI = -128 mais le logiciel affichera 126    ///< HTSI error.

;exemple trouvé dans le chm
;#include <stdio.h>

;// Error codes
; Ici je préfère créer des variables globales plutôt que des constante
Global OK=0;#define OK              0       ///< Function CALL was successful.
Global ERR_INVALID =-1;255    #define ERR_INVALID     -1      ///< Invalid parameter Or value.
Global ERR_CT =     -8;248    #define ERR_CT          -8      ///< CT error.
Global ERR_TRANS = -10;246    #define ERR_TRANS       -10     ///< Non-eliminable transmission error.
Global ERR_MEMORY= -11;245    #define ERR_MEMORY      -11     ///< Memory assignment error IN HTSI.
Global ERR_HOST = -127;127    #define ERR_HOST        -127    ///< Abort of function by host/OS.
Global ERR_HTSI = -128;126    #define ERR_HTSI        -128    ///< HTSI error.

ImportC "ctacs.lib"
  CT_close(ctn.u) As "CT_close"
  CT_data(ctn.u, *dad, *sad, lenc.u, *command, *lenr, *reponse) As "CT_data"
  CT_init(ctn.u, pn.u) As "CT_init"
EndImport
;INT main(INT argc, char *argv[])
;  {
RET.a ;char RET;
ct.u  ;unsigned short ctn;
pn.u  ;unsigned short pn;
sad.u ;unsigned short sad;
dad.u ;unsigned short dad;

;// REQUEST ICC
*command=AllocateMemory(5);unsigned char command[] = { 0x20, 0x12, 0x01, 0x00, 0x00 };
PokeA(*command,$20)
PokeA(*command+1,$12)
PokeA(*command+2,$01)
PokeA(*command+3,$00)
PokeA(*command+4,$00)

lenc.u=MemorySize(*command);unsigned short lenc = SizeOf(command);

*reponse=AllocateMemory(300);unsigned char response[300];
lenr.u=MemorySize(*reponse) ;unsigned short lenr = SizeOf(response);

ctn = 1;
pn = 1 ;

;// Initialize card terminal
RET = CT_init(ctn, pn);
If RET <> OK          ;If (RET != OK)
                      ;{
  Debug "Error: CT_init failed with error " + Str(RET);printf("Error: CT_init failed With error %d\n", RET);
                                                      ;Retour=1;Return 1;
EndIf                                                 ;}

sad = 2; // Source = Host
dad = 1; // Destination = Card Terminal

;// Send command;ProtoCT_data(ctn.u, *dad, *sad, lenc.u, *command, *lenr, *response)
RET = CT_data(ctn, @dad, @sad, lenc, *command, @lenr, *reponse);RET = CT_data(ctn, &dad, &sad, lenc, command, &lenr, response);
If RET <> OK                                                  ;If (RET != OK)
  Debug "Error: CT_data failed With error " +  Str(RET)       ;printf("Error: CT_data failed With error %d\n", RET);
Else
  ;{
  ;// Display response
  Debug "Response: ";printf("Response: ");
  For i = 0 To lenr -1; i++);For (i = 0; i < lenr; i++)
    Debug Hex(PeekA(*reponse+i),#PB_Ascii);printf("%02X ", response[i]);
                                           ;printf("\n");
  Next i
EndIf;}

;// Close card terminal
RET = CT_close(ctn);
If RET <> OK       ;If (RET != OK)
  Debug "Error: CT_close failed With error "  +  Str(RET);printf("Error: CT_close failed With error %d\n", RET);
EndIf
;Retour=0;Return 0;
;}
Dans le dossier, on doit avoir ceci:
Image
M.
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Re: Communiquer avec module USB RFID ACR 122?

Message par totorcalais »

Le test2 me fait 3 erreur POLINK (unresolved external symbol pour chaque CT_xxx).

Le test 1 me donne
Error: CT_init failed with error 248
Error: CT_data failed With error 248
Remarque: je n'ai pas de ctas.pbi
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Communiquer avec module USB RFID ACR 122?

Message par Zorro »

totorcalais a écrit :Le test2 me fait 3 erreur POLINK (unresolved external symbol pour chaque CT_xxx).
la plupart du temps (mais pas toujours )
une erreur de type "Polink" proviens du fait qu'on cherche a compiler
un prg qui se trouve encore en RAM (suite a plantage par exemple )

Alt+Ctrl+Del , et supprimer des taches toute traces de ton prg ....
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Communiquer avec module USB RFID ACR 122?

Message par Mesa »

Dans Test2, change ImportC par Import.
Ça donne quoi ?

De plus , il arrive que les antivirus bloque polink.exe ce qui donne cette erreur.

M.
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Re: Communiquer avec module USB RFID ACR 122?

Message par totorcalais »

Rien n'y fait.

J'ai désactivé mon eset nod 32 mais résultat identique.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Communiquer avec module USB RFID ACR 122?

Message par Mesa »

Toujours dans test2, remplace

Code : Tout sélectionner

ImportC "ctacs.lib"
  CT_close(ctn.u) As "CT_close"
  CT_data(ctn.u, *dad, *sad, lenc.u, *command, *lenr, *reponse) As "CT_data"
  CT_init(ctn.u, pn.u) As "CT_init"
EndImport
par

Code : Tout sélectionner

ImportC "ctacs.lib"
  CT_close(ctn.u)
  CT_data(ctn.u, *dad, *sad, lenc.u, *command, *lenr, *reponse)
  CT_init(ctn.u, pn.u) 
EndImport
M.
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Re: Communiquer avec module USB RFID ACR 122?

Message par totorcalais »

En mettant la modif, mêmes erreurs du polink.

J'ai enlevé le C de la commande IMPORT et ca passe. Toutefois le résultat reste identique aux codes erreurs du début avec comme valeur 248 pour chacune.
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Re: Communiquer avec module USB RFID ACR 122?

Message par totorcalais »

Salut à tous,

Quelques nouvelles :

Malgré l'aide importante de Mesa, nous n'arrivons pas à faire fonctionner l'API préconisée sur le site du fabricant.

En parallèle, compte tenu des quelques avancées de la version avec le wrapper, j'ai pas mal progressé dans mes bidouilles que j'ai complété par la lecture des docs liées à lalecture des carte sans contact de type mifare (j'ai des 1K).

J'ai enfin réussi à lire la clé d'identification de la carte sur le block 0.

Je vais donc continuer à approfondir le programme, le rendre plus convivial pour lire une carte (j'espère réussir à écrire dedans et pouvoir me lancer dans le programme de gestion que je désirais à la base)

Je posterai l'avancée de mes prochaines pérégrinations sur ce fil en espérant que cela intéresse quelqu'un (que ce soit aujourd'hui ou demain). Bien évidemment, toutes les remarques constructives seront les bienvenues (car je ne suis pas un expert de l'optimisation).
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Re: Communiquer avec module USB RFID ACR 122?

Message par totorcalais »

Re,

Juste ce petit message posté pour relater mes avancées. J'ai modifié le code pour avoir une multitude d'infos (plus ou moins pertinentes mais qui m'ont permis de mieux comprendre ce qui entrait et sortait vers ma carte ACR122U).

J'ai également découvert que cela ne fonctionnait que lorsque j'activais l'outil fourni par le constructeur. Avec celui-ci, j'obtenais les bonnes valeurs (id, type de carte, etc. et j'arrivais à écrire sur les block 1 et 2.

Sauf que quand je le fermais, je n'avais plus rien avec le programme sous purebasic. Il m'a fallu un peu de temps (et de la lecture de doc diverses) pour m'apercevoir que lire les block impliquait d'être authentifié.

De fait, j'arrive désormais à lire ma carte après transmission d'une commande ADPU d'authentification.

Je me suis "amusé" à tester les différents protocoles comme vous pouvez le voir avec des résultats parfois très différents (mais peut être est ce du à une chaine ADPU non complète ou incorrecte (le retour laisse toutefois entendre que non car c'est différent du code 6300 (erreur)).


Voici le résultat de tout ça (à comparer avec le debug du début): la lecture est réalisée sur le block 2 avec un message essaieessaie que j'ai écrit avec l'outil constructeur.

Ma prochaine étape est de remplacer ce message par un autre et vérifier que l'outil constructeur le découvre tel quel ;)

PS: vous remarquerez la différence entre les deux ordres ADPU du protocole T1 : le second est différent du premier, je ne sais toujours pas pourquoi cela fait ça.

dll ok
Scard : : 0 hCTX: FFFFFFFFCD010000
hCTX: FFFFFFFFCD010000 - Reader : 0 buffer: - L : 2B
Connect : valeur A : 0 : hcard : FFFFFFFFEA010000 : valeur AP : 2
Status : valeur A : 0 : valeur S : - L : E6 : valeur AP : 2 : valeur ATRL : 14 : valeur ATR : 0
Transmit pour authentification T0 : valeur A : 16 : valeur rgscard t0pci: 1648441784 : valeur IN: 105000086FF : valeur OUTPCI: 437D8C : valeur OUT : 0 : valeur OUT,Outl convertie en ASCII : : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
Transmit pour authentification T1 : valeur A : 0 : valeur rgscard t0pci: 1648441792 : valeur IN: 105000086FF : valeur OUTPCI: 437F94 : valeur OUT : 90 : valeur OUT,Outl convertie en ASCII :  : valeur OUT,Outl : 9000 : valeur Outl : 2
Transmit pour athentification RAW : valeur A : 16 : valeur rgscard RAWpci: 1648441800 : valeur IN: 105000086FF : valeur OUTPCI: 4381B4 : valeur OUT : 90 : valeur OUT,Outl convertie en ASCII :  : valeur OUT,Outl : 9000 : valeur Outl : 2
Disconnect : valeur A : 0
protocole T0-------------------------------------------------------------------------------------------------------------------------------------------------
Connect : valeur A : FFFFFFFF8010000F
Status : valeur A : 6 buffer: - L : E : valeur S : 6 : valeur AP : 2 : valeur ATRL : 14 : valeur ATR : 0 : valeur ATR suite : 0
Transmit : valeur A : 6 : valeur rgscard t0pci: 1648441784 : valeur IN: 1100200B0FF : valeur OUTPCI: 437D8C : valeur OUT : 90 : valeur OUT,Outl convertie en ASCII :  : valeur OUT,Outl : 90000000000000000000 : valeur Outl : A
Transmit : valeur A : 6 : valeur rgscard t0pci: 1648441784 : valeur IN: 1100200B0FF : valeur OUTPCI: 437D8C : valeur OUT : 90 : valeur OUT,Outl convertie en ASCII :  : valeur OUT,Outl : 90000000000000000000 : valeur Outl : A
protocole T1-------------------------------------------------------------------------------------------------------------------------------------------------
Connect : valeur A : 0
Status : valeur A : 0 buffer: - L : E : valeur S : 6 : valeur AP : 2 : valeur ATRL : 14 : valeur ATR : A00C4F8001808F3B : valeur ATR suite : 6030000A00C4F80
Transmit : valeur A : FFFFFFFF80100008 : valeur rgscard t1pci: 1648441792 : valeur IN: 1100200B0FF : valeur OUTPCI: 437D8C : valeur OUT : 90 : valeur OUT,Outl convertie en ASCII :  : valeur OUT,Outl : 900000000000000000000000000000000000 : valeur Outl : 12
Transmit : valeur A : 0 : valeur rgscard t1pci: 1648441792 : valeur IN: 1100200B0FF : valeur OUTPCI: 437D8C : valeur OUT : 7373656961737365 : valeur OUT,Outl convertie en ASCII : essaiessaiessaie : valeur OUT,Outl : 657373616965737361696573736169659000 : valeur Outl : 12
protocole RAW-------------------------------------------------------------------------------------------------------------------------------------------------
Connect : valeur A : FFFFFFFF8010000F
Status : valeur A : 6 buffer: - L : E : valeur S : 6 : valeur AP : 2 : valeur ATRL : 14 : valeur ATR : A00C4F8001808F3B : valeur ATR suite : 6030000A00C4F80
Transmit : valeur A : 6 : valeur rgscard RAWpci: 1648441800 : valeur IN: 1100200B0FF : valeur OUTPCI: 4381B4 : valeur OUT : 7373656961737365 : valeur OUT,Outl convertie en ASCII : essaiessaiessaie : valeur OUT,Outl : 65737361696573736169 : valeur Outl : A
Transmit : valeur A : 6 : valeur rgscard RAWpci: 1648441800 : valeur IN: 1100200B0FF : valeur OUTPCI: 4381B4 : valeur OUT : 7373656961737365 : valeur OUT,Outl convertie en ASCII : essaiessaiessaie : valeur OUT,Outl : 65737361696573736169 : valeur Outl : A
totorcalais
Messages : 67
Inscription : mer. 27/sept./2006 12:45

Re: Communiquer avec module USB RFID ACR 122?

Message par totorcalais »

Voici un bout de code concocté à partir du wrapper de Leo Mijnders basé sur la winscard.dll

Avec ce petit programme, je peux lire une carte, trouver son code fabricant (je prévois prochainement d'utiliser un tableau récapitulatif pour identifier le type de carte et ses spécificités) et je peux lire les 4 premiers blocs de données (bloc0 et bloc3 étant utilisés, seules les 1 et 2 peuvent être écrits).

Ce sera l'objet de ma prochaine étape avant d'associer tout cela à un programme exploitant une base de données gérant les accès, autorisations etc... que je compte tester (avec l'aide d'interfaces pour actionner tout ça).


Je ne suis pas un puriste du code et il peut paraître fouillis pour beaucoup (voire même de piquer les yeux).
Il s'agit d'un laboratoire et non d'un code optimisé. En perpétuel devenir.

Si certains veulent apporter un avis sur une optimisation , je suis preneur et avide d'apprendre de nouvelles choses.


EDIT : mise à jour du 1/11/2016 14h25 :
- ajout d'une recherche du type de carte avec fichier de base des SmartCards de Ludovic Rousseau (http://ludovicrousseau.blogspot.fr/2016 ... study.html) lien "list of ATR"
- ajout de test supplémentaires pour éviter les appuis intempestifs
- nettoyage des "outils" de débogages.


Code : Tout sélectionner

;*******************************************************
;  Utilisation Winscard.Dll pour lecteur de carte RFID
;  BD octobre 2016 rev : 1/11/2016
;  basé sur le code de : 
;  PureBasic : PCSC Wrapper
;  Author : Leo Mijnders
;  Date : 29 March 2004
;  Doc : http://msdn.microsoft.com/library/en-us/security/security/authentication_functions.asp?frame=true#smart_card_functions
;  avec utilisation du fichier de Ludovic Rousseau smartcard janvier 2016
;*******************************************************

#SCARD_SHARE_EXCLUSIVE = 1 ; This application is not willing To share this
                           ; // card with other applications.
#SCARD_SHARE_SHARED = 2    ; This application is willing To share this
                           ; // card with other applications.
#SCARD_SHARE_DIRECT = 3    ; // This application demands direct control of

#SCARD_PROTOCOL_T0               =$0001   ;/* T=0 active protocol. */
#SCARD_PROTOCOL_T1               =$0002   ;/* T=1 active protocol. */
#SCARD_PROTOCOL_RAW              =$0004   ;/* Raw active protocol. */


#SCARD_UNKNOWN                   =$0001   ;/* Unknown state */
#SCARD_ABSENT                    =$0002   ;/* Card is absent */
#SCARD_PRESENT                   =$0004   ;/* Card is present */
#SCARD_SWALLOWED                 =$0008   ;/* Card not powered */
#SCARD_POWERED                   =$0010   ;/* Card is powered */
#SCARD_NEGOTIABLE                =$0020   ;/* Ready For PTS */
#SCARD_SPECIFIC                  =$0040   ;/* PTS has been set */

#SCARD_LEAVE_CARD                =$0000   ;/* Do nothing on close */
#SCARD_RESET_CARD                =$0001   ;/* Reset on close */
#SCARD_UNPOWER_CARD              =$0002   ;/* Power down on close */
#SCARD_EJECT_CARD                =$0003   ;/* Eject on close */

#SCARD_S_SUCCESS                 =$00000000
#SCARD_E_CANCELLED               =$80100002
#SCARD_E_CANT_DISPOSE            =$8010000E
#SCARD_E_INSUFFICIENT_BUFFER     =$80100008
#SCARD_E_INVALID_ATR             =$80100015
#SCARD_E_INVALID_HANDLE          =$80100003
#SCARD_E_INVALID_PARAMETER       =$80100004
#SCARD_E_INVALID_TARGET          =$80100005
#SCARD_E_INVALID_VALUE           =$80100011
#SCARD_E_NO_MEMORY               =$80100006
#SCARD_F_COMM_ERROR              =$80100013
#SCARD_F_INTERNAL_ERROR          =$80100001
#SCARD_F_UNKNOWN_ERROR           =$80100014
#SCARD_F_WAITED_TOO_LONG         =$80100007
#SCARD_E_UNKNOWN_READER          =$80100009
#SCARD_E_TIMEOUT                 =$8010000A
#SCARD_E_SHARING_VIOLATION       =$8010000B
#SCARD_E_NO_SMARTCARD            =$8010000C
#SCARD_E_UNKNOWN_CARD            =$8010000D
#SCARD_E_PROTO_MISMATCH          =$8010000F
#SCARD_E_NOT_READY               =$80100010
#SCARD_E_SYSTEM_CANCELLED        =$80100012
#SCARD_E_NOT_TRANSACTED          =$80100016
#SCARD_E_READER_UNAVAILABLE      =$80100017


Enumeration
  #SCARD_SCOPE_USER            ;    0x0000/* Scope in user space */
  #SCARD_SCOPE_TERMINAL        ;    0x0001/* Scope in terminal */
  #SCARD_SCOPE_SYSTEM          ;    0x0002/* Scope in system */
EndEnumeration 


Global fSCardEstablishContext, fSCardConnect, fSCardStatus, fSCardDisconnect, fSCardTransmit
Global fSCardListReaders

Global g_rgSCardT0Pci, g_rgSCardT1Pci, g_rgSCardRawPci

Procedure.L InitPCSC(Lib.L)
  If OpenLibrary(Lib, "WinSCard.dll")
    Debug "dll ok"
    ; Pointers to SCARD_IO_REQUEST structures
    
    g_rgSCardT0Pci= GetFunction(Lib,"g_rgSCardT0Pci")
    g_rgSCardT1Pci= GetFunction(Lib,"g_rgSCardT1Pci")
    g_rgSCardRawPci= GetFunction(Lib,"g_rgSCardRawPci")
    
    ; Pointers to Basic PCSC Functions
    
    fSCardEstablishContext= GetFunction(Lib,"SCardEstablishContext")
    fSCardConnect= GetFunction(Lib,"SCardConnectA")
    fSCardStatus= GetFunction(Lib,"SCardStatusA")
    fSCardDisconnect= GetFunction(Lib,"SCardDisconnect")
    fSCardTransmit= GetFunction(Lib,"SCardTransmit")
    fSCardListReaders= GetFunction(Lib,"SCardListReadersA")
    
    ProcedureReturn 0
  EndIf
  ProcedureReturn -1
EndProcedure 

Procedure.L sSCardEstablishContext(self.L, a.L, b.L, c.L, d.L)
  ProcedureReturn CallFunctionFast(fSCardEstablishContext, a, b, c, d)
EndProcedure

Procedure.L sSCardConnect(self.L, a.L, b.L, c.L, d.L, e.L, f.L)
  ProcedureReturn CallFunctionFast(fSCardConnect, a, b, c, d, e, f)
EndProcedure

Procedure.L sSCardStatus(self.L, a.L, b.L, c.L, d.L, e.L, f.L, g.L)
  ProcedureReturn CallFunctionFast(fSCardStatus, a, b, c, d, e, f, g)
EndProcedure

Procedure.L sSCardDisconnect(self.L, a.L, b.L)
  ProcedureReturn CallFunctionFast(fSCardDisconnect, a, b)
EndProcedure

Procedure.L sSCardTransmit(self.L, a.L, b.L, c.L, d.L, e.L, f.L, g.L)
  ProcedureReturn CallFunctionFast(fSCardTransmit, a, b, c, d, e, f, g)
EndProcedure

Procedure.L sSCardListReaders(self.L, a.L, b.L, c.L, d.L)
  ProcedureReturn CallFunctionFast(fSCardListReaders, a, b, c, d)
EndProcedure

Interface IF_PCSC
  EstablishContext(a.L, b.L, c.L, d.L)
  Connect(a.L, b.L, c.L, d.L, e.L, f.L)
  Status(a.L, b.L, c.L, d.L, e.L, f.L, g.L)
  Disconnect(a.L, b.L)
  Transmit(a.L, b.L, c.L, d.L, e.L, f.L, g.L)
  ListReaders(a.L, b.L, c.L, d.L)
EndInterface

Structure strucInterface
  a.L
  b.L
  c.L
  d.L
  e.L
  f.L
EndStructure

SCard.IF_PCSC
Struc.strucInterface

Struc\a=@sSCardEstablishContext()
Struc\b=@sSCardConnect()
Struc\c=@sSCardStatus()
Struc\d=@sSCardDisconnect()
Struc\e=@sSCardTransmit()
Struc\f=@sSCardListReaders()

AddStruc.L=@Struc
PokeL(@SCard,@AddStruc)

Structure IO_REQ
  P.L
  a.L
  b.b[512]
EndStructure

outPCI_T0.IO_REQ
outPCI_T1.IO_REQ
outPCI_RAW.IO_REQ

outPCI_T0\P=1
outPCI_T0\a=512
outPCI_T1\P=1
outPCI_T1\a=512
outPCI_RAW\P=1
outPCI_RAW\a=512

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Button_0
  #Button_1
  #String_2
  #Text_3
  #String_4
  #ComboBox_5
  #ComboBox_6
  #Text_7
  #Text_8
EndEnumeration

;}
Define.L Event, EventWindow, EventGadget, EventType, EventMenu
;}
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 582, 199, 415, 415, "Lecteur RFID BD 2016", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_MaximizeGadget)
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(#Button_0, 325, 20, 60, 40, "Lire")
      ButtonGadget(#Button_1, 325, 70, 60, 40, "Ecrire")
      EditorGadget(#String_2, 20, 50, 290, 35, #PB_Editor_ReadOnly|#WS_EX_STATICEDGE|#PB_Editor_WordWrap)
      TextGadget(#Text_3, 20, 15, 290, 25, "Action")
      EditorGadget(#String_4, 20, 95, 290, 115,  #PB_Editor_ReadOnly|#WS_EX_STATICEDGE|#PB_Editor_WordWrap)

      ComboBoxGadget(#ComboBox_5, 20, 240, 155, 20)
      ComboBoxGadget(#ComboBox_6, 275, 250, 75, 20)
      TextGadget(#Text_7, 20, 215, 150, 20, "Choix du lecteur")
      TextGadget(#Text_8, 275, 220, 100, 30, "Choix de la zone mémoire")
    EndIf
  EndIf
EndProcedure

Procedure.S StringConvert(stext.S, format.L = #PB_Unicode)
;
  Define *mem
  Define result.S

  *mem = AllocateMemory(StringByteLength(stext, format)+2)
  PokeS(*mem, stext, format)
  result = PeekS(*mem, StringByteLength(stext, format)+2, format)
  ;FreeMemory(*mem)
  ProcedureReturn result
  
EndProcedure
Procedure.S HexString(Source.L, L.L) 
  result.S = ""
  For i = 0 To L-1
    result = result + Right("00" + Hex(PeekB(Source+i)), 2) 
  Next i
  ProcedureReturn result
EndProcedure
; initialisation des variables et pointeurs
hCTX.L
Buf.S=Space(10000)
ATRL.L
*ATR=AllocateMemory(1000)
hCARD.L
AP.L
L.L
S.L
*IN=AllocateMemory(1000)
*OUT=AllocateMemory(1000)
OutL.L
authentificat=0
;-LANCEMENT DU PROGRAMME
OpenWindow_Window_0()
;- on remplit les gadgets
; séance
AddGadgetItem(#ComboBox_6, 0, "Block0")
AddGadgetItem(#ComboBox_6, 1, "Block1")
AddGadgetItem(#ComboBox_6, 2, "Block2")
AddGadgetItem(#ComboBox_6, 3, "Block3")
ComboBox_5 = GetGadgetState(#ComboBox_5)



;- lancement et recherche de périphériques
If InitPCSC(10)=0
  a=SCard\EstablishContext(0,0,0,@hCTX)
  L.L=10000
  a=SCard\ListReaders(0,0,@Buf,@L)
  buf$=StringConvert(Buf, #PB_Ascii)
    ; on remplit le combobox
  reinit$="reinitialiser"
  AddGadgetItem(#ComboBox_5, 0, buf$)
  AddGadgetItem(#ComboBox_5, 1, reinit$)
;- listage dans le combobox
;- authentification (utilisation du combobox)
;- selon les choix, lecture des blocks
;- ou écriture
;- reset de la carte à la fermeture

;{- Boucle d'évènements
  debut:
  block$=""
Repeat
  Event = WaitWindowEvent()
  Select Event
      ; ///////////////////
      
    Case #PB_Event_Gadget

      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Button_0 And authentificat=1 ;- on appuie sur le bouton lire
        a$=StringField(GetGadgetText(#ComboBox_6), 2, "Block")
        a=Val(a$)
        If a<10
          a$=RSet(Str(a), 1,"0")
          Byte.b=Val(a$) 
        EndIf
        
        ; on place la commande ADPU de lecture du block
        PokeB(*IN,$FF)
        PokeB(*IN+1,$B0)
        PokeB(*IN+2,$00)
        PokeB(*IN+3,Byte)
        PokeB(*IN+4,$10)  
;       
         ;- protocole T1 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
          Debug "protocole T1-------------------------------------------------------------------------------------------------------------------------------------------------"
          a=SCard\Connect(hCTX,@Buf,#SCARD_SHARE_SHARED, #SCARD_PROTOCOL_T1 ,@hCARD,@AP) ;#SCARD_PROTOCOL_T0| #SCARD_PROTOCOL_RAW
          a=SCard\Status(hCARD,@Buf,@L,@S,@AP,*ATR,@ATRL)
          a=SCard\Transmit(hCARD, g_rgSCardT1Pci, *IN, 5, @outPCI_T1, *OUT, @OutL)
          a=SCard\Transmit(hCARD, g_rgSCardT1Pci, *IN, 5, @outPCI_T1, *OUT, @OutL)
          
        AddGadgetItem(#String_4, -1, "Lecture bloc "+a$ )
        ID$= Left (HexString(*OUT,OutL),32)
        AddGadgetItem(#String_4, -1, ID$ )
        AddGadgetItem(#String_4, -1, "Lecture Bloc "+a$+" carte -> ADPU: FF B0 00 "+a$+" 00")
        block$= Left (PeekS(*OUT,-1,#PB_Ascii),32)
        AddGadgetItem(#String_4, -1, "ASCII->"+block$ )
        AddGadgetItem(#String_4, -1, "HEXA->"+ID$ )
        AddGadgetItem(#String_4,-1, "Attente de vos instructions...")
        SendMessage_(GadgetID(#String_4), #EM_SETSEL, -1, -1); on fait descendre le curseur
      
        a=SCard\DisConnect(hCARD,#SCARD_RESET_CARD)
            
      Goto debut
         
      ElseIf EventGadget = #Button_1
        ; on clique sur le bouton lire
        
      ElseIf EventGadget = #String_2
      ElseIf EventGadget = #Text_3
      ElseIf EventGadget = #String_4
      ElseIf EventGadget = #ComboBox_5 ;- on sélectionne le lecteur dans la liste des lecteurs trouvés
        ; on choisit le type de lecteur et on le teste
        Debug EventType
            If ComboBox_5<>GetGadgetState(#ComboBox_5)
              ComboBox_5 = GetGadgetState(#ComboBox_5)
              ;               MessageRequester("Alerte !","Modifcation  Combo_0 !")
              ligne$=GetGadgetText(#ComboBox_5)
              If ligne$=reinit$
                ; réinitialisation du lecteur (et dela carte)
                ClearGadgetItems(#String_4)
                ClearGadgetItems(#String_2)
                AddGadgetItem(#String_4,-1, "Réinitialisation, choisissez votre lecteur...")
              Else
                ;- AUTHENTIFICATION
              authentification:
              Debug "routine d'authentification"
              
              a=SCard\Connect(hCTX,@Buf,#SCARD_SHARE_SHARED, #SCARD_PROTOCOL_T1 |#SCARD_PROTOCOL_T0| #SCARD_PROTOCOL_RAW,@hCARD,@AP)
          If hCARD=0
             ClearGadgetItems(#String_4)
             AddGadgetItem(#String_4,-1, "Pas de carte dans le lecteur...")
             a=SCard\DisConnect(hCARD,#SCARD_RESET_CARD)
           Goto debut
          EndIf 

          ; on prépare la commande ADPU
          PokeB(*IN,$FF)
          PokeB(*IN+1,$86)
          PokeB(*IN+2,$00)
          PokeB(*IN+3,$00)
          PokeB(*IN+4,$05)
          PokeB(*IN+5,$01)
          PokeB(*IN+6,$00)
          PokeB(*IN+7,$00)
          PokeB(*IN+8,$60)
          PokeB(*IN+9,$00)
          a=SCard\Status(hCARD,@Buf,@L,@S,@AP,*ATR,@ATRL)
          ; on reproduit une seconde fois car cela ne marche pas toujours du premier coup et certaines données manquent à l'appel (Un mystere ou une particularité à saisir...
          a=SCard\Status(hCARD,@Buf,@L,@S,@AP,*ATR,@ATRL)
          SetGadgetText(#String_2, "ATR->"+HexString(*ATR,20))
          atr$=HexString(*ATR,20)
          ClearGadgetItems(#String_4)
 
              ;- on traite la nature de la carte (fichier de Ludovic Rousseau)
    ; on ouvre le fichier contenu dans la racine 
    If ReadFile(1,"smartcard.txt")
      format = ReadStringFormat(1)
      
      line.S = ReadString(1,format)
      While line <> "# do not delete"
 
        If Left(line,2)=Left(atr$,2)
          line$=RemoveString(line, " " )
          Longueur=Len(atr$)
          line$=Left(line$,Longueur)
          If line$=atr$ ; on teste toutes les occurences du fichier de Smartcard jusqu'à une correspondance
            line = ReadString(1,format)
            Longueur=Len(line)
            line2$=Right(line, Longueur-1); on retire la tabulation du fichier
            AddGadgetItem(#String_4,-1, line2$)
            While line <> ""
              line = ReadString(1,format)
              ; affichage et sortie
              Longueur=Len(line)
              line2$=Right(line, Longueur-1) ; on retire la tabulation du fichier
              AddGadgetItem(#String_4,-1, line2$)
            Wend
            
          Goto suite
          EndIf
        EndIf
        line = ReadString(1,format)
      Wend 
      suite:
      CloseFile(1)
      
    EndIf
            
    
    ; On authentifie la carte (préalable pour toute manipulation par la suite)
     OutL=10
     a=SCard\Transmit(hCARD, g_rgSCardT1Pci, *IN, 10, @outPCI_T1, *OUT, @OutL)
     AddGadgetItem(#String_4,-1, "Authentification -> ADPU: FF 86 00 00 05 01 00 00 60 00")
    SendMessage_(GadgetID(#String_4), #EM_SETSEL, -1, -1); on fait descendre le curseur
     
   If HexString(*OUT,OutL)="9000"
     AddGadgetItem(#String_2,-1, "Carte Authentifiée!")
     AddGadgetItem(#String_4, -1, "Authentification réussie")
    SendMessage_(GadgetID(#String_4), #EM_SETSEL, -1, -1); on fait descendre le curseur
     authentificat=1
   EndIf

  ; on cherche le numéro d'identification propre à la carte
   ; lecture du block 0
   ; on place la commande ADPU de lecture de l'ID
      PokeB(*IN,$FF)
      PokeB(*IN+1,$B0)
      PokeB(*IN+2,$00)
      PokeB(*IN+3,$00)
      PokeB(*IN+4,$10)
          a=SCard\Transmit(hCARD, g_rgSCardT1Pci, *IN, 5, @outPCI_T1, *OUT, @OutL)
          a=SCard\Transmit(hCARD, g_rgSCardT1Pci, *IN, 5, @outPCI_T1, *OUT, @OutL)
          AddGadgetItem(#String_4, -1, "Lecture ID carte -> ADPU: FF CA 00 00 00")
          ID$= Left (HexString(*OUT,OutL),32)
          AddGadgetItem(#String_4, -1, "N° ID Carte->"+ ID$ ) 
          AddGadgetItem(#String_4,-1, "Attente de vos instructions...")
          SendMessage_(GadgetID(#String_4), #EM_SETSEL, -1, -1); on fait descendre le curseur
          a=SCard\DisConnect(hCARD,#SCARD_RESET_CARD)
  
   Goto debut
  EndIf
  EndIf
EndIf
         
    ; ////////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf 
  EndSelect
ForEver


;
;}
Else
  MessageRequester("Error", "Lib not loaded",0)
EndIf  
    
; IDE Options = PureBasic 5.50 (Windows - x86)
; CursorPosition = 219
; Folding = ---
; EnableXP
; Executable = RFID BD V0.3.exe
Répondre