1#if defined(__x86_64__) 2.text 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20.p2align 4 21_vpaes_encrypt_core: 22 movq %rdx,%r9 23 movq $16,%r11 24 movl 240(%rdx),%eax 25 movdqa %xmm9,%xmm1 26 movdqa L$k_ipt(%rip),%xmm2 27 pandn %xmm0,%xmm1 28 movdqu (%r9),%xmm5 29 psrld $4,%xmm1 30 pand %xmm9,%xmm0 31.byte 102,15,56,0,208 32 movdqa L$k_ipt+16(%rip),%xmm0 33.byte 102,15,56,0,193 34 pxor %xmm5,%xmm2 35 addq $16,%r9 36 pxor %xmm2,%xmm0 37 leaq L$k_mc_backward(%rip),%r10 38 jmp L$enc_entry 39 40.p2align 4 41L$enc_loop: 42 43 movdqa %xmm13,%xmm4 44 movdqa %xmm12,%xmm0 45.byte 102,15,56,0,226 46.byte 102,15,56,0,195 47 pxor %xmm5,%xmm4 48 movdqa %xmm15,%xmm5 49 pxor %xmm4,%xmm0 50 movdqa -64(%r11,%r10,1),%xmm1 51.byte 102,15,56,0,234 52 movdqa (%r11,%r10,1),%xmm4 53 movdqa %xmm14,%xmm2 54.byte 102,15,56,0,211 55 movdqa %xmm0,%xmm3 56 pxor %xmm5,%xmm2 57.byte 102,15,56,0,193 58 addq $16,%r9 59 pxor %xmm2,%xmm0 60.byte 102,15,56,0,220 61 addq $16,%r11 62 pxor %xmm0,%xmm3 63.byte 102,15,56,0,193 64 andq $48,%r11 65 subq $1,%rax 66 pxor %xmm3,%xmm0 67 68L$enc_entry: 69 70 movdqa %xmm9,%xmm1 71 movdqa %xmm11,%xmm5 72 pandn %xmm0,%xmm1 73 psrld $4,%xmm1 74 pand %xmm9,%xmm0 75.byte 102,15,56,0,232 76 movdqa %xmm10,%xmm3 77 pxor %xmm1,%xmm0 78.byte 102,15,56,0,217 79 movdqa %xmm10,%xmm4 80 pxor %xmm5,%xmm3 81.byte 102,15,56,0,224 82 movdqa %xmm10,%xmm2 83 pxor %xmm5,%xmm4 84.byte 102,15,56,0,211 85 movdqa %xmm10,%xmm3 86 pxor %xmm0,%xmm2 87.byte 102,15,56,0,220 88 movdqu (%r9),%xmm5 89 pxor %xmm1,%xmm3 90 jnz L$enc_loop 91 92 93 movdqa -96(%r10),%xmm4 94 movdqa -80(%r10),%xmm0 95.byte 102,15,56,0,226 96 pxor %xmm5,%xmm4 97.byte 102,15,56,0,195 98 movdqa 64(%r11,%r10,1),%xmm1 99 pxor %xmm4,%xmm0 100.byte 102,15,56,0,193 101 .byte 0xf3,0xc3 102 103 104 105 106 107 108 109 110.p2align 4 111_vpaes_decrypt_core: 112 movq %rdx,%r9 113 movl 240(%rdx),%eax 114 movdqa %xmm9,%xmm1 115 movdqa L$k_dipt(%rip),%xmm2 116 pandn %xmm0,%xmm1 117 movq %rax,%r11 118 psrld $4,%xmm1 119 movdqu (%r9),%xmm5 120 shlq $4,%r11 121 pand %xmm9,%xmm0 122.byte 102,15,56,0,208 123 movdqa L$k_dipt+16(%rip),%xmm0 124 xorq $48,%r11 125 leaq L$k_dsbd(%rip),%r10 126.byte 102,15,56,0,193 127 andq $48,%r11 128 pxor %xmm5,%xmm2 129 movdqa L$k_mc_forward+48(%rip),%xmm5 130 pxor %xmm2,%xmm0 131 addq $16,%r9 132 addq %r10,%r11 133 jmp L$dec_entry 134 135.p2align 4 136L$dec_loop: 137 138 139 140 movdqa -32(%r10),%xmm4 141 movdqa -16(%r10),%xmm1 142.byte 102,15,56,0,226 143.byte 102,15,56,0,203 144 pxor %xmm4,%xmm0 145 movdqa 0(%r10),%xmm4 146 pxor %xmm1,%xmm0 147 movdqa 16(%r10),%xmm1 148 149.byte 102,15,56,0,226 150.byte 102,15,56,0,197 151.byte 102,15,56,0,203 152 pxor %xmm4,%xmm0 153 movdqa 32(%r10),%xmm4 154 pxor %xmm1,%xmm0 155 movdqa 48(%r10),%xmm1 156 157.byte 102,15,56,0,226 158.byte 102,15,56,0,197 159.byte 102,15,56,0,203 160 pxor %xmm4,%xmm0 161 movdqa 64(%r10),%xmm4 162 pxor %xmm1,%xmm0 163 movdqa 80(%r10),%xmm1 164 165.byte 102,15,56,0,226 166.byte 102,15,56,0,197 167.byte 102,15,56,0,203 168 pxor %xmm4,%xmm0 169 addq $16,%r9 170.byte 102,15,58,15,237,12 171 pxor %xmm1,%xmm0 172 subq $1,%rax 173 174L$dec_entry: 175 176 movdqa %xmm9,%xmm1 177 pandn %xmm0,%xmm1 178 movdqa %xmm11,%xmm2 179 psrld $4,%xmm1 180 pand %xmm9,%xmm0 181.byte 102,15,56,0,208 182 movdqa %xmm10,%xmm3 183 pxor %xmm1,%xmm0 184.byte 102,15,56,0,217 185 movdqa %xmm10,%xmm4 186 pxor %xmm2,%xmm3 187.byte 102,15,56,0,224 188 pxor %xmm2,%xmm4 189 movdqa %xmm10,%xmm2 190.byte 102,15,56,0,211 191 movdqa %xmm10,%xmm3 192 pxor %xmm0,%xmm2 193.byte 102,15,56,0,220 194 movdqu (%r9),%xmm0 195 pxor %xmm1,%xmm3 196 jnz L$dec_loop 197 198 199 movdqa 96(%r10),%xmm4 200.byte 102,15,56,0,226 201 pxor %xmm0,%xmm4 202 movdqa 112(%r10),%xmm0 203 movdqa -352(%r11),%xmm2 204.byte 102,15,56,0,195 205 pxor %xmm4,%xmm0 206.byte 102,15,56,0,194 207 .byte 0xf3,0xc3 208 209 210 211 212 213 214 215 216.p2align 4 217_vpaes_schedule_core: 218 219 220 221 222 223 call _vpaes_preheat 224 movdqa L$k_rcon(%rip),%xmm8 225 movdqu (%rdi),%xmm0 226 227 228 movdqa %xmm0,%xmm3 229 leaq L$k_ipt(%rip),%r11 230 call _vpaes_schedule_transform 231 movdqa %xmm0,%xmm7 232 233 leaq L$k_sr(%rip),%r10 234 testq %rcx,%rcx 235 jnz L$schedule_am_decrypting 236 237 238 movdqu %xmm0,(%rdx) 239 jmp L$schedule_go 240 241L$schedule_am_decrypting: 242 243 movdqa (%r8,%r10,1),%xmm1 244.byte 102,15,56,0,217 245 movdqu %xmm3,(%rdx) 246 xorq $48,%r8 247 248L$schedule_go: 249 cmpl $192,%esi 250 ja L$schedule_256 251 je L$schedule_192 252 253 254 255 256 257 258 259 260 261 262L$schedule_128: 263 movl $10,%esi 264 265L$oop_schedule_128: 266 call _vpaes_schedule_round 267 decq %rsi 268 jz L$schedule_mangle_last 269 call _vpaes_schedule_mangle 270 jmp L$oop_schedule_128 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287.p2align 4 288L$schedule_192: 289 movdqu 8(%rdi),%xmm0 290 call _vpaes_schedule_transform 291 movdqa %xmm0,%xmm6 292 pxor %xmm4,%xmm4 293 movhlps %xmm4,%xmm6 294 movl $4,%esi 295 296L$oop_schedule_192: 297 call _vpaes_schedule_round 298.byte 102,15,58,15,198,8 299 call _vpaes_schedule_mangle 300 call _vpaes_schedule_192_smear 301 call _vpaes_schedule_mangle 302 call _vpaes_schedule_round 303 decq %rsi 304 jz L$schedule_mangle_last 305 call _vpaes_schedule_mangle 306 call _vpaes_schedule_192_smear 307 jmp L$oop_schedule_192 308 309 310 311 312 313 314 315 316 317 318 319.p2align 4 320L$schedule_256: 321 movdqu 16(%rdi),%xmm0 322 call _vpaes_schedule_transform 323 movl $7,%esi 324 325L$oop_schedule_256: 326 call _vpaes_schedule_mangle 327 movdqa %xmm0,%xmm6 328 329 330 call _vpaes_schedule_round 331 decq %rsi 332 jz L$schedule_mangle_last 333 call _vpaes_schedule_mangle 334 335 336 pshufd $255,%xmm0,%xmm0 337 movdqa %xmm7,%xmm5 338 movdqa %xmm6,%xmm7 339 call _vpaes_schedule_low_round 340 movdqa %xmm5,%xmm7 341 342 jmp L$oop_schedule_256 343 344 345 346 347 348 349 350 351 352 353 354 355.p2align 4 356L$schedule_mangle_last: 357 358 leaq L$k_deskew(%rip),%r11 359 testq %rcx,%rcx 360 jnz L$schedule_mangle_last_dec 361 362 363 movdqa (%r8,%r10,1),%xmm1 364.byte 102,15,56,0,193 365 leaq L$k_opt(%rip),%r11 366 addq $32,%rdx 367 368L$schedule_mangle_last_dec: 369 addq $-16,%rdx 370 pxor L$k_s63(%rip),%xmm0 371 call _vpaes_schedule_transform 372 movdqu %xmm0,(%rdx) 373 374 375 pxor %xmm0,%xmm0 376 pxor %xmm1,%xmm1 377 pxor %xmm2,%xmm2 378 pxor %xmm3,%xmm3 379 pxor %xmm4,%xmm4 380 pxor %xmm5,%xmm5 381 pxor %xmm6,%xmm6 382 pxor %xmm7,%xmm7 383 .byte 0xf3,0xc3 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401.p2align 4 402_vpaes_schedule_192_smear: 403 pshufd $128,%xmm6,%xmm1 404 pshufd $254,%xmm7,%xmm0 405 pxor %xmm1,%xmm6 406 pxor %xmm1,%xmm1 407 pxor %xmm0,%xmm6 408 movdqa %xmm6,%xmm0 409 movhlps %xmm1,%xmm6 410 .byte 0xf3,0xc3 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432.p2align 4 433_vpaes_schedule_round: 434 435 pxor %xmm1,%xmm1 436.byte 102,65,15,58,15,200,15 437.byte 102,69,15,58,15,192,15 438 pxor %xmm1,%xmm7 439 440 441 pshufd $255,%xmm0,%xmm0 442.byte 102,15,58,15,192,1 443 444 445 446 447_vpaes_schedule_low_round: 448 449 movdqa %xmm7,%xmm1 450 pslldq $4,%xmm7 451 pxor %xmm1,%xmm7 452 movdqa %xmm7,%xmm1 453 pslldq $8,%xmm7 454 pxor %xmm1,%xmm7 455 pxor L$k_s63(%rip),%xmm7 456 457 458 movdqa %xmm9,%xmm1 459 pandn %xmm0,%xmm1 460 psrld $4,%xmm1 461 pand %xmm9,%xmm0 462 movdqa %xmm11,%xmm2 463.byte 102,15,56,0,208 464 pxor %xmm1,%xmm0 465 movdqa %xmm10,%xmm3 466.byte 102,15,56,0,217 467 pxor %xmm2,%xmm3 468 movdqa %xmm10,%xmm4 469.byte 102,15,56,0,224 470 pxor %xmm2,%xmm4 471 movdqa %xmm10,%xmm2 472.byte 102,15,56,0,211 473 pxor %xmm0,%xmm2 474 movdqa %xmm10,%xmm3 475.byte 102,15,56,0,220 476 pxor %xmm1,%xmm3 477 movdqa %xmm13,%xmm4 478.byte 102,15,56,0,226 479 movdqa %xmm12,%xmm0 480.byte 102,15,56,0,195 481 pxor %xmm4,%xmm0 482 483 484 pxor %xmm7,%xmm0 485 movdqa %xmm0,%xmm7 486 .byte 0xf3,0xc3 487 488 489 490 491 492 493 494 495 496 497 498 499.p2align 4 500_vpaes_schedule_transform: 501 movdqa %xmm9,%xmm1 502 pandn %xmm0,%xmm1 503 psrld $4,%xmm1 504 pand %xmm9,%xmm0 505 movdqa (%r11),%xmm2 506.byte 102,15,56,0,208 507 movdqa 16(%r11),%xmm0 508.byte 102,15,56,0,193 509 pxor %xmm2,%xmm0 510 .byte 0xf3,0xc3 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537.p2align 4 538_vpaes_schedule_mangle: 539 movdqa %xmm0,%xmm4 540 movdqa L$k_mc_forward(%rip),%xmm5 541 testq %rcx,%rcx 542 jnz L$schedule_mangle_dec 543 544 545 addq $16,%rdx 546 pxor L$k_s63(%rip),%xmm4 547.byte 102,15,56,0,229 548 movdqa %xmm4,%xmm3 549.byte 102,15,56,0,229 550 pxor %xmm4,%xmm3 551.byte 102,15,56,0,229 552 pxor %xmm4,%xmm3 553 554 jmp L$schedule_mangle_both 555.p2align 4 556L$schedule_mangle_dec: 557 558 leaq L$k_dksd(%rip),%r11 559 movdqa %xmm9,%xmm1 560 pandn %xmm4,%xmm1 561 psrld $4,%xmm1 562 pand %xmm9,%xmm4 563 564 movdqa 0(%r11),%xmm2 565.byte 102,15,56,0,212 566 movdqa 16(%r11),%xmm3 567.byte 102,15,56,0,217 568 pxor %xmm2,%xmm3 569.byte 102,15,56,0,221 570 571 movdqa 32(%r11),%xmm2 572.byte 102,15,56,0,212 573 pxor %xmm3,%xmm2 574 movdqa 48(%r11),%xmm3 575.byte 102,15,56,0,217 576 pxor %xmm2,%xmm3 577.byte 102,15,56,0,221 578 579 movdqa 64(%r11),%xmm2 580.byte 102,15,56,0,212 581 pxor %xmm3,%xmm2 582 movdqa 80(%r11),%xmm3 583.byte 102,15,56,0,217 584 pxor %xmm2,%xmm3 585.byte 102,15,56,0,221 586 587 movdqa 96(%r11),%xmm2 588.byte 102,15,56,0,212 589 pxor %xmm3,%xmm2 590 movdqa 112(%r11),%xmm3 591.byte 102,15,56,0,217 592 pxor %xmm2,%xmm3 593 594 addq $-16,%rdx 595 596L$schedule_mangle_both: 597 movdqa (%r8,%r10,1),%xmm1 598.byte 102,15,56,0,217 599 addq $-16,%r8 600 andq $48,%r8 601 movdqu %xmm3,(%rdx) 602 .byte 0xf3,0xc3 603 604 605 606 607 608.globl _vpaes_set_encrypt_key 609.private_extern _vpaes_set_encrypt_key 610 611.p2align 4 612_vpaes_set_encrypt_key: 613 movl %esi,%eax 614 shrl $5,%eax 615 addl $5,%eax 616 movl %eax,240(%rdx) 617 618 movl $0,%ecx 619 movl $48,%r8d 620 call _vpaes_schedule_core 621 xorl %eax,%eax 622 .byte 0xf3,0xc3 623 624 625.globl _vpaes_set_decrypt_key 626.private_extern _vpaes_set_decrypt_key 627 628.p2align 4 629_vpaes_set_decrypt_key: 630 movl %esi,%eax 631 shrl $5,%eax 632 addl $5,%eax 633 movl %eax,240(%rdx) 634 shll $4,%eax 635 leaq 16(%rdx,%rax,1),%rdx 636 637 movl $1,%ecx 638 movl %esi,%r8d 639 shrl $1,%r8d 640 andl $32,%r8d 641 xorl $32,%r8d 642 call _vpaes_schedule_core 643 xorl %eax,%eax 644 .byte 0xf3,0xc3 645 646 647.globl _vpaes_encrypt 648.private_extern _vpaes_encrypt 649 650.p2align 4 651_vpaes_encrypt: 652 movdqu (%rdi),%xmm0 653 call _vpaes_preheat 654 call _vpaes_encrypt_core 655 movdqu %xmm0,(%rsi) 656 .byte 0xf3,0xc3 657 658 659.globl _vpaes_decrypt 660.private_extern _vpaes_decrypt 661 662.p2align 4 663_vpaes_decrypt: 664 movdqu (%rdi),%xmm0 665 call _vpaes_preheat 666 call _vpaes_decrypt_core 667 movdqu %xmm0,(%rsi) 668 .byte 0xf3,0xc3 669 670.globl _vpaes_cbc_encrypt 671.private_extern _vpaes_cbc_encrypt 672 673.p2align 4 674_vpaes_cbc_encrypt: 675 xchgq %rcx,%rdx 676 subq $16,%rcx 677 jc L$cbc_abort 678 movdqu (%r8),%xmm6 679 subq %rdi,%rsi 680 call _vpaes_preheat 681 cmpl $0,%r9d 682 je L$cbc_dec_loop 683 jmp L$cbc_enc_loop 684.p2align 4 685L$cbc_enc_loop: 686 movdqu (%rdi),%xmm0 687 pxor %xmm6,%xmm0 688 call _vpaes_encrypt_core 689 movdqa %xmm0,%xmm6 690 movdqu %xmm0,(%rsi,%rdi,1) 691 leaq 16(%rdi),%rdi 692 subq $16,%rcx 693 jnc L$cbc_enc_loop 694 jmp L$cbc_done 695.p2align 4 696L$cbc_dec_loop: 697 movdqu (%rdi),%xmm0 698 movdqa %xmm0,%xmm7 699 call _vpaes_decrypt_core 700 pxor %xmm6,%xmm0 701 movdqa %xmm7,%xmm6 702 movdqu %xmm0,(%rsi,%rdi,1) 703 leaq 16(%rdi),%rdi 704 subq $16,%rcx 705 jnc L$cbc_dec_loop 706L$cbc_done: 707 movdqu %xmm6,(%r8) 708L$cbc_abort: 709 .byte 0xf3,0xc3 710 711 712 713 714 715 716 717 718.p2align 4 719_vpaes_preheat: 720 leaq L$k_s0F(%rip),%r10 721 movdqa -32(%r10),%xmm10 722 movdqa -16(%r10),%xmm11 723 movdqa 0(%r10),%xmm9 724 movdqa 48(%r10),%xmm13 725 movdqa 64(%r10),%xmm12 726 movdqa 80(%r10),%xmm15 727 movdqa 96(%r10),%xmm14 728 .byte 0xf3,0xc3 729 730 731 732 733 734 735 736.p2align 6 737_vpaes_consts: 738L$k_inv: 739.quad 0x0E05060F0D080180, 0x040703090A0B0C02 740.quad 0x01040A060F0B0780, 0x030D0E0C02050809 741 742L$k_s0F: 743.quad 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F 744 745L$k_ipt: 746.quad 0xC2B2E8985A2A7000, 0xCABAE09052227808 747.quad 0x4C01307D317C4D00, 0xCD80B1FCB0FDCC81 748 749L$k_sb1: 750.quad 0xB19BE18FCB503E00, 0xA5DF7A6E142AF544 751.quad 0x3618D415FAE22300, 0x3BF7CCC10D2ED9EF 752L$k_sb2: 753.quad 0xE27A93C60B712400, 0x5EB7E955BC982FCD 754.quad 0x69EB88400AE12900, 0xC2A163C8AB82234A 755L$k_sbo: 756.quad 0xD0D26D176FBDC700, 0x15AABF7AC502A878 757.quad 0xCFE474A55FBB6A00, 0x8E1E90D1412B35FA 758 759L$k_mc_forward: 760.quad 0x0407060500030201, 0x0C0F0E0D080B0A09 761.quad 0x080B0A0904070605, 0x000302010C0F0E0D 762.quad 0x0C0F0E0D080B0A09, 0x0407060500030201 763.quad 0x000302010C0F0E0D, 0x080B0A0904070605 764 765L$k_mc_backward: 766.quad 0x0605040702010003, 0x0E0D0C0F0A09080B 767.quad 0x020100030E0D0C0F, 0x0A09080B06050407 768.quad 0x0E0D0C0F0A09080B, 0x0605040702010003 769.quad 0x0A09080B06050407, 0x020100030E0D0C0F 770 771L$k_sr: 772.quad 0x0706050403020100, 0x0F0E0D0C0B0A0908 773.quad 0x030E09040F0A0500, 0x0B06010C07020D08 774.quad 0x0F060D040B020900, 0x070E050C030A0108 775.quad 0x0B0E0104070A0D00, 0x0306090C0F020508 776 777L$k_rcon: 778.quad 0x1F8391B9AF9DEEB6, 0x702A98084D7C7D81 779 780L$k_s63: 781.quad 0x5B5B5B5B5B5B5B5B, 0x5B5B5B5B5B5B5B5B 782 783L$k_opt: 784.quad 0xFF9F4929D6B66000, 0xF7974121DEBE6808 785.quad 0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0 786 787L$k_deskew: 788.quad 0x07E4A34047A4E300, 0x1DFEB95A5DBEF91A 789.quad 0x5F36B5DC83EA6900, 0x2841C2ABF49D1E77 790 791 792 793 794 795L$k_dksd: 796.quad 0xFEB91A5DA3E44700, 0x0740E3A45A1DBEF9 797.quad 0x41C277F4B5368300, 0x5FDC69EAAB289D1E 798L$k_dksb: 799.quad 0x9A4FCA1F8550D500, 0x03D653861CC94C99 800.quad 0x115BEDA7B6FC4A00, 0xD993256F7E3482C8 801L$k_dkse: 802.quad 0xD5031CCA1FC9D600, 0x53859A4C994F5086 803.quad 0xA23196054FDC7BE8, 0xCD5EF96A20B31487 804L$k_dks9: 805.quad 0xB6116FC87ED9A700, 0x4AED933482255BFC 806.quad 0x4576516227143300, 0x8BB89FACE9DAFDCE 807 808 809 810 811 812L$k_dipt: 813.quad 0x0F505B040B545F00, 0x154A411E114E451A 814.quad 0x86E383E660056500, 0x12771772F491F194 815 816L$k_dsb9: 817.quad 0x851C03539A86D600, 0xCAD51F504F994CC9 818.quad 0xC03B1789ECD74900, 0x725E2C9EB2FBA565 819L$k_dsbd: 820.quad 0x7D57CCDFE6B1A200, 0xF56E9B13882A4439 821.quad 0x3CE2FAF724C6CB00, 0x2931180D15DEEFD3 822L$k_dsbb: 823.quad 0xD022649296B44200, 0x602646F6B0F2D404 824.quad 0xC19498A6CD596700, 0xF3FF0C3E3255AA6B 825L$k_dsbe: 826.quad 0x46F2929626D4D000, 0x2242600464B4F6B0 827.quad 0x0C55A6CDFFAAC100, 0x9467F36B98593E32 828L$k_dsbo: 829.quad 0x1387EA537EF94000, 0xC7AA6DB9D4943E2D 830.quad 0x12D7560F93441D00, 0xCA4B8159D8C58E9C 831.byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105,111,110,32,65,69,83,32,102,111,114,32,120,56,54,95,54,52,47,83,83,83,69,51,44,32,77,105,107,101,32,72,97,109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,41,0 832.p2align 6 833 834#endif 835