-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathround.py
60 lines (52 loc) · 1.85 KB
/
round.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
print("package argon2")
print()
print("func block(z, t, a, b *[128]uint64) {")
print("\t// compute z = z ^ a^b ^ P(a^b)")
print()
print("\t// t = a ^ b")
for i in range(128):
print("\tt[%d] = a[%d] ^ b[%d]" % (i, i, i))
print()
print("\t// t = P(t)")
for b in range(0, 128, 16):
print("\t_P(" + ", ".join("&t[%d]" % i for i in range(b, b+16)) + ")")
for b in range(0, 16, 2):
print("\t_P(" + ", ".join("&t[%d], &t[%d]" % (i, i+1) for i in range(b, 128, 16)) + ")")
print()
print("\t// z = z ^ a^b ^ t")
for i in range(128):
print("\tz[%d] ^= a[%d] ^ b[%d] ^ t[%d]" % (i, i, i, i))
print("}")
print()
print("func _P("+", ".join("p%d" % i for i in range(16))+" *uint64) {")
for i in range(16):
print("\tvar v%d = *p%d" % (i, i))
print("\tvar t uint64")
def G(a, b, c, d):
print("\tt = uint64(uint32(%s)) * uint64(uint32(%s))" % (a, b))
print("\t%s = %s + %s + t*2" % (a, a, b))
print("\t%s = %s ^ %s" % (d, d, a))
print("\t%s = %s>>32 | %s<<32" % (d, d, d))
print("\tt = uint64(uint32(%s)) * uint64(uint32(%s))" % (c, d))
print("\t%s = %s + %s + t*2" % (c, c, d))
print("\t%s = %s ^ %s" % (b, b, c))
print("\t%s = %s>>24 | %s<<40" % (b, b, b))
print("\tt = uint64(uint32(%s)) * uint64(uint32(%s))" % (a, b))
print("\t%s = %s + %s + t*2" % (a, a, b))
print("\t%s = %s ^ %s" % (d, d, a))
print("\t%s = %s>>16 | %s<<48" % (d, d, d))
print("\tt = uint64(uint32(%s)) * uint64(uint32(%s))" % (c, d))
print("\t%s = %s + %s + t*2" % (c, c, d))
print("\t%s = %s ^ %s" % (b, b, c))
print("\t%s = %s>>63 | %s<<1" % (b, b, b))
G("v0", "v4", "v8", "v12")
G("v1", "v5", "v9", "v13")
G("v2", "v6", "v10", "v14")
G("v3", "v7", "v11", "v15")
G("v0", "v5", "v10", "v15")
G("v1", "v6", "v11", "v12")
G("v2", "v7", "v8", "v13")
G("v3", "v4", "v9", "v14")
for i in range(16):
print("\t*p%d = v%d" % (i, i))
print("}")