1# salsa20_pm.s version 20051229 2# D. J. Bernstein 3# Public domain. 4 5# enter ECRYPT_encrypt_bytes 6.text 7.p2align 5 8.globl ECRYPT_encrypt_bytes 9ECRYPT_encrypt_bytes: 10 mov %esp,%eax 11 and $31,%eax 12 add $256,%eax 13 sub %eax,%esp 14 # eax_stack = eax 15 movl %eax,80(%esp) 16 # ebx_stack = ebx 17 movl %ebx,84(%esp) 18 # esi_stack = esi 19 movl %esi,88(%esp) 20 # edi_stack = edi 21 movl %edi,92(%esp) 22 # ebp_stack = ebp 23 movl %ebp,96(%esp) 24 # x = arg1 25 movl 4(%esp,%eax),%edx 26 # m = arg2 27 movl 8(%esp,%eax),%esi 28 # out = arg3 29 movl 12(%esp,%eax),%edi 30 # bytes = arg4 31 movl 16(%esp,%eax),%ebx 32 # bytes -= 0 33 sub $0,%ebx 34 # goto done if unsigned<= 35 jbe ._done 36._start: 37 # in0 = *(uint32 *) (x + 0) 38 movl 0(%edx),%eax 39 # in1 = *(uint32 *) (x + 4) 40 movl 4(%edx),%ecx 41 # in2 = *(uint32 *) (x + 8) 42 movl 8(%edx),%ebp 43 # j0 = in0 44 movl %eax,164(%esp) 45 # in3 = *(uint32 *) (x + 12) 46 movl 12(%edx),%eax 47 # j1 = in1 48 movl %ecx,168(%esp) 49 # in4 = *(uint32 *) (x + 16) 50 movl 16(%edx),%ecx 51 # j2 = in2 52 movl %ebp,172(%esp) 53 # in5 = *(uint32 *) (x + 20) 54 movl 20(%edx),%ebp 55 # j3 = in3 56 movl %eax,176(%esp) 57 # in6 = *(uint32 *) (x + 24) 58 movl 24(%edx),%eax 59 # j4 = in4 60 movl %ecx,180(%esp) 61 # in7 = *(uint32 *) (x + 28) 62 movl 28(%edx),%ecx 63 # j5 = in5 64 movl %ebp,184(%esp) 65 # in8 = *(uint32 *) (x + 32) 66 movl 32(%edx),%ebp 67 # j6 = in6 68 movl %eax,188(%esp) 69 # in9 = *(uint32 *) (x + 36) 70 movl 36(%edx),%eax 71 # j7 = in7 72 movl %ecx,192(%esp) 73 # in10 = *(uint32 *) (x + 40) 74 movl 40(%edx),%ecx 75 # j8 = in8 76 movl %ebp,196(%esp) 77 # in11 = *(uint32 *) (x + 44) 78 movl 44(%edx),%ebp 79 # j9 = in9 80 movl %eax,200(%esp) 81 # in12 = *(uint32 *) (x + 48) 82 movl 48(%edx),%eax 83 # j10 = in10 84 movl %ecx,204(%esp) 85 # in13 = *(uint32 *) (x + 52) 86 movl 52(%edx),%ecx 87 # j11 = in11 88 movl %ebp,208(%esp) 89 # in14 = *(uint32 *) (x + 56) 90 movl 56(%edx),%ebp 91 # j12 = in12 92 movl %eax,212(%esp) 93 # in15 = *(uint32 *) (x + 60) 94 movl 60(%edx),%eax 95 # j13 = in13 96 movl %ecx,216(%esp) 97 # j14 = in14 98 movl %ebp,220(%esp) 99 # j15 = in15 100 movl %eax,224(%esp) 101 # x_backup = x 102 movl %edx,64(%esp) 103._bytesatleast1: 104 # bytes - 64 105 cmp $64,%ebx 106 # goto nocopy if unsigned>= 107 jae ._nocopy 108 # ctarget = out 109 movl %edi,228(%esp) 110 # out = &tmp 111 leal 0(%esp),%edi 112 # i = bytes 113 mov %ebx,%ecx 114 # while (i) { *out++ = *m++; --i } 115 rep movsb 116 # out = &tmp 117 leal 0(%esp),%edi 118 # m = &tmp 119 leal 0(%esp),%esi 120._nocopy: 121 # out_backup = out 122 movl %edi,72(%esp) 123 # m_backup = m 124 movl %esi,68(%esp) 125 # bytes_backup = bytes 126 movl %ebx,76(%esp) 127 # in0 = j0 128 movl 164(%esp),%eax 129 # in1 = j1 130 movl 168(%esp),%ecx 131 # in2 = j2 132 movl 172(%esp),%edx 133 # in3 = j3 134 movl 176(%esp),%ebx 135 # x0 = in0 136 movl %eax,100(%esp) 137 # x1 = in1 138 movl %ecx,104(%esp) 139 # x2 = in2 140 movl %edx,108(%esp) 141 # x3 = in3 142 movl %ebx,112(%esp) 143 # in4 = j4 144 movl 180(%esp),%eax 145 # in5 = j5 146 movl 184(%esp),%ecx 147 # in6 = j6 148 movl 188(%esp),%edx 149 # in7 = j7 150 movl 192(%esp),%ebx 151 # x4 = in4 152 movl %eax,116(%esp) 153 # x5 = in5 154 movl %ecx,120(%esp) 155 # x6 = in6 156 movl %edx,124(%esp) 157 # x7 = in7 158 movl %ebx,128(%esp) 159 # in8 = j8 160 movl 196(%esp),%eax 161 # in9 = j9 162 movl 200(%esp),%ecx 163 # in10 = j10 164 movl 204(%esp),%edx 165 # in11 = j11 166 movl 208(%esp),%ebx 167 # x8 = in8 168 movl %eax,132(%esp) 169 # x9 = in9 170 movl %ecx,136(%esp) 171 # x10 = in10 172 movl %edx,140(%esp) 173 # x11 = in11 174 movl %ebx,144(%esp) 175 # in12 = j12 176 movl 212(%esp),%eax 177 # in13 = j13 178 movl 216(%esp),%ecx 179 # in14 = j14 180 movl 220(%esp),%edx 181 # in15 = j15 182 movl 224(%esp),%ebx 183 # x12 = in12 184 movl %eax,148(%esp) 185 # x13 = in13 186 movl %ecx,152(%esp) 187 # x14 = in14 188 movl %edx,156(%esp) 189 # x15 = in15 190 movl %ebx,160(%esp) 191 # i = 20 192 mov $20,%ebp 193 # p = x0 194 movl 100(%esp),%eax 195 # s = x5 196 movl 120(%esp),%ecx 197 # t = x10 198 movl 140(%esp),%edx 199 # w = x15 200 movl 160(%esp),%ebx 201._mainloop: 202 # x0 = p 203 movl %eax,100(%esp) 204 # x10 = t 205 movl %edx,140(%esp) 206 # p += x12 207 addl 148(%esp),%eax 208 # x5 = s 209 movl %ecx,120(%esp) 210 # t += x6 211 addl 124(%esp),%edx 212 # x15 = w 213 movl %ebx,160(%esp) 214 # r = x1 215 movl 104(%esp),%esi 216 # r += s 217 add %ecx,%esi 218 # v = x11 219 movl 144(%esp),%edi 220 # v += w 221 add %ebx,%edi 222 # p <<<= 7 223 rol $7,%eax 224 # p ^= x4 225 xorl 116(%esp),%eax 226 # t <<<= 7 227 rol $7,%edx 228 # t ^= x14 229 xorl 156(%esp),%edx 230 # r <<<= 7 231 rol $7,%esi 232 # r ^= x9 233 xorl 136(%esp),%esi 234 # v <<<= 7 235 rol $7,%edi 236 # v ^= x3 237 xorl 112(%esp),%edi 238 # x4 = p 239 movl %eax,116(%esp) 240 # x14 = t 241 movl %edx,156(%esp) 242 # p += x0 243 addl 100(%esp),%eax 244 # x9 = r 245 movl %esi,136(%esp) 246 # t += x10 247 addl 140(%esp),%edx 248 # x3 = v 249 movl %edi,112(%esp) 250 # p <<<= 9 251 rol $9,%eax 252 # p ^= x8 253 xorl 132(%esp),%eax 254 # t <<<= 9 255 rol $9,%edx 256 # t ^= x2 257 xorl 108(%esp),%edx 258 # s += r 259 add %esi,%ecx 260 # s <<<= 9 261 rol $9,%ecx 262 # s ^= x13 263 xorl 152(%esp),%ecx 264 # w += v 265 add %edi,%ebx 266 # w <<<= 9 267 rol $9,%ebx 268 # w ^= x7 269 xorl 128(%esp),%ebx 270 # x8 = p 271 movl %eax,132(%esp) 272 # x2 = t 273 movl %edx,108(%esp) 274 # p += x4 275 addl 116(%esp),%eax 276 # x13 = s 277 movl %ecx,152(%esp) 278 # t += x14 279 addl 156(%esp),%edx 280 # x7 = w 281 movl %ebx,128(%esp) 282 # p <<<= 13 283 rol $13,%eax 284 # p ^= x12 285 xorl 148(%esp),%eax 286 # t <<<= 13 287 rol $13,%edx 288 # t ^= x6 289 xorl 124(%esp),%edx 290 # r += s 291 add %ecx,%esi 292 # r <<<= 13 293 rol $13,%esi 294 # r ^= x1 295 xorl 104(%esp),%esi 296 # v += w 297 add %ebx,%edi 298 # v <<<= 13 299 rol $13,%edi 300 # v ^= x11 301 xorl 144(%esp),%edi 302 # x12 = p 303 movl %eax,148(%esp) 304 # x6 = t 305 movl %edx,124(%esp) 306 # p += x8 307 addl 132(%esp),%eax 308 # x1 = r 309 movl %esi,104(%esp) 310 # t += x2 311 addl 108(%esp),%edx 312 # x11 = v 313 movl %edi,144(%esp) 314 # p <<<= 18 315 rol $18,%eax 316 # p ^= x0 317 xorl 100(%esp),%eax 318 # t <<<= 18 319 rol $18,%edx 320 # t ^= x10 321 xorl 140(%esp),%edx 322 # s += r 323 add %esi,%ecx 324 # s <<<= 18 325 rol $18,%ecx 326 # s ^= x5 327 xorl 120(%esp),%ecx 328 # w += v 329 add %edi,%ebx 330 # w <<<= 18 331 rol $18,%ebx 332 # w ^= x15 333 xorl 160(%esp),%ebx 334 # x0 = p 335 movl %eax,100(%esp) 336 # x10 = t 337 movl %edx,140(%esp) 338 # p += x3 339 addl 112(%esp),%eax 340 # p <<<= 7 341 rol $7,%eax 342 # x5 = s 343 movl %ecx,120(%esp) 344 # t += x9 345 addl 136(%esp),%edx 346 # x15 = w 347 movl %ebx,160(%esp) 348 # r = x4 349 movl 116(%esp),%esi 350 # r += s 351 add %ecx,%esi 352 # v = x14 353 movl 156(%esp),%edi 354 # v += w 355 add %ebx,%edi 356 # p ^= x1 357 xorl 104(%esp),%eax 358 # t <<<= 7 359 rol $7,%edx 360 # t ^= x11 361 xorl 144(%esp),%edx 362 # r <<<= 7 363 rol $7,%esi 364 # r ^= x6 365 xorl 124(%esp),%esi 366 # v <<<= 7 367 rol $7,%edi 368 # v ^= x12 369 xorl 148(%esp),%edi 370 # x1 = p 371 movl %eax,104(%esp) 372 # x11 = t 373 movl %edx,144(%esp) 374 # p += x0 375 addl 100(%esp),%eax 376 # x6 = r 377 movl %esi,124(%esp) 378 # t += x10 379 addl 140(%esp),%edx 380 # x12 = v 381 movl %edi,148(%esp) 382 # p <<<= 9 383 rol $9,%eax 384 # p ^= x2 385 xorl 108(%esp),%eax 386 # t <<<= 9 387 rol $9,%edx 388 # t ^= x8 389 xorl 132(%esp),%edx 390 # s += r 391 add %esi,%ecx 392 # s <<<= 9 393 rol $9,%ecx 394 # s ^= x7 395 xorl 128(%esp),%ecx 396 # w += v 397 add %edi,%ebx 398 # w <<<= 9 399 rol $9,%ebx 400 # w ^= x13 401 xorl 152(%esp),%ebx 402 # x2 = p 403 movl %eax,108(%esp) 404 # x8 = t 405 movl %edx,132(%esp) 406 # p += x1 407 addl 104(%esp),%eax 408 # x7 = s 409 movl %ecx,128(%esp) 410 # t += x11 411 addl 144(%esp),%edx 412 # x13 = w 413 movl %ebx,152(%esp) 414 # p <<<= 13 415 rol $13,%eax 416 # p ^= x3 417 xorl 112(%esp),%eax 418 # t <<<= 13 419 rol $13,%edx 420 # t ^= x9 421 xorl 136(%esp),%edx 422 # r += s 423 add %ecx,%esi 424 # r <<<= 13 425 rol $13,%esi 426 # r ^= x4 427 xorl 116(%esp),%esi 428 # v += w 429 add %ebx,%edi 430 # v <<<= 13 431 rol $13,%edi 432 # v ^= x14 433 xorl 156(%esp),%edi 434 # x3 = p 435 movl %eax,112(%esp) 436 # x9 = t 437 movl %edx,136(%esp) 438 # p += x2 439 addl 108(%esp),%eax 440 # x4 = r 441 movl %esi,116(%esp) 442 # t += x8 443 addl 132(%esp),%edx 444 # x14 = v 445 movl %edi,156(%esp) 446 # p <<<= 18 447 rol $18,%eax 448 # p ^= x0 449 xorl 100(%esp),%eax 450 # t <<<= 18 451 rol $18,%edx 452 # t ^= x10 453 xorl 140(%esp),%edx 454 # s += r 455 add %esi,%ecx 456 # s <<<= 18 457 rol $18,%ecx 458 # s ^= x5 459 xorl 120(%esp),%ecx 460 # w += v 461 add %edi,%ebx 462 # w <<<= 18 463 rol $18,%ebx 464 # w ^= x15 465 xorl 160(%esp),%ebx 466 # x0 = p 467 movl %eax,100(%esp) 468 # x10 = t 469 movl %edx,140(%esp) 470 # p += x12 471 addl 148(%esp),%eax 472 # x5 = s 473 movl %ecx,120(%esp) 474 # t += x6 475 addl 124(%esp),%edx 476 # x15 = w 477 movl %ebx,160(%esp) 478 # r = x1 479 movl 104(%esp),%esi 480 # r += s 481 add %ecx,%esi 482 # v = x11 483 movl 144(%esp),%edi 484 # v += w 485 add %ebx,%edi 486 # p <<<= 7 487 rol $7,%eax 488 # p ^= x4 489 xorl 116(%esp),%eax 490 # t <<<= 7 491 rol $7,%edx 492 # t ^= x14 493 xorl 156(%esp),%edx 494 # r <<<= 7 495 rol $7,%esi 496 # r ^= x9 497 xorl 136(%esp),%esi 498 # v <<<= 7 499 rol $7,%edi 500 # v ^= x3 501 xorl 112(%esp),%edi 502 # x4 = p 503 movl %eax,116(%esp) 504 # x14 = t 505 movl %edx,156(%esp) 506 # p += x0 507 addl 100(%esp),%eax 508 # x9 = r 509 movl %esi,136(%esp) 510 # t += x10 511 addl 140(%esp),%edx 512 # x3 = v 513 movl %edi,112(%esp) 514 # p <<<= 9 515 rol $9,%eax 516 # p ^= x8 517 xorl 132(%esp),%eax 518 # t <<<= 9 519 rol $9,%edx 520 # t ^= x2 521 xorl 108(%esp),%edx 522 # s += r 523 add %esi,%ecx 524 # s <<<= 9 525 rol $9,%ecx 526 # s ^= x13 527 xorl 152(%esp),%ecx 528 # w += v 529 add %edi,%ebx 530 # w <<<= 9 531 rol $9,%ebx 532 # w ^= x7 533 xorl 128(%esp),%ebx 534 # x8 = p 535 movl %eax,132(%esp) 536 # x2 = t 537 movl %edx,108(%esp) 538 # p += x4 539 addl 116(%esp),%eax 540 # x13 = s 541 movl %ecx,152(%esp) 542 # t += x14 543 addl 156(%esp),%edx 544 # x7 = w 545 movl %ebx,128(%esp) 546 # p <<<= 13 547 rol $13,%eax 548 # p ^= x12 549 xorl 148(%esp),%eax 550 # t <<<= 13 551 rol $13,%edx 552 # t ^= x6 553 xorl 124(%esp),%edx 554 # r += s 555 add %ecx,%esi 556 # r <<<= 13 557 rol $13,%esi 558 # r ^= x1 559 xorl 104(%esp),%esi 560 # v += w 561 add %ebx,%edi 562 # v <<<= 13 563 rol $13,%edi 564 # v ^= x11 565 xorl 144(%esp),%edi 566 # x12 = p 567 movl %eax,148(%esp) 568 # x6 = t 569 movl %edx,124(%esp) 570 # p += x8 571 addl 132(%esp),%eax 572 # x1 = r 573 movl %esi,104(%esp) 574 # t += x2 575 addl 108(%esp),%edx 576 # x11 = v 577 movl %edi,144(%esp) 578 # p <<<= 18 579 rol $18,%eax 580 # p ^= x0 581 xorl 100(%esp),%eax 582 # t <<<= 18 583 rol $18,%edx 584 # t ^= x10 585 xorl 140(%esp),%edx 586 # s += r 587 add %esi,%ecx 588 # s <<<= 18 589 rol $18,%ecx 590 # s ^= x5 591 xorl 120(%esp),%ecx 592 # w += v 593 add %edi,%ebx 594 # w <<<= 18 595 rol $18,%ebx 596 # w ^= x15 597 xorl 160(%esp),%ebx 598 # x0 = p 599 movl %eax,100(%esp) 600 # x10 = t 601 movl %edx,140(%esp) 602 # p += x3 603 addl 112(%esp),%eax 604 # p <<<= 7 605 rol $7,%eax 606 # x5 = s 607 movl %ecx,120(%esp) 608 # t += x9 609 addl 136(%esp),%edx 610 # x15 = w 611 movl %ebx,160(%esp) 612 # r = x4 613 movl 116(%esp),%esi 614 # r += s 615 add %ecx,%esi 616 # v = x14 617 movl 156(%esp),%edi 618 # v += w 619 add %ebx,%edi 620 # p ^= x1 621 xorl 104(%esp),%eax 622 # t <<<= 7 623 rol $7,%edx 624 # t ^= x11 625 xorl 144(%esp),%edx 626 # r <<<= 7 627 rol $7,%esi 628 # r ^= x6 629 xorl 124(%esp),%esi 630 # v <<<= 7 631 rol $7,%edi 632 # v ^= x12 633 xorl 148(%esp),%edi 634 # x1 = p 635 movl %eax,104(%esp) 636 # x11 = t 637 movl %edx,144(%esp) 638 # p += x0 639 addl 100(%esp),%eax 640 # x6 = r 641 movl %esi,124(%esp) 642 # t += x10 643 addl 140(%esp),%edx 644 # x12 = v 645 movl %edi,148(%esp) 646 # p <<<= 9 647 rol $9,%eax 648 # p ^= x2 649 xorl 108(%esp),%eax 650 # t <<<= 9 651 rol $9,%edx 652 # t ^= x8 653 xorl 132(%esp),%edx 654 # s += r 655 add %esi,%ecx 656 # s <<<= 9 657 rol $9,%ecx 658 # s ^= x7 659 xorl 128(%esp),%ecx 660 # w += v 661 add %edi,%ebx 662 # w <<<= 9 663 rol $9,%ebx 664 # w ^= x13 665 xorl 152(%esp),%ebx 666 # x2 = p 667 movl %eax,108(%esp) 668 # x8 = t 669 movl %edx,132(%esp) 670 # p += x1 671 addl 104(%esp),%eax 672 # x7 = s 673 movl %ecx,128(%esp) 674 # t += x11 675 addl 144(%esp),%edx 676 # x13 = w 677 movl %ebx,152(%esp) 678 # p <<<= 13 679 rol $13,%eax 680 # p ^= x3 681 xorl 112(%esp),%eax 682 # t <<<= 13 683 rol $13,%edx 684 # t ^= x9 685 xorl 136(%esp),%edx 686 # r += s 687 add %ecx,%esi 688 # r <<<= 13 689 rol $13,%esi 690 # r ^= x4 691 xorl 116(%esp),%esi 692 # v += w 693 add %ebx,%edi 694 # v <<<= 13 695 rol $13,%edi 696 # v ^= x14 697 xorl 156(%esp),%edi 698 # x3 = p 699 movl %eax,112(%esp) 700 # x9 = t 701 movl %edx,136(%esp) 702 # p += x2 703 addl 108(%esp),%eax 704 # x4 = r 705 movl %esi,116(%esp) 706 # t += x8 707 addl 132(%esp),%edx 708 # x14 = v 709 movl %edi,156(%esp) 710 # p <<<= 18 711 rol $18,%eax 712 # p ^= x0 713 xorl 100(%esp),%eax 714 # t <<<= 18 715 rol $18,%edx 716 # t ^= x10 717 xorl 140(%esp),%edx 718 # s += r 719 add %esi,%ecx 720 # s <<<= 18 721 rol $18,%ecx 722 # s ^= x5 723 xorl 120(%esp),%ecx 724 # w += v 725 add %edi,%ebx 726 # w <<<= 18 727 rol $18,%ebx 728 # w ^= x15 729 xorl 160(%esp),%ebx 730 # i -= 4 731 sub $4,%ebp 732 # goto mainloop if unsigned > 733 ja ._mainloop 734 # x0 = p 735 movl %eax,100(%esp) 736 # x5 = s 737 movl %ecx,120(%esp) 738 # x10 = t 739 movl %edx,140(%esp) 740 # x15 = w 741 movl %ebx,160(%esp) 742 # out = out_backup 743 movl 72(%esp),%edi 744 # m = m_backup 745 movl 68(%esp),%esi 746 # in0 = x0 747 movl 100(%esp),%eax 748 # in1 = x1 749 movl 104(%esp),%ecx 750 # in0 += j0 751 addl 164(%esp),%eax 752 # in1 += j1 753 addl 168(%esp),%ecx 754 # in0 ^= *(uint32 *) (m + 0) 755 xorl 0(%esi),%eax 756 # in1 ^= *(uint32 *) (m + 4) 757 xorl 4(%esi),%ecx 758 # *(uint32 *) (out + 0) = in0 759 movl %eax,0(%edi) 760 # *(uint32 *) (out + 4) = in1 761 movl %ecx,4(%edi) 762 # in2 = x2 763 movl 108(%esp),%eax 764 # in3 = x3 765 movl 112(%esp),%ecx 766 # in2 += j2 767 addl 172(%esp),%eax 768 # in3 += j3 769 addl 176(%esp),%ecx 770 # in2 ^= *(uint32 *) (m + 8) 771 xorl 8(%esi),%eax 772 # in3 ^= *(uint32 *) (m + 12) 773 xorl 12(%esi),%ecx 774 # *(uint32 *) (out + 8) = in2 775 movl %eax,8(%edi) 776 # *(uint32 *) (out + 12) = in3 777 movl %ecx,12(%edi) 778 # in4 = x4 779 movl 116(%esp),%eax 780 # in5 = x5 781 movl 120(%esp),%ecx 782 # in4 += j4 783 addl 180(%esp),%eax 784 # in5 += j5 785 addl 184(%esp),%ecx 786 # in4 ^= *(uint32 *) (m + 16) 787 xorl 16(%esi),%eax 788 # in5 ^= *(uint32 *) (m + 20) 789 xorl 20(%esi),%ecx 790 # *(uint32 *) (out + 16) = in4 791 movl %eax,16(%edi) 792 # *(uint32 *) (out + 20) = in5 793 movl %ecx,20(%edi) 794 # in6 = x6 795 movl 124(%esp),%eax 796 # in7 = x7 797 movl 128(%esp),%ecx 798 # in6 += j6 799 addl 188(%esp),%eax 800 # in7 += j7 801 addl 192(%esp),%ecx 802 # in6 ^= *(uint32 *) (m + 24) 803 xorl 24(%esi),%eax 804 # in7 ^= *(uint32 *) (m + 28) 805 xorl 28(%esi),%ecx 806 # *(uint32 *) (out + 24) = in6 807 movl %eax,24(%edi) 808 # *(uint32 *) (out + 28) = in7 809 movl %ecx,28(%edi) 810 # in8 = x8 811 movl 132(%esp),%eax 812 # in9 = x9 813 movl 136(%esp),%ecx 814 # in8 += j8 815 addl 196(%esp),%eax 816 # in9 += j9 817 addl 200(%esp),%ecx 818 # in8 ^= *(uint32 *) (m + 32) 819 xorl 32(%esi),%eax 820 # in9 ^= *(uint32 *) (m + 36) 821 xorl 36(%esi),%ecx 822 # *(uint32 *) (out + 32) = in8 823 movl %eax,32(%edi) 824 # *(uint32 *) (out + 36) = in9 825 movl %ecx,36(%edi) 826 # in10 = x10 827 movl 140(%esp),%eax 828 # in11 = x11 829 movl 144(%esp),%ecx 830 # in10 += j10 831 addl 204(%esp),%eax 832 # in11 += j11 833 addl 208(%esp),%ecx 834 # in10 ^= *(uint32 *) (m + 40) 835 xorl 40(%esi),%eax 836 # in11 ^= *(uint32 *) (m + 44) 837 xorl 44(%esi),%ecx 838 # *(uint32 *) (out + 40) = in10 839 movl %eax,40(%edi) 840 # *(uint32 *) (out + 44) = in11 841 movl %ecx,44(%edi) 842 # in12 = x12 843 movl 148(%esp),%eax 844 # in13 = x13 845 movl 152(%esp),%ecx 846 # in12 += j12 847 addl 212(%esp),%eax 848 # in13 += j13 849 addl 216(%esp),%ecx 850 # in12 ^= *(uint32 *) (m + 48) 851 xorl 48(%esi),%eax 852 # in13 ^= *(uint32 *) (m + 52) 853 xorl 52(%esi),%ecx 854 # *(uint32 *) (out + 48) = in12 855 movl %eax,48(%edi) 856 # *(uint32 *) (out + 52) = in13 857 movl %ecx,52(%edi) 858 # in14 = x14 859 movl 156(%esp),%eax 860 # in15 = x15 861 movl 160(%esp),%ecx 862 # in14 += j14 863 addl 220(%esp),%eax 864 # in15 += j15 865 addl 224(%esp),%ecx 866 # in14 ^= *(uint32 *) (m + 56) 867 xorl 56(%esi),%eax 868 # in15 ^= *(uint32 *) (m + 60) 869 xorl 60(%esi),%ecx 870 # *(uint32 *) (out + 56) = in14 871 movl %eax,56(%edi) 872 # *(uint32 *) (out + 60) = in15 873 movl %ecx,60(%edi) 874 # bytes = bytes_backup 875 movl 76(%esp),%ebx 876 # in8 = j8 877 movl 196(%esp),%eax 878 # in9 = j9 879 movl 200(%esp),%ecx 880 # in8 += 1 881 add $1,%eax 882 # in9 += 0 + carry 883 adc $0,%ecx 884 # j8 = in8 885 movl %eax,196(%esp) 886 # j9 = in9 887 movl %ecx,200(%esp) 888 # bytes - 64 889 cmp $64,%ebx 890 # goto bytesatleast65 if unsigned> 891 ja ._bytesatleast65 892 # goto bytesatleast64 if unsigned>= 893 jae ._bytesatleast64 894 # m = out 895 mov %edi,%esi 896 # out = ctarget 897 movl 228(%esp),%edi 898 # i = bytes 899 mov %ebx,%ecx 900 # while (i) { *out++ = *m++; --i } 901 rep movsb 902._bytesatleast64: 903 # x = x_backup 904 movl 64(%esp),%eax 905 # in8 = j8 906 movl 196(%esp),%ecx 907 # in9 = j9 908 movl 200(%esp),%edx 909 # *(uint32 *) (x + 32) = in8 910 movl %ecx,32(%eax) 911 # *(uint32 *) (x + 36) = in9 912 movl %edx,36(%eax) 913._done: 914 # eax = eax_stack 915 movl 80(%esp),%eax 916 # ebx = ebx_stack 917 movl 84(%esp),%ebx 918 # esi = esi_stack 919 movl 88(%esp),%esi 920 # edi = edi_stack 921 movl 92(%esp),%edi 922 # ebp = ebp_stack 923 movl 96(%esp),%ebp 924 # leave 925 add %eax,%esp 926 ret 927._bytesatleast65: 928 # bytes -= 64 929 sub $64,%ebx 930 # out += 64 931 add $64,%edi 932 # m += 64 933 add $64,%esi 934 # goto bytesatleast1 935 jmp ._bytesatleast1 936# enter ECRYPT_keysetup 937.text 938.p2align 5 939.globl ECRYPT_keysetup 940ECRYPT_keysetup: 941 mov %esp,%eax 942 and $31,%eax 943 add $256,%eax 944 sub %eax,%esp 945 # eax_stack = eax 946 movl %eax,64(%esp) 947 # ebx_stack = ebx 948 movl %ebx,68(%esp) 949 # esi_stack = esi 950 movl %esi,72(%esp) 951 # edi_stack = edi 952 movl %edi,76(%esp) 953 # ebp_stack = ebp 954 movl %ebp,80(%esp) 955 # k = arg2 956 movl 8(%esp,%eax),%ecx 957 # kbits = arg3 958 movl 12(%esp,%eax),%edx 959 # x = arg1 960 movl 4(%esp,%eax),%eax 961 # in1 = *(uint32 *) (k + 0) 962 movl 0(%ecx),%ebx 963 # in2 = *(uint32 *) (k + 4) 964 movl 4(%ecx),%esi 965 # in3 = *(uint32 *) (k + 8) 966 movl 8(%ecx),%edi 967 # in4 = *(uint32 *) (k + 12) 968 movl 12(%ecx),%ebp 969 # *(uint32 *) (x + 4) = in1 970 movl %ebx,4(%eax) 971 # *(uint32 *) (x + 8) = in2 972 movl %esi,8(%eax) 973 # *(uint32 *) (x + 12) = in3 974 movl %edi,12(%eax) 975 # *(uint32 *) (x + 16) = in4 976 movl %ebp,16(%eax) 977 # kbits - 256 978 cmp $256,%edx 979 # goto kbits128 if unsigned< 980 jb ._kbits128 981._kbits256: 982 # in11 = *(uint32 *) (k + 16) 983 movl 16(%ecx),%edx 984 # in12 = *(uint32 *) (k + 20) 985 movl 20(%ecx),%ebx 986 # in13 = *(uint32 *) (k + 24) 987 movl 24(%ecx),%esi 988 # in14 = *(uint32 *) (k + 28) 989 movl 28(%ecx),%ecx 990 # *(uint32 *) (x + 44) = in11 991 movl %edx,44(%eax) 992 # *(uint32 *) (x + 48) = in12 993 movl %ebx,48(%eax) 994 # *(uint32 *) (x + 52) = in13 995 movl %esi,52(%eax) 996 # *(uint32 *) (x + 56) = in14 997 movl %ecx,56(%eax) 998 # in0 = 1634760805 999 mov $1634760805,%ecx 1000 # in5 = 857760878 1001 mov $857760878,%edx 1002 # in10 = 2036477234 1003 mov $2036477234,%ebx 1004 # in15 = 1797285236 1005 mov $1797285236,%esi 1006 # *(uint32 *) (x + 0) = in0 1007 movl %ecx,0(%eax) 1008 # *(uint32 *) (x + 20) = in5 1009 movl %edx,20(%eax) 1010 # *(uint32 *) (x + 40) = in10 1011 movl %ebx,40(%eax) 1012 # *(uint32 *) (x + 60) = in15 1013 movl %esi,60(%eax) 1014 # goto keysetupdone 1015 jmp ._keysetupdone 1016._kbits128: 1017 # in11 = *(uint32 *) (k + 0) 1018 movl 0(%ecx),%edx 1019 # in12 = *(uint32 *) (k + 4) 1020 movl 4(%ecx),%ebx 1021 # in13 = *(uint32 *) (k + 8) 1022 movl 8(%ecx),%esi 1023 # in14 = *(uint32 *) (k + 12) 1024 movl 12(%ecx),%ecx 1025 # *(uint32 *) (x + 44) = in11 1026 movl %edx,44(%eax) 1027 # *(uint32 *) (x + 48) = in12 1028 movl %ebx,48(%eax) 1029 # *(uint32 *) (x + 52) = in13 1030 movl %esi,52(%eax) 1031 # *(uint32 *) (x + 56) = in14 1032 movl %ecx,56(%eax) 1033 # in0 = 1634760805 1034 mov $1634760805,%ecx 1035 # in5 = 824206446 1036 mov $824206446,%edx 1037 # in10 = 2036477238 1038 mov $2036477238,%ebx 1039 # in15 = 1797285236 1040 mov $1797285236,%esi 1041 # *(uint32 *) (x + 0) = in0 1042 movl %ecx,0(%eax) 1043 # *(uint32 *) (x + 20) = in5 1044 movl %edx,20(%eax) 1045 # *(uint32 *) (x + 40) = in10 1046 movl %ebx,40(%eax) 1047 # *(uint32 *) (x + 60) = in15 1048 movl %esi,60(%eax) 1049._keysetupdone: 1050 # eax = eax_stack 1051 movl 64(%esp),%eax 1052 # ebx = ebx_stack 1053 movl 68(%esp),%ebx 1054 # esi = esi_stack 1055 movl 72(%esp),%esi 1056 # edi = edi_stack 1057 movl 76(%esp),%edi 1058 # ebp = ebp_stack 1059 movl 80(%esp),%ebp 1060 # leave 1061 add %eax,%esp 1062 ret 1063# enter ECRYPT_ivsetup 1064.text 1065.p2align 5 1066.globl ECRYPT_ivsetup 1067ECRYPT_ivsetup: 1068 mov %esp,%eax 1069 and $31,%eax 1070 add $256,%eax 1071 sub %eax,%esp 1072 # eax_stack = eax 1073 movl %eax,64(%esp) 1074 # ebx_stack = ebx 1075 movl %ebx,68(%esp) 1076 # esi_stack = esi 1077 movl %esi,72(%esp) 1078 # edi_stack = edi 1079 movl %edi,76(%esp) 1080 # ebp_stack = ebp 1081 movl %ebp,80(%esp) 1082 # iv = arg2 1083 movl 8(%esp,%eax),%ecx 1084 # x = arg1 1085 movl 4(%esp,%eax),%eax 1086 # in6 = *(uint32 *) (iv + 0) 1087 movl 0(%ecx),%edx 1088 # in7 = *(uint32 *) (iv + 4) 1089 movl 4(%ecx),%ecx 1090 # in8 = 0 1091 mov $0,%ebx 1092 # in9 = 0 1093 mov $0,%esi 1094 # *(uint32 *) (x + 24) = in6 1095 movl %edx,24(%eax) 1096 # *(uint32 *) (x + 28) = in7 1097 movl %ecx,28(%eax) 1098 # *(uint32 *) (x + 32) = in8 1099 movl %ebx,32(%eax) 1100 # *(uint32 *) (x + 36) = in9 1101 movl %esi,36(%eax) 1102 # eax = eax_stack 1103 movl 64(%esp),%eax 1104 # ebx = ebx_stack 1105 movl 68(%esp),%ebx 1106 # esi = esi_stack 1107 movl 72(%esp),%esi 1108 # edi = edi_stack 1109 movl 76(%esp),%edi 1110 # ebp = ebp_stack 1111 movl 80(%esp),%ebp 1112 # leave 1113 add %eax,%esp 1114 ret 1115