]> cvs.zerfleddert.de Git - proxmark3-svn/blame - client/read14a.lua
Attempt to make the makefile generic, so lua compilation works well also under windows
[proxmark3-svn] / client / read14a.lua
CommitLineData
a2d82b46 1--[[
2 This is a library to read 14443a tags. It can be used something like this
3
4 local reader = require('read14a')
5 result, err = reader.read1443a()
6 if not result then
7 print(err)
8 return
9 end
10 print(result.name)
11
12--]]
13-- Loads the commands-library
14local cmds = require('commands')
15local TIMEOUT = 2000 -- Shouldn't take longer than 2 seconds
16local ISO14A_COMMAND = {
17 ISO14A_CONNECT = 1,
18 ISO14A_NO_DISCONNECT = 2,
19 ISO14A_APDU = 4,
20 ISO14A_RAW = 8,
21 ISO14A_REQUEST_TRIGGER = 0x10,
22 ISO14A_APPEND_CRC = 0x20,
23 ISO14A_SET_TIMEOUT = 0x40
24}
25
26local ISO14443a_TYPES = {}
27ISO14443a_TYPES[0x00] = "NXP MIFARE Ultralight | Ultralight C"
28ISO14443a_TYPES[0x04] = "NXP MIFARE (various !DESFire !DESFire EV1)"
29ISO14443a_TYPES[0x08] = "NXP MIFARE CLASSIC 1k | Plus 2k"
30ISO14443a_TYPES[0x09] = "NXP MIFARE Mini 0.3k"
31ISO14443a_TYPES[0x10] = "NXP MIFARE Plus 2k"
32ISO14443a_TYPES[0x11] = "NXP MIFARE Plus 4k"
33ISO14443a_TYPES[0x18] = "NXP MIFARE Classic 4k | Plus 4k"
34ISO14443a_TYPES[0x20] = "NXP MIFARE DESFire 4k | DESFire EV1 2k/4k/8k | Plus 2k/4k | JCOP 31/41"
35ISO14443a_TYPES[0x24] = "NXP MIFARE DESFire | DESFire EV1"
36ISO14443a_TYPES[0x28] = "JCOP31 or JCOP41 v2.3.1"
37ISO14443a_TYPES[0x38] = "Nokia 6212 or 6131 MIFARE CLASSIC 4K"
38ISO14443a_TYPES[0x88] = "Infineon MIFARE CLASSIC 1K"
39ISO14443a_TYPES[0x98] = "Gemplus MPCOS"
40
41
42local function tostring_1443a(sak)
43 return ISO14443a_TYPES[sak] or ("Unknown (SAK=%x)"):format(sak)
44end
45
46local function parse1443a(data)
47 --[[
48
49 Based on this struct :
50
51 typedef struct {
52 byte_t uid[10];
53 byte_t uidlen;
54 byte_t atqa[2];
55 byte_t sak;
56 byte_t ats_len;
57 byte_t ats[256];
58 } __attribute__((__packed__)) iso14a_card_select_t;
59
60 --]]
61
62 local count,uid,uidlen, atqa, sak, ats_len, ats= bin.unpack('H10CH2CC',data)
63 uid = uid:sub(1,2*uidlen)
64 --print("uid, atqa, sak: ",uid, atqa, sak)
65 --print("TYPE: ", tostring_1443a(sak))
66 return { uid = uid, atqa = atqa, sak = sak, name = tostring_1443a(sak)}
67end
68
69local library = {
70 read1443a = function(blockNo, keys, keyType)
71 local command, result, info, err, data
72
73 core.clearCommandBuffer()
74 command = Command:new{cmd = cmds.CMD_READER_ISO_14443a,
75 arg1 = ISO14A_COMMAND.ISO14A_CONNECT}
76
77 core.SendCommand(command:getBytes())
78 local result = core.WaitForResponseTimeout(cmds.CMD_ACK,TIMEOUT)
79 if result then
80 local count,cmd,arg0,arg1,arg2 = bin.unpack('LLLL',result)
81 if arg0 == 0 then
82 print("iso14443a card select failed");
83 return nil, "iso14443a card select failed"
84 end
85 data = string.sub(result,count)
86 info, err = parse1443a(data)
87 else
88 err ="No response from card"
89 end
90
91 if err then
92 print(err)
93 return nil, err
94 end
95 return info
96 end
97
98}
99
100return library
Impressum, Datenschutz