09ea5099bc765470cb35a427ecd7f36da78d6f93
[sfrench/cifs-2.6.git] / drivers / staging / skein / threefish256Block.c
1 #include <linux/string.h>
2 #include <threefishApi.h>
3
4
5 void threefishEncrypt256(struct threefish_key *keyCtx, u64 *input, u64 *output)
6   {
7
8     u64 b0 = input[0], b1 = input[1],
9       b2 = input[2], b3 = input[3];
10     u64 k0 = keyCtx->key[0], k1 = keyCtx->key[1],
11       k2 = keyCtx->key[2], k3 = keyCtx->key[3],
12       k4 = keyCtx->key[4];
13     u64 t0 = keyCtx->tweak[0], t1 = keyCtx->tweak[1],
14       t2 = keyCtx->tweak[2];
15
16     b1 += k1 + t0; b0 += b1 + k0; b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
17     b3 += k3; b2 += b3 + k2 + t1; b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
18     b0 += b3; b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
19     b2 += b1; b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
20     b0 += b1; b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
21     b2 += b3; b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
22     b0 += b3; b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
23     b2 += b1; b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
24     b1 += k2 + t1; b0 += b1 + k1; b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
25     b3 += k4 + 1; b2 += b3 + k3 + t2; b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
26     b0 += b3; b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
27     b2 += b1; b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
28     b0 += b1; b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
29     b2 += b3; b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
30     b0 += b3; b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
31     b2 += b1; b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
32
33     b1 += k3 + t2; b0 += b1 + k2; b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
34     b3 += k0 + 2; b2 += b3 + k4 + t0; b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
35     b0 += b3; b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
36     b2 += b1; b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
37     b0 += b1; b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
38     b2 += b3; b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
39     b0 += b3; b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
40     b2 += b1; b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
41     b1 += k4 + t0; b0 += b1 + k3; b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
42     b3 += k1 + 3; b2 += b3 + k0 + t1; b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
43     b0 += b3; b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
44     b2 += b1; b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
45     b0 += b1; b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
46     b2 += b3; b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
47     b0 += b3; b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
48     b2 += b1; b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
49
50     b1 += k0 + t1; b0 += b1 + k4; b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
51     b3 += k2 + 4; b2 += b3 + k1 + t2; b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
52     b0 += b3; b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
53     b2 += b1; b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
54     b0 += b1; b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
55     b2 += b3; b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
56     b0 += b3; b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
57     b2 += b1; b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
58     b1 += k1 + t2; b0 += b1 + k0; b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
59     b3 += k3 + 5; b2 += b3 + k2 + t0; b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
60     b0 += b3; b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
61     b2 += b1; b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
62     b0 += b1; b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
63     b2 += b3; b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
64     b0 += b3; b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
65     b2 += b1; b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
66
67     b1 += k2 + t0; b0 += b1 + k1; b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
68     b3 += k4 + 6; b2 += b3 + k3 + t1; b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
69     b0 += b3; b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
70     b2 += b1; b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
71     b0 += b1; b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
72     b2 += b3; b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
73     b0 += b3; b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
74     b2 += b1; b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
75     b1 += k3 + t1; b0 += b1 + k2; b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
76     b3 += k0 + 7; b2 += b3 + k4 + t2; b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
77     b0 += b3; b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
78     b2 += b1; b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
79     b0 += b1; b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
80     b2 += b3; b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
81     b0 += b3; b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
82     b2 += b1; b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
83
84     b1 += k4 + t2; b0 += b1 + k3; b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
85     b3 += k1 + 8; b2 += b3 + k0 + t0; b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
86     b0 += b3; b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
87     b2 += b1; b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
88     b0 += b1; b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
89     b2 += b3; b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
90     b0 += b3; b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
91     b2 += b1; b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
92     b1 += k0 + t0; b0 += b1 + k4; b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
93     b3 += k2 + 9; b2 += b3 + k1 + t1; b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
94     b0 += b3; b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
95     b2 += b1; b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
96     b0 += b1; b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
97     b2 += b3; b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
98     b0 += b3; b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
99     b2 += b1; b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
100
101     b1 += k1 + t1; b0 += b1 + k0; b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
102     b3 += k3 + 10; b2 += b3 + k2 + t2; b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
103     b0 += b3; b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
104     b2 += b1; b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
105     b0 += b1; b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
106     b2 += b3; b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
107     b0 += b3; b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
108     b2 += b1; b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
109     b1 += k2 + t2; b0 += b1 + k1; b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
110     b3 += k4 + 11; b2 += b3 + k3 + t0; b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
111     b0 += b3; b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
112     b2 += b1; b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
113     b0 += b1; b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
114     b2 += b3; b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
115     b0 += b3; b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
116     b2 += b1; b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
117
118     b1 += k3 + t0; b0 += b1 + k2; b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
119     b3 += k0 + 12; b2 += b3 + k4 + t1; b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
120     b0 += b3; b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
121     b2 += b1; b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
122     b0 += b1; b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
123     b2 += b3; b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
124     b0 += b3; b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
125     b2 += b1; b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
126     b1 += k4 + t1; b0 += b1 + k3; b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
127     b3 += k1 + 13; b2 += b3 + k0 + t2; b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
128     b0 += b3; b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
129     b2 += b1; b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
130     b0 += b1; b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
131     b2 += b3; b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
132     b0 += b3; b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
133     b2 += b1; b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
134
135     b1 += k0 + t2; b0 += b1 + k4; b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
136     b3 += k2 + 14; b2 += b3 + k1 + t0; b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
137     b0 += b3; b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
138     b2 += b1; b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
139     b0 += b1; b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
140     b2 += b3; b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
141     b0 += b3; b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
142     b2 += b1; b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
143     b1 += k1 + t0; b0 += b1 + k0; b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
144     b3 += k3 + 15; b2 += b3 + k2 + t1; b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
145     b0 += b3; b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
146     b2 += b1; b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
147     b0 += b1; b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
148     b2 += b3; b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
149     b0 += b3; b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
150     b2 += b1; b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
151
152     b1 += k2 + t1; b0 += b1 + k1; b1 = ((b1 << 14) | (b1 >> (64 - 14))) ^ b0;
153     b3 += k4 + 16; b2 += b3 + k3 + t2; b3 = ((b3 << 16) | (b3 >> (64 - 16))) ^ b2;
154     b0 += b3; b3 = ((b3 << 52) | (b3 >> (64 - 52))) ^ b0;
155     b2 += b1; b1 = ((b1 << 57) | (b1 >> (64 - 57))) ^ b2;
156     b0 += b1; b1 = ((b1 << 23) | (b1 >> (64 - 23))) ^ b0;
157     b2 += b3; b3 = ((b3 << 40) | (b3 >> (64 - 40))) ^ b2;
158     b0 += b3; b3 = ((b3 << 5) | (b3 >> (64 - 5))) ^ b0;
159     b2 += b1; b1 = ((b1 << 37) | (b1 >> (64 - 37))) ^ b2;
160     b1 += k3 + t2; b0 += b1 + k2; b1 = ((b1 << 25) | (b1 >> (64 - 25))) ^ b0;
161     b3 += k0 + 17; b2 += b3 + k4 + t0; b3 = ((b3 << 33) | (b3 >> (64 - 33))) ^ b2;
162     b0 += b3; b3 = ((b3 << 46) | (b3 >> (64 - 46))) ^ b0;
163     b2 += b1; b1 = ((b1 << 12) | (b1 >> (64 - 12))) ^ b2;
164     b0 += b1; b1 = ((b1 << 58) | (b1 >> (64 - 58))) ^ b0;
165     b2 += b3; b3 = ((b3 << 22) | (b3 >> (64 - 22))) ^ b2;
166     b0 += b3; b3 = ((b3 << 32) | (b3 >> (64 - 32))) ^ b0;
167     b2 += b1; b1 = ((b1 << 32) | (b1 >> (64 - 32))) ^ b2;
168
169     output[0] = b0 + k3;
170     output[1] = b1 + k4 + t0;
171     output[2] = b2 + k0 + t1;
172     output[3] = b3 + k1 + 18;
173   }
174
175 void threefishDecrypt256(struct threefish_key *keyCtx, u64 *input, u64 *output)
176   {
177     u64 b0 = input[0], b1 = input[1],
178       b2 = input[2], b3 = input[3];
179     u64 k0 = keyCtx->key[0], k1 = keyCtx->key[1],
180       k2 = keyCtx->key[2], k3 = keyCtx->key[3],
181       k4 = keyCtx->key[4];
182     u64 t0 = keyCtx->tweak[0], t1 = keyCtx->tweak[1],
183       t2 = keyCtx->tweak[2];
184
185     u64 tmp;
186
187     b0 -= k3;
188     b1 -= k4 + t0;
189     b2 -= k0 + t1;
190     b3 -= k1 + 18;
191     tmp = b3 ^ b0; b3 = (tmp >> 32) | (tmp << (64 - 32)); b0 -= b3;
192     tmp = b1 ^ b2; b1 = (tmp >> 32) | (tmp << (64 - 32)); b2 -= b1;
193     tmp = b1 ^ b0; b1 = (tmp >> 58) | (tmp << (64 - 58)); b0 -= b1;
194     tmp = b3 ^ b2; b3 = (tmp >> 22) | (tmp << (64 - 22)); b2 -= b3;
195     tmp = b3 ^ b0; b3 = (tmp >> 46) | (tmp << (64 - 46)); b0 -= b3;
196     tmp = b1 ^ b2; b1 = (tmp >> 12) | (tmp << (64 - 12)); b2 -= b1;
197     tmp = b1 ^ b0; b1 = (tmp >> 25) | (tmp << (64 - 25)); b0 -= b1 + k2; b1 -= k3 + t2;
198     tmp = b3 ^ b2; b3 = (tmp >> 33) | (tmp << (64 - 33)); b2 -= b3 + k4 + t0; b3 -= k0 + 17;
199     tmp = b3 ^ b0; b3 = (tmp >> 5) | (tmp << (64 - 5)); b0 -= b3;
200     tmp = b1 ^ b2; b1 = (tmp >> 37) | (tmp << (64 - 37)); b2 -= b1;
201     tmp = b1 ^ b0; b1 = (tmp >> 23) | (tmp << (64 - 23)); b0 -= b1;
202     tmp = b3 ^ b2; b3 = (tmp >> 40) | (tmp << (64 - 40)); b2 -= b3;
203     tmp = b3 ^ b0; b3 = (tmp >> 52) | (tmp << (64 - 52)); b0 -= b3;
204     tmp = b1 ^ b2; b1 = (tmp >> 57) | (tmp << (64 - 57)); b2 -= b1;
205     tmp = b1 ^ b0; b1 = (tmp >> 14) | (tmp << (64 - 14)); b0 -= b1 + k1; b1 -= k2 + t1;
206     tmp = b3 ^ b2; b3 = (tmp >> 16) | (tmp << (64 - 16)); b2 -= b3 + k3 + t2; b3 -= k4 + 16;
207
208     tmp = b3 ^ b0; b3 = (tmp >> 32) | (tmp << (64 - 32)); b0 -= b3;
209     tmp = b1 ^ b2; b1 = (tmp >> 32) | (tmp << (64 - 32)); b2 -= b1;
210     tmp = b1 ^ b0; b1 = (tmp >> 58) | (tmp << (64 - 58)); b0 -= b1;
211     tmp = b3 ^ b2; b3 = (tmp >> 22) | (tmp << (64 - 22)); b2 -= b3;
212     tmp = b3 ^ b0; b3 = (tmp >> 46) | (tmp << (64 - 46)); b0 -= b3;
213     tmp = b1 ^ b2; b1 = (tmp >> 12) | (tmp << (64 - 12)); b2 -= b1;
214     tmp = b1 ^ b0; b1 = (tmp >> 25) | (tmp << (64 - 25)); b0 -= b1 + k0; b1 -= k1 + t0;
215     tmp = b3 ^ b2; b3 = (tmp >> 33) | (tmp << (64 - 33)); b2 -= b3 + k2 + t1; b3 -= k3 + 15;
216     tmp = b3 ^ b0; b3 = (tmp >> 5) | (tmp << (64 - 5)); b0 -= b3;
217     tmp = b1 ^ b2; b1 = (tmp >> 37) | (tmp << (64 - 37)); b2 -= b1;
218     tmp = b1 ^ b0; b1 = (tmp >> 23) | (tmp << (64 - 23)); b0 -= b1;
219     tmp = b3 ^ b2; b3 = (tmp >> 40) | (tmp << (64 - 40)); b2 -= b3;
220     tmp = b3 ^ b0; b3 = (tmp >> 52) | (tmp << (64 - 52)); b0 -= b3;
221     tmp = b1 ^ b2; b1 = (tmp >> 57) | (tmp << (64 - 57)); b2 -= b1;
222     tmp = b1 ^ b0; b1 = (tmp >> 14) | (tmp << (64 - 14)); b0 -= b1 + k4; b1 -= k0 + t2;
223     tmp = b3 ^ b2; b3 = (tmp >> 16) | (tmp << (64 - 16)); b2 -= b3 + k1 + t0; b3 -= k2 + 14;
224
225     tmp = b3 ^ b0; b3 = (tmp >> 32) | (tmp << (64 - 32)); b0 -= b3;
226     tmp = b1 ^ b2; b1 = (tmp >> 32) | (tmp << (64 - 32)); b2 -= b1;
227     tmp = b1 ^ b0; b1 = (tmp >> 58) | (tmp << (64 - 58)); b0 -= b1;
228     tmp = b3 ^ b2; b3 = (tmp >> 22) | (tmp << (64 - 22)); b2 -= b3;
229     tmp = b3 ^ b0; b3 = (tmp >> 46) | (tmp << (64 - 46)); b0 -= b3;
230     tmp = b1 ^ b2; b1 = (tmp >> 12) | (tmp << (64 - 12)); b2 -= b1;
231     tmp = b1 ^ b0; b1 = (tmp >> 25) | (tmp << (64 - 25)); b0 -= b1 + k3; b1 -= k4 + t1;
232     tmp = b3 ^ b2; b3 = (tmp >> 33) | (tmp << (64 - 33)); b2 -= b3 + k0 + t2; b3 -= k1 + 13;
233     tmp = b3 ^ b0; b3 = (tmp >> 5) | (tmp << (64 - 5)); b0 -= b3;
234     tmp = b1 ^ b2; b1 = (tmp >> 37) | (tmp << (64 - 37)); b2 -= b1;
235     tmp = b1 ^ b0; b1 = (tmp >> 23) | (tmp << (64 - 23)); b0 -= b1;
236     tmp = b3 ^ b2; b3 = (tmp >> 40) | (tmp << (64 - 40)); b2 -= b3;
237     tmp = b3 ^ b0; b3 = (tmp >> 52) | (tmp << (64 - 52)); b0 -= b3;
238     tmp = b1 ^ b2; b1 = (tmp >> 57) | (tmp << (64 - 57)); b2 -= b1;
239     tmp = b1 ^ b0; b1 = (tmp >> 14) | (tmp << (64 - 14)); b0 -= b1 + k2; b1 -= k3 + t0;
240     tmp = b3 ^ b2; b3 = (tmp >> 16) | (tmp << (64 - 16)); b2 -= b3 + k4 + t1; b3 -= k0 + 12;
241
242     tmp = b3 ^ b0; b3 = (tmp >> 32) | (tmp << (64 - 32)); b0 -= b3;
243     tmp = b1 ^ b2; b1 = (tmp >> 32) | (tmp << (64 - 32)); b2 -= b1;
244     tmp = b1 ^ b0; b1 = (tmp >> 58) | (tmp << (64 - 58)); b0 -= b1;
245     tmp = b3 ^ b2; b3 = (tmp >> 22) | (tmp << (64 - 22)); b2 -= b3;
246     tmp = b3 ^ b0; b3 = (tmp >> 46) | (tmp << (64 - 46)); b0 -= b3;
247     tmp = b1 ^ b2; b1 = (tmp >> 12) | (tmp << (64 - 12)); b2 -= b1;
248     tmp = b1 ^ b0; b1 = (tmp >> 25) | (tmp << (64 - 25)); b0 -= b1 + k1; b1 -= k2 + t2;
249     tmp = b3 ^ b2; b3 = (tmp >> 33) | (tmp << (64 - 33)); b2 -= b3 + k3 + t0; b3 -= k4 + 11;
250     tmp = b3 ^ b0; b3 = (tmp >> 5) | (tmp << (64 - 5)); b0 -= b3;
251     tmp = b1 ^ b2; b1 = (tmp >> 37) | (tmp << (64 - 37)); b2 -= b1;
252     tmp = b1 ^ b0; b1 = (tmp >> 23) | (tmp << (64 - 23)); b0 -= b1;
253     tmp = b3 ^ b2; b3 = (tmp >> 40) | (tmp << (64 - 40)); b2 -= b3;
254     tmp = b3 ^ b0; b3 = (tmp >> 52) | (tmp << (64 - 52)); b0 -= b3;
255     tmp = b1 ^ b2; b1 = (tmp >> 57) | (tmp << (64 - 57)); b2 -= b1;
256     tmp = b1 ^ b0; b1 = (tmp >> 14) | (tmp << (64 - 14)); b0 -= b1 + k0; b1 -= k1 + t1;
257     tmp = b3 ^ b2; b3 = (tmp >> 16) | (tmp << (64 - 16)); b2 -= b3 + k2 + t2; b3 -= k3 + 10;
258
259     tmp = b3 ^ b0; b3 = (tmp >> 32) | (tmp << (64 - 32)); b0 -= b3;
260     tmp = b1 ^ b2; b1 = (tmp >> 32) | (tmp << (64 - 32)); b2 -= b1;
261     tmp = b1 ^ b0; b1 = (tmp >> 58) | (tmp << (64 - 58)); b0 -= b1;
262     tmp = b3 ^ b2; b3 = (tmp >> 22) | (tmp << (64 - 22)); b2 -= b3;
263     tmp = b3 ^ b0; b3 = (tmp >> 46) | (tmp << (64 - 46)); b0 -= b3;
264     tmp = b1 ^ b2; b1 = (tmp >> 12) | (tmp << (64 - 12)); b2 -= b1;
265     tmp = b1 ^ b0; b1 = (tmp >> 25) | (tmp << (64 - 25)); b0 -= b1 + k4; b1 -= k0 + t0;
266     tmp = b3 ^ b2; b3 = (tmp >> 33) | (tmp << (64 - 33)); b2 -= b3 + k1 + t1; b3 -= k2 + 9;
267     tmp = b3 ^ b0; b3 = (tmp >> 5) | (tmp << (64 - 5)); b0 -= b3;
268     tmp = b1 ^ b2; b1 = (tmp >> 37) | (tmp << (64 - 37)); b2 -= b1;
269     tmp = b1 ^ b0; b1 = (tmp >> 23) | (tmp << (64 - 23)); b0 -= b1;
270     tmp = b3 ^ b2; b3 = (tmp >> 40) | (tmp << (64 - 40)); b2 -= b3;
271     tmp = b3 ^ b0; b3 = (tmp >> 52) | (tmp << (64 - 52)); b0 -= b3;
272     tmp = b1 ^ b2; b1 = (tmp >> 57) | (tmp << (64 - 57)); b2 -= b1;
273     tmp = b1 ^ b0; b1 = (tmp >> 14) | (tmp << (64 - 14)); b0 -= b1 + k3; b1 -= k4 + t2;
274     tmp = b3 ^ b2; b3 = (tmp >> 16) | (tmp << (64 - 16)); b2 -= b3 + k0 + t0; b3 -= k1 + 8;
275
276     tmp = b3 ^ b0; b3 = (tmp >> 32) | (tmp << (64 - 32)); b0 -= b3;
277     tmp = b1 ^ b2; b1 = (tmp >> 32) | (tmp << (64 - 32)); b2 -= b1;
278     tmp = b1 ^ b0; b1 = (tmp >> 58) | (tmp << (64 - 58)); b0 -= b1;
279     tmp = b3 ^ b2; b3 = (tmp >> 22) | (tmp << (64 - 22)); b2 -= b3;
280     tmp = b3 ^ b0; b3 = (tmp >> 46) | (tmp << (64 - 46)); b0 -= b3;
281     tmp = b1 ^ b2; b1 = (tmp >> 12) | (tmp << (64 - 12)); b2 -= b1;
282     tmp = b1 ^ b0; b1 = (tmp >> 25) | (tmp << (64 - 25)); b0 -= b1 + k2; b1 -= k3 + t1;
283     tmp = b3 ^ b2; b3 = (tmp >> 33) | (tmp << (64 - 33)); b2 -= b3 + k4 + t2; b3 -= k0 + 7;
284     tmp = b3 ^ b0; b3 = (tmp >> 5) | (tmp << (64 - 5)); b0 -= b3;
285     tmp = b1 ^ b2; b1 = (tmp >> 37) | (tmp << (64 - 37)); b2 -= b1;
286     tmp = b1 ^ b0; b1 = (tmp >> 23) | (tmp << (64 - 23)); b0 -= b1;
287     tmp = b3 ^ b2; b3 = (tmp >> 40) | (tmp << (64 - 40)); b2 -= b3;
288     tmp = b3 ^ b0; b3 = (tmp >> 52) | (tmp << (64 - 52)); b0 -= b3;
289     tmp = b1 ^ b2; b1 = (tmp >> 57) | (tmp << (64 - 57)); b2 -= b1;
290     tmp = b1 ^ b0; b1 = (tmp >> 14) | (tmp << (64 - 14)); b0 -= b1 + k1; b1 -= k2 + t0;
291     tmp = b3 ^ b2; b3 = (tmp >> 16) | (tmp << (64 - 16)); b2 -= b3 + k3 + t1; b3 -= k4 + 6;
292
293     tmp = b3 ^ b0; b3 = (tmp >> 32) | (tmp << (64 - 32)); b0 -= b3;
294     tmp = b1 ^ b2; b1 = (tmp >> 32) | (tmp << (64 - 32)); b2 -= b1;
295     tmp = b1 ^ b0; b1 = (tmp >> 58) | (tmp << (64 - 58)); b0 -= b1;
296     tmp = b3 ^ b2; b3 = (tmp >> 22) | (tmp << (64 - 22)); b2 -= b3;
297     tmp = b3 ^ b0; b3 = (tmp >> 46) | (tmp << (64 - 46)); b0 -= b3;
298     tmp = b1 ^ b2; b1 = (tmp >> 12) | (tmp << (64 - 12)); b2 -= b1;
299     tmp = b1 ^ b0; b1 = (tmp >> 25) | (tmp << (64 - 25)); b0 -= b1 + k0; b1 -= k1 + t2;
300     tmp = b3 ^ b2; b3 = (tmp >> 33) | (tmp << (64 - 33)); b2 -= b3 + k2 + t0; b3 -= k3 + 5;
301     tmp = b3 ^ b0; b3 = (tmp >> 5) | (tmp << (64 - 5)); b0 -= b3;
302     tmp = b1 ^ b2; b1 = (tmp >> 37) | (tmp << (64 - 37)); b2 -= b1;
303     tmp = b1 ^ b0; b1 = (tmp >> 23) | (tmp << (64 - 23)); b0 -= b1;
304     tmp = b3 ^ b2; b3 = (tmp >> 40) | (tmp << (64 - 40)); b2 -= b3;
305     tmp = b3 ^ b0; b3 = (tmp >> 52) | (tmp << (64 - 52)); b0 -= b3;
306     tmp = b1 ^ b2; b1 = (tmp >> 57) | (tmp << (64 - 57)); b2 -= b1;
307     tmp = b1 ^ b0; b1 = (tmp >> 14) | (tmp << (64 - 14)); b0 -= b1 + k4; b1 -= k0 + t1;
308     tmp = b3 ^ b2; b3 = (tmp >> 16) | (tmp << (64 - 16)); b2 -= b3 + k1 + t2; b3 -= k2 + 4;
309
310     tmp = b3 ^ b0; b3 = (tmp >> 32) | (tmp << (64 - 32)); b0 -= b3;
311     tmp = b1 ^ b2; b1 = (tmp >> 32) | (tmp << (64 - 32)); b2 -= b1;
312     tmp = b1 ^ b0; b1 = (tmp >> 58) | (tmp << (64 - 58)); b0 -= b1;
313     tmp = b3 ^ b2; b3 = (tmp >> 22) | (tmp << (64 - 22)); b2 -= b3;
314     tmp = b3 ^ b0; b3 = (tmp >> 46) | (tmp << (64 - 46)); b0 -= b3;
315     tmp = b1 ^ b2; b1 = (tmp >> 12) | (tmp << (64 - 12)); b2 -= b1;
316     tmp = b1 ^ b0; b1 = (tmp >> 25) | (tmp << (64 - 25)); b0 -= b1 + k3; b1 -= k4 + t0;
317     tmp = b3 ^ b2; b3 = (tmp >> 33) | (tmp << (64 - 33)); b2 -= b3 + k0 + t1; b3 -= k1 + 3;
318     tmp = b3 ^ b0; b3 = (tmp >> 5) | (tmp << (64 - 5)); b0 -= b3;
319     tmp = b1 ^ b2; b1 = (tmp >> 37) | (tmp << (64 - 37)); b2 -= b1;
320     tmp = b1 ^ b0; b1 = (tmp >> 23) | (tmp << (64 - 23)); b0 -= b1;
321     tmp = b3 ^ b2; b3 = (tmp >> 40) | (tmp << (64 - 40)); b2 -= b3;
322     tmp = b3 ^ b0; b3 = (tmp >> 52) | (tmp << (64 - 52)); b0 -= b3;
323     tmp = b1 ^ b2; b1 = (tmp >> 57) | (tmp << (64 - 57)); b2 -= b1;
324     tmp = b1 ^ b0; b1 = (tmp >> 14) | (tmp << (64 - 14)); b0 -= b1 + k2; b1 -= k3 + t2;
325     tmp = b3 ^ b2; b3 = (tmp >> 16) | (tmp << (64 - 16)); b2 -= b3 + k4 + t0; b3 -= k0 + 2;
326
327     tmp = b3 ^ b0; b3 = (tmp >> 32) | (tmp << (64 - 32)); b0 -= b3;
328     tmp = b1 ^ b2; b1 = (tmp >> 32) | (tmp << (64 - 32)); b2 -= b1;
329     tmp = b1 ^ b0; b1 = (tmp >> 58) | (tmp << (64 - 58)); b0 -= b1;
330     tmp = b3 ^ b2; b3 = (tmp >> 22) | (tmp << (64 - 22)); b2 -= b3;
331     tmp = b3 ^ b0; b3 = (tmp >> 46) | (tmp << (64 - 46)); b0 -= b3;
332     tmp = b1 ^ b2; b1 = (tmp >> 12) | (tmp << (64 - 12)); b2 -= b1;
333     tmp = b1 ^ b0; b1 = (tmp >> 25) | (tmp << (64 - 25)); b0 -= b1 + k1; b1 -= k2 + t1;
334     tmp = b3 ^ b2; b3 = (tmp >> 33) | (tmp << (64 - 33)); b2 -= b3 + k3 + t2; b3 -= k4 + 1;
335     tmp = b3 ^ b0; b3 = (tmp >> 5) | (tmp << (64 - 5)); b0 -= b3;
336     tmp = b1 ^ b2; b1 = (tmp >> 37) | (tmp << (64 - 37)); b2 -= b1;
337     tmp = b1 ^ b0; b1 = (tmp >> 23) | (tmp << (64 - 23)); b0 -= b1;
338     tmp = b3 ^ b2; b3 = (tmp >> 40) | (tmp << (64 - 40)); b2 -= b3;
339     tmp = b3 ^ b0; b3 = (tmp >> 52) | (tmp << (64 - 52)); b0 -= b3;
340     tmp = b1 ^ b2; b1 = (tmp >> 57) | (tmp << (64 - 57)); b2 -= b1;
341     tmp = b1 ^ b0; b1 = (tmp >> 14) | (tmp << (64 - 14)); b0 -= b1 + k0; b1 -= k1 + t0;
342     tmp = b3 ^ b2; b3 = (tmp >> 16) | (tmp << (64 - 16)); b2 -= b3 + k2 + t1; b3 -= k3;
343
344     output[0] = b0;
345     output[1] = b1;
346     output[2] = b2;
347     output[3] = b3;
348   }