diff options
author | ryker <> | 1998-10-05 20:13:14 +0000 |
---|---|---|
committer | ryker <> | 1998-10-05 20:13:14 +0000 |
commit | aeeae06a79815dc190061534d47236cec09f9e32 (patch) | |
tree | 851692b9c2f9c04f077666855641900f19fdb217 /src/lib/libcrypto/sha | |
parent | a4f79641824cbf9f60ca9d1168d1fcc46717a82a (diff) | |
download | openbsd-aeeae06a79815dc190061534d47236cec09f9e32.tar.gz openbsd-aeeae06a79815dc190061534d47236cec09f9e32.tar.bz2 openbsd-aeeae06a79815dc190061534d47236cec09f9e32.zip |
Import of SSLeay-0.9.0b with RSA and IDEA stubbed + OpenBSD build
functionality for shared libs.
Note that routines such as sslv2_init and friends that use RSA will
not work due to lack of RSA in this library.
Needs documentation and help from ports for easy upgrade to full
functionality where legally possible.
Diffstat (limited to 'src/lib/libcrypto/sha')
-rw-r--r-- | src/lib/libcrypto/sha/asm/sha1-586.pl | 491 | ||||
-rw-r--r-- | src/lib/libcrypto/sha/sha.h | 109 | ||||
-rw-r--r-- | src/lib/libcrypto/sha/sha1_one.c | 77 | ||||
-rw-r--r-- | src/lib/libcrypto/sha/sha1dgst.c | 468 | ||||
-rw-r--r-- | src/lib/libcrypto/sha/sha_locl.h | 246 |
5 files changed, 1391 insertions, 0 deletions
diff --git a/src/lib/libcrypto/sha/asm/sha1-586.pl b/src/lib/libcrypto/sha/asm/sha1-586.pl new file mode 100644 index 0000000000..d6d998f8ee --- /dev/null +++ b/src/lib/libcrypto/sha/asm/sha1-586.pl | |||
@@ -0,0 +1,491 @@ | |||
1 | #!/usr/bin/perl | ||
2 | |||
3 | $normal=0; | ||
4 | |||
5 | push(@INC,"perlasm","../../perlasm"); | ||
6 | require "x86asm.pl"; | ||
7 | |||
8 | &asm_init($ARGV[0],"sha1-586.pl"); | ||
9 | |||
10 | $A="eax"; | ||
11 | $B="ebx"; | ||
12 | $C="ecx"; | ||
13 | $D="edx"; | ||
14 | $E="edi"; | ||
15 | $T="esi"; | ||
16 | $tmp1="ebp"; | ||
17 | |||
18 | $off=9*4; | ||
19 | |||
20 | @K=(0x5a827999,0x6ed9eba1,0x8f1bbcdc,0xca62c1d6); | ||
21 | |||
22 | &sha1_block("sha1_block_x86"); | ||
23 | |||
24 | &asm_finish(); | ||
25 | |||
26 | sub Nn | ||
27 | { | ||
28 | local($p)=@_; | ||
29 | local(%n)=($A,$T,$B,$A,$C,$B,$D,$C,$E,$D,$T,$E); | ||
30 | return($n{$p}); | ||
31 | } | ||
32 | |||
33 | sub Np | ||
34 | { | ||
35 | local($p)=@_; | ||
36 | local(%n)=($A,$T,$B,$A,$C,$B,$D,$C,$E,$D,$T,$E); | ||
37 | local(%n)=($A,$B,$B,$C,$C,$D,$D,$E,$E,$T,$T,$A); | ||
38 | return($n{$p}); | ||
39 | } | ||
40 | |||
41 | sub Na | ||
42 | { | ||
43 | local($n)=@_; | ||
44 | return( (($n )&0x0f), | ||
45 | (($n+ 2)&0x0f), | ||
46 | (($n+ 8)&0x0f), | ||
47 | (($n+13)&0x0f), | ||
48 | (($n+ 1)&0x0f)); | ||
49 | } | ||
50 | |||
51 | sub X_expand | ||
52 | { | ||
53 | local($in)=@_; | ||
54 | |||
55 | &comment("First, load the words onto the stack in network byte order"); | ||
56 | for ($i=0; $i<16; $i++) | ||
57 | { | ||
58 | &mov("eax",&DWP(($i+0)*4,$in,"",0)) unless $i == 0; | ||
59 | &bswap("eax"); | ||
60 | &mov(&swtmp($i+0),"eax"); | ||
61 | } | ||
62 | |||
63 | &comment("We now have the X array on the stack"); | ||
64 | &comment("starting at sp-4"); | ||
65 | } | ||
66 | |||
67 | # Rules of engagement | ||
68 | # F is always trashable at the start, the running total. | ||
69 | # E becomes the next F so it can be trashed after it has been 'accumulated' | ||
70 | # F becomes A in the next round. We don't need to access it much. | ||
71 | # During the X update part, the result ends up in $X[$n0]. | ||
72 | |||
73 | sub BODY_00_15 | ||
74 | { | ||
75 | local($pos,$K,$X,$n,$a,$b,$c,$d,$e,$f)=@_; | ||
76 | |||
77 | return if $n & 1; | ||
78 | &comment("00_15 $n"); | ||
79 | |||
80 | &mov($f,$c); | ||
81 | |||
82 | &mov($tmp1,$a); | ||
83 | &xor($f,$d); # F2 | ||
84 | |||
85 | &rotl($tmp1,5); # A2 | ||
86 | |||
87 | &and($f,$b); # F3 | ||
88 | &add($tmp1,$e); | ||
89 | |||
90 | &rotr($b,1); # B1 <- F | ||
91 | &mov($e,&swtmp($n)); # G1 | ||
92 | |||
93 | &rotr($b,1); # B1 <- F | ||
94 | &xor($f,$d); # F4 | ||
95 | |||
96 | &lea($tmp1,&DWP($K,$tmp1,$e,1)); | ||
97 | |||
98 | ############################ | ||
99 | # &BODY_40_59( 0,$K[2],$X,42,$A,$B,$C,$D,$E,$T); | ||
100 | # &BODY_40_59( 0,$K[2],$X,43,$T,$A,$B,$C,$D,$E); | ||
101 | $n++; | ||
102 | local($n0,$n1,$n2,$n3,$np)=&Na($n); | ||
103 | ($b,$c,$d,$e,$f,$a)=($a,$b,$c,$d,$e,$f); | ||
104 | |||
105 | &mov($f,$c); | ||
106 | |||
107 | &add($a,$tmp1); # MOVED DOWN | ||
108 | &xor($f,$d); # F2 | ||
109 | |||
110 | &mov($tmp1,$a); | ||
111 | &and($f,$b); # F3 | ||
112 | |||
113 | &rotl($tmp1,5); # A2 | ||
114 | |||
115 | &add($tmp1,$e); | ||
116 | &mov($e,&swtmp($n)); # G1 | ||
117 | |||
118 | &rotr($b,1); # B1 <- F | ||
119 | &xor($f,$d); # F4 | ||
120 | |||
121 | &rotr($b,1); # B1 <- F | ||
122 | &lea($tmp1,&DWP($K,$tmp1,$e,1)); | ||
123 | |||
124 | &add($f,$tmp1); | ||
125 | } | ||
126 | |||
127 | sub BODY_16_19 | ||
128 | { | ||
129 | local($pos,$K,$X,$n,$a,$b,$c,$d,$e,$f)=@_; | ||
130 | local($n0,$n1,$n2,$n3,$np)=&Na($n); | ||
131 | |||
132 | return if $n & 1; | ||
133 | &comment("16_19 $n"); | ||
134 | |||
135 | &nop() if ($pos < 0); | ||
136 | &mov($tmp1,&swtmp($n0)); # X1 | ||
137 | &mov($f,&swtmp($n1)); # X2 | ||
138 | &xor($f,$tmp1); # X3 | ||
139 | &mov($tmp1,&swtmp($n2)); # X4 | ||
140 | &xor($f,$tmp1); # X5 | ||
141 | &mov($tmp1,&swtmp($n3)); # X6 | ||
142 | &xor($f,$tmp1); # X7 - slot | ||
143 | &mov($tmp1,$c); # F1 | ||
144 | &rotl($f,1); # X8 - slot | ||
145 | &xor($tmp1,$d); # F2 | ||
146 | &mov(&swtmp($n0),$f); # X9 - anytime | ||
147 | &and($tmp1,$b); # F3 | ||
148 | &lea($f,&DWP($K,$f,$e,1)); # tot=X+K+e | ||
149 | &xor($tmp1,$d); # F4 | ||
150 | &mov($e,$a); # A1 | ||
151 | &add($f,$tmp1); # tot+=F(); | ||
152 | |||
153 | &rotl($e,5); # A2 | ||
154 | |||
155 | &rotr($b,1); # B1 <- F | ||
156 | &add($f,$e); # tot+=a | ||
157 | |||
158 | ############################ | ||
159 | # &BODY_40_59( 0,$K[2],$X,42,$A,$B,$C,$D,$E,$T); | ||
160 | # &BODY_40_59( 0,$K[2],$X,43,$T,$A,$B,$C,$D,$E); | ||
161 | $n++; | ||
162 | local($n0,$n1,$n2,$n3,$np)=&Na($n); | ||
163 | ($b,$c,$d,$e,$f,$a)=($a,$b,$c,$d,$e,$f); | ||
164 | |||
165 | |||
166 | &mov($f,&swtmp($n0)); # X1 | ||
167 | &mov($tmp1,&swtmp($n1)); # X2 | ||
168 | &xor($f,$tmp1); # X3 | ||
169 | &mov($tmp1,&swtmp($n2)); # X4 | ||
170 | &xor($f,$tmp1); # X5 | ||
171 | &mov($tmp1,&swtmp($n3)); # X6 | ||
172 | &rotr($c,1); #&rotr($b,1); # B1 <- F # MOVED DOWN | ||
173 | &xor($f,$tmp1); # X7 - slot | ||
174 | &rotl($f,1); # X8 - slot | ||
175 | &mov($tmp1,$c); # F1 | ||
176 | &xor($tmp1,$d); # F2 | ||
177 | &mov(&swtmp($n0),$f); # X9 - anytime | ||
178 | &and($tmp1,$b); # F3 | ||
179 | &lea($f,&DWP($K,$f,$e,1)); # tot=X+K+e | ||
180 | |||
181 | &xor($tmp1,$d); # F4 | ||
182 | &mov($e,$a); # A1 | ||
183 | |||
184 | &rotl($e,5); # A2 | ||
185 | |||
186 | &rotr($b,1); # B1 <- F | ||
187 | &add($f,$e); # tot+=a | ||
188 | |||
189 | &rotr($b,1); # B1 <- F | ||
190 | &add($f,$tmp1); # tot+=F(); | ||
191 | |||
192 | } | ||
193 | |||
194 | sub BODY_20_39 | ||
195 | { | ||
196 | local($pos,$K,$X,$n,$a,$b,$c,$d,$e,$f)=@_; | ||
197 | |||
198 | &comment("20_39 $n"); | ||
199 | local($n0,$n1,$n2,$n3,$np)=&Na($n); | ||
200 | |||
201 | &mov($f,&swtmp($n0)); # X1 | ||
202 | &mov($tmp1,&swtmp($n1)); # X2 | ||
203 | &xor($f,$tmp1); # X3 | ||
204 | &mov($tmp1,&swtmp($n2)); # X4 | ||
205 | &xor($f,$tmp1); # X5 | ||
206 | &mov($tmp1,&swtmp($n3)); # X6 | ||
207 | &xor($f,$tmp1); # X7 - slot | ||
208 | &mov($tmp1,$b); # F1 | ||
209 | &rotl($f,1); # X8 - slot | ||
210 | &xor($tmp1,$c); # F2 | ||
211 | &mov(&swtmp($n0),$f); # X9 - anytime | ||
212 | &xor($tmp1,$d); # F3 | ||
213 | |||
214 | &lea($f,&DWP($K,$f,$e,1)); # tot=X+K+e | ||
215 | &mov($e,$a); # A1 | ||
216 | |||
217 | &rotl($e,5); # A2 | ||
218 | |||
219 | if ($n != 79) # last loop | ||
220 | { | ||
221 | &rotr($b,1); # B1 <- F | ||
222 | &add($e,$tmp1); # tmp1=F()+a | ||
223 | |||
224 | &rotr($b,1); # B2 <- F | ||
225 | &add($f,$e); # tot+=tmp1; | ||
226 | } | ||
227 | else | ||
228 | { | ||
229 | &add($e,$tmp1); # tmp1=F()+a | ||
230 | &mov($tmp1,&wparam(0)); | ||
231 | |||
232 | &rotr($b,1); # B1 <- F | ||
233 | &add($f,$e); # tot+=tmp1; | ||
234 | |||
235 | &rotr($b,1); # B2 <- F | ||
236 | } | ||
237 | } | ||
238 | |||
239 | sub BODY_40_59 | ||
240 | { | ||
241 | local($pos,$K,$X,$n,$a,$b,$c,$d,$e,$f)=@_; | ||
242 | |||
243 | &comment("40_59 $n"); | ||
244 | return if $n & 1; | ||
245 | local($n0,$n1,$n2,$n3,$np)=&Na($n); | ||
246 | |||
247 | &mov($f,&swtmp($n0)); # X1 | ||
248 | &mov($tmp1,&swtmp($n1)); # X2 | ||
249 | &xor($f,$tmp1); # X3 | ||
250 | &mov($tmp1,&swtmp($n2)); # X4 | ||
251 | &xor($f,$tmp1); # X5 | ||
252 | &mov($tmp1,&swtmp($n3)); # X6 | ||
253 | &xor($f,$tmp1); # X7 - slot | ||
254 | &mov($tmp1,$b); # F1 | ||
255 | &rotl($f,1); # X8 - slot | ||
256 | &or($tmp1,$c); # F2 | ||
257 | &mov(&swtmp($n0),$f); # X9 - anytime | ||
258 | &and($tmp1,$d); # F3 | ||
259 | |||
260 | &lea($f,&DWP($K,$f,$e,1)); # tot=X+K+e | ||
261 | &mov($e,$b); # F4 | ||
262 | |||
263 | &rotr($b,1); # B1 <- F | ||
264 | &and($e,$c); # F5 | ||
265 | |||
266 | &or($tmp1,$e); # F6 | ||
267 | &mov($e,$a); # A1 | ||
268 | |||
269 | &rotl($e,5); # A2 | ||
270 | |||
271 | &add($tmp1,$e); # tmp1=F()+a | ||
272 | |||
273 | ############################ | ||
274 | # &BODY_40_59( 0,$K[2],$X,42,$A,$B,$C,$D,$E,$T); | ||
275 | # &BODY_40_59( 0,$K[2],$X,43,$T,$A,$B,$C,$D,$E); | ||
276 | $n++; | ||
277 | local($n0,$n1,$n2,$n3,$np)=&Na($n); | ||
278 | ($b,$c,$d,$e,$f,$a)=($a,$b,$c,$d,$e,$f); | ||
279 | |||
280 | &mov($f,&swtmp($n0)); # X1 | ||
281 | &add($a,$tmp1); # tot+=tmp1; # moved was add f,tmp1 | ||
282 | &mov($tmp1,&swtmp($n1)); # X2 | ||
283 | &xor($f,$tmp1); # X3 | ||
284 | &mov($tmp1,&swtmp($n2)); # X4 | ||
285 | &xor($f,$tmp1); # X5 | ||
286 | &mov($tmp1,&swtmp($n3)); # X6 | ||
287 | &rotr($c,1); # B2 <- F # moved was rotr b,1 | ||
288 | &xor($f,$tmp1); # X7 - slot | ||
289 | &rotl($f,1); # X8 - slot | ||
290 | &mov($tmp1,$b); # F1 | ||
291 | &mov(&swtmp($n0),$f); # X9 - anytime | ||
292 | &or($tmp1,$c); # F2 | ||
293 | &lea($f,&DWP($K,$f,$e,1)); # tot=X+K+e | ||
294 | &mov($e,$b); # F4 | ||
295 | &and($tmp1,$d); # F3 | ||
296 | &and($e,$c); # F5 | ||
297 | |||
298 | &or($tmp1,$e); # F6 | ||
299 | &mov($e,$a); # A1 | ||
300 | |||
301 | &rotl($e,5); # A2 | ||
302 | |||
303 | &rotr($b,1); # B1 <- F | ||
304 | &add($tmp1,$e); # tmp1=F()+a | ||
305 | |||
306 | &rotr($b,1); # B2 <- F | ||
307 | &add($f,$tmp1); # tot+=tmp1; | ||
308 | } | ||
309 | |||
310 | sub BODY_60_79 | ||
311 | { | ||
312 | &BODY_20_39(@_); | ||
313 | } | ||
314 | |||
315 | sub sha1_block | ||
316 | { | ||
317 | local($name)=@_; | ||
318 | |||
319 | &function_begin_B($name,""); | ||
320 | |||
321 | # parameter 1 is the MD5_CTX structure. | ||
322 | # A 0 | ||
323 | # B 4 | ||
324 | # C 8 | ||
325 | # D 12 | ||
326 | # E 16 | ||
327 | |||
328 | &push("esi"); | ||
329 | &push("ebp"); | ||
330 | &mov("eax", &wparam(2)); | ||
331 | &mov("esi", &wparam(1)); | ||
332 | &add("eax", "esi"); # offset to leave on | ||
333 | &mov("ebp", &wparam(0)); | ||
334 | &push("ebx"); | ||
335 | &sub("eax", 64); | ||
336 | &push("edi"); | ||
337 | &mov($B, &DWP( 4,"ebp","",0)); | ||
338 | &stack_push(18); | ||
339 | &mov($D, &DWP(12,"ebp","",0)); | ||
340 | &mov($E, &DWP(16,"ebp","",0)); | ||
341 | &mov($C, &DWP( 8,"ebp","",0)); | ||
342 | &mov(&swtmp(17),"eax"); | ||
343 | |||
344 | &comment("First we need to setup the X array"); | ||
345 | &mov("eax",&DWP(0,"esi","",0)); # pulled out of X_expand | ||
346 | |||
347 | &set_label("start") unless $normal; | ||
348 | |||
349 | &X_expand("esi"); | ||
350 | &mov(&swtmp(16),"esi"); | ||
351 | |||
352 | &comment(""); | ||
353 | &comment("Start processing"); | ||
354 | |||
355 | # odd start | ||
356 | &mov($A, &DWP( 0,"ebp","",0)); | ||
357 | $X="esp"; | ||
358 | &BODY_00_15(-2,$K[0],$X, 0,$A,$B,$C,$D,$E,$T); | ||
359 | &BODY_00_15( 0,$K[0],$X, 1,$T,$A,$B,$C,$D,$E); | ||
360 | &BODY_00_15( 0,$K[0],$X, 2,$E,$T,$A,$B,$C,$D); | ||
361 | &BODY_00_15( 0,$K[0],$X, 3,$D,$E,$T,$A,$B,$C); | ||
362 | &BODY_00_15( 0,$K[0],$X, 4,$C,$D,$E,$T,$A,$B); | ||
363 | &BODY_00_15( 0,$K[0],$X, 5,$B,$C,$D,$E,$T,$A); | ||
364 | &BODY_00_15( 0,$K[0],$X, 6,$A,$B,$C,$D,$E,$T); | ||
365 | &BODY_00_15( 0,$K[0],$X, 7,$T,$A,$B,$C,$D,$E); | ||
366 | &BODY_00_15( 0,$K[0],$X, 8,$E,$T,$A,$B,$C,$D); | ||
367 | &BODY_00_15( 0,$K[0],$X, 9,$D,$E,$T,$A,$B,$C); | ||
368 | &BODY_00_15( 0,$K[0],$X,10,$C,$D,$E,$T,$A,$B); | ||
369 | &BODY_00_15( 0,$K[0],$X,11,$B,$C,$D,$E,$T,$A); | ||
370 | &BODY_00_15( 0,$K[0],$X,12,$A,$B,$C,$D,$E,$T); | ||
371 | &BODY_00_15( 0,$K[0],$X,13,$T,$A,$B,$C,$D,$E); | ||
372 | &BODY_00_15( 0,$K[0],$X,14,$E,$T,$A,$B,$C,$D); | ||
373 | &BODY_00_15( 1,$K[0],$X,15,$D,$E,$T,$A,$B,$C); | ||
374 | &BODY_16_19(-1,$K[0],$X,16,$C,$D,$E,$T,$A,$B); | ||
375 | &BODY_16_19( 0,$K[0],$X,17,$B,$C,$D,$E,$T,$A); | ||
376 | &BODY_16_19( 0,$K[0],$X,18,$A,$B,$C,$D,$E,$T); | ||
377 | &BODY_16_19( 1,$K[0],$X,19,$T,$A,$B,$C,$D,$E); | ||
378 | |||
379 | &BODY_20_39(-1,$K[1],$X,20,$E,$T,$A,$B,$C,$D); | ||
380 | &BODY_20_39( 0,$K[1],$X,21,$D,$E,$T,$A,$B,$C); | ||
381 | &BODY_20_39( 0,$K[1],$X,22,$C,$D,$E,$T,$A,$B); | ||
382 | &BODY_20_39( 0,$K[1],$X,23,$B,$C,$D,$E,$T,$A); | ||
383 | &BODY_20_39( 0,$K[1],$X,24,$A,$B,$C,$D,$E,$T); | ||
384 | &BODY_20_39( 0,$K[1],$X,25,$T,$A,$B,$C,$D,$E); | ||
385 | &BODY_20_39( 0,$K[1],$X,26,$E,$T,$A,$B,$C,$D); | ||
386 | &BODY_20_39( 0,$K[1],$X,27,$D,$E,$T,$A,$B,$C); | ||
387 | &BODY_20_39( 0,$K[1],$X,28,$C,$D,$E,$T,$A,$B); | ||
388 | &BODY_20_39( 0,$K[1],$X,29,$B,$C,$D,$E,$T,$A); | ||
389 | &BODY_20_39( 0,$K[1],$X,30,$A,$B,$C,$D,$E,$T); | ||
390 | &BODY_20_39( 0,$K[1],$X,31,$T,$A,$B,$C,$D,$E); | ||
391 | &BODY_20_39( 0,$K[1],$X,32,$E,$T,$A,$B,$C,$D); | ||
392 | &BODY_20_39( 0,$K[1],$X,33,$D,$E,$T,$A,$B,$C); | ||
393 | &BODY_20_39( 0,$K[1],$X,34,$C,$D,$E,$T,$A,$B); | ||
394 | &BODY_20_39( 0,$K[1],$X,35,$B,$C,$D,$E,$T,$A); | ||
395 | &BODY_20_39( 0,$K[1],$X,36,$A,$B,$C,$D,$E,$T); | ||
396 | &BODY_20_39( 0,$K[1],$X,37,$T,$A,$B,$C,$D,$E); | ||
397 | &BODY_20_39( 0,$K[1],$X,38,$E,$T,$A,$B,$C,$D); | ||
398 | &BODY_20_39( 1,$K[1],$X,39,$D,$E,$T,$A,$B,$C); | ||
399 | |||
400 | &BODY_40_59(-1,$K[2],$X,40,$C,$D,$E,$T,$A,$B); | ||
401 | &BODY_40_59( 0,$K[2],$X,41,$B,$C,$D,$E,$T,$A); | ||
402 | &BODY_40_59( 0,$K[2],$X,42,$A,$B,$C,$D,$E,$T); | ||
403 | &BODY_40_59( 0,$K[2],$X,43,$T,$A,$B,$C,$D,$E); | ||
404 | &BODY_40_59( 0,$K[2],$X,44,$E,$T,$A,$B,$C,$D); | ||
405 | &BODY_40_59( 0,$K[2],$X,45,$D,$E,$T,$A,$B,$C); | ||
406 | &BODY_40_59( 0,$K[2],$X,46,$C,$D,$E,$T,$A,$B); | ||
407 | &BODY_40_59( 0,$K[2],$X,47,$B,$C,$D,$E,$T,$A); | ||
408 | &BODY_40_59( 0,$K[2],$X,48,$A,$B,$C,$D,$E,$T); | ||
409 | &BODY_40_59( 0,$K[2],$X,49,$T,$A,$B,$C,$D,$E); | ||
410 | &BODY_40_59( 0,$K[2],$X,50,$E,$T,$A,$B,$C,$D); | ||
411 | &BODY_40_59( 0,$K[2],$X,51,$D,$E,$T,$A,$B,$C); | ||
412 | &BODY_40_59( 0,$K[2],$X,52,$C,$D,$E,$T,$A,$B); | ||
413 | &BODY_40_59( 0,$K[2],$X,53,$B,$C,$D,$E,$T,$A); | ||
414 | &BODY_40_59( 0,$K[2],$X,54,$A,$B,$C,$D,$E,$T); | ||
415 | &BODY_40_59( 0,$K[2],$X,55,$T,$A,$B,$C,$D,$E); | ||
416 | &BODY_40_59( 0,$K[2],$X,56,$E,$T,$A,$B,$C,$D); | ||
417 | &BODY_40_59( 0,$K[2],$X,57,$D,$E,$T,$A,$B,$C); | ||
418 | &BODY_40_59( 0,$K[2],$X,58,$C,$D,$E,$T,$A,$B); | ||
419 | &BODY_40_59( 1,$K[2],$X,59,$B,$C,$D,$E,$T,$A); | ||
420 | |||
421 | &BODY_60_79(-1,$K[3],$X,60,$A,$B,$C,$D,$E,$T); | ||
422 | &BODY_60_79( 0,$K[3],$X,61,$T,$A,$B,$C,$D,$E); | ||
423 | &BODY_60_79( 0,$K[3],$X,62,$E,$T,$A,$B,$C,$D); | ||
424 | &BODY_60_79( 0,$K[3],$X,63,$D,$E,$T,$A,$B,$C); | ||
425 | &BODY_60_79( 0,$K[3],$X,64,$C,$D,$E,$T,$A,$B); | ||
426 | &BODY_60_79( 0,$K[3],$X,65,$B,$C,$D,$E,$T,$A); | ||
427 | &BODY_60_79( 0,$K[3],$X,66,$A,$B,$C,$D,$E,$T); | ||
428 | &BODY_60_79( 0,$K[3],$X,67,$T,$A,$B,$C,$D,$E); | ||
429 | &BODY_60_79( 0,$K[3],$X,68,$E,$T,$A,$B,$C,$D); | ||
430 | &BODY_60_79( 0,$K[3],$X,69,$D,$E,$T,$A,$B,$C); | ||
431 | &BODY_60_79( 0,$K[3],$X,70,$C,$D,$E,$T,$A,$B); | ||
432 | &BODY_60_79( 0,$K[3],$X,71,$B,$C,$D,$E,$T,$A); | ||
433 | &BODY_60_79( 0,$K[3],$X,72,$A,$B,$C,$D,$E,$T); | ||
434 | &BODY_60_79( 0,$K[3],$X,73,$T,$A,$B,$C,$D,$E); | ||
435 | &BODY_60_79( 0,$K[3],$X,74,$E,$T,$A,$B,$C,$D); | ||
436 | &BODY_60_79( 0,$K[3],$X,75,$D,$E,$T,$A,$B,$C); | ||
437 | &BODY_60_79( 0,$K[3],$X,76,$C,$D,$E,$T,$A,$B); | ||
438 | &BODY_60_79( 0,$K[3],$X,77,$B,$C,$D,$E,$T,$A); | ||
439 | &BODY_60_79( 0,$K[3],$X,78,$A,$B,$C,$D,$E,$T); | ||
440 | &BODY_60_79( 2,$K[3],$X,79,$T,$A,$B,$C,$D,$E); | ||
441 | |||
442 | &comment("End processing"); | ||
443 | &comment(""); | ||
444 | # D is the tmp value | ||
445 | |||
446 | # E -> A | ||
447 | # T -> B | ||
448 | # A -> C | ||
449 | # B -> D | ||
450 | # C -> E | ||
451 | # D -> T | ||
452 | |||
453 | # The last 2 have been moved into the last loop | ||
454 | # &mov($tmp1,&wparam(0)); | ||
455 | |||
456 | &mov($D, &DWP(12,$tmp1,"",0)); | ||
457 | &add($D,$B); | ||
458 | &mov($B, &DWP( 4,$tmp1,"",0)); | ||
459 | &add($B,$T); | ||
460 | &mov($T, $A); | ||
461 | &mov($A, &DWP( 0,$tmp1,"",0)); | ||
462 | &mov(&DWP(12,$tmp1,"",0),$D); | ||
463 | |||
464 | &add($A,$E); | ||
465 | &mov($E, &DWP(16,$tmp1,"",0)); | ||
466 | &add($E,$C); | ||
467 | &mov($C, &DWP( 8,$tmp1,"",0)); | ||
468 | &add($C,$T); | ||
469 | |||
470 | &mov(&DWP( 0,$tmp1,"",0),$A); | ||
471 | &mov("esi",&swtmp(16)); | ||
472 | &mov(&DWP( 8,$tmp1,"",0),$C); # This is for looping | ||
473 | &add("esi",64); | ||
474 | &mov("eax",&swtmp(17)); | ||
475 | &mov(&DWP(16,$tmp1,"",0),$E); | ||
476 | &cmp("eax","esi"); | ||
477 | &mov(&DWP( 4,$tmp1,"",0),$B); # This is for looping | ||
478 | &jl(&label("end")); | ||
479 | &mov("eax",&DWP(0,"esi","",0)); # Pulled down from | ||
480 | &jmp(&label("start")); | ||
481 | |||
482 | &set_label("end"); | ||
483 | &stack_pop(18); | ||
484 | &pop("edi"); | ||
485 | &pop("ebx"); | ||
486 | &pop("ebp"); | ||
487 | &pop("esi"); | ||
488 | &ret(); | ||
489 | &function_end_B($name); | ||
490 | } | ||
491 | |||
diff --git a/src/lib/libcrypto/sha/sha.h b/src/lib/libcrypto/sha/sha.h new file mode 100644 index 0000000000..4cf0ea0225 --- /dev/null +++ b/src/lib/libcrypto/sha/sha.h | |||
@@ -0,0 +1,109 @@ | |||
1 | /* crypto/sha/sha.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 | #ifndef HEADER_SHA_H | ||
60 | #define HEADER_SHA_H | ||
61 | |||
62 | #ifdef __cplusplus | ||
63 | extern "C" { | ||
64 | #endif | ||
65 | |||
66 | #define SHA_CBLOCK 64 | ||
67 | #define SHA_LBLOCK 16 | ||
68 | #define SHA_BLOCK 16 | ||
69 | #define SHA_LAST_BLOCK 56 | ||
70 | #define SHA_LENGTH_BLOCK 8 | ||
71 | #define SHA_DIGEST_LENGTH 20 | ||
72 | |||
73 | typedef struct SHAstate_st | ||
74 | { | ||
75 | unsigned long h0,h1,h2,h3,h4; | ||
76 | unsigned long Nl,Nh; | ||
77 | unsigned long data[SHA_LBLOCK]; | ||
78 | int num; | ||
79 | } SHA_CTX; | ||
80 | |||
81 | #ifndef NOPROTO | ||
82 | void SHA_Init(SHA_CTX *c); | ||
83 | void SHA_Update(SHA_CTX *c, unsigned char *data, unsigned long len); | ||
84 | void SHA_Final(unsigned char *md, SHA_CTX *c); | ||
85 | unsigned char *SHA(unsigned char *d, unsigned long n,unsigned char *md); | ||
86 | void SHA_Transform(SHA_CTX *c, unsigned char *data); | ||
87 | void SHA1_Init(SHA_CTX *c); | ||
88 | void SHA1_Update(SHA_CTX *c, unsigned char *data, unsigned long len); | ||
89 | void SHA1_Final(unsigned char *md, SHA_CTX *c); | ||
90 | unsigned char *SHA1(unsigned char *d, unsigned long n,unsigned char *md); | ||
91 | void SHA1_Transform(SHA_CTX *c, unsigned char *data); | ||
92 | #else | ||
93 | void SHA_Init(); | ||
94 | void SHA_Update(); | ||
95 | void SHA_Final(); | ||
96 | unsigned char *SHA(); | ||
97 | void SHA_Transform(); | ||
98 | void SHA1_Init(); | ||
99 | void SHA1_Update(); | ||
100 | void SHA1_Final(); | ||
101 | unsigned char *SHA1(); | ||
102 | void SHA1_Transform(); | ||
103 | #endif | ||
104 | |||
105 | #ifdef __cplusplus | ||
106 | } | ||
107 | #endif | ||
108 | |||
109 | #endif | ||
diff --git a/src/lib/libcrypto/sha/sha1_one.c b/src/lib/libcrypto/sha/sha1_one.c new file mode 100644 index 0000000000..fe5770d601 --- /dev/null +++ b/src/lib/libcrypto/sha/sha1_one.c | |||
@@ -0,0 +1,77 @@ | |||
1 | /* crypto/sha/sha1_one.c */ | ||
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 <stdio.h> | ||
60 | #include <string.h> | ||
61 | #include "sha.h" | ||
62 | |||
63 | unsigned char *SHA1(d, n, md) | ||
64 | unsigned char *d; | ||
65 | unsigned long n; | ||
66 | unsigned char *md; | ||
67 | { | ||
68 | SHA_CTX c; | ||
69 | static unsigned char m[SHA_DIGEST_LENGTH]; | ||
70 | |||
71 | if (md == NULL) md=m; | ||
72 | SHA1_Init(&c); | ||
73 | SHA1_Update(&c,d,n); | ||
74 | SHA1_Final(md,&c); | ||
75 | memset(&c,0,sizeof(c)); | ||
76 | return(md); | ||
77 | } | ||
diff --git a/src/lib/libcrypto/sha/sha1dgst.c b/src/lib/libcrypto/sha/sha1dgst.c new file mode 100644 index 0000000000..2b0ae1f0d4 --- /dev/null +++ b/src/lib/libcrypto/sha/sha1dgst.c | |||
@@ -0,0 +1,468 @@ | |||
1 | /* crypto/sha/sha1dgst.c */ | ||
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 <stdio.h> | ||
60 | #include <string.h> | ||
61 | #undef SHA_0 | ||
62 | #define SHA_1 | ||
63 | #include "sha.h" | ||
64 | #include "sha_locl.h" | ||
65 | |||
66 | char *SHA1_version="SHA1 part of SSLeay 0.9.0b 29-Jun-1998"; | ||
67 | |||
68 | /* Implemented from SHA-1 document - The Secure Hash Algorithm | ||
69 | */ | ||
70 | |||
71 | #define INIT_DATA_h0 (unsigned long)0x67452301L | ||
72 | #define INIT_DATA_h1 (unsigned long)0xefcdab89L | ||
73 | #define INIT_DATA_h2 (unsigned long)0x98badcfeL | ||
74 | #define INIT_DATA_h3 (unsigned long)0x10325476L | ||
75 | #define INIT_DATA_h4 (unsigned long)0xc3d2e1f0L | ||
76 | |||
77 | #define K_00_19 0x5a827999L | ||
78 | #define K_20_39 0x6ed9eba1L | ||
79 | #define K_40_59 0x8f1bbcdcL | ||
80 | #define K_60_79 0xca62c1d6L | ||
81 | |||
82 | #ifndef NOPROTO | ||
83 | # ifdef SHA1_ASM | ||
84 | void sha1_block_x86(SHA_CTX *c, register unsigned long *p, int num); | ||
85 | # define sha1_block sha1_block_x86 | ||
86 | # else | ||
87 | void sha1_block(SHA_CTX *c, register unsigned long *p, int num); | ||
88 | # endif | ||
89 | #else | ||
90 | # ifdef SHA1_ASM | ||
91 | void sha1_block_x86(); | ||
92 | # define sha1_block sha1_block_x86 | ||
93 | # else | ||
94 | void sha1_block(); | ||
95 | # endif | ||
96 | #endif | ||
97 | |||
98 | |||
99 | #if defined(L_ENDIAN) && defined(SHA1_ASM) | ||
100 | # define M_c2nl c2l | ||
101 | # define M_p_c2nl p_c2l | ||
102 | # define M_c2nl_p c2l_p | ||
103 | # define M_p_c2nl_p p_c2l_p | ||
104 | # define M_nl2c l2c | ||
105 | #else | ||
106 | # define M_c2nl c2nl | ||
107 | # define M_p_c2nl p_c2nl | ||
108 | # define M_c2nl_p c2nl_p | ||
109 | # define M_p_c2nl_p p_c2nl_p | ||
110 | # define M_nl2c nl2c | ||
111 | #endif | ||
112 | |||
113 | void SHA1_Init(c) | ||
114 | SHA_CTX *c; | ||
115 | { | ||
116 | c->h0=INIT_DATA_h0; | ||
117 | c->h1=INIT_DATA_h1; | ||
118 | c->h2=INIT_DATA_h2; | ||
119 | c->h3=INIT_DATA_h3; | ||
120 | c->h4=INIT_DATA_h4; | ||
121 | c->Nl=0; | ||
122 | c->Nh=0; | ||
123 | c->num=0; | ||
124 | } | ||
125 | |||
126 | void SHA1_Update(c, data, len) | ||
127 | SHA_CTX *c; | ||
128 | register unsigned char *data; | ||
129 | unsigned long len; | ||
130 | { | ||
131 | register ULONG *p; | ||
132 | int ew,ec,sw,sc; | ||
133 | ULONG l; | ||
134 | |||
135 | if (len == 0) return; | ||
136 | |||
137 | l=(c->Nl+(len<<3))&0xffffffffL; | ||
138 | if (l < c->Nl) /* overflow */ | ||
139 | c->Nh++; | ||
140 | c->Nh+=(len>>29); | ||
141 | c->Nl=l; | ||
142 | |||
143 | if (c->num != 0) | ||
144 | { | ||
145 | p=c->data; | ||
146 | sw=c->num>>2; | ||
147 | sc=c->num&0x03; | ||
148 | |||
149 | if ((c->num+len) >= SHA_CBLOCK) | ||
150 | { | ||
151 | l= p[sw]; | ||
152 | M_p_c2nl(data,l,sc); | ||
153 | p[sw++]=l; | ||
154 | for (; sw<SHA_LBLOCK; sw++) | ||
155 | { | ||
156 | M_c2nl(data,l); | ||
157 | p[sw]=l; | ||
158 | } | ||
159 | len-=(SHA_CBLOCK-c->num); | ||
160 | |||
161 | sha1_block(c,p,64); | ||
162 | c->num=0; | ||
163 | /* drop through and do the rest */ | ||
164 | } | ||
165 | else | ||
166 | { | ||
167 | c->num+=(int)len; | ||
168 | if ((sc+len) < 4) /* ugly, add char's to a word */ | ||
169 | { | ||
170 | l= p[sw]; | ||
171 | M_p_c2nl_p(data,l,sc,len); | ||
172 | p[sw]=l; | ||
173 | } | ||
174 | else | ||
175 | { | ||
176 | ew=(c->num>>2); | ||
177 | ec=(c->num&0x03); | ||
178 | l= p[sw]; | ||
179 | M_p_c2nl(data,l,sc); | ||
180 | p[sw++]=l; | ||
181 | for (; sw < ew; sw++) | ||
182 | { M_c2nl(data,l); p[sw]=l; } | ||
183 | if (ec) | ||
184 | { | ||
185 | M_c2nl_p(data,l,ec); | ||
186 | p[sw]=l; | ||
187 | } | ||
188 | } | ||
189 | return; | ||
190 | } | ||
191 | } | ||
192 | /* We can only do the following code for assember, the reason | ||
193 | * being that the sha1_block 'C' version changes the values | ||
194 | * in the 'data' array. The assember code avoids this and | ||
195 | * copies it to a local array. I should be able to do this for | ||
196 | * the C version as well.... | ||
197 | */ | ||
198 | #if 1 | ||
199 | #if defined(B_ENDIAN) || defined(SHA1_ASM) | ||
200 | if ((((unsigned int)data)%sizeof(ULONG)) == 0) | ||
201 | { | ||
202 | sw=len/SHA_CBLOCK; | ||
203 | if (sw) | ||
204 | { | ||
205 | sw*=SHA_CBLOCK; | ||
206 | sha1_block(c,(ULONG *)data,sw); | ||
207 | data+=sw; | ||
208 | len-=sw; | ||
209 | } | ||
210 | } | ||
211 | #endif | ||
212 | #endif | ||
213 | /* we now can process the input data in blocks of SHA_CBLOCK | ||
214 | * chars and save the leftovers to c->data. */ | ||
215 | p=c->data; | ||
216 | while (len >= SHA_CBLOCK) | ||
217 | { | ||
218 | #if defined(B_ENDIAN) || defined(L_ENDIAN) | ||
219 | if (p != (unsigned long *)data) | ||
220 | memcpy(p,data,SHA_CBLOCK); | ||
221 | data+=SHA_CBLOCK; | ||
222 | # ifdef L_ENDIAN | ||
223 | # ifndef SHA1_ASM /* Will not happen */ | ||
224 | for (sw=(SHA_LBLOCK/4); sw; sw--) | ||
225 | { | ||
226 | Endian_Reverse32(p[0]); | ||
227 | Endian_Reverse32(p[1]); | ||
228 | Endian_Reverse32(p[2]); | ||
229 | Endian_Reverse32(p[3]); | ||
230 | p+=4; | ||
231 | } | ||
232 | p=c->data; | ||
233 | # endif | ||
234 | # endif | ||
235 | #else | ||
236 | for (sw=(SHA_BLOCK/4); sw; sw--) | ||
237 | { | ||
238 | M_c2nl(data,l); *(p++)=l; | ||
239 | M_c2nl(data,l); *(p++)=l; | ||
240 | M_c2nl(data,l); *(p++)=l; | ||
241 | M_c2nl(data,l); *(p++)=l; | ||
242 | } | ||
243 | p=c->data; | ||
244 | #endif | ||
245 | sha1_block(c,p,64); | ||
246 | len-=SHA_CBLOCK; | ||
247 | } | ||
248 | ec=(int)len; | ||
249 | c->num=ec; | ||
250 | ew=(ec>>2); | ||
251 | ec&=0x03; | ||
252 | |||
253 | for (sw=0; sw < ew; sw++) | ||
254 | { M_c2nl(data,l); p[sw]=l; } | ||
255 | M_c2nl_p(data,l,ec); | ||
256 | p[sw]=l; | ||
257 | } | ||
258 | |||
259 | void SHA1_Transform(c,b) | ||
260 | SHA_CTX *c; | ||
261 | unsigned char *b; | ||
262 | { | ||
263 | ULONG p[16]; | ||
264 | #ifndef B_ENDIAN | ||
265 | ULONG *q; | ||
266 | int i; | ||
267 | #endif | ||
268 | |||
269 | #if defined(B_ENDIAN) || defined(L_ENDIAN) | ||
270 | memcpy(p,b,64); | ||
271 | #ifdef L_ENDIAN | ||
272 | q=p; | ||
273 | for (i=(SHA_LBLOCK/4); i; i--) | ||
274 | { | ||
275 | Endian_Reverse32(q[0]); | ||
276 | Endian_Reverse32(q[1]); | ||
277 | Endian_Reverse32(q[2]); | ||
278 | Endian_Reverse32(q[3]); | ||
279 | q+=4; | ||
280 | } | ||
281 | #endif | ||
282 | #else | ||
283 | q=p; | ||
284 | for (i=(SHA_LBLOCK/4); i; i--) | ||
285 | { | ||
286 | ULONG l; | ||
287 | c2nl(b,l); *(q++)=l; | ||
288 | c2nl(b,l); *(q++)=l; | ||
289 | c2nl(b,l); *(q++)=l; | ||
290 | c2nl(b,l); *(q++)=l; | ||
291 | } | ||
292 | #endif | ||
293 | sha1_block(c,p,64); | ||
294 | } | ||
295 | |||
296 | #ifndef SHA1_ASM | ||
297 | |||
298 | void sha1_block(c, W, num) | ||
299 | SHA_CTX *c; | ||
300 | register unsigned long *W; | ||
301 | int num; | ||
302 | { | ||
303 | register ULONG A,B,C,D,E,T; | ||
304 | ULONG X[16]; | ||
305 | |||
306 | A=c->h0; | ||
307 | B=c->h1; | ||
308 | C=c->h2; | ||
309 | D=c->h3; | ||
310 | E=c->h4; | ||
311 | |||
312 | for (;;) | ||
313 | { | ||
314 | BODY_00_15( 0,A,B,C,D,E,T,W); | ||
315 | BODY_00_15( 1,T,A,B,C,D,E,W); | ||
316 | BODY_00_15( 2,E,T,A,B,C,D,W); | ||
317 | BODY_00_15( 3,D,E,T,A,B,C,W); | ||
318 | BODY_00_15( 4,C,D,E,T,A,B,W); | ||
319 | BODY_00_15( 5,B,C,D,E,T,A,W); | ||
320 | BODY_00_15( 6,A,B,C,D,E,T,W); | ||
321 | BODY_00_15( 7,T,A,B,C,D,E,W); | ||
322 | BODY_00_15( 8,E,T,A,B,C,D,W); | ||
323 | BODY_00_15( 9,D,E,T,A,B,C,W); | ||
324 | BODY_00_15(10,C,D,E,T,A,B,W); | ||
325 | BODY_00_15(11,B,C,D,E,T,A,W); | ||
326 | BODY_00_15(12,A,B,C,D,E,T,W); | ||
327 | BODY_00_15(13,T,A,B,C,D,E,W); | ||
328 | BODY_00_15(14,E,T,A,B,C,D,W); | ||
329 | BODY_00_15(15,D,E,T,A,B,C,W); | ||
330 | BODY_16_19(16,C,D,E,T,A,B,W,W,W,W); | ||
331 | BODY_16_19(17,B,C,D,E,T,A,W,W,W,W); | ||
332 | BODY_16_19(18,A,B,C,D,E,T,W,W,W,W); | ||
333 | BODY_16_19(19,T,A,B,C,D,E,W,W,W,X); | ||
334 | |||
335 | BODY_20_31(20,E,T,A,B,C,D,W,W,W,X); | ||
336 | BODY_20_31(21,D,E,T,A,B,C,W,W,W,X); | ||
337 | BODY_20_31(22,C,D,E,T,A,B,W,W,W,X); | ||
338 | BODY_20_31(23,B,C,D,E,T,A,W,W,W,X); | ||
339 | BODY_20_31(24,A,B,C,D,E,T,W,W,X,X); | ||
340 | BODY_20_31(25,T,A,B,C,D,E,W,W,X,X); | ||
341 | BODY_20_31(26,E,T,A,B,C,D,W,W,X,X); | ||
342 | BODY_20_31(27,D,E,T,A,B,C,W,W,X,X); | ||
343 | BODY_20_31(28,C,D,E,T,A,B,W,W,X,X); | ||
344 | BODY_20_31(29,B,C,D,E,T,A,W,W,X,X); | ||
345 | BODY_20_31(30,A,B,C,D,E,T,W,X,X,X); | ||
346 | BODY_20_31(31,T,A,B,C,D,E,W,X,X,X); | ||
347 | BODY_32_39(32,E,T,A,B,C,D,X); | ||
348 | BODY_32_39(33,D,E,T,A,B,C,X); | ||
349 | BODY_32_39(34,C,D,E,T,A,B,X); | ||
350 | BODY_32_39(35,B,C,D,E,T,A,X); | ||
351 | BODY_32_39(36,A,B,C,D,E,T,X); | ||
352 | BODY_32_39(37,T,A,B,C,D,E,X); | ||
353 | BODY_32_39(38,E,T,A,B,C,D,X); | ||
354 | BODY_32_39(39,D,E,T,A,B,C,X); | ||
355 | |||
356 | BODY_40_59(40,C,D,E,T,A,B,X); | ||
357 | BODY_40_59(41,B,C,D,E,T,A,X); | ||
358 | BODY_40_59(42,A,B,C,D,E,T,X); | ||
359 | BODY_40_59(43,T,A,B,C,D,E,X); | ||
360 | BODY_40_59(44,E,T,A,B,C,D,X); | ||
361 | BODY_40_59(45,D,E,T,A,B,C,X); | ||
362 | BODY_40_59(46,C,D,E,T,A,B,X); | ||
363 | BODY_40_59(47,B,C,D,E,T,A,X); | ||
364 | BODY_40_59(48,A,B,C,D,E,T,X); | ||
365 | BODY_40_59(49,T,A,B,C,D,E,X); | ||
366 | BODY_40_59(50,E,T,A,B,C,D,X); | ||
367 | BODY_40_59(51,D,E,T,A,B,C,X); | ||
368 | BODY_40_59(52,C,D,E,T,A,B,X); | ||
369 | BODY_40_59(53,B,C,D,E,T,A,X); | ||
370 | BODY_40_59(54,A,B,C,D,E,T,X); | ||
371 | BODY_40_59(55,T,A,B,C,D,E,X); | ||
372 | BODY_40_59(56,E,T,A,B,C,D,X); | ||
373 | BODY_40_59(57,D,E,T,A,B,C,X); | ||
374 | BODY_40_59(58,C,D,E,T,A,B,X); | ||
375 | BODY_40_59(59,B,C,D,E,T,A,X); | ||
376 | |||
377 | BODY_60_79(60,A,B,C,D,E,T,X); | ||
378 | BODY_60_79(61,T,A,B,C,D,E,X); | ||
379 | BODY_60_79(62,E,T,A,B,C,D,X); | ||
380 | BODY_60_79(63,D,E,T,A,B,C,X); | ||
381 | BODY_60_79(64,C,D,E,T,A,B,X); | ||
382 | BODY_60_79(65,B,C,D,E,T,A,X); | ||
383 | BODY_60_79(66,A,B,C,D,E,T,X); | ||
384 | BODY_60_79(67,T,A,B,C,D,E,X); | ||
385 | BODY_60_79(68,E,T,A,B,C,D,X); | ||
386 | BODY_60_79(69,D,E,T,A,B,C,X); | ||
387 | BODY_60_79(70,C,D,E,T,A,B,X); | ||
388 | BODY_60_79(71,B,C,D,E,T,A,X); | ||
389 | BODY_60_79(72,A,B,C,D,E,T,X); | ||
390 | BODY_60_79(73,T,A,B,C,D,E,X); | ||
391 | BODY_60_79(74,E,T,A,B,C,D,X); | ||
392 | BODY_60_79(75,D,E,T,A,B,C,X); | ||
393 | BODY_60_79(76,C,D,E,T,A,B,X); | ||
394 | BODY_60_79(77,B,C,D,E,T,A,X); | ||
395 | BODY_60_79(78,A,B,C,D,E,T,X); | ||
396 | BODY_60_79(79,T,A,B,C,D,E,X); | ||
397 | |||
398 | c->h0=(c->h0+E)&0xffffffffL; | ||
399 | c->h1=(c->h1+T)&0xffffffffL; | ||
400 | c->h2=(c->h2+A)&0xffffffffL; | ||
401 | c->h3=(c->h3+B)&0xffffffffL; | ||
402 | c->h4=(c->h4+C)&0xffffffffL; | ||
403 | |||
404 | num-=64; | ||
405 | if (num <= 0) break; | ||
406 | |||
407 | A=c->h0; | ||
408 | B=c->h1; | ||
409 | C=c->h2; | ||
410 | D=c->h3; | ||
411 | E=c->h4; | ||
412 | |||
413 | W+=16; | ||
414 | } | ||
415 | } | ||
416 | #endif | ||
417 | |||
418 | void SHA1_Final(md, c) | ||
419 | unsigned char *md; | ||
420 | SHA_CTX *c; | ||
421 | { | ||
422 | register int i,j; | ||
423 | register ULONG l; | ||
424 | register ULONG *p; | ||
425 | static unsigned char end[4]={0x80,0x00,0x00,0x00}; | ||
426 | unsigned char *cp=end; | ||
427 | |||
428 | /* c->num should definitly have room for at least one more byte. */ | ||
429 | p=c->data; | ||
430 | j=c->num; | ||
431 | i=j>>2; | ||
432 | #ifdef PURIFY | ||
433 | if ((j&0x03) == 0) p[i]=0; | ||
434 | #endif | ||
435 | l=p[i]; | ||
436 | M_p_c2nl(cp,l,j&0x03); | ||
437 | p[i]=l; | ||
438 | i++; | ||
439 | /* i is the next 'undefined word' */ | ||
440 | if (c->num >= SHA_LAST_BLOCK) | ||
441 | { | ||
442 | for (; i<SHA_LBLOCK; i++) | ||
443 | p[i]=0; | ||
444 | sha1_block(c,p,64); | ||
445 | i=0; | ||
446 | } | ||
447 | for (; i<(SHA_LBLOCK-2); i++) | ||
448 | p[i]=0; | ||
449 | p[SHA_LBLOCK-2]=c->Nh; | ||
450 | p[SHA_LBLOCK-1]=c->Nl; | ||
451 | #if defined(L_ENDIAN) && defined(SHA1_ASM) | ||
452 | Endian_Reverse32(p[SHA_LBLOCK-2]); | ||
453 | Endian_Reverse32(p[SHA_LBLOCK-1]); | ||
454 | #endif | ||
455 | sha1_block(c,p,64); | ||
456 | cp=md; | ||
457 | l=c->h0; nl2c(l,cp); | ||
458 | l=c->h1; nl2c(l,cp); | ||
459 | l=c->h2; nl2c(l,cp); | ||
460 | l=c->h3; nl2c(l,cp); | ||
461 | l=c->h4; nl2c(l,cp); | ||
462 | |||
463 | /* clear stuff, sha1_block may be leaving some stuff on the stack | ||
464 | * but I'm not worried :-) */ | ||
465 | c->num=0; | ||
466 | /* memset((char *)&c,0,sizeof(c));*/ | ||
467 | } | ||
468 | |||
diff --git a/src/lib/libcrypto/sha/sha_locl.h b/src/lib/libcrypto/sha/sha_locl.h new file mode 100644 index 0000000000..2814ad15fa --- /dev/null +++ b/src/lib/libcrypto/sha/sha_locl.h | |||
@@ -0,0 +1,246 @@ | |||
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 | #ifdef undef | ||
63 | /* one or the other needs to be defined */ | ||
64 | #ifndef SHA_1 /* FIPE 180-1 */ | ||
65 | #define SHA_0 /* FIPS 180 */ | ||
66 | #endif | ||
67 | #endif | ||
68 | |||
69 | #define ULONG unsigned long | ||
70 | #define UCHAR unsigned char | ||
71 | #define UINT unsigned int | ||
72 | |||
73 | #ifdef NOCONST | ||
74 | #define const | ||
75 | #endif | ||
76 | |||
77 | #undef c2nl | ||
78 | #define c2nl(c,l) (l =(((unsigned long)(*((c)++)))<<24), \ | ||
79 | l|=(((unsigned long)(*((c)++)))<<16), \ | ||
80 | l|=(((unsigned long)(*((c)++)))<< 8), \ | ||
81 | l|=(((unsigned long)(*((c)++))) )) | ||
82 | |||
83 | #undef p_c2nl | ||
84 | #define p_c2nl(c,l,n) { \ | ||
85 | switch (n) { \ | ||
86 | case 0: l =((unsigned long)(*((c)++)))<<24; \ | ||
87 | case 1: l|=((unsigned long)(*((c)++)))<<16; \ | ||
88 | case 2: l|=((unsigned long)(*((c)++)))<< 8; \ | ||
89 | case 3: l|=((unsigned long)(*((c)++))); \ | ||
90 | } \ | ||
91 | } | ||
92 | |||
93 | #undef c2nl_p | ||
94 | /* NOTE the pointer is not incremented at the end of this */ | ||
95 | #define c2nl_p(c,l,n) { \ | ||
96 | l=0; \ | ||
97 | (c)+=n; \ | ||
98 | switch (n) { \ | ||
99 | case 3: l =((unsigned long)(*(--(c))))<< 8; \ | ||
100 | case 2: l|=((unsigned long)(*(--(c))))<<16; \ | ||
101 | case 1: l|=((unsigned long)(*(--(c))))<<24; \ | ||
102 | } \ | ||
103 | } | ||
104 | |||
105 | #undef p_c2nl_p | ||
106 | #define p_c2nl_p(c,l,sc,len) { \ | ||
107 | switch (sc) \ | ||
108 | { \ | ||
109 | case 0: l =((unsigned long)(*((c)++)))<<24; \ | ||
110 | if (--len == 0) break; \ | ||
111 | case 1: l|=((unsigned long)(*((c)++)))<<16; \ | ||
112 | if (--len == 0) break; \ | ||
113 | case 2: l|=((unsigned long)(*((c)++)))<< 8; \ | ||
114 | } \ | ||
115 | } | ||
116 | |||
117 | #undef nl2c | ||
118 | #define nl2c(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \ | ||
119 | *((c)++)=(unsigned char)(((l)>>16)&0xff), \ | ||
120 | *((c)++)=(unsigned char)(((l)>> 8)&0xff), \ | ||
121 | *((c)++)=(unsigned char)(((l) )&0xff)) | ||
122 | |||
123 | #undef c2l | ||
124 | #define c2l(c,l) (l =(((unsigned long)(*((c)++))) ), \ | ||
125 | l|=(((unsigned long)(*((c)++)))<< 8), \ | ||
126 | l|=(((unsigned long)(*((c)++)))<<16), \ | ||
127 | l|=(((unsigned long)(*((c)++)))<<24)) | ||
128 | |||
129 | #undef p_c2l | ||
130 | #define p_c2l(c,l,n) { \ | ||
131 | switch (n) { \ | ||
132 | case 0: l =((unsigned long)(*((c)++))); \ | ||
133 | case 1: l|=((unsigned long)(*((c)++)))<< 8; \ | ||
134 | case 2: l|=((unsigned long)(*((c)++)))<<16; \ | ||
135 | case 3: l|=((unsigned long)(*((c)++)))<<24; \ | ||
136 | } \ | ||
137 | } | ||
138 | |||
139 | #undef c2l_p | ||
140 | /* NOTE the pointer is not incremented at the end of this */ | ||
141 | #define c2l_p(c,l,n) { \ | ||
142 | l=0; \ | ||
143 | (c)+=n; \ | ||
144 | switch (n) { \ | ||
145 | case 3: l =((unsigned long)(*(--(c))))<<16; \ | ||
146 | case 2: l|=((unsigned long)(*(--(c))))<< 8; \ | ||
147 | case 1: l|=((unsigned long)(*(--(c)))); \ | ||
148 | } \ | ||
149 | } | ||
150 | |||
151 | #undef p_c2l_p | ||
152 | #define p_c2l_p(c,l,sc,len) { \ | ||
153 | switch (sc) \ | ||
154 | { \ | ||
155 | case 0: l =((unsigned long)(*((c)++))); \ | ||
156 | if (--len == 0) break; \ | ||
157 | case 1: l|=((unsigned long)(*((c)++)))<< 8; \ | ||
158 | if (--len == 0) break; \ | ||
159 | case 2: l|=((unsigned long)(*((c)++)))<<16; \ | ||
160 | } \ | ||
161 | } | ||
162 | |||
163 | #undef l2c | ||
164 | #define l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \ | ||
165 | *((c)++)=(unsigned char)(((l)>> 8)&0xff), \ | ||
166 | *((c)++)=(unsigned char)(((l)>>16)&0xff), \ | ||
167 | *((c)++)=(unsigned char)(((l)>>24)&0xff)) | ||
168 | |||
169 | #undef ROTATE | ||
170 | #if defined(WIN32) | ||
171 | #define ROTATE(a,n) _lrotl(a,n) | ||
172 | #else | ||
173 | #define ROTATE(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n)))) | ||
174 | #endif | ||
175 | |||
176 | /* A nice byte order reversal from Wei Dai <weidai@eskimo.com> */ | ||
177 | #if defined(WIN32) | ||
178 | /* 5 instructions with rotate instruction, else 9 */ | ||
179 | #define Endian_Reverse32(a) \ | ||
180 | { \ | ||
181 | unsigned long l=(a); \ | ||
182 | (a)=((ROTATE(l,8)&0x00FF00FF)|(ROTATE(l,24)&0xFF00FF00)); \ | ||
183 | } | ||
184 | #else | ||
185 | /* 6 instructions with rotate instruction, else 8 */ | ||
186 | #define Endian_Reverse32(a) \ | ||
187 | { \ | ||
188 | unsigned long l=(a); \ | ||
189 | l=(((l&0xFF00FF00)>>8L)|((l&0x00FF00FF)<<8L)); \ | ||
190 | (a)=ROTATE(l,16L); \ | ||
191 | } | ||
192 | #endif | ||
193 | |||
194 | /* As pointed out by Wei Dai <weidai@eskimo.com>, F() below can be | ||
195 | * simplified to the code in F_00_19. Wei attributes these optimisations | ||
196 | * to Peter Gutmann's SHS code, and he attributes it to Rich Schroeppel. | ||
197 | * #define F(x,y,z) (((x) & (y)) | ((~(x)) & (z))) | ||
198 | * I've just become aware of another tweak to be made, again from Wei Dai, | ||
199 | * in F_40_59, (x&a)|(y&a) -> (x|y)&a | ||
200 | */ | ||
201 | #define F_00_19(b,c,d) ((((c) ^ (d)) & (b)) ^ (d)) | ||
202 | #define F_20_39(b,c,d) ((b) ^ (c) ^ (d)) | ||
203 | #define F_40_59(b,c,d) (((b) & (c)) | (((b)|(c)) & (d))) | ||
204 | #define F_60_79(b,c,d) F_20_39(b,c,d) | ||
205 | |||
206 | #ifdef SHA_0 | ||
207 | #undef Xupdate | ||
208 | #define Xupdate(a,i,ia,ib,ic,id) X[(i)&0x0f]=(a)=\ | ||
209 | (ia[(i)&0x0f]^ib[((i)+2)&0x0f]^ic[((i)+8)&0x0f]^id[((i)+13)&0x0f]); | ||
210 | #endif | ||
211 | #ifdef SHA_1 | ||
212 | #undef Xupdate | ||
213 | #define Xupdate(a,i,ia,ib,ic,id) (a)=\ | ||
214 | (ia[(i)&0x0f]^ib[((i)+2)&0x0f]^ic[((i)+8)&0x0f]^id[((i)+13)&0x0f]);\ | ||
215 | X[(i)&0x0f]=(a)=ROTATE((a),1); | ||
216 | #endif | ||
217 | |||
218 | #define BODY_00_15(i,a,b,c,d,e,f,xa) \ | ||
219 | (f)=xa[i]+(e)+K_00_19+ROTATE((a),5)+F_00_19((b),(c),(d)); \ | ||
220 | (b)=ROTATE((b),30); | ||
221 | |||
222 | #define BODY_16_19(i,a,b,c,d,e,f,xa,xb,xc,xd) \ | ||
223 | Xupdate(f,i,xa,xb,xc,xd); \ | ||
224 | (f)+=(e)+K_00_19+ROTATE((a),5)+F_00_19((b),(c),(d)); \ | ||
225 | (b)=ROTATE((b),30); | ||
226 | |||
227 | #define BODY_20_31(i,a,b,c,d,e,f,xa,xb,xc,xd) \ | ||
228 | Xupdate(f,i,xa,xb,xc,xd); \ | ||
229 | (f)+=(e)+K_20_39+ROTATE((a),5)+F_20_39((b),(c),(d)); \ | ||
230 | (b)=ROTATE((b),30); | ||
231 | |||
232 | #define BODY_32_39(i,a,b,c,d,e,f,xa) \ | ||
233 | Xupdate(f,i,xa,xa,xa,xa); \ | ||
234 | (f)+=(e)+K_20_39+ROTATE((a),5)+F_20_39((b),(c),(d)); \ | ||
235 | (b)=ROTATE((b),30); | ||
236 | |||
237 | #define BODY_40_59(i,a,b,c,d,e,f,xa) \ | ||
238 | Xupdate(f,i,xa,xa,xa,xa); \ | ||
239 | (f)+=(e)+K_40_59+ROTATE((a),5)+F_40_59((b),(c),(d)); \ | ||
240 | (b)=ROTATE((b),30); | ||
241 | |||
242 | #define BODY_60_79(i,a,b,c,d,e,f,xa) \ | ||
243 | Xupdate(f,i,xa,xa,xa,xa); \ | ||
244 | (f)=X[(i)&0x0f]+(e)+K_60_79+ROTATE((a),5)+F_60_79((b),(c),(d)); \ | ||
245 | (b)=ROTATE((b),30); | ||
246 | |||