Fix VMS/openssl_{startup,shutddown}.com.in
[openssl.git] / crypto / sha / sha_locl.h
1 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2  * All rights reserved.
3  *
4  * This package is an SSL implementation written
5  * by Eric Young (eay@cryptsoft.com).
6  * The implementation was written so as to conform with Netscapes SSL.
7  *
8  * This library is free for commercial and non-commercial use as long as
9  * the following conditions are aheared to.  The following conditions
10  * apply to all code found in this distribution, be it the RC4, RSA,
11  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
12  * included with this distribution is covered by the same copyright terms
13  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14  *
15  * Copyright remains Eric Young's, and as such any Copyright notices in
16  * the code are not to be removed.
17  * If this package is used in a product, Eric Young should be given attribution
18  * as the author of the parts of the library used.
19  * This can be in the form of a textual message at program startup or
20  * in documentation (online or textual) provided with the package.
21  *
22  * Redistribution and use in source and binary forms, with or without
23  * modification, are permitted provided that the following conditions
24  * are met:
25  * 1. Redistributions of source code must retain the copyright
26  *    notice, this list of conditions and the following disclaimer.
27  * 2. Redistributions in binary form must reproduce the above copyright
28  *    notice, this list of conditions and the following disclaimer in the
29  *    documentation and/or other materials provided with the distribution.
30  * 3. All advertising materials mentioning features or use of this software
31  *    must display the following acknowledgement:
32  *    "This product includes cryptographic software written by
33  *     Eric Young (eay@cryptsoft.com)"
34  *    The word 'cryptographic' can be left out if the rouines from the library
35  *    being used are not cryptographic related :-).
36  * 4. If you include any Windows specific code (or a derivative thereof) from
37  *    the apps directory (application code) you must include an acknowledgement:
38  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39  *
40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  *
52  * The licence and distribution terms for any publically available version or
53  * derivative of this code cannot be changed.  i.e. this code cannot simply be
54  * copied and put under another distribution licence
55  * [including the GNU Public Licence.]
56  */
57
58 #include <stdlib.h>
59 #include <string.h>
60
61 #include <openssl/opensslconf.h>
62 #include <openssl/sha.h>
63
64 #define DATA_ORDER_IS_BIG_ENDIAN
65
66 #define HASH_LONG               SHA_LONG
67 #define HASH_CTX                SHA_CTX
68 #define HASH_CBLOCK             SHA_CBLOCK
69 #define HASH_MAKE_STRING(c,s)   do {    \
70         unsigned long ll;               \
71         ll=(c)->h0; (void)HOST_l2c(ll,(s));     \
72         ll=(c)->h1; (void)HOST_l2c(ll,(s));     \
73         ll=(c)->h2; (void)HOST_l2c(ll,(s));     \
74         ll=(c)->h3; (void)HOST_l2c(ll,(s));     \
75         ll=(c)->h4; (void)HOST_l2c(ll,(s));     \
76         } while (0)
77
78 #define HASH_UPDATE                     SHA1_Update
79 #define HASH_TRANSFORM                  SHA1_Transform
80 #define HASH_FINAL                      SHA1_Final
81 #define HASH_INIT                       SHA1_Init
82 #define HASH_BLOCK_DATA_ORDER           sha1_block_data_order
83 #define Xupdate(a,ix,ia,ib,ic,id)       ( (a)=(ia^ib^ic^id),    \
84                                           ix=(a)=ROTATE((a),1)  \
85                                         )
86
87 #ifndef SHA1_ASM
88 static void sha1_block_data_order(SHA_CTX *c, const void *p, size_t num);
89 #else
90 void sha1_block_data_order(SHA_CTX *c, const void *p, size_t num);
91 #endif
92
93 #include "internal/md32_common.h"
94
95 #define INIT_DATA_h0 0x67452301UL
96 #define INIT_DATA_h1 0xefcdab89UL
97 #define INIT_DATA_h2 0x98badcfeUL
98 #define INIT_DATA_h3 0x10325476UL
99 #define INIT_DATA_h4 0xc3d2e1f0UL
100
101 int HASH_INIT(SHA_CTX *c)
102 {
103     memset(c, 0, sizeof(*c));
104     c->h0 = INIT_DATA_h0;
105     c->h1 = INIT_DATA_h1;
106     c->h2 = INIT_DATA_h2;
107     c->h3 = INIT_DATA_h3;
108     c->h4 = INIT_DATA_h4;
109     return 1;
110 }
111
112 #define K_00_19 0x5a827999UL
113 #define K_20_39 0x6ed9eba1UL
114 #define K_40_59 0x8f1bbcdcUL
115 #define K_60_79 0xca62c1d6UL
116
117 /*
118  * As pointed out by Wei Dai <weidai@eskimo.com>, F() below can be simplified
119  * to the code in F_00_19.  Wei attributes these optimisations to Peter
120  * Gutmann's SHS code, and he attributes it to Rich Schroeppel. #define
121  * F(x,y,z) (((x) & (y)) | ((~(x)) & (z))) I've just become aware of another
122  * tweak to be made, again from Wei Dai, in F_40_59, (x&a)|(y&a) -> (x|y)&a
123  */
124 #define F_00_19(b,c,d)  ((((c) ^ (d)) & (b)) ^ (d))
125 #define F_20_39(b,c,d)  ((b) ^ (c) ^ (d))
126 #define F_40_59(b,c,d)  (((b) & (c)) | (((b)|(c)) & (d)))
127 #define F_60_79(b,c,d)  F_20_39(b,c,d)
128
129 #ifndef OPENSSL_SMALL_FOOTPRINT
130
131 # define BODY_00_15(i,a,b,c,d,e,f,xi) \
132         (f)=xi+(e)+K_00_19+ROTATE((a),5)+F_00_19((b),(c),(d)); \
133         (b)=ROTATE((b),30);
134
135 # define BODY_16_19(i,a,b,c,d,e,f,xi,xa,xb,xc,xd) \
136         Xupdate(f,xi,xa,xb,xc,xd); \
137         (f)+=(e)+K_00_19+ROTATE((a),5)+F_00_19((b),(c),(d)); \
138         (b)=ROTATE((b),30);
139
140 # define BODY_20_31(i,a,b,c,d,e,f,xi,xa,xb,xc,xd) \
141         Xupdate(f,xi,xa,xb,xc,xd); \
142         (f)+=(e)+K_20_39+ROTATE((a),5)+F_20_39((b),(c),(d)); \
143         (b)=ROTATE((b),30);
144
145 # define BODY_32_39(i,a,b,c,d,e,f,xa,xb,xc,xd) \
146         Xupdate(f,xa,xa,xb,xc,xd); \
147         (f)+=(e)+K_20_39+ROTATE((a),5)+F_20_39((b),(c),(d)); \
148         (b)=ROTATE((b),30);
149
150 # define BODY_40_59(i,a,b,c,d,e,f,xa,xb,xc,xd) \
151         Xupdate(f,xa,xa,xb,xc,xd); \
152         (f)+=(e)+K_40_59+ROTATE((a),5)+F_40_59((b),(c),(d)); \
153         (b)=ROTATE((b),30);
154
155 # define BODY_60_79(i,a,b,c,d,e,f,xa,xb,xc,xd) \
156         Xupdate(f,xa,xa,xb,xc,xd); \
157         (f)=xa+(e)+K_60_79+ROTATE((a),5)+F_60_79((b),(c),(d)); \
158         (b)=ROTATE((b),30);
159
160 # ifdef X
161 #  undef X
162 # endif
163 # ifndef MD32_XARRAY
164   /*
165    * Originally X was an array. As it's automatic it's natural
166    * to expect RISC compiler to accommodate at least part of it in
167    * the register bank, isn't it? Unfortunately not all compilers
168    * "find" this expectation reasonable:-( On order to make such
169    * compilers generate better code I replace X[] with a bunch of
170    * X0, X1, etc. See the function body below...
171    *                                    <appro@fy.chalmers.se>
172    */
173 #  define X(i)   XX##i
174 # else
175   /*
176    * However! Some compilers (most notably HP C) get overwhelmed by
177    * that many local variables so that we have to have the way to
178    * fall down to the original behavior.
179    */
180 #  define X(i)   XX[i]
181 # endif
182
183 # if !defined(SHA1_ASM)
184 static void HASH_BLOCK_DATA_ORDER(SHA_CTX *c, const void *p, size_t num)
185 {
186     const unsigned char *data = p;
187     register unsigned MD32_REG_T A, B, C, D, E, T, l;
188 #  ifndef MD32_XARRAY
189     unsigned MD32_REG_T XX0, XX1, XX2, XX3, XX4, XX5, XX6, XX7,
190         XX8, XX9, XX10, XX11, XX12, XX13, XX14, XX15;
191 #  else
192     SHA_LONG XX[16];
193 #  endif
194
195     A = c->h0;
196     B = c->h1;
197     C = c->h2;
198     D = c->h3;
199     E = c->h4;
200
201     for (;;) {
202         const union {
203             long one;
204             char little;
205         } is_endian = {
206             1
207         };
208
209         if (!is_endian.little && sizeof(SHA_LONG) == 4
210             && ((size_t)p % 4) == 0) {
211             const SHA_LONG *W = (const SHA_LONG *)data;
212
213             X(0) = W[0];
214             X(1) = W[1];
215             BODY_00_15(0, A, B, C, D, E, T, X(0));
216             X(2) = W[2];
217             BODY_00_15(1, T, A, B, C, D, E, X(1));
218             X(3) = W[3];
219             BODY_00_15(2, E, T, A, B, C, D, X(2));
220             X(4) = W[4];
221             BODY_00_15(3, D, E, T, A, B, C, X(3));
222             X(5) = W[5];
223             BODY_00_15(4, C, D, E, T, A, B, X(4));
224             X(6) = W[6];
225             BODY_00_15(5, B, C, D, E, T, A, X(5));
226             X(7) = W[7];
227             BODY_00_15(6, A, B, C, D, E, T, X(6));
228             X(8) = W[8];
229             BODY_00_15(7, T, A, B, C, D, E, X(7));
230             X(9) = W[9];
231             BODY_00_15(8, E, T, A, B, C, D, X(8));
232             X(10) = W[10];
233             BODY_00_15(9, D, E, T, A, B, C, X(9));
234             X(11) = W[11];
235             BODY_00_15(10, C, D, E, T, A, B, X(10));
236             X(12) = W[12];
237             BODY_00_15(11, B, C, D, E, T, A, X(11));
238             X(13) = W[13];
239             BODY_00_15(12, A, B, C, D, E, T, X(12));
240             X(14) = W[14];
241             BODY_00_15(13, T, A, B, C, D, E, X(13));
242             X(15) = W[15];
243             BODY_00_15(14, E, T, A, B, C, D, X(14));
244             BODY_00_15(15, D, E, T, A, B, C, X(15));
245
246             data += SHA_CBLOCK;
247         } else {
248             (void)HOST_c2l(data, l);
249             X(0) = l;
250             (void)HOST_c2l(data, l);
251             X(1) = l;
252             BODY_00_15(0, A, B, C, D, E, T, X(0));
253             (void)HOST_c2l(data, l);
254             X(2) = l;
255             BODY_00_15(1, T, A, B, C, D, E, X(1));
256             (void)HOST_c2l(data, l);
257             X(3) = l;
258             BODY_00_15(2, E, T, A, B, C, D, X(2));
259             (void)HOST_c2l(data, l);
260             X(4) = l;
261             BODY_00_15(3, D, E, T, A, B, C, X(3));
262             (void)HOST_c2l(data, l);
263             X(5) = l;
264             BODY_00_15(4, C, D, E, T, A, B, X(4));
265             (void)HOST_c2l(data, l);
266             X(6) = l;
267             BODY_00_15(5, B, C, D, E, T, A, X(5));
268             (void)HOST_c2l(data, l);
269             X(7) = l;
270             BODY_00_15(6, A, B, C, D, E, T, X(6));
271             (void)HOST_c2l(data, l);
272             X(8) = l;
273             BODY_00_15(7, T, A, B, C, D, E, X(7));
274             (void)HOST_c2l(data, l);
275             X(9) = l;
276             BODY_00_15(8, E, T, A, B, C, D, X(8));
277             (void)HOST_c2l(data, l);
278             X(10) = l;
279             BODY_00_15(9, D, E, T, A, B, C, X(9));
280             (void)HOST_c2l(data, l);
281             X(11) = l;
282             BODY_00_15(10, C, D, E, T, A, B, X(10));
283             (void)HOST_c2l(data, l);
284             X(12) = l;
285             BODY_00_15(11, B, C, D, E, T, A, X(11));
286             (void)HOST_c2l(data, l);
287             X(13) = l;
288             BODY_00_15(12, A, B, C, D, E, T, X(12));
289             (void)HOST_c2l(data, l);
290             X(14) = l;
291             BODY_00_15(13, T, A, B, C, D, E, X(13));
292             (void)HOST_c2l(data, l);
293             X(15) = l;
294             BODY_00_15(14, E, T, A, B, C, D, X(14));
295             BODY_00_15(15, D, E, T, A, B, C, X(15));
296         }
297
298         BODY_16_19(16, C, D, E, T, A, B, X(0), X(0), X(2), X(8), X(13));
299         BODY_16_19(17, B, C, D, E, T, A, X(1), X(1), X(3), X(9), X(14));
300         BODY_16_19(18, A, B, C, D, E, T, X(2), X(2), X(4), X(10), X(15));
301         BODY_16_19(19, T, A, B, C, D, E, X(3), X(3), X(5), X(11), X(0));
302
303         BODY_20_31(20, E, T, A, B, C, D, X(4), X(4), X(6), X(12), X(1));
304         BODY_20_31(21, D, E, T, A, B, C, X(5), X(5), X(7), X(13), X(2));
305         BODY_20_31(22, C, D, E, T, A, B, X(6), X(6), X(8), X(14), X(3));
306         BODY_20_31(23, B, C, D, E, T, A, X(7), X(7), X(9), X(15), X(4));
307         BODY_20_31(24, A, B, C, D, E, T, X(8), X(8), X(10), X(0), X(5));
308         BODY_20_31(25, T, A, B, C, D, E, X(9), X(9), X(11), X(1), X(6));
309         BODY_20_31(26, E, T, A, B, C, D, X(10), X(10), X(12), X(2), X(7));
310         BODY_20_31(27, D, E, T, A, B, C, X(11), X(11), X(13), X(3), X(8));
311         BODY_20_31(28, C, D, E, T, A, B, X(12), X(12), X(14), X(4), X(9));
312         BODY_20_31(29, B, C, D, E, T, A, X(13), X(13), X(15), X(5), X(10));
313         BODY_20_31(30, A, B, C, D, E, T, X(14), X(14), X(0), X(6), X(11));
314         BODY_20_31(31, T, A, B, C, D, E, X(15), X(15), X(1), X(7), X(12));
315
316         BODY_32_39(32, E, T, A, B, C, D, X(0), X(2), X(8), X(13));
317         BODY_32_39(33, D, E, T, A, B, C, X(1), X(3), X(9), X(14));
318         BODY_32_39(34, C, D, E, T, A, B, X(2), X(4), X(10), X(15));
319         BODY_32_39(35, B, C, D, E, T, A, X(3), X(5), X(11), X(0));
320         BODY_32_39(36, A, B, C, D, E, T, X(4), X(6), X(12), X(1));
321         BODY_32_39(37, T, A, B, C, D, E, X(5), X(7), X(13), X(2));
322         BODY_32_39(38, E, T, A, B, C, D, X(6), X(8), X(14), X(3));
323         BODY_32_39(39, D, E, T, A, B, C, X(7), X(9), X(15), X(4));
324
325         BODY_40_59(40, C, D, E, T, A, B, X(8), X(10), X(0), X(5));
326         BODY_40_59(41, B, C, D, E, T, A, X(9), X(11), X(1), X(6));
327         BODY_40_59(42, A, B, C, D, E, T, X(10), X(12), X(2), X(7));
328         BODY_40_59(43, T, A, B, C, D, E, X(11), X(13), X(3), X(8));
329         BODY_40_59(44, E, T, A, B, C, D, X(12), X(14), X(4), X(9));
330         BODY_40_59(45, D, E, T, A, B, C, X(13), X(15), X(5), X(10));
331         BODY_40_59(46, C, D, E, T, A, B, X(14), X(0), X(6), X(11));
332         BODY_40_59(47, B, C, D, E, T, A, X(15), X(1), X(7), X(12));
333         BODY_40_59(48, A, B, C, D, E, T, X(0), X(2), X(8), X(13));
334         BODY_40_59(49, T, A, B, C, D, E, X(1), X(3), X(9), X(14));
335         BODY_40_59(50, E, T, A, B, C, D, X(2), X(4), X(10), X(15));
336         BODY_40_59(51, D, E, T, A, B, C, X(3), X(5), X(11), X(0));
337         BODY_40_59(52, C, D, E, T, A, B, X(4), X(6), X(12), X(1));
338         BODY_40_59(53, B, C, D, E, T, A, X(5), X(7), X(13), X(2));
339         BODY_40_59(54, A, B, C, D, E, T, X(6), X(8), X(14), X(3));
340         BODY_40_59(55, T, A, B, C, D, E, X(7), X(9), X(15), X(4));
341         BODY_40_59(56, E, T, A, B, C, D, X(8), X(10), X(0), X(5));
342         BODY_40_59(57, D, E, T, A, B, C, X(9), X(11), X(1), X(6));
343         BODY_40_59(58, C, D, E, T, A, B, X(10), X(12), X(2), X(7));
344         BODY_40_59(59, B, C, D, E, T, A, X(11), X(13), X(3), X(8));
345
346         BODY_60_79(60, A, B, C, D, E, T, X(12), X(14), X(4), X(9));
347         BODY_60_79(61, T, A, B, C, D, E, X(13), X(15), X(5), X(10));
348         BODY_60_79(62, E, T, A, B, C, D, X(14), X(0), X(6), X(11));
349         BODY_60_79(63, D, E, T, A, B, C, X(15), X(1), X(7), X(12));
350         BODY_60_79(64, C, D, E, T, A, B, X(0), X(2), X(8), X(13));
351         BODY_60_79(65, B, C, D, E, T, A, X(1), X(3), X(9), X(14));
352         BODY_60_79(66, A, B, C, D, E, T, X(2), X(4), X(10), X(15));
353         BODY_60_79(67, T, A, B, C, D, E, X(3), X(5), X(11), X(0));
354         BODY_60_79(68, E, T, A, B, C, D, X(4), X(6), X(12), X(1));
355         BODY_60_79(69, D, E, T, A, B, C, X(5), X(7), X(13), X(2));
356         BODY_60_79(70, C, D, E, T, A, B, X(6), X(8), X(14), X(3));
357         BODY_60_79(71, B, C, D, E, T, A, X(7), X(9), X(15), X(4));
358         BODY_60_79(72, A, B, C, D, E, T, X(8), X(10), X(0), X(5));
359         BODY_60_79(73, T, A, B, C, D, E, X(9), X(11), X(1), X(6));
360         BODY_60_79(74, E, T, A, B, C, D, X(10), X(12), X(2), X(7));
361         BODY_60_79(75, D, E, T, A, B, C, X(11), X(13), X(3), X(8));
362         BODY_60_79(76, C, D, E, T, A, B, X(12), X(14), X(4), X(9));
363         BODY_60_79(77, B, C, D, E, T, A, X(13), X(15), X(5), X(10));
364         BODY_60_79(78, A, B, C, D, E, T, X(14), X(0), X(6), X(11));
365         BODY_60_79(79, T, A, B, C, D, E, X(15), X(1), X(7), X(12));
366
367         c->h0 = (c->h0 + E) & 0xffffffffL;
368         c->h1 = (c->h1 + T) & 0xffffffffL;
369         c->h2 = (c->h2 + A) & 0xffffffffL;
370         c->h3 = (c->h3 + B) & 0xffffffffL;
371         c->h4 = (c->h4 + C) & 0xffffffffL;
372
373         if (--num == 0)
374             break;
375
376         A = c->h0;
377         B = c->h1;
378         C = c->h2;
379         D = c->h3;
380         E = c->h4;
381
382     }
383 }
384 # endif
385
386 #else                           /* OPENSSL_SMALL_FOOTPRINT */
387
388 # define BODY_00_15(xi)           do {   \
389         T=E+K_00_19+F_00_19(B,C,D);     \
390         E=D, D=C, C=ROTATE(B,30), B=A;  \
391         A=ROTATE(A,5)+T+xi;         } while(0)
392
393 # define BODY_16_19(xa,xb,xc,xd)  do {   \
394         Xupdate(T,xa,xa,xb,xc,xd);      \
395         T+=E+K_00_19+F_00_19(B,C,D);    \
396         E=D, D=C, C=ROTATE(B,30), B=A;  \
397         A=ROTATE(A,5)+T;            } while(0)
398
399 # define BODY_20_39(xa,xb,xc,xd)  do {   \
400         Xupdate(T,xa,xa,xb,xc,xd);      \
401         T+=E+K_20_39+F_20_39(B,C,D);    \
402         E=D, D=C, C=ROTATE(B,30), B=A;  \
403         A=ROTATE(A,5)+T;            } while(0)
404
405 # define BODY_40_59(xa,xb,xc,xd)  do {   \
406         Xupdate(T,xa,xa,xb,xc,xd);      \
407         T+=E+K_40_59+F_40_59(B,C,D);    \
408         E=D, D=C, C=ROTATE(B,30), B=A;  \
409         A=ROTATE(A,5)+T;            } while(0)
410
411 # define BODY_60_79(xa,xb,xc,xd)  do {   \
412         Xupdate(T,xa,xa,xb,xc,xd);      \
413         T=E+K_60_79+F_60_79(B,C,D);     \
414         E=D, D=C, C=ROTATE(B,30), B=A;  \
415         A=ROTATE(A,5)+T+xa;         } while(0)
416
417 # if !defined(SHA1_ASM)
418 static void HASH_BLOCK_DATA_ORDER(SHA_CTX *c, const void *p, size_t num)
419 {
420     const unsigned char *data = p;
421     register unsigned MD32_REG_T A, B, C, D, E, T, l;
422     int i;
423     SHA_LONG X[16];
424
425     A = c->h0;
426     B = c->h1;
427     C = c->h2;
428     D = c->h3;
429     E = c->h4;
430
431     for (;;) {
432         for (i = 0; i < 16; i++) {
433             (void)HOST_c2l(data, l);
434             X[i] = l;
435             BODY_00_15(X[i]);
436         }
437         for (i = 0; i < 4; i++) {
438             BODY_16_19(X[i], X[i + 2], X[i + 8], X[(i + 13) & 15]);
439         }
440         for (; i < 24; i++) {
441             BODY_20_39(X[i & 15], X[(i + 2) & 15], X[(i + 8) & 15],
442                        X[(i + 13) & 15]);
443         }
444         for (i = 0; i < 20; i++) {
445             BODY_40_59(X[(i + 8) & 15], X[(i + 10) & 15], X[i & 15],
446                        X[(i + 5) & 15]);
447         }
448         for (i = 4; i < 24; i++) {
449             BODY_60_79(X[(i + 8) & 15], X[(i + 10) & 15], X[i & 15],
450                        X[(i + 5) & 15]);
451         }
452
453         c->h0 = (c->h0 + A) & 0xffffffffL;
454         c->h1 = (c->h1 + B) & 0xffffffffL;
455         c->h2 = (c->h2 + C) & 0xffffffffL;
456         c->h3 = (c->h3 + D) & 0xffffffffL;
457         c->h4 = (c->h4 + E) & 0xffffffffL;
458
459         if (--num == 0)
460             break;
461
462         A = c->h0;
463         B = c->h1;
464         C = c->h2;
465         D = c->h3;
466         E = c->h4;
467
468     }
469 }
470 # endif
471
472 #endif