/src/openssl/crypto/sha/sha_locl.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* 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 | 261k | #define HASH_LONG SHA_LONG |
68 | | #define HASH_CTX SHA_CTX |
69 | 822k | #define HASH_CBLOCK SHA_CBLOCK |
70 | 65.3k | #define HASH_MAKE_STRING(c,s) do { \ |
71 | 65.3k | unsigned long ll; \ |
72 | 65.3k | ll=(c)->h0; (void)HOST_l2c(ll,(s)); \ |
73 | 65.3k | ll=(c)->h1; (void)HOST_l2c(ll,(s)); \ |
74 | 65.3k | ll=(c)->h2; (void)HOST_l2c(ll,(s)); \ |
75 | 65.3k | ll=(c)->h3; (void)HOST_l2c(ll,(s)); \ |
76 | 65.3k | ll=(c)->h4; (void)HOST_l2c(ll,(s)); \ |
77 | 65.3k | } 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 | 0 | # define HASH_BLOCK_DATA_ORDER sha_block_data_order |
86 | 0 | # 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 | 100k | # 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 | 65.3k | #define INIT_DATA_h0 0x67452301UL |
120 | 65.3k | #define INIT_DATA_h1 0xefcdab89UL |
121 | 65.3k | #define INIT_DATA_h2 0x98badcfeUL |
122 | 65.3k | #define INIT_DATA_h3 0x10325476UL |
123 | 65.3k | #define INIT_DATA_h4 0xc3d2e1f0UL |
124 | | |
125 | | #ifdef SHA_0 |
126 | | fips_md_init(SHA) |
127 | | #else |
128 | | fips_md_init_ctx(SHA1, SHA) |
129 | | #endif |
130 | 65.3k | { |
131 | 65.3k | memset(c, 0, sizeof(*c)); |
132 | 65.3k | c->h0 = INIT_DATA_h0; |
133 | 65.3k | c->h1 = INIT_DATA_h1; |
134 | 65.3k | c->h2 = INIT_DATA_h2; |
135 | 65.3k | c->h3 = INIT_DATA_h3; |
136 | 65.3k | c->h4 = INIT_DATA_h4; |
137 | 65.3k | return 1; |
138 | 65.3k | } Line | Count | Source | 130 | 65.3k | { | 131 | 65.3k | memset(c, 0, sizeof(*c)); | 132 | 65.3k | c->h0 = INIT_DATA_h0; | 133 | 65.3k | c->h1 = INIT_DATA_h1; | 134 | 65.3k | c->h2 = INIT_DATA_h2; | 135 | 65.3k | c->h3 = INIT_DATA_h3; | 136 | 65.3k | c->h4 = INIT_DATA_h4; | 137 | 65.3k | return 1; | 138 | 65.3k | } |
Unexecuted instantiation: SHA_Init |
139 | | |
140 | 0 | #define K_00_19 0x5a827999UL |
141 | 0 | #define K_20_39 0x6ed9eba1UL |
142 | 0 | #define K_40_59 0x8f1bbcdcUL |
143 | 0 | #define K_60_79 0xca62c1d6UL |
144 | | |
145 | | /* |
146 | | * As pointed out by Wei Dai <weidai@eskimo.com>, F() below can be simplified |
147 | | * to the code in F_00_19. Wei attributes these optimisations to Peter |
148 | | * Gutmann's SHS code, and he attributes it to Rich Schroeppel. #define |
149 | | * F(x,y,z) (((x) & (y)) | ((~(x)) & (z))) I've just become aware of another |
150 | | * tweak to be made, again from Wei Dai, in F_40_59, (x&a)|(y&a) -> (x|y)&a |
151 | | */ |
152 | 0 | #define F_00_19(b,c,d) ((((c) ^ (d)) & (b)) ^ (d)) |
153 | 0 | #define F_20_39(b,c,d) ((b) ^ (c) ^ (d)) |
154 | 0 | #define F_40_59(b,c,d) (((b) & (c)) | (((b)|(c)) & (d))) |
155 | 0 | #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 | 0 | (f)=xi+(e)+K_00_19+ROTATE((a),5)+F_00_19((b),(c),(d)); \ |
161 | 0 | (b)=ROTATE((b),30); |
162 | | |
163 | | # define BODY_16_19(i,a,b,c,d,e,f,xi,xa,xb,xc,xd) \ |
164 | 0 | Xupdate(f,xi,xa,xb,xc,xd); \ |
165 | 0 | (f)+=(e)+K_00_19+ROTATE((a),5)+F_00_19((b),(c),(d)); \ |
166 | 0 | (b)=ROTATE((b),30); |
167 | | |
168 | | # define BODY_20_31(i,a,b,c,d,e,f,xi,xa,xb,xc,xd) \ |
169 | 0 | Xupdate(f,xi,xa,xb,xc,xd); \ |
170 | 0 | (f)+=(e)+K_20_39+ROTATE((a),5)+F_20_39((b),(c),(d)); \ |
171 | 0 | (b)=ROTATE((b),30); |
172 | | |
173 | | # define BODY_32_39(i,a,b,c,d,e,f,xa,xb,xc,xd) \ |
174 | 0 | Xupdate(f,xa,xa,xb,xc,xd); \ |
175 | 0 | (f)+=(e)+K_20_39+ROTATE((a),5)+F_20_39((b),(c),(d)); \ |
176 | 0 | (b)=ROTATE((b),30); |
177 | | |
178 | | # define BODY_40_59(i,a,b,c,d,e,f,xa,xb,xc,xd) \ |
179 | 0 | Xupdate(f,xa,xa,xb,xc,xd); \ |
180 | 0 | (f)+=(e)+K_40_59+ROTATE((a),5)+F_40_59((b),(c),(d)); \ |
181 | 0 | (b)=ROTATE((b),30); |
182 | | |
183 | | # define BODY_60_79(i,a,b,c,d,e,f,xa,xb,xc,xd) \ |
184 | 0 | Xupdate(f,xa,xa,xb,xc,xd); \ |
185 | 0 | (f)=xa+(e)+K_60_79+ROTATE((a),5)+F_60_79((b),(c),(d)); \ |
186 | 0 | (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 | 0 | # 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 | 0 | { |
214 | 0 | const unsigned char *data = p; |
215 | 0 | register unsigned MD32_REG_T A, B, C, D, E, T, l; |
216 | 0 | # ifndef MD32_XARRAY |
217 | 0 | unsigned MD32_REG_T XX0, XX1, XX2, XX3, XX4, XX5, XX6, XX7, |
218 | 0 | XX8, XX9, XX10, XX11, XX12, XX13, XX14, XX15; |
219 | | # else |
220 | | SHA_LONG XX[16]; |
221 | | # endif |
222 | |
|
223 | 0 | A = c->h0; |
224 | 0 | B = c->h1; |
225 | 0 | C = c->h2; |
226 | 0 | D = c->h3; |
227 | 0 | E = c->h4; |
228 | |
|
229 | 0 | for (;;) { |
230 | 0 | const union { |
231 | 0 | long one; |
232 | 0 | char little; |
233 | 0 | } is_endian = { |
234 | 0 | 1 |
235 | 0 | }; |
236 | |
|
237 | 0 | if (!is_endian.little && sizeof(SHA_LONG) == 4 |
238 | 0 | && ((size_t)p % 4) == 0) { |
239 | 0 | const SHA_LONG *W = (const SHA_LONG *)data; |
240 | |
|
241 | 0 | X(0) = W[0]; |
242 | 0 | X(1) = W[1]; |
243 | 0 | BODY_00_15(0, A, B, C, D, E, T, X(0)); |
244 | 0 | X(2) = W[2]; |
245 | 0 | BODY_00_15(1, T, A, B, C, D, E, X(1)); |
246 | 0 | X(3) = W[3]; |
247 | 0 | BODY_00_15(2, E, T, A, B, C, D, X(2)); |
248 | 0 | X(4) = W[4]; |
249 | 0 | BODY_00_15(3, D, E, T, A, B, C, X(3)); |
250 | 0 | X(5) = W[5]; |
251 | 0 | BODY_00_15(4, C, D, E, T, A, B, X(4)); |
252 | 0 | X(6) = W[6]; |
253 | 0 | BODY_00_15(5, B, C, D, E, T, A, X(5)); |
254 | 0 | X(7) = W[7]; |
255 | 0 | BODY_00_15(6, A, B, C, D, E, T, X(6)); |
256 | 0 | X(8) = W[8]; |
257 | 0 | BODY_00_15(7, T, A, B, C, D, E, X(7)); |
258 | 0 | X(9) = W[9]; |
259 | 0 | BODY_00_15(8, E, T, A, B, C, D, X(8)); |
260 | 0 | X(10) = W[10]; |
261 | 0 | BODY_00_15(9, D, E, T, A, B, C, X(9)); |
262 | 0 | X(11) = W[11]; |
263 | 0 | BODY_00_15(10, C, D, E, T, A, B, X(10)); |
264 | 0 | X(12) = W[12]; |
265 | 0 | BODY_00_15(11, B, C, D, E, T, A, X(11)); |
266 | 0 | X(13) = W[13]; |
267 | 0 | BODY_00_15(12, A, B, C, D, E, T, X(12)); |
268 | 0 | X(14) = W[14]; |
269 | 0 | BODY_00_15(13, T, A, B, C, D, E, X(13)); |
270 | 0 | X(15) = W[15]; |
271 | 0 | BODY_00_15(14, E, T, A, B, C, D, X(14)); |
272 | 0 | BODY_00_15(15, D, E, T, A, B, C, X(15)); |
273 | |
|
274 | 0 | data += SHA_CBLOCK; |
275 | 0 | } else { |
276 | 0 | (void)HOST_c2l(data, l); |
277 | 0 | X(0) = l; |
278 | 0 | (void)HOST_c2l(data, l); |
279 | 0 | X(1) = l; |
280 | 0 | BODY_00_15(0, A, B, C, D, E, T, X(0)); |
281 | 0 | (void)HOST_c2l(data, l); |
282 | 0 | X(2) = l; |
283 | 0 | BODY_00_15(1, T, A, B, C, D, E, X(1)); |
284 | 0 | (void)HOST_c2l(data, l); |
285 | 0 | X(3) = l; |
286 | 0 | BODY_00_15(2, E, T, A, B, C, D, X(2)); |
287 | 0 | (void)HOST_c2l(data, l); |
288 | 0 | X(4) = l; |
289 | 0 | BODY_00_15(3, D, E, T, A, B, C, X(3)); |
290 | 0 | (void)HOST_c2l(data, l); |
291 | 0 | X(5) = l; |
292 | 0 | BODY_00_15(4, C, D, E, T, A, B, X(4)); |
293 | 0 | (void)HOST_c2l(data, l); |
294 | 0 | X(6) = l; |
295 | 0 | BODY_00_15(5, B, C, D, E, T, A, X(5)); |
296 | 0 | (void)HOST_c2l(data, l); |
297 | 0 | X(7) = l; |
298 | 0 | BODY_00_15(6, A, B, C, D, E, T, X(6)); |
299 | 0 | (void)HOST_c2l(data, l); |
300 | 0 | X(8) = l; |
301 | 0 | BODY_00_15(7, T, A, B, C, D, E, X(7)); |
302 | 0 | (void)HOST_c2l(data, l); |
303 | 0 | X(9) = l; |
304 | 0 | BODY_00_15(8, E, T, A, B, C, D, X(8)); |
305 | 0 | (void)HOST_c2l(data, l); |
306 | 0 | X(10) = l; |
307 | 0 | BODY_00_15(9, D, E, T, A, B, C, X(9)); |
308 | 0 | (void)HOST_c2l(data, l); |
309 | 0 | X(11) = l; |
310 | 0 | BODY_00_15(10, C, D, E, T, A, B, X(10)); |
311 | 0 | (void)HOST_c2l(data, l); |
312 | 0 | X(12) = l; |
313 | 0 | BODY_00_15(11, B, C, D, E, T, A, X(11)); |
314 | 0 | (void)HOST_c2l(data, l); |
315 | 0 | X(13) = l; |
316 | 0 | BODY_00_15(12, A, B, C, D, E, T, X(12)); |
317 | 0 | (void)HOST_c2l(data, l); |
318 | 0 | X(14) = l; |
319 | 0 | BODY_00_15(13, T, A, B, C, D, E, X(13)); |
320 | 0 | (void)HOST_c2l(data, l); |
321 | 0 | X(15) = l; |
322 | 0 | BODY_00_15(14, E, T, A, B, C, D, X(14)); |
323 | 0 | BODY_00_15(15, D, E, T, A, B, C, X(15)); |
324 | 0 | } |
325 | |
|
326 | 0 | BODY_16_19(16, C, D, E, T, A, B, X(0), X(0), X(2), X(8), X(13)); |
327 | 0 | BODY_16_19(17, B, C, D, E, T, A, X(1), X(1), X(3), X(9), X(14)); |
328 | 0 | BODY_16_19(18, A, B, C, D, E, T, X(2), X(2), X(4), X(10), X(15)); |
329 | 0 | BODY_16_19(19, T, A, B, C, D, E, X(3), X(3), X(5), X(11), X(0)); |
330 | |
|
331 | 0 | BODY_20_31(20, E, T, A, B, C, D, X(4), X(4), X(6), X(12), X(1)); |
332 | 0 | BODY_20_31(21, D, E, T, A, B, C, X(5), X(5), X(7), X(13), X(2)); |
333 | 0 | BODY_20_31(22, C, D, E, T, A, B, X(6), X(6), X(8), X(14), X(3)); |
334 | 0 | BODY_20_31(23, B, C, D, E, T, A, X(7), X(7), X(9), X(15), X(4)); |
335 | 0 | BODY_20_31(24, A, B, C, D, E, T, X(8), X(8), X(10), X(0), X(5)); |
336 | 0 | BODY_20_31(25, T, A, B, C, D, E, X(9), X(9), X(11), X(1), X(6)); |
337 | 0 | BODY_20_31(26, E, T, A, B, C, D, X(10), X(10), X(12), X(2), X(7)); |
338 | 0 | BODY_20_31(27, D, E, T, A, B, C, X(11), X(11), X(13), X(3), X(8)); |
339 | 0 | BODY_20_31(28, C, D, E, T, A, B, X(12), X(12), X(14), X(4), X(9)); |
340 | 0 | BODY_20_31(29, B, C, D, E, T, A, X(13), X(13), X(15), X(5), X(10)); |
341 | 0 | BODY_20_31(30, A, B, C, D, E, T, X(14), X(14), X(0), X(6), X(11)); |
342 | 0 | BODY_20_31(31, T, A, B, C, D, E, X(15), X(15), X(1), X(7), X(12)); |
343 | |
|
344 | 0 | BODY_32_39(32, E, T, A, B, C, D, X(0), X(2), X(8), X(13)); |
345 | 0 | BODY_32_39(33, D, E, T, A, B, C, X(1), X(3), X(9), X(14)); |
346 | 0 | BODY_32_39(34, C, D, E, T, A, B, X(2), X(4), X(10), X(15)); |
347 | 0 | BODY_32_39(35, B, C, D, E, T, A, X(3), X(5), X(11), X(0)); |
348 | 0 | BODY_32_39(36, A, B, C, D, E, T, X(4), X(6), X(12), X(1)); |
349 | 0 | BODY_32_39(37, T, A, B, C, D, E, X(5), X(7), X(13), X(2)); |
350 | 0 | BODY_32_39(38, E, T, A, B, C, D, X(6), X(8), X(14), X(3)); |
351 | 0 | BODY_32_39(39, D, E, T, A, B, C, X(7), X(9), X(15), X(4)); |
352 | |
|
353 | 0 | BODY_40_59(40, C, D, E, T, A, B, X(8), X(10), X(0), X(5)); |
354 | 0 | BODY_40_59(41, B, C, D, E, T, A, X(9), X(11), X(1), X(6)); |
355 | 0 | BODY_40_59(42, A, B, C, D, E, T, X(10), X(12), X(2), X(7)); |
356 | 0 | BODY_40_59(43, T, A, B, C, D, E, X(11), X(13), X(3), X(8)); |
357 | 0 | BODY_40_59(44, E, T, A, B, C, D, X(12), X(14), X(4), X(9)); |
358 | 0 | BODY_40_59(45, D, E, T, A, B, C, X(13), X(15), X(5), X(10)); |
359 | 0 | BODY_40_59(46, C, D, E, T, A, B, X(14), X(0), X(6), X(11)); |
360 | 0 | BODY_40_59(47, B, C, D, E, T, A, X(15), X(1), X(7), X(12)); |
361 | 0 | BODY_40_59(48, A, B, C, D, E, T, X(0), X(2), X(8), X(13)); |
362 | 0 | BODY_40_59(49, T, A, B, C, D, E, X(1), X(3), X(9), X(14)); |
363 | 0 | BODY_40_59(50, E, T, A, B, C, D, X(2), X(4), X(10), X(15)); |
364 | 0 | BODY_40_59(51, D, E, T, A, B, C, X(3), X(5), X(11), X(0)); |
365 | 0 | BODY_40_59(52, C, D, E, T, A, B, X(4), X(6), X(12), X(1)); |
366 | 0 | BODY_40_59(53, B, C, D, E, T, A, X(5), X(7), X(13), X(2)); |
367 | 0 | BODY_40_59(54, A, B, C, D, E, T, X(6), X(8), X(14), X(3)); |
368 | 0 | BODY_40_59(55, T, A, B, C, D, E, X(7), X(9), X(15), X(4)); |
369 | 0 | BODY_40_59(56, E, T, A, B, C, D, X(8), X(10), X(0), X(5)); |
370 | 0 | BODY_40_59(57, D, E, T, A, B, C, X(9), X(11), X(1), X(6)); |
371 | 0 | BODY_40_59(58, C, D, E, T, A, B, X(10), X(12), X(2), X(7)); |
372 | 0 | BODY_40_59(59, B, C, D, E, T, A, X(11), X(13), X(3), X(8)); |
373 | |
|
374 | 0 | BODY_60_79(60, A, B, C, D, E, T, X(12), X(14), X(4), X(9)); |
375 | 0 | BODY_60_79(61, T, A, B, C, D, E, X(13), X(15), X(5), X(10)); |
376 | 0 | BODY_60_79(62, E, T, A, B, C, D, X(14), X(0), X(6), X(11)); |
377 | 0 | BODY_60_79(63, D, E, T, A, B, C, X(15), X(1), X(7), X(12)); |
378 | 0 | BODY_60_79(64, C, D, E, T, A, B, X(0), X(2), X(8), X(13)); |
379 | 0 | BODY_60_79(65, B, C, D, E, T, A, X(1), X(3), X(9), X(14)); |
380 | 0 | BODY_60_79(66, A, B, C, D, E, T, X(2), X(4), X(10), X(15)); |
381 | 0 | BODY_60_79(67, T, A, B, C, D, E, X(3), X(5), X(11), X(0)); |
382 | 0 | BODY_60_79(68, E, T, A, B, C, D, X(4), X(6), X(12), X(1)); |
383 | 0 | BODY_60_79(69, D, E, T, A, B, C, X(5), X(7), X(13), X(2)); |
384 | 0 | BODY_60_79(70, C, D, E, T, A, B, X(6), X(8), X(14), X(3)); |
385 | 0 | BODY_60_79(71, B, C, D, E, T, A, X(7), X(9), X(15), X(4)); |
386 | 0 | BODY_60_79(72, A, B, C, D, E, T, X(8), X(10), X(0), X(5)); |
387 | 0 | BODY_60_79(73, T, A, B, C, D, E, X(9), X(11), X(1), X(6)); |
388 | 0 | BODY_60_79(74, E, T, A, B, C, D, X(10), X(12), X(2), X(7)); |
389 | 0 | BODY_60_79(75, D, E, T, A, B, C, X(11), X(13), X(3), X(8)); |
390 | 0 | BODY_60_79(76, C, D, E, T, A, B, X(12), X(14), X(4), X(9)); |
391 | 0 | BODY_60_79(77, B, C, D, E, T, A, X(13), X(15), X(5), X(10)); |
392 | 0 | BODY_60_79(78, A, B, C, D, E, T, X(14), X(0), X(6), X(11)); |
393 | 0 | BODY_60_79(79, T, A, B, C, D, E, X(15), X(1), X(7), X(12)); |
394 | |
|
395 | 0 | c->h0 = (c->h0 + E) & 0xffffffffL; |
396 | 0 | c->h1 = (c->h1 + T) & 0xffffffffL; |
397 | 0 | c->h2 = (c->h2 + A) & 0xffffffffL; |
398 | 0 | c->h3 = (c->h3 + B) & 0xffffffffL; |
399 | 0 | c->h4 = (c->h4 + C) & 0xffffffffL; |
400 | |
|
401 | 0 | if (--num == 0) |
402 | 0 | break; |
403 | | |
404 | 0 | A = c->h0; |
405 | 0 | B = c->h1; |
406 | 0 | C = c->h2; |
407 | 0 | D = c->h3; |
408 | 0 | E = c->h4; |
409 | |
|
410 | 0 | } |
411 | 0 | } |
412 | | # endif |
413 | | |
414 | | #else /* OPENSSL_SMALL_FOOTPRINT */ |
415 | | |
416 | | # define BODY_00_15(xi) do { \ |
417 | | T=E+K_00_19+F_00_19(B,C,D); \ |
418 | | E=D, D=C, C=ROTATE(B,30), B=A; \ |
419 | | A=ROTATE(A,5)+T+xi; } while(0) |
420 | | |
421 | | # define BODY_16_19(xa,xb,xc,xd) do { \ |
422 | | Xupdate(T,xa,xa,xb,xc,xd); \ |
423 | | T+=E+K_00_19+F_00_19(B,C,D); \ |
424 | | E=D, D=C, C=ROTATE(B,30), B=A; \ |
425 | | A=ROTATE(A,5)+T; } while(0) |
426 | | |
427 | | # define BODY_20_39(xa,xb,xc,xd) do { \ |
428 | | Xupdate(T,xa,xa,xb,xc,xd); \ |
429 | | T+=E+K_20_39+F_20_39(B,C,D); \ |
430 | | E=D, D=C, C=ROTATE(B,30), B=A; \ |
431 | | A=ROTATE(A,5)+T; } while(0) |
432 | | |
433 | | # define BODY_40_59(xa,xb,xc,xd) do { \ |
434 | | Xupdate(T,xa,xa,xb,xc,xd); \ |
435 | | T+=E+K_40_59+F_40_59(B,C,D); \ |
436 | | E=D, D=C, C=ROTATE(B,30), B=A; \ |
437 | | A=ROTATE(A,5)+T; } while(0) |
438 | | |
439 | | # define BODY_60_79(xa,xb,xc,xd) do { \ |
440 | | Xupdate(T,xa,xa,xb,xc,xd); \ |
441 | | T=E+K_60_79+F_60_79(B,C,D); \ |
442 | | E=D, D=C, C=ROTATE(B,30), B=A; \ |
443 | | A=ROTATE(A,5)+T+xa; } while(0) |
444 | | |
445 | | # if !defined(SHA_1) || !defined(SHA1_ASM) |
446 | | static void HASH_BLOCK_DATA_ORDER(SHA_CTX *c, const void *p, size_t num) |
447 | | { |
448 | | const unsigned char *data = p; |
449 | | register unsigned MD32_REG_T A, B, C, D, E, T, l; |
450 | | int i; |
451 | | SHA_LONG X[16]; |
452 | | |
453 | | A = c->h0; |
454 | | B = c->h1; |
455 | | C = c->h2; |
456 | | D = c->h3; |
457 | | E = c->h4; |
458 | | |
459 | | for (;;) { |
460 | | for (i = 0; i < 16; i++) { |
461 | | HOST_c2l(data, l); |
462 | | X[i] = l; |
463 | | BODY_00_15(X[i]); |
464 | | } |
465 | | for (i = 0; i < 4; i++) { |
466 | | BODY_16_19(X[i], X[i + 2], X[i + 8], X[(i + 13) & 15]); |
467 | | } |
468 | | for (; i < 24; i++) { |
469 | | BODY_20_39(X[i & 15], X[(i + 2) & 15], X[(i + 8) & 15], |
470 | | X[(i + 13) & 15]); |
471 | | } |
472 | | for (i = 0; i < 20; i++) { |
473 | | BODY_40_59(X[(i + 8) & 15], X[(i + 10) & 15], X[i & 15], |
474 | | X[(i + 5) & 15]); |
475 | | } |
476 | | for (i = 4; i < 24; i++) { |
477 | | BODY_60_79(X[(i + 8) & 15], X[(i + 10) & 15], X[i & 15], |
478 | | X[(i + 5) & 15]); |
479 | | } |
480 | | |
481 | | c->h0 = (c->h0 + A) & 0xffffffffL; |
482 | | c->h1 = (c->h1 + B) & 0xffffffffL; |
483 | | c->h2 = (c->h2 + C) & 0xffffffffL; |
484 | | c->h3 = (c->h3 + D) & 0xffffffffL; |
485 | | c->h4 = (c->h4 + E) & 0xffffffffL; |
486 | | |
487 | | if (--num == 0) |
488 | | break; |
489 | | |
490 | | A = c->h0; |
491 | | B = c->h1; |
492 | | C = c->h2; |
493 | | D = c->h3; |
494 | | E = c->h4; |
495 | | |
496 | | } |
497 | | } |
498 | | # endif |
499 | | |
500 | | #endif |