Skip to content

Commit 46a37e8

Browse files
committed
Analyse ATR
1 parent f91ff7c commit 46a37e8

File tree

1 file changed

+164
-52
lines changed

1 file changed

+164
-52
lines changed

essai_1/essai_1.ino

Lines changed: 164 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
#include <SoftwareSerial_hm.h>
2+
13
#include <Arduino.h>
2-
#include <SoftwareSerial.h>
4+
35

46

57
#define VCC 13
@@ -9,28 +11,133 @@
911
#define TX 3
1012
#define PRES 5
1113

14+
//Variables
15+
byte TS, T0, TA1, TB1, TC1, TD1, K;
16+
byte TA2, TB2, TC2, TD2;
17+
byte TA3, TB3, TC3, TD3 ;
18+
byte TCK, T ;
19+
String historicals_caracters;
20+
21+
bool isntCardPresente = digitalRead(PRES); //Variable de détection de la présence de la carte : carte présente = 0 & carte absente = 1
22+
23+
24+
1225
// création d'un objet Software Serial
13-
SoftwareSerial serialCard (RX, TX, false);
26+
SoftwareSerial_hm serialCard (RX, TX, false);
1427

1528

16-
//Variable de détection de la présence de la carte
17-
bool isntCardPresente = digitalRead(PRES); // carte présente = 0 & carte absente = 1
29+
void analyse_atr(String ATR) {
30+
String _atr = ATR;
31+
_atr.replace(" ","");
32+
Serial.println("_atr = " + _atr);
33+
TS = stringToByte(_atr.substring(0, 2)); // [0, 2[
34+
T0 = stringToByte(_atr.substring(2, 4)); // [2, 4[
35+
36+
//i représente la position des caractères dans l'ATR, commence à 4 juste après le caractère T0, chaque caractère est sur 2i soit 8bits
37+
// il servira à déterminer la position des caractères facultatif de l'ATR
38+
int i = 4 ;
39+
40+
//Analyse T0
41+
//détermination de K, nb de caratères d'historique de l'ATR
42+
K = T0 & 0x0F ;
43+
44+
// Présence de TA1 : sur le bit 4
45+
if((T0 & 0x10)) {
46+
TA1 = stringToByte(_atr.substring(i, i+2));
47+
i += 2; }
48+
// Peésence de TB1 sur le bit 5
49+
if((T0 & 0x20)) {
50+
TB1 = stringToByte(_atr.substring(i, i+2));
51+
i += 2; }
52+
// Peésence de TC1 sur le bit 6
53+
if((T0 & 0x40)) {
54+
TC1 = stringToByte(_atr.substring(i, i+2));
55+
i += 2; }
56+
// Peésence de TD1 sur le bit 7
57+
if((T0 & 0x80)) {
58+
TD1 = stringToByte(_atr.substring(i, i+2));
59+
i += 2; }
60+
61+
//Caractères Tx2
62+
if ((TD1 & 0xF0)) { //présence d'un bit 1 sur l'un des bits 4 à 7 alors présence de caractère Tx2
63+
// Présence de TA1 : sur le bit 4
64+
if((TD1 & 0x10)) {
65+
TA2 = stringToByte(_atr.substring(i, i+2));
66+
i += 2; }
67+
// Peésence de TB1 sur le bit 5
68+
if((TD1 & 0x20)) {
69+
TB2 = stringToByte(_atr.substring(i, i+2));
70+
i += 2; }
71+
// Peésence de TC1 sur le bit 6
72+
if((TD1 & 0x40)) {
73+
TC2 = stringToByte(_atr.substring(i, i+2));
74+
i += 2; }
75+
// Peésence de TD1 sur le bit 7
76+
if((TD1 & 0x80)) {
77+
TD2 = stringToByte(_atr.substring(i, i+2));
78+
i += 2;}
79+
}
1880

81+
//Caractères Tx3
82+
if ((TD2 & 0xF0)) { //présence d'un bit 1 sur l'un des bits 4 à 7 alors présence de caractère Tx2
83+
// Présence de TA1 : sur le bit 4
84+
if((TD2 & 0x10)) {
85+
TA3 = stringToByte(_atr.substring(i, i+2));
86+
i += 2; }
87+
// Peésence de TB1 sur le bit 5
88+
if((TD2 & 0x20)) {
89+
TB3 = stringToByte(_atr.substring(i, i+2));
90+
i += 2; }
91+
// Peésence de TC1 sur le bit 6
92+
if((TD2 & 0x40)) {
93+
TC3 = stringToByte(_atr.substring(i, i+2));
94+
i += 2; }
95+
// Peésence de TD1 sur le bit 7
96+
if((TD2 & 0x80)) {
97+
TD3 = stringToByte(_atr.substring(i, i+2));
98+
i += 2;}
99+
}
100+
101+
//Caractères historiques
102+
historicals_caracters = _atr.substring(i, i+(K*2));
103+
i = i+(K*2);
104+
105+
//Caractères TCK
106+
TCK = stringToByte(_atr.substring(i, i+2));
19107

20-
String transmitAPDU_T0(String apdu) {
108+
// Protocole T
109+
T = TD1 & 0x0F;
110+
111+
112+
113+
114+
115+
116+
}
21117

118+
byte stringToByte(String stb) {
22119
String sub;
23120
char buf[3];
121+
stb.toCharArray(buf, 3);
122+
byte b = (byte)strtol(buf,0,16);
123+
return b;
124+
}
24125

25-
serialCard.stopListening();
126+
String transmitAPDU_T0(String apdu) {
127+
128+
String sub;
129+
char buf[2];
26130

131+
pinMode(TX, OUTPUT);
132+
serialCard.stopListening();
27133
for(int i = 0; i < apdu.length()+1; i += 2){
28-
sub = apdu.substring(i, i+2);
29-
sub.toCharArray(buf, 3);
134+
sub = apdu.substring(i, i+1);
135+
sub.toCharArray(buf, 2);
30136
byte b = (byte)strtol(buf, 0, 16);
31-
serialCard.write(b);
137+
serialCard.write_8E2(b);
138+
32139
}
33-
serialCard.listen();
140+
//serialCard.listen();
34141
String response1 = read_response();
35142

36143
return response1;
@@ -45,6 +152,7 @@ String read_response() {
45152
String result = "";
46153

47154
pinMode(TX, INPUT_PULLUP); // Prevent signal collision.
155+
serialCard.listen();
48156
unsigned long first = millis();
49157
while(millis() - first < 100){ // If there's no incoming data for 100ms. Break.
50158
if(serialCard.available()){
@@ -55,7 +163,6 @@ String read_response() {
55163
}
56164
}
57165

58-
//pinMode(TX, OUTPUT);
59166
if(result.length() < 2) {
60167
Serial.println("No responses.");
61168
}
@@ -96,8 +203,6 @@ void card_desactivate() {
96203

97204
void setup() {
98205
// Clock 4MHz
99-
//pinMode(TX, OUTPUT);
100-
//pinMode(CLK, OUTPUT);
101206
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
102207
TCCR2B = _BV(WGM22) | _BV(CS20);
103208
OCR2A = 1;
@@ -131,51 +236,58 @@ void loop() {
131236

132237
};
133238

134-
// on sort de la boucle donc une carte est présente
135-
//Serial.println("Carte présente");
136-
//if (serialCard.overflow()) {
137-
// Serial.println("portOne overflow!");
138-
// }
139-
//delay(1000);
140-
//card_desactivate();
141-
//delay(1000);
142-
card_activate ();
143239

240+
card_activate ();
144241

242+
//récup de l'ATR
145243
String ATR = read_response();
146244
Serial.println("ATR = " + ATR);
147245

148-
String _atr = ATR;
149-
_atr.replace(" ","");
150-
Serial.println("_atr = " + _atr);
151-
String ts = _atr.substring(0, 2);
152-
String t0 = _atr.substring(2, 4);
153-
String ta1 = _atr.substring(4, 6);
154-
Serial.println("ts = " + ts);
155-
Serial.println("t0 = " + t0);
156-
Serial.println("ta1 = " + ta1);
157-
158-
// convertion en binaire
159-
byte buffer[t0.length()+1];
160-
t0.toCharArray(buffer, t0.length()+1);
161-
byte _t0 = (byte)strtol(buffer, 0, 16);
162-
Serial.println(_t0, BIN);
163-
164-
//TA1 exist ?
165-
if((_t0 & 0x80)) {
166-
Serial.println("Présence de TA1");
167-
}
246+
//Analyse de l'ATR
247+
analyse_atr(ATR);
248+
Serial.print("TS = ");
249+
Serial.println(TS, HEX);
250+
Serial.print("T0 = ");
251+
Serial.println(T0, HEX);
252+
Serial.print("Nb de caractères d'historique K : ");
253+
Serial.println(K, DEC);
254+
Serial.println(K);
255+
Serial.print("TA1 = ");
256+
Serial.println(TA1, HEX);
257+
Serial.println(TA1, BIN);
258+
Serial.print("TB1 = ");
259+
Serial.println(TB1, HEX);
260+
Serial.print("TC1 = ");
261+
Serial.println(TC1, HEX);
262+
Serial.print("TD1 = ");
263+
Serial.println(TD1, HEX);
264+
if ((TA2 & 0xFF)) {Serial.print("TA2 = ");Serial.println(TA2, HEX);};
265+
if ((TB2 & 0xFF)) {Serial.print("TB2 = ");Serial.println(TB2, HEX);};
266+
if ((TC2 & 0xFF)) {Serial.print("TC2 = ");Serial.println(TC2, HEX);};
267+
if ((TD2 & 0xFF)) {Serial.print("TD2 = ");Serial.println(TD2, HEX);};
268+
if ((TA3 & 0xFF)) {Serial.print("TA3 = ");Serial.println(TA3, HEX);};
269+
if ((TB3 & 0xFF)) {Serial.print("TB3 = ");Serial.println(TB3, HEX);};
270+
if ((TC3 & 0xFF)) {Serial.print("TC3 = ");Serial.println(TC3, HEX);};
271+
if ((TD3 & 0xFF)) {Serial.print("TD3 = ");Serial.println(TD3, HEX);};
272+
Serial.print("Caractères historiques = ");
273+
Serial.println(historicals_caracters);
274+
Serial.print("TCK = ");
275+
Serial.println(TCK, HEX);
276+
Serial.print("Protocole T = ");
277+
Serial.println(T, DEC);
278+
279+
//Envoi première commande
280+
//String First_Com = "00A4040C020520";
281+
String First_Com = "00A40000023F00";
282+
String First_response = transmitAPDU_T0(First_Com);
283+
Serial.println(First_response);
284+
285+
Serial.println(F_CPU);
286+
uint16_t bit_delay = (F_CPU / 10753) / 4;
287+
Serial.println(bit_delay);
288+
uint16_t _tx_delay = bit_delay - 15/4 ;
289+
Serial.println(_tx_delay);
168290

169-
/*
170-
serialCard.begin(125000);
171-
String GO_TO_DF = "00 A4 04 0C 06 FF 54 41 43";
172-
String EF_ICC = "00 02";
173-
String mess_apdu = GO_TO_DF + " " + EF_ICC ;
174-
//mess_apdu = mess_apdu.replace(" ","");
175-
Serial.println(mess_apdu);
176-
String result = "";
177-
result = transmitAPDU_T0(mess_apdu);
178-
*/
179291

180292
while (!isntCardPresente) {
181293
isntCardPresente = digitalRead(PRES);

0 commit comments

Comments
 (0)