diff options
| author | markus <> | 2002-09-05 12:51:50 +0000 |
|---|---|---|
| committer | markus <> | 2002-09-05 12:51:50 +0000 |
| commit | 15b5d84f9da2ce4bfae8580e56e34a859f74ad71 (patch) | |
| tree | bf939e82d7fd73cc8a01cf6959002209972091bc /src/lib/libcrypto/sha/asm | |
| parent | 027351f729b9e837200dae6e1520cda6577ab930 (diff) | |
| download | openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.tar.gz openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.tar.bz2 openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.zip | |
import openssl-0.9.7-beta1
Diffstat (limited to 'src/lib/libcrypto/sha/asm')
| -rw-r--r-- | src/lib/libcrypto/sha/asm/sha1-586.pl | 115 |
1 files changed, 82 insertions, 33 deletions
diff --git a/src/lib/libcrypto/sha/asm/sha1-586.pl b/src/lib/libcrypto/sha/asm/sha1-586.pl index d6d998f8ee..fe51fd0794 100644 --- a/src/lib/libcrypto/sha/asm/sha1-586.pl +++ b/src/lib/libcrypto/sha/asm/sha1-586.pl | |||
| @@ -1,15 +1,15 @@ | |||
| 1 | #!/usr/bin/perl | 1 | #!/usr/local/bin/perl |
| 2 | 2 | ||
| 3 | $normal=0; | 3 | $normal=0; |
| 4 | 4 | ||
| 5 | push(@INC,"perlasm","../../perlasm"); | 5 | push(@INC,"perlasm","../../perlasm"); |
| 6 | require "x86asm.pl"; | 6 | require "x86asm.pl"; |
| 7 | 7 | ||
| 8 | &asm_init($ARGV[0],"sha1-586.pl"); | 8 | &asm_init($ARGV[0],"sha1-586.pl",$ARGV[$#ARGV] eq "386"); |
| 9 | 9 | ||
| 10 | $A="eax"; | 10 | $A="eax"; |
| 11 | $B="ebx"; | 11 | $B="ecx"; |
| 12 | $C="ecx"; | 12 | $C="ebx"; |
| 13 | $D="edx"; | 13 | $D="edx"; |
| 14 | $E="edi"; | 14 | $E="edi"; |
| 15 | $T="esi"; | 15 | $T="esi"; |
| @@ -19,7 +19,7 @@ $off=9*4; | |||
| 19 | 19 | ||
| 20 | @K=(0x5a827999,0x6ed9eba1,0x8f1bbcdc,0xca62c1d6); | 20 | @K=(0x5a827999,0x6ed9eba1,0x8f1bbcdc,0xca62c1d6); |
| 21 | 21 | ||
| 22 | &sha1_block("sha1_block_x86"); | 22 | &sha1_block_data("sha1_block_asm_data_order"); |
| 23 | 23 | ||
| 24 | &asm_finish(); | 24 | &asm_finish(); |
| 25 | 25 | ||
| @@ -53,11 +53,14 @@ sub X_expand | |||
| 53 | local($in)=@_; | 53 | local($in)=@_; |
| 54 | 54 | ||
| 55 | &comment("First, load the words onto the stack in network byte order"); | 55 | &comment("First, load the words onto the stack in network byte order"); |
| 56 | for ($i=0; $i<16; $i++) | 56 | for ($i=0; $i<16; $i+=2) |
| 57 | { | 57 | { |
| 58 | &mov("eax",&DWP(($i+0)*4,$in,"",0)) unless $i == 0; | 58 | &mov($A,&DWP(($i+0)*4,$in,"",0));# unless $i == 0; |
| 59 | &bswap("eax"); | 59 | &mov($B,&DWP(($i+1)*4,$in,"",0)); |
| 60 | &mov(&swtmp($i+0),"eax"); | 60 | &bswap($A); |
| 61 | &bswap($B); | ||
| 62 | &mov(&swtmp($i+0),$A); | ||
| 63 | &mov(&swtmp($i+1),$B); | ||
| 61 | } | 64 | } |
| 62 | 65 | ||
| 63 | &comment("We now have the X array on the stack"); | 66 | &comment("We now have the X array on the stack"); |
| @@ -312,9 +315,9 @@ sub BODY_60_79 | |||
| 312 | &BODY_20_39(@_); | 315 | &BODY_20_39(@_); |
| 313 | } | 316 | } |
| 314 | 317 | ||
| 315 | sub sha1_block | 318 | sub sha1_block_host |
| 316 | { | 319 | { |
| 317 | local($name)=@_; | 320 | local($name, $sclabel)=@_; |
| 318 | 321 | ||
| 319 | &function_begin_B($name,""); | 322 | &function_begin_B($name,""); |
| 320 | 323 | ||
| @@ -325,35 +328,77 @@ sub sha1_block | |||
| 325 | # D 12 | 328 | # D 12 |
| 326 | # E 16 | 329 | # E 16 |
| 327 | 330 | ||
| 328 | &push("esi"); | 331 | &mov("ecx", &wparam(2)); |
| 329 | &push("ebp"); | 332 | &push("esi"); |
| 330 | &mov("eax", &wparam(2)); | 333 | &shl("ecx",6); |
| 331 | &mov("esi", &wparam(1)); | 334 | &mov("esi", &wparam(1)); |
| 332 | &add("eax", "esi"); # offset to leave on | 335 | &push("ebp"); |
| 336 | &add("ecx","esi"); # offset to leave on | ||
| 337 | &push("ebx"); | ||
| 333 | &mov("ebp", &wparam(0)); | 338 | &mov("ebp", &wparam(0)); |
| 339 | &push("edi"); | ||
| 340 | &mov($D, &DWP(12,"ebp","",0)); | ||
| 341 | &stack_push(18+9); | ||
| 342 | &mov($E, &DWP(16,"ebp","",0)); | ||
| 343 | &mov($C, &DWP( 8,"ebp","",0)); | ||
| 344 | &mov(&swtmp(17),"ecx"); | ||
| 345 | |||
| 346 | &comment("First we need to setup the X array"); | ||
| 347 | |||
| 348 | for ($i=0; $i<16; $i+=2) | ||
| 349 | { | ||
| 350 | &mov($A,&DWP(($i+0)*4,"esi","",0));# unless $i == 0; | ||
| 351 | &mov($B,&DWP(($i+1)*4,"esi","",0)); | ||
| 352 | &mov(&swtmp($i+0),$A); | ||
| 353 | &mov(&swtmp($i+1),$B); | ||
| 354 | } | ||
| 355 | &jmp($sclabel); | ||
| 356 | &function_end_B($name); | ||
| 357 | } | ||
| 358 | |||
| 359 | |||
| 360 | sub sha1_block_data | ||
| 361 | { | ||
| 362 | local($name)=@_; | ||
| 363 | |||
| 364 | &function_begin_B($name,""); | ||
| 365 | |||
| 366 | # parameter 1 is the MD5_CTX structure. | ||
| 367 | # A 0 | ||
| 368 | # B 4 | ||
| 369 | # C 8 | ||
| 370 | # D 12 | ||
| 371 | # E 16 | ||
| 372 | |||
| 373 | &mov("ecx", &wparam(2)); | ||
| 374 | &push("esi"); | ||
| 375 | &shl("ecx",6); | ||
| 376 | &mov("esi", &wparam(1)); | ||
| 377 | &push("ebp"); | ||
| 378 | &add("ecx","esi"); # offset to leave on | ||
| 334 | &push("ebx"); | 379 | &push("ebx"); |
| 335 | &sub("eax", 64); | 380 | &mov("ebp", &wparam(0)); |
| 336 | &push("edi"); | 381 | &push("edi"); |
| 337 | &mov($B, &DWP( 4,"ebp","",0)); | ||
| 338 | &stack_push(18); | ||
| 339 | &mov($D, &DWP(12,"ebp","",0)); | 382 | &mov($D, &DWP(12,"ebp","",0)); |
| 340 | &mov($E, &DWP(16,"ebp","",0)); | 383 | &stack_push(18+9); |
| 341 | &mov($C, &DWP( 8,"ebp","",0)); | 384 | &mov($E, &DWP(16,"ebp","",0)); |
| 342 | &mov(&swtmp(17),"eax"); | 385 | &mov($C, &DWP( 8,"ebp","",0)); |
| 386 | &mov(&swtmp(17),"ecx"); | ||
| 343 | 387 | ||
| 344 | &comment("First we need to setup the X array"); | 388 | &comment("First we need to setup the X array"); |
| 345 | &mov("eax",&DWP(0,"esi","",0)); # pulled out of X_expand | ||
| 346 | 389 | ||
| 347 | &set_label("start") unless $normal; | 390 | &set_label("start") unless $normal; |
| 348 | 391 | ||
| 349 | &X_expand("esi"); | 392 | &X_expand("esi"); |
| 350 | &mov(&swtmp(16),"esi"); | 393 | &mov(&wparam(1),"esi"); |
| 351 | 394 | ||
| 395 | &set_label("shortcut", 0, 1); | ||
| 352 | &comment(""); | 396 | &comment(""); |
| 353 | &comment("Start processing"); | 397 | &comment("Start processing"); |
| 354 | 398 | ||
| 355 | # odd start | 399 | # odd start |
| 356 | &mov($A, &DWP( 0,"ebp","",0)); | 400 | &mov($A, &DWP( 0,"ebp","",0)); |
| 401 | &mov($B, &DWP( 4,"ebp","",0)); | ||
| 357 | $X="esp"; | 402 | $X="esp"; |
| 358 | &BODY_00_15(-2,$K[0],$X, 0,$A,$B,$C,$D,$E,$T); | 403 | &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); | 404 | &BODY_00_15( 0,$K[0],$X, 1,$T,$A,$B,$C,$D,$E); |
| @@ -468,24 +513,28 @@ sub sha1_block | |||
| 468 | &add($C,$T); | 513 | &add($C,$T); |
| 469 | 514 | ||
| 470 | &mov(&DWP( 0,$tmp1,"",0),$A); | 515 | &mov(&DWP( 0,$tmp1,"",0),$A); |
| 471 | &mov("esi",&swtmp(16)); | 516 | &mov("esi",&wparam(1)); |
| 472 | &mov(&DWP( 8,$tmp1,"",0),$C); # This is for looping | 517 | &mov(&DWP( 8,$tmp1,"",0),$C); |
| 473 | &add("esi",64); | 518 | &add("esi",64); |
| 474 | &mov("eax",&swtmp(17)); | 519 | &mov("eax",&swtmp(17)); |
| 475 | &mov(&DWP(16,$tmp1,"",0),$E); | 520 | &mov(&DWP(16,$tmp1,"",0),$E); |
| 476 | &cmp("eax","esi"); | 521 | &cmp("esi","eax"); |
| 477 | &mov(&DWP( 4,$tmp1,"",0),$B); # This is for looping | 522 | &mov(&DWP( 4,$tmp1,"",0),$B); |
| 478 | &jl(&label("end")); | 523 | &jl(&label("start")); |
| 479 | &mov("eax",&DWP(0,"esi","",0)); # Pulled down from | 524 | |
| 480 | &jmp(&label("start")); | 525 | &stack_pop(18+9); |
| 481 | |||
| 482 | &set_label("end"); | ||
| 483 | &stack_pop(18); | ||
| 484 | &pop("edi"); | 526 | &pop("edi"); |
| 485 | &pop("ebx"); | 527 | &pop("ebx"); |
| 486 | &pop("ebp"); | 528 | &pop("ebp"); |
| 487 | &pop("esi"); | 529 | &pop("esi"); |
| 488 | &ret(); | 530 | &ret(); |
| 531 | |||
| 532 | # keep a note of shortcut label so it can be used outside | ||
| 533 | # block. | ||
| 534 | my $sclabel = &label("shortcut"); | ||
| 535 | |||
| 489 | &function_end_B($name); | 536 | &function_end_B($name); |
| 537 | # Putting this here avoids problems with MASM in debugging mode | ||
| 538 | &sha1_block_host("sha1_block_asm_host_order", $sclabel); | ||
| 490 | } | 539 | } |
| 491 | 540 | ||
