]>
Commit | Line | Data |
---|---|---|
21452811 | 1 | --[[ |
fb9acd45 | 2 | Handle Proxmark USB Commands |
21452811 | 3 | --]] |
21452811 | 4 | |
fb9acd45 | 5 | local _commands = require('usb_cmd') |
21452811 | 6 | |
7 | local _reverse_lookup,k,v = {} | |
9ccfb3a8 | 8 | for k, v in pairs(_commands) do |
9 | _reverse_lookup[v] = k | |
10 | end | |
11 | _commands.tostring = function(command) | |
21452811 | 12 | if(type(command) == 'number') then |
13 | return ("%s (%d)"):format(_reverse_lookup[command]or "ERROR UNDEFINED!", command) | |
14 | end | |
15 | return ("Error, numeric argument expected, got : %s"):format(tostring(command)) | |
16 | end | |
17 | ||
18 | Command = { | |
19 | ||
20 | new = function(self, o) | |
21 | ||
22 | local o = o or {} -- create object if user does not provide one | |
23 | setmetatable(o, self) -- DIY inheritance a'la javascript | |
24 | self.__index = self | |
25 | ||
26 | o.cmd = o.cmd or _commands.CMD_UNKNOWN | |
27 | --o.arg1 = "test" | |
28 | o.arg1 = o.arg1 or 0 | |
29 | o.arg2 = o.arg2 or 0 | |
30 | o.arg3 = o.arg3 or 0 | |
31 | local data = o.data or "0" | |
32 | ||
33 | if(type(data) == 'string') then | |
34 | -- We need to check if it is correct length, otherwise pad it | |
35 | local len = string.len(data) | |
36 | if(len < 1024) then | |
37 | --Should be 1024 hex characters to represent 512 bytes of data | |
38 | data = data .. string.rep("0",1024 - len ) | |
39 | end | |
40 | if(len > 1024) then | |
41 | -- OOps, a bit too much data here | |
42 | print( ( "WARNING: data size too large, was %s chars, will be truncated "):format(len) ) | |
43 | -- | |
44 | data = data:sub(1,1024) | |
45 | end | |
46 | else | |
47 | print(("WARNING; data was NOT a (hex-) string, but was %s"):format(type(data))) | |
48 | end | |
49 | o.data = data | |
50 | ||
51 | return o | |
52 | end, | |
4df3eb3f | 53 | parse = function (packet) |
54 | local count,cmd,arg1,arg2,arg3,data = bin.unpack('LLLLH512',packet) | |
55 | return Command:new{cmd = cmd, arg1 = arg1, arg2 = arg2, arg3 = arg3, data = data} | |
56 | end, | |
21452811 | 57 | } |
58 | function Command:__tostring() | |
59 | local output = ("%s\r\nargs : (%s, %s, %s)\r\ndata:\r\n%s\r\n"):format( | |
60 | _commands.tostring(self.cmd), | |
61 | tostring(self.arg1), | |
62 | tostring(self.arg2), | |
63 | tostring(self.arg3), | |
64 | tostring(self.data)) | |
65 | return output | |
66 | end | |
67 | function Command:getBytes() | |
68 | --If a hex-string has been used | |
69 | local data = self.data | |
70 | local cmd = self.cmd | |
71 | local arg1, arg2, arg3 = self.arg1, self.arg2, self.arg3 | |
9ccfb3a8 | 72 | return bin.pack("LLLLH",cmd, arg1, arg2, arg3, data); |
21452811 | 73 | end |
abd6112f | 74 | return _commands |