-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathutils.py
73 lines (59 loc) · 1.75 KB
/
utils.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
from keccak import Keccak
import re
import argparse
def parse(filename, verbose=False):
'''
Parses r/+_{rnd}_+/ in .sol files into different lists
Entries should strictly be of the form x_0_0_1_0 = 1\\n
'''
fp = open(filename, 'r')
buf = fp.readlines()
dic = {}
for str in buf:
if re.match(r'^(\D+_\d+)(_\d+)+ (\d+)\n', str) is None:
continue
i, j = str.split(' ')
mo = re.match(r'^(\D+_\d+)', i)
tmp = re.split(mo.group()+'_', i)[1].split('_')
if len(tmp) is 3:
if mo.group() not in dic:
dic[mo.group()] = [[[0 for i in range(16)] for i in range(5)] for i in range(5)]
dic[mo.group()][int(tmp[0])][int(tmp[1])][int(tmp[2])] = int(j[:-1])
else:
if mo.group() not in dic:
dic[mo.group()] = [[0 for i in range(16)] for i in range(5)]
dic[mo.group()][int(tmp[0])][int(tmp[1])] = int(j[:-1])
if verbose:
print('Done Parsing File')
print(list(dic))
return dic
def gen_ddt(sbox, w):
ddt = [[0 for i in range(2**w)] for i in range(2**w)]
for pt1 in range(2**w):
for diff in range(2**w):
pt2 = pt1 ^ diff
ddt[diff][sbox[pt1]^sbox[pt2]] += 1
return ddt
def diff_prob(s1, s2):
'''
Calculate the differential probability of s1 and s2 over chi
'''
sbox = [0,5,10,11,20,17,22,23,9,12,3,2,13,8,15,14,18,21,24,27,6,1,4,7,26,29,16,19,30,25,28,31]
ddt = gen_ddt(sbox, 5)
#s1 and s2 are keccak states
prob = 1
for i in range(5):
for k in range(16):
tmp1 = 0
tmp2 = 0
for j in range(5):
tmp1 |= (s1[i][j][k] << j)&(2**5 -1)
tmp2 |= (s2[i][j][k] << j)&(2**5 -1)
prob *= (ddt[tmp1][tmp2]/32)
print(prob)
return prob
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--file', type=str, help=".sol file to parse")
args = parser.parse_args()
parse(args.file, True)