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 //-----------------------------------------------------------------------------
12 #include "proxmark3.h"
19 #include "iso14443crc.h"
20 #include "iso14443a.h"
22 #include "emvdataels.h" //EMV data elements
23 #include "emvtags.h" //EMV card structure
25 #define DUMP(varname) Dbprintf("%s=", #varname);
27 int EMV_DBGLEVEL
= EMV_DBG_ALL
;
28 //uint8_t PCB = 0x00; //track Protocol Control Byte externally
31 //print detected tag name over the serial link
32 int emv_printtag(uint8_t* selected_tag
, emvtags
* inputcard
, uint8_t* outputstring
, uint8_t* outputlen
)
34 //search tag list and print the match
35 //get the value of the tag
36 uint8_t tagvalue
[255];
38 emv_lookuptag(selected_tag
, inputcard
, tagvalue
, &tagvaluelen
);
39 //loop through selected tag, print the value found
40 for(int i
=0; i
<(sizeof(EMV_TAG_LIST
)/sizeof(EMV_TAG_LIST
[0])); i
++){
41 if(!memcmp(selected_tag
, EMV_TAG_LIST
[i
].tag
, 2)){
42 memcpy(outputstring
, EMV_TAG_LIST
[i
].description
, strlen(EMV_TAG_LIST
[i
].description
));
43 memcpy(outputstring
+(strlen(EMV_TAG_LIST
[i
].description
)), "=", 1);
44 memcpy(outputstring
+(strlen(EMV_TAG_LIST
[i
].description
))+1, tagvalue
, tagvaluelen
);
45 *outputlen
= strlen(EMV_TAG_LIST
[i
].description
) + 1 + tagvaluelen
;
52 //returns the value of the emv tag in the supplied emvtags structure
53 int emv_lookuptag(uint8_t* tag
, emvtags
*currentcard
, uint8_t* outputval
, uint8_t* outputvallen
)
55 //loop through tag and return the appropriate value
56 uint8_t returnedtag
[255];
57 uint8_t returnedlength
;
58 memset(returnedtag
, 0x00, sizeof(returnedtag
));
59 if(!memcmp(tag
, "\x4F\x00",2)){
60 memcpy(&returnedtag
, currentcard
->tag_4F
, currentcard
->tag_4F_len
);
61 returnedlength
= currentcard
->tag_4F_len
; goto exitfunction
;}
62 else if(!memcmp(tag
, "\x50\x00",2)){
63 memcpy(&returnedtag
, currentcard
->tag_50
, currentcard
->tag_50_len
);
64 returnedlength
= currentcard
->tag_50_len
; goto exitfunction
;}
65 else if(!memcmp(tag
, "\x56\x00",2)){
66 memcpy(&returnedtag
, currentcard
->tag_56
, currentcard
->tag_56_len
);
67 returnedlength
= currentcard
->tag_56_len
; goto exitfunction
;}
68 else if(!memcmp(tag
, "\x57\x00",2)){
69 memcpy(&returnedtag
, currentcard
->tag_57
, currentcard
->tag_57_len
);
70 returnedlength
= currentcard
->tag_57_len
; goto exitfunction
;}
71 else if(!memcmp(tag
, "\x5A\x00",2)){
72 memcpy(&returnedtag
, currentcard
->tag_5A
, currentcard
->tag_5A_len
);
73 returnedlength
= currentcard
->tag_5A_len
; goto exitfunction
;}
74 else if(!memcmp(tag
, "\x82\x00",2)){
75 memcpy(&returnedtag
, currentcard
->tag_82
, sizeof(currentcard
->tag_82
));
76 returnedlength
= sizeof(currentcard
->tag_82
);goto exitfunction
;}
77 else if(!memcmp(tag
, "\x84\x00",2)){
78 memcpy(&returnedtag
, currentcard
->tag_84
, currentcard
->tag_84_len
);
79 returnedlength
= currentcard
->tag_84_len
; goto exitfunction
;}
80 else if(!memcmp(tag
, "\x86\x00",2)){
81 memcpy(&returnedtag
, currentcard
->tag_86
, currentcard
->tag_86_len
);
82 returnedlength
= currentcard
->tag_86_len
; goto exitfunction
;}
83 else if(!memcmp(tag
, "\x87\x00",2)){
84 memcpy(&returnedtag
, currentcard
->tag_87
, sizeof(currentcard
->tag_87
));
85 returnedlength
= sizeof(currentcard
->tag_87
);goto exitfunction
;}
86 else if(!memcmp(tag
, "\x88\x00",2)){
87 memcpy(&returnedtag
, currentcard
->tag_88
, currentcard
->tag_50_len
);
88 returnedlength
= sizeof(currentcard
->tag_88
); goto exitfunction
;}
89 else if(!memcmp(tag
, "\x8A\x00",2)){
90 memcpy(&returnedtag
, currentcard
->tag_8A
, sizeof(currentcard
->tag_8A
));
91 returnedlength
= sizeof(currentcard
->tag_8A
);goto exitfunction
;}
92 else if(!memcmp(tag
, "\x8C\x00",2)){
93 memcpy(&returnedtag
, currentcard
->tag_8C
, currentcard
->tag_8C_len
);
94 returnedlength
= currentcard
->tag_8C_len
; goto exitfunction
;}
95 else if(!memcmp(tag
, "\x8D\x00",2)){
96 memcpy(&returnedtag
, currentcard
->tag_8D
, currentcard
->tag_8D_len
);
97 returnedlength
= currentcard
->tag_8D_len
; goto exitfunction
;}
98 else if(!memcmp(tag
, "\x8E\x00",2)){
99 memcpy(&returnedtag
, currentcard
->tag_8E
, currentcard
->tag_8E_len
);
100 returnedlength
= currentcard
->tag_8E_len
; goto exitfunction
;}
101 else if(!memcmp(tag
, "\x8F\x00",2)){
102 memcpy(&returnedtag
, currentcard
->tag_8F
, sizeof(currentcard
->tag_8F
));
103 returnedlength
= sizeof(currentcard
->tag_8F
);goto exitfunction
;}
104 else if(!memcmp(tag
, "\x90\x00",2)){
105 memcpy(&returnedtag
, currentcard
->tag_90
, currentcard
->tag_90_len
);
106 returnedlength
= currentcard
->tag_90_len
; goto exitfunction
;}
107 else if(!memcmp(tag
, "\x92\x00",2)){
108 memcpy(&returnedtag
, currentcard
->tag_92
, currentcard
->tag_92_len
);
109 returnedlength
= currentcard
->tag_92_len
; goto exitfunction
;}
110 else if(!memcmp(tag
, "\x93\x00",2)){
111 memcpy(&returnedtag
, currentcard
->tag_93
, currentcard
->tag_93_len
);
112 returnedlength
= currentcard
->tag_93_len
; goto exitfunction
;}
113 else if(!memcmp(tag
, "\x94\x00",2)){
114 memcpy(&returnedtag
, currentcard
->tag_94
, currentcard
->tag_94_len
);
115 returnedlength
= currentcard
->tag_94_len
; goto exitfunction
;}
116 else if(!memcmp(tag
, "\x95\x00",2)){
117 memcpy(&returnedtag
, currentcard
->tag_95
, sizeof(currentcard
->tag_95
));
118 returnedlength
= sizeof(currentcard
->tag_95
);goto exitfunction
;}
119 else if(!memcmp(tag
, "\x97\x00",2)){
120 memcpy(&returnedtag
, currentcard
->tag_97
, currentcard
->tag_97_len
);
121 returnedlength
= currentcard
->tag_97_len
; goto exitfunction
;}
122 else if(!memcmp(tag
, "\x98\x00",2)){
123 memcpy(&returnedtag
, currentcard
->tag_98
, sizeof(currentcard
->tag_98
));
124 returnedlength
= sizeof(currentcard
->tag_98
);goto exitfunction
;}
125 else if(!memcmp(tag
, "\x99\x00",2)){
126 memcpy(&returnedtag
, currentcard
->tag_99
, currentcard
->tag_99_len
);
127 returnedlength
= currentcard
->tag_99_len
; goto exitfunction
;}
128 else if(!memcmp(tag
, "\x9A\x00",2)){
129 memcpy(&returnedtag
, currentcard
->tag_9A
, sizeof(currentcard
->tag_9A
));
130 returnedlength
= sizeof(currentcard
->tag_9A
);goto exitfunction
;}
131 else if(!memcmp(tag
, "\x9B\x00",2)){
132 memcpy(&returnedtag
, currentcard
->tag_9B
, sizeof(currentcard
->tag_9B
));
133 returnedlength
= sizeof(currentcard
->tag_9B
);goto exitfunction
;}
134 else if(!memcmp(tag
, "\x9C\x00",2)){
135 memcpy(&returnedtag
, currentcard
->tag_9C
, sizeof(currentcard
->tag_9C
));
136 returnedlength
= sizeof(currentcard
->tag_9C
);goto exitfunction
;}
137 else if(!memcmp(tag
, "\x9D\x00",2)){
138 memcpy(&returnedtag
, currentcard
->tag_9D
, currentcard
->tag_9D_len
);
139 returnedlength
= currentcard
->tag_9D_len
; goto exitfunction
;}
140 else if(!memcmp(tag
, "\x9D\x00",2)){
141 memcpy(&returnedtag
, currentcard
->tag_9D
, currentcard
->tag_9D_len
);
142 returnedlength
= currentcard
->tag_9D_len
; goto exitfunction
;}
143 else if(!memcmp(tag
, "\xCD\x00",2)){
144 memcpy(&returnedtag
, currentcard
->tag_CD
, sizeof(currentcard
->tag_CD
));
145 returnedlength
= sizeof(currentcard
->tag_CD
);goto exitfunction
;}
146 else if(!memcmp(tag
, "\xCE\x00",2)){
147 memcpy(&returnedtag
, currentcard
->tag_CE
, sizeof(currentcard
->tag_CE
));
148 returnedlength
= sizeof(currentcard
->tag_CE
);goto exitfunction
;}
149 else if(!memcmp(tag
, "\xCF\x00",2)){
150 memcpy(&returnedtag
, currentcard
->tag_CF
, sizeof(currentcard
->tag_CF
));
151 returnedlength
= sizeof(currentcard
->tag_CF
);goto exitfunction
;}
152 else if(!memcmp(tag
, "\xD7\x00",2)){
153 memcpy(&returnedtag
, currentcard
->tag_D7
, sizeof(currentcard
->tag_D7
));
154 returnedlength
= sizeof(currentcard
->tag_D7
);goto exitfunction
;}
155 else if(!memcmp(tag
, "\xD8\x00",2)){
156 memcpy(&returnedtag
, currentcard
->tag_D8
, sizeof(currentcard
->tag_D8
));
157 returnedlength
= sizeof(currentcard
->tag_D8
);goto exitfunction
;}
158 else if(!memcmp(tag
, "\xD9\x00",2)){
159 memcpy(&returnedtag
, currentcard
->tag_D9
, currentcard
->tag_D9_len
);
160 returnedlength
= currentcard
->tag_D9_len
;goto exitfunction
;}
161 else if(!memcmp(tag
, "\xDA\x00",2)){
162 memcpy(&returnedtag
, currentcard
->tag_DA
, sizeof(currentcard
->tag_DA
));
163 returnedlength
= sizeof(currentcard
->tag_DA
);goto exitfunction
;}
164 else if(!memcmp(tag
, "\xDB\x00",2)){
165 memcpy(&returnedtag
, currentcard
->tag_DB
, sizeof(currentcard
->tag_DB
));
166 returnedlength
= sizeof(currentcard
->tag_DB
);goto exitfunction
;}
167 else if(!memcmp(tag
, "\xDC\x00",2)){
168 memcpy(&returnedtag
, currentcard
->tag_DC
, sizeof(currentcard
->tag_DC
));
169 returnedlength
= sizeof(currentcard
->tag_DC
);goto exitfunction
;}
170 else if(!memcmp(tag
, "\xDD\x00",2)){
171 memcpy(&returnedtag
, currentcard
->tag_DD
, sizeof(currentcard
->tag_DD
));
172 returnedlength
= sizeof(currentcard
->tag_DD
);goto exitfunction
;}
173 else if(!memcmp(tag
, "\xA5\x00",2)){
174 memcpy(&returnedtag
, currentcard
->tag_A5
, currentcard
->tag_A5_len
);
175 returnedlength
= currentcard
->tag_A5_len
; goto exitfunction
;}
176 else if(!memcmp(tag
, "\xAF\x00",2)){
177 memcpy(&returnedtag
, currentcard
->tag_AF
, currentcard
->tag_AF_len
);
178 returnedlength
= currentcard
->tag_AF_len
; goto exitfunction
;}
180 if(*(tag
+1) == 0x20){
181 memcpy(&returnedtag
, currentcard
->tag_5F20
, currentcard
->tag_5F20_len
);
182 returnedlength
= currentcard
->tag_5F20_len
; goto exitfunction
;}
183 else if(*(tag
+1) == 0x24){
184 memcpy(&returnedtag
, currentcard
->tag_5F24
, sizeof(currentcard
->tag_5F24
));
185 returnedlength
= sizeof(currentcard
->tag_5F24
);goto exitfunction
;}
186 else if(*(tag
+1) == 0x25){
187 memcpy(&returnedtag
, currentcard
->tag_5F25
, sizeof(currentcard
->tag_5F25
));
188 returnedlength
= sizeof(currentcard
->tag_5F25
);goto exitfunction
;}
189 else if(*(tag
+1) == 0x28){
190 memcpy(&returnedtag
, currentcard
->tag_5F28
, sizeof(currentcard
->tag_5F28
));
191 returnedlength
= sizeof(currentcard
->tag_5F28
);goto exitfunction
;}
192 else if(*(tag
+1) == 0x2A){
193 memcpy(&returnedtag
, currentcard
->tag_5F2A
, sizeof(currentcard
->tag_5F2A
));
194 returnedlength
= sizeof(currentcard
->tag_5F2A
);goto exitfunction
;}
195 else if(*(tag
+1) == 0x2D){
196 memcpy(&returnedtag
, currentcard
->tag_5F2D
, currentcard
->tag_5F2D_len
);
197 returnedlength
= currentcard
->tag_5F2D_len
; goto exitfunction
;}
198 else if(*(tag
+1) == 0x30){
199 memcpy(&returnedtag
, currentcard
->tag_5F30
, sizeof(currentcard
->tag_5F30
));
200 returnedlength
= sizeof(currentcard
->tag_5F30
);goto exitfunction
;}
201 else if(*(tag
+1) == 0x34){
202 memcpy(&returnedtag
, currentcard
->tag_5F34
, sizeof(currentcard
->tag_5F34
));
203 returnedlength
= sizeof(currentcard
->tag_5F34
);goto exitfunction
;}
204 else if(*(tag
+1) == 0x36){
205 memcpy(&returnedtag
, currentcard
->tag_5F36
, sizeof(currentcard
->tag_5F36
));
206 returnedlength
= sizeof(currentcard
->tag_5F36
);goto exitfunction
;}
207 else if(*(tag
+1) == 0x50){
208 memcpy(&returnedtag
, currentcard
->tag_5F50
, currentcard
->tag_5F50_len
);
209 returnedlength
= currentcard
->tag_5F50_len
; goto exitfunction
;}
210 else if(*(tag
+1) == 0x54){
211 memcpy(&returnedtag
, currentcard
->tag_5F54
, currentcard
->tag_5F54_len
);
212 returnedlength
= currentcard
->tag_5F54_len
; goto exitfunction
;}
215 if(*(tag
+1) == 0x01){
216 memcpy(&returnedtag
, currentcard
->tag_9F01
, sizeof(currentcard
->tag_9F01
));
217 returnedlength
= sizeof(currentcard
->tag_9F01
);goto exitfunction
;}
218 else if(*(tag
+1) == 0x02){
219 memcpy(&returnedtag
, currentcard
->tag_9F02
, sizeof(currentcard
->tag_9F02
));
220 returnedlength
= sizeof(currentcard
->tag_9F02
);goto exitfunction
;}
221 else if(*(tag
+1) == 0x03){
222 returnedlength
= sizeof(currentcard
->tag_9F03
);goto exitfunction
;}
223 else if(*(tag
+1) == 0x04){
224 memcpy(&returnedtag
, currentcard
->tag_9F04
, sizeof(currentcard
->tag_9F04
));
225 returnedlength
= sizeof(currentcard
->tag_9F04
);goto exitfunction
;}
226 else if(*(tag
+1) == 0x05){
227 memcpy(&returnedtag
, currentcard
->tag_9F05
, currentcard
->tag_9F05_len
);
228 returnedlength
= currentcard
->tag_9F05_len
; goto exitfunction
;}
229 else if(*(tag
+1) == 0x06){
230 memcpy(&returnedtag
, currentcard
->tag_9F06
, currentcard
->tag_9F06_len
);
231 returnedlength
= currentcard
->tag_9F06_len
; goto exitfunction
;}
232 else if(*(tag
+1) == 0x07){
233 memcpy(&returnedtag
, currentcard
->tag_9F07
, sizeof(currentcard
->tag_9F07
));
234 returnedlength
= sizeof(currentcard
->tag_9F07
);goto exitfunction
;}
235 else if(*(tag
+1) == 0x08){
236 memcpy(&returnedtag
, currentcard
->tag_9F08
, sizeof(currentcard
->tag_9F08
));
237 returnedlength
= sizeof(currentcard
->tag_9F08
);goto exitfunction
;}
238 else if(*(tag
+1) == 0x09){
239 memcpy(&returnedtag
, currentcard
->tag_9F09
, sizeof(currentcard
->tag_9F09
));
240 returnedlength
= sizeof(currentcard
->tag_9F09
);goto exitfunction
;}
241 else if(*(tag
+1) == 0x0B){
242 memcpy(&returnedtag
, currentcard
->tag_9F0B
, currentcard
->tag_9F0B_len
);
243 returnedlength
= currentcard
->tag_9F0B_len
; goto exitfunction
;}
244 else if(*(tag
+1) == 0x0D){
245 memcpy(&returnedtag
, currentcard
->tag_9F0D
, sizeof(currentcard
->tag_9F0D
));
246 returnedlength
= sizeof(currentcard
->tag_9F0D
);goto exitfunction
;}
247 else if(*(tag
+1) == 0x0E){
248 memcpy(&returnedtag
, currentcard
->tag_9F0E
, sizeof(currentcard
->tag_9F0E
));
249 returnedlength
= sizeof(currentcard
->tag_9F0E
);goto exitfunction
;}
250 else if(*(tag
+1) == 0x0F){
251 memcpy(&returnedtag
, currentcard
->tag_9F0F
, sizeof(currentcard
->tag_9F0F
));
252 returnedlength
= sizeof(currentcard
->tag_9F0F
);goto exitfunction
;}
253 else if(*(tag
+1) == 0x10){
254 memcpy(&returnedtag
, currentcard
->tag_9F10
, currentcard
->tag_9F10_len
);
255 returnedlength
= currentcard
->tag_9F10_len
;goto exitfunction
;}
256 else if(*(tag
+1) == 0x11){
257 memcpy(&returnedtag
, currentcard
->tag_9F11
, sizeof(currentcard
->tag_9F11
));
258 returnedlength
= sizeof(currentcard
->tag_9F11
);goto exitfunction
;}
259 else if(*(tag
+1) == 0x12){
260 memcpy(&returnedtag
, currentcard
->tag_9F12
, currentcard
->tag_9F12_len
);
261 returnedlength
= currentcard
->tag_9F12_len
;goto exitfunction
;}
262 else if(*(tag
+1) == 0x1A){
263 memcpy(&returnedtag
, currentcard
->tag_9F1A
, sizeof(currentcard
->tag_9F1A
));
265 else if(*(tag
+1) == 0x1F){
266 memcpy(&returnedtag
, currentcard
->tag_9F1F
, currentcard
->tag_9F1F_len
);
267 returnedlength
= currentcard
->tag_9F1F_len
; goto exitfunction
;}
268 else if(*(tag
+1) == 0x32){
269 memcpy(&returnedtag
, currentcard
->tag_9F32
, currentcard
->tag_9F32_len
);
270 returnedlength
= currentcard
->tag_9F32_len
; goto exitfunction
;}
271 else if(*(tag
+1) == 0x34){
272 memcpy(&returnedtag
, currentcard
->tag_9F34
, sizeof(currentcard
->tag_9F34
));
273 returnedlength
= sizeof(currentcard
->tag_9F34
); goto exitfunction
;}
274 else if(*(tag
+1) == 0x35){
275 memcpy(&returnedtag
, currentcard
->tag_9F35
, sizeof(currentcard
->tag_9F35
));
276 returnedlength
= sizeof(currentcard
->tag_9F35
); goto exitfunction
;}
277 else if(*(tag
+1) == 0x37){
278 memcpy(&returnedtag
, currentcard
->tag_9F37
, sizeof(currentcard
->tag_9F37
));
279 returnedlength
= sizeof(currentcard
->tag_9F37
);goto exitfunction
;}
280 else if(*(tag
+1) == 0x38){
281 memcpy(&returnedtag
, currentcard
->tag_9F38
, currentcard
->tag_9F38_len
);
282 returnedlength
= currentcard
->tag_9F38_len
; goto exitfunction
;}
283 else if(*(tag
+1) == 0x44){
284 memcpy(&returnedtag
, currentcard
->tag_9F44
, sizeof(currentcard
->tag_9F44
));
285 returnedlength
= sizeof(currentcard
->tag_9F44
);goto exitfunction
;}
286 else if(*(tag
+1) == 0x45){
287 memcpy(&returnedtag
, currentcard
->tag_9F45
, sizeof(currentcard
->tag_9F45
));
288 returnedlength
= sizeof(currentcard
->tag_9F45
);goto exitfunction
;}
289 else if(*(tag
+1) == 0x46){
290 memcpy(&returnedtag
, currentcard
->tag_9F46
, currentcard
->tag_9F46_len
);
291 returnedlength
= currentcard
->tag_9F46_len
; goto exitfunction
;}
292 else if(*(tag
+1) == 0x47){
293 memcpy(&returnedtag
, currentcard
->tag_9F47
, currentcard
->tag_9F47_len
);
294 returnedlength
= currentcard
->tag_9F47_len
; goto exitfunction
;}
295 else if(*(tag
+1) == 0x48){
296 memcpy(&returnedtag
, currentcard
->tag_9F48
, currentcard
->tag_9F48_len
);
297 returnedlength
= currentcard
->tag_9F48_len
; goto exitfunction
;}
298 else if(*(tag
+1) == 0x49){
299 memcpy(&returnedtag
, currentcard
->tag_9F49
, currentcard
->tag_9F49_len
);
300 returnedlength
= currentcard
->tag_9F49_len
; goto exitfunction
;}
301 else if(*(tag
+1) == 0x4A){
302 memcpy(&returnedtag
, currentcard
->tag_9F4A
, sizeof(currentcard
->tag_9F4A
));
303 returnedlength
= sizeof(currentcard
->tag_9F4A
);goto exitfunction
;}
304 else if(*(tag
+1) == 0x4B){
305 memcpy(&returnedtag
, currentcard
->tag_9F4B
, currentcard
->tag_9F4B_len
);
306 returnedlength
= currentcard
->tag_9F4B_len
; goto exitfunction
;}
307 else if(*(tag
+1) == 0x4C){
308 memcpy(&returnedtag
, currentcard
->tag_9F4C
, sizeof(currentcard
->tag_9F4C
));
309 returnedlength
= sizeof(currentcard
->tag_9F4C
); goto exitfunction
;}
310 else if(*(tag
+1) == 0x60){
311 memcpy(&returnedtag
, currentcard
->tag_9F60
, sizeof(currentcard
->tag_9F60
));
312 returnedlength
= sizeof(currentcard
->tag_9F60
);goto exitfunction
;}
313 else if(*(tag
+1) == 0x61){
314 memcpy(&returnedtag
, currentcard
->tag_9F61
, sizeof(currentcard
->tag_9F61
));
315 returnedlength
= sizeof(currentcard
->tag_9F61
);goto exitfunction
;}
316 else if(*(tag
+1) == 0x62){
317 memcpy(&returnedtag
, currentcard
->tag_9F62
, sizeof(currentcard
->tag_9F62
));
318 returnedlength
= sizeof(currentcard
->tag_9F62
);goto exitfunction
;}
319 else if(*(tag
+1) == 0x63){
320 memcpy(&returnedtag
, currentcard
->tag_9F63
, sizeof(currentcard
->tag_9F63
));
321 returnedlength
= sizeof(currentcard
->tag_9F63
);goto exitfunction
;}
322 else if(*(tag
+1) == 0x64){
323 memcpy(&returnedtag
, currentcard
->tag_9F64
, sizeof(currentcard
->tag_9F64
));
324 returnedlength
= sizeof(currentcard
->tag_9F64
);goto exitfunction
;}
325 else if(*(tag
+1) == 0x65){
326 memcpy(&returnedtag
, currentcard
->tag_9F65
, sizeof(currentcard
->tag_9F65
));
327 returnedlength
= sizeof(currentcard
->tag_9F65
);goto exitfunction
;}
328 else if(*(tag
+1) == 0x66){
329 memcpy(&returnedtag
, currentcard
->tag_9F66
, sizeof(currentcard
->tag_9F66
));
330 returnedlength
= sizeof(currentcard
->tag_9F66
);goto exitfunction
;}
331 else if(*(tag
+1) == 0x67){
332 memcpy(&returnedtag
, currentcard
->tag_9F67
, sizeof(currentcard
->tag_9F67
));
333 returnedlength
= sizeof(currentcard
->tag_9F67
);goto exitfunction
;}
334 else if(*(tag
+1) == 0x68){
335 memcpy(&returnedtag
, currentcard
->tag_9F68
, currentcard
->tag_9F68_len
);
336 returnedlength
= currentcard
->tag_9F68_len
;goto exitfunction
;}
337 else if(*(tag
+1) == 0x69){
338 memcpy(&returnedtag
, currentcard
->tag_9F69
, currentcard
->tag_9F69_len
);
339 returnedlength
= currentcard
->tag_9F69_len
; goto exitfunction
;}
340 else if(*(tag
+1) == 0x6A){
341 memcpy(&returnedtag
, currentcard
->tag_9F6A
, sizeof(currentcard
->tag_9F6A
));
342 returnedlength
= sizeof(currentcard
->tag_9F6A
);goto exitfunction
;}
343 else if(*(tag
+1) == 0x6B){
344 memcpy(&returnedtag
, currentcard
->tag_9F6B
, currentcard
->tag_9F6B_len
);
345 returnedlength
= currentcard
->tag_9F6B_len
; goto exitfunction
;}
346 else if(*(tag
+1) == 0x6C){
347 memcpy(&returnedtag
, currentcard
->tag_9F6C
, sizeof(currentcard
->tag_9F6C
));
348 returnedlength
= sizeof(currentcard
->tag_9F6C
);goto exitfunction
;}
351 if(!memcmp(tag
, "\x61\x00",2)){
352 memcpy(&returnedtag
, currentcard
->tag_61
, currentcard
->tag_61_len
);
353 returnedlength
= currentcard
->tag_61_len
; goto exitfunction
;}
354 else if(!memcmp(tag
, "\x6F\x00",2)){
355 memcpy(&returnedtag
, currentcard
->tag_6F
, currentcard
->tag_6F_len
);
356 returnedlength
= currentcard
->tag_6F_len
; goto exitfunction
;}
357 else if(!memcmp(tag
, "\xAF\x00",2)){
358 memcpy(&returnedtag
, currentcard
->tag_AF
, currentcard
->tag_AF_len
);
359 returnedlength
= currentcard
->tag_AF_len
; goto exitfunction
;}
360 else if(!memcmp(tag
, "\x70\x00",2)){
361 memcpy(&returnedtag
, currentcard
->tag_70
, currentcard
->tag_70_len
);
362 returnedlength
= currentcard
->tag_70_len
; goto exitfunction
;}
363 else if(!memcmp(tag
, "\x77\x00",2)){
364 memcpy(&returnedtag
, currentcard
->tag_77
, currentcard
->tag_77_len
);
365 returnedlength
= currentcard
->tag_77_len
; goto exitfunction
;}
366 else if(!memcmp(tag
, "\x80\x00",2)){
367 memcpy(&returnedtag
, currentcard
->tag_80
, currentcard
->tag_80_len
);
368 returnedlength
= currentcard
->tag_80_len
; goto exitfunction
;}
369 else if(!memcmp(tag
, "\xBF\x0C",2)){
370 memcpy(&returnedtag
, currentcard
->tag_BF0C
, currentcard
->tag_BF0C_len
);
371 returnedlength
= currentcard
->tag_BF0C_len
; goto exitfunction
;}
372 else if(!memcmp(tag
, "\xFF\x01",2)){ //special DF tag
373 memcpy(&returnedtag
, currentcard
->tag_DFName
, currentcard
->tag_DFName_len
);
374 returnedlength
= currentcard
->tag_DFName_len
; goto exitfunction
;}
376 exitfunction
: //goto label to exit search quickly once found
377 memcpy(outputval
, &returnedtag
, returnedlength
);
378 *outputvallen
= returnedlength
;
383 int emv_settag(uint32_t tag
, uint8_t *datain
, emvtags
*currentcard
){
384 char binarydata
[255] = {0};
385 //if((strlen((const char *)datain)%2) != 0){ //must be an even string
388 //if(strlen((const char *)datain) > 255) {
391 uint8_t datalen
= strlen((const char *)datain
) / 2; //length of datain
392 for(int i
=0;i
<strlen((const char *)datain
);i
+=2){
393 binarydata
[i
/2] |= (char)hex2int(datain
[i
]) << 4;
394 binarydata
[i
/2] |= (char)hex2int(datain
[i
+1]);
396 Dbprintf("BINARYDATA=");
397 Dbhexdump(datalen
,(uint8_t *)binarydata
,false);
401 memcpy(currentcard
->tag_4F
, binarydata
, datalen
);
402 currentcard
->tag_4F_len
= datalen
;
405 memcpy(currentcard
->tag_50
, binarydata
, datalen
);
406 currentcard
->tag_50_len
= datalen
;
409 memcpy(currentcard
->tag_56
, binarydata
, datalen
);
410 currentcard
->tag_56_len
= datalen
;
413 memcpy(currentcard
->tag_57
, binarydata
, datalen
);
414 currentcard
->tag_57_len
= datalen
;
417 memcpy(currentcard
->tag_5A
, binarydata
, datalen
);
418 currentcard
->tag_5A_len
= datalen
;
421 memcpy(currentcard
->tag_61
, binarydata
, datalen
);
422 currentcard
->tag_61_len
= datalen
;
425 memcpy(currentcard
->tag_6F
, binarydata
, datalen
);
426 currentcard
->tag_6F_len
= datalen
;
429 memcpy(currentcard
->tag_70
, binarydata
, datalen
);
430 currentcard
->tag_70_len
= datalen
;
433 memcpy(currentcard
->tag_77
, binarydata
, datalen
);
434 currentcard
->tag_77_len
= datalen
;
437 memcpy(currentcard
->tag_80
, binarydata
, datalen
);
438 currentcard
->tag_80_len
= datalen
;
441 memcpy(currentcard
->tag_82
, binarydata
, sizeof(currentcard
->tag_82
));
444 memcpy(currentcard
->tag_84
, binarydata
, datalen
);
445 currentcard
->tag_84_len
= datalen
;
448 memcpy(currentcard
->tag_86
, binarydata
, datalen
);
449 currentcard
->tag_86_len
= datalen
;
452 memcpy(currentcard
->tag_87
, binarydata
, sizeof(currentcard
->tag_87
));
455 memcpy(currentcard
->tag_88
, binarydata
, sizeof(currentcard
->tag_88
));
458 memcpy(currentcard
->tag_8A
, binarydata
, sizeof(currentcard
->tag_8A
));
461 memcpy(currentcard
->tag_8C
, binarydata
, datalen
);
462 currentcard
->tag_8C_len
= datalen
;
465 memcpy(currentcard
->tag_8D
, binarydata
, datalen
);
466 currentcard
->tag_8D_len
= datalen
;
469 memcpy(currentcard
->tag_8E
, binarydata
, datalen
);
470 currentcard
->tag_8E_len
= datalen
;
473 memcpy(currentcard
->tag_8F
, binarydata
, sizeof(currentcard
->tag_8F
));
476 memcpy(currentcard
->tag_90
, binarydata
, datalen
);
477 currentcard
->tag_90_len
= datalen
;
480 memcpy(currentcard
->tag_91
, binarydata
, datalen
);
481 currentcard
->tag_91_len
= datalen
;
484 memcpy(currentcard
->tag_92
, binarydata
, datalen
);
485 currentcard
->tag_92_len
= datalen
;
488 memcpy(currentcard
->tag_93
, binarydata
, datalen
);
489 currentcard
->tag_93_len
= datalen
;
492 memcpy(currentcard
->tag_94
, binarydata
, datalen
);
493 currentcard
->tag_94_len
= datalen
;
496 memcpy(currentcard
->tag_95
, binarydata
, sizeof(currentcard
->tag_95
));
499 memcpy(currentcard
->tag_97
, binarydata
, datalen
);
500 currentcard
->tag_97_len
= datalen
;
503 memcpy(currentcard
->tag_98
, binarydata
, sizeof(currentcard
->tag_98
));
506 memcpy(currentcard
->tag_99
, binarydata
, datalen
);
507 currentcard
->tag_99_len
= datalen
;
510 memcpy(currentcard
->tag_9A
, binarydata
, sizeof(currentcard
->tag_9A
));
513 memcpy(currentcard
->tag_9B
, binarydata
, sizeof(currentcard
->tag_9B
));
516 memcpy(currentcard
->tag_9C
, binarydata
, sizeof(currentcard
->tag_9C
));
519 memcpy(currentcard
->tag_9D
, binarydata
, datalen
);
520 currentcard
->tag_9D_len
= datalen
;
523 memcpy(currentcard
->tag_A5
, binarydata
, datalen
);
524 currentcard
->tag_A5_len
= datalen
;
527 memcpy(currentcard
->tag_AF
, binarydata
, datalen
);
528 currentcard
->tag_AF_len
= datalen
;
531 memcpy(currentcard
->tag_CD
, binarydata
, sizeof(currentcard
->tag_CD
));
534 memcpy(currentcard
->tag_CE
, binarydata
, sizeof(currentcard
->tag_CE
));
537 memcpy(currentcard
->tag_CF
, binarydata
, sizeof(currentcard
->tag_CF
));
540 memcpy(currentcard
->tag_CF
, binarydata
, sizeof(currentcard
->tag_CF
));
543 memcpy(currentcard
->tag_CF
, binarydata
, sizeof(currentcard
->tag_CF
));
548 memcpy(currentcard
->tag_DA
, binarydata
, sizeof(currentcard
->tag_DA
));
551 memcpy(currentcard
->tag_DB
, binarydata
, sizeof(currentcard
->tag_DB
));
554 memcpy(currentcard
->tag_DB
, binarydata
, sizeof(currentcard
->tag_DB
));
557 memcpy(currentcard
->tag_DD
, binarydata
, sizeof(currentcard
->tag_DD
));
562 memcpy(currentcard
->tag_5F24
, binarydata
, sizeof(currentcard
->tag_5F24
));
565 memcpy(currentcard
->tag_5F25
, binarydata
, sizeof(currentcard
->tag_5F25
));
568 memcpy(currentcard
->tag_5F28
, binarydata
, sizeof(currentcard
->tag_5F28
));
571 memcpy(currentcard
->tag_5F2A
, binarydata
, sizeof(currentcard
->tag_5F2A
));
576 memcpy(currentcard
->tag_5F30
, binarydata
, sizeof(currentcard
->tag_5F30
));
579 memcpy(currentcard
->tag_5F34
, binarydata
, sizeof(currentcard
->tag_5F34
));
582 memcpy(currentcard
->tag_5F36
, binarydata
, sizeof(currentcard
->tag_5F36
));
587 memcpy(currentcard
->tag_5F54
, binarydata
, sizeof(currentcard
->tag_5F54
));
590 memcpy(currentcard
->tag_9F01
, binarydata
, sizeof(currentcard
->tag_9F01
));
593 memcpy(currentcard
->tag_9F02
, binarydata
, sizeof(currentcard
->tag_9F02
));
596 memcpy(currentcard
->tag_9F03
, binarydata
, sizeof(currentcard
->tag_9F03
));
599 memcpy(currentcard
->tag_9F04
, binarydata
, sizeof(currentcard
->tag_9F04
));
602 memcpy(currentcard
->tag_9F05
, binarydata
, datalen
);
603 currentcard
->tag_9F05_len
= datalen
;
606 memcpy(currentcard
->tag_9F06
, binarydata
, datalen
);
607 currentcard
->tag_9F06_len
= datalen
;
610 memcpy(currentcard
->tag_9F07
, binarydata
, sizeof(currentcard
->tag_9F07
));
613 memcpy(currentcard
->tag_9F08
, binarydata
, sizeof(currentcard
->tag_9F08
));
616 memcpy(currentcard
->tag_9F09
, binarydata
, sizeof(currentcard
->tag_9F09
));
619 memcpy(currentcard
->tag_9F0B
, binarydata
, sizeof(currentcard
->tag_9F0B
));
622 memcpy(currentcard
->tag_9F0D
, binarydata
, sizeof(currentcard
->tag_9F0D
));
625 memcpy(currentcard
->tag_9F0E
, binarydata
, sizeof(currentcard
->tag_9F0E
));
628 memcpy(currentcard
->tag_9F0F
, binarydata
, sizeof(currentcard
->tag_9F0F
));
631 memcpy(currentcard
->tag_9F10
, binarydata
, datalen
);
632 currentcard
->tag_9F10_len
= datalen
;break;
634 memcpy(currentcard
->tag_9F11
, binarydata
, sizeof(currentcard
->tag_9F11
));
637 memcpy(currentcard
->tag_9F12
, binarydata
, datalen
);
638 currentcard
->tag_9F12_len
= datalen
;break;
640 memcpy(currentcard
->tag_9F13
, binarydata
, sizeof(currentcard
->tag_9F13
));
643 memcpy(currentcard
->tag_9F14
, binarydata
, sizeof(currentcard
->tag_9F14
));
646 memcpy(currentcard
->tag_9F15
, binarydata
, sizeof(currentcard
->tag_9F15
));
649 memcpy(currentcard
->tag_9F16
, binarydata
, sizeof(currentcard
->tag_9F16
));
652 memcpy(currentcard
->tag_9F17
, binarydata
, sizeof(currentcard
->tag_9F17
));
655 memcpy(currentcard
->tag_9F18
, binarydata
, sizeof(currentcard
->tag_9F18
));
658 memcpy(currentcard
->tag_9F1A
, binarydata
, sizeof(currentcard
->tag_9F1A
));
661 memcpy(currentcard
->tag_9F1B
, binarydata
, sizeof(currentcard
->tag_9F1B
));
664 memcpy(currentcard
->tag_9F1C
, binarydata
, sizeof(currentcard
->tag_9F1C
));
667 memcpy(currentcard
->tag_9F1D
, binarydata
, datalen
);
668 currentcard
->tag_9F1D_len
= datalen
;break;
670 memcpy(currentcard
->tag_9F1E
, binarydata
, sizeof(currentcard
->tag_9F1E
));
673 memcpy(currentcard
->tag_9F1F
, binarydata
, datalen
);
674 currentcard
->tag_9F1F_len
= datalen
;break;
676 memcpy(currentcard
->tag_9F20
, binarydata
, datalen
);
677 currentcard
->tag_9F20_len
= datalen
;break;
679 memcpy(currentcard
->tag_9F21
, binarydata
, sizeof(currentcard
->tag_9F21
));
682 memcpy(currentcard
->tag_9F22
, binarydata
, sizeof(currentcard
->tag_9F22
));
685 memcpy(currentcard
->tag_9F23
, binarydata
, sizeof(currentcard
->tag_9F23
));
688 memcpy(currentcard
->tag_9F26
, binarydata
, sizeof(currentcard
->tag_9F26
));
691 memcpy(currentcard
->tag_9F27
, binarydata
, sizeof(currentcard
->tag_9F27
));
694 memcpy(currentcard
->tag_9F2D
, binarydata
, datalen
);
695 currentcard
->tag_9F2D_len
= datalen
;break;
697 memcpy(currentcard
->tag_9F2E
, binarydata
, sizeof(currentcard
->tag_9F2E
));
700 memcpy(currentcard
->tag_9F2F
, binarydata
, datalen
);
701 currentcard
->tag_9F2F_len
= datalen
;break;
703 memcpy(currentcard
->tag_9F32
, binarydata
, datalen
);
704 currentcard
->tag_9F32_len
= datalen
;break;
706 memcpy(currentcard
->tag_9F33
, binarydata
, sizeof(currentcard
->tag_9F33
));
709 memcpy(currentcard
->tag_9F34
, binarydata
, sizeof(currentcard
->tag_9F34
));
712 memcpy(currentcard
->tag_9F35
, binarydata
, sizeof(currentcard
->tag_9F35
));
715 memcpy(currentcard
->tag_9F36
, binarydata
, sizeof(currentcard
->tag_9F36
));
718 memcpy(currentcard
->tag_9F37
, binarydata
, sizeof(currentcard
->tag_9F37
));
723 memcpy(currentcard
->tag_9F39
, binarydata
, sizeof(currentcard
->tag_9F39
));
726 memcpy(currentcard
->tag_9F40
, binarydata
, sizeof(currentcard
->tag_9F40
));
729 memcpy(currentcard
->tag_9F41
, binarydata
, sizeof(currentcard
->tag_9F41
));
732 memcpy(currentcard
->tag_9F42
, binarydata
, sizeof(currentcard
->tag_9F42
));
735 memcpy(currentcard
->tag_9F43
, binarydata
, sizeof(currentcard
->tag_9F43
));
738 memcpy(currentcard
->tag_9F44
, binarydata
, sizeof(currentcard
->tag_9F44
));
741 memcpy(currentcard
->tag_9F45
, binarydata
, sizeof(currentcard
->tag_9F45
));
744 memcpy(currentcard
->tag_9F46
, binarydata
, datalen
);
745 currentcard
->tag_9F46_len
= datalen
;break;
747 memcpy(currentcard
->tag_9F47
, binarydata
, datalen
);
748 currentcard
->tag_9F47_len
= datalen
;break;
750 memcpy(currentcard
->tag_9F48
, binarydata
, datalen
);
751 currentcard
->tag_9F48_len
= datalen
;break;
753 memcpy(currentcard
->tag_9F49
, binarydata
, datalen
);
754 currentcard
->tag_9F49_len
= datalen
;break;
756 memcpy(currentcard
->tag_9F4A
, binarydata
, sizeof(currentcard
->tag_9F4A
));
759 memcpy(currentcard
->tag_9F4B
, binarydata
, datalen
);
760 currentcard
->tag_9F4B_len
= datalen
;break;
762 memcpy(currentcard
->tag_9F4C
, binarydata
, sizeof(currentcard
->tag_9F4C
));
765 memcpy(currentcard
->tag_9F4D
, binarydata
, sizeof(currentcard
->tag_9F4D
));
768 memcpy(currentcard
->tag_9F4E
, binarydata
, sizeof(currentcard
->tag_9F4E
));
771 memcpy(currentcard
->tag_9F60
, binarydata
, sizeof(currentcard
->tag_9F60
));
774 memcpy(currentcard
->tag_9F61
, binarydata
, sizeof(currentcard
->tag_9F61
));
777 memcpy(currentcard
->tag_9F62
, binarydata
, sizeof(currentcard
->tag_9F62
));
780 memcpy(currentcard
->tag_9F63
, binarydata
, sizeof(currentcard
->tag_9F63
));
783 memcpy(currentcard
->tag_9F64
, binarydata
, sizeof(currentcard
->tag_9F64
));
786 memcpy(currentcard
->tag_9F65
, binarydata
, sizeof(currentcard
->tag_9F65
));
789 memcpy(currentcard
->tag_9F66
, binarydata
, sizeof(currentcard
->tag_9F66
));
792 memcpy(currentcard
->tag_9F67
, binarydata
, sizeof(currentcard
->tag_9F67
));
795 memcpy(currentcard
->tag_9F68
, binarydata
, datalen
);
796 currentcard
->tag_9F68_len
= datalen
;break;
798 memcpy(currentcard
->tag_9F69
, binarydata
, datalen
);
799 currentcard
->tag_9F69_len
= datalen
;break;
801 memcpy(currentcard
->tag_9F6A
, binarydata
, sizeof(currentcard
->tag_9F6A
));
804 memcpy(currentcard
->tag_9F6B
, binarydata
, sizeof(currentcard
->tag_9F6B
));
807 memcpy(currentcard
->tag_9F6C
, binarydata
, sizeof(currentcard
->tag_9F6C
));
810 memcpy(currentcard
->tag_BF0C
, binarydata
, datalen
);
811 currentcard
->tag_BF0C_len
= datalen
;break;
818 /* generates an emv template based off tag values supplied */
819 int emv_generatetemplate(uint8_t* templateval
,emvtags
* currentcard
, uint8_t* returnedval
, uint8_t* returnedlen
,uint8_t numtags
, ...)
822 uint8_t* currenttag
; //value of the current tag
823 uint8_t tagval
[255]; //buffer to hold the extracted tag value
824 uint8_t taglen
= 0; //extracted tag length
825 uint8_t bufferval
[255];
827 uint32_t encodedlen
= 0;
828 va_start(arguments
, numtags
);
829 for(int x
=0; x
<numtags
; x
++){
830 currenttag
= va_arg(arguments
, uint8_t*);
831 emv_lookuptag(currenttag
, currentcard
, tagval
, &taglen
);
832 encode_ber_tlv_item(currenttag
, (uint8_t)strlen((const char*)currenttag
), tagval
, (uint32_t)taglen
, bufferval
+counter
, &encodedlen
);
833 counter
+=encodedlen
;
835 encode_ber_tlv_item(templateval
, strlen((const char*) templateval
), bufferval
, counter
, returnedval
, &encodedlen
);
836 *returnedlen
= encodedlen
;
840 //generate a valid pdol list
841 int emv_generateDOL(uint8_t* DOL
, uint8_t DOLlen
,emvtags
* currentcard
,uint8_t* DOLoutput
, uint8_t* DOLoutputlen
)
843 if(!DOL
|| !currentcard
|| !DOLoutput
) // null pointer checks
845 //scan through the DOL list and construct the result.
847 uint8_t DOLcounter
= 0; //points to the current DOL buffer location
848 uint8_t scannedtaglen
= 0; //length of a scanned tag
849 uint8_t scannedtag
[2] = {0x00,0x00}; //buffer for the scanned tag
850 uint8_t DOLoutputbuffer
[255];
851 uint8_t retrievedtagvallen
;
853 memset(DOLoutputbuffer
,0x00, 255); //clear the output buffer
857 if((*(DOL
+i
) & 0x1F) == 0x1F)
858 { scannedtaglen
= 2;}
861 memcpy(scannedtag
, DOL
+i
,scannedtaglen
);
862 //look up tag value and copy
863 //Dbhexdump(2,scannedtag,false);
864 emv_lookuptag(scannedtag
,currentcard
,&(DOLoutputbuffer
[DOLcounter
]),&retrievedtagvallen
);
865 DOLcounter
+= (uint8_t)DOL
[i
+scannedtaglen
];
866 i
+= scannedtaglen
+ 1;
867 memset(scannedtag
, 0x00, 2); //clear current tag
870 memcpy(DOLoutput
, DOLoutputbuffer
, DOLcounter
);
871 *DOLoutputlen
= DOLcounter
;
876 //decode the tag inputted and fill in the supplied structure. clean up the cleanup_passpass function
877 int emv_emvtags_decode_tag(tlvtag
* inputtag
, emvtags
* currentcard
)
879 if(!inputtag
|| !currentcard
) {
883 if(*(inputtag
->tag
) == 0x5F) {
884 if(*(inputtag
->tag
+1) == 0x20){
885 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F20
)))
887 memcpy(currentcard
->tag_5F20
, inputtag
->value
, inputtag
->valuelength
);
888 currentcard
->tag_5F20_len
= inputtag
->valuelength
;
890 if(*(inputtag
->tag
+1) == 0x24){
891 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F24
)))
893 memcpy(currentcard
->tag_5F24
, inputtag
->value
, sizeof(currentcard
->tag_5F24
));}
894 if(*(inputtag
->tag
+1) == 0x25){
895 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F25
)))
897 memcpy(currentcard
->tag_5F25
, inputtag
->value
, inputtag
->valuelength
);}
898 if(*(inputtag
->tag
+1) == 0x28){
899 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F28
)))
901 memcpy(currentcard
->tag_5F28
, inputtag
->value
, inputtag
->valuelength
);}
902 if(*(inputtag
->tag
+1) == 0x2A){
903 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F2A
)))
905 memcpy(currentcard
->tag_5F2A
, inputtag
->value
, inputtag
->valuelength
);}
906 if(*(inputtag
->tag
+1) == 0x2D){
907 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F2D
)))
909 memcpy(currentcard
->tag_5F2D
, inputtag
->value
, inputtag
->valuelength
);
910 currentcard
->tag_5F2D_len
= inputtag
->valuelength
;}
911 if(*(inputtag
->tag
+1) == 0x30){
912 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F30
)))
914 memcpy(currentcard
->tag_5F30
, inputtag
->value
, inputtag
->valuelength
);}
915 if(*(inputtag
->tag
+1) == 0x34){
916 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F34
)))
918 memcpy(currentcard
->tag_5F34
, inputtag
->value
, sizeof(currentcard
->tag_5F34
));}
919 if(*(inputtag
->tag
+1) == 0x36){
920 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F36
)))
922 memcpy(currentcard
->tag_5F36
, inputtag
->value
, sizeof(currentcard
->tag_5F36
));}
923 if(*(inputtag
->tag
+1) == 0x50){
924 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F50
)))
926 memcpy(currentcard
->tag_5F50
, inputtag
->value
, inputtag
->valuelength
);
927 currentcard
->tag_5F50_len
= inputtag
->valuelength
;}
928 if(*(inputtag
->tag
+1) == 0x54){
929 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F54
)))
931 memcpy(currentcard
->tag_5F54
, inputtag
->value
, inputtag
->valuelength
);
932 currentcard
->tag_5F54_len
= inputtag
->valuelength
;}
934 if(*(inputtag
->tag
) == 0x9F){
935 if(*(inputtag
->tag
+1) == 0x01){
936 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F01
)))
938 memcpy(currentcard
->tag_9F01
, inputtag
->value
, inputtag
->valuelength
);}
939 if(*(inputtag
->tag
+1) == 0x02){
940 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F02
)))
942 memcpy(currentcard
->tag_9F02
, inputtag
->value
, inputtag
->valuelength
);}
943 if(*(inputtag
->tag
+1) == 0x03){
944 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F03
)))
946 memcpy(currentcard
->tag_9F03
, inputtag
->value
, inputtag
->valuelength
);}
947 if(*(inputtag
->tag
+1) == 0x04){
948 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F04
)))
950 memcpy(currentcard
->tag_9F04
, inputtag
->value
, inputtag
->valuelength
);}
951 if(*(inputtag
->tag
+1) == 0x05){
952 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F05
)))
954 memcpy(currentcard
->tag_9F05
, inputtag
->value
, inputtag
->valuelength
);
955 currentcard
->tag_9F05_len
= inputtag
->valuelength
;}
956 if(*(inputtag
->tag
+1) == 0x06){
957 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F06
)))
959 memcpy(currentcard
->tag_9F06
, inputtag
->value
, inputtag
->valuelength
);
960 currentcard
->tag_9F06_len
= inputtag
->valuelength
;}
961 if(*(inputtag
->tag
+1) == 0x07){
962 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F07
)))
964 memcpy(currentcard
->tag_9F07
, inputtag
->value
, inputtag
->valuelength
);}
965 if(*(inputtag
->tag
+1) == 0x08){
966 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F08
)))
968 memcpy(currentcard
->tag_9F08
, inputtag
->value
, inputtag
->valuelength
);}
969 if(*(inputtag
->tag
+1) == 0x09){
970 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F09
)))
972 memcpy(currentcard
->tag_9F09
, inputtag
->value
, inputtag
->valuelength
);}
973 if(*(inputtag
->tag
+1) == 0x0B){
974 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F0B
)))
976 memcpy(currentcard
->tag_9F0B
, inputtag
->value
, inputtag
->valuelength
);
977 currentcard
->tag_9F0B_len
= inputtag
->valuelength
;}
978 if(*(inputtag
->tag
+1) == 0x0D){
979 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F0D
)))
981 memcpy(currentcard
->tag_9F0D
, inputtag
->value
, inputtag
->valuelength
);}
982 if(*(inputtag
->tag
+1) == 0x0E){
983 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F0E
)))
985 memcpy(currentcard
->tag_9F0E
, inputtag
->value
, inputtag
->valuelength
);}
986 if(*(inputtag
->tag
+1) == 0x0F){
987 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F0F
)))
989 memcpy(currentcard
->tag_9F0F
, inputtag
->value
, inputtag
->valuelength
);}
990 if(*(inputtag
->tag
+1) == 0x11){
991 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F11
)))
993 memcpy(currentcard
->tag_9F11
, inputtag
->value
, inputtag
->valuelength
);}
994 if(*(inputtag
->tag
+1) == 0x12){
995 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F12
)))
997 memcpy(currentcard
->tag_9F12
, inputtag
->value
, inputtag
->valuelength
);
998 currentcard
->tag_9F12_len
= inputtag
->valuelength
;}
999 if(*(inputtag
->tag
+1) == 0x13){
1000 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F13
)))
1002 memcpy(currentcard
->tag_9F13
, inputtag
->value
, inputtag
->valuelength
);}
1003 if(*(inputtag
->tag
+1) == 0x14){
1004 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F14
)))
1006 memcpy(currentcard
->tag_9F14
, inputtag
->value
, inputtag
->valuelength
);}
1007 if(*(inputtag
->tag
+1) == 0x15){
1008 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F15
)))
1010 memcpy(currentcard
->tag_9F15
, inputtag
->value
, inputtag
->valuelength
);}
1011 if(*(inputtag
->tag
+1) == 0x16){
1012 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F16
)))
1014 memcpy(currentcard
->tag_9F16
, inputtag
->value
, inputtag
->valuelength
);}
1015 if(*(inputtag
->tag
+1) == 0x17){
1016 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F17
)))
1018 memcpy(currentcard
->tag_9F17
, inputtag
->value
, inputtag
->valuelength
);}
1019 if(*(inputtag
->tag
+1) == 0x18){
1020 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F18
)))
1022 memcpy(currentcard
->tag_9F18
, inputtag
->value
, inputtag
->valuelength
);}
1023 if(*(inputtag
->tag
+1) == 0x1A){
1024 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1A
)))
1026 memcpy(currentcard
->tag_9F1A
, inputtag
->value
, inputtag
->valuelength
);}
1027 if(*(inputtag
->tag
+1) == 0x1B){
1028 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1B
)))
1030 memcpy(currentcard
->tag_9F1B
, inputtag
->value
, inputtag
->valuelength
);}
1031 if(*(inputtag
->tag
+1) == 0x1C){
1032 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1C
)))
1034 memcpy(currentcard
->tag_9F1C
, inputtag
->value
, inputtag
->valuelength
);}
1035 if(*(inputtag
->tag
+1) == 0x1D){
1036 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1D
)))
1038 memcpy(currentcard
->tag_9F1D
, inputtag
->value
, inputtag
->valuelength
);
1039 currentcard
->tag_9F1D_len
= inputtag
->valuelength
;}
1040 if(*(inputtag
->tag
+1) == 0x1E){
1041 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1E
)))
1043 memcpy(currentcard
->tag_9F1E
, inputtag
->value
, inputtag
->valuelength
);}
1044 if(*(inputtag
->tag
+1) == 0x1F){
1045 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1F
)))
1047 memcpy(currentcard
->tag_9F1F
, inputtag
->value
, inputtag
->valuelength
);
1048 currentcard
->tag_9F1F_len
= inputtag
->valuelength
;}
1049 if(*(inputtag
->tag
+1) == 0x32){
1050 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F32
)))
1052 currentcard
->tag_9F32_len
= inputtag
->valuelength
;
1053 memcpy(currentcard
->tag_9F32
, inputtag
->value
, inputtag
->valuelength
);
1055 if(*(inputtag
->tag
+1) == 0x34){
1056 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F34
)))
1058 memcpy(currentcard
->tag_9F34
, inputtag
->value
, inputtag
->valuelength
);}
1059 if(*(inputtag
->tag
+1) == 0x35){
1060 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F35
)))
1062 memcpy(currentcard
->tag_9F35
, inputtag
->value
, inputtag
->valuelength
);}
1063 if(*(inputtag
->tag
+1) == 0x37){
1064 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F37
)))
1066 memcpy(currentcard
->tag_9F37
, inputtag
->value
, inputtag
->valuelength
);}
1067 if(*(inputtag
->tag
+1) == 0x38){
1068 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F38
)))
1070 memcpy(currentcard
->tag_9F38
, inputtag
->value
, inputtag
->valuelength
);
1071 currentcard
->tag_9F38_len
= inputtag
->valuelength
;}
1072 if(*(inputtag
->tag
+1) == 0x44){
1073 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F44
)))
1075 memcpy(currentcard
->tag_9F44
, inputtag
->value
, inputtag
->valuelength
);}
1076 if(*(inputtag
->tag
+1) == 0x45){
1077 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F45
)))
1079 memcpy(currentcard
->tag_9F45
, inputtag
->value
, inputtag
->valuelength
);}
1080 if(*(inputtag
->tag
+1) == 0x46){
1081 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F46
)))
1083 memcpy(currentcard
->tag_9F46
, inputtag
->value
, inputtag
->valuelength
);
1084 currentcard
->tag_9F46_len
= inputtag
->valuelength
;}
1085 if(*(inputtag
->tag
+1) == 0x47){
1086 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F47
)))
1088 memcpy(currentcard
->tag_9F47
, inputtag
->value
, inputtag
->valuelength
);
1089 currentcard
->tag_9F47_len
= inputtag
->valuelength
;}
1090 if(*(inputtag
->tag
+1) == 0x48){
1091 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F48
)))
1093 memcpy(currentcard
->tag_9F48
, inputtag
->value
, inputtag
->valuelength
);
1094 currentcard
->tag_9F48_len
= inputtag
->valuelength
;}
1095 if(*(inputtag
->tag
+1) == 0x49){
1096 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F49
)))
1098 memcpy(currentcard
->tag_9F49
, inputtag
->value
, inputtag
->valuelength
);
1099 currentcard
->tag_9F49_len
= inputtag
->valuelength
;}
1100 if(*(inputtag
->tag
+1) == 0x4A){
1101 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F4A
)))
1103 memcpy(currentcard
->tag_9F4A
, inputtag
->value
, inputtag
->valuelength
);}
1104 if(*(inputtag
->tag
+1) == 0x4B){
1105 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F4B
)))
1107 memcpy(currentcard
->tag_9F4B
, inputtag
->value
, inputtag
->valuelength
);
1108 currentcard
->tag_9F4B_len
= inputtag
->valuelength
;}
1109 if(*(inputtag
->tag
+1) == 0x4C){
1110 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F4C
)))
1112 memcpy(currentcard
->tag_9F4C
, inputtag
->value
, inputtag
->valuelength
);}
1113 if(*(inputtag
->tag
+1) == 0x60){
1114 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F60
)))
1116 memcpy(currentcard
->tag_9F60
, inputtag
->value
, inputtag
->valuelength
);}
1117 if(*(inputtag
->tag
+1) == 0x61){
1118 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F61
)))
1120 memcpy(currentcard
->tag_9F61
, inputtag
->value
, inputtag
->valuelength
);}
1121 if(*(inputtag
->tag
+1) == 0x62){
1122 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F62
)))
1124 memcpy(currentcard
->tag_9F62
, inputtag
->value
, inputtag
->valuelength
);}
1125 if(*(inputtag
->tag
+1) == 0x63){
1126 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F63
)))
1128 memcpy(currentcard
->tag_9F63
, inputtag
->value
, inputtag
->valuelength
);}
1129 if(*(inputtag
->tag
+1) == 0x64){
1130 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F64
)))
1132 memcpy(currentcard
->tag_9F64
, inputtag
->value
, inputtag
->valuelength
);}
1133 if(*(inputtag
->tag
+1) == 0x65){
1134 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F65
)))
1136 memcpy(currentcard
->tag_9F65
, inputtag
->value
, inputtag
->valuelength
);}
1137 if(*(inputtag
->tag
+1) == 0x66){
1138 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F66
)))
1140 memcpy(currentcard
->tag_9F66
, inputtag
->value
, inputtag
->valuelength
);}
1141 if(*(inputtag
->tag
+1) == 0x67){
1142 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F67
)))
1144 memcpy(currentcard
->tag_9F67
, inputtag
->value
, inputtag
->valuelength
);}
1145 if(*(inputtag
->tag
+1) == 0x68){
1146 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F68
)))
1148 memcpy(currentcard
->tag_9F68
, inputtag
->value
, inputtag
->valuelength
);
1149 currentcard
->tag_9F68_len
= inputtag
->valuelength
;}
1150 if(*(inputtag
->tag
+1) == 0x69){
1151 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F69
)))
1153 memcpy(currentcard
->tag_9F69
, inputtag
->value
, inputtag
->valuelength
);
1154 currentcard
->tag_9F69_len
= inputtag
->valuelength
;}
1155 if(*(inputtag
->tag
+1) == 0x6A){
1156 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F6A
)))
1158 memcpy(currentcard
->tag_9F6A
, inputtag
->value
, inputtag
->valuelength
);}
1159 if(*(inputtag
->tag
+1) == 0x6B){
1160 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F6B
)))
1162 memcpy(currentcard
->tag_9F6B
, inputtag
->value
, inputtag
->valuelength
);
1163 currentcard
->tag_9F6B_len
= inputtag
->valuelength
;}
1164 if(*(inputtag
->tag
+1) == 0x6C){
1165 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F6C
)))
1167 memcpy(currentcard
->tag_9F6C
, inputtag
->value
, inputtag
->valuelength
);}
1171 if(*(inputtag
->tag
) == 0xBF){ //BF0C
1172 if(*(inputtag
->tag
+1) == 0x0C){
1173 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_BF0C
)))
1175 memcpy(currentcard
->tag_BF0C
, inputtag
->value
, inputtag
->valuelength
);
1176 currentcard
->tag_BF0C_len
= inputtag
->valuelength
;}
1178 else if(*(inputtag
->tag
) == 0x4F){ //BF0C
1179 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_4F
)))
1181 memcpy(currentcard
->tag_4F
, inputtag
->value
, inputtag
->valuelength
);
1182 currentcard
->tag_4F_len
= inputtag
->valuelength
;}
1183 else if(*(inputtag
->tag
) == 0x50){ //BF0C
1184 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_50
)))
1186 memcpy(currentcard
->tag_50
, inputtag
->value
, inputtag
->valuelength
);
1187 currentcard
->tag_50_len
= inputtag
->valuelength
;
1189 else if(*(inputtag
->tag
) == 0x56){ //BF0C
1190 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_56
)))
1192 memcpy(currentcard
->tag_56
, inputtag
->value
, inputtag
->valuelength
);
1193 currentcard
->tag_56_len
= inputtag
->valuelength
;
1195 else if(*(inputtag
->tag
) == 0x57){ //BF0C
1196 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_57
)))
1198 memcpy(currentcard
->tag_57
, inputtag
->value
, inputtag
->valuelength
);
1199 currentcard
->tag_57_len
= inputtag
->valuelength
;
1201 else if(*(inputtag
->tag
) == 0x5A){ //BF0C
1202 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5A
)))
1204 memcpy(currentcard
->tag_5A
, inputtag
->value
, inputtag
->valuelength
);
1205 currentcard
->tag_5A_len
= inputtag
->valuelength
;}
1206 else if(*(inputtag
->tag
) == 0x61){ //BF0C
1207 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_61
)))
1209 memcpy(currentcard
->tag_61
, inputtag
->value
, inputtag
->valuelength
);
1210 currentcard
->tag_61_len
= inputtag
->valuelength
;
1212 else if(*(inputtag
->tag
) == 0x6F){ //BF0C
1213 memcpy(currentcard
->tag_6F
,inputtag
->value
,inputtag
->valuelength
);}
1215 else if(*(inputtag
->tag
) == 0x70){ //BF0C
1216 memcpy(currentcard
->tag_70
,inputtag
->value
,inputtag
->valuelength
);}
1217 else if(*(inputtag
->tag
) == 0x77){ //BF0C
1218 memcpy(currentcard
->tag_77
,inputtag
->value
,inputtag
->valuelength
);}
1219 else if(*(inputtag
->tag
) == 0x80){ //BF0C
1220 memcpy(currentcard
->tag_80
,inputtag
->value
,inputtag
->valuelength
);}
1221 else if(*(inputtag
->tag
) == 0x82){ //BF0C
1222 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_82
)))
1224 memcpy(currentcard
->tag_82
, inputtag
->value
, inputtag
->valuelength
);}
1225 else if(*(inputtag
->tag
) == 0x84){ //BF0C
1226 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_84
)))
1228 memcpy(currentcard
->tag_84
, inputtag
->value
, inputtag
->valuelength
);
1229 currentcard
->tag_84_len
= inputtag
->valuelength
;
1231 else if(*(inputtag
->tag
) == 0x86){ //BF0C
1232 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_86
)))
1234 memcpy(currentcard
->tag_86
, inputtag
->value
, inputtag
->valuelength
);
1235 currentcard
->tag_86_len
= inputtag
->valuelength
;
1237 else if(*(inputtag
->tag
) == 0x87){ //BF0C
1238 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_87
)))
1240 memcpy(currentcard
->tag_87
, inputtag
->value
, inputtag
->valuelength
);}
1241 else if(*(inputtag
->tag
) == 0x88){ //BF0C
1242 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_88
)))
1244 memcpy(currentcard
->tag_88
, inputtag
->value
, inputtag
->valuelength
);}
1245 else if(*(inputtag
->tag
) == 0x8A){ //BF0C
1246 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_8A
)))
1248 memcpy(currentcard
->tag_8A
, inputtag
->value
, inputtag
->valuelength
);}
1249 else if(*(inputtag
->tag
) == 0x8C){ //BF0C
1250 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_8C
)))
1252 memcpy(currentcard
->tag_8C
, inputtag
->value
, inputtag
->valuelength
);
1253 currentcard
->tag_8C_len
= inputtag
->valuelength
;
1255 else if(*(inputtag
->tag
) == 0x8D){ //BF0C
1256 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_8D
)))
1258 memcpy(currentcard
->tag_8D
, inputtag
->value
, inputtag
->valuelength
);
1259 currentcard
->tag_8D_len
= inputtag
->valuelength
;
1261 else if(*(inputtag
->tag
) == 0x8E){ //BF0C
1262 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_8E
)))
1264 memcpy(currentcard
->tag_8E
, inputtag
->value
, inputtag
->valuelength
);
1265 currentcard
->tag_8E_len
= inputtag
->valuelength
;
1267 else if(*(inputtag
->tag
) == 0x8F){ //BF0C
1268 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_8F
)))
1270 memcpy(currentcard
->tag_8F
,inputtag
->value
,sizeof(currentcard
->tag_8F
));}
1271 else if(*(inputtag
->tag
) == 0x90){ //BF0C
1272 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_90
)))
1274 memcpy(currentcard
->tag_90
, inputtag
->value
, inputtag
->valuelength
);
1275 currentcard
->tag_90_len
= inputtag
->valuelength
;}
1276 else if(*(inputtag
->tag
) == 0x92){ //BF0C
1277 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_92
)))
1279 memcpy(currentcard
->tag_92
, inputtag
->value
, inputtag
->valuelength
);
1280 currentcard
->tag_92_len
= inputtag
->valuelength
;}
1281 else if(*(inputtag
->tag
) == 0x93){ //BF0C
1282 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_93
)))
1284 memcpy(currentcard
->tag_93
, inputtag
->value
, inputtag
->valuelength
);
1285 currentcard
->tag_93_len
= inputtag
->valuelength
;}
1286 else if(*(inputtag
->tag
) == 0x94){ //BF0C
1287 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_94
)))
1289 memcpy(currentcard
->tag_94
, inputtag
->value
, inputtag
->valuelength
);
1290 currentcard
->tag_94_len
= inputtag
->valuelength
;}
1291 else if(*(inputtag
->tag
) == 0x95){ //BF0C
1292 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_95
)))
1294 memcpy(currentcard
->tag_95
, inputtag
->value
, inputtag
->valuelength
);}
1295 else if(*(inputtag
->tag
) == 0x97){ //BF0C
1296 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_97
)))
1298 memcpy(currentcard
->tag_97
, inputtag
->value
, inputtag
->valuelength
);
1299 currentcard
->tag_97_len
= inputtag
->valuelength
;}
1300 else if(*(inputtag
->tag
) == 0x98){ //BF0C
1301 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_98
)))
1303 memcpy(currentcard
->tag_98
, inputtag
->value
, inputtag
->valuelength
);}
1304 else if(*(inputtag
->tag
) == 0x99){ //BF0C
1305 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_99
)))
1307 memcpy(currentcard
->tag_99
, inputtag
->value
, inputtag
->valuelength
);
1308 currentcard
->tag_99_len
= inputtag
->valuelength
;}
1309 else if(*(inputtag
->tag
) == 0x9A){ //BF0C
1310 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9A
)))
1312 memcpy(currentcard
->tag_9A
, inputtag
->value
, inputtag
->valuelength
);}
1313 else if(*(inputtag
->tag
) == 0x9B){ //BF0C
1314 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9B
)))
1316 memcpy(currentcard
->tag_9B
, inputtag
->value
, inputtag
->valuelength
);}
1317 else if(*(inputtag
->tag
) == 0x9C){ //BF0C
1318 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9C
)))
1320 memcpy(currentcard
->tag_9C
, inputtag
->value
, inputtag
->valuelength
);}
1321 else if(*(inputtag
->tag
) == 0x9D){ //BF0C
1322 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9D
)))
1324 memcpy(currentcard
->tag_9D
, inputtag
->value
, inputtag
->valuelength
);
1325 currentcard
->tag_9D_len
= inputtag
->valuelength
;}
1326 else if(*(inputtag
->tag
) == 0xA5){ //BF0C
1327 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_A5
)))
1329 memcpy(currentcard
->tag_A5
, inputtag
->value
, inputtag
->valuelength
);
1330 currentcard
->tag_A5_len
= inputtag
->valuelength
;}
1335 int emv_decode_field(uint8_t* inputfield
,uint16_t inputlength
, emvtags
*result
)
1337 uint16_t lengthcounter
=0;
1339 //copy result to the testtag
1343 //loop through and decode template
1344 while(lengthcounter
< inputlength
)
1346 //decode the tlv tag
1347 decode_ber_tlv_item((inputfield
+lengthcounter
),&newtag
);
1348 //write the emvtags strucutre
1349 emv_emvtags_decode_tag(&newtag
,result
);
1350 //move to next value and decode
1351 lengthcounter
+= newtag
.fieldlength
-1;
1356 int emv_select(uint8_t* AID
, uint8_t AID_len
, void* data
)
1358 uint16_t selectCmd_len
= 4 + 1 + AID_len
+ 1;
1359 uint8_t selectCmd
[selectCmd_len
];
1361 selectCmd
[0] = 0x00;
1362 selectCmd
[1] = 0xA4;
1363 selectCmd
[2] = 0x04;
1364 selectCmd
[3] = 0x00;
1365 selectCmd
[4] = AID_len
;
1366 memcpy(&(selectCmd
[5]), AID
, AID_len
);
1367 selectCmd
[selectCmd_len
-1] = 0x00;
1368 return iso14_apdu(selectCmd
,selectCmd_len
,false, 0,data
);
1371 //perform READ RECORD
1372 int emv_readrecord(uint8_t recordnumber
, uint8_t sfi
, void* data
)
1374 uint16_t readRecordCmd_len
= 5;
1375 uint8_t readRecordCmd
[readRecordCmd_len
];
1377 readRecordCmd
[0] = 0x00;
1378 readRecordCmd
[1] = 0xB2;
1379 readRecordCmd
[2] = recordnumber
;
1380 readRecordCmd
[3] = ((sfi
<< 3) | 0x04);
1381 readRecordCmd
[4] = 0x00;
1382 return iso14_apdu(readRecordCmd
,readRecordCmd_len
,false,0,data
);
1385 int emv_getprocessingoptions(uint8_t* pdol
, uint8_t pdol_len
, void* data
)
1387 uint16_t processingCmd_len
= 4 + 1 + 2 + pdol_len
+ 1;
1388 uint8_t processingCmd
[processingCmd_len
];
1390 processingCmd
[0] = 0x80;
1391 processingCmd
[1] = 0xA8;
1392 processingCmd
[2] = 0x00;
1393 processingCmd
[3] = 0x00;
1394 processingCmd
[4] = pdol_len
+ 2;
1395 processingCmd
[5] = 0x83; //template
1396 processingCmd
[6] = pdol_len
;
1398 memcpy(&(processingCmd
[7]), pdol
, pdol_len
);}
1399 processingCmd
[processingCmd_len
] = 0x00;
1400 //Dbhexdump(processingCmd_len, processingCmd, false);
1401 return iso14_apdu(processingCmd
,processingCmd_len
,false, 0, data
);
1404 int emv_computecryptogram(uint8_t* UDOL
, uint8_t UDOL_len
, void *data
)
1406 uint16_t cryptogramCmd_len
= 4 + 1 + UDOL_len
+ 1;
1407 uint8_t cryptogramCmd
[cryptogramCmd_len
];
1409 cryptogramCmd
[0] = 0x80;
1410 cryptogramCmd
[1] = 0x2A;
1411 cryptogramCmd
[2] = 0x8E;
1412 cryptogramCmd
[3] = 0x80;
1413 cryptogramCmd
[4] = UDOL_len
;
1414 memcpy(&(cryptogramCmd
[5]), UDOL
, UDOL_len
);
1415 cryptogramCmd
[cryptogramCmd_len
-1] = 0x00;
1417 return iso14_apdu(cryptogramCmd
,cryptogramCmd_len
,false, 0,data
);
1420 int emv_getchallenge(void *data
)
1422 uint16_t challengeCmd_len
= 5;
1423 uint8_t challengeCmd
[challengeCmd_len
];
1425 challengeCmd
[0] = 0x00;
1426 challengeCmd
[1] = 0x84;
1427 challengeCmd
[2] = 0x00;
1428 challengeCmd
[3] = 0x00;
1429 challengeCmd
[4] = 0x00;
1431 return iso14_apdu(challengeCmd
,challengeCmd_len
,false, 0,data
);
1434 int emv_loopback(uint8_t* transData
, uint8_t transData_len
, void *data
)
1436 uint16_t loopbackCmd_len
= 4 + 1 + transData_len
+ 1;
1437 uint8_t loopbackCmd
[loopbackCmd_len
];
1439 loopbackCmd
[0] = 0x00;
1440 loopbackCmd
[1] = 0xEE;
1441 loopbackCmd
[2] = 0x00;
1442 loopbackCmd
[3] = 0x00;
1443 loopbackCmd
[4] = loopbackCmd_len
;
1444 memcpy(&(loopbackCmd
[5]), transData
, transData_len
);
1445 return iso14_apdu(loopbackCmd
,loopbackCmd_len
,false, 0,data
);
1449 int emv_generateAC(uint8_t refcontrolparam
, uint8_t* cdolinput
, uint8_t cdolinputlen
, void* data
)
1451 uint16_t acCmd_len
= 4 + 1 + cdolinputlen
+ 1;
1452 uint8_t acCmd
[acCmd_len
];
1456 acCmd
[2] = refcontrolparam
;
1458 acCmd
[4] = cdolinputlen
;
1459 memcpy(&(acCmd
[5]), cdolinput
, cdolinputlen
);
1460 acCmd
[acCmd_len
-1] = 0x00;
1461 Dbhexdump(acCmd_len
, acCmd
,false);
1462 return iso14_apdu(acCmd
,acCmd_len
,false,0,data
);
1465 int emv_decodeAFL(uint8_t* AFL
, uint8_t AFLlen
)
1471 //Print out AIP Bit meanings
1472 int emv_decodeAIP(uint8_t* AIP
)
1474 if((AIP
[0] & AIP_SDA_SUPPORTED
) == AIP_SDA_SUPPORTED
)
1475 Dbprintf("SDA supported");
1476 if((AIP
[0] & AIP_DDA_SUPPORTED
) == AIP_DDA_SUPPORTED
)
1477 Dbprintf("DDA supported");
1478 if((AIP
[0] & AIP_CARDHOLDER_VERIFICATION
)==AIP_CARDHOLDER_VERIFICATION
)
1479 Dbprintf("Cardholder verification is supported");
1480 if((AIP
[0] & AIP_TERMINAL_RISK
) == AIP_TERMINAL_RISK
)
1481 Dbprintf("Terminal risk management is to be performed");
1482 if((AIP
[0] & AIP_ISSUER_AUTH
) == AIP_ISSUER_AUTH
)
1483 Dbprintf("Issuer authentication is supported ");
1484 if((AIP
[0] & AIP_CDA_SUPPORTED
) == AIP_CDA_SUPPORTED
)
1485 Dbprintf("CDA supported");
1486 if((AIP
[1] & AIP_CHIP_SUPPORTED
) == AIP_CHIP_SUPPORTED
)
1487 Dbprintf("Chip supported");
1488 if((AIP
[1] & AIP_MSR_SUPPORTED
) == AIP_MSR_SUPPORTED
)
1489 Dbprintf("MSR supported");
1493 int emv_decodeCVM(uint8_t* CVM
, uint8_t CVMlen
)
1495 uint8_t counter
= 0;
1496 uint32_t amountX
= 0;
1497 uint32_t amountY
= 0;
1498 amountX
= bytes_to_num(CVM
, 4);
1499 amountY
= bytes_to_num(CVM
+4, 4);
1501 while(counter
< CVMlen
)
1503 if((CVM
[counter
] & 0x40) == 0x40){
1504 if((CVM
[counter
] & 0x3F)== 0x00){
1505 Dbprintf("Fail CVM processing");
1507 if((CVM
[counter
] & 0x3F) == 0x01){
1508 Dbprintf("Plaintext PIN verification performed by ICC");
1510 if((CVM
[counter
] & 0x3F) == 0x02){
1511 Dbprintf("Enciphered PIN verified online");
1513 if((CVM
[counter
] & 0x3F) == 0x03){
1514 Dbprintf("Plaintext PIN verification performed by ICC and signature (paper)");
1516 if((CVM
[counter
] & 0x3F) == 0x04){
1517 Dbprintf("Enciphered PIN verification performed by ICC");
1519 if((CVM
[counter
] & 0x3F) == 0x05){
1520 Dbprintf("Enciphered PIN verification performed by ICC and signature (paper)");
1522 if((CVM
[counter
] & 0x3F) == 0x30){
1523 Dbprintf("Signature (paper)");
1525 if((CVM
[counter
] & 0x3F) == 0x40){
1526 Dbprintf("No CVM required");
1531 Dbprintf("Fail cardholder verification if this CVM is unsuccessful");
1534 if(CVM
[counter
+1] == 0x00){
1535 Dbprintf("Always");}
1536 if(CVM
[counter
+1] == 0x01){
1537 Dbprintf("If unattended cash");}
1538 if(CVM
[counter
+1] == 0x02){
1539 Dbprintf("If not unattended cash and not manual cash and not purchase with cashback");}
1540 if(CVM
[counter
+1] == 0x03){
1541 Dbprintf("If terminal supports the CVM");}
1542 if(CVM
[counter
+1] == 0x04){
1543 Dbprintf("If manual cash");}
1544 if(CVM
[counter
+1] == 0x05){
1545 Dbprintf("If purchase with cashback");}
1546 if(CVM
[counter
+1] == 0x06){
1547 Dbprintf("If transaction is in the application currency and is under %lu value", amountX
);}
1548 if(CVM
[counter
+1] == 0x07){
1549 Dbprintf("If transaction is in the application currency and is over %lu value", amountX
);}
1550 if(CVM
[counter
+1] == 0x08){
1551 Dbprintf("If transaction is in the application currency and is under %lu value", amountY
);}
1552 if(CVM
[counter
+1] == 0x09){
1553 Dbprintf("If transaction is in the application currency and is over %lu value", amountY
);}
1558 //dump the current card to the console
1559 void dumpCard(emvtags
* currentcard
){
1560 DUMP(currentcard
->ATQA
);
1561 Dbhexdump(sizeof(currentcard
->ATQA
), currentcard
->ATQA
, false);
1562 DUMP(currentcard
->UID
);
1563 Dbhexdump(currentcard
->UID_len
, currentcard
->UID
, false);
1564 DUMP(currentcard
->SAK1
);
1565 Dbhexdump(1, ¤tcard
->SAK1
, false);
1566 DUMP(currentcard
->SAK2
);
1567 Dbhexdump(1, ¤tcard
->SAK2
, false);
1568 DUMP(currentcard
->ATS
);
1569 Dbhexdump(currentcard
->ATS_len
, currentcard
->ATS
, false);
1571 DUMP(currentcard
->tag_4F
);
1572 Dbhexdump(currentcard
->tag_4F_len
, currentcard
->tag_4F
, false);
1573 DUMP(currentcard
->tag_50
);
1574 Dbhexdump(currentcard
->tag_50_len
, currentcard
->tag_50
, false);
1575 DUMP(currentcard
->tag_56
);
1576 Dbhexdump(currentcard
->tag_56_len
, currentcard
->tag_56
, false);
1577 DUMP(currentcard
->tag_57
);
1578 Dbhexdump(currentcard
->tag_57_len
, currentcard
->tag_57
, false);
1579 DUMP(currentcard
->tag_5A
);
1580 Dbhexdump(currentcard
->tag_5A_len
, currentcard
->tag_5A
, false);
1581 DUMP(currentcard
->tag_82
);
1582 Dbhexdump(sizeof(currentcard
->tag_82
), currentcard
->tag_82
, false);
1583 DUMP(currentcard
->tag_84
);
1584 Dbhexdump(currentcard
->tag_84_len
, currentcard
->tag_84
, false);
1585 DUMP(currentcard
->tag_86
);
1586 Dbhexdump(currentcard
->tag_86_len
, currentcard
->tag_86
, false);
1587 DUMP(currentcard
->tag_87
);
1588 Dbhexdump(1, currentcard
->tag_87
, false);
1589 DUMP(currentcard
->tag_88
);
1590 Dbhexdump(1, currentcard
->tag_88
, false);
1591 DUMP(currentcard
->tag_8A
);
1592 Dbhexdump(2, currentcard
->tag_8A
, false);
1593 DUMP(currentcard
->tag_8C
);
1594 Dbhexdump(currentcard
->tag_8C_len
, currentcard
->tag_8C
, false);
1595 DUMP(currentcard
->tag_8D
);
1596 Dbhexdump(currentcard
->tag_8D_len
, currentcard
->tag_8D
, false);
1597 DUMP(currentcard
->tag_8E
);
1598 Dbhexdump(currentcard
->tag_8E_len
, currentcard
->tag_8E
, false);
1599 DUMP(currentcard
->tag_8F
);
1600 Dbhexdump(1, currentcard
->tag_8F
, false);
1601 DUMP(currentcard
->tag_90
);
1602 Dbhexdump(currentcard
->tag_90_len
, currentcard
->tag_90
, false);
1603 DUMP(currentcard
->tag_92
);
1604 Dbhexdump(currentcard
->tag_92_len
, currentcard
->tag_92
, false);
1605 DUMP(currentcard
->tag_93
);
1606 Dbhexdump(currentcard
->tag_93_len
, currentcard
->tag_93
, false);
1607 DUMP(currentcard
->tag_94
);
1608 Dbhexdump(currentcard
->tag_94_len
, currentcard
->tag_94
, false);
1609 DUMP(currentcard
->tag_95
);
1610 Dbhexdump(5, currentcard
->tag_95
, false);
1611 DUMP(currentcard
->tag_97
);
1612 Dbhexdump(currentcard
->tag_97_len
, currentcard
->tag_97
, false);
1613 DUMP(currentcard
->tag_98
);
1614 Dbhexdump(20, currentcard
->tag_98
, false);
1615 DUMP(currentcard
->tag_99
);
1616 Dbhexdump(currentcard
->tag_99_len
, currentcard
->tag_99
, false);
1617 DUMP(currentcard
->tag_9A
);
1618 Dbhexdump(3, currentcard
->tag_9A
, false);
1619 DUMP(currentcard
->tag_9B
);
1620 Dbhexdump(2, currentcard
->tag_9B
, false);
1621 DUMP(currentcard
->tag_9C
);
1622 Dbhexdump(1, currentcard
->tag_9C
, false);
1623 DUMP(currentcard
->tag_9D
);
1624 Dbhexdump(currentcard
->tag_9D_len
, currentcard
->tag_9D
, false);
1625 DUMP(currentcard
->tag_CD
);
1626 Dbhexdump(3, currentcard
->tag_CD
, false);
1627 DUMP(currentcard
->tag_CE
);
1628 Dbhexdump(3, currentcard
->tag_CE
, false);
1629 DUMP(currentcard
->tag_CF
);
1630 Dbhexdump(3, currentcard
->tag_CF
, false);
1631 DUMP(currentcard
->tag_D7
);
1632 Dbhexdump(3, currentcard
->tag_D7
, false);
1633 DUMP(currentcard
->tag_D8
);
1634 Dbhexdump(2, currentcard
->tag_D8
, false);
1635 DUMP(currentcard
->tag_D9
);
1636 Dbhexdump(currentcard
->tag_D9_len
, currentcard
->tag_D9
, false);
1637 DUMP(currentcard
->tag_DA
);
1638 Dbhexdump(2, currentcard
->tag_DA
, false);
1639 DUMP(currentcard
->tag_DB
);
1640 Dbhexdump(2, currentcard
->tag_DB
, false);
1641 DUMP(currentcard
->tag_DC
);
1642 Dbhexdump(2, currentcard
->tag_DC
, false);
1643 DUMP(currentcard
->tag_DD
);
1644 Dbhexdump(2, currentcard
->tag_DD
, false);
1645 DUMP(currentcard
->tag_AF
);
1646 Dbhexdump(currentcard
->tag_AF_len
, currentcard
->tag_AF
, false);
1647 DUMP(currentcard
->tag_5F20
);
1648 Dbhexdump(currentcard
->tag_5F20_len
, currentcard
->tag_5F20
, false);
1649 DUMP(currentcard
->tag_5F24
);
1650 Dbhexdump(3, currentcard
->tag_5F24
, false);
1651 DUMP(currentcard
->tag_5F25
);
1652 Dbhexdump(3, currentcard
->tag_5F25
, false);
1653 DUMP(currentcard
->tag_5F28
);
1654 Dbhexdump(2, currentcard
->tag_5F28
, false);
1655 DUMP(currentcard
->tag_5F2A
);
1656 Dbhexdump(2, currentcard
->tag_5F2A
, false);
1657 DUMP(currentcard
->tag_5F2D
);
1658 Dbhexdump(currentcard
->tag_5F2D_len
, currentcard
->tag_5F2D
, false);
1659 DUMP(currentcard
->tag_5F30
);
1660 Dbhexdump(3, currentcard
->tag_5F30
, false);
1661 DUMP(currentcard
->tag_5F34
);
1662 Dbhexdump(1, currentcard
->tag_5F34
, false);
1663 DUMP(currentcard
->tag_5F36
);
1664 Dbhexdump(2, currentcard
->tag_5F36
, false);
1665 DUMP(currentcard
->tag_5F50
);
1666 Dbhexdump(currentcard
->tag_5F50_len
, currentcard
->tag_5F50
, false);
1667 DUMP(currentcard
->tag_5F54
);
1668 Dbhexdump(currentcard
->tag_5F54_len
, currentcard
->tag_5F54
, false);
1669 DUMP(currentcard
->tag_9F01
);
1670 Dbhexdump(6, currentcard
->tag_9F01
, false);
1671 DUMP(currentcard
->tag_9F02
);
1672 Dbhexdump(6, currentcard
->tag_9F02
, false);
1673 DUMP(currentcard
->tag_9F03
);
1674 Dbhexdump(6, currentcard
->tag_9F03
, false);
1675 DUMP(currentcard
->tag_9F04
);
1676 Dbhexdump(4, currentcard
->tag_9F04
, false);
1677 DUMP(currentcard
->tag_9F05
);
1678 Dbhexdump(currentcard
->tag_9F05_len
, currentcard
->tag_9F05
, false);
1679 DUMP(currentcard
->tag_9F06
);
1680 Dbhexdump(currentcard
->tag_9F06_len
, currentcard
->tag_9F06
, false);
1681 DUMP(currentcard
->tag_9F07
);
1682 Dbhexdump(2, currentcard
->tag_9F07
, false);
1683 DUMP(currentcard
->tag_9F08
);
1684 Dbhexdump(2, currentcard
->tag_9F08
, false);
1685 DUMP(currentcard
->tag_9F09
);
1686 Dbhexdump(2, currentcard
->tag_9F09
, false);
1687 DUMP(currentcard
->tag_9F0B
);
1688 Dbhexdump(currentcard
->tag_9F0B_len
, currentcard
->tag_9F0B
, false);
1689 DUMP(currentcard
->tag_9F0D
);
1690 Dbhexdump(5, currentcard
->tag_9F0D
, false);
1691 DUMP(currentcard
->tag_9F0E
);
1692 Dbhexdump(5, currentcard
->tag_9F0E
, false);
1693 DUMP(currentcard
->tag_9F0F
);
1694 Dbhexdump(5, currentcard
->tag_9F0F
, false);
1695 DUMP(currentcard
->tag_9F10
);
1696 Dbhexdump(currentcard
->tag_9F10_len
, currentcard
->tag_9F10
, false);
1697 DUMP(currentcard
->tag_9F11
);
1698 Dbhexdump(1, currentcard
->tag_9F11
, false);
1699 DUMP(currentcard
->tag_9F12
);
1700 Dbhexdump(currentcard
->tag_9F12_len
, currentcard
->tag_9F12
, false);
1701 DUMP(currentcard
->tag_9F13
);
1702 Dbhexdump(2, currentcard
->tag_9F13
, false);
1703 DUMP(currentcard
->tag_9F14
);
1704 Dbhexdump(1, currentcard
->tag_9F14
, false);
1705 DUMP(currentcard
->tag_9F15
);
1706 Dbhexdump(2, currentcard
->tag_9F15
, false);
1707 DUMP(currentcard
->tag_9F16
);
1708 Dbhexdump(15, currentcard
->tag_9F16
, false);
1709 DUMP(currentcard
->tag_9F17
);
1710 Dbhexdump(1, currentcard
->tag_9F17
, false);
1711 DUMP(currentcard
->tag_9F18
);
1712 Dbhexdump(4, currentcard
->tag_9F18
, false);
1713 DUMP(currentcard
->tag_9F1A
);
1714 Dbhexdump(2, currentcard
->tag_9F1A
, false);
1715 DUMP(currentcard
->tag_9F1B
);
1716 Dbhexdump(4, currentcard
->tag_9F1B
, false);
1717 DUMP(currentcard
->tag_9F1C
);
1718 Dbhexdump(8, currentcard
->tag_9F1C
, false);
1719 DUMP(currentcard
->tag_9F1D
);
1720 Dbhexdump(currentcard
->tag_9F1D_len
, currentcard
->tag_9F1D
, false);
1721 DUMP(currentcard
->tag_9F1E
);
1722 Dbhexdump(8, currentcard
->tag_9F1E
, false);
1723 DUMP(currentcard
->tag_9F1F
);
1724 Dbhexdump(currentcard
->tag_9F1F_len
, currentcard
->tag_9F1F
, false);
1725 DUMP(currentcard
->tag_9F20
);
1726 Dbhexdump(currentcard
->tag_9F20_len
, currentcard
->tag_9F20
, false);
1727 DUMP(currentcard
->tag_9F21
);
1728 Dbhexdump(3, currentcard
->tag_9F1E
, false);
1729 DUMP(currentcard
->tag_9F22
);
1730 Dbhexdump(1, currentcard
->tag_9F22
, false);
1731 DUMP(currentcard
->tag_9F23
);
1732 Dbhexdump(1, currentcard
->tag_9F23
, false);
1733 DUMP(currentcard
->tag_9F26
);
1734 Dbhexdump(8, currentcard
->tag_9F26
, false);
1735 DUMP(currentcard
->tag_9F27
);
1736 Dbhexdump(1, currentcard
->tag_9F27
, false);
1737 DUMP(currentcard
->tag_9F2D
);
1738 Dbhexdump(currentcard
->tag_9F2D_len
, currentcard
->tag_9F2D
, false);
1739 DUMP(currentcard
->tag_9F2E
);
1740 Dbhexdump(3, currentcard
->tag_9F2E
, false);
1741 DUMP(currentcard
->tag_9F2F
);
1742 Dbhexdump(currentcard
->tag_9F2F_len
, currentcard
->tag_9F2F
, false);
1743 DUMP(currentcard
->tag_9F32
);
1744 Dbhexdump(currentcard
->tag_9F32_len
, currentcard
->tag_9F32
, false);
1745 DUMP(currentcard
->tag_9F33
);
1746 Dbhexdump(3, currentcard
->tag_9F33
, false);
1747 DUMP(currentcard
->tag_9F34
);
1748 Dbhexdump(3, currentcard
->tag_9F34
, false);
1749 DUMP(currentcard
->tag_9F35
);
1750 Dbhexdump(1, currentcard
->tag_9F35
, false);
1751 DUMP(currentcard
->tag_9F36
);
1752 Dbhexdump(2, currentcard
->tag_9F36
, false);
1753 DUMP(currentcard
->tag_9F37
);
1754 Dbhexdump(4, currentcard
->tag_9F37
, false);
1755 DUMP(currentcard
->tag_9F38
);
1756 Dbhexdump(currentcard
->tag_9F38_len
, currentcard
->tag_9F38
, false);
1757 DUMP(currentcard
->tag_9F39
);
1758 Dbhexdump(1, currentcard
->tag_9F39
, false);
1759 DUMP(currentcard
->tag_9F39
);
1760 Dbhexdump(1, currentcard
->tag_9F39
, false);
1761 DUMP(currentcard
->tag_9F40
);
1762 Dbhexdump(5, currentcard
->tag_9F40
, false);
1763 DUMP(currentcard
->tag_9F41
);
1764 Dbhexdump(4, currentcard
->tag_9F41
, false);
1765 DUMP(currentcard
->tag_9F42
);
1766 Dbhexdump(2, currentcard
->tag_9F42
, false);
1767 DUMP(currentcard
->tag_9F43
);
1768 Dbhexdump(4, currentcard
->tag_9F43
, false);
1769 DUMP(currentcard
->tag_9F44
);
1770 Dbhexdump(1, currentcard
->tag_9F44
, false);
1771 DUMP(currentcard
->tag_9F45
);
1772 Dbhexdump(2, currentcard
->tag_9F45
, false);
1773 DUMP(currentcard
->tag_9F46
);
1774 Dbhexdump(currentcard
->tag_9F46_len
, currentcard
->tag_9F46
, false);
1775 DUMP(currentcard
->tag_9F47
);
1776 Dbhexdump(currentcard
->tag_9F47_len
, currentcard
->tag_9F47
, false);
1777 DUMP(currentcard
->tag_9F48
);
1778 Dbhexdump(currentcard
->tag_9F48_len
, currentcard
->tag_9F48
, false);
1779 DUMP(currentcard
->tag_9F49
);
1780 Dbhexdump(currentcard
->tag_9F49_len
, currentcard
->tag_9F49
, false);
1781 DUMP(currentcard
->tag_9F4A
);
1782 Dbhexdump(1, currentcard
->tag_9F4A
, false);
1783 DUMP(currentcard
->tag_9F4B
);
1784 Dbhexdump(currentcard
->tag_9F4B_len
, currentcard
->tag_9F4B
, false);
1785 DUMP(currentcard
->tag_9F4C
);
1786 Dbhexdump(8, currentcard
->tag_9F4C
, false);
1787 DUMP(currentcard
->tag_9F4D
);
1788 Dbhexdump(2, currentcard
->tag_9F4D
, false);
1789 DUMP(currentcard
->tag_9F4E
);
1790 Dbhexdump(255, currentcard
->tag_9F4E
, false);
1791 DUMP(currentcard
->tag_9F60
);
1792 Dbhexdump(2, currentcard
->tag_9F60
, false);
1793 DUMP(currentcard
->tag_9F61
);
1794 Dbhexdump(2, currentcard
->tag_9F61
, false);
1795 DUMP(currentcard
->tag_9F62
);
1796 Dbhexdump(6, currentcard
->tag_9F62
, false);
1797 DUMP(currentcard
->tag_9F63
);
1798 Dbhexdump(6, currentcard
->tag_9F63
, false);
1799 DUMP(currentcard
->tag_9F64
);
1800 Dbhexdump(1, currentcard
->tag_9F64
, false);
1801 DUMP(currentcard
->tag_9F65
);
1802 Dbhexdump(2, currentcard
->tag_9F65
, false);
1803 DUMP(currentcard
->tag_9F66
);
1804 Dbhexdump(2, currentcard
->tag_9F66
, false);
1805 DUMP(currentcard
->tag_9F67
);
1806 Dbhexdump(1, currentcard
->tag_9F67
, false);
1807 DUMP(currentcard
->tag_9F68
);
1808 Dbhexdump(currentcard
->tag_9F68_len
, currentcard
->tag_9F68
, false);
1809 DUMP(currentcard
->tag_9F69
);
1810 Dbhexdump(currentcard
->tag_9F69_len
, currentcard
->tag_9F69
, false);
1811 DUMP(currentcard
->tag_9F6A
);
1812 Dbhexdump(8, currentcard
->tag_9F6A
, false);
1813 DUMP(currentcard
->tag_9F6B
);
1814 Dbhexdump(currentcard
->tag_9F6B_len
, currentcard
->tag_9F6B
, false);
1815 DUMP(currentcard
->tag_9F6C
);
1816 Dbhexdump(2, currentcard
->tag_9F6C
, false);
1817 DUMP(currentcard
->tag_61
);
1818 Dbhexdump(currentcard
->tag_61_len
, currentcard
->tag_61
, false);
1819 DUMP(currentcard
->tag_A5
);
1820 Dbhexdump(currentcard
->tag_A5_len
, currentcard
->tag_A5
, false);
1821 DUMP(currentcard
->tag_DFNAME
);
1822 Dbhexdump(currentcard
->tag_DFNAME_len
, currentcard
->tag_DFNAME
, false);
1823 DUMP(currentcard
->tag_70
);
1824 Dbhexdump(currentcard
->tag_70_len
, currentcard
->tag_70
, false);
1825 DUMP(currentcard
->tag_77
);
1826 Dbhexdump(currentcard
->tag_77_len
, currentcard
->tag_77
, false);
1827 DUMP(currentcard
->tag_80
);
1828 Dbhexdump(currentcard
->tag_80_len
, currentcard
->tag_80
, false);
1829 DUMP(currentcard
->tag_91
);
1830 Dbhexdump(currentcard
->tag_91_len
, currentcard
->tag_91
, false);
1831 DUMP(currentcard
->tag_BF0C
);
1832 Dbhexdump(currentcard
->tag_BF0C_len
, currentcard
->tag_BF0C
, false);
1833 DUMP(currentcard
->tag_DFName
);
1834 Dbhexdump(currentcard
->tag_DFName_len
, currentcard
->tag_DFName
, false);