1 #include <machine/asm.h> 2 .text 3 .p2align 3 4 .globl rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt 5 .type rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt,@function 6 rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt: 7 # Load number of rounds 8 lwu t0, 240(a4) 9 .word 3439489111 10 .word 34074119 11 .word 34041479 12 .word 2815667831 13 addi t0, t0, -1 14 addi a4, a4, 16 15 1: 16 .word 34041479 17 .word 2815503991 18 addi t0, t0, -1 19 addi a4, a4, 16 20 bnez t0, 1b 21 .word 34041479 22 .word 2815536759 23 24 25 # aes block size is 16 26 andi a6, a2, 15 27 mv t3, a2 28 beqz a6, 1f 29 sub a2, a2, a6 30 addi t3, a2, -16 31 1: 32 # We make the `LENGTH` become e32 length here. 33 srli t4, a2, 2 34 srli t3, t3, 2 35 36 # Load number of rounds 37 lwu t0, 240(a3) 38 li t1, 14 39 li t2, 10 40 beq t0, t1, aes_xts_enc_256 41 beq t0, t2, aes_xts_enc_128 42 .size rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt,.-rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt 43 .p2align 3 44 aes_xts_enc_128: 45 # load input 46 .word 221182167 47 .word 33909767 48 49 li t0, 5 50 # We could simplify the initialization steps if we have `block<=1`. 51 blt t4, t0, 1f 52 53 # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses 54 # different order of coefficients. We should use`vbrev8` to reverse the 55 # data when we use `vgmul`. 56 .word 3439489111 57 .word 1271144535 58 .word 221179991 59 .word 1577072727 60 # v16: [r-IV0, r-IV0, ...] 61 .word 2785257591 62 63 # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8. 64 slli t0, t4, 2 65 .word 218296407 66 # v2: [`1`, `1`, `1`, `1`, ...] 67 .word 1577103703 68 # v3: [`0`, `1`, `2`, `3`, ...] 69 .word 1376297431 70 .word 227733591 71 # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...] 72 .word 1243816535 73 # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...] 74 .word 1244865367 75 slli t0, t4, 1 76 .word 219344983 77 # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...] 78 .word 3594716247 79 80 # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16 81 .word 221179991 82 .word 1250174039 83 .word 2726865015 84 85 # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28. 86 # Reverse the bits order back. 87 .word 1258565207 88 89 # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number 90 # in a LMUL=4 register group. 91 # n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) 92 # = (VLEN/32) 93 # We could use vsetvli with `e32, m1` to compute the `n` number. 94 .word 218133207 95 li t1, 1 96 sll t0, t1, t0 97 .word 3447812183 98 .word 1577070679 99 .word 3380670551 100 .word 1577238615 101 .word 3447812183 102 .word 1241784407 103 .word 221179991 104 .word 1577073239 105 .word 2785258103 106 107 j 2f 108 1: 109 .word 3439489111 110 .word 1271146583 111 2: 112 113 .word 3439489111 114 .word 34005127 115 addi a3, a3, 16 116 .word 34005255 117 addi a3, a3, 16 118 .word 34005383 119 addi a3, a3, 16 120 .word 34005511 121 addi a3, a3, 16 122 .word 34005639 123 addi a3, a3, 16 124 .word 34005767 125 addi a3, a3, 16 126 .word 34005895 127 addi a3, a3, 16 128 .word 34006023 129 addi a3, a3, 16 130 .word 34006151 131 addi a3, a3, 16 132 .word 34006279 133 addi a3, a3, 16 134 .word 34006407 135 136 137 .word 221182167 138 j 1f 139 140 .Lenc_blocks_128: 141 .word 221182167 142 # load plaintext into v24 143 .word 33909767 144 # update iv 145 .word 2739447927 146 # reverse the iv's bits order back 147 .word 1258565207 148 1: 149 .word 797838423 150 slli t0, a7, 2 151 sub t4, t4, a7 152 add a0, a0, t0 153 .word 2786307191 154 .word 2787191927 155 .word 2788240503 156 .word 2789289079 157 .word 2790337655 158 .word 2791386231 159 .word 2792434807 160 .word 2793483383 161 .word 2794531959 162 .word 2795580535 163 .word 2796661879 164 165 .word 797838423 166 167 # store ciphertext 168 .word 221147223 169 .word 33942567 170 add a1, a1, t0 171 sub t3, t3, a7 172 173 bnez t4, .Lenc_blocks_128 174 175 bnez a6, 1f 176 ret 177 1: 178 # slidedown second to last block 179 addi a7, a7, -4 180 .word 3441586263 181 # ciphertext 182 .word 1065929815 183 # multiplier 184 .word 1057540183 185 186 .word 3439489111 187 .word 1577848023 188 189 # load last block into v24 190 # note: We should load the last block before store the second to last block 191 # for in-place operation. 192 .word 134770775 193 .word 33885191 194 195 # setup `x` multiplier with byte-reversed order 196 # 0b00000010 => 0b01000000 (0x40) 197 li t0, 0x40 198 .word 3439489111 199 .word 1577074263 200 .word 3355504727 201 .word 1577242199 202 203 # compute IV for last block 204 .word 3439489111 205 .word 2747836535 206 .word 1258565207 207 208 # store second to last block 209 .word 201879639 210 .word 33918119 211 212 213 # xts last block 214 .word 3439489111 215 .word 797838423 216 .word 2786307191 217 .word 2787191927 218 .word 2788240503 219 .word 2789289079 220 .word 2790337655 221 .word 2791386231 222 .word 2792434807 223 .word 2793483383 224 .word 2794531959 225 .word 2795580535 226 .word 2796661879 227 228 .word 797838423 229 230 # store last block ciphertext 231 addi a1, a1, -16 232 .word 33942567 233 234 ret 235 .size aes_xts_enc_128,.-aes_xts_enc_128 236 .p2align 3 237 aes_xts_enc_256: 238 # load input 239 .word 221182167 240 .word 33909767 241 242 li t0, 5 243 # We could simplify the initialization steps if we have `block<=1`. 244 blt t4, t0, 1f 245 246 # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses 247 # different order of coefficients. We should use`vbrev8` to reverse the 248 # data when we use `vgmul`. 249 .word 3439489111 250 .word 1271144535 251 .word 221179991 252 .word 1577072727 253 # v16: [r-IV0, r-IV0, ...] 254 .word 2785257591 255 256 # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8. 257 slli t0, t4, 2 258 .word 218296407 259 # v2: [`1`, `1`, `1`, `1`, ...] 260 .word 1577103703 261 # v3: [`0`, `1`, `2`, `3`, ...] 262 .word 1376297431 263 .word 227733591 264 # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...] 265 .word 1243816535 266 # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...] 267 .word 1244865367 268 slli t0, t4, 1 269 .word 219344983 270 # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...] 271 .word 3594716247 272 273 # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16 274 .word 221179991 275 .word 1250174039 276 .word 2726865015 277 278 # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28. 279 # Reverse the bits order back. 280 .word 1258565207 281 282 # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number 283 # in a LMUL=4 register group. 284 # n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) 285 # = (VLEN/32) 286 # We could use vsetvli with `e32, m1` to compute the `n` number. 287 .word 218133207 288 li t1, 1 289 sll t0, t1, t0 290 .word 3447812183 291 .word 1577070679 292 .word 3380670551 293 .word 1577238615 294 .word 3447812183 295 .word 1241784407 296 .word 221179991 297 .word 1577073239 298 .word 2785258103 299 300 j 2f 301 1: 302 .word 3439489111 303 .word 1271146583 304 2: 305 306 .word 3439489111 307 .word 34005127 308 addi a3, a3, 16 309 .word 34005255 310 addi a3, a3, 16 311 .word 34005383 312 addi a3, a3, 16 313 .word 34005511 314 addi a3, a3, 16 315 .word 34005639 316 addi a3, a3, 16 317 .word 34005767 318 addi a3, a3, 16 319 .word 34005895 320 addi a3, a3, 16 321 .word 34006023 322 addi a3, a3, 16 323 .word 34006151 324 addi a3, a3, 16 325 .word 34006279 326 addi a3, a3, 16 327 .word 34006407 328 addi a3, a3, 16 329 .word 34006535 330 addi a3, a3, 16 331 .word 34006663 332 addi a3, a3, 16 333 .word 34006791 334 addi a3, a3, 16 335 .word 34006919 336 337 338 .word 221182167 339 j 1f 340 341 .Lenc_blocks_256: 342 .word 221182167 343 # load plaintext into v24 344 .word 33909767 345 # update iv 346 .word 2739447927 347 # reverse the iv's bits order back 348 .word 1258565207 349 1: 350 .word 797838423 351 slli t0, a7, 2 352 sub t4, t4, a7 353 add a0, a0, t0 354 .word 2786307191 355 .word 2787191927 356 .word 2788240503 357 .word 2789289079 358 .word 2790337655 359 .word 2791386231 360 .word 2792434807 361 .word 2793483383 362 .word 2794531959 363 .word 2795580535 364 .word 2796629111 365 .word 2797677687 366 .word 2798726263 367 .word 2799774839 368 .word 2800856183 369 370 .word 797838423 371 372 # store ciphertext 373 .word 221147223 374 .word 33942567 375 add a1, a1, t0 376 sub t3, t3, a7 377 378 bnez t4, .Lenc_blocks_256 379 380 bnez a6, 1f 381 ret 382 1: 383 # slidedown second to last block 384 addi a7, a7, -4 385 .word 3441586263 386 # ciphertext 387 .word 1065929815 388 # multiplier 389 .word 1057540183 390 391 .word 3439489111 392 .word 1577848023 393 394 # load last block into v24 395 # note: We should load the last block before store the second to last block 396 # for in-place operation. 397 .word 134770775 398 .word 33885191 399 400 # setup `x` multiplier with byte-reversed order 401 # 0b00000010 => 0b01000000 (0x40) 402 li t0, 0x40 403 .word 3439489111 404 .word 1577074263 405 .word 3355504727 406 .word 1577242199 407 408 # compute IV for last block 409 .word 3439489111 410 .word 2747836535 411 .word 1258565207 412 413 # store second to last block 414 .word 201879639 415 .word 33918119 416 417 418 # xts last block 419 .word 3439489111 420 .word 797838423 421 .word 2786307191 422 .word 2787191927 423 .word 2788240503 424 .word 2789289079 425 .word 2790337655 426 .word 2791386231 427 .word 2792434807 428 .word 2793483383 429 .word 2794531959 430 .word 2795580535 431 .word 2796629111 432 .word 2797677687 433 .word 2798726263 434 .word 2799774839 435 .word 2800856183 436 437 .word 797838423 438 439 # store last block ciphertext 440 addi a1, a1, -16 441 .word 33942567 442 443 ret 444 .size aes_xts_enc_256,.-aes_xts_enc_256 445 .p2align 3 446 .globl rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt 447 .type rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt,@function 448 rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt: 449 # Load number of rounds 450 lwu t0, 240(a4) 451 .word 3439489111 452 .word 34074119 453 .word 34041479 454 .word 2815667831 455 addi t0, t0, -1 456 addi a4, a4, 16 457 1: 458 .word 34041479 459 .word 2815503991 460 addi t0, t0, -1 461 addi a4, a4, 16 462 bnez t0, 1b 463 .word 34041479 464 .word 2815536759 465 466 467 # aes block size is 16 468 andi a6, a2, 15 469 beqz a6, 1f 470 sub a2, a2, a6 471 addi a2, a2, -16 472 1: 473 # We make the `LENGTH` become e32 length here. 474 srli t4, a2, 2 475 476 # Load number of rounds 477 lwu t0, 240(a3) 478 li t1, 14 479 li t2, 10 480 beq t0, t1, aes_xts_dec_256 481 beq t0, t2, aes_xts_dec_128 482 .size rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt,.-rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt 483 .p2align 3 484 aes_xts_dec_128: 485 # load input 486 .word 221182167 487 .word 33909767 488 489 li t0, 5 490 # We could simplify the initialization steps if we have `block<=1`. 491 blt t4, t0, 1f 492 493 # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses 494 # different order of coefficients. We should use`vbrev8` to reverse the 495 # data when we use `vgmul`. 496 .word 3439489111 497 .word 1271144535 498 .word 221179991 499 .word 1577072727 500 # v16: [r-IV0, r-IV0, ...] 501 .word 2785257591 502 503 # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8. 504 slli t0, t4, 2 505 .word 218296407 506 # v2: [`1`, `1`, `1`, `1`, ...] 507 .word 1577103703 508 # v3: [`0`, `1`, `2`, `3`, ...] 509 .word 1376297431 510 .word 227733591 511 # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...] 512 .word 1243816535 513 # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...] 514 .word 1244865367 515 slli t0, t4, 1 516 .word 219344983 517 # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...] 518 .word 3594716247 519 520 # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16 521 .word 221179991 522 .word 1250174039 523 .word 2726865015 524 525 # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28. 526 # Reverse the bits order back. 527 .word 1258565207 528 529 # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number 530 # in a LMUL=4 register group. 531 # n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) 532 # = (VLEN/32) 533 # We could use vsetvli with `e32, m1` to compute the `n` number. 534 .word 218133207 535 li t1, 1 536 sll t0, t1, t0 537 .word 3447812183 538 .word 1577070679 539 .word 3380670551 540 .word 1577238615 541 .word 3447812183 542 .word 1241784407 543 .word 221179991 544 .word 1577073239 545 .word 2785258103 546 547 j 2f 548 1: 549 .word 3439489111 550 .word 1271146583 551 2: 552 553 .word 3439489111 554 .word 34005127 555 addi a3, a3, 16 556 .word 34005255 557 addi a3, a3, 16 558 .word 34005383 559 addi a3, a3, 16 560 .word 34005511 561 addi a3, a3, 16 562 .word 34005639 563 addi a3, a3, 16 564 .word 34005767 565 addi a3, a3, 16 566 .word 34005895 567 addi a3, a3, 16 568 .word 34006023 569 addi a3, a3, 16 570 .word 34006151 571 addi a3, a3, 16 572 .word 34006279 573 addi a3, a3, 16 574 .word 34006407 575 576 577 beqz t4, 2f 578 579 .word 221182167 580 j 1f 581 582 .Ldec_blocks_128: 583 .word 221182167 584 # load ciphertext into v24 585 .word 33909767 586 # update iv 587 .word 2739447927 588 # reverse the iv's bits order back 589 .word 1258565207 590 1: 591 .word 797838423 592 slli t0, a7, 2 593 sub t4, t4, a7 594 add a0, a0, t0 595 .word 2796792951 596 .word 2795514999 597 .word 2794466423 598 .word 2793417847 599 .word 2792369271 600 .word 2791320695 601 .word 2790272119 602 .word 2789223543 603 .word 2788174967 604 .word 2787126391 605 .word 2786110583 606 607 .word 797838423 608 609 # store plaintext 610 .word 33942567 611 add a1, a1, t0 612 613 bnez t4, .Ldec_blocks_128 614 615 2: 616 bnez a6, 1f 617 ret 618 1: 619 # load second to last block's ciphertext 620 .word 3439489111 621 .word 33909767 622 addi a0, a0, 16 623 624 # setup `x` multiplier with byte-reversed order 625 # 0b00000010 => 0b01000000 (0x40) 626 li t0, 0x40 627 .word 3439489111 628 .word 1577073239 629 .word 3355504727 630 .word 1577241175 631 632 beqz a2, 1f 633 # slidedown third to last block 634 addi a7, a7, -4 635 .word 3441586263 636 # multiplier 637 .word 1057540183 638 639 # compute IV for last block 640 .word 3439489111 641 .word 2739447927 642 .word 1258565207 643 644 # compute IV for second to last block 645 .word 2739447927 646 .word 1258565335 647 j 2f 648 1: 649 # compute IV for second to last block 650 .word 3439489111 651 .word 2739447927 652 .word 1258565335 653 2: 654 655 656 ## xts second to last block 657 .word 3439489111 658 .word 797871191 659 .word 2796792951 660 .word 2795514999 661 .word 2794466423 662 .word 2793417847 663 .word 2792369271 664 .word 2791320695 665 .word 2790272119 666 .word 2789223543 667 .word 2788174967 668 .word 2787126391 669 .word 2786110583 670 671 .word 797871191 672 .word 1577848023 673 674 # load last block ciphertext 675 .word 134770775 676 .word 33885191 677 678 # store second to last block plaintext 679 addi t0, a1, 16 680 .word 33721511 681 682 ## xts last block 683 .word 3439489111 684 .word 797838423 685 .word 2796792951 686 .word 2795514999 687 .word 2794466423 688 .word 2793417847 689 .word 2792369271 690 .word 2791320695 691 .word 2790272119 692 .word 2789223543 693 .word 2788174967 694 .word 2787126391 695 .word 2786110583 696 697 .word 797838423 698 699 # store second to last block plaintext 700 .word 33942567 701 702 ret 703 .size aes_xts_dec_128,.-aes_xts_dec_128 704 .p2align 3 705 aes_xts_dec_256: 706 # load input 707 .word 221182167 708 .word 33909767 709 710 li t0, 5 711 # We could simplify the initialization steps if we have `block<=1`. 712 blt t4, t0, 1f 713 714 # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses 715 # different order of coefficients. We should use`vbrev8` to reverse the 716 # data when we use `vgmul`. 717 .word 3439489111 718 .word 1271144535 719 .word 221179991 720 .word 1577072727 721 # v16: [r-IV0, r-IV0, ...] 722 .word 2785257591 723 724 # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8. 725 slli t0, t4, 2 726 .word 218296407 727 # v2: [`1`, `1`, `1`, `1`, ...] 728 .word 1577103703 729 # v3: [`0`, `1`, `2`, `3`, ...] 730 .word 1376297431 731 .word 227733591 732 # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...] 733 .word 1243816535 734 # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...] 735 .word 1244865367 736 slli t0, t4, 1 737 .word 219344983 738 # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...] 739 .word 3594716247 740 741 # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16 742 .word 221179991 743 .word 1250174039 744 .word 2726865015 745 746 # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28. 747 # Reverse the bits order back. 748 .word 1258565207 749 750 # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number 751 # in a LMUL=4 register group. 752 # n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) 753 # = (VLEN/32) 754 # We could use vsetvli with `e32, m1` to compute the `n` number. 755 .word 218133207 756 li t1, 1 757 sll t0, t1, t0 758 .word 3447812183 759 .word 1577070679 760 .word 3380670551 761 .word 1577238615 762 .word 3447812183 763 .word 1241784407 764 .word 221179991 765 .word 1577073239 766 .word 2785258103 767 768 j 2f 769 1: 770 .word 3439489111 771 .word 1271146583 772 2: 773 774 .word 3439489111 775 .word 34005127 776 addi a3, a3, 16 777 .word 34005255 778 addi a3, a3, 16 779 .word 34005383 780 addi a3, a3, 16 781 .word 34005511 782 addi a3, a3, 16 783 .word 34005639 784 addi a3, a3, 16 785 .word 34005767 786 addi a3, a3, 16 787 .word 34005895 788 addi a3, a3, 16 789 .word 34006023 790 addi a3, a3, 16 791 .word 34006151 792 addi a3, a3, 16 793 .word 34006279 794 addi a3, a3, 16 795 .word 34006407 796 addi a3, a3, 16 797 .word 34006535 798 addi a3, a3, 16 799 .word 34006663 800 addi a3, a3, 16 801 .word 34006791 802 addi a3, a3, 16 803 .word 34006919 804 805 806 beqz t4, 2f 807 808 .word 221182167 809 j 1f 810 811 .Ldec_blocks_256: 812 .word 221182167 813 # load ciphertext into v24 814 .word 33909767 815 # update iv 816 .word 2739447927 817 # reverse the iv's bits order back 818 .word 1258565207 819 1: 820 .word 797838423 821 slli t0, a7, 2 822 sub t4, t4, a7 823 add a0, a0, t0 824 .word 2800987255 825 .word 2799709303 826 .word 2798660727 827 .word 2797612151 828 .word 2796563575 829 .word 2795514999 830 .word 2794466423 831 .word 2793417847 832 .word 2792369271 833 .word 2791320695 834 .word 2790272119 835 .word 2789223543 836 .word 2788174967 837 .word 2787126391 838 .word 2786110583 839 840 .word 797838423 841 842 # store plaintext 843 .word 33942567 844 add a1, a1, t0 845 846 bnez t4, .Ldec_blocks_256 847 848 2: 849 bnez a6, 1f 850 ret 851 1: 852 # load second to last block's ciphertext 853 .word 3439489111 854 .word 33909767 855 addi a0, a0, 16 856 857 # setup `x` multiplier with byte-reversed order 858 # 0b00000010 => 0b01000000 (0x40) 859 li t0, 0x40 860 .word 3439489111 861 .word 1577073239 862 .word 3355504727 863 .word 1577241175 864 865 beqz a2, 1f 866 # slidedown third to last block 867 addi a7, a7, -4 868 .word 3441586263 869 # multiplier 870 .word 1057540183 871 872 # compute IV for last block 873 .word 3439489111 874 .word 2739447927 875 .word 1258565207 876 877 # compute IV for second to last block 878 .word 2739447927 879 .word 1258565335 880 j 2f 881 1: 882 # compute IV for second to last block 883 .word 3439489111 884 .word 2739447927 885 .word 1258565335 886 2: 887 888 889 ## xts second to last block 890 .word 3439489111 891 .word 797871191 892 .word 2800987255 893 .word 2799709303 894 .word 2798660727 895 .word 2797612151 896 .word 2796563575 897 .word 2795514999 898 .word 2794466423 899 .word 2793417847 900 .word 2792369271 901 .word 2791320695 902 .word 2790272119 903 .word 2789223543 904 .word 2788174967 905 .word 2787126391 906 .word 2786110583 907 908 .word 797871191 909 .word 1577848023 910 911 # load last block ciphertext 912 .word 134770775 913 .word 33885191 914 915 # store second to last block plaintext 916 addi t0, a1, 16 917 .word 33721511 918 919 ## xts last block 920 .word 3439489111 921 .word 797838423 922 .word 2800987255 923 .word 2799709303 924 .word 2798660727 925 .word 2797612151 926 .word 2796563575 927 .word 2795514999 928 .word 2794466423 929 .word 2793417847 930 .word 2792369271 931 .word 2791320695 932 .word 2790272119 933 .word 2789223543 934 .word 2788174967 935 .word 2787126391 936 .word 2786110583 937 938 .word 797838423 939 940 # store second to last block plaintext 941 .word 33942567 942 943 ret 944 .size aes_xts_dec_256,.-aes_xts_dec_256 945