]> git.zerfleddert.de Git - proxmark3-svn/blame_incremental - client/scripts/calc_ev1_it.lua
CHG: forgot some changes to previous commit.
[proxmark3-svn] / client / scripts / calc_ev1_it.lua
... / ...
CommitLineData
1local bin = require('bin')
2local getopt = require('getopt')
3local utils = require('utils')
4
5local bxor=bit32.bxor
6
7example =[[
8 script run calc_ev1_it
9 script run calc_ev1_it -u 11223344556677
10]]
11author = "Iceman"
12usage = "script run calc_ev1_it -u <uid> "
13desc =[[
14Arguments:
15 -h : this help
16 -u <UID> : UID
17]]
18---
19-- A debug printout-function
20function dbg(args)
21 if type(args) == "table" then
22 local i = 1
23 while args[i] do
24 dbg(args[i])
25 i = i+1
26 end
27 else
28 print("###", args)
29 end
30end
31---
32-- This is only meant to be used when errors occur
33function oops(err)
34 print("ERROR: ",err)
35 return nil,err
36end
37---
38-- Usage help
39function help()
40 print(desc)
41 print("Example usage")
42 print(example)
43end
44--
45-- Exit message
46function exitMsg(msg)
47 print( string.rep('--',20) )
48 print( string.rep('--',20) )
49 print(msg)
50 print()
51end
52
53local _xortable = {
54 --[[ position, 4byte xor
55 --]]
56 {"00","4f2711c1"},
57 {"01","07D7BB83"},
58 {"02","9636EF07"},
59 {"03","B5F4460E"},
60 {"04","F271141C"},
61 {"05","7D7BB038"},
62 {"06","636EF871"},
63 {"07","5F4468E3"},
64 {"08","271149C7"},
65 {"09","D7BB0B8F"},
66 {"0A","36EF8F1E"},
67 {"0B","F446863D"},
68 {"0C","7114947A"},
69 {"0D","7BB0B0F5"},
70 {"0E","6EF8F9EB"},
71 {"0F","44686BD7"},
72 {"10","11494fAF"},
73 {"11","BB0B075F"},
74 {"12","EF8F96BE"},
75 {"13","4686B57C"},
76 {"14","1494F2F9"},
77 {"15","B0B07DF3"},
78 {"16","F8F963E6"},
79 {"17","686B5FCC"},
80 {"18","494F2799"},
81 {"19","0B07D733"},
82 {"1A","8F963667"},
83 {"1B","86B5F4CE"},
84 {"1C","94F2719C"},
85 {"1D","B07D7B38"},
86 {"1E","F9636E70"},
87 {"1F","6B5F44E0"},
88}
89
90local function findEntryByUid( uid )
91
92 -- xor UID4,UID5,UID6,UID7
93 -- mod 0x20 (dec 32)
94 local pos = (bxor(bxor(bxor(uid[4],uid[5]), uid[6]),uid[7])) % 32
95
96 -- convert to hexstring
97 pos = string.format('%02X', pos)
98
99 for k, v in pairs(_xortable) do
100 if ( v[1] == pos ) then
101 return utils.ConvertHexToBytes(v[2])
102 end
103 end
104 return nil
105end
106
107local function main(args)
108
109 print( string.rep('--',20) )
110 print( string.rep('--',20) )
111 print()
112
113 local i,j, pwd
114 local uid = '04111211121110'
115
116 -- Arguments for the script
117 for o, a in getopt.getopt(args, 'hu:') do
118 if o == "h" then return help() end
119 if o == "u" then uid = a end
120 end
121
122 -- uid string checks
123 if uid == nil then return oops('empty uid string') end
124 if #uid == 0 then return oops('empty uid string') end
125 if #uid ~= 14 then return oops('uid wrong length. Should be 7 hex bytes') end
126
127 local uidbytes = utils.ConvertHexToBytes(uid)
128
129 local entry = findEntryByUid(uidbytes)
130 if entry == nil then return oops("Can't find a xor entry") end
131
132 -- PWD CALC
133 -- PWD0 = T0 xor B xor C xor D
134 -- PWD1 = T1 xor A xor C xor E
135 -- PWD2 = T2 xor A xor B xor F
136 -- PWD3 = T3 xor G
137
138 local pwd0 = bxor( bxor( bxor( entry[1], uidbytes[2]), uidbytes[3]), uidbytes[4])
139 local pwd1 = bxor( bxor( bxor( entry[2], uidbytes[1]), uidbytes[3]), uidbytes[5])
140 local pwd2 = bxor( bxor( bxor( entry[3], uidbytes[1]), uidbytes[2]), uidbytes[6])
141 local pwd3 = bxor( entry[4], uidbytes[7])
142
143 print('UID | '..uid)
144 print(string.format('PWD | %02X%02X%02X%02X', pwd0, pwd1, pwd2, pwd3))
145end
146
147main(args)
Impressum, Datenschutz