The data contained in this repository can be downloaded to your computer using one of several clients.
Please see the documentation of your version control software client for more information.

Please select the desired protocol below to get the URL.

This URL has Read-Only access.

Statistics
| Branch: | Revision:

main_repo / deps / openssl / openssl / crypto / sha / sha_locl.h @ aa3b4b4d

History | View | Annotate | Download (15.3 KB)

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