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
;
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
));
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};
373 //if((strlen((const char *)datain)%2) != 0){ //must be an even string
376 //if(strlen((const char *)datain) > 255) {
379 uint8_t datalen
= strlen((const char *)datain
) / 2; //length of datain
380 for(int i
=0;i
<strlen((const char *)datain
);i
+=2){
381 binarydata
[i
/2] |= (char)hex2int(datain
[i
]) << 4;
382 binarydata
[i
/2] |= (char)hex2int(datain
[i
+1]);
384 Dbprintf("BINARYDATA=");
385 Dbhexdump(datalen
,(uint8_t *)binarydata
,false);
389 memcpy(currentcard
->tag_4F
, binarydata
, datalen
);
390 currentcard
->tag_4F_len
= datalen
;
393 memcpy(currentcard
->tag_50
, binarydata
, datalen
);
394 currentcard
->tag_50_len
= datalen
;
397 memcpy(currentcard
->tag_56
, binarydata
, datalen
);
398 currentcard
->tag_56_len
= datalen
;
401 memcpy(currentcard
->tag_57
, binarydata
, datalen
);
402 currentcard
->tag_57_len
= datalen
;
405 memcpy(currentcard
->tag_5A
, binarydata
, datalen
);
406 currentcard
->tag_5A_len
= datalen
;
409 memcpy(currentcard
->tag_61
, binarydata
, datalen
);
410 currentcard
->tag_61_len
= datalen
;
413 memcpy(currentcard
->tag_6F
, binarydata
, datalen
);
414 currentcard
->tag_6F_len
= datalen
;
417 memcpy(currentcard
->tag_70
, binarydata
, datalen
);
418 currentcard
->tag_70_len
= datalen
;
421 memcpy(currentcard
->tag_77
, binarydata
, datalen
);
422 currentcard
->tag_77_len
= datalen
;
425 memcpy(currentcard
->tag_80
, binarydata
, datalen
);
426 currentcard
->tag_80_len
= datalen
;
429 memcpy(currentcard
->tag_82
, binarydata
, sizeof(currentcard
->tag_82
));
432 memcpy(currentcard
->tag_84
, binarydata
, datalen
);
433 currentcard
->tag_84_len
= datalen
;
436 memcpy(currentcard
->tag_86
, binarydata
, datalen
);
437 currentcard
->tag_86_len
= datalen
;
440 memcpy(currentcard
->tag_87
, binarydata
, sizeof(currentcard
->tag_87
));
443 memcpy(currentcard
->tag_88
, binarydata
, sizeof(currentcard
->tag_88
));
446 memcpy(currentcard
->tag_8A
, binarydata
, sizeof(currentcard
->tag_8A
));
449 memcpy(currentcard
->tag_8C
, binarydata
, datalen
);
450 currentcard
->tag_8C_len
= datalen
;
453 memcpy(currentcard
->tag_8D
, binarydata
, datalen
);
454 currentcard
->tag_8D_len
= datalen
;
457 memcpy(currentcard
->tag_8E
, binarydata
, datalen
);
458 currentcard
->tag_8E_len
= datalen
;
461 memcpy(currentcard
->tag_8F
, binarydata
, sizeof(currentcard
->tag_8F
));
464 memcpy(currentcard
->tag_90
, binarydata
, datalen
);
465 currentcard
->tag_90_len
= datalen
;
468 memcpy(currentcard
->tag_91
, binarydata
, datalen
);
469 currentcard
->tag_91_len
= datalen
;
472 memcpy(currentcard
->tag_92
, binarydata
, datalen
);
473 currentcard
->tag_92_len
= datalen
;
476 memcpy(currentcard
->tag_93
, binarydata
, datalen
);
477 currentcard
->tag_93_len
= datalen
;
480 memcpy(currentcard
->tag_94
, binarydata
, datalen
);
481 currentcard
->tag_94_len
= datalen
;
484 memcpy(currentcard
->tag_95
, binarydata
, sizeof(currentcard
->tag_95
));
487 memcpy(currentcard
->tag_97
, binarydata
, datalen
);
488 currentcard
->tag_97_len
= datalen
;
491 memcpy(currentcard
->tag_98
, binarydata
, sizeof(currentcard
->tag_98
));
494 memcpy(currentcard
->tag_99
, binarydata
, datalen
);
495 currentcard
->tag_99_len
= datalen
;
498 memcpy(currentcard
->tag_9A
, binarydata
, sizeof(currentcard
->tag_9A
));
501 memcpy(currentcard
->tag_9B
, binarydata
, sizeof(currentcard
->tag_9B
));
504 memcpy(currentcard
->tag_9C
, binarydata
, sizeof(currentcard
->tag_9C
));
507 memcpy(currentcard
->tag_9D
, binarydata
, datalen
);
508 currentcard
->tag_9D_len
= datalen
;
511 memcpy(currentcard
->tag_A5
, binarydata
, datalen
);
512 currentcard
->tag_A5_len
= datalen
;
515 memcpy(currentcard
->tag_AF
, binarydata
, datalen
);
516 currentcard
->tag_AF_len
= datalen
;
519 memcpy(currentcard
->tag_CD
, binarydata
, sizeof(currentcard
->tag_CD
));
522 memcpy(currentcard
->tag_CE
, binarydata
, sizeof(currentcard
->tag_CE
));
525 memcpy(currentcard
->tag_CF
, binarydata
, sizeof(currentcard
->tag_CF
));
528 memcpy(currentcard
->tag_CF
, binarydata
, sizeof(currentcard
->tag_CF
));
531 memcpy(currentcard
->tag_CF
, binarydata
, sizeof(currentcard
->tag_CF
));
536 memcpy(currentcard
->tag_DA
, binarydata
, sizeof(currentcard
->tag_DA
));
539 memcpy(currentcard
->tag_DB
, binarydata
, sizeof(currentcard
->tag_DB
));
542 memcpy(currentcard
->tag_DB
, binarydata
, sizeof(currentcard
->tag_DB
));
545 memcpy(currentcard
->tag_DD
, binarydata
, sizeof(currentcard
->tag_DD
));
550 memcpy(currentcard
->tag_5F24
, binarydata
, sizeof(currentcard
->tag_5F24
));
553 memcpy(currentcard
->tag_5F25
, binarydata
, sizeof(currentcard
->tag_5F25
));
556 memcpy(currentcard
->tag_5F28
, binarydata
, sizeof(currentcard
->tag_5F28
));
559 memcpy(currentcard
->tag_5F2A
, binarydata
, sizeof(currentcard
->tag_5F2A
));
564 memcpy(currentcard
->tag_5F30
, binarydata
, sizeof(currentcard
->tag_5F30
));
567 memcpy(currentcard
->tag_5F34
, binarydata
, sizeof(currentcard
->tag_5F34
));
570 memcpy(currentcard
->tag_5F36
, binarydata
, sizeof(currentcard
->tag_5F36
));
575 memcpy(currentcard
->tag_5F54
, binarydata
, sizeof(currentcard
->tag_5F54
));
578 memcpy(currentcard
->tag_9F01
, binarydata
, sizeof(currentcard
->tag_9F01
));
581 memcpy(currentcard
->tag_9F02
, binarydata
, sizeof(currentcard
->tag_9F02
));
584 memcpy(currentcard
->tag_9F03
, binarydata
, sizeof(currentcard
->tag_9F03
));
587 memcpy(currentcard
->tag_9F04
, binarydata
, sizeof(currentcard
->tag_9F04
));
590 memcpy(currentcard
->tag_9F05
, binarydata
, datalen
);
591 currentcard
->tag_9F05_len
= datalen
;
594 memcpy(currentcard
->tag_9F06
, binarydata
, datalen
);
595 currentcard
->tag_9F06_len
= datalen
;
598 memcpy(currentcard
->tag_9F07
, binarydata
, sizeof(currentcard
->tag_9F07
));
601 memcpy(currentcard
->tag_9F08
, binarydata
, sizeof(currentcard
->tag_9F08
));
604 memcpy(currentcard
->tag_9F09
, binarydata
, sizeof(currentcard
->tag_9F09
));
607 memcpy(currentcard
->tag_9F0B
, binarydata
, sizeof(currentcard
->tag_9F0B
));
610 memcpy(currentcard
->tag_9F0D
, binarydata
, sizeof(currentcard
->tag_9F0D
));
613 memcpy(currentcard
->tag_9F0E
, binarydata
, sizeof(currentcard
->tag_9F0E
));
616 memcpy(currentcard
->tag_9F0F
, binarydata
, sizeof(currentcard
->tag_9F0F
));
619 memcpy(currentcard
->tag_9F10
, binarydata
, datalen
);
620 currentcard
->tag_9F10_len
= datalen
;break;
622 memcpy(currentcard
->tag_9F11
, binarydata
, sizeof(currentcard
->tag_9F11
));
625 memcpy(currentcard
->tag_9F12
, binarydata
, datalen
);
626 currentcard
->tag_9F12_len
= datalen
;break;
628 memcpy(currentcard
->tag_9F13
, binarydata
, sizeof(currentcard
->tag_9F13
));
631 memcpy(currentcard
->tag_9F14
, binarydata
, sizeof(currentcard
->tag_9F14
));
634 memcpy(currentcard
->tag_9F15
, binarydata
, sizeof(currentcard
->tag_9F15
));
637 memcpy(currentcard
->tag_9F16
, binarydata
, sizeof(currentcard
->tag_9F16
));
640 memcpy(currentcard
->tag_9F17
, binarydata
, sizeof(currentcard
->tag_9F17
));
643 memcpy(currentcard
->tag_9F18
, binarydata
, sizeof(currentcard
->tag_9F18
));
646 memcpy(currentcard
->tag_9F1A
, binarydata
, sizeof(currentcard
->tag_9F1A
));
649 memcpy(currentcard
->tag_9F1B
, binarydata
, sizeof(currentcard
->tag_9F1B
));
652 memcpy(currentcard
->tag_9F1C
, binarydata
, sizeof(currentcard
->tag_9F1C
));
655 memcpy(currentcard
->tag_9F1D
, binarydata
, datalen
);
656 currentcard
->tag_9F1D_len
= datalen
;break;
658 memcpy(currentcard
->tag_9F1E
, binarydata
, sizeof(currentcard
->tag_9F1E
));
661 memcpy(currentcard
->tag_9F1F
, binarydata
, datalen
);
662 currentcard
->tag_9F1F_len
= datalen
;break;
664 memcpy(currentcard
->tag_9F20
, binarydata
, datalen
);
665 currentcard
->tag_9F20_len
= datalen
;break;
667 memcpy(currentcard
->tag_9F21
, binarydata
, sizeof(currentcard
->tag_9F21
));
670 memcpy(currentcard
->tag_9F22
, binarydata
, sizeof(currentcard
->tag_9F22
));
673 memcpy(currentcard
->tag_9F23
, binarydata
, sizeof(currentcard
->tag_9F23
));
676 memcpy(currentcard
->tag_9F26
, binarydata
, sizeof(currentcard
->tag_9F26
));
679 memcpy(currentcard
->tag_9F27
, binarydata
, sizeof(currentcard
->tag_9F27
));
682 memcpy(currentcard
->tag_9F2D
, binarydata
, datalen
);
683 currentcard
->tag_9F2D_len
= datalen
;break;
685 memcpy(currentcard
->tag_9F2E
, binarydata
, sizeof(currentcard
->tag_9F2E
));
688 memcpy(currentcard
->tag_9F2F
, binarydata
, datalen
);
689 currentcard
->tag_9F2F_len
= datalen
;break;
691 memcpy(currentcard
->tag_9F32
, binarydata
, datalen
);
692 currentcard
->tag_9F32_len
= datalen
;break;
694 memcpy(currentcard
->tag_9F33
, binarydata
, sizeof(currentcard
->tag_9F33
));
697 memcpy(currentcard
->tag_9F34
, binarydata
, sizeof(currentcard
->tag_9F34
));
700 memcpy(currentcard
->tag_9F35
, binarydata
, sizeof(currentcard
->tag_9F35
));
703 memcpy(currentcard
->tag_9F36
, binarydata
, sizeof(currentcard
->tag_9F36
));
706 memcpy(currentcard
->tag_9F37
, binarydata
, sizeof(currentcard
->tag_9F37
));
711 memcpy(currentcard
->tag_9F39
, binarydata
, sizeof(currentcard
->tag_9F39
));
714 memcpy(currentcard
->tag_9F40
, binarydata
, sizeof(currentcard
->tag_9F40
));
717 memcpy(currentcard
->tag_9F41
, binarydata
, sizeof(currentcard
->tag_9F41
));
720 memcpy(currentcard
->tag_9F42
, binarydata
, sizeof(currentcard
->tag_9F42
));
723 memcpy(currentcard
->tag_9F43
, binarydata
, sizeof(currentcard
->tag_9F43
));
726 memcpy(currentcard
->tag_9F44
, binarydata
, sizeof(currentcard
->tag_9F44
));
729 memcpy(currentcard
->tag_9F45
, binarydata
, sizeof(currentcard
->tag_9F45
));
732 memcpy(currentcard
->tag_9F46
, binarydata
, datalen
);
733 currentcard
->tag_9F46_len
= datalen
;break;
735 memcpy(currentcard
->tag_9F47
, binarydata
, datalen
);
736 currentcard
->tag_9F47_len
= datalen
;break;
738 memcpy(currentcard
->tag_9F48
, binarydata
, datalen
);
739 currentcard
->tag_9F48_len
= datalen
;break;
741 memcpy(currentcard
->tag_9F49
, binarydata
, datalen
);
742 currentcard
->tag_9F49_len
= datalen
;break;
744 memcpy(currentcard
->tag_9F4A
, binarydata
, sizeof(currentcard
->tag_9F4A
));
747 memcpy(currentcard
->tag_9F4B
, binarydata
, datalen
);
748 currentcard
->tag_9F4B_len
= datalen
;break;
750 memcpy(currentcard
->tag_9F4C
, binarydata
, sizeof(currentcard
->tag_9F4C
));
753 memcpy(currentcard
->tag_9F4D
, binarydata
, sizeof(currentcard
->tag_9F4D
));
756 memcpy(currentcard
->tag_9F4E
, binarydata
, sizeof(currentcard
->tag_9F4E
));
759 memcpy(currentcard
->tag_9F60
, binarydata
, sizeof(currentcard
->tag_9F60
));
762 memcpy(currentcard
->tag_9F61
, binarydata
, sizeof(currentcard
->tag_9F61
));
765 memcpy(currentcard
->tag_9F62
, binarydata
, sizeof(currentcard
->tag_9F62
));
768 memcpy(currentcard
->tag_9F63
, binarydata
, sizeof(currentcard
->tag_9F63
));
771 memcpy(currentcard
->tag_9F64
, binarydata
, sizeof(currentcard
->tag_9F64
));
774 memcpy(currentcard
->tag_9F65
, binarydata
, sizeof(currentcard
->tag_9F65
));
777 memcpy(currentcard
->tag_9F66
, binarydata
, sizeof(currentcard
->tag_9F66
));
780 memcpy(currentcard
->tag_9F67
, binarydata
, sizeof(currentcard
->tag_9F67
));
783 memcpy(currentcard
->tag_9F68
, binarydata
, datalen
);
784 currentcard
->tag_9F68_len
= datalen
;break;
786 memcpy(currentcard
->tag_9F69
, binarydata
, datalen
);
787 currentcard
->tag_9F69_len
= datalen
;break;
789 memcpy(currentcard
->tag_9F6A
, binarydata
, sizeof(currentcard
->tag_9F6A
));
792 memcpy(currentcard
->tag_9F6B
, binarydata
, sizeof(currentcard
->tag_9F6B
));
795 memcpy(currentcard
->tag_9F6C
, binarydata
, sizeof(currentcard
->tag_9F6C
));
798 memcpy(currentcard
->tag_BF0C
, binarydata
, datalen
);
799 currentcard
->tag_BF0C_len
= datalen
;break;
806 /* generates an emv template based off tag values supplied */
807 int emv_generatetemplate(uint8_t* templateval
,emvtags
* currentcard
, uint8_t* returnedval
, uint8_t* returnedlen
,uint8_t numtags
, ...)
810 uint8_t* currenttag
; //value of the current tag
811 uint8_t tagval
[255]; //buffer to hold the extracted tag value
812 uint8_t taglen
= 0; //extracted tag length
813 uint8_t bufferval
[255];
815 uint32_t encodedlen
= 0;
816 va_start(arguments
, numtags
);
817 for(int x
=0; x
<numtags
; x
++){
818 currenttag
= va_arg(arguments
, uint8_t*);
819 emv_lookuptag(currenttag
, currentcard
, tagval
, &taglen
);
820 encode_ber_tlv_item(currenttag
, (uint8_t)strlen((const char*)currenttag
), tagval
, (uint32_t)taglen
, bufferval
+counter
, &encodedlen
);
821 counter
+=encodedlen
;
823 encode_ber_tlv_item(templateval
, strlen((const char*) templateval
), bufferval
, counter
, returnedval
, &encodedlen
);
824 *returnedlen
= encodedlen
;
828 //generate a valid pdol list
829 int emv_generateDOL(uint8_t* DOL
, uint8_t DOLlen
,emvtags
* currentcard
,uint8_t* DOLoutput
, uint8_t* DOLoutputlen
)
831 if(!DOL
|| !currentcard
|| !DOLoutput
) // null pointer checks
833 //scan through the DOL list and construct the result.
835 uint8_t DOLcounter
= 0; //points to the current DOL buffer location
836 uint8_t scannedtaglen
= 0; //length of a scanned tag
837 uint8_t scannedtag
[2] = {0x00,0x00}; //buffer for the scanned tag
838 uint8_t DOLoutputbuffer
[255];
839 uint8_t retrievedtagvallen
;
841 memset(DOLoutputbuffer
,0x00, 255); //clear the output buffer
845 if((*(DOL
+i
) & 0x1F) == 0x1F)
846 { scannedtaglen
= 2;}
849 memcpy(scannedtag
, DOL
+i
,scannedtaglen
);
850 //look up tag value and copy
851 //Dbhexdump(2,scannedtag,false);
852 emv_lookuptag(scannedtag
,currentcard
,&(DOLoutputbuffer
[DOLcounter
]),&retrievedtagvallen
);
853 DOLcounter
+= (uint8_t)DOL
[i
+scannedtaglen
];
854 i
+= scannedtaglen
+ 1;
855 memset(scannedtag
, 0x00, 2); //clear current tag
858 memcpy(DOLoutput
, DOLoutputbuffer
, DOLcounter
);
859 *DOLoutputlen
= DOLcounter
;
864 //decode the tag inputted and fill in the supplied structure. clean up the cleanup_passpass function
865 int emv_emvtags_decode_tag(tlvtag
* inputtag
, emvtags
* currentcard
)
867 if(!inputtag
|| !currentcard
) {
871 if(*(inputtag
->tag
) == 0x5F) {
872 if(*(inputtag
->tag
+1) == 0x20){
873 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F20
)))
875 memcpy(currentcard
->tag_5F20
, inputtag
->value
, inputtag
->valuelength
);
876 currentcard
->tag_5F20_len
= inputtag
->valuelength
;
878 if(*(inputtag
->tag
+1) == 0x24){
879 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F24
)))
881 memcpy(currentcard
->tag_5F24
, inputtag
->value
, sizeof(currentcard
->tag_5F24
));}
882 if(*(inputtag
->tag
+1) == 0x25){
883 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F25
)))
885 memcpy(currentcard
->tag_5F25
, inputtag
->value
, inputtag
->valuelength
);}
886 if(*(inputtag
->tag
+1) == 0x28){
887 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F28
)))
889 memcpy(currentcard
->tag_5F28
, inputtag
->value
, inputtag
->valuelength
);}
890 if(*(inputtag
->tag
+1) == 0x2A){
891 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F2A
)))
893 memcpy(currentcard
->tag_5F2A
, inputtag
->value
, inputtag
->valuelength
);}
894 if(*(inputtag
->tag
+1) == 0x2D){
895 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F2D
)))
897 memcpy(currentcard
->tag_5F2D
, inputtag
->value
, inputtag
->valuelength
);
898 currentcard
->tag_5F2D_len
= inputtag
->valuelength
;}
899 if(*(inputtag
->tag
+1) == 0x30){
900 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F30
)))
902 memcpy(currentcard
->tag_5F30
, inputtag
->value
, inputtag
->valuelength
);}
903 if(*(inputtag
->tag
+1) == 0x34){
904 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F34
)))
906 memcpy(currentcard
->tag_5F34
, inputtag
->value
, sizeof(currentcard
->tag_5F34
));}
907 if(*(inputtag
->tag
+1) == 0x36){
908 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F36
)))
910 memcpy(currentcard
->tag_5F36
, inputtag
->value
, sizeof(currentcard
->tag_5F36
));}
911 if(*(inputtag
->tag
+1) == 0x50){
912 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F50
)))
914 memcpy(currentcard
->tag_5F50
, inputtag
->value
, inputtag
->valuelength
);
915 currentcard
->tag_5F50_len
= inputtag
->valuelength
;}
916 if(*(inputtag
->tag
+1) == 0x54){
917 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5F54
)))
919 memcpy(currentcard
->tag_5F54
, inputtag
->value
, inputtag
->valuelength
);
920 currentcard
->tag_5F54_len
= inputtag
->valuelength
;}
922 if(*(inputtag
->tag
) == 0x9F){
923 if(*(inputtag
->tag
+1) == 0x01){
924 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F01
)))
926 memcpy(currentcard
->tag_9F01
, inputtag
->value
, inputtag
->valuelength
);}
927 if(*(inputtag
->tag
+1) == 0x02){
928 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F02
)))
930 memcpy(currentcard
->tag_9F02
, inputtag
->value
, inputtag
->valuelength
);}
931 if(*(inputtag
->tag
+1) == 0x03){
932 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F03
)))
934 memcpy(currentcard
->tag_9F03
, inputtag
->value
, inputtag
->valuelength
);}
935 if(*(inputtag
->tag
+1) == 0x04){
936 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F04
)))
938 memcpy(currentcard
->tag_9F04
, inputtag
->value
, inputtag
->valuelength
);}
939 if(*(inputtag
->tag
+1) == 0x05){
940 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F05
)))
942 memcpy(currentcard
->tag_9F05
, inputtag
->value
, inputtag
->valuelength
);
943 currentcard
->tag_9F05_len
= inputtag
->valuelength
;}
944 if(*(inputtag
->tag
+1) == 0x06){
945 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F06
)))
947 memcpy(currentcard
->tag_9F06
, inputtag
->value
, inputtag
->valuelength
);
948 currentcard
->tag_9F06_len
= inputtag
->valuelength
;}
949 if(*(inputtag
->tag
+1) == 0x07){
950 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F07
)))
952 memcpy(currentcard
->tag_9F07
, inputtag
->value
, inputtag
->valuelength
);}
953 if(*(inputtag
->tag
+1) == 0x08){
954 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F08
)))
956 memcpy(currentcard
->tag_9F08
, inputtag
->value
, inputtag
->valuelength
);}
957 if(*(inputtag
->tag
+1) == 0x09){
958 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F09
)))
960 memcpy(currentcard
->tag_9F09
, inputtag
->value
, inputtag
->valuelength
);}
961 if(*(inputtag
->tag
+1) == 0x0B){
962 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F0B
)))
964 memcpy(currentcard
->tag_9F0B
, inputtag
->value
, inputtag
->valuelength
);
965 currentcard
->tag_9F0B_len
= inputtag
->valuelength
;}
966 if(*(inputtag
->tag
+1) == 0x0D){
967 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F0D
)))
969 memcpy(currentcard
->tag_9F0D
, inputtag
->value
, inputtag
->valuelength
);}
970 if(*(inputtag
->tag
+1) == 0x0E){
971 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F0E
)))
973 memcpy(currentcard
->tag_9F0E
, inputtag
->value
, inputtag
->valuelength
);}
974 if(*(inputtag
->tag
+1) == 0x0F){
975 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F0F
)))
977 memcpy(currentcard
->tag_9F0F
, inputtag
->value
, inputtag
->valuelength
);}
978 if(*(inputtag
->tag
+1) == 0x11){
979 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F11
)))
981 memcpy(currentcard
->tag_9F11
, inputtag
->value
, inputtag
->valuelength
);}
982 if(*(inputtag
->tag
+1) == 0x12){
983 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F12
)))
985 memcpy(currentcard
->tag_9F12
, inputtag
->value
, inputtag
->valuelength
);
986 currentcard
->tag_9F12_len
= inputtag
->valuelength
;}
987 if(*(inputtag
->tag
+1) == 0x13){
988 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F13
)))
990 memcpy(currentcard
->tag_9F13
, inputtag
->value
, inputtag
->valuelength
);}
991 if(*(inputtag
->tag
+1) == 0x14){
992 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F14
)))
994 memcpy(currentcard
->tag_9F14
, inputtag
->value
, inputtag
->valuelength
);}
995 if(*(inputtag
->tag
+1) == 0x15){
996 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F15
)))
998 memcpy(currentcard
->tag_9F15
, inputtag
->value
, inputtag
->valuelength
);}
999 if(*(inputtag
->tag
+1) == 0x16){
1000 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F16
)))
1002 memcpy(currentcard
->tag_9F16
, inputtag
->value
, inputtag
->valuelength
);}
1003 if(*(inputtag
->tag
+1) == 0x17){
1004 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F17
)))
1006 memcpy(currentcard
->tag_9F17
, inputtag
->value
, inputtag
->valuelength
);}
1007 if(*(inputtag
->tag
+1) == 0x18){
1008 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F18
)))
1010 memcpy(currentcard
->tag_9F18
, inputtag
->value
, inputtag
->valuelength
);}
1011 if(*(inputtag
->tag
+1) == 0x1A){
1012 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1A
)))
1014 memcpy(currentcard
->tag_9F1A
, inputtag
->value
, inputtag
->valuelength
);}
1015 if(*(inputtag
->tag
+1) == 0x1B){
1016 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1B
)))
1018 memcpy(currentcard
->tag_9F1B
, inputtag
->value
, inputtag
->valuelength
);}
1019 if(*(inputtag
->tag
+1) == 0x1C){
1020 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1C
)))
1022 memcpy(currentcard
->tag_9F1C
, inputtag
->value
, inputtag
->valuelength
);}
1023 if(*(inputtag
->tag
+1) == 0x1D){
1024 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1D
)))
1026 memcpy(currentcard
->tag_9F1D
, inputtag
->value
, inputtag
->valuelength
);
1027 currentcard
->tag_9F1D_len
= inputtag
->valuelength
;}
1028 if(*(inputtag
->tag
+1) == 0x1E){
1029 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1E
)))
1031 memcpy(currentcard
->tag_9F1E
, inputtag
->value
, inputtag
->valuelength
);}
1032 if(*(inputtag
->tag
+1) == 0x1F){
1033 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F1F
)))
1035 memcpy(currentcard
->tag_9F1F
, inputtag
->value
, inputtag
->valuelength
);
1036 currentcard
->tag_9F1F_len
= inputtag
->valuelength
;}
1037 if(*(inputtag
->tag
+1) == 0x32){
1038 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F32
)))
1040 currentcard
->tag_9F32_len
= inputtag
->valuelength
;
1041 memcpy(currentcard
->tag_9F32
, inputtag
->value
, inputtag
->valuelength
);
1043 if(*(inputtag
->tag
+1) == 0x34){
1044 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F34
)))
1046 memcpy(currentcard
->tag_9F34
, inputtag
->value
, inputtag
->valuelength
);}
1047 if(*(inputtag
->tag
+1) == 0x35){
1048 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F35
)))
1050 memcpy(currentcard
->tag_9F35
, inputtag
->value
, inputtag
->valuelength
);}
1051 if(*(inputtag
->tag
+1) == 0x37){
1052 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F37
)))
1054 memcpy(currentcard
->tag_9F37
, inputtag
->value
, inputtag
->valuelength
);}
1055 if(*(inputtag
->tag
+1) == 0x38){
1056 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F38
)))
1058 memcpy(currentcard
->tag_9F38
, inputtag
->value
, inputtag
->valuelength
);
1059 currentcard
->tag_9F38_len
= inputtag
->valuelength
;}
1060 if(*(inputtag
->tag
+1) == 0x44){
1061 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F44
)))
1063 memcpy(currentcard
->tag_9F44
, inputtag
->value
, inputtag
->valuelength
);}
1064 if(*(inputtag
->tag
+1) == 0x45){
1065 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F45
)))
1067 memcpy(currentcard
->tag_9F45
, inputtag
->value
, inputtag
->valuelength
);}
1068 if(*(inputtag
->tag
+1) == 0x46){
1069 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F46
)))
1071 memcpy(currentcard
->tag_9F46
, inputtag
->value
, inputtag
->valuelength
);
1072 currentcard
->tag_9F46_len
= inputtag
->valuelength
;}
1073 if(*(inputtag
->tag
+1) == 0x47){
1074 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F47
)))
1076 memcpy(currentcard
->tag_9F47
, inputtag
->value
, inputtag
->valuelength
);
1077 currentcard
->tag_9F47_len
= inputtag
->valuelength
;}
1078 if(*(inputtag
->tag
+1) == 0x48){
1079 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F48
)))
1081 memcpy(currentcard
->tag_9F48
, inputtag
->value
, inputtag
->valuelength
);
1082 currentcard
->tag_9F48_len
= inputtag
->valuelength
;}
1083 if(*(inputtag
->tag
+1) == 0x49){
1084 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F49
)))
1086 memcpy(currentcard
->tag_9F49
, inputtag
->value
, inputtag
->valuelength
);
1087 currentcard
->tag_9F49_len
= inputtag
->valuelength
;}
1088 if(*(inputtag
->tag
+1) == 0x4A){
1089 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F4A
)))
1091 memcpy(currentcard
->tag_9F4A
, inputtag
->value
, inputtag
->valuelength
);}
1092 if(*(inputtag
->tag
+1) == 0x4B){
1093 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F4B
)))
1095 memcpy(currentcard
->tag_9F4B
, inputtag
->value
, inputtag
->valuelength
);
1096 currentcard
->tag_9F4B_len
= inputtag
->valuelength
;}
1097 if(*(inputtag
->tag
+1) == 0x4C){
1098 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F4C
)))
1100 memcpy(currentcard
->tag_9F4C
, inputtag
->value
, inputtag
->valuelength
);}
1101 if(*(inputtag
->tag
+1) == 0x60){
1102 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F60
)))
1104 memcpy(currentcard
->tag_9F60
, inputtag
->value
, inputtag
->valuelength
);}
1105 if(*(inputtag
->tag
+1) == 0x61){
1106 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F61
)))
1108 memcpy(currentcard
->tag_9F61
, inputtag
->value
, inputtag
->valuelength
);}
1109 if(*(inputtag
->tag
+1) == 0x62){
1110 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F62
)))
1112 memcpy(currentcard
->tag_9F62
, inputtag
->value
, inputtag
->valuelength
);}
1113 if(*(inputtag
->tag
+1) == 0x63){
1114 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F63
)))
1116 memcpy(currentcard
->tag_9F63
, inputtag
->value
, inputtag
->valuelength
);}
1117 if(*(inputtag
->tag
+1) == 0x64){
1118 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F64
)))
1120 memcpy(currentcard
->tag_9F64
, inputtag
->value
, inputtag
->valuelength
);}
1121 if(*(inputtag
->tag
+1) == 0x65){
1122 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F65
)))
1124 memcpy(currentcard
->tag_9F65
, inputtag
->value
, inputtag
->valuelength
);}
1125 if(*(inputtag
->tag
+1) == 0x66){
1126 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F66
)))
1128 memcpy(currentcard
->tag_9F66
, inputtag
->value
, inputtag
->valuelength
);}
1129 if(*(inputtag
->tag
+1) == 0x67){
1130 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F67
)))
1132 memcpy(currentcard
->tag_9F67
, inputtag
->value
, inputtag
->valuelength
);}
1133 if(*(inputtag
->tag
+1) == 0x68){
1134 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F68
)))
1136 memcpy(currentcard
->tag_9F68
, inputtag
->value
, inputtag
->valuelength
);
1137 currentcard
->tag_9F68_len
= inputtag
->valuelength
;}
1138 if(*(inputtag
->tag
+1) == 0x69){
1139 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F69
)))
1141 memcpy(currentcard
->tag_9F69
, inputtag
->value
, inputtag
->valuelength
);
1142 currentcard
->tag_9F69_len
= inputtag
->valuelength
;}
1143 if(*(inputtag
->tag
+1) == 0x6A){
1144 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F6A
)))
1146 memcpy(currentcard
->tag_9F6A
, inputtag
->value
, inputtag
->valuelength
);}
1147 if(*(inputtag
->tag
+1) == 0x6B){
1148 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F6B
)))
1150 memcpy(currentcard
->tag_9F6B
, inputtag
->value
, inputtag
->valuelength
);
1151 currentcard
->tag_9F6B_len
= inputtag
->valuelength
;}
1152 if(*(inputtag
->tag
+1) == 0x6C){
1153 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9F6C
)))
1155 memcpy(currentcard
->tag_9F6C
, inputtag
->value
, inputtag
->valuelength
);}
1159 if(*(inputtag
->tag
) == 0xBF){ //BF0C
1160 if(*(inputtag
->tag
+1) == 0x0C){
1161 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_BF0C
)))
1163 memcpy(currentcard
->tag_BF0C
, inputtag
->value
, inputtag
->valuelength
);
1164 currentcard
->tag_BF0C_len
= inputtag
->valuelength
;}
1166 else if(*(inputtag
->tag
) == 0x4F){ //BF0C
1167 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_4F
)))
1169 memcpy(currentcard
->tag_4F
, inputtag
->value
, inputtag
->valuelength
);
1170 currentcard
->tag_4F_len
= inputtag
->valuelength
;}
1171 else if(*(inputtag
->tag
) == 0x50){ //BF0C
1172 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_50
)))
1174 memcpy(currentcard
->tag_50
, inputtag
->value
, inputtag
->valuelength
);
1175 currentcard
->tag_50_len
= inputtag
->valuelength
;
1177 else if(*(inputtag
->tag
) == 0x56){ //BF0C
1178 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_56
)))
1180 memcpy(currentcard
->tag_56
, inputtag
->value
, inputtag
->valuelength
);
1181 currentcard
->tag_56_len
= inputtag
->valuelength
;
1183 else if(*(inputtag
->tag
) == 0x57){ //BF0C
1184 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_57
)))
1186 memcpy(currentcard
->tag_57
, inputtag
->value
, inputtag
->valuelength
);
1187 currentcard
->tag_57_len
= inputtag
->valuelength
;
1189 else if(*(inputtag
->tag
) == 0x5A){ //BF0C
1190 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_5A
)))
1192 memcpy(currentcard
->tag_5A
, inputtag
->value
, inputtag
->valuelength
);
1193 currentcard
->tag_5A_len
= inputtag
->valuelength
;}
1194 else if(*(inputtag
->tag
) == 0x61){ //BF0C
1195 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_61
)))
1197 memcpy(currentcard
->tag_61
, inputtag
->value
, inputtag
->valuelength
);
1198 currentcard
->tag_61_len
= inputtag
->valuelength
;
1200 else if(*(inputtag
->tag
) == 0x6F){ //BF0C
1201 memcpy(currentcard
->tag_6F
,inputtag
->value
,inputtag
->valuelength
);}
1203 else if(*(inputtag
->tag
) == 0x70){ //BF0C
1204 memcpy(currentcard
->tag_70
,inputtag
->value
,inputtag
->valuelength
);}
1205 else if(*(inputtag
->tag
) == 0x77){ //BF0C
1206 memcpy(currentcard
->tag_77
,inputtag
->value
,inputtag
->valuelength
);}
1207 else if(*(inputtag
->tag
) == 0x80){ //BF0C
1208 memcpy(currentcard
->tag_80
,inputtag
->value
,inputtag
->valuelength
);}
1209 else if(*(inputtag
->tag
) == 0x82){ //BF0C
1210 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_82
)))
1212 memcpy(currentcard
->tag_82
, inputtag
->value
, inputtag
->valuelength
);}
1213 else if(*(inputtag
->tag
) == 0x84){ //BF0C
1214 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_84
)))
1216 memcpy(currentcard
->tag_84
, inputtag
->value
, inputtag
->valuelength
);
1217 currentcard
->tag_84_len
= inputtag
->valuelength
;
1219 else if(*(inputtag
->tag
) == 0x86){ //BF0C
1220 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_86
)))
1222 memcpy(currentcard
->tag_86
, inputtag
->value
, inputtag
->valuelength
);
1223 currentcard
->tag_86_len
= inputtag
->valuelength
;
1225 else if(*(inputtag
->tag
) == 0x87){ //BF0C
1226 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_87
)))
1228 memcpy(currentcard
->tag_87
, inputtag
->value
, inputtag
->valuelength
);}
1229 else if(*(inputtag
->tag
) == 0x88){ //BF0C
1230 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_88
)))
1232 memcpy(currentcard
->tag_88
, inputtag
->value
, inputtag
->valuelength
);}
1233 else if(*(inputtag
->tag
) == 0x8A){ //BF0C
1234 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_8A
)))
1236 memcpy(currentcard
->tag_8A
, inputtag
->value
, inputtag
->valuelength
);}
1237 else if(*(inputtag
->tag
) == 0x8C){ //BF0C
1238 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_8C
)))
1240 memcpy(currentcard
->tag_8C
, inputtag
->value
, inputtag
->valuelength
);
1241 currentcard
->tag_8C_len
= inputtag
->valuelength
;
1243 else if(*(inputtag
->tag
) == 0x8D){ //BF0C
1244 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_8D
)))
1246 memcpy(currentcard
->tag_8D
, inputtag
->value
, inputtag
->valuelength
);
1247 currentcard
->tag_8D_len
= inputtag
->valuelength
;
1249 else if(*(inputtag
->tag
) == 0x8E){ //BF0C
1250 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_8E
)))
1252 memcpy(currentcard
->tag_8E
, inputtag
->value
, inputtag
->valuelength
);
1253 currentcard
->tag_8E_len
= inputtag
->valuelength
;
1255 else if(*(inputtag
->tag
) == 0x8F){ //BF0C
1256 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_8F
)))
1258 memcpy(currentcard
->tag_8F
,inputtag
->value
,sizeof(currentcard
->tag_8F
));}
1259 else if(*(inputtag
->tag
) == 0x90){ //BF0C
1260 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_90
)))
1262 memcpy(currentcard
->tag_90
, inputtag
->value
, inputtag
->valuelength
);
1263 currentcard
->tag_90_len
= inputtag
->valuelength
;}
1264 else if(*(inputtag
->tag
) == 0x92){ //BF0C
1265 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_92
)))
1267 memcpy(currentcard
->tag_92
, inputtag
->value
, inputtag
->valuelength
);
1268 currentcard
->tag_92_len
= inputtag
->valuelength
;}
1269 else if(*(inputtag
->tag
) == 0x93){ //BF0C
1270 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_93
)))
1272 memcpy(currentcard
->tag_93
, inputtag
->value
, inputtag
->valuelength
);
1273 currentcard
->tag_93_len
= inputtag
->valuelength
;}
1274 else if(*(inputtag
->tag
) == 0x94){ //BF0C
1275 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_94
)))
1277 memcpy(currentcard
->tag_94
, inputtag
->value
, inputtag
->valuelength
);
1278 currentcard
->tag_94_len
= inputtag
->valuelength
;}
1279 else if(*(inputtag
->tag
) == 0x95){ //BF0C
1280 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_95
)))
1282 memcpy(currentcard
->tag_95
, inputtag
->value
, inputtag
->valuelength
);}
1283 else if(*(inputtag
->tag
) == 0x97){ //BF0C
1284 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_97
)))
1286 memcpy(currentcard
->tag_97
, inputtag
->value
, inputtag
->valuelength
);
1287 currentcard
->tag_97_len
= inputtag
->valuelength
;}
1288 else if(*(inputtag
->tag
) == 0x98){ //BF0C
1289 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_98
)))
1291 memcpy(currentcard
->tag_98
, inputtag
->value
, inputtag
->valuelength
);}
1292 else if(*(inputtag
->tag
) == 0x99){ //BF0C
1293 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_99
)))
1295 memcpy(currentcard
->tag_99
, inputtag
->value
, inputtag
->valuelength
);
1296 currentcard
->tag_99_len
= inputtag
->valuelength
;}
1297 else if(*(inputtag
->tag
) == 0x9A){ //BF0C
1298 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9A
)))
1300 memcpy(currentcard
->tag_9A
, inputtag
->value
, inputtag
->valuelength
);}
1301 else if(*(inputtag
->tag
) == 0x9B){ //BF0C
1302 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9B
)))
1304 memcpy(currentcard
->tag_9B
, inputtag
->value
, inputtag
->valuelength
);}
1305 else if(*(inputtag
->tag
) == 0x9C){ //BF0C
1306 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9C
)))
1308 memcpy(currentcard
->tag_9C
, inputtag
->value
, inputtag
->valuelength
);}
1309 else if(*(inputtag
->tag
) == 0x9D){ //BF0C
1310 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_9D
)))
1312 memcpy(currentcard
->tag_9D
, inputtag
->value
, inputtag
->valuelength
);
1313 currentcard
->tag_9D_len
= inputtag
->valuelength
;}
1314 else if(*(inputtag
->tag
) == 0xA5){ //BF0C
1315 if(!(inputtag
->valuelength
<= sizeof(currentcard
->tag_A5
)))
1317 memcpy(currentcard
->tag_A5
, inputtag
->value
, inputtag
->valuelength
);
1318 currentcard
->tag_A5_len
= inputtag
->valuelength
;}
1323 int emv_decode_field(uint8_t* inputfield
,uint16_t inputlength
, emvtags
*result
)
1325 uint16_t lengthcounter
=0;
1327 //copy result to the testtag
1331 //loop through and decode template
1332 while(lengthcounter
< inputlength
)
1334 //decode the tlv tag
1335 decode_ber_tlv_item((inputfield
+lengthcounter
),&newtag
);
1336 //write the emvtags strucutre
1337 emv_emvtags_decode_tag(&newtag
,result
);
1338 //move to next value and decode
1339 lengthcounter
+= newtag
.fieldlength
-1;
1344 int emv_select(uint8_t* AID
, uint8_t AID_len
, void* data
)
1346 uint16_t selectCmd_len
= 4 + 1 + AID_len
+ 1;
1347 uint8_t selectCmd
[selectCmd_len
];
1349 selectCmd
[0] = 0x00;
1350 selectCmd
[1] = 0xA4;
1351 selectCmd
[2] = 0x04;
1352 selectCmd
[3] = 0x00;
1353 selectCmd
[4] = AID_len
;
1354 memcpy(&(selectCmd
[5]), AID
, AID_len
);
1355 selectCmd
[selectCmd_len
-1] = 0x00;
1356 return iso14_apdu(selectCmd
,selectCmd_len
,false, 0,data
);
1359 //perform READ RECORD
1360 int emv_readrecord(uint8_t recordnumber
, uint8_t sfi
, void* data
)
1362 uint16_t readRecordCmd_len
= 5;
1363 uint8_t readRecordCmd
[readRecordCmd_len
];
1365 readRecordCmd
[0] = 0x00;
1366 readRecordCmd
[1] = 0xB2;
1367 readRecordCmd
[2] = recordnumber
;
1368 readRecordCmd
[3] = ((sfi
<< 3) | 0x04);
1369 readRecordCmd
[4] = 0x00;
1370 return iso14_apdu(readRecordCmd
,readRecordCmd_len
,false,0,data
);
1373 int emv_getprocessingoptions(uint8_t* pdol
, uint8_t pdol_len
, void* data
)
1375 uint16_t processingCmd_len
= 4 + 1 + 2 + pdol_len
+ 1;
1376 uint8_t processingCmd
[processingCmd_len
];
1378 processingCmd
[0] = 0x80;
1379 processingCmd
[1] = 0xA8;
1380 processingCmd
[2] = 0x00;
1381 processingCmd
[3] = 0x00;
1382 processingCmd
[4] = pdol_len
+ 2;
1383 processingCmd
[5] = 0x83; //template
1384 processingCmd
[6] = pdol_len
;
1386 memcpy(&(processingCmd
[7]), pdol
, pdol_len
);}
1387 processingCmd
[processingCmd_len
] = 0x00;
1388 //Dbhexdump(processingCmd_len, processingCmd, false);
1389 return iso14_apdu(processingCmd
,processingCmd_len
,false, 0, data
);
1392 int emv_computecryptogram(uint8_t* UDOL
, uint8_t UDOL_len
, void *data
)
1394 uint16_t cryptogramCmd_len
= 4 + 1 + UDOL_len
+ 1;
1395 uint8_t cryptogramCmd
[cryptogramCmd_len
];
1397 cryptogramCmd
[0] = 0x80;
1398 cryptogramCmd
[1] = 0x2A;
1399 cryptogramCmd
[2] = 0x8E;
1400 cryptogramCmd
[3] = 0x80;
1401 cryptogramCmd
[4] = UDOL_len
;
1402 memcpy(&(cryptogramCmd
[5]), UDOL
, UDOL_len
);
1403 cryptogramCmd
[cryptogramCmd_len
-1] = 0x00;
1405 return iso14_apdu(cryptogramCmd
,cryptogramCmd_len
,false, 0,data
);
1408 int emv_getchallenge(void *data
)
1410 uint16_t challengeCmd_len
= 5;
1411 uint8_t challengeCmd
[challengeCmd_len
];
1413 challengeCmd
[0] = 0x00;
1414 challengeCmd
[1] = 0x84;
1415 challengeCmd
[2] = 0x00;
1416 challengeCmd
[3] = 0x00;
1417 challengeCmd
[4] = 0x00;
1419 return iso14_apdu(challengeCmd
,challengeCmd_len
,false, 0,data
);
1422 int emv_loopback(uint8_t* transData
, uint8_t transData_len
, void *data
)
1424 uint16_t loopbackCmd_len
= 4 + 1 + transData_len
+ 1;
1425 uint8_t loopbackCmd
[loopbackCmd_len
];
1427 loopbackCmd
[0] = 0x00;
1428 loopbackCmd
[1] = 0xEE;
1429 loopbackCmd
[2] = 0x00;
1430 loopbackCmd
[3] = 0x00;
1431 loopbackCmd
[4] = loopbackCmd_len
;
1432 memcpy(&(loopbackCmd
[5]), transData
, transData_len
);
1433 return iso14_apdu(loopbackCmd
,loopbackCmd_len
,false, 0,data
);
1437 int emv_generateAC(uint8_t refcontrolparam
, uint8_t* cdolinput
, uint8_t cdolinputlen
, void* data
)
1439 uint16_t acCmd_len
= 4 + 1 + cdolinputlen
+ 1;
1440 uint8_t acCmd
[acCmd_len
];
1444 acCmd
[2] = refcontrolparam
;
1446 acCmd
[4] = cdolinputlen
;
1447 memcpy(&(acCmd
[5]), cdolinput
, cdolinputlen
);
1448 acCmd
[acCmd_len
-1] = 0x00;
1449 Dbhexdump(acCmd_len
, acCmd
,false);
1450 return iso14_apdu(acCmd
,acCmd_len
,false,0,data
);
1453 int emv_decodeAFL(uint8_t* AFL
, uint8_t AFLlen
)
1459 //Print out AIP Bit meanings
1460 int emv_decodeAIP(uint8_t* AIP
)
1462 if((AIP
[0] & AIP_SDA_SUPPORTED
) == AIP_SDA_SUPPORTED
)
1463 Dbprintf("SDA supported");
1464 if((AIP
[0] & AIP_DDA_SUPPORTED
) == AIP_DDA_SUPPORTED
)
1465 Dbprintf("DDA supported");
1466 if((AIP
[0] & AIP_CARDHOLDER_VERIFICATION
)==AIP_CARDHOLDER_VERIFICATION
)
1467 Dbprintf("Cardholder verification is supported");
1468 if((AIP
[0] & AIP_TERMINAL_RISK
) == AIP_TERMINAL_RISK
)
1469 Dbprintf("Terminal risk management is to be performed");
1470 if((AIP
[0] & AIP_ISSUER_AUTH
) == AIP_ISSUER_AUTH
)
1471 Dbprintf("Issuer authentication is supported ");
1472 if((AIP
[0] & AIP_CDA_SUPPORTED
) == AIP_CDA_SUPPORTED
)
1473 Dbprintf("CDA supported");
1474 if((AIP
[1] & AIP_CHIP_SUPPORTED
) == AIP_CHIP_SUPPORTED
)
1475 Dbprintf("Chip supported");
1476 if((AIP
[1] & AIP_MSR_SUPPORTED
) == AIP_MSR_SUPPORTED
)
1477 Dbprintf("MSR supported");
1481 int emv_decodeCVM(uint8_t* CVM
, uint8_t CVMlen
)
1483 uint8_t counter
= 0;
1484 uint32_t amountX
= 0;
1485 uint32_t amountY
= 0;
1486 amountX
= bytes_to_num(CVM
, 4);
1487 amountY
= bytes_to_num(CVM
+4, 4);
1489 while(counter
< CVMlen
)
1491 if((CVM
[counter
] & 0x40) == 0x40){
1492 if((CVM
[counter
] & 0x3F)== 0x00){
1493 Dbprintf("Fail CVM processing");
1495 if((CVM
[counter
] & 0x3F) == 0x01){
1496 Dbprintf("Plaintext PIN verification performed by ICC");
1498 if((CVM
[counter
] & 0x3F) == 0x02){
1499 Dbprintf("Enciphered PIN verified online");
1501 if((CVM
[counter
] & 0x3F) == 0x03){
1502 Dbprintf("Plaintext PIN verification performed by ICC and signature (paper)");
1504 if((CVM
[counter
] & 0x3F) == 0x04){
1505 Dbprintf("Enciphered PIN verification performed by ICC");
1507 if((CVM
[counter
] & 0x3F) == 0x05){
1508 Dbprintf("Enciphered PIN verification performed by ICC and signature (paper)");
1510 if((CVM
[counter
] & 0x3F) == 0x30){
1511 Dbprintf("Signature (paper)");
1513 if((CVM
[counter
] & 0x3F) == 0x40){
1514 Dbprintf("No CVM required");
1519 Dbprintf("Fail cardholder verification if this CVM is unsuccessful");
1522 if(CVM
[counter
+1] == 0x00){
1523 Dbprintf("Always");}
1524 if(CVM
[counter
+1] == 0x01){
1525 Dbprintf("If unattended cash");}
1526 if(CVM
[counter
+1] == 0x02){
1527 Dbprintf("If not unattended cash and not manual cash and not purchase with cashback");}
1528 if(CVM
[counter
+1] == 0x03){
1529 Dbprintf("If terminal supports the CVM");}
1530 if(CVM
[counter
+1] == 0x04){
1531 Dbprintf("If manual cash");}
1532 if(CVM
[counter
+1] == 0x05){
1533 Dbprintf("If purchase with cashback");}
1534 if(CVM
[counter
+1] == 0x06){
1535 Dbprintf("If transaction is in the application currency and is under %lu value", amountX
);}
1536 if(CVM
[counter
+1] == 0x07){
1537 Dbprintf("If transaction is in the application currency and is over %lu value", amountX
);}
1538 if(CVM
[counter
+1] == 0x08){
1539 Dbprintf("If transaction is in the application currency and is under %lu value", amountY
);}
1540 if(CVM
[counter
+1] == 0x09){
1541 Dbprintf("If transaction is in the application currency and is over %lu value", amountY
);}
1546 //dump the current card to the console
1547 void dumpCard(emvtags
* currentcard
){
1548 DUMP(currentcard
->ATQA
);
1549 Dbhexdump(sizeof(currentcard
->ATQA
), currentcard
->ATQA
, false);
1550 DUMP(currentcard
->UID
);
1551 Dbhexdump(currentcard
->UID_len
, currentcard
->UID
, false);
1552 DUMP(currentcard
->SAK1
);
1553 Dbhexdump(1, ¤tcard
->SAK1
, false);
1554 DUMP(currentcard
->SAK2
);
1555 Dbhexdump(1, ¤tcard
->SAK2
, false);
1556 DUMP(currentcard
->ATS
);
1557 Dbhexdump(currentcard
->ATS_len
, currentcard
->ATS
, false);
1559 DUMP(currentcard
->tag_4F
);
1560 Dbhexdump(currentcard
->tag_4F_len
, currentcard
->tag_4F
, false);
1561 DUMP(currentcard
->tag_50
);
1562 Dbhexdump(currentcard
->tag_50_len
, currentcard
->tag_50
, false);
1563 DUMP(currentcard
->tag_56
);
1564 Dbhexdump(currentcard
->tag_56_len
, currentcard
->tag_56
, false);
1565 DUMP(currentcard
->tag_57
);
1566 Dbhexdump(currentcard
->tag_57_len
, currentcard
->tag_57
, false);
1567 DUMP(currentcard
->tag_5A
);
1568 Dbhexdump(currentcard
->tag_5A_len
, currentcard
->tag_5A
, false);
1569 DUMP(currentcard
->tag_82
);
1570 Dbhexdump(sizeof(currentcard
->tag_82
), currentcard
->tag_82
, false);
1571 DUMP(currentcard
->tag_84
);
1572 Dbhexdump(currentcard
->tag_84_len
, currentcard
->tag_84
, false);
1573 DUMP(currentcard
->tag_86
);
1574 Dbhexdump(currentcard
->tag_86_len
, currentcard
->tag_86
, false);
1575 DUMP(currentcard
->tag_87
);
1576 Dbhexdump(1, currentcard
->tag_87
, false);
1577 DUMP(currentcard
->tag_88
);
1578 Dbhexdump(1, currentcard
->tag_88
, false);
1579 DUMP(currentcard
->tag_8A
);
1580 Dbhexdump(2, currentcard
->tag_8A
, false);
1581 DUMP(currentcard
->tag_8C
);
1582 Dbhexdump(currentcard
->tag_8C_len
, currentcard
->tag_8C
, false);
1583 DUMP(currentcard
->tag_8D
);
1584 Dbhexdump(currentcard
->tag_8D_len
, currentcard
->tag_8D
, false);
1585 DUMP(currentcard
->tag_8E
);
1586 Dbhexdump(currentcard
->tag_8E_len
, currentcard
->tag_8E
, false);
1587 DUMP(currentcard
->tag_8F
);
1588 Dbhexdump(1, currentcard
->tag_8F
, false);
1589 DUMP(currentcard
->tag_90
);
1590 Dbhexdump(currentcard
->tag_90_len
, currentcard
->tag_90
, false);
1591 DUMP(currentcard
->tag_92
);
1592 Dbhexdump(currentcard
->tag_92_len
, currentcard
->tag_92
, false);
1593 DUMP(currentcard
->tag_93
);
1594 Dbhexdump(currentcard
->tag_93_len
, currentcard
->tag_93
, false);
1595 DUMP(currentcard
->tag_94
);
1596 Dbhexdump(currentcard
->tag_94_len
, currentcard
->tag_94
, false);
1597 DUMP(currentcard
->tag_95
);
1598 Dbhexdump(5, currentcard
->tag_95
, false);
1599 DUMP(currentcard
->tag_97
);
1600 Dbhexdump(currentcard
->tag_97_len
, currentcard
->tag_97
, false);
1601 DUMP(currentcard
->tag_98
);
1602 Dbhexdump(20, currentcard
->tag_98
, false);
1603 DUMP(currentcard
->tag_99
);
1604 Dbhexdump(currentcard
->tag_99_len
, currentcard
->tag_99
, false);
1605 DUMP(currentcard
->tag_9A
);
1606 Dbhexdump(3, currentcard
->tag_9A
, false);
1607 DUMP(currentcard
->tag_9B
);
1608 Dbhexdump(2, currentcard
->tag_9B
, false);
1609 DUMP(currentcard
->tag_9C
);
1610 Dbhexdump(1, currentcard
->tag_9C
, false);
1611 DUMP(currentcard
->tag_9D
);
1612 Dbhexdump(currentcard
->tag_9D_len
, currentcard
->tag_9D
, false);
1613 DUMP(currentcard
->tag_CD
);
1614 Dbhexdump(3, currentcard
->tag_CD
, false);
1615 DUMP(currentcard
->tag_CE
);
1616 Dbhexdump(3, currentcard
->tag_CE
, false);
1617 DUMP(currentcard
->tag_CF
);
1618 Dbhexdump(3, currentcard
->tag_CF
, false);
1619 DUMP(currentcard
->tag_D7
);
1620 Dbhexdump(3, currentcard
->tag_D7
, false);
1621 DUMP(currentcard
->tag_D8
);
1622 Dbhexdump(2, currentcard
->tag_D8
, false);
1623 DUMP(currentcard
->tag_D9
);
1624 Dbhexdump(currentcard
->tag_D9_len
, currentcard
->tag_D9
, false);
1625 DUMP(currentcard
->tag_DA
);
1626 Dbhexdump(2, currentcard
->tag_DA
, false);
1627 DUMP(currentcard
->tag_DB
);
1628 Dbhexdump(2, currentcard
->tag_DB
, false);
1629 DUMP(currentcard
->tag_DC
);
1630 Dbhexdump(2, currentcard
->tag_DC
, false);
1631 DUMP(currentcard
->tag_DD
);
1632 Dbhexdump(2, currentcard
->tag_DD
, false);
1633 DUMP(currentcard
->tag_AF
);
1634 Dbhexdump(currentcard
->tag_AF_len
, currentcard
->tag_AF
, false);
1635 DUMP(currentcard
->tag_5F20
);
1636 Dbhexdump(currentcard
->tag_5F20_len
, currentcard
->tag_5F20
, false);
1637 DUMP(currentcard
->tag_5F24
);
1638 Dbhexdump(3, currentcard
->tag_5F24
, false);
1639 DUMP(currentcard
->tag_5F25
);
1640 Dbhexdump(3, currentcard
->tag_5F25
, false);
1641 DUMP(currentcard
->tag_5F28
);
1642 Dbhexdump(2, currentcard
->tag_5F28
, false);
1643 DUMP(currentcard
->tag_5F2A
);
1644 Dbhexdump(2, currentcard
->tag_5F2A
, false);
1645 DUMP(currentcard
->tag_5F2D
);
1646 Dbhexdump(currentcard
->tag_5F2D_len
, currentcard
->tag_5F2D
, false);
1647 DUMP(currentcard
->tag_5F30
);
1648 Dbhexdump(3, currentcard
->tag_5F30
, false);
1649 DUMP(currentcard
->tag_5F34
);
1650 Dbhexdump(1, currentcard
->tag_5F34
, false);
1651 DUMP(currentcard
->tag_5F36
);
1652 Dbhexdump(2, currentcard
->tag_5F36
, false);
1653 DUMP(currentcard
->tag_5F50
);
1654 Dbhexdump(currentcard
->tag_5F50_len
, currentcard
->tag_5F50
, false);
1655 DUMP(currentcard
->tag_5F54
);
1656 Dbhexdump(currentcard
->tag_5F54_len
, currentcard
->tag_5F54
, false);
1657 DUMP(currentcard
->tag_9F01
);
1658 Dbhexdump(6, currentcard
->tag_9F01
, false);
1659 DUMP(currentcard
->tag_9F02
);
1660 Dbhexdump(6, currentcard
->tag_9F02
, false);
1661 DUMP(currentcard
->tag_9F03
);
1662 Dbhexdump(6, currentcard
->tag_9F03
, false);
1663 DUMP(currentcard
->tag_9F04
);
1664 Dbhexdump(4, currentcard
->tag_9F04
, false);
1665 DUMP(currentcard
->tag_9F05
);
1666 Dbhexdump(currentcard
->tag_9F05_len
, currentcard
->tag_9F05
, false);
1667 DUMP(currentcard
->tag_9F06
);
1668 Dbhexdump(currentcard
->tag_9F06_len
, currentcard
->tag_9F06
, false);
1669 DUMP(currentcard
->tag_9F07
);
1670 Dbhexdump(2, currentcard
->tag_9F07
, false);
1671 DUMP(currentcard
->tag_9F08
);
1672 Dbhexdump(2, currentcard
->tag_9F08
, false);
1673 DUMP(currentcard
->tag_9F09
);
1674 Dbhexdump(2, currentcard
->tag_9F09
, false);
1675 DUMP(currentcard
->tag_9F0B
);
1676 Dbhexdump(currentcard
->tag_9F0B_len
, currentcard
->tag_9F0B
, false);
1677 DUMP(currentcard
->tag_9F0D
);
1678 Dbhexdump(5, currentcard
->tag_9F0D
, false);
1679 DUMP(currentcard
->tag_9F0E
);
1680 Dbhexdump(5, currentcard
->tag_9F0E
, false);
1681 DUMP(currentcard
->tag_9F0F
);
1682 Dbhexdump(5, currentcard
->tag_9F0F
, false);
1683 DUMP(currentcard
->tag_9F10
);
1684 Dbhexdump(currentcard
->tag_9F10_len
, currentcard
->tag_9F10
, false);
1685 DUMP(currentcard
->tag_9F11
);
1686 Dbhexdump(1, currentcard
->tag_9F11
, false);
1687 DUMP(currentcard
->tag_9F12
);
1688 Dbhexdump(currentcard
->tag_9F12_len
, currentcard
->tag_9F12
, false);
1689 DUMP(currentcard
->tag_9F13
);
1690 Dbhexdump(2, currentcard
->tag_9F13
, false);
1691 DUMP(currentcard
->tag_9F14
);
1692 Dbhexdump(1, currentcard
->tag_9F14
, false);
1693 DUMP(currentcard
->tag_9F15
);
1694 Dbhexdump(2, currentcard
->tag_9F15
, false);
1695 DUMP(currentcard
->tag_9F16
);
1696 Dbhexdump(15, currentcard
->tag_9F16
, false);
1697 DUMP(currentcard
->tag_9F17
);
1698 Dbhexdump(1, currentcard
->tag_9F17
, false);
1699 DUMP(currentcard
->tag_9F18
);
1700 Dbhexdump(4, currentcard
->tag_9F18
, false);
1701 DUMP(currentcard
->tag_9F1A
);
1702 Dbhexdump(2, currentcard
->tag_9F1A
, false);
1703 DUMP(currentcard
->tag_9F1B
);
1704 Dbhexdump(4, currentcard
->tag_9F1B
, false);
1705 DUMP(currentcard
->tag_9F1C
);
1706 Dbhexdump(8, currentcard
->tag_9F1C
, false);
1707 DUMP(currentcard
->tag_9F1D
);
1708 Dbhexdump(currentcard
->tag_9F1D_len
, currentcard
->tag_9F1D
, false);
1709 DUMP(currentcard
->tag_9F1E
);
1710 Dbhexdump(8, currentcard
->tag_9F1E
, false);
1711 DUMP(currentcard
->tag_9F1F
);
1712 Dbhexdump(currentcard
->tag_9F1F_len
, currentcard
->tag_9F1F
, false);
1713 DUMP(currentcard
->tag_9F20
);
1714 Dbhexdump(currentcard
->tag_9F20_len
, currentcard
->tag_9F20
, false);
1715 DUMP(currentcard
->tag_9F21
);
1716 Dbhexdump(3, currentcard
->tag_9F1E
, false);
1717 DUMP(currentcard
->tag_9F22
);
1718 Dbhexdump(1, currentcard
->tag_9F22
, false);
1719 DUMP(currentcard
->tag_9F23
);
1720 Dbhexdump(1, currentcard
->tag_9F23
, false);
1721 DUMP(currentcard
->tag_9F26
);
1722 Dbhexdump(8, currentcard
->tag_9F26
, false);
1723 DUMP(currentcard
->tag_9F27
);
1724 Dbhexdump(1, currentcard
->tag_9F27
, false);
1725 DUMP(currentcard
->tag_9F2D
);
1726 Dbhexdump(currentcard
->tag_9F2D_len
, currentcard
->tag_9F2D
, false);
1727 DUMP(currentcard
->tag_9F2E
);
1728 Dbhexdump(3, currentcard
->tag_9F2E
, false);
1729 DUMP(currentcard
->tag_9F2F
);
1730 Dbhexdump(currentcard
->tag_9F2F_len
, currentcard
->tag_9F2F
, false);
1731 DUMP(currentcard
->tag_9F32
);
1732 Dbhexdump(currentcard
->tag_9F32_len
, currentcard
->tag_9F32
, false);
1733 DUMP(currentcard
->tag_9F33
);
1734 Dbhexdump(3, currentcard
->tag_9F33
, false);
1735 DUMP(currentcard
->tag_9F34
);
1736 Dbhexdump(3, currentcard
->tag_9F34
, false);
1737 DUMP(currentcard
->tag_9F35
);
1738 Dbhexdump(1, currentcard
->tag_9F35
, false);
1739 DUMP(currentcard
->tag_9F36
);
1740 Dbhexdump(2, currentcard
->tag_9F36
, false);
1741 DUMP(currentcard
->tag_9F37
);
1742 Dbhexdump(4, currentcard
->tag_9F37
, false);
1743 DUMP(currentcard
->tag_9F38
);
1744 Dbhexdump(currentcard
->tag_9F38_len
, currentcard
->tag_9F38
, false);
1745 DUMP(currentcard
->tag_9F39
);
1746 Dbhexdump(1, currentcard
->tag_9F39
, false);
1747 DUMP(currentcard
->tag_9F39
);
1748 Dbhexdump(1, currentcard
->tag_9F39
, false);
1749 DUMP(currentcard
->tag_9F40
);
1750 Dbhexdump(5, currentcard
->tag_9F40
, false);
1751 DUMP(currentcard
->tag_9F41
);
1752 Dbhexdump(4, currentcard
->tag_9F41
, false);
1753 DUMP(currentcard
->tag_9F42
);
1754 Dbhexdump(2, currentcard
->tag_9F42
, false);
1755 DUMP(currentcard
->tag_9F43
);
1756 Dbhexdump(4, currentcard
->tag_9F43
, false);
1757 DUMP(currentcard
->tag_9F44
);
1758 Dbhexdump(1, currentcard
->tag_9F44
, false);
1759 DUMP(currentcard
->tag_9F45
);
1760 Dbhexdump(2, currentcard
->tag_9F45
, false);
1761 DUMP(currentcard
->tag_9F46
);
1762 Dbhexdump(currentcard
->tag_9F46_len
, currentcard
->tag_9F46
, false);
1763 DUMP(currentcard
->tag_9F47
);
1764 Dbhexdump(currentcard
->tag_9F47_len
, currentcard
->tag_9F47
, false);
1765 DUMP(currentcard
->tag_9F48
);
1766 Dbhexdump(currentcard
->tag_9F48_len
, currentcard
->tag_9F48
, false);
1767 DUMP(currentcard
->tag_9F49
);
1768 Dbhexdump(currentcard
->tag_9F49_len
, currentcard
->tag_9F49
, false);
1769 DUMP(currentcard
->tag_9F4A
);
1770 Dbhexdump(1, currentcard
->tag_9F4A
, false);
1771 DUMP(currentcard
->tag_9F4B
);
1772 Dbhexdump(currentcard
->tag_9F4B_len
, currentcard
->tag_9F4B
, false);
1773 DUMP(currentcard
->tag_9F4C
);
1774 Dbhexdump(8, currentcard
->tag_9F4C
, false);
1775 DUMP(currentcard
->tag_9F4D
);
1776 Dbhexdump(2, currentcard
->tag_9F4D
, false);
1777 DUMP(currentcard
->tag_9F4E
);
1778 Dbhexdump(255, currentcard
->tag_9F4E
, false);
1779 DUMP(currentcard
->tag_9F60
);
1780 Dbhexdump(2, currentcard
->tag_9F60
, false);
1781 DUMP(currentcard
->tag_9F61
);
1782 Dbhexdump(2, currentcard
->tag_9F61
, false);
1783 DUMP(currentcard
->tag_9F62
);
1784 Dbhexdump(6, currentcard
->tag_9F62
, false);
1785 DUMP(currentcard
->tag_9F63
);
1786 Dbhexdump(6, currentcard
->tag_9F63
, false);
1787 DUMP(currentcard
->tag_9F64
);
1788 Dbhexdump(1, currentcard
->tag_9F64
, false);
1789 DUMP(currentcard
->tag_9F65
);
1790 Dbhexdump(2, currentcard
->tag_9F65
, false);
1791 DUMP(currentcard
->tag_9F66
);
1792 Dbhexdump(2, currentcard
->tag_9F66
, false);
1793 DUMP(currentcard
->tag_9F67
);
1794 Dbhexdump(1, currentcard
->tag_9F67
, false);
1795 DUMP(currentcard
->tag_9F68
);
1796 Dbhexdump(currentcard
->tag_9F68_len
, currentcard
->tag_9F68
, false);
1797 DUMP(currentcard
->tag_9F69
);
1798 Dbhexdump(currentcard
->tag_9F69_len
, currentcard
->tag_9F69
, false);
1799 DUMP(currentcard
->tag_9F6A
);
1800 Dbhexdump(8, currentcard
->tag_9F6A
, false);
1801 DUMP(currentcard
->tag_9F6B
);
1802 Dbhexdump(currentcard
->tag_9F6B_len
, currentcard
->tag_9F6B
, false);
1803 DUMP(currentcard
->tag_9F6C
);
1804 Dbhexdump(2, currentcard
->tag_9F6C
, false);
1805 DUMP(currentcard
->tag_61
);
1806 Dbhexdump(currentcard
->tag_61_len
, currentcard
->tag_61
, false);
1807 DUMP(currentcard
->tag_A5
);
1808 Dbhexdump(currentcard
->tag_A5_len
, currentcard
->tag_A5
, false);
1809 DUMP(currentcard
->tag_DFNAME
);
1810 Dbhexdump(currentcard
->tag_DFNAME_len
, currentcard
->tag_DFNAME
, false);
1811 DUMP(currentcard
->tag_70
);
1812 Dbhexdump(currentcard
->tag_70_len
, currentcard
->tag_70
, false);
1813 DUMP(currentcard
->tag_77
);
1814 Dbhexdump(currentcard
->tag_77_len
, currentcard
->tag_77
, false);
1815 DUMP(currentcard
->tag_80
);
1816 Dbhexdump(currentcard
->tag_80_len
, currentcard
->tag_80
, false);
1817 DUMP(currentcard
->tag_91
);
1818 Dbhexdump(currentcard
->tag_91_len
, currentcard
->tag_91
, false);
1819 DUMP(currentcard
->tag_BF0C
);
1820 Dbhexdump(currentcard
->tag_BF0C_len
, currentcard
->tag_BF0C
, false);
1821 DUMP(currentcard
->tag_DFName
);
1822 Dbhexdump(currentcard
->tag_DFName_len
, currentcard
->tag_DFName
, false);