1 //-----------------------------------------------------------------------------
3 // Many authors, whom made it possible
5 // This code is licensed to you under the terms of the GNU GPL, version 2 or,
6 // at your option, any later version. See the LICENSE.txt file for the text of
8 //-----------------------------------------------------------------------------
9 // various EMV related functions.
10 //-----------------------------------------------------------------------------
13 #define DUMP(varname) Dbprintf("%s=", #varname);
15 int EMV_DBGLEVEL
= EMV_DBG_ALL
;
16 //uint8_t PCB = 0x00; //track Protocol Control Byte externally
19 //print detected tag name over the serial link
20 int emv_printtag(uint8_t* selected_tag
, emvtags
* inputcard
, uint8_t* outputstring
, uint8_t* outputlen
)
22 //search tag list and print the match
23 //get the value of the tag
24 uint8_t tagvalue
[255];
26 emv_lookuptag(selected_tag
, inputcard
, tagvalue
, &tagvaluelen
);
27 //loop through selected tag, print the value found
28 for(int i
=0; i
<(sizeof(EMV_TAG_LIST
)/sizeof(EMV_TAG_LIST
[0])); i
++){
29 if(!memcmp(selected_tag
, EMV_TAG_LIST
[i
].tag
, 2)){
30 memcpy(outputstring
, EMV_TAG_LIST
[i
].description
, strlen(EMV_TAG_LIST
[i
].description
));
31 memcpy(outputstring
+(strlen(EMV_TAG_LIST
[i
].description
)), "=", 1);
32 memcpy(outputstring
+(strlen(EMV_TAG_LIST
[i
].description
))+1, tagvalue
, tagvaluelen
);
33 *outputlen
= strlen(EMV_TAG_LIST
[i
].description
) + 1 + tagvaluelen
;
40 //returns the value of the emv tag in the supplied emvtags structure
41 int emv_lookuptag(uint8_t* tag
, emvtags
*currentcard
, uint8_t* outputval
, uint8_t* outputvallen
)
43 //loop through tag and return the appropriate value
44 uint8_t returnedtag
[255];
45 uint8_t returnedlength
= 0;
46 memset(returnedtag
, 0x00, sizeof(returnedtag
));
47 if(!memcmp(tag
, "\x4F\x00",2)){
48 memcpy(&returnedtag
, currentcard
->tag_4F
, currentcard
->tag_4F_len
);
49 returnedlength
= currentcard
->tag_4F_len
; goto exitfunction
;}
50 else if(!memcmp(tag
, "\x50\x00",2)){
51 memcpy(&returnedtag
, currentcard
->tag_50
, currentcard
->tag_50_len
);
52 returnedlength
= currentcard
->tag_50_len
; goto exitfunction
;}
53 else if(!memcmp(tag
, "\x56\x00",2)){
54 memcpy(&returnedtag
, currentcard
->tag_56
, currentcard
->tag_56_len
);
55 returnedlength
= currentcard
->tag_56_len
; goto exitfunction
;}
56 else if(!memcmp(tag
, "\x57\x00",2)){
57 memcpy(&returnedtag
, currentcard
->tag_57
, currentcard
->tag_57_len
);
58 returnedlength
= currentcard
->tag_57_len
; goto exitfunction
;}
59 else if(!memcmp(tag
, "\x5A\x00",2)){
60 memcpy(&returnedtag
, currentcard
->tag_5A
, currentcard
->tag_5A_len
);
61 returnedlength
= currentcard
->tag_5A_len
; goto exitfunction
;}
62 else if(!memcmp(tag
, "\x82\x00",2)){
63 memcpy(&returnedtag
, currentcard
->tag_82
, sizeof(currentcard
->tag_82
));
64 returnedlength
= sizeof(currentcard
->tag_82
);goto exitfunction
;}
65 else if(!memcmp(tag
, "\x84\x00",2)){
66 memcpy(&returnedtag
, currentcard
->tag_84
, currentcard
->tag_84_len
);
67 returnedlength
= currentcard
->tag_84_len
; goto exitfunction
;}
68 else if(!memcmp(tag
, "\x86\x00",2)){
69 memcpy(&returnedtag
, currentcard
->tag_86
, currentcard
->tag_86_len
);
70 returnedlength
= currentcard
->tag_86_len
; goto exitfunction
;}
71 else if(!memcmp(tag
, "\x87\x00",2)){
72 memcpy(&returnedtag
, currentcard
->tag_87
, sizeof(currentcard
->tag_87
));
73 returnedlength
= sizeof(currentcard
->tag_87
);goto exitfunction
;}
74 else if(!memcmp(tag
, "\x88\x00",2)){
75 memcpy(&returnedtag
, currentcard
->tag_88
, currentcard
->tag_50_len
);
76 returnedlength
= sizeof(currentcard
->tag_88
); goto exitfunction
;}
77 else if(!memcmp(tag
, "\x8A\x00",2)){
78 memcpy(&returnedtag
, currentcard
->tag_8A
, sizeof(currentcard
->tag_8A
));
79 returnedlength
= sizeof(currentcard
->tag_8A
);goto exitfunction
;}
80 else if(!memcmp(tag
, "\x8C\x00",2)){
81 memcpy(&returnedtag
, currentcard
->tag_8C
, currentcard
->tag_8C_len
);
82 returnedlength
= currentcard
->tag_8C_len
; goto exitfunction
;}
83 else if(!memcmp(tag
, "\x8D\x00",2)){
84 memcpy(&returnedtag
, currentcard
->tag_8D
, currentcard
->tag_8D_len
);
85 returnedlength
= currentcard
->tag_8D_len
; goto exitfunction
;}
86 else if(!memcmp(tag
, "\x8E\x00",2)){
87 memcpy(&returnedtag
, currentcard
->tag_8E
, currentcard
->tag_8E_len
);
88 returnedlength
= currentcard
->tag_8E_len
; goto exitfunction
;}
89 else if(!memcmp(tag
, "\x8F\x00",2)){
90 memcpy(&returnedtag
, currentcard
->tag_8F
, sizeof(currentcard
->tag_8F
));
91 returnedlength
= sizeof(currentcard
->tag_8F
);goto exitfunction
;}
92 else if(!memcmp(tag
, "\x90\x00",2)){
93 memcpy(&returnedtag
, currentcard
->tag_90
, currentcard
->tag_90_len
);
94 returnedlength
= currentcard
->tag_90_len
; goto exitfunction
;}
95 else if(!memcmp(tag
, "\x92\x00",2)){
96 memcpy(&returnedtag
, currentcard
->tag_92
, currentcard
->tag_92_len
);
97 returnedlength
= currentcard
->tag_92_len
; goto exitfunction
;}
98 else if(!memcmp(tag
, "\x93\x00",2)){
99 memcpy(&returnedtag
, currentcard
->tag_93
, currentcard
->tag_93_len
);
100 returnedlength
= currentcard
->tag_93_len
; goto exitfunction
;}
101 else if(!memcmp(tag
, "\x94\x00",2)){
102 memcpy(&returnedtag
, currentcard
->tag_94
, currentcard
->tag_94_len
);
103 returnedlength
= currentcard
->tag_94_len
; goto exitfunction
;}
104 else if(!memcmp(tag
, "\x95\x00",2)){
105 memcpy(&returnedtag
, currentcard
->tag_95
, sizeof(currentcard
->tag_95
));
106 returnedlength
= sizeof(currentcard
->tag_95
);goto exitfunction
;}
107 else if(!memcmp(tag
, "\x97\x00",2)){
108 memcpy(&returnedtag
, currentcard
->tag_97
, currentcard
->tag_97_len
);
109 returnedlength
= currentcard
->tag_97_len
; goto exitfunction
;}
110 else if(!memcmp(tag
, "\x98\x00",2)){
111 memcpy(&returnedtag
, currentcard
->tag_98
, sizeof(currentcard
->tag_98
));
112 returnedlength
= sizeof(currentcard
->tag_98
);goto exitfunction
;}
113 else if(!memcmp(tag
, "\x99\x00",2)){
114 memcpy(&returnedtag
, currentcard
->tag_99
, currentcard
->tag_99_len
);
115 returnedlength
= currentcard
->tag_99_len
; goto exitfunction
;}
116 else if(!memcmp(tag
, "\x9A\x00",2)){
117 memcpy(&returnedtag
, currentcard
->tag_9A
, sizeof(currentcard
->tag_9A
));
118 returnedlength
= sizeof(currentcard
->tag_9A
);goto exitfunction
;}
119 else if(!memcmp(tag
, "\x9B\x00",2)){
120 memcpy(&returnedtag
, currentcard
->tag_9B
, sizeof(currentcard
->tag_9B
));
121 returnedlength
= sizeof(currentcard
->tag_9B
);goto exitfunction
;}
122 else if(!memcmp(tag
, "\x9C\x00",2)){
123 memcpy(&returnedtag
, currentcard
->tag_9C
, sizeof(currentcard
->tag_9C
));
124 returnedlength
= sizeof(currentcard
->tag_9C
);goto exitfunction
;}
125 else if(!memcmp(tag
, "\x9D\x00",2)){
126 memcpy(&returnedtag
, currentcard
->tag_9D
, currentcard
->tag_9D_len
);
127 returnedlength
= currentcard
->tag_9D_len
; goto exitfunction
;}
128 else if(!memcmp(tag
, "\x9D\x00",2)){
129 memcpy(&returnedtag
, currentcard
->tag_9D
, currentcard
->tag_9D_len
);
130 returnedlength
= currentcard
->tag_9D_len
; goto exitfunction
;}
131 else if(!memcmp(tag
, "\xCD\x00",2)){
132 memcpy(&returnedtag
, currentcard
->tag_CD
, sizeof(currentcard
->tag_CD
));
133 returnedlength
= sizeof(currentcard
->tag_CD
);goto exitfunction
;}
134 else if(!memcmp(tag
, "\xCE\x00",2)){
135 memcpy(&returnedtag
, currentcard
->tag_CE
, sizeof(currentcard
->tag_CE
));
136 returnedlength
= sizeof(currentcard
->tag_CE
);goto exitfunction
;}
137 else if(!memcmp(tag
, "\xCF\x00",2)){
138 memcpy(&returnedtag
, currentcard
->tag_CF
, sizeof(currentcard
->tag_CF
));
139 returnedlength
= sizeof(currentcard
->tag_CF
);goto exitfunction
;}
140 else if(!memcmp(tag
, "\xD7\x00",2)){
141 memcpy(&returnedtag
, currentcard
->tag_D7
, sizeof(currentcard
->tag_D7
));
142 returnedlength
= sizeof(currentcard
->tag_D7
);goto exitfunction
;}
143 else if(!memcmp(tag
, "\xD8\x00",2)){
144 memcpy(&returnedtag
, currentcard
->tag_D8
, sizeof(currentcard
->tag_D8
));
145 returnedlength
= sizeof(currentcard
->tag_D8
);goto exitfunction
;}
146 else if(!memcmp(tag
, "\xD9\x00",2)){
147 memcpy(&returnedtag
, currentcard
->tag_D9
, currentcard
->tag_D9_len
);
148 returnedlength
= currentcard
->tag_D9_len
;goto exitfunction
;}
149 else if(!memcmp(tag
, "\xDA\x00",2)){
150 memcpy(&returnedtag
, currentcard
->tag_DA
, sizeof(currentcard
->tag_DA
));
151 returnedlength
= sizeof(currentcard
->tag_DA
);goto exitfunction
;}
152 else if(!memcmp(tag
, "\xDB\x00",2)){
153 memcpy(&returnedtag
, currentcard
->tag_DB
, sizeof(currentcard
->tag_DB
));
154 returnedlength
= sizeof(currentcard
->tag_DB
);goto exitfunction
;}
155 else if(!memcmp(tag
, "\xDC\x00",2)){
156 memcpy(&returnedtag
, currentcard
->tag_DC
, sizeof(currentcard
->tag_DC
));
157 returnedlength
= sizeof(currentcard
->tag_DC
);goto exitfunction
;}
158 else if(!memcmp(tag
, "\xDD\x00",2)){
159 memcpy(&returnedtag
, currentcard
->tag_DD
, sizeof(currentcard
->tag_DD
));
160 returnedlength
= sizeof(currentcard
->tag_DD
);goto exitfunction
;}
161 else if(!memcmp(tag
, "\xA5\x00",2)){
162 memcpy(&returnedtag
, currentcard
->tag_A5
, currentcard
->tag_A5_len
);
163 returnedlength
= currentcard
->tag_A5_len
; goto exitfunction
;}
164 else if(!memcmp(tag
, "\xAF\x00",2)){
165 memcpy(&returnedtag
, currentcard
->tag_AF
, currentcard
->tag_AF_len
);
166 returnedlength
= currentcard
->tag_AF_len
; goto exitfunction
;}
168 if(*(tag
+1) == 0x20){
169 memcpy(&returnedtag
, currentcard
->tag_5F20
, currentcard
->tag_5F20_len
);
170 returnedlength
= currentcard
->tag_5F20_len
; goto exitfunction
;}
171 else if(*(tag
+1) == 0x24){
172 memcpy(&returnedtag
, currentcard
->tag_5F24
, sizeof(currentcard
->tag_5F24
));
173 returnedlength
= sizeof(currentcard
->tag_5F24
);goto exitfunction
;}
174 else if(*(tag
+1) == 0x25){
175 memcpy(&returnedtag
, currentcard
->tag_5F25
, sizeof(currentcard
->tag_5F25
));
176 returnedlength
= sizeof(currentcard
->tag_5F25
);goto exitfunction
;}
177 else if(*(tag
+1) == 0x28){
178 memcpy(&returnedtag
, currentcard
->tag_5F28
, sizeof(currentcard
->tag_5F28
));
179 returnedlength
= sizeof(currentcard
->tag_5F28
);goto exitfunction
;}
180 else if(*(tag
+1) == 0x2A){
181 memcpy(&returnedtag
, currentcard
->tag_5F2A
, sizeof(currentcard
->tag_5F2A
));
182 returnedlength
= sizeof(currentcard
->tag_5F2A
);goto exitfunction
;}
183 else if(*(tag
+1) == 0x2D){
184 memcpy(&returnedtag
, currentcard
->tag_5F2D
, currentcard
->tag_5F2D_len
);
185 returnedlength
= currentcard
->tag_5F2D_len
; goto exitfunction
;}
186 else if(*(tag
+1) == 0x30){
187 memcpy(&returnedtag
, currentcard
->tag_5F30
, sizeof(currentcard
->tag_5F30
));
188 returnedlength
= sizeof(currentcard
->tag_5F30
);goto exitfunction
;}
189 else if(*(tag
+1) == 0x34){
190 memcpy(&returnedtag
, currentcard
->tag_5F34
, sizeof(currentcard
->tag_5F34
));
191 returnedlength
= sizeof(currentcard
->tag_5F34
);goto exitfunction
;}
192 else if(*(tag
+1) == 0x36){
193 memcpy(&returnedtag
, currentcard
->tag_5F36
, sizeof(currentcard
->tag_5F36
));
194 returnedlength
= sizeof(currentcard
->tag_5F36
);goto exitfunction
;}
195 else if(*(tag
+1) == 0x50){
196 memcpy(&returnedtag
, currentcard
->tag_5F50
, currentcard
->tag_5F50_len
);
197 returnedlength
= currentcard
->tag_5F50_len
; goto exitfunction
;}
198 else if(*(tag
+1) == 0x54){
199 memcpy(&returnedtag
, currentcard
->tag_5F54
, currentcard
->tag_5F54_len
);
200 returnedlength
= currentcard
->tag_5F54_len
; goto exitfunction
;}
203 if(*(tag
+1) == 0x01){
204 memcpy(&returnedtag
, currentcard
->tag_9F01
, sizeof(currentcard
->tag_9F01
));
205 returnedlength
= sizeof(currentcard
->tag_9F01
);goto exitfunction
;}
206 else if(*(tag
+1) == 0x02){
207 memcpy(&returnedtag
, currentcard
->tag_9F02
, sizeof(currentcard
->tag_9F02
));
208 returnedlength
= sizeof(currentcard
->tag_9F02
);goto exitfunction
;}
209 else if(*(tag
+1) == 0x03){
210 returnedlength
= sizeof(currentcard
->tag_9F03
);goto exitfunction
;}
211 else if(*(tag
+1) == 0x04){
212 memcpy(&returnedtag
, currentcard
->tag_9F04
, sizeof(currentcard
->tag_9F04
));
213 returnedlength
= sizeof(currentcard
->tag_9F04
);goto exitfunction
;}
214 else if(*(tag
+1) == 0x05){
215 memcpy(&returnedtag
, currentcard
->tag_9F05
, currentcard
->tag_9F05_len
);
216 returnedlength
= currentcard
->tag_9F05_len
; goto exitfunction
;}
217 else if(*(tag
+1) == 0x06){
218 memcpy(&returnedtag
, currentcard
->tag_9F06
, currentcard
->tag_9F06_len
);
219 returnedlength
= currentcard
->tag_9F06_len
; goto exitfunction
;}
220 else if(*(tag
+1) == 0x07){
221 memcpy(&returnedtag
, currentcard
->tag_9F07
, sizeof(currentcard
->tag_9F07
));
222 returnedlength
= sizeof(currentcard
->tag_9F07
);goto exitfunction
;}
223 else if(*(tag
+1) == 0x08){
224 memcpy(&returnedtag
, currentcard
->tag_9F08
, sizeof(currentcard
->tag_9F08
));
225 returnedlength
= sizeof(currentcard
->tag_9F08
);goto exitfunction
;}
226 else if(*(tag
+1) == 0x09){
227 memcpy(&returnedtag
, currentcard
->tag_9F09
, sizeof(currentcard
->tag_9F09
));
228 returnedlength
= sizeof(currentcard
->tag_9F09
);goto exitfunction
;}
229 else if(*(tag
+1) == 0x0B){
230 memcpy(&returnedtag
, currentcard
->tag_9F0B
, currentcard
->tag_9F0B_len
);
231 returnedlength
= currentcard
->tag_9F0B_len
; goto exitfunction
;}
232 else if(*(tag
+1) == 0x0D){
233 memcpy(&returnedtag
, currentcard
->tag_9F0D
, sizeof(currentcard
->tag_9F0D
));
234 returnedlength
= sizeof(currentcard
->tag_9F0D
); goto exitfunction
;}
235 else if(*(tag
+1) == 0x0E){
236 memcpy(&returnedtag
, currentcard
->tag_9F0E
, sizeof(currentcard
->tag_9F0E
));
237 returnedlength
= sizeof(currentcard
->tag_9F0E
); goto exitfunction
;}
238 else if(*(tag
+1) == 0x0F){
239 memcpy(&returnedtag
, currentcard
->tag_9F0F
, sizeof(currentcard
->tag_9F0F
));
240 returnedlength
= sizeof(currentcard
->tag_9F0F
); goto exitfunction
;}
241 else if(*(tag
+1) == 0x10){
242 memcpy(&returnedtag
, currentcard
->tag_9F10
, currentcard
->tag_9F10_len
);
243 returnedlength
= currentcard
->tag_9F10_len
; goto exitfunction
;}
244 else if(*(tag
+1) == 0x11){
245 memcpy(&returnedtag
, currentcard
->tag_9F11
, sizeof(currentcard
->tag_9F11
));
246 returnedlength
= sizeof(currentcard
->tag_9F11
); goto exitfunction
;}
247 else if(*(tag
+1) == 0x12){
248 memcpy(&returnedtag
, currentcard
->tag_9F12
, currentcard
->tag_9F12_len
);
249 returnedlength
= currentcard
->tag_9F12_len
; goto exitfunction
;}
250 else if(*(tag
+1) == 0x1A){
251 memcpy(&returnedtag
, currentcard
->tag_9F1A
, sizeof(currentcard
->tag_9F1A
));
252 returnedlength
= sizeof(currentcard
->tag_9F1A
); goto exitfunction
;}
253 else if(*(tag
+1) == 0x1F){
254 memcpy(&returnedtag
, currentcard
->tag_9F1F
, currentcard
->tag_9F1F_len
);
255 returnedlength
= currentcard
->tag_9F1F_len
; goto exitfunction
;}
256 else if(*(tag
+1) == 0x32){
257 memcpy(&returnedtag
, currentcard
->tag_9F32
, currentcard
->tag_9F32_len
);
258 returnedlength
= currentcard
->tag_9F32_len
; goto exitfunction
;}
259 else if(*(tag
+1) == 0x34){
260 memcpy(&returnedtag
, currentcard
->tag_9F34
, sizeof(currentcard
->tag_9F34
));
261 returnedlength
= sizeof(currentcard
->tag_9F34
); goto exitfunction
;}
262 else if(*(tag
+1) == 0x35){
263 memcpy(&returnedtag
, currentcard
->tag_9F35
, sizeof(currentcard
->tag_9F35
));
264 returnedlength
= sizeof(currentcard
->tag_9F35
); goto exitfunction
;}
265 else if(*(tag
+1) == 0x37){
266 memcpy(&returnedtag
, currentcard
->tag_9F37
, sizeof(currentcard
->tag_9F37
));
267 returnedlength
= sizeof(currentcard
->tag_9F37
);goto exitfunction
;}
268 else if(*(tag
+1) == 0x38){
269 memcpy(&returnedtag
, currentcard
->tag_9F38
, currentcard
->tag_9F38_len
);
270 returnedlength
= currentcard
->tag_9F38_len
; goto exitfunction
;}
271 else if(*(tag
+1) == 0x44){
272 memcpy(&returnedtag
, currentcard
->tag_9F44
, sizeof(currentcard
->tag_9F44
));
273 returnedlength
= sizeof(currentcard
->tag_9F44
);goto exitfunction
;}
274 else if(*(tag
+1) == 0x45){
275 memcpy(&returnedtag
, currentcard
->tag_9F45
, sizeof(currentcard
->tag_9F45
));
276 returnedlength
= sizeof(currentcard
->tag_9F45
);goto exitfunction
;}
277 else if(*(tag
+1) == 0x46){
278 memcpy(&returnedtag
, currentcard
->tag_9F46
, currentcard
->tag_9F46_len
);
279 returnedlength
= currentcard
->tag_9F46_len
; goto exitfunction
;}
280 else if(*(tag
+1) == 0x47){
281 memcpy(&returnedtag
, currentcard
->tag_9F47
, currentcard
->tag_9F47_len
);
282 returnedlength
= currentcard
->tag_9F47_len
; goto exitfunction
;}
283 else if(*(tag
+1) == 0x48){
284 memcpy(&returnedtag
, currentcard
->tag_9F48
, currentcard
->tag_9F48_len
);
285 returnedlength
= currentcard
->tag_9F48_len
; goto exitfunction
;}
286 else if(*(tag
+1) == 0x49){
287 memcpy(&returnedtag
, currentcard
->tag_9F49
, currentcard
->tag_9F49_len
);
288 returnedlength
= currentcard
->tag_9F49_len
; goto exitfunction
;}
289 else if(*(tag
+1) == 0x4A){
290 memcpy(&returnedtag
, currentcard
->tag_9F4A
, sizeof(currentcard
->tag_9F4A
));
291 returnedlength
= sizeof(currentcard
->tag_9F4A
);goto exitfunction
;}
292 else if(*(tag
+1) == 0x4B){
293 memcpy(&returnedtag
, currentcard
->tag_9F4B
, currentcard
->tag_9F4B_len
);
294 returnedlength
= currentcard
->tag_9F4B_len
; goto exitfunction
;}
295 else if(*(tag
+1) == 0x4C){
296 memcpy(&returnedtag
, currentcard
->tag_9F4C
, sizeof(currentcard
->tag_9F4C
));
297 returnedlength
= sizeof(currentcard
->tag_9F4C
); goto exitfunction
;}
298 else if(*(tag
+1) == 0x60){
299 memcpy(&returnedtag
, currentcard
->tag_9F60
, sizeof(currentcard
->tag_9F60
));
300 returnedlength
= sizeof(currentcard
->tag_9F60
);goto exitfunction
;}
301 else if(*(tag
+1) == 0x61){
302 memcpy(&returnedtag
, currentcard
->tag_9F61
, sizeof(currentcard
->tag_9F61
));
303 returnedlength
= sizeof(currentcard
->tag_9F61
);goto exitfunction
;}
304 else if(*(tag
+1) == 0x62){
305 memcpy(&returnedtag
, currentcard
->tag_9F62
, sizeof(currentcard
->tag_9F62
));
306 returnedlength
= sizeof(currentcard
->tag_9F62
);goto exitfunction
;}
307 else if(*(tag
+1) == 0x63){
308 memcpy(&returnedtag
, currentcard
->tag_9F63
, sizeof(currentcard
->tag_9F63
));
309 returnedlength
= sizeof(currentcard
->tag_9F63
);goto exitfunction
;}
310 else if(*(tag
+1) == 0x64){
311 memcpy(&returnedtag
, currentcard
->tag_9F64
, sizeof(currentcard
->tag_9F64
));
312 returnedlength
= sizeof(currentcard
->tag_9F64
);goto exitfunction
;}
313 else if(*(tag
+1) == 0x65){
314 memcpy(&returnedtag
, currentcard
->tag_9F65
, sizeof(currentcard
->tag_9F65
));
315 returnedlength
= sizeof(currentcard
->tag_9F65
);goto exitfunction
;}
316 else if(*(tag
+1) == 0x66){
317 memcpy(&returnedtag
, currentcard
->tag_9F66
, sizeof(currentcard
->tag_9F66
));
318 returnedlength
= sizeof(currentcard
->tag_9F66
);goto exitfunction
;}
319 else if(*(tag
+1) == 0x67){
320 memcpy(&returnedtag
, currentcard
->tag_9F67
, sizeof(currentcard
->tag_9F67
));
321 returnedlength
= sizeof(currentcard
->tag_9F67
);goto exitfunction
;}
322 else if(*(tag
+1) == 0x68){
323 memcpy(&returnedtag
, currentcard
->tag_9F68
, currentcard
->tag_9F68_len
);
324 returnedlength
= currentcard
->tag_9F68_len
;goto exitfunction
;}
325 else if(*(tag
+1) == 0x69){
326 memcpy(&returnedtag
, currentcard
->tag_9F69
, currentcard
->tag_9F69_len
);
327 returnedlength
= currentcard
->tag_9F69_len
; goto exitfunction
;}
328 else if(*(tag
+1) == 0x6A){
329 memcpy(&returnedtag
, currentcard
->tag_9F6A
, sizeof(currentcard
->tag_9F6A
));
330 returnedlength
= sizeof(currentcard
->tag_9F6A
);goto exitfunction
;}
331 else if(*(tag
+1) == 0x6B){
332 memcpy(&returnedtag
, currentcard
->tag_9F6B
, currentcard
->tag_9F6B_len
);
333 returnedlength
= currentcard
->tag_9F6B_len
; goto exitfunction
;}
334 else if(*(tag
+1) == 0x6C){
335 memcpy(&returnedtag
, currentcard
->tag_9F6C
, sizeof(currentcard
->tag_9F6C
));
336 returnedlength
= sizeof(currentcard
->tag_9F6C
);goto exitfunction
;}
339 if(!memcmp(tag
, "\x61\x00",2)){
340 memcpy(&returnedtag
, currentcard
->tag_61
, currentcard
->tag_61_len
);
341 returnedlength
= currentcard
->tag_61_len
; goto exitfunction
;}
342 else if(!memcmp(tag
, "\x6F\x00",2)){
343 memcpy(&returnedtag
, currentcard
->tag_6F
, currentcard
->tag_6F_len
);
344 returnedlength
= currentcard
->tag_6F_len
; goto exitfunction
;}
345 else if(!memcmp(tag
, "\xAF\x00",2)){
346 memcpy(&returnedtag
, currentcard
->tag_AF
, currentcard
->tag_AF_len
);
347 returnedlength
= currentcard
->tag_AF_len
; goto exitfunction
;}
348 else if(!memcmp(tag
, "\x70\x00",2)){
349 memcpy(&returnedtag
, currentcard
->tag_70
, currentcard
->tag_70_len
);
350 returnedlength
= currentcard
->tag_70_len
; goto exitfunction
;}
351 else if(!memcmp(tag
, "\x77\x00",2)){
352 memcpy(&returnedtag
, currentcard
->tag_77
, currentcard
->tag_77_len
);
353 returnedlength
= currentcard
->tag_77_len
; goto exitfunction
;}
354 else if(!memcmp(tag
, "\x80\x00",2)){
355 memcpy(&returnedtag
, currentcard
->tag_80
, currentcard
->tag_80_len
);
356 returnedlength
= currentcard
->tag_80_len
; goto exitfunction
;}
357 else if(!memcmp(tag
, "\xBF\x0C",2)){
358 memcpy(&returnedtag
, currentcard
->tag_BF0C
, currentcard
->tag_BF0C_len
);
359 returnedlength
= currentcard
->tag_BF0C_len
; goto exitfunction
;}
360 else if(!memcmp(tag
, "\xFF\x01",2)){ //special DF tag
361 memcpy(&returnedtag
, currentcard
->tag_DFName
, currentcard
->tag_DFName_len
);
362 returnedlength
= currentcard
->tag_DFName_len
; goto exitfunction
;}
364 exitfunction
: //goto label to exit search quickly once found
365 memcpy(outputval
, &returnedtag
, returnedlength
);
366 *outputvallen
= returnedlength
;
371 int emv_settag(uint32_t tag
, uint8_t *datain
, emvtags
*currentcard
){
372 char binarydata
[255] = {0};
375 // if((strlen((const char *)datain)%2) != 0){ //must be an even string
378 // if(strlen((const char *)datain) > 255) {
383 uint8_t datalen
= strlen((const char *)datain
) / 2; //length of datain
384 for(int i
= 0; i
< strlen((const char *)datain
); i
+= 2){
385 binarydata
[i
/2] |= (char)hex2int(datain
[i
]) << 4;
386 binarydata
[i
/2] |= (char)hex2int(datain
[i
+1]);
388 Dbprintf("BINARYDATA=");
389 Dbhexdump(datalen
,(uint8_t *)binarydata
,false);
393 memcpy(currentcard
->tag_4F
, binarydata
, datalen
);
394 currentcard
->tag_4F_len
= datalen
;
397 memcpy(currentcard
->tag_50
, binarydata
, datalen
);
398 currentcard
->tag_50_len
= datalen
;
401 memcpy(currentcard
->tag_56
, binarydata
, datalen
);
402 currentcard
->tag_56_len
= datalen
;
405 memcpy(currentcard
->tag_57
, binarydata
, datalen
);
406 currentcard
->tag_57_len
= datalen
;
409 memcpy(currentcard
->tag_5A
, binarydata
, datalen
);
410 currentcard
->tag_5A_len
= datalen
;
413 memcpy(currentcard
->tag_61
, binarydata
, datalen
);
414 currentcard
->tag_61_len
= datalen
;
417 memcpy(currentcard
->tag_6F
, binarydata
, datalen
);
418 currentcard
->tag_6F_len
= datalen
;
421 memcpy(currentcard
->tag_70
, binarydata
, datalen
);
422 currentcard
->tag_70_len
= datalen
;
425 memcpy(currentcard
->tag_77
, binarydata
, datalen
);
426 currentcard
->tag_77_len
= datalen
;
429 memcpy(currentcard
->tag_80
, binarydata
, datalen
);
430 currentcard
->tag_80_len
= datalen
;
433 memcpy(currentcard
->tag_82
, binarydata
, sizeof(currentcard
->tag_82
));
436 memcpy(currentcard
->tag_84
, binarydata
, datalen
);
437 currentcard
->tag_84_len
= datalen
;
440 memcpy(currentcard
->tag_86
, binarydata
, datalen
);
441 currentcard
->tag_86_len
= datalen
;
444 memcpy(currentcard
->tag_87
, binarydata
, sizeof(currentcard
->tag_87
));
447 memcpy(currentcard
->tag_88
, binarydata
, sizeof(currentcard
->tag_88
));
450 memcpy(currentcard
->tag_8A
, binarydata
, sizeof(currentcard
->tag_8A
));
453 memcpy(currentcard
->tag_8C
, binarydata
, datalen
);
454 currentcard
->tag_8C_len
= datalen
;
457 memcpy(currentcard
->tag_8D
, binarydata
, datalen
);
458 currentcard
->tag_8D_len
= datalen
;
461 memcpy(currentcard
->tag_8E
, binarydata
, datalen
);
462 currentcard
->tag_8E_len
= datalen
;
465 memcpy(currentcard
->tag_8F
, binarydata
, sizeof(currentcard
->tag_8F
));
468 memcpy(currentcard
->tag_90
, binarydata
, datalen
);
469 currentcard
->tag_90_len
= datalen
;
472 memcpy(currentcard
->tag_91
, binarydata
, datalen
);
473 currentcard
->tag_91_len
= datalen
;
476 memcpy(currentcard
->tag_92
, binarydata
, datalen
);
477 currentcard
->tag_92_len
= datalen
;
480 memcpy(currentcard
->tag_93
, binarydata
, datalen
);
481 currentcard
->tag_93_len
= datalen
;
484 memcpy(currentcard
->tag_94
, binarydata
, datalen
);
485 currentcard
->tag_94_len
= datalen
;
488 memcpy(currentcard
->tag_95
, binarydata
, sizeof(currentcard
->tag_95
));
491 memcpy(currentcard
->tag_97
, binarydata
, datalen
);
492 currentcard
->tag_97_len
= datalen
;
495 memcpy(currentcard
->tag_98
, binarydata
, sizeof(currentcard
->tag_98
));
498 memcpy(currentcard
->tag_99
, binarydata
, datalen
);
499 currentcard
->tag_99_len
= datalen
;
502 memcpy(currentcard
->tag_9A
, binarydata
, sizeof(currentcard
->tag_9A
));
505 memcpy(currentcard
->tag_9B
, binarydata
, sizeof(currentcard
->tag_9B
));
508 memcpy(currentcard
->tag_9C
, binarydata
, sizeof(currentcard
->tag_9C
));
511 memcpy(currentcard
->tag_9D
, binarydata
, datalen
);
512 currentcard
->tag_9D_len
= datalen
;
515 memcpy(currentcard
->tag_A5
, binarydata
, datalen
);
516 currentcard
->tag_A5_len
= datalen
;
519 memcpy(currentcard
->tag_AF
, binarydata
, datalen
);
520 currentcard
->tag_AF_len
= datalen
;
523 memcpy(currentcard
->tag_CD
, binarydata
, sizeof(currentcard
->tag_CD
));
526 memcpy(currentcard
->tag_CE
, binarydata
, sizeof(currentcard
->tag_CE
));
529 memcpy(currentcard
->tag_CF
, binarydata
, sizeof(currentcard
->tag_CF
));
532 memcpy(currentcard
->tag_CF
, binarydata
, sizeof(currentcard
->tag_CF
));
535 memcpy(currentcard
->tag_CF
, binarydata
, sizeof(currentcard
->tag_CF
));
540 memcpy(currentcard
->tag_DA
, binarydata
, sizeof(currentcard
->tag_DA
));
543 memcpy(currentcard
->tag_DB
, binarydata
, sizeof(currentcard
->tag_DB
));
546 memcpy(currentcard
->tag_DB
, binarydata
, sizeof(currentcard
->tag_DB
));
549 memcpy(currentcard
->tag_DD
, binarydata
, sizeof(currentcard
->tag_DD
));
554 memcpy(currentcard
->tag_5F24
, binarydata
, sizeof(currentcard
->tag_5F24
));
557 memcpy(currentcard
->tag_5F25
, binarydata
, sizeof(currentcard
->tag_5F25
));
560 memcpy(currentcard
->tag_5F28
, binarydata
, sizeof(currentcard
->tag_5F28
));
563 memcpy(currentcard
->tag_5F2A
, binarydata
, sizeof(currentcard
->tag_5F2A
));
568 memcpy(currentcard
->tag_5F30
, binarydata
, sizeof(currentcard
->tag_5F30
));
571 memcpy(currentcard
->tag_5F34
, binarydata
, sizeof(currentcard
->tag_5F34
));
574 memcpy(currentcard
->tag_5F36
, binarydata
, sizeof(currentcard
->tag_5F36
));
579 memcpy(currentcard
->tag_5F54
, binarydata
, sizeof(currentcard
->tag_5F54
));
582 memcpy(currentcard
->tag_9F01
, binarydata
, sizeof(currentcard
->tag_9F01
));
585 memcpy(currentcard
->tag_9F02
, binarydata
, sizeof(currentcard
->tag_9F02
));
588 memcpy(currentcard
->tag_9F03
, binarydata
, sizeof(currentcard
->tag_9F03
));
591 memcpy(currentcard
->tag_9F04
, binarydata
, sizeof(currentcard
->tag_9F04
));
594 memcpy(currentcard
->tag_9F05
, binarydata
, datalen
);
595 currentcard
->tag_9F05_len
= datalen
;
598 memcpy(currentcard
->tag_9F06
, binarydata
, datalen
);
599 currentcard
->tag_9F06_len
= datalen
;
602 memcpy(currentcard
->tag_9F07
, binarydata
, sizeof(currentcard
->tag_9F07
));
605 memcpy(currentcard
->tag_9F08
, binarydata
, sizeof(currentcard
->tag_9F08
));
608 memcpy(currentcard
->tag_9F09
, binarydata
, sizeof(currentcard
->tag_9F09
));
611 memcpy(currentcard
->tag_9F0B
, binarydata
, sizeof(currentcard
->tag_9F0B
));
614 memcpy(currentcard
->tag_9F0D
, binarydata
, sizeof(currentcard
->tag_9F0D
));
617 memcpy(currentcard
->tag_9F0E
, binarydata
, sizeof(currentcard
->tag_9F0E
));
620 memcpy(currentcard
->tag_9F0F
, binarydata
, sizeof(currentcard
->tag_9F0F
));
623 memcpy(currentcard
->tag_9F10
, binarydata
, datalen
);
624 currentcard
->tag_9F10_len
= datalen
;break;
626 memcpy(currentcard
->tag_9F11
, binarydata
, sizeof(currentcard
->tag_9F11
));
629 memcpy(currentcard
->tag_9F12
, binarydata
, datalen
);
630 currentcard
->tag_9F12_len
= datalen
;break;
632 memcpy(currentcard
->tag_9F13
, binarydata
, sizeof(currentcard
->tag_9F13
));
635 memcpy(currentcard
->tag_9F14
, binarydata
, sizeof(currentcard
->tag_9F14
));
638 memcpy(currentcard
->tag_9F15
, binarydata
, sizeof(currentcard
->tag_9F15
));
641 memcpy(currentcard
->tag_9F16
, binarydata
, sizeof(currentcard
->tag_9F16
));
644 memcpy(currentcard
->tag_9F17
, binarydata
, sizeof(currentcard
->tag_9F17
));
647 memcpy(currentcard
->tag_9F18
, binarydata
, sizeof(currentcard
->tag_9F18
));
650 memcpy(currentcard
->tag_9F1A
, binarydata
, sizeof(currentcard
->tag_9F1A
));
653 memcpy(currentcard
->tag_9F1B
, binarydata
, sizeof(currentcard
->tag_9F1B
));
656 memcpy(currentcard
->tag_9F1C
, binarydata
, sizeof(currentcard
->tag_9F1C
));
659 memcpy(currentcard
->tag_9F1D
, binarydata
, datalen
);
660 currentcard
->tag_9F1D_len
= datalen
;break;
662 memcpy(currentcard
->tag_9F1E
, binarydata
, sizeof(currentcard
->tag_9F1E
));
665 memcpy(currentcard
->tag_9F1F
, binarydata
, datalen
);
666 currentcard
->tag_9F1F_len
= datalen
;break;
668 memcpy(currentcard
->tag_9F20
, binarydata
, datalen
);
669 currentcard
->tag_9F20_len
= datalen
;break;
671 memcpy(currentcard
->tag_9F21
, binarydata
, sizeof(currentcard
->tag_9F21
));
674 memcpy(currentcard
->tag_9F22
, binarydata
, sizeof(currentcard
->tag_9F22
));
677 memcpy(currentcard
->tag_9F23
, binarydata
, sizeof(currentcard
->tag_9F23
));
680 memcpy(currentcard
->tag_9F26
, binarydata
, sizeof(currentcard
->tag_9F26
));
683 memcpy(currentcard
->tag_9F27
, binarydata
, sizeof(currentcard
->tag_9F27
));
686 memcpy(currentcard
->tag_9F2D
, binarydata
, datalen
);
687 currentcard
->tag_9F2D_len
= datalen
;break;
689 memcpy(currentcard
->tag_9F2E
, binarydata
, sizeof(currentcard
->tag_9F2E
));
692 memcpy(currentcard
->tag_9F2F
, binarydata
, datalen
);
693 currentcard
->tag_9F2F_len
= datalen
;break;
695 memcpy(currentcard
->tag_9F32
, binarydata
, datalen
);
696 currentcard
->tag_9F32_len
= datalen
;break;
698 memcpy(currentcard
->tag_9F33
, binarydata
, sizeof(currentcard
->tag_9F33
));
701 memcpy(currentcard
->tag_9F34
, binarydata
, sizeof(currentcard
->tag_9F34
));
704 memcpy(currentcard
->tag_9F35
, binarydata
, sizeof(currentcard
->tag_9F35
));
707 memcpy(currentcard
->tag_9F36
, binarydata
, sizeof(currentcard
->tag_9F36
));
710 memcpy(currentcard
->tag_9F37
, binarydata
, sizeof(currentcard
->tag_9F37
));
715 memcpy(currentcard
->tag_9F39
, binarydata
, sizeof(currentcard
->tag_9F39
));
718 memcpy(currentcard
->tag_9F40
, binarydata
, sizeof(currentcard
->tag_9F40
));
721 memcpy(currentcard
->tag_9F41
, binarydata
, sizeof(currentcard
->tag_9F41
));
724 memcpy(currentcard
->tag_9F42
, binarydata
, sizeof(currentcard
->tag_9F42
));
727 memcpy(currentcard
->tag_9F43
, binarydata
, sizeof(currentcard
->tag_9F43
));
730 memcpy(currentcard
->tag_9F44
, binarydata
, sizeof(currentcard
->tag_9F44
));
733 memcpy(currentcard
->tag_9F45
, binarydata
, sizeof(currentcard
->tag_9F45
));
736 memcpy(currentcard
->tag_9F46
, binarydata
, datalen
);
737 currentcard
->tag_9F46_len
= datalen
;break;
739 memcpy(currentcard
->tag_9F47
, binarydata
, datalen
);
740 currentcard
->tag_9F47_len
= datalen
;break;
742 memcpy(currentcard
->tag_9F48
, binarydata
, datalen
);
743 currentcard
->tag_9F48_len
= datalen
;break;
745 memcpy(currentcard
->tag_9F49
, binarydata
, datalen
);
746 currentcard
->tag_9F49_len
= datalen
;break;
748 memcpy(currentcard
->tag_9F4A
, binarydata
, sizeof(currentcard
->tag_9F4A
));
751 memcpy(currentcard
->tag_9F4B
, binarydata
, datalen
);
752 currentcard
->tag_9F4B_len
= datalen
;break;
754 memcpy(currentcard
->tag_9F4C
, binarydata
, sizeof(currentcard
->tag_9F4C
));
757 memcpy(currentcard
->tag_9F4D
, binarydata
, sizeof(currentcard
->tag_9F4D
));
760 memcpy(currentcard
->tag_9F4E
, binarydata
, sizeof(currentcard
->tag_9F4E
));
763 memcpy(currentcard
->tag_9F60
, binarydata
, sizeof(currentcard
->tag_9F60
));
766 memcpy(currentcard
->tag_9F61
, binarydata
, sizeof(currentcard
->tag_9F61
));
769 memcpy(currentcard
->tag_9F62
, binarydata
, sizeof(currentcard
->tag_9F62
));
772 memcpy(currentcard
->tag_9F63
, binarydata
, sizeof(currentcard
->tag_9F63
));
775 memcpy(currentcard
->tag_9F64
, binarydata
, sizeof(currentcard
->tag_9F64
));
778 memcpy(currentcard
->tag_9F65
, binarydata
, sizeof(currentcard
->tag_9F65
));
781 memcpy(currentcard
->tag_9F66
, binarydata
, sizeof(currentcard
->tag_9F66
));
784 memcpy(currentcard
->tag_9F67
, binarydata
, sizeof(currentcard
->tag_9F67
));
787 memcpy(currentcard
->tag_9F68
, binarydata
, datalen
);
788 currentcard
->tag_9F68_len
= datalen
;break;
790 memcpy(currentcard
->tag_9F69
, binarydata
, datalen
);
791 currentcard
->tag_9F69_len
= datalen
;break;
793 memcpy(currentcard
->tag_9F6A
, binarydata
, sizeof(currentcard
->tag_9F6A
));
796 memcpy(currentcard
->tag_9F6B
, binarydata
, sizeof(currentcard
->tag_9F6B
));
799 memcpy(currentcard
->tag_9F6C
, binarydata
, sizeof(currentcard
->tag_9F6C
));
802 memcpy(currentcard
->tag_BF0C
, binarydata
, datalen
);
803 currentcard
->tag_BF0C_len
= datalen
;break;
810 /* generates an emv template based off tag values supplied */
811 int emv_generatetemplate(uint8_t* templateval
,emvtags
* currentcard
, uint8_t* returnedval
, uint8_t* returnedlen
,uint8_t numtags
, ...)
814 uint8_t* currenttag
; //value of the current tag
815 uint8_t tagval
[255]; //buffer to hold the extracted tag value
816 uint8_t taglen
= 0; //extracted tag length
817 uint8_t bufferval
[255];
819 uint32_t encodedlen
= 0;
820 va_start(arguments
, numtags
);
821 for(int x
=0; x
<numtags
; x
++){
822 currenttag
= va_arg(arguments
, uint8_t*);
823 emv_lookuptag(currenttag
, currentcard
, tagval
, &taglen
);
824 encode_ber_tlv_item(currenttag
, (uint8_t)strlen((const char*)currenttag
), tagval
, (uint32_t)taglen
, bufferval
+counter
, &encodedlen
);
825 counter
+=encodedlen
;
827 encode_ber_tlv_item(templateval
, strlen((const char*) templateval
), bufferval
, counter
, returnedval
, &encodedlen
);
828 *returnedlen
= encodedlen
;
833 //generate a valid pdol list
834 int emv_generateDOL(uint8_t* DOL
, uint8_t DOLlen
,emvtags
* currentcard
,uint8_t* DOLoutput
, uint8_t* DOLoutputlen
)
836 if(!DOL
|| !currentcard
|| !DOLoutput
) // null pointer checks
838 //scan through the DOL list and construct the result.
840 uint8_t DOLcounter
= 0; //points to the current DOL buffer location
841 uint8_t scannedtaglen
= 0; //length of a scanned tag
842 uint8_t scannedtag
[2] = {0x00,0x00}; //buffer for the scanned tag
843 uint8_t DOLoutputbuffer
[255];
844 uint8_t retrievedtagvallen
;
846 memset(DOLoutputbuffer
,0x00, 255); //clear the output buffer
850 if((*(DOL
+i
) & 0x1F) == 0x1F)
851 { scannedtaglen
= 2;}
854 memcpy(scannedtag
, DOL
+i
,scannedtaglen
);
855 //look up tag value and copy
856 //Dbhexdump(2,scannedtag,false);
857 emv_lookuptag(scannedtag
,currentcard
,&(DOLoutputbuffer
[DOLcounter
]),&retrievedtagvallen
);
858 DOLcounter
+= (uint8_t)DOL
[i
+scannedtaglen
];
859 i
+= scannedtaglen
+ 1;
860 memset(scannedtag
, 0x00, 2); //clear current tag
863 memcpy(DOLoutput
, DOLoutputbuffer
, DOLcounter
);
864 *DOLoutputlen
= DOLcounter
;
869 //decode the tag inputted and fill in the supplied structure. clean up the cleanup_passpass function
870 int emv_emvtags_decode_tag(tlvtag
* inputtag
, emvtags
* currentcard
)
872 if(!inputtag
|| !currentcard
) {
876 if(*(inputtag
->tag
) == 0x5F) {
877 if(*(inputtag
->tag
+1) == 0x20){
878 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F20
)))
880 memcpy(currentcard
->tag_5F20
, inputtag
->value
, inputtag
->valuelength
);
881 currentcard
->tag_5F20_len
= inputtag
->valuelength
;
883 if(*(inputtag
->tag
+1) == 0x24){
884 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F24
)))
886 memcpy(currentcard
->tag_5F24
, inputtag
->value
, sizeof(currentcard
->tag_5F24
));}
887 if(*(inputtag
->tag
+1) == 0x25){
888 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F25
)))
890 memcpy(currentcard
->tag_5F25
, inputtag
->value
, inputtag
->valuelength
);}
891 if(*(inputtag
->tag
+1) == 0x28){
892 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F28
)))
894 memcpy(currentcard
->tag_5F28
, inputtag
->value
, inputtag
->valuelength
);}
895 if(*(inputtag
->tag
+1) == 0x2A){
896 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F2A
)))
898 memcpy(currentcard
->tag_5F2A
, inputtag
->value
, inputtag
->valuelength
);}
899 if(*(inputtag
->tag
+1) == 0x2D){
900 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F2D
)))
902 memcpy(currentcard
->tag_5F2D
, inputtag
->value
, inputtag
->valuelength
);
903 currentcard
->tag_5F2D_len
= inputtag
->valuelength
;}
904 if(*(inputtag
->tag
+1) == 0x30){
905 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F30
)))
907 memcpy(currentcard
->tag_5F30
, inputtag
->value
, inputtag
->valuelength
);}
908 if(*(inputtag
->tag
+1) == 0x34){
909 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F34
)))
911 memcpy(currentcard
->tag_5F34
, inputtag
->value
, sizeof(currentcard
->tag_5F34
));}
912 if(*(inputtag
->tag
+1) == 0x36){
913 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F36
)))
915 memcpy(currentcard
->tag_5F36
, inputtag
->value
, sizeof(currentcard
->tag_5F36
));}
916 if(*(inputtag
->tag
+1) == 0x50){
917 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F50
)))
919 memcpy(currentcard
->tag_5F50
, inputtag
->value
, inputtag
->valuelength
);
920 currentcard
->tag_5F50_len
= inputtag
->valuelength
;}
921 if(*(inputtag
->tag
+1) == 0x54){
922 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F54
)))
924 memcpy(currentcard
->tag_5F54
, inputtag
->value
, inputtag
->valuelength
);
925 currentcard
->tag_5F54_len
= inputtag
->valuelength
;}
927 if(*(inputtag
->tag
) == 0x9F){
928 if(*(inputtag
->tag
+1) == 0x01){
929 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F01
)))
931 memcpy(currentcard
->tag_9F01
, inputtag
->value
, inputtag
->valuelength
);}
932 if(*(inputtag
->tag
+1) == 0x02){
933 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F02
)))
935 memcpy(currentcard
->tag_9F02
, inputtag
->value
, inputtag
->valuelength
);}
936 if(*(inputtag
->tag
+1) == 0x03){
937 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F03
)))
939 memcpy(currentcard
->tag_9F03
, inputtag
->value
, inputtag
->valuelength
);}
940 if(*(inputtag
->tag
+1) == 0x04){
941 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F04
)))
943 memcpy(currentcard
->tag_9F04
, inputtag
->value
, inputtag
->valuelength
);}
944 if(*(inputtag
->tag
+1) == 0x05){
945 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F05
)))
947 memcpy(currentcard
->tag_9F05
, inputtag
->value
, inputtag
->valuelength
);
948 currentcard
->tag_9F05_len
= inputtag
->valuelength
;}
949 if(*(inputtag
->tag
+1) == 0x06){
950 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F06
)))
952 memcpy(currentcard
->tag_9F06
, inputtag
->value
, inputtag
->valuelength
);
953 currentcard
->tag_9F06_len
= inputtag
->valuelength
;}
954 if(*(inputtag
->tag
+1) == 0x07){
955 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F07
)))
957 memcpy(currentcard
->tag_9F07
, inputtag
->value
, inputtag
->valuelength
);}
958 if(*(inputtag
->tag
+1) == 0x08){
959 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F08
)))
961 memcpy(currentcard
->tag_9F08
, inputtag
->value
, inputtag
->valuelength
);}
962 if(*(inputtag
->tag
+1) == 0x09){
963 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F09
)))
965 memcpy(currentcard
->tag_9F09
, inputtag
->value
, inputtag
->valuelength
);}
966 if(*(inputtag
->tag
+1) == 0x0B){
967 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F0B
)))
969 memcpy(currentcard
->tag_9F0B
, inputtag
->value
, inputtag
->valuelength
);
970 currentcard
->tag_9F0B_len
= inputtag
->valuelength
;}
971 if(*(inputtag
->tag
+1) == 0x0D){
972 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F0D
)))
974 memcpy(currentcard
->tag_9F0D
, inputtag
->value
, inputtag
->valuelength
);}
975 if(*(inputtag
->tag
+1) == 0x0E){
976 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F0E
)))
978 memcpy(currentcard
->tag_9F0E
, inputtag
->value
, inputtag
->valuelength
);}
979 if(*(inputtag
->tag
+1) == 0x0F){
980 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F0F
)))
982 memcpy(currentcard
->tag_9F0F
, inputtag
->value
, inputtag
->valuelength
);}
983 if(*(inputtag
->tag
+1) == 0x11){
984 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F11
)))
986 memcpy(currentcard
->tag_9F11
, inputtag
->value
, inputtag
->valuelength
);}
987 if(*(inputtag
->tag
+1) == 0x12){
988 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F12
)))
990 memcpy(currentcard
->tag_9F12
, inputtag
->value
, inputtag
->valuelength
);
991 currentcard
->tag_9F12_len
= inputtag
->valuelength
;}
992 if(*(inputtag
->tag
+1) == 0x13){
993 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F13
)))
995 memcpy(currentcard
->tag_9F13
, inputtag
->value
, inputtag
->valuelength
);}
996 if(*(inputtag
->tag
+1) == 0x14){
997 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F14
)))
999 memcpy(currentcard
->tag_9F14
, inputtag
->value
, inputtag
->valuelength
);}
1000 if(*(inputtag
->tag
+1) == 0x15){
1001 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F15
)))
1003 memcpy(currentcard
->tag_9F15
, inputtag
->value
, inputtag
->valuelength
);}
1004 if(*(inputtag
->tag
+1) == 0x16){
1005 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F16
)))
1007 memcpy(currentcard
->tag_9F16
, inputtag
->value
, inputtag
->valuelength
);}
1008 if(*(inputtag
->tag
+1) == 0x17){
1009 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F17
)))
1011 memcpy(currentcard
->tag_9F17
, inputtag
->value
, inputtag
->valuelength
);}
1012 if(*(inputtag
->tag
+1) == 0x18){
1013 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F18
)))
1015 memcpy(currentcard
->tag_9F18
, inputtag
->value
, inputtag
->valuelength
);}
1016 if(*(inputtag
->tag
+1) == 0x1A){
1017 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1A
)))
1019 memcpy(currentcard
->tag_9F1A
, inputtag
->value
, inputtag
->valuelength
);}
1020 if(*(inputtag
->tag
+1) == 0x1B){
1021 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1B
)))
1023 memcpy(currentcard
->tag_9F1B
, inputtag
->value
, inputtag
->valuelength
);}
1024 if(*(inputtag
->tag
+1) == 0x1C){
1025 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1C
)))
1027 memcpy(currentcard
->tag_9F1C
, inputtag
->value
, inputtag
->valuelength
);}
1028 if(*(inputtag
->tag
+1) == 0x1D){
1029 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1D
)))
1031 memcpy(currentcard
->tag_9F1D
, inputtag
->value
, inputtag
->valuelength
);
1032 currentcard
->tag_9F1D_len
= inputtag
->valuelength
;}
1033 if(*(inputtag
->tag
+1) == 0x1E){
1034 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1E
)))
1036 memcpy(currentcard
->tag_9F1E
, inputtag
->value
, inputtag
->valuelength
);}
1037 if(*(inputtag
->tag
+1) == 0x1F){
1038 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1F
)))
1040 memcpy(currentcard
->tag_9F1F
, inputtag
->value
, inputtag
->valuelength
);
1041 currentcard
->tag_9F1F_len
= inputtag
->valuelength
;}
1042 if(*(inputtag
->tag
+1) == 0x32){
1043 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F32
)))
1045 currentcard
->tag_9F32_len
= inputtag
->valuelength
;
1046 memcpy(currentcard
->tag_9F32
, inputtag
->value
, inputtag
->valuelength
);
1048 if(*(inputtag
->tag
+1) == 0x34){
1049 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F34
)))
1051 memcpy(currentcard
->tag_9F34
, inputtag
->value
, inputtag
->valuelength
);}
1052 if(*(inputtag
->tag
+1) == 0x35){
1053 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F35
)))
1055 memcpy(currentcard
->tag_9F35
, inputtag
->value
, inputtag
->valuelength
);}
1056 if(*(inputtag
->tag
+1) == 0x37){
1057 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F37
)))
1059 memcpy(currentcard
->tag_9F37
, inputtag
->value
, inputtag
->valuelength
);}
1060 if(*(inputtag
->tag
+1) == 0x38){
1061 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F38
)))
1063 memcpy(currentcard
->tag_9F38
, inputtag
->value
, inputtag
->valuelength
);
1064 currentcard
->tag_9F38_len
= inputtag
->valuelength
;}
1065 if(*(inputtag
->tag
+1) == 0x44){
1066 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F44
)))
1068 memcpy(currentcard
->tag_9F44
, inputtag
->value
, inputtag
->valuelength
);}
1069 if(*(inputtag
->tag
+1) == 0x45){
1070 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F45
)))
1072 memcpy(currentcard
->tag_9F45
, inputtag
->value
, inputtag
->valuelength
);}
1073 if(*(inputtag
->tag
+1) == 0x46){
1074 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F46
)))
1076 memcpy(currentcard
->tag_9F46
, inputtag
->value
, inputtag
->valuelength
);
1077 currentcard
->tag_9F46_len
= inputtag
->valuelength
;}
1078 if(*(inputtag
->tag
+1) == 0x47){
1079 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F47
)))
1081 memcpy(currentcard
->tag_9F47
, inputtag
->value
, inputtag
->valuelength
);
1082 currentcard
->tag_9F47_len
= inputtag
->valuelength
;}
1083 if(*(inputtag
->tag
+1) == 0x48){
1084 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F48
)))
1086 memcpy(currentcard
->tag_9F48
, inputtag
->value
, inputtag
->valuelength
);
1087 currentcard
->tag_9F48_len
= inputtag
->valuelength
;}
1088 if(*(inputtag
->tag
+1) == 0x49){
1089 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F49
)))
1091 memcpy(currentcard
->tag_9F49
, inputtag
->value
, inputtag
->valuelength
);
1092 currentcard
->tag_9F49_len
= inputtag
->valuelength
;}
1093 if(*(inputtag
->tag
+1) == 0x4A){
1094 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F4A
)))
1096 memcpy(currentcard
->tag_9F4A
, inputtag
->value
, inputtag
->valuelength
);}
1097 if(*(inputtag
->tag
+1) == 0x4B){
1098 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F4B
)))
1100 memcpy(currentcard
->tag_9F4B
, inputtag
->value
, inputtag
->valuelength
);
1101 currentcard
->tag_9F4B_len
= inputtag
->valuelength
;}
1102 if(*(inputtag
->tag
+1) == 0x4C){
1103 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F4C
)))
1105 memcpy(currentcard
->tag_9F4C
, inputtag
->value
, inputtag
->valuelength
);}
1106 if(*(inputtag
->tag
+1) == 0x60){
1107 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F60
)))
1109 memcpy(currentcard
->tag_9F60
, inputtag
->value
, inputtag
->valuelength
);}
1110 if(*(inputtag
->tag
+1) == 0x61){
1111 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F61
)))
1113 memcpy(currentcard
->tag_9F61
, inputtag
->value
, inputtag
->valuelength
);}
1114 if(*(inputtag
->tag
+1) == 0x62){
1115 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F62
)))
1117 memcpy(currentcard
->tag_9F62
, inputtag
->value
, inputtag
->valuelength
);}
1118 if(*(inputtag
->tag
+1) == 0x63){
1119 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F63
)))
1121 memcpy(currentcard
->tag_9F63
, inputtag
->value
, inputtag
->valuelength
);}
1122 if(*(inputtag
->tag
+1) == 0x64){
1123 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F64
)))
1125 memcpy(currentcard
->tag_9F64
, inputtag
->value
, inputtag
->valuelength
);}
1126 if(*(inputtag
->tag
+1) == 0x65){
1127 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F65
)))
1129 memcpy(currentcard
->tag_9F65
, inputtag
->value
, inputtag
->valuelength
);}
1130 if(*(inputtag
->tag
+1) == 0x66){
1131 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F66
)))
1133 memcpy(currentcard
->tag_9F66
, inputtag
->value
, inputtag
->valuelength
);}
1134 if(*(inputtag
->tag
+1) == 0x67){
1135 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F67
)))
1137 memcpy(currentcard
->tag_9F67
, inputtag
->value
, inputtag
->valuelength
);}
1138 if(*(inputtag
->tag
+1) == 0x68){
1139 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F68
)))
1141 memcpy(currentcard
->tag_9F68
, inputtag
->value
, inputtag
->valuelength
);
1142 currentcard
->tag_9F68_len
= inputtag
->valuelength
;}
1143 if(*(inputtag
->tag
+1) == 0x69){
1144 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F69
)))
1146 memcpy(currentcard
->tag_9F69
, inputtag
->value
, inputtag
->valuelength
);
1147 currentcard
->tag_9F69_len
= inputtag
->valuelength
;}
1148 if(*(inputtag
->tag
+1) == 0x6A){
1149 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F6A
)))
1151 memcpy(currentcard
->tag_9F6A
, inputtag
->value
, inputtag
->valuelength
);}
1152 if(*(inputtag
->tag
+1) == 0x6B){
1153 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F6B
)))
1155 memcpy(currentcard
->tag_9F6B
, inputtag
->value
, inputtag
->valuelength
);
1156 currentcard
->tag_9F6B_len
= inputtag
->valuelength
;}
1157 if(*(inputtag
->tag
+1) == 0x6C){
1158 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F6C
)))
1160 memcpy(currentcard
->tag_9F6C
, inputtag
->value
, inputtag
->valuelength
);}
1164 if(*(inputtag
->tag
) == 0xBF){ //BF0C
1165 if(*(inputtag
->tag
+1) == 0x0C){
1166 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_BF0C
)))
1168 memcpy(currentcard
->tag_BF0C
, inputtag
->value
, inputtag
->valuelength
);
1169 currentcard
->tag_BF0C_len
= inputtag
->valuelength
;}
1171 else if(*(inputtag
->tag
) == 0x4F){ //BF0C
1172 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_4F
)))
1174 memcpy(currentcard
->tag_4F
, inputtag
->value
, inputtag
->valuelength
);
1175 currentcard
->tag_4F_len
= inputtag
->valuelength
;}
1176 else if(*(inputtag
->tag
) == 0x50){ //BF0C
1177 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_50
)))
1179 memcpy(currentcard
->tag_50
, inputtag
->value
, inputtag
->valuelength
);
1180 currentcard
->tag_50_len
= inputtag
->valuelength
;
1182 else if(*(inputtag
->tag
) == 0x56){ //BF0C
1183 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_56
)))
1185 memcpy(currentcard
->tag_56
, inputtag
->value
, inputtag
->valuelength
);
1186 currentcard
->tag_56_len
= inputtag
->valuelength
;
1188 else if(*(inputtag
->tag
) == 0x57){ //BF0C
1189 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_57
)))
1191 memcpy(currentcard
->tag_57
, inputtag
->value
, inputtag
->valuelength
);
1192 currentcard
->tag_57_len
= inputtag
->valuelength
;
1194 else if(*(inputtag
->tag
) == 0x5A){ //BF0C
1195 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5A
)))
1197 memcpy(currentcard
->tag_5A
, inputtag
->value
, inputtag
->valuelength
);
1198 currentcard
->tag_5A_len
= inputtag
->valuelength
;}
1199 else if(*(inputtag
->tag
) == 0x61){ //BF0C
1200 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_61
)))
1202 memcpy(currentcard
->tag_61
, inputtag
->value
, inputtag
->valuelength
);
1203 currentcard
->tag_61_len
= inputtag
->valuelength
;
1205 else if(*(inputtag
->tag
) == 0x6F){ //BF0C
1206 memcpy(currentcard
->tag_6F
,inputtag
->value
,inputtag
->valuelength
);}
1208 else if(*(inputtag
->tag
) == 0x70){ //BF0C
1209 memcpy(currentcard
->tag_70
,inputtag
->value
,inputtag
->valuelength
);}
1210 else if(*(inputtag
->tag
) == 0x77){ //BF0C
1211 memcpy(currentcard
->tag_77
,inputtag
->value
,inputtag
->valuelength
);}
1212 else if(*(inputtag
->tag
) == 0x80){ //BF0C
1213 memcpy(currentcard
->tag_80
,inputtag
->value
,inputtag
->valuelength
);}
1214 else if(*(inputtag
->tag
) == 0x82){ //BF0C
1215 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_82
)))
1217 memcpy(currentcard
->tag_82
, inputtag
->value
, inputtag
->valuelength
);}
1218 else if(*(inputtag
->tag
) == 0x84){ //BF0C
1219 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_84
)))
1221 memcpy(currentcard
->tag_84
, inputtag
->value
, inputtag
->valuelength
);
1222 currentcard
->tag_84_len
= inputtag
->valuelength
;
1224 else if(*(inputtag
->tag
) == 0x86){ //BF0C
1225 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_86
)))
1227 memcpy(currentcard
->tag_86
, inputtag
->value
, inputtag
->valuelength
);
1228 currentcard
->tag_86_len
= inputtag
->valuelength
;
1230 else if(*(inputtag
->tag
) == 0x87){ //BF0C
1231 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_87
)))
1233 memcpy(currentcard
->tag_87
, inputtag
->value
, inputtag
->valuelength
);}
1234 else if(*(inputtag
->tag
) == 0x88){ //BF0C
1235 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_88
)))
1237 memcpy(currentcard
->tag_88
, inputtag
->value
, inputtag
->valuelength
);}
1238 else if(*(inputtag
->tag
) == 0x8A){ //BF0C
1239 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_8A
)))
1241 memcpy(currentcard
->tag_8A
, inputtag
->value
, inputtag
->valuelength
);}
1242 else if(*(inputtag
->tag
) == 0x8C){ //BF0C
1243 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_8C
)))
1245 memcpy(currentcard
->tag_8C
, inputtag
->value
, inputtag
->valuelength
);
1246 currentcard
->tag_8C_len
= inputtag
->valuelength
;
1248 else if(*(inputtag
->tag
) == 0x8D){ //BF0C
1249 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_8D
)))
1251 memcpy(currentcard
->tag_8D
, inputtag
->value
, inputtag
->valuelength
);
1252 currentcard
->tag_8D_len
= inputtag
->valuelength
;
1254 else if(*(inputtag
->tag
) == 0x8E){ //BF0C
1255 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_8E
)))
1257 memcpy(currentcard
->tag_8E
, inputtag
->value
, inputtag
->valuelength
);
1258 currentcard
->tag_8E_len
= inputtag
->valuelength
;
1260 else if(*(inputtag
->tag
) == 0x8F){ //BF0C
1261 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_8F
)))
1263 memcpy(currentcard
->tag_8F
,inputtag
->value
,sizeof(currentcard
->tag_8F
));}
1264 else if(*(inputtag
->tag
) == 0x90){ //BF0C
1265 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_90
)))
1267 memcpy(currentcard
->tag_90
, inputtag
->value
, inputtag
->valuelength
);
1268 currentcard
->tag_90_len
= inputtag
->valuelength
;}
1269 else if(*(inputtag
->tag
) == 0x92){ //BF0C
1270 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_92
)))
1272 memcpy(currentcard
->tag_92
, inputtag
->value
, inputtag
->valuelength
);
1273 currentcard
->tag_92_len
= inputtag
->valuelength
;}
1274 else if(*(inputtag
->tag
) == 0x93){ //BF0C
1275 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_93
)))
1277 memcpy(currentcard
->tag_93
, inputtag
->value
, inputtag
->valuelength
);
1278 currentcard
->tag_93_len
= inputtag
->valuelength
;}
1279 else if(*(inputtag
->tag
) == 0x94){ //BF0C
1280 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_94
)))
1282 memcpy(currentcard
->tag_94
, inputtag
->value
, inputtag
->valuelength
);
1283 currentcard
->tag_94_len
= inputtag
->valuelength
;}
1284 else if(*(inputtag
->tag
) == 0x95){ //BF0C
1285 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_95
)))
1287 memcpy(currentcard
->tag_95
, inputtag
->value
, inputtag
->valuelength
);}
1288 else if(*(inputtag
->tag
) == 0x97){ //BF0C
1289 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_97
)))
1291 memcpy(currentcard
->tag_97
, inputtag
->value
, inputtag
->valuelength
);
1292 currentcard
->tag_97_len
= inputtag
->valuelength
;}
1293 else if(*(inputtag
->tag
) == 0x98){ //BF0C
1294 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_98
)))
1296 memcpy(currentcard
->tag_98
, inputtag
->value
, inputtag
->valuelength
);}
1297 else if(*(inputtag
->tag
) == 0x99){ //BF0C
1298 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_99
)))
1300 memcpy(currentcard
->tag_99
, inputtag
->value
, inputtag
->valuelength
);
1301 currentcard
->tag_99_len
= inputtag
->valuelength
;}
1302 else if(*(inputtag
->tag
) == 0x9A){ //BF0C
1303 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9A
)))
1305 memcpy(currentcard
->tag_9A
, inputtag
->value
, inputtag
->valuelength
);}
1306 else if(*(inputtag
->tag
) == 0x9B){ //BF0C
1307 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9B
)))
1309 memcpy(currentcard
->tag_9B
, inputtag
->value
, inputtag
->valuelength
);}
1310 else if(*(inputtag
->tag
) == 0x9C){ //BF0C
1311 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9C
)))
1313 memcpy(currentcard
->tag_9C
, inputtag
->value
, inputtag
->valuelength
);}
1314 else if(*(inputtag
->tag
) == 0x9D){ //BF0C
1315 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9D
)))
1317 memcpy(currentcard
->tag_9D
, inputtag
->value
, inputtag
->valuelength
);
1318 currentcard
->tag_9D_len
= inputtag
->valuelength
;}
1319 else if(*(inputtag
->tag
) == 0xA5){ //BF0C
1320 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_A5
)))
1322 memcpy(currentcard
->tag_A5
, inputtag
->value
, inputtag
->valuelength
);
1323 currentcard
->tag_A5_len
= inputtag
->valuelength
;}
1328 int emv_decode_field(uint8_t* inputfield
,uint16_t inputlength
, emvtags
*result
)
1330 uint16_t lengthcounter
=0;
1332 //copy result to the testtag
1336 //loop through and decode template
1337 while(lengthcounter
< inputlength
)
1339 //decode the tlv tag
1340 decode_ber_tlv_item((inputfield
+lengthcounter
),&newtag
);
1341 //write the emvtags strucutre
1342 emv_emvtags_decode_tag(&newtag
,result
);
1343 //move to next value and decode
1344 lengthcounter
+= newtag
.fieldlength
-1;
1349 int emv_select(uint8_t* AID
, uint8_t AID_len
, void* data
)
1351 uint16_t selectCmd_len
= 4 + 1 + AID_len
+ 1;
1352 uint8_t selectCmd
[selectCmd_len
];
1354 selectCmd
[0] = 0x00;
1355 selectCmd
[1] = 0xA4;
1356 selectCmd
[2] = 0x04;
1357 selectCmd
[3] = 0x00;
1358 selectCmd
[4] = AID_len
;
1359 memcpy(&(selectCmd
[5]), AID
, AID_len
);
1360 selectCmd
[selectCmd_len
-1] = 0x00;
1361 return iso14_apdu(selectCmd
, selectCmd_len
, data
);
1364 //perform READ RECORD
1365 int emv_readrecord(uint8_t recordnumber
, uint8_t sfi
, void* data
)
1367 uint16_t readRecordCmd_len
= 5;
1368 uint8_t readRecordCmd
[readRecordCmd_len
];
1370 readRecordCmd
[0] = 0x00;
1371 readRecordCmd
[1] = 0xB2;
1372 readRecordCmd
[2] = recordnumber
;
1373 readRecordCmd
[3] = ((sfi
<< 3) | 0x04);
1374 readRecordCmd
[4] = 0x00;
1375 return iso14_apdu(readRecordCmd
, readRecordCmd_len
, data
);
1378 int emv_getprocessingoptions(uint8_t* pdol
, uint8_t pdol_len
, void* data
)
1380 uint16_t processingCmd_len
= 4 + 1 + 2 + pdol_len
+ 1;
1381 uint8_t processingCmd
[processingCmd_len
];
1383 processingCmd
[0] = 0x80;
1384 processingCmd
[1] = 0xA8;
1385 processingCmd
[2] = 0x00;
1386 processingCmd
[3] = 0x00;
1387 processingCmd
[4] = pdol_len
+ 2;
1388 processingCmd
[5] = 0x83; //template
1389 processingCmd
[6] = pdol_len
;
1391 memcpy(&(processingCmd
[7]), pdol
, pdol_len
);}
1392 processingCmd
[processingCmd_len
-1] = 0x00;
1393 return iso14_apdu(processingCmd
, processingCmd_len
, data
);
1396 int emv_computecryptogram(uint8_t* UDOL
, uint8_t UDOL_len
, void *data
)
1398 uint16_t cryptogramCmd_len
= 4 + 1 + UDOL_len
+ 1;
1399 uint8_t cryptogramCmd
[cryptogramCmd_len
];
1401 cryptogramCmd
[0] = 0x80;
1402 cryptogramCmd
[1] = 0x2A;
1403 cryptogramCmd
[2] = 0x8E;
1404 cryptogramCmd
[3] = 0x80;
1405 cryptogramCmd
[4] = UDOL_len
;
1406 memcpy(&(cryptogramCmd
[5]), UDOL
, UDOL_len
);
1407 cryptogramCmd
[cryptogramCmd_len
-1] = 0x00;
1409 return iso14_apdu(cryptogramCmd
, cryptogramCmd_len
, data
);
1412 int emv_getchallenge(void *data
)
1414 uint16_t challengeCmd_len
= 5;
1415 uint8_t challengeCmd
[challengeCmd_len
];
1417 challengeCmd
[0] = 0x00;
1418 challengeCmd
[1] = 0x84;
1419 challengeCmd
[2] = 0x00;
1420 challengeCmd
[3] = 0x00;
1421 challengeCmd
[4] = 0x00;
1423 return iso14_apdu(challengeCmd
, challengeCmd_len
, data
);
1426 int emv_loopback(uint8_t* transData
, uint8_t transData_len
, void *data
)
1428 uint16_t loopbackCmd_len
= 4 + 1 + transData_len
+ 1;
1429 uint8_t loopbackCmd
[loopbackCmd_len
];
1431 loopbackCmd
[0] = 0x00;
1432 loopbackCmd
[1] = 0xEE;
1433 loopbackCmd
[2] = 0x00;
1434 loopbackCmd
[3] = 0x00;
1435 loopbackCmd
[4] = loopbackCmd_len
;
1436 memcpy(&(loopbackCmd
[5]), transData
, transData_len
);
1437 return iso14_apdu(loopbackCmd
, loopbackCmd_len
, data
);
1441 int emv_generateAC(uint8_t refcontrolparam
, uint8_t* cdolinput
, uint8_t cdolinputlen
, void* data
)
1443 uint16_t acCmd_len
= 4 + 1 + cdolinputlen
+ 1;
1444 uint8_t acCmd
[acCmd_len
];
1448 acCmd
[2] = refcontrolparam
;
1450 acCmd
[4] = cdolinputlen
;
1451 memcpy(&(acCmd
[5]), cdolinput
, cdolinputlen
);
1452 acCmd
[acCmd_len
-1] = 0x00;
1453 Dbhexdump(acCmd_len
, acCmd
,false);
1454 return iso14_apdu(acCmd
, acCmd_len
, data
);
1457 int emv_decodeAFL(uint8_t* AFL
, uint8_t AFLlen
){
1461 //ICEMAN: move to client
1462 //Print out AIP Bit meanings
1463 int emv_decodeAIP(uint8_t* AIP
)
1465 if((AIP
[0] & AIP_SDA_SUPPORTED
) == AIP_SDA_SUPPORTED
)
1466 Dbprintf("SDA supported");
1467 if((AIP
[0] & AIP_DDA_SUPPORTED
) == AIP_DDA_SUPPORTED
)
1468 Dbprintf("DDA supported");
1469 if((AIP
[0] & AIP_CARDHOLDER_VERIFICATION
)==AIP_CARDHOLDER_VERIFICATION
)
1470 Dbprintf("Cardholder verification is supported");
1471 if((AIP
[0] & AIP_TERMINAL_RISK
) == AIP_TERMINAL_RISK
)
1472 Dbprintf("Terminal risk management is to be performed");
1473 if((AIP
[0] & AIP_ISSUER_AUTH
) == AIP_ISSUER_AUTH
)
1474 Dbprintf("Issuer authentication is supported ");
1475 if((AIP
[0] & AIP_CDA_SUPPORTED
) == AIP_CDA_SUPPORTED
)
1476 Dbprintf("CDA supported");
1477 if((AIP
[1] & AIP_CHIP_SUPPORTED
) == AIP_CHIP_SUPPORTED
)
1478 Dbprintf("Chip supported");
1479 if((AIP
[1] & AIP_MSR_SUPPORTED
) == AIP_MSR_SUPPORTED
)
1480 Dbprintf("MSR supported");
1484 //ICEMAN: move to client
1485 int emv_decodeCVM(uint8_t* CVM
, uint8_t CVMlen
)
1487 uint8_t counter
= 0;
1488 uint32_t amountX
= 0;
1489 uint32_t amountY
= 0;
1490 amountX
= bytes_to_num(CVM
, 4);
1491 amountY
= bytes_to_num(CVM
+4, 4);
1493 while(counter
< CVMlen
)
1495 if((CVM
[counter
] & 0x40) == 0x40){
1496 if((CVM
[counter
] & 0x3F)== 0x00){
1497 Dbprintf("Fail CVM processing");
1499 if((CVM
[counter
] & 0x3F) == 0x01){
1500 Dbprintf("Plaintext PIN verification performed by ICC");
1502 if((CVM
[counter
] & 0x3F) == 0x02){
1503 Dbprintf("Enciphered PIN verified online");
1505 if((CVM
[counter
] & 0x3F) == 0x03){
1506 Dbprintf("Plaintext PIN verification performed by ICC and signature (paper)");
1508 if((CVM
[counter
] & 0x3F) == 0x04){
1509 Dbprintf("Enciphered PIN verification performed by ICC");
1511 if((CVM
[counter
] & 0x3F) == 0x05){
1512 Dbprintf("Enciphered PIN verification performed by ICC and signature (paper)");
1514 if((CVM
[counter
] & 0x3F) == 0x30){
1515 Dbprintf("Signature (paper)");
1517 if((CVM
[counter
] & 0x7F) == 0x40){ // iceman, wrong masked used? changed from 0x3f -> 0x7f
1518 Dbprintf("No CVM required");
1523 Dbprintf("Fail cardholder verification if this CVM is unsuccessful");
1526 if(CVM
[counter
+1] == 0x00){
1527 Dbprintf("Always");}
1528 if(CVM
[counter
+1] == 0x01){
1529 Dbprintf("If unattended cash");}
1530 if(CVM
[counter
+1] == 0x02){
1531 Dbprintf("If not unattended cash and not manual cash and not purchase with cashback");}
1532 if(CVM
[counter
+1] == 0x03){
1533 Dbprintf("If terminal supports the CVM");}
1534 if(CVM
[counter
+1] == 0x04){
1535 Dbprintf("If manual cash");}
1536 if(CVM
[counter
+1] == 0x05){
1537 Dbprintf("If purchase with cashback");}
1538 if(CVM
[counter
+1] == 0x06){
1539 Dbprintf("If transaction is in the application currency and is under %lu value", amountX
);}
1540 if(CVM
[counter
+1] == 0x07){
1541 Dbprintf("If transaction is in the application currency and is over %lu value", amountX
);}
1542 if(CVM
[counter
+1] == 0x08){
1543 Dbprintf("If transaction is in the application currency and is under %lu value", amountY
);}
1544 if(CVM
[counter
+1] == 0x09){
1545 Dbprintf("If transaction is in the application currency and is over %lu value", amountY
);}
1550 //ICEMAN: move to client
1551 //dump the current card to the console
1552 void dumpCard(emvtags
* currentcard
){
1553 DUMP(currentcard
->ATQA
);
1554 Dbhexdump(sizeof(currentcard
->ATQA
), currentcard
->ATQA
, false);
1555 DUMP(currentcard
->UID
);
1556 Dbhexdump(currentcard
->UID_len
, currentcard
->UID
, false);
1557 DUMP(currentcard
->SAK1
);
1558 Dbhexdump(1, ¤tcard
->SAK1
, false);
1559 DUMP(currentcard
->SAK2
);
1560 Dbhexdump(1, ¤tcard
->SAK2
, false);
1561 DUMP(currentcard
->ATS
);
1562 Dbhexdump(currentcard
->ATS_len
, currentcard
->ATS
, false);
1564 DUMP(currentcard
->tag_4F
);
1565 Dbhexdump(currentcard
->tag_4F_len
, currentcard
->tag_4F
, false);
1566 DUMP(currentcard
->tag_50
);
1567 Dbhexdump(currentcard
->tag_50_len
, currentcard
->tag_50
, false);
1568 DUMP(currentcard
->tag_56
);
1569 Dbhexdump(currentcard
->tag_56_len
, currentcard
->tag_56
, false);
1570 DUMP(currentcard
->tag_57
);
1571 Dbhexdump(currentcard
->tag_57_len
, currentcard
->tag_57
, false);
1572 DUMP(currentcard
->tag_5A
);
1573 Dbhexdump(currentcard
->tag_5A_len
, currentcard
->tag_5A
, false);
1574 DUMP(currentcard
->tag_82
);
1575 Dbhexdump(sizeof(currentcard
->tag_82
), currentcard
->tag_82
, false);
1576 DUMP(currentcard
->tag_84
);
1577 Dbhexdump(currentcard
->tag_84_len
, currentcard
->tag_84
, false);
1578 DUMP(currentcard
->tag_86
);
1579 Dbhexdump(currentcard
->tag_86_len
, currentcard
->tag_86
, false);
1580 DUMP(currentcard
->tag_87
);
1581 Dbhexdump(1, currentcard
->tag_87
, false);
1582 DUMP(currentcard
->tag_88
);
1583 Dbhexdump(1, currentcard
->tag_88
, false);
1584 DUMP(currentcard
->tag_8A
);
1585 Dbhexdump(2, currentcard
->tag_8A
, false);
1586 DUMP(currentcard
->tag_8C
);
1587 Dbhexdump(currentcard
->tag_8C_len
, currentcard
->tag_8C
, false);
1588 DUMP(currentcard
->tag_8D
);
1589 Dbhexdump(currentcard
->tag_8D_len
, currentcard
->tag_8D
, false);
1590 DUMP(currentcard
->tag_8E
);
1591 Dbhexdump(currentcard
->tag_8E_len
, currentcard
->tag_8E
, false);
1592 DUMP(currentcard
->tag_8F
);
1593 Dbhexdump(1, currentcard
->tag_8F
, false);
1594 DUMP(currentcard
->tag_90
);
1595 Dbhexdump(currentcard
->tag_90_len
, currentcard
->tag_90
, false);
1596 DUMP(currentcard
->tag_92
);
1597 Dbhexdump(currentcard
->tag_92_len
, currentcard
->tag_92
, false);
1598 DUMP(currentcard
->tag_93
);
1599 Dbhexdump(currentcard
->tag_93_len
, currentcard
->tag_93
, false);
1600 DUMP(currentcard
->tag_94
);
1601 Dbhexdump(currentcard
->tag_94_len
, currentcard
->tag_94
, false);
1602 DUMP(currentcard
->tag_95
);
1603 Dbhexdump(5, currentcard
->tag_95
, false);
1604 DUMP(currentcard
->tag_97
);
1605 Dbhexdump(currentcard
->tag_97_len
, currentcard
->tag_97
, false);
1606 DUMP(currentcard
->tag_98
);
1607 Dbhexdump(20, currentcard
->tag_98
, false);
1608 DUMP(currentcard
->tag_99
);
1609 Dbhexdump(currentcard
->tag_99_len
, currentcard
->tag_99
, false);
1610 DUMP(currentcard
->tag_9A
);
1611 Dbhexdump(3, currentcard
->tag_9A
, false);
1612 DUMP(currentcard
->tag_9B
);
1613 Dbhexdump(2, currentcard
->tag_9B
, false);
1614 DUMP(currentcard
->tag_9C
);
1615 Dbhexdump(1, currentcard
->tag_9C
, false);
1616 DUMP(currentcard
->tag_9D
);
1617 Dbhexdump(currentcard
->tag_9D_len
, currentcard
->tag_9D
, false);
1618 DUMP(currentcard
->tag_CD
);
1619 Dbhexdump(3, currentcard
->tag_CD
, false);
1620 DUMP(currentcard
->tag_CE
);
1621 Dbhexdump(3, currentcard
->tag_CE
, false);
1622 DUMP(currentcard
->tag_CF
);
1623 Dbhexdump(3, currentcard
->tag_CF
, false);
1624 DUMP(currentcard
->tag_D7
);
1625 Dbhexdump(3, currentcard
->tag_D7
, false);
1626 DUMP(currentcard
->tag_D8
);
1627 Dbhexdump(2, currentcard
->tag_D8
, false);
1628 DUMP(currentcard
->tag_D9
);
1629 Dbhexdump(currentcard
->tag_D9_len
, currentcard
->tag_D9
, false);
1630 DUMP(currentcard
->tag_DA
);
1631 Dbhexdump(2, currentcard
->tag_DA
, false);
1632 DUMP(currentcard
->tag_DB
);
1633 Dbhexdump(2, currentcard
->tag_DB
, false);
1634 DUMP(currentcard
->tag_DC
);
1635 Dbhexdump(2, currentcard
->tag_DC
, false);
1636 DUMP(currentcard
->tag_DD
);
1637 Dbhexdump(2, currentcard
->tag_DD
, false);
1638 DUMP(currentcard
->tag_AF
);
1639 Dbhexdump(currentcard
->tag_AF_len
, currentcard
->tag_AF
, false);
1640 DUMP(currentcard
->tag_5F20
);
1641 Dbhexdump(currentcard
->tag_5F20_len
, currentcard
->tag_5F20
, false);
1642 DUMP(currentcard
->tag_5F24
);
1643 Dbhexdump(3, currentcard
->tag_5F24
, false);
1644 DUMP(currentcard
->tag_5F25
);
1645 Dbhexdump(3, currentcard
->tag_5F25
, false);
1646 DUMP(currentcard
->tag_5F28
);
1647 Dbhexdump(2, currentcard
->tag_5F28
, false);
1648 DUMP(currentcard
->tag_5F2A
);
1649 Dbhexdump(2, currentcard
->tag_5F2A
, false);
1650 DUMP(currentcard
->tag_5F2D
);
1651 Dbhexdump(currentcard
->tag_5F2D_len
, currentcard
->tag_5F2D
, false);
1652 DUMP(currentcard
->tag_5F30
);
1653 Dbhexdump(3, currentcard
->tag_5F30
, false);
1654 DUMP(currentcard
->tag_5F34
);
1655 Dbhexdump(1, currentcard
->tag_5F34
, false);
1656 DUMP(currentcard
->tag_5F36
);
1657 Dbhexdump(2, currentcard
->tag_5F36
, false);
1658 DUMP(currentcard
->tag_5F50
);
1659 Dbhexdump(currentcard
->tag_5F50_len
, currentcard
->tag_5F50
, false);
1660 DUMP(currentcard
->tag_5F54
);
1661 Dbhexdump(currentcard
->tag_5F54_len
, currentcard
->tag_5F54
, false);
1662 DUMP(currentcard
->tag_9F01
);
1663 Dbhexdump(6, currentcard
->tag_9F01
, false);
1664 DUMP(currentcard
->tag_9F02
);
1665 Dbhexdump(6, currentcard
->tag_9F02
, false);
1666 DUMP(currentcard
->tag_9F03
);
1667 Dbhexdump(6, currentcard
->tag_9F03
, false);
1668 DUMP(currentcard
->tag_9F04
);
1669 Dbhexdump(4, currentcard
->tag_9F04
, false);
1670 DUMP(currentcard
->tag_9F05
);
1671 Dbhexdump(currentcard
->tag_9F05_len
, currentcard
->tag_9F05
, false);
1672 DUMP(currentcard
->tag_9F06
);
1673 Dbhexdump(currentcard
->tag_9F06_len
, currentcard
->tag_9F06
, false);
1674 DUMP(currentcard
->tag_9F07
);
1675 Dbhexdump(2, currentcard
->tag_9F07
, false);
1676 DUMP(currentcard
->tag_9F08
);
1677 Dbhexdump(2, currentcard
->tag_9F08
, false);
1678 DUMP(currentcard
->tag_9F09
);
1679 Dbhexdump(2, currentcard
->tag_9F09
, false);
1680 DUMP(currentcard
->tag_9F0B
);
1681 Dbhexdump(currentcard
->tag_9F0B_len
, currentcard
->tag_9F0B
, false);
1682 DUMP(currentcard
->tag_9F0D
);
1683 Dbhexdump(5, currentcard
->tag_9F0D
, false);
1684 DUMP(currentcard
->tag_9F0E
);
1685 Dbhexdump(5, currentcard
->tag_9F0E
, false);
1686 DUMP(currentcard
->tag_9F0F
);
1687 Dbhexdump(5, currentcard
->tag_9F0F
, false);
1688 DUMP(currentcard
->tag_9F10
);
1689 Dbhexdump(currentcard
->tag_9F10_len
, currentcard
->tag_9F10
, false);
1690 DUMP(currentcard
->tag_9F11
);
1691 Dbhexdump(1, currentcard
->tag_9F11
, false);
1692 DUMP(currentcard
->tag_9F12
);
1693 Dbhexdump(currentcard
->tag_9F12_len
, currentcard
->tag_9F12
, false);
1694 DUMP(currentcard
->tag_9F13
);
1695 Dbhexdump(2, currentcard
->tag_9F13
, false);
1696 DUMP(currentcard
->tag_9F14
);
1697 Dbhexdump(1, currentcard
->tag_9F14
, false);
1698 DUMP(currentcard
->tag_9F15
);
1699 Dbhexdump(2, currentcard
->tag_9F15
, false);
1700 DUMP(currentcard
->tag_9F16
);
1701 Dbhexdump(15, currentcard
->tag_9F16
, false);
1702 DUMP(currentcard
->tag_9F17
);
1703 Dbhexdump(1, currentcard
->tag_9F17
, false);
1704 DUMP(currentcard
->tag_9F18
);
1705 Dbhexdump(4, currentcard
->tag_9F18
, false);
1706 DUMP(currentcard
->tag_9F1A
);
1707 Dbhexdump(2, currentcard
->tag_9F1A
, false);
1708 DUMP(currentcard
->tag_9F1B
);
1709 Dbhexdump(4, currentcard
->tag_9F1B
, false);
1710 DUMP(currentcard
->tag_9F1C
);
1711 Dbhexdump(8, currentcard
->tag_9F1C
, false);
1712 DUMP(currentcard
->tag_9F1D
);
1713 Dbhexdump(currentcard
->tag_9F1D_len
, currentcard
->tag_9F1D
, false);
1714 DUMP(currentcard
->tag_9F1E
);
1715 Dbhexdump(8, currentcard
->tag_9F1E
, false);
1716 DUMP(currentcard
->tag_9F1F
);
1717 Dbhexdump(currentcard
->tag_9F1F_len
, currentcard
->tag_9F1F
, false);
1718 DUMP(currentcard
->tag_9F20
);
1719 Dbhexdump(currentcard
->tag_9F20_len
, currentcard
->tag_9F20
, false);
1720 DUMP(currentcard
->tag_9F21
);
1721 Dbhexdump(3, currentcard
->tag_9F1E
, false);
1722 DUMP(currentcard
->tag_9F22
);
1723 Dbhexdump(1, currentcard
->tag_9F22
, false);
1724 DUMP(currentcard
->tag_9F23
);
1725 Dbhexdump(1, currentcard
->tag_9F23
, false);
1726 DUMP(currentcard
->tag_9F26
);
1727 Dbhexdump(8, currentcard
->tag_9F26
, false);
1728 DUMP(currentcard
->tag_9F27
);
1729 Dbhexdump(1, currentcard
->tag_9F27
, false);
1730 DUMP(currentcard
->tag_9F2D
);
1731 Dbhexdump(currentcard
->tag_9F2D_len
, currentcard
->tag_9F2D
, false);
1732 DUMP(currentcard
->tag_9F2E
);
1733 Dbhexdump(3, currentcard
->tag_9F2E
, false);
1734 DUMP(currentcard
->tag_9F2F
);
1735 Dbhexdump(currentcard
->tag_9F2F_len
, currentcard
->tag_9F2F
, false);
1736 DUMP(currentcard
->tag_9F32
);
1737 Dbhexdump(currentcard
->tag_9F32_len
, currentcard
->tag_9F32
, false);
1738 DUMP(currentcard
->tag_9F33
);
1739 Dbhexdump(3, currentcard
->tag_9F33
, false);
1740 DUMP(currentcard
->tag_9F34
);
1741 Dbhexdump(3, currentcard
->tag_9F34
, false);
1742 DUMP(currentcard
->tag_9F35
);
1743 Dbhexdump(1, currentcard
->tag_9F35
, false);
1744 DUMP(currentcard
->tag_9F36
);
1745 Dbhexdump(2, currentcard
->tag_9F36
, false);
1746 DUMP(currentcard
->tag_9F37
);
1747 Dbhexdump(4, currentcard
->tag_9F37
, false);
1748 DUMP(currentcard
->tag_9F38
);
1749 Dbhexdump(currentcard
->tag_9F38_len
, currentcard
->tag_9F38
, false);
1750 DUMP(currentcard
->tag_9F39
);
1751 Dbhexdump(1, currentcard
->tag_9F39
, false);
1752 DUMP(currentcard
->tag_9F39
);
1753 Dbhexdump(1, currentcard
->tag_9F39
, false);
1754 DUMP(currentcard
->tag_9F40
);
1755 Dbhexdump(5, currentcard
->tag_9F40
, false);
1756 DUMP(currentcard
->tag_9F41
);
1757 Dbhexdump(4, currentcard
->tag_9F41
, false);
1758 DUMP(currentcard
->tag_9F42
);
1759 Dbhexdump(2, currentcard
->tag_9F42
, false);
1760 DUMP(currentcard
->tag_9F43
);
1761 Dbhexdump(4, currentcard
->tag_9F43
, false);
1762 DUMP(currentcard
->tag_9F44
);
1763 Dbhexdump(1, currentcard
->tag_9F44
, false);
1764 DUMP(currentcard
->tag_9F45
);
1765 Dbhexdump(2, currentcard
->tag_9F45
, false);
1766 DUMP(currentcard
->tag_9F46
);
1767 Dbhexdump(currentcard
->tag_9F46_len
, currentcard
->tag_9F46
, false);
1768 DUMP(currentcard
->tag_9F47
);
1769 Dbhexdump(currentcard
->tag_9F47_len
, currentcard
->tag_9F47
, false);
1770 DUMP(currentcard
->tag_9F48
);
1771 Dbhexdump(currentcard
->tag_9F48_len
, currentcard
->tag_9F48
, false);
1772 DUMP(currentcard
->tag_9F49
);
1773 Dbhexdump(currentcard
->tag_9F49_len
, currentcard
->tag_9F49
, false);
1774 DUMP(currentcard
->tag_9F4A
);
1775 Dbhexdump(1, currentcard
->tag_9F4A
, false);
1776 DUMP(currentcard
->tag_9F4B
);
1777 Dbhexdump(currentcard
->tag_9F4B_len
, currentcard
->tag_9F4B
, false);
1778 DUMP(currentcard
->tag_9F4C
);
1779 Dbhexdump(8, currentcard
->tag_9F4C
, false);
1780 DUMP(currentcard
->tag_9F4D
);
1781 Dbhexdump(2, currentcard
->tag_9F4D
, false);
1782 DUMP(currentcard
->tag_9F4E
);
1783 Dbhexdump(255, currentcard
->tag_9F4E
, false);
1784 DUMP(currentcard
->tag_9F60
);
1785 Dbhexdump(2, currentcard
->tag_9F60
, false);
1786 DUMP(currentcard
->tag_9F61
);
1787 Dbhexdump(2, currentcard
->tag_9F61
, false);
1788 DUMP(currentcard
->tag_9F62
);
1789 Dbhexdump(6, currentcard
->tag_9F62
, false);
1790 DUMP(currentcard
->tag_9F63
);
1791 Dbhexdump(6, currentcard
->tag_9F63
, false);
1792 DUMP(currentcard
->tag_9F64
);
1793 Dbhexdump(1, currentcard
->tag_9F64
, false);
1794 DUMP(currentcard
->tag_9F65
);
1795 Dbhexdump(2, currentcard
->tag_9F65
, false);
1796 DUMP(currentcard
->tag_9F66
);
1797 Dbhexdump(2, currentcard
->tag_9F66
, false);
1798 DUMP(currentcard
->tag_9F67
);
1799 Dbhexdump(1, currentcard
->tag_9F67
, false);
1800 DUMP(currentcard
->tag_9F68
);
1801 Dbhexdump(currentcard
->tag_9F68_len
, currentcard
->tag_9F68
, false);
1802 DUMP(currentcard
->tag_9F69
);
1803 Dbhexdump(currentcard
->tag_9F69_len
, currentcard
->tag_9F69
, false);
1804 DUMP(currentcard
->tag_9F6A
);
1805 Dbhexdump(8, currentcard
->tag_9F6A
, false);
1806 DUMP(currentcard
->tag_9F6B
);
1807 Dbhexdump(currentcard
->tag_9F6B_len
, currentcard
->tag_9F6B
, false);
1808 DUMP(currentcard
->tag_9F6C
);
1809 Dbhexdump(2, currentcard
->tag_9F6C
, false);
1810 DUMP(currentcard
->tag_61
);
1811 Dbhexdump(currentcard
->tag_61_len
, currentcard
->tag_61
, false);
1812 DUMP(currentcard
->tag_A5
);
1813 Dbhexdump(currentcard
->tag_A5_len
, currentcard
->tag_A5
, false);
1814 DUMP(currentcard
->tag_DFNAME
);
1815 Dbhexdump(currentcard
->tag_DFNAME_len
, currentcard
->tag_DFNAME
, false);
1816 DUMP(currentcard
->tag_70
);
1817 Dbhexdump(currentcard
->tag_70_len
, currentcard
->tag_70
, false);
1818 DUMP(currentcard
->tag_77
);
1819 Dbhexdump(currentcard
->tag_77_len
, currentcard
->tag_77
, false);
1820 DUMP(currentcard
->tag_80
);
1821 Dbhexdump(currentcard
->tag_80_len
, currentcard
->tag_80
, false);
1822 DUMP(currentcard
->tag_91
);
1823 Dbhexdump(currentcard
->tag_91_len
, currentcard
->tag_91
, false);
1824 DUMP(currentcard
->tag_BF0C
);
1825 Dbhexdump(currentcard
->tag_BF0C_len
, currentcard
->tag_BF0C
, false);
1826 DUMP(currentcard
->tag_DFName
);
1827 Dbhexdump(currentcard
->tag_DFName_len
, currentcard
->tag_DFName
, false);