xref: /freebsd/contrib/bearssl/src/kdf/shake.c (revision 2aaf9152a852aba9eb2036b95f4948ee77988826)
1*0957b409SSimon J. Gerraty /*
2*0957b409SSimon J. Gerraty  * Copyright (c) 2018 Thomas Pornin <pornin@bolet.org>
3*0957b409SSimon J. Gerraty  *
4*0957b409SSimon J. Gerraty  * Permission is hereby granted, free of charge, to any person obtaining
5*0957b409SSimon J. Gerraty  * a copy of this software and associated documentation files (the
6*0957b409SSimon J. Gerraty  * "Software"), to deal in the Software without restriction, including
7*0957b409SSimon J. Gerraty  * without limitation the rights to use, copy, modify, merge, publish,
8*0957b409SSimon J. Gerraty  * distribute, sublicense, and/or sell copies of the Software, and to
9*0957b409SSimon J. Gerraty  * permit persons to whom the Software is furnished to do so, subject to
10*0957b409SSimon J. Gerraty  * the following conditions:
11*0957b409SSimon J. Gerraty  *
12*0957b409SSimon J. Gerraty  * The above copyright notice and this permission notice shall be
13*0957b409SSimon J. Gerraty  * included in all copies or substantial portions of the Software.
14*0957b409SSimon J. Gerraty  *
15*0957b409SSimon J. Gerraty  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*0957b409SSimon J. Gerraty  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*0957b409SSimon J. Gerraty  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18*0957b409SSimon J. Gerraty  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19*0957b409SSimon J. Gerraty  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20*0957b409SSimon J. Gerraty  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21*0957b409SSimon J. Gerraty  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*0957b409SSimon J. Gerraty  * SOFTWARE.
23*0957b409SSimon J. Gerraty  */
24*0957b409SSimon J. Gerraty 
25*0957b409SSimon J. Gerraty #include "inner.h"
26*0957b409SSimon J. Gerraty 
27*0957b409SSimon J. Gerraty /*
28*0957b409SSimon J. Gerraty  * Round constants.
29*0957b409SSimon J. Gerraty  */
30*0957b409SSimon J. Gerraty static const uint64_t RC[] = {
31*0957b409SSimon J. Gerraty 	0x0000000000000001, 0x0000000000008082,
32*0957b409SSimon J. Gerraty 	0x800000000000808A, 0x8000000080008000,
33*0957b409SSimon J. Gerraty 	0x000000000000808B, 0x0000000080000001,
34*0957b409SSimon J. Gerraty 	0x8000000080008081, 0x8000000000008009,
35*0957b409SSimon J. Gerraty 	0x000000000000008A, 0x0000000000000088,
36*0957b409SSimon J. Gerraty 	0x0000000080008009, 0x000000008000000A,
37*0957b409SSimon J. Gerraty 	0x000000008000808B, 0x800000000000008B,
38*0957b409SSimon J. Gerraty 	0x8000000000008089, 0x8000000000008003,
39*0957b409SSimon J. Gerraty 	0x8000000000008002, 0x8000000000000080,
40*0957b409SSimon J. Gerraty 	0x000000000000800A, 0x800000008000000A,
41*0957b409SSimon J. Gerraty 	0x8000000080008081, 0x8000000000008080,
42*0957b409SSimon J. Gerraty 	0x0000000080000001, 0x8000000080008008
43*0957b409SSimon J. Gerraty };
44*0957b409SSimon J. Gerraty 
45*0957b409SSimon J. Gerraty /*
46*0957b409SSimon J. Gerraty  * XOR a block of data into the provided state. This supports only
47*0957b409SSimon J. Gerraty  * blocks whose length is a multiple of 64 bits.
48*0957b409SSimon J. Gerraty  */
49*0957b409SSimon J. Gerraty static void
xor_block(uint64_t * A,const void * data,size_t rate)50*0957b409SSimon J. Gerraty xor_block(uint64_t *A, const void *data, size_t rate)
51*0957b409SSimon J. Gerraty {
52*0957b409SSimon J. Gerraty 	size_t u;
53*0957b409SSimon J. Gerraty 
54*0957b409SSimon J. Gerraty 	for (u = 0; u < rate; u += 8) {
55*0957b409SSimon J. Gerraty 		A[u >> 3] ^= br_dec64le((const unsigned char *)data + u);
56*0957b409SSimon J. Gerraty 	}
57*0957b409SSimon J. Gerraty }
58*0957b409SSimon J. Gerraty 
59*0957b409SSimon J. Gerraty /*
60*0957b409SSimon J. Gerraty  * Process a block with the provided data. The data length must be a
61*0957b409SSimon J. Gerraty  * multiple of 8 (in bytes); normally, this is the "rate".
62*0957b409SSimon J. Gerraty  */
63*0957b409SSimon J. Gerraty static void
process_block(uint64_t * A)64*0957b409SSimon J. Gerraty process_block(uint64_t *A)
65*0957b409SSimon J. Gerraty {
66*0957b409SSimon J. Gerraty 	uint64_t t0, t1, t2, t3, t4;
67*0957b409SSimon J. Gerraty 	uint64_t tt0, tt1, tt2, tt3;
68*0957b409SSimon J. Gerraty 	uint64_t t, kt;
69*0957b409SSimon J. Gerraty 	uint64_t c0, c1, c2, c3, c4, bnn;
70*0957b409SSimon J. Gerraty 	int j;
71*0957b409SSimon J. Gerraty 
72*0957b409SSimon J. Gerraty 	/*
73*0957b409SSimon J. Gerraty 	 * Compute the 24 rounds. This loop is partially unrolled (each
74*0957b409SSimon J. Gerraty 	 * iteration computes two rounds).
75*0957b409SSimon J. Gerraty 	 */
76*0957b409SSimon J. Gerraty 	for (j = 0; j < 24; j += 2) {
77*0957b409SSimon J. Gerraty 
78*0957b409SSimon J. Gerraty 		tt0 = A[ 1] ^ A[ 6];
79*0957b409SSimon J. Gerraty 		tt1 = A[11] ^ A[16];
80*0957b409SSimon J. Gerraty 		tt0 ^= A[21] ^ tt1;
81*0957b409SSimon J. Gerraty 		tt0 = (tt0 << 1) | (tt0 >> 63);
82*0957b409SSimon J. Gerraty 		tt2 = A[ 4] ^ A[ 9];
83*0957b409SSimon J. Gerraty 		tt3 = A[14] ^ A[19];
84*0957b409SSimon J. Gerraty 		tt0 ^= A[24];
85*0957b409SSimon J. Gerraty 		tt2 ^= tt3;
86*0957b409SSimon J. Gerraty 		t0 = tt0 ^ tt2;
87*0957b409SSimon J. Gerraty 
88*0957b409SSimon J. Gerraty 		tt0 = A[ 2] ^ A[ 7];
89*0957b409SSimon J. Gerraty 		tt1 = A[12] ^ A[17];
90*0957b409SSimon J. Gerraty 		tt0 ^= A[22] ^ tt1;
91*0957b409SSimon J. Gerraty 		tt0 = (tt0 << 1) | (tt0 >> 63);
92*0957b409SSimon J. Gerraty 		tt2 = A[ 0] ^ A[ 5];
93*0957b409SSimon J. Gerraty 		tt3 = A[10] ^ A[15];
94*0957b409SSimon J. Gerraty 		tt0 ^= A[20];
95*0957b409SSimon J. Gerraty 		tt2 ^= tt3;
96*0957b409SSimon J. Gerraty 		t1 = tt0 ^ tt2;
97*0957b409SSimon J. Gerraty 
98*0957b409SSimon J. Gerraty 		tt0 = A[ 3] ^ A[ 8];
99*0957b409SSimon J. Gerraty 		tt1 = A[13] ^ A[18];
100*0957b409SSimon J. Gerraty 		tt0 ^= A[23] ^ tt1;
101*0957b409SSimon J. Gerraty 		tt0 = (tt0 << 1) | (tt0 >> 63);
102*0957b409SSimon J. Gerraty 		tt2 = A[ 1] ^ A[ 6];
103*0957b409SSimon J. Gerraty 		tt3 = A[11] ^ A[16];
104*0957b409SSimon J. Gerraty 		tt0 ^= A[21];
105*0957b409SSimon J. Gerraty 		tt2 ^= tt3;
106*0957b409SSimon J. Gerraty 		t2 = tt0 ^ tt2;
107*0957b409SSimon J. Gerraty 
108*0957b409SSimon J. Gerraty 		tt0 = A[ 4] ^ A[ 9];
109*0957b409SSimon J. Gerraty 		tt1 = A[14] ^ A[19];
110*0957b409SSimon J. Gerraty 		tt0 ^= A[24] ^ tt1;
111*0957b409SSimon J. Gerraty 		tt0 = (tt0 << 1) | (tt0 >> 63);
112*0957b409SSimon J. Gerraty 		tt2 = A[ 2] ^ A[ 7];
113*0957b409SSimon J. Gerraty 		tt3 = A[12] ^ A[17];
114*0957b409SSimon J. Gerraty 		tt0 ^= A[22];
115*0957b409SSimon J. Gerraty 		tt2 ^= tt3;
116*0957b409SSimon J. Gerraty 		t3 = tt0 ^ tt2;
117*0957b409SSimon J. Gerraty 
118*0957b409SSimon J. Gerraty 		tt0 = A[ 0] ^ A[ 5];
119*0957b409SSimon J. Gerraty 		tt1 = A[10] ^ A[15];
120*0957b409SSimon J. Gerraty 		tt0 ^= A[20] ^ tt1;
121*0957b409SSimon J. Gerraty 		tt0 = (tt0 << 1) | (tt0 >> 63);
122*0957b409SSimon J. Gerraty 		tt2 = A[ 3] ^ A[ 8];
123*0957b409SSimon J. Gerraty 		tt3 = A[13] ^ A[18];
124*0957b409SSimon J. Gerraty 		tt0 ^= A[23];
125*0957b409SSimon J. Gerraty 		tt2 ^= tt3;
126*0957b409SSimon J. Gerraty 		t4 = tt0 ^ tt2;
127*0957b409SSimon J. Gerraty 
128*0957b409SSimon J. Gerraty 		A[ 0] = A[ 0] ^ t0;
129*0957b409SSimon J. Gerraty 		A[ 5] = A[ 5] ^ t0;
130*0957b409SSimon J. Gerraty 		A[10] = A[10] ^ t0;
131*0957b409SSimon J. Gerraty 		A[15] = A[15] ^ t0;
132*0957b409SSimon J. Gerraty 		A[20] = A[20] ^ t0;
133*0957b409SSimon J. Gerraty 		A[ 1] = A[ 1] ^ t1;
134*0957b409SSimon J. Gerraty 		A[ 6] = A[ 6] ^ t1;
135*0957b409SSimon J. Gerraty 		A[11] = A[11] ^ t1;
136*0957b409SSimon J. Gerraty 		A[16] = A[16] ^ t1;
137*0957b409SSimon J. Gerraty 		A[21] = A[21] ^ t1;
138*0957b409SSimon J. Gerraty 		A[ 2] = A[ 2] ^ t2;
139*0957b409SSimon J. Gerraty 		A[ 7] = A[ 7] ^ t2;
140*0957b409SSimon J. Gerraty 		A[12] = A[12] ^ t2;
141*0957b409SSimon J. Gerraty 		A[17] = A[17] ^ t2;
142*0957b409SSimon J. Gerraty 		A[22] = A[22] ^ t2;
143*0957b409SSimon J. Gerraty 		A[ 3] = A[ 3] ^ t3;
144*0957b409SSimon J. Gerraty 		A[ 8] = A[ 8] ^ t3;
145*0957b409SSimon J. Gerraty 		A[13] = A[13] ^ t3;
146*0957b409SSimon J. Gerraty 		A[18] = A[18] ^ t3;
147*0957b409SSimon J. Gerraty 		A[23] = A[23] ^ t3;
148*0957b409SSimon J. Gerraty 		A[ 4] = A[ 4] ^ t4;
149*0957b409SSimon J. Gerraty 		A[ 9] = A[ 9] ^ t4;
150*0957b409SSimon J. Gerraty 		A[14] = A[14] ^ t4;
151*0957b409SSimon J. Gerraty 		A[19] = A[19] ^ t4;
152*0957b409SSimon J. Gerraty 		A[24] = A[24] ^ t4;
153*0957b409SSimon J. Gerraty 		A[ 5] = (A[ 5] << 36) | (A[ 5] >> (64 - 36));
154*0957b409SSimon J. Gerraty 		A[10] = (A[10] <<  3) | (A[10] >> (64 -  3));
155*0957b409SSimon J. Gerraty 		A[15] = (A[15] << 41) | (A[15] >> (64 - 41));
156*0957b409SSimon J. Gerraty 		A[20] = (A[20] << 18) | (A[20] >> (64 - 18));
157*0957b409SSimon J. Gerraty 		A[ 1] = (A[ 1] <<  1) | (A[ 1] >> (64 -  1));
158*0957b409SSimon J. Gerraty 		A[ 6] = (A[ 6] << 44) | (A[ 6] >> (64 - 44));
159*0957b409SSimon J. Gerraty 		A[11] = (A[11] << 10) | (A[11] >> (64 - 10));
160*0957b409SSimon J. Gerraty 		A[16] = (A[16] << 45) | (A[16] >> (64 - 45));
161*0957b409SSimon J. Gerraty 		A[21] = (A[21] <<  2) | (A[21] >> (64 - 2));
162*0957b409SSimon J. Gerraty 		A[ 2] = (A[ 2] << 62) | (A[ 2] >> (64 - 62));
163*0957b409SSimon J. Gerraty 		A[ 7] = (A[ 7] <<  6) | (A[ 7] >> (64 -  6));
164*0957b409SSimon J. Gerraty 		A[12] = (A[12] << 43) | (A[12] >> (64 - 43));
165*0957b409SSimon J. Gerraty 		A[17] = (A[17] << 15) | (A[17] >> (64 - 15));
166*0957b409SSimon J. Gerraty 		A[22] = (A[22] << 61) | (A[22] >> (64 - 61));
167*0957b409SSimon J. Gerraty 		A[ 3] = (A[ 3] << 28) | (A[ 3] >> (64 - 28));
168*0957b409SSimon J. Gerraty 		A[ 8] = (A[ 8] << 55) | (A[ 8] >> (64 - 55));
169*0957b409SSimon J. Gerraty 		A[13] = (A[13] << 25) | (A[13] >> (64 - 25));
170*0957b409SSimon J. Gerraty 		A[18] = (A[18] << 21) | (A[18] >> (64 - 21));
171*0957b409SSimon J. Gerraty 		A[23] = (A[23] << 56) | (A[23] >> (64 - 56));
172*0957b409SSimon J. Gerraty 		A[ 4] = (A[ 4] << 27) | (A[ 4] >> (64 - 27));
173*0957b409SSimon J. Gerraty 		A[ 9] = (A[ 9] << 20) | (A[ 9] >> (64 - 20));
174*0957b409SSimon J. Gerraty 		A[14] = (A[14] << 39) | (A[14] >> (64 - 39));
175*0957b409SSimon J. Gerraty 		A[19] = (A[19] <<  8) | (A[19] >> (64 -  8));
176*0957b409SSimon J. Gerraty 		A[24] = (A[24] << 14) | (A[24] >> (64 - 14));
177*0957b409SSimon J. Gerraty 		bnn = ~A[12];
178*0957b409SSimon J. Gerraty 		kt = A[ 6] | A[12];
179*0957b409SSimon J. Gerraty 		c0 = A[ 0] ^ kt;
180*0957b409SSimon J. Gerraty 		kt = bnn | A[18];
181*0957b409SSimon J. Gerraty 		c1 = A[ 6] ^ kt;
182*0957b409SSimon J. Gerraty 		kt = A[18] & A[24];
183*0957b409SSimon J. Gerraty 		c2 = A[12] ^ kt;
184*0957b409SSimon J. Gerraty 		kt = A[24] | A[ 0];
185*0957b409SSimon J. Gerraty 		c3 = A[18] ^ kt;
186*0957b409SSimon J. Gerraty 		kt = A[ 0] & A[ 6];
187*0957b409SSimon J. Gerraty 		c4 = A[24] ^ kt;
188*0957b409SSimon J. Gerraty 		A[ 0] = c0;
189*0957b409SSimon J. Gerraty 		A[ 6] = c1;
190*0957b409SSimon J. Gerraty 		A[12] = c2;
191*0957b409SSimon J. Gerraty 		A[18] = c3;
192*0957b409SSimon J. Gerraty 		A[24] = c4;
193*0957b409SSimon J. Gerraty 		bnn = ~A[22];
194*0957b409SSimon J. Gerraty 		kt = A[ 9] | A[10];
195*0957b409SSimon J. Gerraty 		c0 = A[ 3] ^ kt;
196*0957b409SSimon J. Gerraty 		kt = A[10] & A[16];
197*0957b409SSimon J. Gerraty 		c1 = A[ 9] ^ kt;
198*0957b409SSimon J. Gerraty 		kt = A[16] | bnn;
199*0957b409SSimon J. Gerraty 		c2 = A[10] ^ kt;
200*0957b409SSimon J. Gerraty 		kt = A[22] | A[ 3];
201*0957b409SSimon J. Gerraty 		c3 = A[16] ^ kt;
202*0957b409SSimon J. Gerraty 		kt = A[ 3] & A[ 9];
203*0957b409SSimon J. Gerraty 		c4 = A[22] ^ kt;
204*0957b409SSimon J. Gerraty 		A[ 3] = c0;
205*0957b409SSimon J. Gerraty 		A[ 9] = c1;
206*0957b409SSimon J. Gerraty 		A[10] = c2;
207*0957b409SSimon J. Gerraty 		A[16] = c3;
208*0957b409SSimon J. Gerraty 		A[22] = c4;
209*0957b409SSimon J. Gerraty 		bnn = ~A[19];
210*0957b409SSimon J. Gerraty 		kt = A[ 7] | A[13];
211*0957b409SSimon J. Gerraty 		c0 = A[ 1] ^ kt;
212*0957b409SSimon J. Gerraty 		kt = A[13] & A[19];
213*0957b409SSimon J. Gerraty 		c1 = A[ 7] ^ kt;
214*0957b409SSimon J. Gerraty 		kt = bnn & A[20];
215*0957b409SSimon J. Gerraty 		c2 = A[13] ^ kt;
216*0957b409SSimon J. Gerraty 		kt = A[20] | A[ 1];
217*0957b409SSimon J. Gerraty 		c3 = bnn ^ kt;
218*0957b409SSimon J. Gerraty 		kt = A[ 1] & A[ 7];
219*0957b409SSimon J. Gerraty 		c4 = A[20] ^ kt;
220*0957b409SSimon J. Gerraty 		A[ 1] = c0;
221*0957b409SSimon J. Gerraty 		A[ 7] = c1;
222*0957b409SSimon J. Gerraty 		A[13] = c2;
223*0957b409SSimon J. Gerraty 		A[19] = c3;
224*0957b409SSimon J. Gerraty 		A[20] = c4;
225*0957b409SSimon J. Gerraty 		bnn = ~A[17];
226*0957b409SSimon J. Gerraty 		kt = A[ 5] & A[11];
227*0957b409SSimon J. Gerraty 		c0 = A[ 4] ^ kt;
228*0957b409SSimon J. Gerraty 		kt = A[11] | A[17];
229*0957b409SSimon J. Gerraty 		c1 = A[ 5] ^ kt;
230*0957b409SSimon J. Gerraty 		kt = bnn | A[23];
231*0957b409SSimon J. Gerraty 		c2 = A[11] ^ kt;
232*0957b409SSimon J. Gerraty 		kt = A[23] & A[ 4];
233*0957b409SSimon J. Gerraty 		c3 = bnn ^ kt;
234*0957b409SSimon J. Gerraty 		kt = A[ 4] | A[ 5];
235*0957b409SSimon J. Gerraty 		c4 = A[23] ^ kt;
236*0957b409SSimon J. Gerraty 		A[ 4] = c0;
237*0957b409SSimon J. Gerraty 		A[ 5] = c1;
238*0957b409SSimon J. Gerraty 		A[11] = c2;
239*0957b409SSimon J. Gerraty 		A[17] = c3;
240*0957b409SSimon J. Gerraty 		A[23] = c4;
241*0957b409SSimon J. Gerraty 		bnn = ~A[ 8];
242*0957b409SSimon J. Gerraty 		kt = bnn & A[14];
243*0957b409SSimon J. Gerraty 		c0 = A[ 2] ^ kt;
244*0957b409SSimon J. Gerraty 		kt = A[14] | A[15];
245*0957b409SSimon J. Gerraty 		c1 = bnn ^ kt;
246*0957b409SSimon J. Gerraty 		kt = A[15] & A[21];
247*0957b409SSimon J. Gerraty 		c2 = A[14] ^ kt;
248*0957b409SSimon J. Gerraty 		kt = A[21] | A[ 2];
249*0957b409SSimon J. Gerraty 		c3 = A[15] ^ kt;
250*0957b409SSimon J. Gerraty 		kt = A[ 2] & A[ 8];
251*0957b409SSimon J. Gerraty 		c4 = A[21] ^ kt;
252*0957b409SSimon J. Gerraty 		A[ 2] = c0;
253*0957b409SSimon J. Gerraty 		A[ 8] = c1;
254*0957b409SSimon J. Gerraty 		A[14] = c2;
255*0957b409SSimon J. Gerraty 		A[15] = c3;
256*0957b409SSimon J. Gerraty 		A[21] = c4;
257*0957b409SSimon J. Gerraty 		A[ 0] = A[ 0] ^ RC[j + 0];
258*0957b409SSimon J. Gerraty 
259*0957b409SSimon J. Gerraty 		tt0 = A[ 6] ^ A[ 9];
260*0957b409SSimon J. Gerraty 		tt1 = A[ 7] ^ A[ 5];
261*0957b409SSimon J. Gerraty 		tt0 ^= A[ 8] ^ tt1;
262*0957b409SSimon J. Gerraty 		tt0 = (tt0 << 1) | (tt0 >> 63);
263*0957b409SSimon J. Gerraty 		tt2 = A[24] ^ A[22];
264*0957b409SSimon J. Gerraty 		tt3 = A[20] ^ A[23];
265*0957b409SSimon J. Gerraty 		tt0 ^= A[21];
266*0957b409SSimon J. Gerraty 		tt2 ^= tt3;
267*0957b409SSimon J. Gerraty 		t0 = tt0 ^ tt2;
268*0957b409SSimon J. Gerraty 
269*0957b409SSimon J. Gerraty 		tt0 = A[12] ^ A[10];
270*0957b409SSimon J. Gerraty 		tt1 = A[13] ^ A[11];
271*0957b409SSimon J. Gerraty 		tt0 ^= A[14] ^ tt1;
272*0957b409SSimon J. Gerraty 		tt0 = (tt0 << 1) | (tt0 >> 63);
273*0957b409SSimon J. Gerraty 		tt2 = A[ 0] ^ A[ 3];
274*0957b409SSimon J. Gerraty 		tt3 = A[ 1] ^ A[ 4];
275*0957b409SSimon J. Gerraty 		tt0 ^= A[ 2];
276*0957b409SSimon J. Gerraty 		tt2 ^= tt3;
277*0957b409SSimon J. Gerraty 		t1 = tt0 ^ tt2;
278*0957b409SSimon J. Gerraty 
279*0957b409SSimon J. Gerraty 		tt0 = A[18] ^ A[16];
280*0957b409SSimon J. Gerraty 		tt1 = A[19] ^ A[17];
281*0957b409SSimon J. Gerraty 		tt0 ^= A[15] ^ tt1;
282*0957b409SSimon J. Gerraty 		tt0 = (tt0 << 1) | (tt0 >> 63);
283*0957b409SSimon J. Gerraty 		tt2 = A[ 6] ^ A[ 9];
284*0957b409SSimon J. Gerraty 		tt3 = A[ 7] ^ A[ 5];
285*0957b409SSimon J. Gerraty 		tt0 ^= A[ 8];
286*0957b409SSimon J. Gerraty 		tt2 ^= tt3;
287*0957b409SSimon J. Gerraty 		t2 = tt0 ^ tt2;
288*0957b409SSimon J. Gerraty 
289*0957b409SSimon J. Gerraty 		tt0 = A[24] ^ A[22];
290*0957b409SSimon J. Gerraty 		tt1 = A[20] ^ A[23];
291*0957b409SSimon J. Gerraty 		tt0 ^= A[21] ^ tt1;
292*0957b409SSimon J. Gerraty 		tt0 = (tt0 << 1) | (tt0 >> 63);
293*0957b409SSimon J. Gerraty 		tt2 = A[12] ^ A[10];
294*0957b409SSimon J. Gerraty 		tt3 = A[13] ^ A[11];
295*0957b409SSimon J. Gerraty 		tt0 ^= A[14];
296*0957b409SSimon J. Gerraty 		tt2 ^= tt3;
297*0957b409SSimon J. Gerraty 		t3 = tt0 ^ tt2;
298*0957b409SSimon J. Gerraty 
299*0957b409SSimon J. Gerraty 		tt0 = A[ 0] ^ A[ 3];
300*0957b409SSimon J. Gerraty 		tt1 = A[ 1] ^ A[ 4];
301*0957b409SSimon J. Gerraty 		tt0 ^= A[ 2] ^ tt1;
302*0957b409SSimon J. Gerraty 		tt0 = (tt0 << 1) | (tt0 >> 63);
303*0957b409SSimon J. Gerraty 		tt2 = A[18] ^ A[16];
304*0957b409SSimon J. Gerraty 		tt3 = A[19] ^ A[17];
305*0957b409SSimon J. Gerraty 		tt0 ^= A[15];
306*0957b409SSimon J. Gerraty 		tt2 ^= tt3;
307*0957b409SSimon J. Gerraty 		t4 = tt0 ^ tt2;
308*0957b409SSimon J. Gerraty 
309*0957b409SSimon J. Gerraty 		A[ 0] = A[ 0] ^ t0;
310*0957b409SSimon J. Gerraty 		A[ 3] = A[ 3] ^ t0;
311*0957b409SSimon J. Gerraty 		A[ 1] = A[ 1] ^ t0;
312*0957b409SSimon J. Gerraty 		A[ 4] = A[ 4] ^ t0;
313*0957b409SSimon J. Gerraty 		A[ 2] = A[ 2] ^ t0;
314*0957b409SSimon J. Gerraty 		A[ 6] = A[ 6] ^ t1;
315*0957b409SSimon J. Gerraty 		A[ 9] = A[ 9] ^ t1;
316*0957b409SSimon J. Gerraty 		A[ 7] = A[ 7] ^ t1;
317*0957b409SSimon J. Gerraty 		A[ 5] = A[ 5] ^ t1;
318*0957b409SSimon J. Gerraty 		A[ 8] = A[ 8] ^ t1;
319*0957b409SSimon J. Gerraty 		A[12] = A[12] ^ t2;
320*0957b409SSimon J. Gerraty 		A[10] = A[10] ^ t2;
321*0957b409SSimon J. Gerraty 		A[13] = A[13] ^ t2;
322*0957b409SSimon J. Gerraty 		A[11] = A[11] ^ t2;
323*0957b409SSimon J. Gerraty 		A[14] = A[14] ^ t2;
324*0957b409SSimon J. Gerraty 		A[18] = A[18] ^ t3;
325*0957b409SSimon J. Gerraty 		A[16] = A[16] ^ t3;
326*0957b409SSimon J. Gerraty 		A[19] = A[19] ^ t3;
327*0957b409SSimon J. Gerraty 		A[17] = A[17] ^ t3;
328*0957b409SSimon J. Gerraty 		A[15] = A[15] ^ t3;
329*0957b409SSimon J. Gerraty 		A[24] = A[24] ^ t4;
330*0957b409SSimon J. Gerraty 		A[22] = A[22] ^ t4;
331*0957b409SSimon J. Gerraty 		A[20] = A[20] ^ t4;
332*0957b409SSimon J. Gerraty 		A[23] = A[23] ^ t4;
333*0957b409SSimon J. Gerraty 		A[21] = A[21] ^ t4;
334*0957b409SSimon J. Gerraty 		A[ 3] = (A[ 3] << 36) | (A[ 3] >> (64 - 36));
335*0957b409SSimon J. Gerraty 		A[ 1] = (A[ 1] <<  3) | (A[ 1] >> (64 -  3));
336*0957b409SSimon J. Gerraty 		A[ 4] = (A[ 4] << 41) | (A[ 4] >> (64 - 41));
337*0957b409SSimon J. Gerraty 		A[ 2] = (A[ 2] << 18) | (A[ 2] >> (64 - 18));
338*0957b409SSimon J. Gerraty 		A[ 6] = (A[ 6] <<  1) | (A[ 6] >> (64 -  1));
339*0957b409SSimon J. Gerraty 		A[ 9] = (A[ 9] << 44) | (A[ 9] >> (64 - 44));
340*0957b409SSimon J. Gerraty 		A[ 7] = (A[ 7] << 10) | (A[ 7] >> (64 - 10));
341*0957b409SSimon J. Gerraty 		A[ 5] = (A[ 5] << 45) | (A[ 5] >> (64 - 45));
342*0957b409SSimon J. Gerraty 		A[ 8] = (A[ 8] <<  2) | (A[ 8] >> (64 - 2));
343*0957b409SSimon J. Gerraty 		A[12] = (A[12] << 62) | (A[12] >> (64 - 62));
344*0957b409SSimon J. Gerraty 		A[10] = (A[10] <<  6) | (A[10] >> (64 -  6));
345*0957b409SSimon J. Gerraty 		A[13] = (A[13] << 43) | (A[13] >> (64 - 43));
346*0957b409SSimon J. Gerraty 		A[11] = (A[11] << 15) | (A[11] >> (64 - 15));
347*0957b409SSimon J. Gerraty 		A[14] = (A[14] << 61) | (A[14] >> (64 - 61));
348*0957b409SSimon J. Gerraty 		A[18] = (A[18] << 28) | (A[18] >> (64 - 28));
349*0957b409SSimon J. Gerraty 		A[16] = (A[16] << 55) | (A[16] >> (64 - 55));
350*0957b409SSimon J. Gerraty 		A[19] = (A[19] << 25) | (A[19] >> (64 - 25));
351*0957b409SSimon J. Gerraty 		A[17] = (A[17] << 21) | (A[17] >> (64 - 21));
352*0957b409SSimon J. Gerraty 		A[15] = (A[15] << 56) | (A[15] >> (64 - 56));
353*0957b409SSimon J. Gerraty 		A[24] = (A[24] << 27) | (A[24] >> (64 - 27));
354*0957b409SSimon J. Gerraty 		A[22] = (A[22] << 20) | (A[22] >> (64 - 20));
355*0957b409SSimon J. Gerraty 		A[20] = (A[20] << 39) | (A[20] >> (64 - 39));
356*0957b409SSimon J. Gerraty 		A[23] = (A[23] <<  8) | (A[23] >> (64 -  8));
357*0957b409SSimon J. Gerraty 		A[21] = (A[21] << 14) | (A[21] >> (64 - 14));
358*0957b409SSimon J. Gerraty 		bnn = ~A[13];
359*0957b409SSimon J. Gerraty 		kt = A[ 9] | A[13];
360*0957b409SSimon J. Gerraty 		c0 = A[ 0] ^ kt;
361*0957b409SSimon J. Gerraty 		kt = bnn | A[17];
362*0957b409SSimon J. Gerraty 		c1 = A[ 9] ^ kt;
363*0957b409SSimon J. Gerraty 		kt = A[17] & A[21];
364*0957b409SSimon J. Gerraty 		c2 = A[13] ^ kt;
365*0957b409SSimon J. Gerraty 		kt = A[21] | A[ 0];
366*0957b409SSimon J. Gerraty 		c3 = A[17] ^ kt;
367*0957b409SSimon J. Gerraty 		kt = A[ 0] & A[ 9];
368*0957b409SSimon J. Gerraty 		c4 = A[21] ^ kt;
369*0957b409SSimon J. Gerraty 		A[ 0] = c0;
370*0957b409SSimon J. Gerraty 		A[ 9] = c1;
371*0957b409SSimon J. Gerraty 		A[13] = c2;
372*0957b409SSimon J. Gerraty 		A[17] = c3;
373*0957b409SSimon J. Gerraty 		A[21] = c4;
374*0957b409SSimon J. Gerraty 		bnn = ~A[14];
375*0957b409SSimon J. Gerraty 		kt = A[22] | A[ 1];
376*0957b409SSimon J. Gerraty 		c0 = A[18] ^ kt;
377*0957b409SSimon J. Gerraty 		kt = A[ 1] & A[ 5];
378*0957b409SSimon J. Gerraty 		c1 = A[22] ^ kt;
379*0957b409SSimon J. Gerraty 		kt = A[ 5] | bnn;
380*0957b409SSimon J. Gerraty 		c2 = A[ 1] ^ kt;
381*0957b409SSimon J. Gerraty 		kt = A[14] | A[18];
382*0957b409SSimon J. Gerraty 		c3 = A[ 5] ^ kt;
383*0957b409SSimon J. Gerraty 		kt = A[18] & A[22];
384*0957b409SSimon J. Gerraty 		c4 = A[14] ^ kt;
385*0957b409SSimon J. Gerraty 		A[18] = c0;
386*0957b409SSimon J. Gerraty 		A[22] = c1;
387*0957b409SSimon J. Gerraty 		A[ 1] = c2;
388*0957b409SSimon J. Gerraty 		A[ 5] = c3;
389*0957b409SSimon J. Gerraty 		A[14] = c4;
390*0957b409SSimon J. Gerraty 		bnn = ~A[23];
391*0957b409SSimon J. Gerraty 		kt = A[10] | A[19];
392*0957b409SSimon J. Gerraty 		c0 = A[ 6] ^ kt;
393*0957b409SSimon J. Gerraty 		kt = A[19] & A[23];
394*0957b409SSimon J. Gerraty 		c1 = A[10] ^ kt;
395*0957b409SSimon J. Gerraty 		kt = bnn & A[ 2];
396*0957b409SSimon J. Gerraty 		c2 = A[19] ^ kt;
397*0957b409SSimon J. Gerraty 		kt = A[ 2] | A[ 6];
398*0957b409SSimon J. Gerraty 		c3 = bnn ^ kt;
399*0957b409SSimon J. Gerraty 		kt = A[ 6] & A[10];
400*0957b409SSimon J. Gerraty 		c4 = A[ 2] ^ kt;
401*0957b409SSimon J. Gerraty 		A[ 6] = c0;
402*0957b409SSimon J. Gerraty 		A[10] = c1;
403*0957b409SSimon J. Gerraty 		A[19] = c2;
404*0957b409SSimon J. Gerraty 		A[23] = c3;
405*0957b409SSimon J. Gerraty 		A[ 2] = c4;
406*0957b409SSimon J. Gerraty 		bnn = ~A[11];
407*0957b409SSimon J. Gerraty 		kt = A[ 3] & A[ 7];
408*0957b409SSimon J. Gerraty 		c0 = A[24] ^ kt;
409*0957b409SSimon J. Gerraty 		kt = A[ 7] | A[11];
410*0957b409SSimon J. Gerraty 		c1 = A[ 3] ^ kt;
411*0957b409SSimon J. Gerraty 		kt = bnn | A[15];
412*0957b409SSimon J. Gerraty 		c2 = A[ 7] ^ kt;
413*0957b409SSimon J. Gerraty 		kt = A[15] & A[24];
414*0957b409SSimon J. Gerraty 		c3 = bnn ^ kt;
415*0957b409SSimon J. Gerraty 		kt = A[24] | A[ 3];
416*0957b409SSimon J. Gerraty 		c4 = A[15] ^ kt;
417*0957b409SSimon J. Gerraty 		A[24] = c0;
418*0957b409SSimon J. Gerraty 		A[ 3] = c1;
419*0957b409SSimon J. Gerraty 		A[ 7] = c2;
420*0957b409SSimon J. Gerraty 		A[11] = c3;
421*0957b409SSimon J. Gerraty 		A[15] = c4;
422*0957b409SSimon J. Gerraty 		bnn = ~A[16];
423*0957b409SSimon J. Gerraty 		kt = bnn & A[20];
424*0957b409SSimon J. Gerraty 		c0 = A[12] ^ kt;
425*0957b409SSimon J. Gerraty 		kt = A[20] | A[ 4];
426*0957b409SSimon J. Gerraty 		c1 = bnn ^ kt;
427*0957b409SSimon J. Gerraty 		kt = A[ 4] & A[ 8];
428*0957b409SSimon J. Gerraty 		c2 = A[20] ^ kt;
429*0957b409SSimon J. Gerraty 		kt = A[ 8] | A[12];
430*0957b409SSimon J. Gerraty 		c3 = A[ 4] ^ kt;
431*0957b409SSimon J. Gerraty 		kt = A[12] & A[16];
432*0957b409SSimon J. Gerraty 		c4 = A[ 8] ^ kt;
433*0957b409SSimon J. Gerraty 		A[12] = c0;
434*0957b409SSimon J. Gerraty 		A[16] = c1;
435*0957b409SSimon J. Gerraty 		A[20] = c2;
436*0957b409SSimon J. Gerraty 		A[ 4] = c3;
437*0957b409SSimon J. Gerraty 		A[ 8] = c4;
438*0957b409SSimon J. Gerraty 		A[ 0] = A[ 0] ^ RC[j + 1];
439*0957b409SSimon J. Gerraty 		t = A[ 5];
440*0957b409SSimon J. Gerraty 		A[ 5] = A[18];
441*0957b409SSimon J. Gerraty 		A[18] = A[11];
442*0957b409SSimon J. Gerraty 		A[11] = A[10];
443*0957b409SSimon J. Gerraty 		A[10] = A[ 6];
444*0957b409SSimon J. Gerraty 		A[ 6] = A[22];
445*0957b409SSimon J. Gerraty 		A[22] = A[20];
446*0957b409SSimon J. Gerraty 		A[20] = A[12];
447*0957b409SSimon J. Gerraty 		A[12] = A[19];
448*0957b409SSimon J. Gerraty 		A[19] = A[15];
449*0957b409SSimon J. Gerraty 		A[15] = A[24];
450*0957b409SSimon J. Gerraty 		A[24] = A[ 8];
451*0957b409SSimon J. Gerraty 		A[ 8] = t;
452*0957b409SSimon J. Gerraty 		t = A[ 1];
453*0957b409SSimon J. Gerraty 		A[ 1] = A[ 9];
454*0957b409SSimon J. Gerraty 		A[ 9] = A[14];
455*0957b409SSimon J. Gerraty 		A[14] = A[ 2];
456*0957b409SSimon J. Gerraty 		A[ 2] = A[13];
457*0957b409SSimon J. Gerraty 		A[13] = A[23];
458*0957b409SSimon J. Gerraty 		A[23] = A[ 4];
459*0957b409SSimon J. Gerraty 		A[ 4] = A[21];
460*0957b409SSimon J. Gerraty 		A[21] = A[16];
461*0957b409SSimon J. Gerraty 		A[16] = A[ 3];
462*0957b409SSimon J. Gerraty 		A[ 3] = A[17];
463*0957b409SSimon J. Gerraty 		A[17] = A[ 7];
464*0957b409SSimon J. Gerraty 		A[ 7] = t;
465*0957b409SSimon J. Gerraty 	}
466*0957b409SSimon J. Gerraty }
467*0957b409SSimon J. Gerraty 
468*0957b409SSimon J. Gerraty /* see bearssl_kdf.h */
469*0957b409SSimon J. Gerraty void
br_shake_init(br_shake_context * sc,int security_level)470*0957b409SSimon J. Gerraty br_shake_init(br_shake_context *sc, int security_level)
471*0957b409SSimon J. Gerraty {
472*0957b409SSimon J. Gerraty 	sc->rate = 200 - (size_t)(security_level >> 2);
473*0957b409SSimon J. Gerraty 	sc->dptr = 0;
474*0957b409SSimon J. Gerraty 	memset(sc->A, 0, sizeof sc->A);
475*0957b409SSimon J. Gerraty 	sc->A[ 1] = ~(uint64_t)0;
476*0957b409SSimon J. Gerraty 	sc->A[ 2] = ~(uint64_t)0;
477*0957b409SSimon J. Gerraty 	sc->A[ 8] = ~(uint64_t)0;
478*0957b409SSimon J. Gerraty 	sc->A[12] = ~(uint64_t)0;
479*0957b409SSimon J. Gerraty 	sc->A[17] = ~(uint64_t)0;
480*0957b409SSimon J. Gerraty 	sc->A[20] = ~(uint64_t)0;
481*0957b409SSimon J. Gerraty }
482*0957b409SSimon J. Gerraty 
483*0957b409SSimon J. Gerraty /* see bearssl_kdf.h */
484*0957b409SSimon J. Gerraty void
br_shake_inject(br_shake_context * sc,const void * data,size_t len)485*0957b409SSimon J. Gerraty br_shake_inject(br_shake_context *sc, const void *data, size_t len)
486*0957b409SSimon J. Gerraty {
487*0957b409SSimon J. Gerraty 	const unsigned char *buf;
488*0957b409SSimon J. Gerraty 	size_t rate, dptr;
489*0957b409SSimon J. Gerraty 
490*0957b409SSimon J. Gerraty 	buf = data;
491*0957b409SSimon J. Gerraty 	rate = sc->rate;
492*0957b409SSimon J. Gerraty 	dptr = sc->dptr;
493*0957b409SSimon J. Gerraty 	while (len > 0) {
494*0957b409SSimon J. Gerraty 		size_t clen;
495*0957b409SSimon J. Gerraty 
496*0957b409SSimon J. Gerraty 		clen = rate - dptr;
497*0957b409SSimon J. Gerraty 		if (clen > len) {
498*0957b409SSimon J. Gerraty 			clen = len;
499*0957b409SSimon J. Gerraty 		}
500*0957b409SSimon J. Gerraty 		memcpy(sc->dbuf + dptr, buf, clen);
501*0957b409SSimon J. Gerraty 		dptr += clen;
502*0957b409SSimon J. Gerraty 		buf += clen;
503*0957b409SSimon J. Gerraty 		len -= clen;
504*0957b409SSimon J. Gerraty 		if (dptr == rate) {
505*0957b409SSimon J. Gerraty 			xor_block(sc->A, sc->dbuf, rate);
506*0957b409SSimon J. Gerraty 			process_block(sc->A);
507*0957b409SSimon J. Gerraty 			dptr = 0;
508*0957b409SSimon J. Gerraty 		}
509*0957b409SSimon J. Gerraty 	}
510*0957b409SSimon J. Gerraty 	sc->dptr = dptr;
511*0957b409SSimon J. Gerraty }
512*0957b409SSimon J. Gerraty 
513*0957b409SSimon J. Gerraty /* see bearssl_kdf.h */
514*0957b409SSimon J. Gerraty void
br_shake_flip(br_shake_context * sc)515*0957b409SSimon J. Gerraty br_shake_flip(br_shake_context *sc)
516*0957b409SSimon J. Gerraty {
517*0957b409SSimon J. Gerraty 	/*
518*0957b409SSimon J. Gerraty 	 * We apply padding and pre-XOR the value into the state. We
519*0957b409SSimon J. Gerraty 	 * set dptr to the end of the buffer, so that first call to
520*0957b409SSimon J. Gerraty 	 * shake_extract() will process the block.
521*0957b409SSimon J. Gerraty 	 */
522*0957b409SSimon J. Gerraty 	if ((sc->dptr + 1) == sc->rate) {
523*0957b409SSimon J. Gerraty 		sc->dbuf[sc->dptr ++] = 0x9F;
524*0957b409SSimon J. Gerraty 	} else {
525*0957b409SSimon J. Gerraty 		sc->dbuf[sc->dptr ++] = 0x1F;
526*0957b409SSimon J. Gerraty 		memset(sc->dbuf + sc->dptr, 0x00, sc->rate - sc->dptr - 1);
527*0957b409SSimon J. Gerraty 		sc->dbuf[sc->rate - 1] = 0x80;
528*0957b409SSimon J. Gerraty 		sc->dptr = sc->rate;
529*0957b409SSimon J. Gerraty 	}
530*0957b409SSimon J. Gerraty 	xor_block(sc->A, sc->dbuf, sc->rate);
531*0957b409SSimon J. Gerraty }
532*0957b409SSimon J. Gerraty 
533*0957b409SSimon J. Gerraty /* see bearssl_kdf.h */
534*0957b409SSimon J. Gerraty void
br_shake_produce(br_shake_context * sc,void * out,size_t len)535*0957b409SSimon J. Gerraty br_shake_produce(br_shake_context *sc, void *out, size_t len)
536*0957b409SSimon J. Gerraty {
537*0957b409SSimon J. Gerraty 	unsigned char *buf;
538*0957b409SSimon J. Gerraty 	size_t dptr, rate;
539*0957b409SSimon J. Gerraty 
540*0957b409SSimon J. Gerraty 	buf = out;
541*0957b409SSimon J. Gerraty 	dptr = sc->dptr;
542*0957b409SSimon J. Gerraty 	rate = sc->rate;
543*0957b409SSimon J. Gerraty 	while (len > 0) {
544*0957b409SSimon J. Gerraty 		size_t clen;
545*0957b409SSimon J. Gerraty 
546*0957b409SSimon J. Gerraty 		if (dptr == rate) {
547*0957b409SSimon J. Gerraty 			unsigned char *dbuf;
548*0957b409SSimon J. Gerraty 			uint64_t *A;
549*0957b409SSimon J. Gerraty 
550*0957b409SSimon J. Gerraty 			A = sc->A;
551*0957b409SSimon J. Gerraty 			dbuf = sc->dbuf;
552*0957b409SSimon J. Gerraty 			process_block(A);
553*0957b409SSimon J. Gerraty 			br_enc64le(dbuf +   0,  A[ 0]);
554*0957b409SSimon J. Gerraty 			br_enc64le(dbuf +   8, ~A[ 1]);
555*0957b409SSimon J. Gerraty 			br_enc64le(dbuf +  16, ~A[ 2]);
556*0957b409SSimon J. Gerraty 			br_enc64le(dbuf +  24,  A[ 3]);
557*0957b409SSimon J. Gerraty 			br_enc64le(dbuf +  32,  A[ 4]);
558*0957b409SSimon J. Gerraty 			br_enc64le(dbuf +  40,  A[ 5]);
559*0957b409SSimon J. Gerraty 			br_enc64le(dbuf +  48,  A[ 6]);
560*0957b409SSimon J. Gerraty 			br_enc64le(dbuf +  56,  A[ 7]);
561*0957b409SSimon J. Gerraty 			br_enc64le(dbuf +  64, ~A[ 8]);
562*0957b409SSimon J. Gerraty 			br_enc64le(dbuf +  72,  A[ 9]);
563*0957b409SSimon J. Gerraty 			br_enc64le(dbuf +  80,  A[10]);
564*0957b409SSimon J. Gerraty 			br_enc64le(dbuf +  88,  A[11]);
565*0957b409SSimon J. Gerraty 			br_enc64le(dbuf +  96, ~A[12]);
566*0957b409SSimon J. Gerraty 			br_enc64le(dbuf + 104,  A[13]);
567*0957b409SSimon J. Gerraty 			br_enc64le(dbuf + 112,  A[14]);
568*0957b409SSimon J. Gerraty 			br_enc64le(dbuf + 120,  A[15]);
569*0957b409SSimon J. Gerraty 			br_enc64le(dbuf + 128,  A[16]);
570*0957b409SSimon J. Gerraty 			br_enc64le(dbuf + 136, ~A[17]);
571*0957b409SSimon J. Gerraty 			br_enc64le(dbuf + 144,  A[18]);
572*0957b409SSimon J. Gerraty 			br_enc64le(dbuf + 152,  A[19]);
573*0957b409SSimon J. Gerraty 			br_enc64le(dbuf + 160, ~A[20]);
574*0957b409SSimon J. Gerraty 			br_enc64le(dbuf + 168,  A[21]);
575*0957b409SSimon J. Gerraty 			br_enc64le(dbuf + 176,  A[22]);
576*0957b409SSimon J. Gerraty 			br_enc64le(dbuf + 184,  A[23]);
577*0957b409SSimon J. Gerraty 			br_enc64le(dbuf + 192,  A[24]);
578*0957b409SSimon J. Gerraty 			dptr = 0;
579*0957b409SSimon J. Gerraty 		}
580*0957b409SSimon J. Gerraty 		clen = rate - dptr;
581*0957b409SSimon J. Gerraty 		if (clen > len) {
582*0957b409SSimon J. Gerraty 			clen = len;
583*0957b409SSimon J. Gerraty 		}
584*0957b409SSimon J. Gerraty 		memcpy(buf, sc->dbuf + dptr, clen);
585*0957b409SSimon J. Gerraty 		dptr += clen;
586*0957b409SSimon J. Gerraty 		buf += clen;
587*0957b409SSimon J. Gerraty 		len -= clen;
588*0957b409SSimon J. Gerraty 	}
589*0957b409SSimon J. Gerraty 	sc->dptr = dptr;
590*0957b409SSimon J. Gerraty }
591