-
Notifications
You must be signed in to change notification settings - Fork 200
/
Copy pathtest_crypto1.py
82 lines (73 loc) · 3.04 KB
/
test_crypto1.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/usr/bin/env python3
import os, sys, unittest
CURRENT_DIR = os.path.split(os.path.abspath(__file__))[0]
config_path = CURRENT_DIR.rsplit(os.sep, 1)[0]
sys.path.append(config_path)
print(config_path)
from crypto1 import Crypto1
class TestCrypto1(unittest.TestCase):
def test_key_getter_setter(self):
state = Crypto1()
state.key = 'a0a1a2a3a4a5'
self.assertEqual(state.key, 'a0a1a2a3a4a5')
def test_prng_next(self):
self.assertEqual(Crypto1.prng_next(0x2C198BE4, 64), 0xCC14C013)
def test_reader_three_pass_auth(self):
uid, nt, nr, atEnc = 0x65535D33, 0xBE2B7B5D, 0x0B4271BA, 0x36081500
reader = Crypto1()
reader.key = '974C262B9278'
ks0 = reader.lfsr48_u32(uid ^ nt, False)
self.assertEqual(ks0, 0xAC93C1A4, 'ks0 assert failed')
ks1 = reader.lfsr48_u32(nr, False)
self.assertEqual(ks1, 0xBAA3C92B, 'ks1 assert failed')
nrEnc = nr ^ ks1
self.assertEqual(nrEnc, 0xB1E1B891, 'nrEnc assert failed')
ar = Crypto1.prng_next(nt, 64)
self.assertEqual(ar, 0xF0928568, 'ar assert failed')
ks2 = reader.lfsr48_u32(0, False)
self.assertEqual(ks2, 0xDC652720, 'ks2 assert failed')
arEnc = ar ^ ks2
self.assertEqual(arEnc, 0x2CF7A248, 'arEnc assert failed')
ks3 = reader.lfsr48_u32(0, False)
self.assertEqual(ks3, 0xC6F4A093, 'ks3 assert failed')
at = atEnc ^ ks3
nt96 = Crypto1.prng_next(nt, 96)
self.assertEqual(at, nt96, 'at assert failed')
def test_tag_three_pass_auth(self):
uid, nt, nrEnc, arEnc = 0x65535D33, 0xBE2B7B5D, 0xB1E1B891, 0x2CF7A248
tag = Crypto1()
tag.key = '974C262B9278'
ks0 = tag.lfsr48_u32(uid ^ nt, False)
self.assertEqual(ks0, 0xAC93C1A4, 'ks0 assert failed')
ks1 = tag.lfsr48_u32(nrEnc, True)
self.assertEqual(ks1, 0xBAA3C92B, 'ks1 assert failed')
nr = ks1 ^ nrEnc
self.assertEqual(nr, 0x0B4271BA, 'nr assert failed')
ks2 = tag.lfsr48_u32(0, False)
self.assertEqual(ks2, 0xDC652720, 'ks2 assert failed')
ar = ks2 ^ arEnc
self.assertEqual(ar, 0xF0928568, 'ar assert failed')
at = Crypto1.prng_next(nt, 96)
self.assertEqual(at, 0xF0FCB593, 'at assert failed')
ks3 = tag.lfsr48_u32(0, False)
self.assertEqual(ks3, 0xC6F4A093, 'ks3 assert failed')
atEnc = at ^ ks3
self.assertEqual(atEnc, 0x36081500, 'atEnc assert failed')
def test_mfkey32_is_reader_has_key_true(self):
self.assertTrue(Crypto1.mfkey32_is_reader_has_key(
uid = 0x65535D33,
nt = 0x2C198BE4,
nrEnc = 0xFEDAC6D2,
arEnc = 0xCF0A3C7E,
key = 'A9AC67832330'
))
def test_mfkey32_is_reader_has_key_false(self):
self.assertFalse(Crypto1.mfkey32_is_reader_has_key(
uid = 0x65535D33,
nt = 0x2C198BE4,
nrEnc = 0xFEDAC6D2,
arEnc = 0xCF0A3C7E,
key = 'FFFFFFFFFFFF'
))
if __name__ == '__main__':
unittest.main()