1// Copyright 2017 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package argon2
6
7var useSSE4 bool
8
9func processBlockGeneric(out, in1, in2 *block, xor bool) {
10	var t block
11	for i := range t {
12		t[i] = in1[i] ^ in2[i]
13	}
14	for i := 0; i < blockLength; i += 16 {
15		blamkaGeneric(
16			&t[i+0], &t[i+1], &t[i+2], &t[i+3],
17			&t[i+4], &t[i+5], &t[i+6], &t[i+7],
18			&t[i+8], &t[i+9], &t[i+10], &t[i+11],
19			&t[i+12], &t[i+13], &t[i+14], &t[i+15],
20		)
21	}
22	for i := 0; i < blockLength/8; i += 2 {
23		blamkaGeneric(
24			&t[i], &t[i+1], &t[16+i], &t[16+i+1],
25			&t[32+i], &t[32+i+1], &t[48+i], &t[48+i+1],
26			&t[64+i], &t[64+i+1], &t[80+i], &t[80+i+1],
27			&t[96+i], &t[96+i+1], &t[112+i], &t[112+i+1],
28		)
29	}
30	if xor {
31		for i := range t {
32			out[i] ^= in1[i] ^ in2[i] ^ t[i]
33		}
34	} else {
35		for i := range t {
36			out[i] = in1[i] ^ in2[i] ^ t[i]
37		}
38	}
39}
40
41func blamkaGeneric(t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15 *uint64) {
42	v00, v01, v02, v03 := *t00, *t01, *t02, *t03
43	v04, v05, v06, v07 := *t04, *t05, *t06, *t07
44	v08, v09, v10, v11 := *t08, *t09, *t10, *t11
45	v12, v13, v14, v15 := *t12, *t13, *t14, *t15
46
47	v00 += v04 + 2*uint64(uint32(v00))*uint64(uint32(v04))
48	v12 ^= v00
49	v12 = v12>>32 | v12<<32
50	v08 += v12 + 2*uint64(uint32(v08))*uint64(uint32(v12))
51	v04 ^= v08
52	v04 = v04>>24 | v04<<40
53
54	v00 += v04 + 2*uint64(uint32(v00))*uint64(uint32(v04))
55	v12 ^= v00
56	v12 = v12>>16 | v12<<48
57	v08 += v12 + 2*uint64(uint32(v08))*uint64(uint32(v12))
58	v04 ^= v08
59	v04 = v04>>63 | v04<<1
60
61	v01 += v05 + 2*uint64(uint32(v01))*uint64(uint32(v05))
62	v13 ^= v01
63	v13 = v13>>32 | v13<<32
64	v09 += v13 + 2*uint64(uint32(v09))*uint64(uint32(v13))
65	v05 ^= v09
66	v05 = v05>>24 | v05<<40
67
68	v01 += v05 + 2*uint64(uint32(v01))*uint64(uint32(v05))
69	v13 ^= v01
70	v13 = v13>>16 | v13<<48
71	v09 += v13 + 2*uint64(uint32(v09))*uint64(uint32(v13))
72	v05 ^= v09
73	v05 = v05>>63 | v05<<1
74
75	v02 += v06 + 2*uint64(uint32(v02))*uint64(uint32(v06))
76	v14 ^= v02
77	v14 = v14>>32 | v14<<32
78	v10 += v14 + 2*uint64(uint32(v10))*uint64(uint32(v14))
79	v06 ^= v10
80	v06 = v06>>24 | v06<<40
81
82	v02 += v06 + 2*uint64(uint32(v02))*uint64(uint32(v06))
83	v14 ^= v02
84	v14 = v14>>16 | v14<<48
85	v10 += v14 + 2*uint64(uint32(v10))*uint64(uint32(v14))
86	v06 ^= v10
87	v06 = v06>>63 | v06<<1
88
89	v03 += v07 + 2*uint64(uint32(v03))*uint64(uint32(v07))
90	v15 ^= v03
91	v15 = v15>>32 | v15<<32
92	v11 += v15 + 2*uint64(uint32(v11))*uint64(uint32(v15))
93	v07 ^= v11
94	v07 = v07>>24 | v07<<40
95
96	v03 += v07 + 2*uint64(uint32(v03))*uint64(uint32(v07))
97	v15 ^= v03
98	v15 = v15>>16 | v15<<48
99	v11 += v15 + 2*uint64(uint32(v11))*uint64(uint32(v15))
100	v07 ^= v11
101	v07 = v07>>63 | v07<<1
102
103	v00 += v05 + 2*uint64(uint32(v00))*uint64(uint32(v05))
104	v15 ^= v00
105	v15 = v15>>32 | v15<<32
106	v10 += v15 + 2*uint64(uint32(v10))*uint64(uint32(v15))
107	v05 ^= v10
108	v05 = v05>>24 | v05<<40
109
110	v00 += v05 + 2*uint64(uint32(v00))*uint64(uint32(v05))
111	v15 ^= v00
112	v15 = v15>>16 | v15<<48
113	v10 += v15 + 2*uint64(uint32(v10))*uint64(uint32(v15))
114	v05 ^= v10
115	v05 = v05>>63 | v05<<1
116
117	v01 += v06 + 2*uint64(uint32(v01))*uint64(uint32(v06))
118	v12 ^= v01
119	v12 = v12>>32 | v12<<32
120	v11 += v12 + 2*uint64(uint32(v11))*uint64(uint32(v12))
121	v06 ^= v11
122	v06 = v06>>24 | v06<<40
123
124	v01 += v06 + 2*uint64(uint32(v01))*uint64(uint32(v06))
125	v12 ^= v01
126	v12 = v12>>16 | v12<<48
127	v11 += v12 + 2*uint64(uint32(v11))*uint64(uint32(v12))
128	v06 ^= v11
129	v06 = v06>>63 | v06<<1
130
131	v02 += v07 + 2*uint64(uint32(v02))*uint64(uint32(v07))
132	v13 ^= v02
133	v13 = v13>>32 | v13<<32
134	v08 += v13 + 2*uint64(uint32(v08))*uint64(uint32(v13))
135	v07 ^= v08
136	v07 = v07>>24 | v07<<40
137
138	v02 += v07 + 2*uint64(uint32(v02))*uint64(uint32(v07))
139	v13 ^= v02
140	v13 = v13>>16 | v13<<48
141	v08 += v13 + 2*uint64(uint32(v08))*uint64(uint32(v13))
142	v07 ^= v08
143	v07 = v07>>63 | v07<<1
144
145	v03 += v04 + 2*uint64(uint32(v03))*uint64(uint32(v04))
146	v14 ^= v03
147	v14 = v14>>32 | v14<<32
148	v09 += v14 + 2*uint64(uint32(v09))*uint64(uint32(v14))
149	v04 ^= v09
150	v04 = v04>>24 | v04<<40
151
152	v03 += v04 + 2*uint64(uint32(v03))*uint64(uint32(v04))
153	v14 ^= v03
154	v14 = v14>>16 | v14<<48
155	v09 += v14 + 2*uint64(uint32(v09))*uint64(uint32(v14))
156	v04 ^= v09
157	v04 = v04>>63 | v04<<1
158
159	*t00, *t01, *t02, *t03 = v00, v01, v02, v03
160	*t04, *t05, *t06, *t07 = v04, v05, v06, v07
161	*t08, *t09, *t10, *t11 = v08, v09, v10, v11
162	*t12, *t13, *t14, *t15 = v12, v13, v14, v15
163}
164