arnaucube
arnaucube/keccak256-circomPublic Self-hosted repository
keccak256-circom/go-keccak256-bits-impl/ref.go
go-keccak256-bits-impl/ref.goRaw
 1/*
 2This file contains the byte & uint64 implementations that are used as reference
 3to test the bits implementations of the other files.
 4The methods in this file are modifyied versions of methods from: https://github.com/ebfe/keccak
 5*/
 6package keccak
 7
 8func thetaU64Version(a [25]uint64) [25]uint64 {
 9	var c0, c1, c2, c3, c4, d uint64
10	var r [25]uint64
11	c0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
12	c1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
13	c2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
14	c3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
15	c4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
16
17	d = c4 ^ (c1<<1 | c1>>(64-1))
18	r[0] = a[0] ^ d
19	r[5] = a[5] ^ d
20	r[10] = a[10] ^ d
21	r[15] = a[15] ^ d
22	r[20] = a[20] ^ d
23
24	d = c0 ^ (c2<<1 | c2>>(64-1))
25	r[1] = a[1] ^ d
26	r[6] = a[6] ^ d
27	r[11] = a[11] ^ d
28	r[16] = a[16] ^ d
29	r[21] = a[21] ^ d
30
31	d = c1 ^ (c3<<1 | c3>>(64-1))
32	r[2] = a[2] ^ d
33	r[7] = a[7] ^ d
34	r[12] = a[12] ^ d
35	r[17] = a[17] ^ d
36	r[22] = a[22] ^ d
37
38	d = c2 ^ (c4<<1 | c4>>(64-1))
39	r[3] = a[3] ^ d
40	r[8] = a[8] ^ d
41	r[13] = a[13] ^ d
42	r[18] = a[18] ^ d
43	r[23] = a[23] ^ d
44
45	d = c3 ^ (c0<<1 | c0>>(64-1))
46	r[4] = a[4] ^ d
47	r[9] = a[9] ^ d
48	r[14] = a[14] ^ d
49	r[19] = a[19] ^ d
50	r[24] = a[24] ^ d
51	return r
52}
53
54func rhopiU64Version(a [25]uint64) [25]uint64 {
55	var t uint64
56	t = a[1]
57	t, a[10] = a[10], t<<1|t>>(64-1)
58	t, a[7] = a[7], t<<3|t>>(64-3)
59	t, a[11] = a[11], t<<6|t>>(64-6)
60	t, a[17] = a[17], t<<10|t>>(64-10)
61	t, a[18] = a[18], t<<15|t>>(64-15)
62	t, a[3] = a[3], t<<21|t>>(64-21)
63	t, a[5] = a[5], t<<28|t>>(64-28)
64	t, a[16] = a[16], t<<36|t>>(64-36)
65	t, a[8] = a[8], t<<45|t>>(64-45)
66	t, a[21] = a[21], t<<55|t>>(64-55)
67	t, a[24] = a[24], t<<2|t>>(64-2)
68	t, a[4] = a[4], t<<14|t>>(64-14)
69	t, a[15] = a[15], t<<27|t>>(64-27)
70	t, a[23] = a[23], t<<41|t>>(64-41)
71	t, a[19] = a[19], t<<56|t>>(64-56)
72	t, a[13] = a[13], t<<8|t>>(64-8)
73	t, a[12] = a[12], t<<25|t>>(64-25)
74	t, a[2] = a[2], t<<43|t>>(64-43)
75	t, a[20] = a[20], t<<62|t>>(64-62)
76	t, a[14] = a[14], t<<18|t>>(64-18)
77	t, a[22] = a[22], t<<39|t>>(64-39)
78	t, a[9] = a[9], t<<61|t>>(64-61)
79	t, a[6] = a[6], t<<20|t>>(64-20)
80	a[1] = t<<44 | t>>(64-44)
81	return a
82}