1
0
mirror of https://github.com/taigrr/arc synced 2025-01-18 04:33:13 -08:00
2016-05-24 21:26:50 +09:00

55 lines
1.7 KiB
Python

print("package argon2")
print()
print("func block(z, a, b *[128]uint64) {")
for i in range(128):
print("\tz[%d] = a[%d] ^ b[%d]" % (i, i, i))
for b in range(0, 128, 16):
print("\t_P(" + ", ".join("&z[%d]" % i for i in range(b, b+16)) + ")")
for b in range(0, 16, 2):
print("\t_P(" + ", ".join("&z[%d], &z[%d]" % (i, i+1) for i in range(b, 128, 16)) + ")")
for i in range(128):
print("\tz[%d] ^= a[%d] ^ b[%d]" % (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("}")