3
votes

Continue from: EMV Reading PAN Code

I'm working in C, so I havn't Java tools and all the functions that parse automatically the response of APDU command. I want to read all types of smart cards. I have to parse the response of an GET PROCESSING OPTIONS and get the AFL (Access File Locator) of every card.

I have three cards with three different situation:

  • A) HelloBank: 77 12 82 2 38 0 94 c 10 2 4 1 18 1 1 0 20 1 1 0 90
  • B) PayPal: 77 12 82 2 39 0 94 c 18 1 1 0 20 1 1 0 28 1 3 1 90
  • C) PostePay: 80 a 1c 0 8 1 1 0 18 1 2 0 90

Case A)

I've got three different AFL: 10 2 4 1, 18 1 1 0, 20 1 1 0 So I send 00 B2 SFI P2 00 where SFI was 10>>3 (10 was first byte of first AFL) and P2 was SFI<<3|4 and this way I got the correct PAN Code of my card.

Case B)

I've got three different AFL: 18 1 1 0, 20 1 1 0, 28 1 3 1. So I send 00 B2 SFI P2 00 builded in the same way as Case A, but I got the response 6A 83 for every AFL.

Case C) I've got two different AFL: 8 1 1 0, 18 1 2 0 but I cannot parse those automatically because there isn't the same TAG of previous response. If I use those AFL it worked and I can get the PAN Code of the card.

How can I make an universal way to read the correct AFL and how can I make the correct command with those AFL?

1
Sw1 Sw2 ='6A 83'| Record not found, make sure your command is correct in respect of SFI and record number,Arjun

1 Answers

9
votes

Here is the decoding of AFL:

You will get the AFL in multiple of 4 Bytes normally. Divide your complete AFL in a chunk of 4 Bytes. Lets take an example of 1 Chunk: AABBCCDD

AA -> SFI (Decoding is described below)

BB -> First Record under this SFI

CC -> Last Record under this SFI

DD -> Record involved for Offline Data Authentication (Not for your use for the moment)

Taking your example 10 02 04 01 18 01 01 00 20 01 10 00

Chunks are 10 02 04 01, 18 01 01 00, 20 01 10 00

10 02 04 01 --> Taking 1st Byte 10 : 00010000 Take initial 5 bits from MSB --> 00010 means 2 : Means SFI 2

Taking 2nd Byte 02 : First Record under SFI 2 is 02

Taking 3rd Byte 04 : Last Record under SFI 2 is 04

Excluding 4 Byte explanation since no use

Summary : SFI 2 contains record 2 to 4

How Read Record command will form :

APDU structure : CLA INS P1 P2 LE

CLA 00

INS B2

P1 (Rec No)02 (SInce in this SFI 2 inital record is 02)

P2 (SFI) SFI 02 : Represent the SFI in 5 binay digit 00010 and then append 100 in the end : 00010100 : In Hex 14 So P2 is 14

LE 00

APDU to Read SFI 2 Rec 2 : 00 B2 02 14 00

APDU to Read SFI 2 Rec 3 : 00 B2 03 14 00

APDU to Read SFI 2 Rec 4 : 00 B2 04 14 00

Now if you will try to Read Rec 5, Since this Rec is not present you will get SW 6A83 in this case.

Use the same procedure for all chunk to identify the available Records and SFIs BY this mechanisam you can write the function to parse the AFL