]>
git.zerfleddert.de Git - proxmark3-svn/blob - client/emv/emv_tags.c
2 * libopenemv - a library to work with EMV family of smart cards
3 * Copyright (C) 2015 Dmitry Eremin-Solenikov
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
26 #define PRINT_INDENT(level) {for (int i = 0; i < (level); i++) fprintf(f, " \t " );}
53 #define EMV_BIT(byte, bit) ((byte - 1) * 8 + (8 - bit))
54 #define EMV_BIT_FINISH { (~0), NULL }
56 static const struct emv_tag_bit EMV_AIP
[] = {
57 { EMV_BIT ( 1 , 7 ), "SDA supported" },
58 { EMV_BIT ( 1 , 6 ), "DDA supported" },
59 { EMV_BIT ( 1 , 5 ), "Cardholder verification is supported" },
60 { EMV_BIT ( 1 , 4 ), "Terminal risk management is to be performed" },
61 { EMV_BIT ( 1 , 3 ), "Issuer authentication is supported" },
62 { EMV_BIT ( 1 , 2 ), "Reserved for use by the EMV Contactless Specifications" },
63 { EMV_BIT ( 1 , 1 ), "CDA supported (Combined Dynamic Data Authentication / Application Cryptogram Generation)" },
64 { EMV_BIT ( 2 , 8 ), "MSD is supported (Magnetic Stripe Data)" },
65 { EMV_BIT ( 2 , 7 ), "Reserved for use by the EMV Contactless Specifications" },
66 { EMV_BIT ( 2 , 6 ), "Reserved for use by the EMV Contactless Specifications" },
67 { EMV_BIT ( 2 , 1 ), "Reserved for use by the EMV Contactless Specifications" },
71 static const struct emv_tag_bit EMV_AUC
[] = {
72 { EMV_BIT ( 1 , 8 ), "Valid for domestic cash transactions" },
73 { EMV_BIT ( 1 , 7 ), "Valid for international cash transactions" },
74 { EMV_BIT ( 1 , 6 ), "Valid for domestic goods" },
75 { EMV_BIT ( 1 , 5 ), "Valid for international goods" },
76 { EMV_BIT ( 1 , 4 ), "Valid for domestic services" },
77 { EMV_BIT ( 1 , 3 ), "Valid for international services" },
78 { EMV_BIT ( 1 , 2 ), "Valid for ATMs" },
79 { EMV_BIT ( 1 , 1 ), "Valid at terminals other than ATMs" },
80 { EMV_BIT ( 2 , 8 ), "Domestic cashback allowed" },
81 { EMV_BIT ( 2 , 7 ), "International cashback allowed" },
85 static const struct emv_tag_bit EMV_TVR
[] = {
86 { EMV_BIT ( 1 , 8 ), "Offline data authentication was not performed" },
87 { EMV_BIT ( 1 , 7 ), "SDA failed" },
88 { EMV_BIT ( 1 , 6 ), "ICC data missing" },
89 { EMV_BIT ( 1 , 5 ), "Card appears on terminal exception file" },
90 { EMV_BIT ( 1 , 4 ), "DDA failed" },
91 { EMV_BIT ( 1 , 3 ), "CDA failed" },
92 { EMV_BIT ( 1 , 2 ), "SDA selected" },
93 { EMV_BIT ( 2 , 8 ), "ICC and terminal have different application versions" },
94 { EMV_BIT ( 2 , 7 ), "Expired application" },
95 { EMV_BIT ( 2 , 6 ), "Application not yet effective" },
96 { EMV_BIT ( 2 , 5 ), "Requested service not allowed for card product" },
97 { EMV_BIT ( 2 , 4 ), "New card" },
98 { EMV_BIT ( 3 , 8 ), "Cardholder verification was not successful" },
99 { EMV_BIT ( 3 , 7 ), "Unrecognised CVM" },
100 { EMV_BIT ( 3 , 6 ), "PIN Try Limit exceeded" },
101 { EMV_BIT ( 3 , 5 ), "PIN entry required and PIN pad not present or not working" },
102 { EMV_BIT ( 3 , 4 ), "PIN entry required, PIN pad present, but PIN was not entered" },
103 { EMV_BIT ( 3 , 3 ), "Online PIN entered" },
104 { EMV_BIT ( 4 , 8 ), "Transaction exceeds floor limit" },
105 { EMV_BIT ( 4 , 7 ), "Lower consecutive offline limit exceeded" },
106 { EMV_BIT ( 4 , 6 ), "Upper consecutive offline limit exceeded" },
107 { EMV_BIT ( 4 , 5 ), "Transaction selected randomly for online processing" },
108 { EMV_BIT ( 4 , 4 ), "Merchant forced transaction online" },
109 { EMV_BIT ( 5 , 8 ), "Default TDOL used" },
110 { EMV_BIT ( 5 , 7 ), "Issuer authentication failed" },
111 { EMV_BIT ( 5 , 6 ), "Script processing failed before final GENERATE AC" },
112 { EMV_BIT ( 5 , 5 ), "Script processing failed after final GENERATE AC" },
113 { EMV_BIT ( 5 , 4 ), "Reserved for use by the EMV Contactless Specifications" },
114 { EMV_BIT ( 5 , 3 ), "Reserved for use by the EMV Contactless Specifications" },
115 { EMV_BIT ( 5 , 2 ), "Reserved for use by the EMV Contactless Specifications" },
116 { EMV_BIT ( 5 , 1 ), "Reserved for use by the EMV Contactless Specifications" },
120 static const struct emv_tag_bit EMV_CTQ
[] = {
121 { EMV_BIT ( 1 , 8 ), "Online PIN Required" },
122 { EMV_BIT ( 1 , 7 ), "Signature Required" },
123 { EMV_BIT ( 1 , 6 ), "Go Online if Offline Data Authentication Fails and Reader is online capable" },
124 { EMV_BIT ( 1 , 5 ), "Switch Interface if Offline Data Authentication fails and Reader supports VIS" },
125 { EMV_BIT ( 1 , 4 ), "Go Online if Application Expired" },
126 { EMV_BIT ( 1 , 3 ), "Switch Interface for Cash Transactions" },
127 { EMV_BIT ( 1 , 2 ), "Switch Interface for Cashback Transactions" },
128 { EMV_BIT ( 2 , 8 ), "Consumer Device CVM Performed" },
129 { EMV_BIT ( 2 , 7 ), "Card supports Issuer Update Processing at the POS" },
133 static const struct emv_tag_bit EMV_TTQ
[] = {
134 { EMV_BIT ( 1 , 8 ), "MSD supported" },
135 { EMV_BIT ( 1 , 7 ), "VSDC supported" },
136 { EMV_BIT ( 1 , 6 ), "qVSDC supported" },
137 { EMV_BIT ( 1 , 5 ), "EMV contact chip supported" },
138 { EMV_BIT ( 1 , 4 ), "Offline-only reader" },
139 { EMV_BIT ( 1 , 3 ), "Online PIN supported" },
140 { EMV_BIT ( 1 , 2 ), "Signature supported" },
141 { EMV_BIT ( 1 , 1 ), "Offline Data Authentication (ODA) for Online Authorizations supported \n Warning!!!! Readers compliant to this specification set TTQ byte 1 bit 1 (this field) to 0b" },
142 { EMV_BIT ( 2 , 8 ), "Online cryptogram required" },
143 { EMV_BIT ( 2 , 7 ), "CVM required" },
144 { EMV_BIT ( 2 , 6 ), "(Contact Chip) Offline PIN supported" },
145 { EMV_BIT ( 3 , 8 ), "Issuer Update Processing supported" },
146 { EMV_BIT ( 3 , 7 ), "Mobile functionality supported (Consumer Device CVM)" },
150 static const struct emv_tag_bit EMV_CVR
[] = {
152 { EMV_BIT ( 1 , 4 ), "CDA Performed" },
153 { EMV_BIT ( 1 , 3 ), "Offline DDA Performed" },
154 { EMV_BIT ( 1 , 2 ), "Issuer Authentication Not Performed" },
155 { EMV_BIT ( 1 , 1 ), "Issuer Authentication performed and Failed" },
156 { EMV_BIT ( 2 , 4 ), "Offline PIN Verification Performed" },
157 { EMV_BIT ( 2 , 3 ), "Offline PIN Verification Performed and PIN Not Successfully Verified" },
158 { EMV_BIT ( 2 , 2 ), "PIN Try Limit Exceeded" },
159 { EMV_BIT ( 2 , 1 ), "Last Online Transaction Not Completed" },
160 { EMV_BIT ( 3 , 8 ), "Lower Offline Transaction Count Limit Exceeded" },
161 { EMV_BIT ( 3 , 7 ), "Upper Offline Transaction Count Limit Exceeded" },
162 { EMV_BIT ( 3 , 6 ), "Lower Cumulative Offline Amount Limit Exceeded" },
163 { EMV_BIT ( 3 , 5 ), "Upper Cumulative Offline Amount Limit Exceeded" },
164 { EMV_BIT ( 4 , 4 ), "Issuer script processing failed on last transaction" },
165 { EMV_BIT ( 4 , 3 ), "Offline data authentication failed on previous transaction and transaction declined offline" },
166 { EMV_BIT ( 4 , 2 ), "Go Online on Next Transaction Was Set" },
167 { EMV_BIT ( 4 , 1 ), "Unable to go Online" },
171 // All Data Elements by Tags used in TLV structure (according to the EMV 4.2 Standard )
172 // https://www.eftlab.co.uk/index.php/site-map/knowledge-base/145-emv-nfc-tags
173 // http://dexterous-programmer.blogspot.in/2012/05/emv-tags.html
174 static const struct emv_tag emv_tags
[] = {
176 { 0x00 , "Unknown ???" },
177 { 0x01 , "" , EMV_TAG_STRING
}, // string for headers
178 { 0x02 , "Raw data" , }, // data
179 { 0x20 , "Cardholder Verification Results (CVR)" , EMV_TAG_CVR
}, // not standard!
180 { 0x21 , "Input list for Offline Data Authentication" }, // not standard! data for "Offline Data Authentication" come from "read records" command. (EMV book3 10.3)
183 { 0x41 , "Country code and national data" },
184 { 0x42 , "Issuer Identification Number (IIN)" },
185 { 0x4f , "Application Dedicated File (ADF) Name" },
186 { 0x50 , "Application Label" , EMV_TAG_STRING
},
187 { 0x56 , "Track 1 Data" },
188 { 0x57 , "Track 2 Equivalent Data" },
189 { 0x5a , "Application Primary Account Number (PAN)" },
190 { 0x5f20 , "Cardholder Name" , EMV_TAG_STRING
},
191 { 0x5f24 , "Application Expiration Date" , EMV_TAG_YYMMDD
},
192 { 0x5f25 , "Application Effective Date" , EMV_TAG_YYMMDD
},
193 { 0x5f28 , "Issuer Country Code" , EMV_TAG_NUMERIC
},
194 { 0x5f2a , "Transaction Currency Code" , EMV_TAG_NUMERIC
},
195 { 0x5f2d , "Language Preference" , EMV_TAG_STRING
},
196 { 0x5f30 , "Service Code" , EMV_TAG_NUMERIC
},
197 { 0x5f34 , "Application Primary Account Number (PAN) Sequence Number" , EMV_TAG_NUMERIC
},
198 { 0x61 , "Application Template" },
199 { 0x6f , "File Control Information (FCI) Template" },
200 { 0x70 , "READ RECORD Response Message Template" },
201 { 0x77 , "Response Message Template Format 2" },
202 { 0x80 , "Response Message Template Format 1" },
203 { 0x82 , "Application Interchange Profile" , EMV_TAG_BITMASK
, & EMV_AIP
},
204 { 0x83 , "Command Template" },
205 { 0x84 , "Dedicated File (DF) Name" },
206 { 0x87 , "Application Priority Indicator" },
207 { 0x88 , "Short File Identifier (SFI)" },
208 { 0x8a , "Authorisation Response Code" },
209 { 0x8c , "Card Risk Management Data Object List 1 (CDOL1)" , EMV_TAG_DOL
},
210 { 0x8d , "Card Risk Management Data Object List 2 (CDOL2)" , EMV_TAG_DOL
},
211 { 0x8e , "Cardholder Verification Method (CVM) List" , EMV_TAG_CVM_LIST
},
212 { 0x8f , "Certification Authority Public Key Index" },
213 { 0x90 , "Issuer Public Key Certificate" },
214 { 0x91 , "Issuer Authentication Data" },
215 { 0x92 , "Issuer Public Key Remainder" },
216 { 0x93 , "Signed Static Application Data" },
217 { 0x94 , "Application File Locator (AFL)" , EMV_TAG_AFL
},
218 { 0x95 , "Terminal Verification Results" },
219 { 0x9a , "Transaction Date" , EMV_TAG_YYMMDD
},
220 { 0x9c , "Transaction Type" },
221 { 0x9f02 , "Amount, Authorised (Numeric)" , EMV_TAG_NUMERIC
},
222 { 0x9f03 , "Amount, Other (Numeric)" , EMV_TAG_NUMERIC
, },
223 { 0x9f06 , "Application Identifier (AID), Terminal. ISO 7816-5" },
224 { 0x9f07 , "Application Usage Control" , EMV_TAG_BITMASK
, & EMV_AUC
},
225 { 0x9f08 , "Application Version Number" },
226 { 0x9f0a , "Application Selection Registered Proprietary Data" }, // https://blog.ul-ts.com/posts/electronic-card-identifier-one-more-step-for-mif-compliance/
227 { 0x9f0d , "Issuer Action Code - Default" , EMV_TAG_BITMASK
, & EMV_TVR
},
228 { 0x9f0e , "Issuer Action Code - Denial" , EMV_TAG_BITMASK
, & EMV_TVR
},
229 { 0x9f0f , "Issuer Action Code - Online" , EMV_TAG_BITMASK
, & EMV_TVR
},
230 { 0x9f10 , "Issuer Application Data" },
231 { 0x9f11 , "Issuer Code Table Index" , EMV_TAG_NUMERIC
},
232 { 0x9f12 , "Application Preferred Name" , EMV_TAG_STRING
},
233 { 0x9f13 , "Last Online Application Transaction Counter (ATC) Register" },
234 { 0x9f17 , "Personal Identification Number (PIN) Try Counter" },
235 { 0x9f1a , "Terminal Country Code" },
236 { 0x9f1f , "Track 1 Discretionary Data" , EMV_TAG_STRING
},
237 { 0x9f21 , "Transaction Time" },
238 { 0x9f26 , "Application Cryptogram" },
239 { 0x9f27 , "Cryptogram Information Data" , EMV_TAG_CID
},
240 { 0x9f2a , "Kernel Identifier" },
241 { 0x9f2d , "ICC PIN Encipherment Public Key Certificate" },
242 { 0x9f2e , "ICC PIN Encipherment Public Key Exponent" },
243 { 0x9f2f , "ICC PIN Encipherment Public Key Remainder" },
244 { 0x9f32 , "Issuer Public Key Exponent" },
245 { 0x9f34 , "Cardholder Verification Method (CVM) Results" },
246 { 0x9f35 , "Terminal Type" },
247 { 0x9f36 , "Application Transaction Counter (ATC)" },
248 { 0x9f37 , "Unpredictable Number" },
249 { 0x9f38 , "Processing Options Data Object List (PDOL)" , EMV_TAG_DOL
},
250 { 0x9f42 , "Application Currency Code" , EMV_TAG_NUMERIC
},
251 { 0x9f44 , "Application Currency Exponent" , EMV_TAG_NUMERIC
},
252 { 0x9f45 , "Data Authentication Code" },
253 { 0x9f46 , "ICC Public Key Certificate" },
254 { 0x9f47 , "ICC Public Key Exponent" },
255 { 0x9f48 , "ICC Public Key Remainder" },
256 { 0x9f49 , "Dynamic Data Authentication Data Object List (DDOL)" , EMV_TAG_DOL
},
257 { 0x9f4a , "Static Data Authentication Tag List" },
258 { 0x9f4b , "Signed Dynamic Application Data" },
259 { 0x9f4c , "ICC Dynamic Number" },
260 { 0x9f4d , "Log Entry" },
261 { 0x9f4f , "Log Format" , EMV_TAG_DOL
},
262 { 0x9f60 , "CVC3 (Track1)" },
263 { 0x9f61 , "CVC3 (Track2)" },
264 { 0x9f62 , "PCVC3(Track1)" },
265 { 0x9f63 , "PUNATC(Track1)" },
266 { 0x9f64 , "NATC(Track1)" },
267 { 0x9f65 , "PCVC3(Track2)" },
268 { 0x9f66 , "PUNATC(Track2) / Terminal Transaction Qualifiers (TTQ)" , EMV_TAG_BITMASK
, & EMV_TTQ
},
269 { 0x9f67 , "NATC(Track2) / MSD Offset" },
270 { 0x9f68 , "Cardholder verification method list (PayPass)" },
271 { 0x9f69 , "Card Authentication Related Data" },
272 { 0x9f6a , "Unpredictable Number" , EMV_TAG_NUMERIC
},
273 { 0x9f6b , "Track 2 Data" },
274 { 0x9f6c , "Card Transaction Qualifiers (CTQ)" , EMV_TAG_BITMASK
, & EMV_CTQ
},
275 { 0xa5 , "File Control Information (FCI) Proprietary Template" },
276 { 0xbf0c , "File Control Information (FCI) Issuer Discretionary Data" },
277 { 0xdf20 , "Issuer Proprietary Bitmap (IPB)" },
280 static int emv_sort_tag ( tlv_tag_t tag
)
282 return ( int )( tag
>= 0x100 ? tag
: tag
<< 8 );
285 static int emv_tlv_compare ( const void * a
, const void * b
)
287 const struct tlv
* tlv
= a
;
288 const struct emv_tag
* tag
= b
;
290 return emv_sort_tag ( tlv
-> tag
) - ( emv_sort_tag ( tag
-> tag
));
293 static const struct emv_tag
* emv_get_tag ( const struct tlv
* tlv
)
295 struct emv_tag
* tag
= bsearch ( tlv
, emv_tags
, sizeof ( emv_tags
)/ sizeof ( emv_tags
[ 0 ]),
296 sizeof ( emv_tags
[ 0 ]), emv_tlv_compare
);
298 return tag
? tag
: & emv_tags
[ 0 ];
301 static const char * bitstrings
[] = {
312 static void emv_tag_dump_bitmask ( const struct tlv
* tlv
, const struct emv_tag
* tag
, FILE * f
, int level
)
314 const struct emv_tag_bit
* bits
= tag
-> data
;
317 for ( byte
= 1 ; byte
<= tlv
-> len
; byte
++) {
318 unsigned char val
= tlv
-> value
[ byte
- 1 ];
320 fprintf ( f
, " \t Byte %u (%02x) \n " , byte
, val
);
321 for ( bit
= 8 ; bit
> 0 ; bit
--, val
<<= 1 ) {
324 fprintf ( f
, " \t\t %s - '%s' \n " , bitstrings
[ bit
- 1 ],
325 bits
-> bit
== EMV_BIT ( byte
, bit
) ? bits
-> name
: "Unknown" );
327 if ( bits
-> bit
== EMV_BIT ( byte
, bit
))
333 static void emv_tag_dump_dol ( const struct tlv
* tlv
, const struct emv_tag
* tag
, FILE * f
, int level
)
335 const unsigned char * buf
= tlv
-> value
;
336 size_t left
= tlv
-> len
;
340 const struct emv_tag
* doltag
;
342 if (! tlv_parse_tl (& buf
, & left
, & doltlv
)) {
344 fprintf ( f
, "Invalid Tag-Len \n " );
348 doltag
= emv_get_tag (& doltlv
);
351 fprintf ( f
, " \t Tag %4hx len %02zx ('%s') \n " , doltlv
. tag
, doltlv
. len
, doltag
-> name
);
355 static void emv_tag_dump_string ( const struct tlv
* tlv
, const struct emv_tag
* tag
, FILE * f
, int level
)
357 fprintf ( f
, " \t String value '" );
358 fwrite ( tlv
-> value
, 1 , tlv
-> len
, f
);
362 static unsigned long emv_value_numeric ( const struct tlv
* tlv
, unsigned start
, unsigned end
)
364 unsigned long ret
= 0 ;
367 if ( end
> tlv
-> len
* 2 )
373 ret
+= tlv
-> value
[ start
/ 2 ] & 0xf ;
378 for (; i
< end
- 1 ; i
+= 2 ) {
380 ret
+= tlv
-> value
[ i
/ 2 ] >> 4 ;
382 ret
+= tlv
-> value
[ i
/ 2 ] & 0xf ;
387 ret
+= tlv
-> value
[ end
/ 2 ] >> 4 ;
393 static void emv_tag_dump_numeric ( const struct tlv
* tlv
, const struct emv_tag
* tag
, FILE * f
, int level
)
396 fprintf ( f
, " \t Numeric value %lu \n " , emv_value_numeric ( tlv
, 0 , tlv
-> len
* 2 ));
399 static void emv_tag_dump_yymmdd ( const struct tlv
* tlv
, const struct emv_tag
* tag
, FILE * f
, int level
)
402 fprintf ( f
, " \t Date: 20%02ld.%ld.%ld \n " ,
403 emv_value_numeric ( tlv
, 0 , 2 ),
404 emv_value_numeric ( tlv
, 2 , 4 ),
405 emv_value_numeric ( tlv
, 4 , 6 ));
408 static uint32_t emv_get_binary ( const unsigned char * S
)
410 return ( S
[ 0 ] << 24 ) | ( S
[ 1 ] << 16 ) | ( S
[ 2 ] << 8 ) | ( S
[ 3 ] << 0 );
413 // https://github.com/binaryfoo/emv-bertlv/blob/master/src/main/resources/fields/visa-cvr.txt
414 static void emv_tag_dump_cvr ( const struct tlv
* tlv
, const struct emv_tag
* tag
, FILE * f
, int level
) {
415 if (! tlv
|| tlv
-> len
< 1 ) {
417 fprintf ( f
, " \t INVALID! \n " );
421 if ( tlv
-> len
!= tlv
-> value
[ 0 ] + 1 ) {
423 fprintf ( f
, " \t INVALID length! \n " );
430 if (( tlv
-> value
[ 1 ] & 0xC0 ) == 0x00 ) fprintf ( f
, " \t AC1: AAC (Transaction declined) \n " );
431 if (( tlv
-> value
[ 1 ] & 0xC0 ) == 0x40 ) fprintf ( f
, " \t AC1: TC (Transaction approved) \n " );
432 if (( tlv
-> value
[ 1 ] & 0xC0 ) == 0x80 ) fprintf ( f
, " \t AC1: ARQC (Online authorisation requested) \n " );
433 if (( tlv
-> value
[ 1 ] & 0xC0 ) == 0xC0 ) fprintf ( f
, " \t AC1: RFU \n " );
436 if (( tlv
-> value
[ 1 ] & 0x30 ) == 0x00 ) fprintf ( f
, " \t AC2: AAC (Transaction declined) \n " );
437 if (( tlv
-> value
[ 1 ] & 0x30 ) == 0x10 ) fprintf ( f
, " \t AC2: TC (Transaction approved) \n " );
438 if (( tlv
-> value
[ 1 ] & 0x30 ) == 0x20 ) fprintf ( f
, " \t AC2: not requested (ARQC) \n " );
439 if (( tlv
-> value
[ 1 ] & 0x30 ) == 0x30 ) fprintf ( f
, " \t AC2: RFU \n " );
441 if ( tlv
-> len
>= 3 && ( tlv
-> value
[ 2 ] >> 4 )) {
443 fprintf ( f
, " \t PIN try: %x \n " , tlv
-> value
[ 2 ] >> 4 );
445 if ( tlv
-> len
>= 4 && ( tlv
-> value
[ 3 ] & 0x0F )) {
447 fprintf ( f
, " \t Issuer discretionary bits: %x \n " , tlv
-> value
[ 3 ] & 0x0F );
449 if ( tlv
-> len
>= 5 && ( tlv
-> value
[ 4 ] >> 4 )) {
451 fprintf ( f
, " \t Successfully processed issuer script commands: %x \n " , tlv
-> value
[ 4 ] >> 4 );
455 uint8_t data
[ 20 ] = { 0 };
456 memcpy ( data
, & tlv
-> value
[ 1 ], tlv
-> len
- 1 );
461 const struct tlv bit_tlv
= {
466 const struct emv_tag bit_tag
= {
469 . type
= EMV_TAG_BITMASK
,
473 if ( data
[ 0 ] || data
[ 1 ] || data
[ 2 ] || data
[ 3 ])
474 emv_tag_dump_bitmask (& bit_tlv
, & bit_tag
, f
, level
);
480 static void emv_tag_dump_cid ( const struct tlv
* tlv
, const struct emv_tag
* tag
, FILE * f
, int level
) {
481 if (! tlv
|| tlv
-> len
< 1 ) {
483 fprintf ( f
, " \t INVALID! \n " );
488 if (( tlv
-> value
[ 0 ] & EMVAC_AC_MASK
) == EMVAC_AAC
) fprintf ( f
, " \t AC1: AAC (Transaction declined) \n " );
489 if (( tlv
-> value
[ 0 ] & EMVAC_AC_MASK
) == EMVAC_TC
) fprintf ( f
, " \t AC1: TC (Transaction approved) \n " );
490 if (( tlv
-> value
[ 0 ] & EMVAC_AC_MASK
) == EMVAC_ARQC
) fprintf ( f
, " \t AC1: ARQC (Online authorisation requested) \n " );
491 if (( tlv
-> value
[ 0 ] & EMVAC_AC_MASK
) == EMVAC_AC_MASK
) fprintf ( f
, " \t AC1: RFU \n " );
493 if ( tlv
-> value
[ 0 ] & EMVCID_ADVICE
) {
495 fprintf ( f
, " \t Advice required! \n " );
498 if ( tlv
-> value
[ 0 ] & EMVCID_REASON_MASK
) {
500 fprintf ( f
, " \t Reason/advice/referral code: " );
501 switch (( tlv
-> value
[ 0 ] & EMVCID_REASON_MASK
)) {
503 fprintf ( f
, "No information given \n " );
506 fprintf ( f
, "Service not allowed \n " );
509 fprintf ( f
, "PIN Try Limit exceeded \n " );
512 fprintf ( f
, "Issuer authentication failed \n " );
515 fprintf ( f
, " \t RFU: %2x \n " , ( tlv
-> value
[ 0 ] & EMVCID_REASON_MASK
));
523 static void emv_tag_dump_cvm_list ( const struct tlv
* tlv
, const struct emv_tag
* tag
, FILE * f
, int level
)
528 if ( tlv
-> len
< 10 || tlv
-> len
% 2 ) {
530 fprintf ( f
, " \t INVALID! \n " );
534 X
= emv_get_binary ( tlv
-> value
);
535 Y
= emv_get_binary ( tlv
-> value
+ 4 );
538 fprintf ( f
, " \t X: %d \n " , X
);
540 fprintf ( f
, " \t Y: %d \n " , Y
);
542 for ( i
= 8 ; i
< tlv
-> len
; i
+= 2 ) {
544 const char * condition
;
546 switch ( tlv
-> value
[ i
] & 0x3f ) {
548 method
= "Fail CVM processing" ;
551 method
= "Plaintext PIN verification performed by ICC" ;
554 method
= "Enciphered PIN verified online" ;
557 method
= "Plaintext PIN verification performed by ICC and signature (paper)" ;
560 method
= "Enciphered PIN verification performed by ICC" ;
563 method
= "Enciphered PIN verification performed by ICC and signature (paper)" ;
566 method
= "Signature (paper)" ;
569 method
= "No CVM required" ;
572 method
= "NOT AVAILABLE!" ;
579 switch ( tlv
-> value
[ i
+ 1 ]) {
581 condition
= "Always" ;
584 condition
= "If unattended cash" ;
587 condition
= "If not unattended cash and not manual cash and not purchase with cashback" ;
590 condition
= "If terminal supports the CVM" ;
593 condition
= "If manual cash" ;
596 condition
= "If purchase with cashback" ;
599 condition
= "If transaction is in the application currency and is under X value" ;
602 condition
= "If transaction is in the application currency and is over X value" ;
605 condition
= "If transaction is in the application currency and is under Y value" ;
608 condition
= "If transaction is in the application currency and is over Y value" ;
611 condition
= "Unknown" ;
616 fprintf ( f
, " \t %02x %02x: '%s' '%s' and '%s' if this CVM is unsuccessful \n " ,
617 tlv
-> value
[ i
], tlv
-> value
[ i
+ 1 ],
618 method
, condition
, ( tlv
-> value
[ i
] & 0x40 ) ? "continue" : "fail" );
622 static void emv_tag_dump_afl ( const struct tlv
* tlv
, const struct emv_tag
* tag
, FILE * f
, int level
){
623 if ( tlv
-> len
< 4 || tlv
-> len
% 4 ) {
625 fprintf ( f
, " \t INVALID! \n " );
629 for ( int i
= 0 ; i
< tlv
-> len
/ 4 ; i
++) {
631 fprintf ( f
, "SFI[%02x] start:%02x end:%02x offline:%02x \n " , tlv
-> value
[ i
* 4 + 0 ] >> 3 , tlv
-> value
[ i
* 4 + 1 ], tlv
-> value
[ i
* 4 + 2 ], tlv
-> value
[ i
* 4 + 3 ]);
635 bool emv_tag_dump ( const struct tlv
* tlv
, FILE * f
, int level
)
638 fprintf ( f
, "NULL \n " );
642 const struct emv_tag
* tag
= emv_get_tag ( tlv
);
645 fprintf ( f
, "--%2hx[%02zx] '%s':" , tlv
-> tag
, tlv
-> len
, tag
-> name
);
648 case EMV_TAG_GENERIC
:
651 case EMV_TAG_BITMASK
:
653 emv_tag_dump_bitmask ( tlv
, tag
, f
, level
);
657 emv_tag_dump_dol ( tlv
, tag
, f
, level
);
659 case EMV_TAG_CVM_LIST
:
661 emv_tag_dump_cvm_list ( tlv
, tag
, f
, level
);
665 emv_tag_dump_afl ( tlv
, tag
, f
, level
);
668 emv_tag_dump_string ( tlv
, tag
, f
, level
);
670 case EMV_TAG_NUMERIC
:
671 emv_tag_dump_numeric ( tlv
, tag
, f
, level
);
674 emv_tag_dump_yymmdd ( tlv
, tag
, f
, level
);
678 emv_tag_dump_cvr ( tlv
, tag
, f
, level
);
682 emv_tag_dump_cid ( tlv
, tag
, f
, level
);