sha3 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sha3 might be problematic. Click here for more details.

@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 1.9.2
5
+ - rbx-18mode
6
+ - rbx-19mode
7
+ - 1.8.7
8
+
9
+ gemfile: Gemfile.ci
@@ -2,3 +2,7 @@
2
2
 
3
3
  * Initial release:
4
4
 
5
+ === 0.1.1 / 2012-10-07
6
+
7
+ * Replaced Keccak reference code with optimized (~10x faster)
8
+
@@ -1,33 +1,44 @@
1
- = sha3
1
+ = sha3 {<img src="https://secure.travis-ci.org/johanns/sha3.png" alt="Build Status" />}[http://travis-ci.org/johanns/sha3]
2
2
 
3
3
  * {Homepage}[https://github.com/johanns/sha3#readme]
4
4
  * {Issues}[https://github.com/johanns/sha3/issues]
5
5
  * {Documentation}[http://rubydoc.info/gems/sha3/frames]
6
- * {Email}[mailto:io+sha3 at jsani.com]
7
6
 
8
7
  == Description
9
8
 
10
- TO-DO: A Ruby SHA3 wrapper
9
+ A native SHA3 Ruby gem.
11
10
 
12
- == Features
11
+ == Features/Status/Etc.
12
+
13
+ 4th Oct. 2012: This is very alpha quality code, and not suitable for production.
14
+
15
+ == Install
16
+
17
+ $ gem install sha3
13
18
 
14
19
  == Examples
15
20
 
16
21
  require 'sha3'
17
22
 
18
- # Basic Usage
23
+ # Basic usage
19
24
  SHA3::digest_224("Crazy Man's Utopia")
20
25
  => "\xF8\x1A4\xACW6\v\x01A \x99\x11i\x91\xB3q\xB5\xF5\x04\xD4\x88fn\xC6\xA7\xEA\xBBb"
21
26
 
22
- # A bit more advanced; allows you to specify data length (2nd param), and desired hash bit length (3rd param)
23
- SHA3::digest("Crazy Man's Utopia", 36, 512)
24
- => "\xBC\x9Dl\xEA \x83\xC2\x19\xC8\r/<!\xE4\xE3\x9E3(\xA1\x04\xB6\xBA6C\xE6\xA3\xC1\xCE\xF1EG/\xA9\xAD\xF1\x89\x97yA3\x98\x9FtX\xE7\x7F\xF4a\xD1\x1C\xFF\xCE\xA8\x84\x05\x91\x0310@\xBC\xF75b"
27
+ # A bit more advanced
28
+ SHA3::digest("Crazy Man's Utopia", 36, 512).unpack("H*")
29
+ => ["bc9d6cea2083c219c80d2f3...884059103313040bcf73562"]
25
30
 
26
31
  == Requirements
27
32
 
28
- == Install
33
+ Native build environment (GCC 4.x).
29
34
 
30
- $ gem install sha3
35
+ Tested with Rubies (see build status up-top):
36
+
37
+ - 1.9.3
38
+ - 1.9.2
39
+ - 1.8.7
40
+ - Rubinius (18mode)
41
+ - Rubinius (19mode)
31
42
 
32
43
  == Copyright
33
44
 
@@ -0,0 +1,555 @@
1
+ /*
2
+ The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
3
+ Michaël Peeters and Gilles Van Assche. For more information, feedback or
4
+ questions, please refer to our website: http://keccak.noekeon.org/
5
+
6
+ Implementation by Ronny Van Keer,
7
+ hereby denoted as "the implementer".
8
+
9
+ To the extent possible under law, the implementer has waived all copyright
10
+ and related or neighboring rights to the source code in this file.
11
+ http://creativecommons.org/publicdomain/zero/1.0/
12
+ */
13
+
14
+ static const UINT32 KeccakF1600RoundConstants_int2[2*24] =
15
+ {
16
+ 0x00000001UL, 0x00000000UL,
17
+ 0x00000000UL, 0x00000089UL,
18
+ 0x00000000UL, 0x8000008bUL,
19
+ 0x00000000UL, 0x80008080UL,
20
+ 0x00000001UL, 0x0000008bUL,
21
+ 0x00000001UL, 0x00008000UL,
22
+ 0x00000001UL, 0x80008088UL,
23
+ 0x00000001UL, 0x80000082UL,
24
+ 0x00000000UL, 0x0000000bUL,
25
+ 0x00000000UL, 0x0000000aUL,
26
+ 0x00000001UL, 0x00008082UL,
27
+ 0x00000000UL, 0x00008003UL,
28
+ 0x00000001UL, 0x0000808bUL,
29
+ 0x00000001UL, 0x8000000bUL,
30
+ 0x00000001UL, 0x8000008aUL,
31
+ 0x00000001UL, 0x80000081UL,
32
+ 0x00000000UL, 0x80000081UL,
33
+ 0x00000000UL, 0x80000008UL,
34
+ 0x00000000UL, 0x00000083UL,
35
+ 0x00000000UL, 0x80008003UL,
36
+ 0x00000001UL, 0x80008088UL,
37
+ 0x00000000UL, 0x80000088UL,
38
+ 0x00000001UL, 0x00008000UL,
39
+ 0x00000000UL, 0x80008082UL
40
+ };
41
+
42
+ #undef rounds
43
+
44
+ #define rounds \
45
+ { \
46
+ UINT32 Da0, De0, Di0, Do0, Du0; \
47
+ UINT32 Da1, De1, Di1, Do1, Du1; \
48
+ UINT32 Ba, Be, Bi, Bo, Bu; \
49
+ UINT32 Aba0, Abe0, Abi0, Abo0, Abu0; \
50
+ UINT32 Aba1, Abe1, Abi1, Abo1, Abu1; \
51
+ UINT32 Aga0, Age0, Agi0, Ago0, Agu0; \
52
+ UINT32 Aga1, Age1, Agi1, Ago1, Agu1; \
53
+ UINT32 Aka0, Ake0, Aki0, Ako0, Aku0; \
54
+ UINT32 Aka1, Ake1, Aki1, Ako1, Aku1; \
55
+ UINT32 Ama0, Ame0, Ami0, Amo0, Amu0; \
56
+ UINT32 Ama1, Ame1, Ami1, Amo1, Amu1; \
57
+ UINT32 Asa0, Ase0, Asi0, Aso0, Asu0; \
58
+ UINT32 Asa1, Ase1, Asi1, Aso1, Asu1; \
59
+ UINT32 Cw, Cx, Cy, Cz; \
60
+ UINT32 Eba0, Ebe0, Ebi0, Ebo0, Ebu0; \
61
+ UINT32 Eba1, Ebe1, Ebi1, Ebo1, Ebu1; \
62
+ UINT32 Ega0, Ege0, Egi0, Ego0, Egu0; \
63
+ UINT32 Ega1, Ege1, Egi1, Ego1, Egu1; \
64
+ UINT32 Eka0, Eke0, Eki0, Eko0, Eku0; \
65
+ UINT32 Eka1, Eke1, Eki1, Eko1, Eku1; \
66
+ UINT32 Ema0, Eme0, Emi0, Emo0, Emu0; \
67
+ UINT32 Ema1, Eme1, Emi1, Emo1, Emu1; \
68
+ UINT32 Esa0, Ese0, Esi0, Eso0, Esu0; \
69
+ UINT32 Esa1, Ese1, Esi1, Eso1, Esu1; \
70
+ const UINT32 * pRoundConstants = KeccakF1600RoundConstants_int2; \
71
+ UINT32 i; \
72
+ \
73
+ copyFromState(A, state) \
74
+ \
75
+ for( i = 12; i != 0; --i ) { \
76
+ Cx = Abu0^Agu0^Aku0^Amu0^Asu0; \
77
+ Du1 = Abe1^Age1^Ake1^Ame1^Ase1; \
78
+ Da0 = Cx^ROL32(Du1, 1); \
79
+ Cz = Abu1^Agu1^Aku1^Amu1^Asu1; \
80
+ Du0 = Abe0^Age0^Ake0^Ame0^Ase0; \
81
+ Da1 = Cz^Du0; \
82
+ \
83
+ Cw = Abi0^Agi0^Aki0^Ami0^Asi0; \
84
+ Do0 = Cw^ROL32(Cz, 1); \
85
+ Cy = Abi1^Agi1^Aki1^Ami1^Asi1; \
86
+ Do1 = Cy^Cx; \
87
+ \
88
+ Cx = Aba0^Aga0^Aka0^Ama0^Asa0; \
89
+ De0 = Cx^ROL32(Cy, 1); \
90
+ Cz = Aba1^Aga1^Aka1^Ama1^Asa1; \
91
+ De1 = Cz^Cw; \
92
+ \
93
+ Cy = Abo1^Ago1^Ako1^Amo1^Aso1; \
94
+ Di0 = Du0^ROL32(Cy, 1); \
95
+ Cw = Abo0^Ago0^Ako0^Amo0^Aso0; \
96
+ Di1 = Du1^Cw; \
97
+ \
98
+ Du0 = Cw^ROL32(Cz, 1); \
99
+ Du1 = Cy^Cx; \
100
+ \
101
+ Aba0 ^= Da0; \
102
+ Ba = Aba0; \
103
+ Age0 ^= De0; \
104
+ Be = ROL32(Age0, 22); \
105
+ Aki1 ^= Di1; \
106
+ Bi = ROL32(Aki1, 22); \
107
+ Amo1 ^= Do1; \
108
+ Bo = ROL32(Amo1, 11); \
109
+ Asu0 ^= Du0; \
110
+ Bu = ROL32(Asu0, 7); \
111
+ Eba0 = Ba ^((~Be)& Bi ) ^ *(pRoundConstants++); \
112
+ Ebe0 = Be ^((~Bi)& Bo ); \
113
+ Ebi0 = Bi ^((~Bo)& Bu ); \
114
+ Ebo0 = Bo ^((~Bu)& Ba ); \
115
+ Ebu0 = Bu ^((~Ba)& Be ); \
116
+ \
117
+ Abo0 ^= Do0; \
118
+ Ba = ROL32(Abo0, 14); \
119
+ Agu0 ^= Du0; \
120
+ Be = ROL32(Agu0, 10); \
121
+ Aka1 ^= Da1; \
122
+ Bi = ROL32(Aka1, 2); \
123
+ Ame1 ^= De1; \
124
+ Bo = ROL32(Ame1, 23); \
125
+ Asi1 ^= Di1; \
126
+ Bu = ROL32(Asi1, 31); \
127
+ Ega0 = Ba ^((~Be)& Bi ); \
128
+ Ege0 = Be ^((~Bi)& Bo ); \
129
+ Egi0 = Bi ^((~Bo)& Bu ); \
130
+ Ego0 = Bo ^((~Bu)& Ba ); \
131
+ Egu0 = Bu ^((~Ba)& Be ); \
132
+ \
133
+ Abe1 ^= De1; \
134
+ Ba = ROL32(Abe1, 1); \
135
+ Agi0 ^= Di0; \
136
+ Be = ROL32(Agi0, 3); \
137
+ Ako1 ^= Do1; \
138
+ Bi = ROL32(Ako1, 13); \
139
+ Amu0 ^= Du0; \
140
+ Bo = ROL32(Amu0, 4); \
141
+ Asa0 ^= Da0; \
142
+ Bu = ROL32(Asa0, 9); \
143
+ Eka0 = Ba ^((~Be)& Bi ); \
144
+ Eke0 = Be ^((~Bi)& Bo ); \
145
+ Eki0 = Bi ^((~Bo)& Bu ); \
146
+ Eko0 = Bo ^((~Bu)& Ba ); \
147
+ Eku0 = Bu ^((~Ba)& Be ); \
148
+ \
149
+ Abu1 ^= Du1; \
150
+ Ba = ROL32(Abu1, 14); \
151
+ Aga0 ^= Da0; \
152
+ Be = ROL32(Aga0, 18); \
153
+ Ake0 ^= De0; \
154
+ Bi = ROL32(Ake0, 5); \
155
+ Ami1 ^= Di1; \
156
+ Bo = ROL32(Ami1, 8); \
157
+ Aso0 ^= Do0; \
158
+ Bu = ROL32(Aso0, 28); \
159
+ Ema0 = Ba ^((~Be)& Bi ); \
160
+ Eme0 = Be ^((~Bi)& Bo ); \
161
+ Emi0 = Bi ^((~Bo)& Bu ); \
162
+ Emo0 = Bo ^((~Bu)& Ba ); \
163
+ Emu0 = Bu ^((~Ba)& Be ); \
164
+ \
165
+ Abi0 ^= Di0; \
166
+ Ba = ROL32(Abi0, 31); \
167
+ Ago1 ^= Do1; \
168
+ Be = ROL32(Ago1, 28); \
169
+ Aku1 ^= Du1; \
170
+ Bi = ROL32(Aku1, 20); \
171
+ Ama1 ^= Da1; \
172
+ Bo = ROL32(Ama1, 21); \
173
+ Ase0 ^= De0; \
174
+ Bu = ROL32(Ase0, 1); \
175
+ Esa0 = Ba ^((~Be)& Bi ); \
176
+ Ese0 = Be ^((~Bi)& Bo ); \
177
+ Esi0 = Bi ^((~Bo)& Bu ); \
178
+ Eso0 = Bo ^((~Bu)& Ba ); \
179
+ Esu0 = Bu ^((~Ba)& Be ); \
180
+ \
181
+ Aba1 ^= Da1; \
182
+ Ba = Aba1; \
183
+ Age1 ^= De1; \
184
+ Be = ROL32(Age1, 22); \
185
+ Aki0 ^= Di0; \
186
+ Bi = ROL32(Aki0, 21); \
187
+ Amo0 ^= Do0; \
188
+ Bo = ROL32(Amo0, 10); \
189
+ Asu1 ^= Du1; \
190
+ Bu = ROL32(Asu1, 7); \
191
+ Eba1 = Ba ^((~Be)& Bi ); \
192
+ Eba1 ^= *(pRoundConstants++); \
193
+ Ebe1 = Be ^((~Bi)& Bo ); \
194
+ Ebi1 = Bi ^((~Bo)& Bu ); \
195
+ Ebo1 = Bo ^((~Bu)& Ba ); \
196
+ Ebu1 = Bu ^((~Ba)& Be ); \
197
+ \
198
+ Abo1 ^= Do1; \
199
+ Ba = ROL32(Abo1, 14); \
200
+ Agu1 ^= Du1; \
201
+ Be = ROL32(Agu1, 10); \
202
+ Aka0 ^= Da0; \
203
+ Bi = ROL32(Aka0, 1); \
204
+ Ame0 ^= De0; \
205
+ Bo = ROL32(Ame0, 22); \
206
+ Asi0 ^= Di0; \
207
+ Bu = ROL32(Asi0, 30); \
208
+ Ega1 = Ba ^((~Be)& Bi ); \
209
+ Ege1 = Be ^((~Bi)& Bo ); \
210
+ Egi1 = Bi ^((~Bo)& Bu ); \
211
+ Ego1 = Bo ^((~Bu)& Ba ); \
212
+ Egu1 = Bu ^((~Ba)& Be ); \
213
+ \
214
+ Abe0 ^= De0; \
215
+ Ba = Abe0; \
216
+ Agi1 ^= Di1; \
217
+ Be = ROL32(Agi1, 3); \
218
+ Ako0 ^= Do0; \
219
+ Bi = ROL32(Ako0, 12); \
220
+ Amu1 ^= Du1; \
221
+ Bo = ROL32(Amu1, 4); \
222
+ Asa1 ^= Da1; \
223
+ Bu = ROL32(Asa1, 9); \
224
+ Eka1 = Ba ^((~Be)& Bi ); \
225
+ Eke1 = Be ^((~Bi)& Bo ); \
226
+ Eki1 = Bi ^((~Bo)& Bu ); \
227
+ Eko1 = Bo ^((~Bu)& Ba ); \
228
+ Eku1 = Bu ^((~Ba)& Be ); \
229
+ \
230
+ Abu0 ^= Du0; \
231
+ Ba = ROL32(Abu0, 13); \
232
+ Aga1 ^= Da1; \
233
+ Be = ROL32(Aga1, 18); \
234
+ Ake1 ^= De1; \
235
+ Bi = ROL32(Ake1, 5); \
236
+ Ami0 ^= Di0; \
237
+ Bo = ROL32(Ami0, 7); \
238
+ Aso1 ^= Do1; \
239
+ Bu = ROL32(Aso1, 28); \
240
+ Ema1 = Ba ^((~Be)& Bi ); \
241
+ Eme1 = Be ^((~Bi)& Bo ); \
242
+ Emi1 = Bi ^((~Bo)& Bu ); \
243
+ Emo1 = Bo ^((~Bu)& Ba ); \
244
+ Emu1 = Bu ^((~Ba)& Be ); \
245
+ \
246
+ Abi1 ^= Di1; \
247
+ Ba = ROL32(Abi1, 31); \
248
+ Ago0 ^= Do0; \
249
+ Be = ROL32(Ago0, 27); \
250
+ Aku0 ^= Du0; \
251
+ Bi = ROL32(Aku0, 19); \
252
+ Ama0 ^= Da0; \
253
+ Bo = ROL32(Ama0, 20); \
254
+ Ase1 ^= De1; \
255
+ Bu = ROL32(Ase1, 1); \
256
+ Esa1 = Ba ^((~Be)& Bi ); \
257
+ Ese1 = Be ^((~Bi)& Bo ); \
258
+ Esi1 = Bi ^((~Bo)& Bu ); \
259
+ Eso1 = Bo ^((~Bu)& Ba ); \
260
+ Esu1 = Bu ^((~Ba)& Be ); \
261
+ \
262
+ Cx = Ebu0^Egu0^Eku0^Emu0^Esu0; \
263
+ Du1 = Ebe1^Ege1^Eke1^Eme1^Ese1; \
264
+ Da0 = Cx^ROL32(Du1, 1); \
265
+ Cz = Ebu1^Egu1^Eku1^Emu1^Esu1; \
266
+ Du0 = Ebe0^Ege0^Eke0^Eme0^Ese0; \
267
+ Da1 = Cz^Du0; \
268
+ \
269
+ Cw = Ebi0^Egi0^Eki0^Emi0^Esi0; \
270
+ Do0 = Cw^ROL32(Cz, 1); \
271
+ Cy = Ebi1^Egi1^Eki1^Emi1^Esi1; \
272
+ Do1 = Cy^Cx; \
273
+ \
274
+ Cx = Eba0^Ega0^Eka0^Ema0^Esa0; \
275
+ De0 = Cx^ROL32(Cy, 1); \
276
+ Cz = Eba1^Ega1^Eka1^Ema1^Esa1; \
277
+ De1 = Cz^Cw; \
278
+ \
279
+ Cy = Ebo1^Ego1^Eko1^Emo1^Eso1; \
280
+ Di0 = Du0^ROL32(Cy, 1); \
281
+ Cw = Ebo0^Ego0^Eko0^Emo0^Eso0; \
282
+ Di1 = Du1^Cw; \
283
+ \
284
+ Du0 = Cw^ROL32(Cz, 1); \
285
+ Du1 = Cy^Cx; \
286
+ \
287
+ Eba0 ^= Da0; \
288
+ Ba = Eba0; \
289
+ Ege0 ^= De0; \
290
+ Be = ROL32(Ege0, 22); \
291
+ Eki1 ^= Di1; \
292
+ Bi = ROL32(Eki1, 22); \
293
+ Emo1 ^= Do1; \
294
+ Bo = ROL32(Emo1, 11); \
295
+ Esu0 ^= Du0; \
296
+ Bu = ROL32(Esu0, 7); \
297
+ Aba0 = Ba ^((~Be)& Bi ); \
298
+ Aba0 ^= *(pRoundConstants++); \
299
+ Abe0 = Be ^((~Bi)& Bo ); \
300
+ Abi0 = Bi ^((~Bo)& Bu ); \
301
+ Abo0 = Bo ^((~Bu)& Ba ); \
302
+ Abu0 = Bu ^((~Ba)& Be ); \
303
+ \
304
+ Ebo0 ^= Do0; \
305
+ Ba = ROL32(Ebo0, 14); \
306
+ Egu0 ^= Du0; \
307
+ Be = ROL32(Egu0, 10); \
308
+ Eka1 ^= Da1; \
309
+ Bi = ROL32(Eka1, 2); \
310
+ Eme1 ^= De1; \
311
+ Bo = ROL32(Eme1, 23); \
312
+ Esi1 ^= Di1; \
313
+ Bu = ROL32(Esi1, 31); \
314
+ Aga0 = Ba ^((~Be)& Bi ); \
315
+ Age0 = Be ^((~Bi)& Bo ); \
316
+ Agi0 = Bi ^((~Bo)& Bu ); \
317
+ Ago0 = Bo ^((~Bu)& Ba ); \
318
+ Agu0 = Bu ^((~Ba)& Be ); \
319
+ \
320
+ Ebe1 ^= De1; \
321
+ Ba = ROL32(Ebe1, 1); \
322
+ Egi0 ^= Di0; \
323
+ Be = ROL32(Egi0, 3); \
324
+ Eko1 ^= Do1; \
325
+ Bi = ROL32(Eko1, 13); \
326
+ Emu0 ^= Du0; \
327
+ Bo = ROL32(Emu0, 4); \
328
+ Esa0 ^= Da0; \
329
+ Bu = ROL32(Esa0, 9); \
330
+ Aka0 = Ba ^((~Be)& Bi ); \
331
+ Ake0 = Be ^((~Bi)& Bo ); \
332
+ Aki0 = Bi ^((~Bo)& Bu ); \
333
+ Ako0 = Bo ^((~Bu)& Ba ); \
334
+ Aku0 = Bu ^((~Ba)& Be ); \
335
+ \
336
+ Ebu1 ^= Du1; \
337
+ Ba = ROL32(Ebu1, 14); \
338
+ Ega0 ^= Da0; \
339
+ Be = ROL32(Ega0, 18); \
340
+ Eke0 ^= De0; \
341
+ Bi = ROL32(Eke0, 5); \
342
+ Emi1 ^= Di1; \
343
+ Bo = ROL32(Emi1, 8); \
344
+ Eso0 ^= Do0; \
345
+ Bu = ROL32(Eso0, 28); \
346
+ Ama0 = Ba ^((~Be)& Bi ); \
347
+ Ame0 = Be ^((~Bi)& Bo ); \
348
+ Ami0 = Bi ^((~Bo)& Bu ); \
349
+ Amo0 = Bo ^((~Bu)& Ba ); \
350
+ Amu0 = Bu ^((~Ba)& Be ); \
351
+ \
352
+ Ebi0 ^= Di0; \
353
+ Ba = ROL32(Ebi0, 31); \
354
+ Ego1 ^= Do1; \
355
+ Be = ROL32(Ego1, 28); \
356
+ Eku1 ^= Du1; \
357
+ Bi = ROL32(Eku1, 20); \
358
+ Ema1 ^= Da1; \
359
+ Bo = ROL32(Ema1, 21); \
360
+ Ese0 ^= De0; \
361
+ Bu = ROL32(Ese0, 1); \
362
+ Asa0 = Ba ^((~Be)& Bi ); \
363
+ Ase0 = Be ^((~Bi)& Bo ); \
364
+ Asi0 = Bi ^((~Bo)& Bu ); \
365
+ Aso0 = Bo ^((~Bu)& Ba ); \
366
+ Asu0 = Bu ^((~Ba)& Be ); \
367
+ \
368
+ Eba1 ^= Da1; \
369
+ Ba = Eba1; \
370
+ Ege1 ^= De1; \
371
+ Be = ROL32(Ege1, 22); \
372
+ Eki0 ^= Di0; \
373
+ Bi = ROL32(Eki0, 21); \
374
+ Emo0 ^= Do0; \
375
+ Bo = ROL32(Emo0, 10); \
376
+ Esu1 ^= Du1; \
377
+ Bu = ROL32(Esu1, 7); \
378
+ Aba1 = Ba ^((~Be)& Bi ); \
379
+ Aba1 ^= *(pRoundConstants++); \
380
+ Abe1 = Be ^((~Bi)& Bo ); \
381
+ Abi1 = Bi ^((~Bo)& Bu ); \
382
+ Abo1 = Bo ^((~Bu)& Ba ); \
383
+ Abu1 = Bu ^((~Ba)& Be ); \
384
+ \
385
+ Ebo1 ^= Do1; \
386
+ Ba = ROL32(Ebo1, 14); \
387
+ Egu1 ^= Du1; \
388
+ Be = ROL32(Egu1, 10); \
389
+ Eka0 ^= Da0; \
390
+ Bi = ROL32(Eka0, 1); \
391
+ Eme0 ^= De0; \
392
+ Bo = ROL32(Eme0, 22); \
393
+ Esi0 ^= Di0; \
394
+ Bu = ROL32(Esi0, 30); \
395
+ Aga1 = Ba ^((~Be)& Bi ); \
396
+ Age1 = Be ^((~Bi)& Bo ); \
397
+ Agi1 = Bi ^((~Bo)& Bu ); \
398
+ Ago1 = Bo ^((~Bu)& Ba ); \
399
+ Agu1 = Bu ^((~Ba)& Be ); \
400
+ \
401
+ Ebe0 ^= De0; \
402
+ Ba = Ebe0; \
403
+ Egi1 ^= Di1; \
404
+ Be = ROL32(Egi1, 3); \
405
+ Eko0 ^= Do0; \
406
+ Bi = ROL32(Eko0, 12); \
407
+ Emu1 ^= Du1; \
408
+ Bo = ROL32(Emu1, 4); \
409
+ Esa1 ^= Da1; \
410
+ Bu = ROL32(Esa1, 9); \
411
+ Aka1 = Ba ^((~Be)& Bi ); \
412
+ Ake1 = Be ^((~Bi)& Bo ); \
413
+ Aki1 = Bi ^((~Bo)& Bu ); \
414
+ Ako1 = Bo ^((~Bu)& Ba ); \
415
+ Aku1 = Bu ^((~Ba)& Be ); \
416
+ \
417
+ Ebu0 ^= Du0; \
418
+ Ba = ROL32(Ebu0, 13); \
419
+ Ega1 ^= Da1; \
420
+ Be = ROL32(Ega1, 18); \
421
+ Eke1 ^= De1; \
422
+ Bi = ROL32(Eke1, 5); \
423
+ Emi0 ^= Di0; \
424
+ Bo = ROL32(Emi0, 7); \
425
+ Eso1 ^= Do1; \
426
+ Bu = ROL32(Eso1, 28); \
427
+ Ama1 = Ba ^((~Be)& Bi ); \
428
+ Ame1 = Be ^((~Bi)& Bo ); \
429
+ Ami1 = Bi ^((~Bo)& Bu ); \
430
+ Amo1 = Bo ^((~Bu)& Ba ); \
431
+ Amu1 = Bu ^((~Ba)& Be ); \
432
+ \
433
+ Ebi1 ^= Di1; \
434
+ Ba = ROL32(Ebi1, 31); \
435
+ Ego0 ^= Do0; \
436
+ Be = ROL32(Ego0, 27); \
437
+ Eku0 ^= Du0; \
438
+ Bi = ROL32(Eku0, 19); \
439
+ Ema0 ^= Da0; \
440
+ Bo = ROL32(Ema0, 20); \
441
+ Ese1 ^= De1; \
442
+ Bu = ROL32(Ese1, 1); \
443
+ Asa1 = Ba ^((~Be)& Bi ); \
444
+ Ase1 = Be ^((~Bi)& Bo ); \
445
+ Asi1 = Bi ^((~Bo)& Bu ); \
446
+ Aso1 = Bo ^((~Bu)& Ba ); \
447
+ Asu1 = Bu ^((~Ba)& Be ); \
448
+ } \
449
+ copyToState(state, A) \
450
+ }
451
+
452
+ #define copyFromState(X, state) \
453
+ X##ba0 = state[ 0]; \
454
+ X##ba1 = state[ 1]; \
455
+ X##be0 = state[ 2]; \
456
+ X##be1 = state[ 3]; \
457
+ X##bi0 = state[ 4]; \
458
+ X##bi1 = state[ 5]; \
459
+ X##bo0 = state[ 6]; \
460
+ X##bo1 = state[ 7]; \
461
+ X##bu0 = state[ 8]; \
462
+ X##bu1 = state[ 9]; \
463
+ X##ga0 = state[10]; \
464
+ X##ga1 = state[11]; \
465
+ X##ge0 = state[12]; \
466
+ X##ge1 = state[13]; \
467
+ X##gi0 = state[14]; \
468
+ X##gi1 = state[15]; \
469
+ X##go0 = state[16]; \
470
+ X##go1 = state[17]; \
471
+ X##gu0 = state[18]; \
472
+ X##gu1 = state[19]; \
473
+ X##ka0 = state[20]; \
474
+ X##ka1 = state[21]; \
475
+ X##ke0 = state[22]; \
476
+ X##ke1 = state[23]; \
477
+ X##ki0 = state[24]; \
478
+ X##ki1 = state[25]; \
479
+ X##ko0 = state[26]; \
480
+ X##ko1 = state[27]; \
481
+ X##ku0 = state[28]; \
482
+ X##ku1 = state[29]; \
483
+ X##ma0 = state[30]; \
484
+ X##ma1 = state[31]; \
485
+ X##me0 = state[32]; \
486
+ X##me1 = state[33]; \
487
+ X##mi0 = state[34]; \
488
+ X##mi1 = state[35]; \
489
+ X##mo0 = state[36]; \
490
+ X##mo1 = state[37]; \
491
+ X##mu0 = state[38]; \
492
+ X##mu1 = state[39]; \
493
+ X##sa0 = state[40]; \
494
+ X##sa1 = state[41]; \
495
+ X##se0 = state[42]; \
496
+ X##se1 = state[43]; \
497
+ X##si0 = state[44]; \
498
+ X##si1 = state[45]; \
499
+ X##so0 = state[46]; \
500
+ X##so1 = state[47]; \
501
+ X##su0 = state[48]; \
502
+ X##su1 = state[49]; \
503
+
504
+ #define copyToState(state, X) \
505
+ state[ 0] = X##ba0; \
506
+ state[ 1] = X##ba1; \
507
+ state[ 2] = X##be0; \
508
+ state[ 3] = X##be1; \
509
+ state[ 4] = X##bi0; \
510
+ state[ 5] = X##bi1; \
511
+ state[ 6] = X##bo0; \
512
+ state[ 7] = X##bo1; \
513
+ state[ 8] = X##bu0; \
514
+ state[ 9] = X##bu1; \
515
+ state[10] = X##ga0; \
516
+ state[11] = X##ga1; \
517
+ state[12] = X##ge0; \
518
+ state[13] = X##ge1; \
519
+ state[14] = X##gi0; \
520
+ state[15] = X##gi1; \
521
+ state[16] = X##go0; \
522
+ state[17] = X##go1; \
523
+ state[18] = X##gu0; \
524
+ state[19] = X##gu1; \
525
+ state[20] = X##ka0; \
526
+ state[21] = X##ka1; \
527
+ state[22] = X##ke0; \
528
+ state[23] = X##ke1; \
529
+ state[24] = X##ki0; \
530
+ state[25] = X##ki1; \
531
+ state[26] = X##ko0; \
532
+ state[27] = X##ko1; \
533
+ state[28] = X##ku0; \
534
+ state[29] = X##ku1; \
535
+ state[30] = X##ma0; \
536
+ state[31] = X##ma1; \
537
+ state[32] = X##me0; \
538
+ state[33] = X##me1; \
539
+ state[34] = X##mi0; \
540
+ state[35] = X##mi1; \
541
+ state[36] = X##mo0; \
542
+ state[37] = X##mo1; \
543
+ state[38] = X##mu0; \
544
+ state[39] = X##mu1; \
545
+ state[40] = X##sa0; \
546
+ state[41] = X##sa1; \
547
+ state[42] = X##se0; \
548
+ state[43] = X##se1; \
549
+ state[44] = X##si0; \
550
+ state[45] = X##si1; \
551
+ state[46] = X##so0; \
552
+ state[47] = X##so1; \
553
+ state[48] = X##su0; \
554
+ state[49] = X##su1; \
555
+