@@ -58,176 +58,174 @@ type
58
58
# then 256 registers and so it is not enough for it to perform round in
59
59
# template.
60
60
# See also https://github.com/nim-lang/Nim/issues/23688
61
- when nimvm :
62
- proc THETA1V (a: var openArray [uint64 ], b: openArray [uint64 ],
63
- c: int ) {.inline .} =
64
- a[c] = b[c] xor b[c + 5 ] xor b[c + 10 ] xor b[c + 15 ] xor b[c + 20 ]
65
-
66
- proc THETA2V (a: var uint64 , b: openArray [uint64 ], c: int ) {.inline .} =
67
- a = b[(c + 4 ) mod 5 ] xor ROL (uint64 (b[(c + 1 ) mod 5 ]), 1 )
68
-
69
- proc THETA3V (a: var openArray [uint64 ], b: int , c: uint64 ) {.inline .} =
70
- a[b] = a[b] xor c
71
- a[b + 5 ] = a[b + 5 ] xor c
72
- a[b + 10 ] = a[b + 10 ] xor c
73
- a[b + 15 ] = a[b + 15 ] xor c
74
- a[b + 20 ] = a[b + 20 ] xor c
75
-
76
- proc RHOPIV (a: var openArray [uint64 ], b: var openArray [uint64 ], c: var uint64 ,
77
- d, e: int ) {.inline .} =
78
- a[0 ] = b[d]
79
- b[d] = ROL (c, e)
80
- c = uint64 (a[0 ])
81
-
82
- proc CHIV (a: var openArray [uint64 ], b: var openArray [uint64 ],
83
- c: int ) {.inline .} =
84
- a[0 ] = b[c]
85
- a[1 ] = b[c + 1 ]
86
- a[2 ] = b[c + 2 ]
87
- a[3 ] = b[c + 3 ]
88
- a[4 ] = b[c + 4 ]
89
- b[c] = b[c] xor (not (a[1 ]) and a[2 ])
90
- b[c + 1 ] = b[c + 1 ] xor (not (a[2 ]) and a[3 ])
91
- b[c + 2 ] = b[c + 2 ] xor (not (a[3 ]) and a[4 ])
92
- b[c + 3 ] = b[c + 3 ] xor (not (a[4 ]) and a[0 ])
93
- b[c + 4 ] = b[c + 4 ] xor (not (a[0 ]) and a[1 ])
94
-
95
-
96
- proc KECCAKROUNDP (a: var openArray [uint64 ], b: var openArray [uint64 ],
97
- c: var uint64 , r: int ) {.inline .} =
98
- THETA1V (b, a, 0 )
99
- THETA1V (b, a, 1 )
100
- THETA1V (b, a, 2 )
101
- THETA1V (b, a, 3 )
102
- THETA1V (b, a, 4 )
103
-
104
- THETA2V (c, b, 0 )
105
- THETA3V (a, 0 , c)
106
- THETA2V (c, b, 1 )
107
- THETA3V (a, 1 , c)
108
- THETA2V (c, b, 2 )
109
- THETA3V (a, 2 , c)
110
- THETA2V (c, b, 3 )
111
- THETA3V (a, 3 , c)
112
- THETA2V (c, b, 4 )
113
- THETA3V (a, 4 , c)
114
-
115
- c = a[1 ]
116
- RHOPIV (b, a, c, 10 , 1 )
117
- RHOPIV (b, a, c, 7 , 3 )
118
- RHOPIV (b, a, c, 11 , 6 )
119
- RHOPIV (b, a, c, 17 , 10 )
120
- RHOPIV (b, a, c, 18 , 15 )
121
- RHOPIV (b, a, c, 3 , 21 )
122
- RHOPIV (b, a, c, 5 , 28 )
123
- RHOPIV (b, a, c, 16 , 36 )
124
- RHOPIV (b, a, c, 8 , 45 )
125
- RHOPIV (b, a, c, 21 , 55 )
126
- RHOPIV (b, a, c, 24 , 2 )
127
- RHOPIV (b, a, c, 4 , 14 )
128
- RHOPIV (b, a, c, 15 , 27 )
129
- RHOPIV (b, a, c, 23 , 41 )
130
- RHOPIV (b, a, c, 19 , 56 )
131
- RHOPIV (b, a, c, 13 , 8 )
132
- RHOPIV (b, a, c, 12 , 25 )
133
- RHOPIV (b, a, c, 2 , 43 )
134
- RHOPIV (b, a, c, 20 , 62 )
135
- RHOPIV (b, a, c, 14 , 18 )
136
- RHOPIV (b, a, c, 22 , 39 )
137
- RHOPIV (b, a, c, 9 , 61 )
138
- RHOPIV (b, a, c, 6 , 20 )
139
- RHOPIV (b, a, c, 1 , 44 )
140
-
141
- CHIV (b, a, 0 )
142
- CHIV (b, a, 5 )
143
- CHIV (b, a, 10 )
144
- CHIV (b, a, 15 )
145
- CHIV (b, a, 20 )
146
-
147
- a[0 ] = a[0 ] xor RNDC [r]
148
-
149
- else :
150
- template THETA1 (a, b, c: untyped ) =
151
- a[c] = b[c] xor b[c + 5 ] xor b[c + 10 ] xor b[c + 15 ] xor b[c + 20 ]
152
-
153
- template THETA2 (a, b, c: untyped ) =
154
- a = b[(c + 4 ) mod 5 ] xor ROL (uint64 (b[(c + 1 ) mod 5 ]), 1 )
155
-
156
- template THETA3 (a, b, c) =
157
- a[b] = a[b] xor c
158
- a[b + 5 ] = a[b + 5 ] xor c
159
- a[b + 10 ] = a[b + 10 ] xor c
160
- a[b + 15 ] = a[b + 15 ] xor c
161
- a[b + 20 ] = a[b + 20 ] xor c
162
-
163
- template RHOPI (a, b, c, d, e) =
164
- a[0 ] = b[d]
165
- b[d] = ROL (c, e)
166
- c = a[0 ]
167
-
168
- template CHI (a, b, c) =
169
- a[0 ] = b[c]
170
- a[1 ] = b[c + 1 ]
171
- a[2 ] = b[c + 2 ]
172
- a[3 ] = b[c + 3 ]
173
- a[4 ] = b[c + 4 ]
174
- b[c] = b[c] xor (not (a[1 ]) and a[2 ])
175
- b[c + 1 ] = b[c + 1 ] xor (not (a[2 ]) and a[3 ])
176
- b[c + 2 ] = b[c + 2 ] xor (not (a[3 ]) and a[4 ])
177
- b[c + 3 ] = b[c + 3 ] xor (not (a[4 ]) and a[0 ])
178
- b[c + 4 ] = b[c + 4 ] xor (not (a[0 ]) and a[1 ])
179
-
180
- template KECCAKROUND (a, b, c, r) =
181
- THETA1 (b, a, 0 )
182
- THETA1 (b, a, 1 )
183
- THETA1 (b, a, 2 )
184
- THETA1 (b, a, 3 )
185
- THETA1 (b, a, 4 )
186
-
187
- THETA2 (c, b, 0 )
188
- THETA3 (a, 0 , c)
189
- THETA2 (c, b, 1 )
190
- THETA3 (a, 1 , c)
191
- THETA2 (c, b, 2 )
192
- THETA3 (a, 2 , c)
193
- THETA2 (c, b, 3 )
194
- THETA3 (a, 3 , c)
195
- THETA2 (c, b, 4 )
196
- THETA3 (a, 4 , c)
197
-
198
- c = a[1 ]
199
- RHOPI (b, a, c, 10 , 1 )
200
- RHOPI (b, a, c, 7 , 3 )
201
- RHOPI (b, a, c, 11 , 6 )
202
- RHOPI (b, a, c, 17 , 10 )
203
- RHOPI (b, a, c, 18 , 15 )
204
- RHOPI (b, a, c, 3 , 21 )
205
- RHOPI (b, a, c, 5 , 28 )
206
- RHOPI (b, a, c, 16 , 36 )
207
- RHOPI (b, a, c, 8 , 45 )
208
- RHOPI (b, a, c, 21 , 55 )
209
- RHOPI (b, a, c, 24 , 2 )
210
- RHOPI (b, a, c, 4 , 14 )
211
- RHOPI (b, a, c, 15 , 27 )
212
- RHOPI (b, a, c, 23 , 41 )
213
- RHOPI (b, a, c, 19 , 56 )
214
- RHOPI (b, a, c, 13 , 8 )
215
- RHOPI (b, a, c, 12 , 25 )
216
- RHOPI (b, a, c, 2 , 43 )
217
- RHOPI (b, a, c, 20 , 62 )
218
- RHOPI (b, a, c, 14 , 18 )
219
- RHOPI (b, a, c, 22 , 39 )
220
- RHOPI (b, a, c, 9 , 61 )
221
- RHOPI (b, a, c, 6 , 20 )
222
- RHOPI (b, a, c, 1 , 44 )
223
-
224
- CHI (b, a, 0 )
225
- CHI (b, a, 5 )
226
- CHI (b, a, 10 )
227
- CHI (b, a, 15 )
228
- CHI (b, a, 20 )
229
-
230
- a[0 ] = a[0 ] xor RNDC [r]
61
+ proc THETA1V (a: var openArray [uint64 ], b: openArray [uint64 ],
62
+ c: int ) {.inline .} =
63
+ a[c] = b[c] xor b[c + 5 ] xor b[c + 10 ] xor b[c + 15 ] xor b[c + 20 ]
64
+
65
+ proc THETA2V (a: var uint64 , b: openArray [uint64 ], c: int ) {.inline .} =
66
+ a = b[(c + 4 ) mod 5 ] xor ROL (uint64 (b[(c + 1 ) mod 5 ]), 1 )
67
+
68
+ proc THETA3V (a: var openArray [uint64 ], b: int , c: uint64 ) {.inline .} =
69
+ a[b] = a[b] xor c
70
+ a[b + 5 ] = a[b + 5 ] xor c
71
+ a[b + 10 ] = a[b + 10 ] xor c
72
+ a[b + 15 ] = a[b + 15 ] xor c
73
+ a[b + 20 ] = a[b + 20 ] xor c
74
+
75
+ proc RHOPIV (a: var openArray [uint64 ], b: var openArray [uint64 ], c: var uint64 ,
76
+ d, e: int ) {.inline .} =
77
+ a[0 ] = b[d]
78
+ b[d] = ROL (c, e)
79
+ c = uint64 (a[0 ])
80
+
81
+ proc CHIV (a: var openArray [uint64 ], b: var openArray [uint64 ],
82
+ c: int ) {.inline .} =
83
+ a[0 ] = b[c]
84
+ a[1 ] = b[c + 1 ]
85
+ a[2 ] = b[c + 2 ]
86
+ a[3 ] = b[c + 3 ]
87
+ a[4 ] = b[c + 4 ]
88
+ b[c] = b[c] xor (not (a[1 ]) and a[2 ])
89
+ b[c + 1 ] = b[c + 1 ] xor (not (a[2 ]) and a[3 ])
90
+ b[c + 2 ] = b[c + 2 ] xor (not (a[3 ]) and a[4 ])
91
+ b[c + 3 ] = b[c + 3 ] xor (not (a[4 ]) and a[0 ])
92
+ b[c + 4 ] = b[c + 4 ] xor (not (a[0 ]) and a[1 ])
93
+
94
+
95
+ proc KECCAKROUNDP (a: var openArray [uint64 ], b: var openArray [uint64 ],
96
+ c: var uint64 , r: int ) {.inline .} =
97
+ THETA1V (b, a, 0 )
98
+ THETA1V (b, a, 1 )
99
+ THETA1V (b, a, 2 )
100
+ THETA1V (b, a, 3 )
101
+ THETA1V (b, a, 4 )
102
+
103
+ THETA2V (c, b, 0 )
104
+ THETA3V (a, 0 , c)
105
+ THETA2V (c, b, 1 )
106
+ THETA3V (a, 1 , c)
107
+ THETA2V (c, b, 2 )
108
+ THETA3V (a, 2 , c)
109
+ THETA2V (c, b, 3 )
110
+ THETA3V (a, 3 , c)
111
+ THETA2V (c, b, 4 )
112
+ THETA3V (a, 4 , c)
113
+
114
+ c = a[1 ]
115
+ RHOPIV (b, a, c, 10 , 1 )
116
+ RHOPIV (b, a, c, 7 , 3 )
117
+ RHOPIV (b, a, c, 11 , 6 )
118
+ RHOPIV (b, a, c, 17 , 10 )
119
+ RHOPIV (b, a, c, 18 , 15 )
120
+ RHOPIV (b, a, c, 3 , 21 )
121
+ RHOPIV (b, a, c, 5 , 28 )
122
+ RHOPIV (b, a, c, 16 , 36 )
123
+ RHOPIV (b, a, c, 8 , 45 )
124
+ RHOPIV (b, a, c, 21 , 55 )
125
+ RHOPIV (b, a, c, 24 , 2 )
126
+ RHOPIV (b, a, c, 4 , 14 )
127
+ RHOPIV (b, a, c, 15 , 27 )
128
+ RHOPIV (b, a, c, 23 , 41 )
129
+ RHOPIV (b, a, c, 19 , 56 )
130
+ RHOPIV (b, a, c, 13 , 8 )
131
+ RHOPIV (b, a, c, 12 , 25 )
132
+ RHOPIV (b, a, c, 2 , 43 )
133
+ RHOPIV (b, a, c, 20 , 62 )
134
+ RHOPIV (b, a, c, 14 , 18 )
135
+ RHOPIV (b, a, c, 22 , 39 )
136
+ RHOPIV (b, a, c, 9 , 61 )
137
+ RHOPIV (b, a, c, 6 , 20 )
138
+ RHOPIV (b, a, c, 1 , 44 )
139
+
140
+ CHIV (b, a, 0 )
141
+ CHIV (b, a, 5 )
142
+ CHIV (b, a, 10 )
143
+ CHIV (b, a, 15 )
144
+ CHIV (b, a, 20 )
145
+
146
+ a[0 ] = a[0 ] xor RNDC [r]
147
+
148
+ template THETA1 (a, b, c: untyped ) =
149
+ a[c] = b[c] xor b[c + 5 ] xor b[c + 10 ] xor b[c + 15 ] xor b[c + 20 ]
150
+
151
+ template THETA2 (a, b, c: untyped ) =
152
+ a = b[(c + 4 ) mod 5 ] xor ROL (uint64 (b[(c + 1 ) mod 5 ]), 1 )
153
+
154
+ template THETA3 (a, b, c) =
155
+ a[b] = a[b] xor c
156
+ a[b + 5 ] = a[b + 5 ] xor c
157
+ a[b + 10 ] = a[b + 10 ] xor c
158
+ a[b + 15 ] = a[b + 15 ] xor c
159
+ a[b + 20 ] = a[b + 20 ] xor c
160
+
161
+ template RHOPI (a, b, c, d, e) =
162
+ a[0 ] = b[d]
163
+ b[d] = ROL (c, e)
164
+ c = a[0 ]
165
+
166
+ template CHI (a, b, c) =
167
+ a[0 ] = b[c]
168
+ a[1 ] = b[c + 1 ]
169
+ a[2 ] = b[c + 2 ]
170
+ a[3 ] = b[c + 3 ]
171
+ a[4 ] = b[c + 4 ]
172
+ b[c] = b[c] xor (not (a[1 ]) and a[2 ])
173
+ b[c + 1 ] = b[c + 1 ] xor (not (a[2 ]) and a[3 ])
174
+ b[c + 2 ] = b[c + 2 ] xor (not (a[3 ]) and a[4 ])
175
+ b[c + 3 ] = b[c + 3 ] xor (not (a[4 ]) and a[0 ])
176
+ b[c + 4 ] = b[c + 4 ] xor (not (a[0 ]) and a[1 ])
177
+
178
+ template KECCAKROUND (a, b, c, r) =
179
+ THETA1 (b, a, 0 )
180
+ THETA1 (b, a, 1 )
181
+ THETA1 (b, a, 2 )
182
+ THETA1 (b, a, 3 )
183
+ THETA1 (b, a, 4 )
184
+
185
+ THETA2 (c, b, 0 )
186
+ THETA3 (a, 0 , c)
187
+ THETA2 (c, b, 1 )
188
+ THETA3 (a, 1 , c)
189
+ THETA2 (c, b, 2 )
190
+ THETA3 (a, 2 , c)
191
+ THETA2 (c, b, 3 )
192
+ THETA3 (a, 3 , c)
193
+ THETA2 (c, b, 4 )
194
+ THETA3 (a, 4 , c)
195
+
196
+ c = a[1 ]
197
+ RHOPI (b, a, c, 10 , 1 )
198
+ RHOPI (b, a, c, 7 , 3 )
199
+ RHOPI (b, a, c, 11 , 6 )
200
+ RHOPI (b, a, c, 17 , 10 )
201
+ RHOPI (b, a, c, 18 , 15 )
202
+ RHOPI (b, a, c, 3 , 21 )
203
+ RHOPI (b, a, c, 5 , 28 )
204
+ RHOPI (b, a, c, 16 , 36 )
205
+ RHOPI (b, a, c, 8 , 45 )
206
+ RHOPI (b, a, c, 21 , 55 )
207
+ RHOPI (b, a, c, 24 , 2 )
208
+ RHOPI (b, a, c, 4 , 14 )
209
+ RHOPI (b, a, c, 15 , 27 )
210
+ RHOPI (b, a, c, 23 , 41 )
211
+ RHOPI (b, a, c, 19 , 56 )
212
+ RHOPI (b, a, c, 13 , 8 )
213
+ RHOPI (b, a, c, 12 , 25 )
214
+ RHOPI (b, a, c, 2 , 43 )
215
+ RHOPI (b, a, c, 20 , 62 )
216
+ RHOPI (b, a, c, 14 , 18 )
217
+ RHOPI (b, a, c, 22 , 39 )
218
+ RHOPI (b, a, c, 9 , 61 )
219
+ RHOPI (b, a, c, 6 , 20 )
220
+ RHOPI (b, a, c, 1 , 44 )
221
+
222
+ CHI (b, a, 0 )
223
+ CHI (b, a, 5 )
224
+ CHI (b, a, 10 )
225
+ CHI (b, a, 15 )
226
+ CHI (b, a, 20 )
227
+
228
+ a[0 ] = a[0 ] xor RNDC [r]
231
229
232
230
proc keccakTransform (data: var array [200 , byte ]) {.inline .} =
233
231
var
0 commit comments