!C99Shell v. 2.1 [PHP 8 Update] [02.02.2022]!

Software: Apache/2.4.53 (Unix) OpenSSL/1.1.1o PHP/7.4.29 mod_perl/2.0.12 Perl/v5.34.1. PHP/7.4.29 

uname -a: Linux vps-2738122-x 4.15.0-213-generic #224-Ubuntu SMP Mon Jun 19 13:30:12 UTC 2023 x86_64 

uid=1(daemon) gid=1(daemon) grupos=1(daemon) 

Safe-mode: OFF (not secure)

/opt/apex_tdfonline/proyectos/tdfonline/www/docs/openssl/crypto/aes/asm/   drwxr-xr-x
Free 14.59 GB of 61.93 GB (23.56%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     aes-c64xplus.pl (43.21 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#! /usr/bin/env perl
# Copyright 2012-2020 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License").  You may not use
# this file except in compliance with the License.  You can obtain a copy
# in the file LICENSE in the source distribution or at
# https://www.openssl.org/source/license.html

#
# ====================================================================
# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
# project. The module is, however, dual licensed under OpenSSL and
# CRYPTOGAMS licenses depending on where you obtain it. For further
# details see http://www.openssl.org/~appro/cryptogams/.
# ====================================================================
#
# [Endian-neutral] AES for C64x+.
#
# Even though SPLOOPs are scheduled for 13 cycles, and thus expected
# performance is ~8.5 cycles per byte processed with 128-bit key,
# measured performance turned to be ~10 cycles per byte. Discrepancy
# must be caused by limitations of L1D memory banking(*), see SPRU871
# TI publication for further details. If any consolation it's still
# ~20% faster than TI's linear assembly module anyway... Compared to
# aes_core.c compiled with cl6x 6.0 with -mv6400+ -o2 options this
# code is 3.75x faster and almost 3x smaller (tables included).
#
# (*)    This means that there might be subtle correlation between data
#    and timing and one can wonder if it can be ... attacked:-(
#    On the other hand this also means that *if* one chooses to
#    implement *4* T-tables variant [instead of 1 T-table as in
#    this implementation, or in addition to], then one ought to
#    *interleave* them. Even though it complicates addressing,
#    references to interleaved tables would be guaranteed not to
#    clash. I reckon that it should be possible to break 8 cycles
#    per byte "barrier," i.e. improve by ~20%, naturally at the
#    cost of 8x increased pressure on L1D. 8x because you'd have
#    to interleave both Te and Td tables...

$output = pop and open STDOUT,">$output";

($TEA,$TEB)=("A5","B5");
($KPA,$KPB)=("A3","B1");
@K=("A6","B6","A7","B7");
@s=("A8","B8","A9","B9");
@Te0=@Td0=("A16","B16","A17","B17");
@Te1=@Td1=("A18","B18","A19","B19");
@Te2=@Td2=("A20","B20","A21","B21");
@Te3=@Td3=("A22","B22","A23","B23");

$code=<<___;
    .text

    .if    .ASSEMBLER_VERSION<7000000
    .asg    0,__TI_EABI__
    .endif
    .if    __TI_EABI__
    .nocmp
    .asg    AES_encrypt,_AES_encrypt
    .asg    AES_decrypt,_AES_decrypt
    .asg    AES_set_encrypt_key,_AES_set_encrypt_key
    .asg    AES_set_decrypt_key,_AES_set_decrypt_key
    .asg    AES_ctr32_encrypt,_AES_ctr32_encrypt
    .endif

    .asg    B3,RA
    .asg    A4,INP
    .asg    B4,OUT
    .asg    A6,KEY
    .asg    A4,RET
    .asg    B15,SP

    .eval    24,EXT0
    .eval    16,EXT1
    .eval    8,EXT2
    .eval    0,EXT3
    .eval    8,TBL1
    .eval    16,TBL2
    .eval    24,TBL3

    .if    .BIG_ENDIAN
    .eval    24-EXT0,EXT0
    .eval    24-EXT1,EXT1
    .eval    24-EXT2,EXT2
    .eval    24-EXT3,EXT3
    .eval    32-TBL1,TBL1
    .eval    32-TBL2,TBL2
    .eval    32-TBL3,TBL3
    .endif

    .global    _AES_encrypt
_AES_encrypt:
    .asmfunc
    MVK    1,B2
__encrypt:
    .if    __TI_EABI__
   [B2]    LDNDW    *INP++,A9:A8            ; load input
||    MVKL    \$PCR_OFFSET(AES_Te,__encrypt),$TEA
||    ADDKPC    __encrypt,B0
   [B2]    LDNDW    *INP++,B9:B8
||    MVKH    \$PCR_OFFSET(AES_Te,__encrypt),$TEA
||    ADD    0,KEY,$KPA
||    ADD    4,KEY,$KPB
    .else
   [B2]    LDNDW    *INP++,A9:A8            ; load input
||    MVKL    (AES_Te-__encrypt),$TEA
||    ADDKPC    __encrypt,B0
   [B2]    LDNDW    *INP++,B9:B8
||    MVKH    (AES_Te-__encrypt),$TEA
||    ADD    0,KEY,$KPA
||    ADD    4,KEY,$KPB
    .endif
    LDW    *$KPA++[2],$Te0[0]        ; zero round key
||    LDW    *$KPB++[2],$Te0[1]
||    MVK    60,A0
||    ADD    B0,$TEA,$TEA            ; AES_Te
    LDW    *KEY[A0],B0            ; rounds
||    MVK    1024,A0                ; sizeof(AES_Te)
    LDW    *$KPA++[2],$Te0[2]
||    LDW    *$KPB++[2],$Te0[3]
||    MV    $TEA,$TEB
    NOP
    .if    .BIG_ENDIAN
    MV    A9,$s[0]
||    MV    A8,$s[1]
||    MV    B9,$s[2]
||    MV    B8,$s[3]
    .else
    MV    A8,$s[0]
||    MV    A9,$s[1]
||    MV    B8,$s[2]
||    MV    B9,$s[3]
    .endif
    XOR    $Te0[0],$s[0],$s[0]
||    XOR    $Te0[1],$s[1],$s[1]
||    LDW    *$KPA++[2],$K[0]        ; 1st round key
||    LDW    *$KPB++[2],$K[1]
    SUB    B0,2,B0

    SPLOOPD    13
||    MVC    B0,ILC
||    LDW    *$KPA++[2],$K[2]
||    LDW    *$KPB++[2],$K[3]
;;====================================================================
    EXTU    $s[1],EXT1,24,$Te1[1]
||    EXTU    $s[0],EXT3,24,$Te3[0]
    LDW    *${TEB}[$Te1[1]],$Te1[1]    ; Te1[s1>>8],    t0
||    LDW    *${TEA}[$Te3[0]],$Te3[0]    ; Te3[s0>>24],    t1
||    XOR    $s[2],$Te0[2],$s[2]        ; modulo-scheduled
||    XOR    $s[3],$Te0[3],$s[3]        ; modulo-scheduled
||    EXTU    $s[1],EXT3,24,$Te3[1]
||    EXTU    $s[0],EXT1,24,$Te1[0]
    LDW    *${TEB}[$Te3[1]],$Te3[1]    ; Te3[s1>>24],    t2
||    LDW    *${TEA}[$Te1[0]],$Te1[0]    ; Te1[s0>>8],    t3
||    EXTU    $s[2],EXT2,24,$Te2[2]
||    EXTU    $s[3],EXT2,24,$Te2[3]
    LDW    *${TEA}[$Te2[2]],$Te2[2]    ; Te2[s2>>16],    t0
||    LDW    *${TEB}[$Te2[3]],$Te2[3]    ; Te2[s3>>16],    t1
||    EXTU    $s[3],EXT3,24,$Te3[3]
||    EXTU    $s[2],EXT1,24,$Te1[2]
    LDW    *${TEB}[$Te3[3]],$Te3[3]    ; Te3[s3>>24],    t0
||    LDW    *${TEA}[$Te1[2]],$Te1[2]    ; Te1[s2>>8],    t1
||    EXTU    $s[0],EXT2,24,$Te2[0]
||    EXTU    $s[1],EXT2,24,$Te2[1]
    LDW    *${TEA}[$Te2[0]],$Te2[0]    ; Te2[s0>>16],    t2
||    LDW    *${TEB}[$Te2[1]],$Te2[1]    ; Te2[s1>>16],    t3
||    EXTU    $s[3],EXT1,24,$Te1[3]
||    EXTU    $s[2],EXT3,24,$Te3[2]
    LDW    *${TEB}[$Te1[3]],$Te1[3]    ; Te1[s3>>8],    t2
||    LDW    *${TEA}[$Te3[2]],$Te3[2]    ; Te3[s2>>24],    t3
||    ROTL    $Te1[1],TBL1,$Te3[0]        ; t0
||    ROTL    $Te3[0],TBL3,$Te1[1]        ; t1
||    EXTU    $s[0],EXT0,24,$Te0[0]
||    EXTU    $s[1],EXT0,24,$Te0[1]
    LDW    *${TEA}[$Te0[0]],$Te0[0]    ; Te0[s0],    t0
||    LDW    *${TEB}[$Te0[1]],$Te0[1]    ; Te0[s1],    t1
||    ROTL    $Te3[1],TBL3,$Te1[0]        ; t2
||    ROTL    $Te1[0],TBL1,$Te3[1]        ; t3
||    EXTU    $s[2],EXT0,24,$Te0[2]
||    EXTU    $s[3],EXT0,24,$Te0[3]
    LDW    *${TEA}[$Te0[2]],$Te0[2]    ; Te0[s2],    t2
||    LDW    *${TEB}[$Te0[3]],$Te0[3]    ; Te0[s3],    t3
||    ROTL    $Te2[2],TBL2,$Te2[2]        ; t0
||    ROTL    $Te2[3],TBL2,$Te2[3]        ; t1
||    XOR    $K[0],$Te3[0],$s[0]
||    XOR    $K[1],$Te1[1],$s[1]
    ROTL    $Te3[3],TBL3,$Te1[2]        ; t0
||    ROTL    $Te1[2],TBL1,$Te3[3]        ; t1
||    XOR    $K[2],$Te1[0],$s[2]
||    XOR    $K[3],$Te3[1],$s[3]
||    LDW    *$KPA++[2],$K[0]        ; next round key
||    LDW    *$KPB++[2],$K[1]
    ROTL    $Te2[0],TBL2,$Te2[0]        ; t2
||    ROTL    $Te2[1],TBL2,$Te2[1]        ; t3
||    XOR    $s[0],$Te2[2],$s[0]
||    XOR    $s[1],$Te2[3],$s[1]
||    LDW    *$KPA++[2],$K[2]
||    LDW    *$KPB++[2],$K[3]
    ROTL    $Te1[3],TBL1,$Te3[2]        ; t2
||    ROTL    $Te3[2],TBL3,$Te1[3]        ; t3
||    XOR    $s[0],$Te1[2],$s[0]
||    XOR    $s[1],$Te3[3],$s[1]
    XOR    $s[2],$Te2[0],$s[2]
||    XOR    $s[3],$Te2[1],$s[3]
||    XOR    $s[0],$Te0[0],$s[0]
||    XOR    $s[1],$Te0[1],$s[1]
    SPKERNEL
||    XOR.L    $s[2],$Te3[2],$s[2]
||    XOR.L    $s[3],$Te1[3],$s[3]
;;====================================================================
    ADD.D    ${TEA},A0,${TEA}        ; point to Te4
||    ADD.D    ${TEB},A0,${TEB}
||    EXTU    $s[1],EXT1,24,$Te1[1]
||    EXTU    $s[0],EXT3,24,$Te3[0]
    LDBU    *${TEB}[$Te1[1]],$Te1[1]    ; Te1[s1>>8],    t0
||    LDBU    *${TEA}[$Te3[0]],$Te3[0]    ; Te3[s0>>24],    t1
||    XOR    $s[2],$Te0[2],$s[2]        ; modulo-scheduled
||    XOR    $s[3],$Te0[3],$s[3]        ; modulo-scheduled
||    EXTU    $s[0],EXT0,24,$Te0[0]
||    EXTU    $s[1],EXT0,24,$Te0[1]
    LDBU    *${TEA}[$Te0[0]],$Te0[0]    ; Te0[s0],    t0
||    LDBU    *${TEB}[$Te0[1]],$Te0[1]    ; Te0[s1],    t1
||    EXTU    $s[3],EXT3,24,$Te3[3]
||    EXTU    $s[2],EXT1,24,$Te1[2]
    LDBU    *${TEB}[$Te3[3]],$Te3[3]    ; Te3[s3>>24],    t0
||    LDBU    *${TEA}[$Te1[2]],$Te1[2]    ; Te1[s2>>8],    t1
||    EXTU    $s[2],EXT2,24,$Te2[2]
||    EXTU    $s[3],EXT2,24,$Te2[3]
    LDBU    *${TEA}[$Te2[2]],$Te2[2]    ; Te2[s2>>16],    t0
||    LDBU    *${TEB}[$Te2[3]],$Te2[3]    ; Te2[s3>>16],    t1
||    EXTU    $s[1],EXT3,24,$Te3[1]
||    EXTU    $s[0],EXT1,24,$Te1[0]
    LDBU    *${TEB}[$Te3[1]],$Te3[1]    ; Te3[s1>>24],    t2
||    LDBU    *${TEA}[$Te1[0]],$Te1[0]    ; Te1[s0>>8],    t3
||    EXTU    $s[3],EXT1,24,$Te1[3]
||    EXTU    $s[2],EXT3,24,$Te3[2]
    LDBU    *${TEB}[$Te1[3]],$Te1[3]    ; Te1[s3>>8],    t2
||    LDBU    *${TEA}[$Te3[2]],$Te3[2]    ; Te3[s2>>24],    t3
||    EXTU    $s[2],EXT0,24,$Te0[2]
||    EXTU    $s[3],EXT0,24,$Te0[3]
    LDBU    *${TEA}[$Te0[2]],$Te0[2]    ; Te0[s2],    t2
||    LDBU    *${TEB}[$Te0[3]],$Te0[3]    ; Te0[s3],    t3
||    EXTU    $s[0],EXT2,24,$Te2[0]
||    EXTU    $s[1],EXT2,24,$Te2[1]
    LDBU    *${TEA}[$Te2[0]],$Te2[0]    ; Te2[s0>>16],    t2
||    LDBU    *${TEB}[$Te2[1]],$Te2[1]    ; Te2[s1>>16],    t3

    .if    .BIG_ENDIAN
    PACK2    $Te0[0],$Te1[1],$Te0[0]
||    PACK2    $Te0[1],$Te1[2],$Te0[1]
    PACK2    $Te2[2],$Te3[3],$Te2[2]
||    PACK2    $Te2[3],$Te3[0],$Te2[3]
    PACKL4    $Te0[0],$Te2[2],$Te0[0]
||    PACKL4    $Te0[1],$Te2[3],$Te0[1]
    XOR    $K[0],$Te0[0],$Te0[0]        ; s[0]
||    XOR    $K[1],$Te0[1],$Te0[1]        ; s[1]

    PACK2    $Te0[2],$Te1[3],$Te0[2]
||    PACK2    $Te0[3],$Te1[0],$Te0[3]
    PACK2    $Te2[0],$Te3[1],$Te2[0]
||    PACK2    $Te2[1],$Te3[2],$Te2[1]
||    BNOP    RA
    PACKL4    $Te0[2],$Te2[0],$Te0[2]
||    PACKL4    $Te0[3],$Te2[1],$Te0[3]
    XOR    $K[2],$Te0[2],$Te0[2]        ; s[2]
||    XOR    $K[3],$Te0[3],$Te0[3]        ; s[3]

    MV    $Te0[0],A9
||    MV    $Te0[1],A8
    MV    $Te0[2],B9
||    MV    $Te0[3],B8
|| [B2]    STNDW    A9:A8,*OUT++
   [B2]    STNDW    B9:B8,*OUT++
    .else
    PACK2    $Te1[1],$Te0[0],$Te1[1]
||    PACK2    $Te1[2],$Te0[1],$Te1[2]
    PACK2    $Te3[3],$Te2[2],$Te3[3]
||    PACK2    $Te3[0],$Te2[3],$Te3[0]
    PACKL4    $Te3[3],$Te1[1],$Te1[1]
||    PACKL4    $Te3[0],$Te1[2],$Te1[2]
    XOR    $K[0],$Te1[1],$Te1[1]        ; s[0]
||    XOR    $K[1],$Te1[2],$Te1[2]        ; s[1]

    PACK2    $Te1[3],$Te0[2],$Te1[3]
||    PACK2    $Te1[0],$Te0[3],$Te1[0]
    PACK2    $Te3[1],$Te2[0],$Te3[1]
||    PACK2    $Te3[2],$Te2[1],$Te3[2]
||    BNOP    RA
    PACKL4    $Te3[1],$Te1[3],$Te1[3]
||    PACKL4    $Te3[2],$Te1[0],$Te1[0]
    XOR    $K[2],$Te1[3],$Te1[3]        ; s[2]
||    XOR    $K[3],$Te1[0],$Te1[0]        ; s[3]

    MV    $Te1[1],A8
||    MV    $Te1[2],A9
    MV    $Te1[3],B8
||    MV    $Te1[0],B9
|| [B2]    STNDW    A9:A8,*OUT++
   [B2]    STNDW    B9:B8,*OUT++
    .endif
    .endasmfunc

    .global    _AES_decrypt
_AES_decrypt:
    .asmfunc
    MVK    1,B2
__decrypt:
    .if    __TI_EABI__
   [B2]    LDNDW    *INP++,A9:A8            ; load input
||    MVKL    \$PCR_OFFSET(AES_Td,__decrypt),$TEA
||    ADDKPC    __decrypt,B0
   [B2]    LDNDW    *INP++,B9:B8
||    MVKH    \$PCR_OFFSET(AES_Td,__decrypt),$TEA
||    ADD    0,KEY,$KPA
||    ADD    4,KEY,$KPB
    .else
   [B2]    LDNDW    *INP++,A9:A8            ; load input
||    MVKL    (AES_Td-__decrypt),$TEA
||    ADDKPC    __decrypt,B0
   [B2]    LDNDW    *INP++,B9:B8
||    MVKH    (AES_Td-__decrypt),$TEA
||    ADD    0,KEY,$KPA
||    ADD    4,KEY,$KPB
    .endif
    LDW    *$KPA++[2],$Td0[0]        ; zero round key
||    LDW    *$KPB++[2],$Td0[1]
||    MVK    60,A0
||    ADD    B0,$TEA,$TEA            ; AES_Td
    LDW    *KEY[A0],B0            ; rounds
||    MVK    1024,A0                ; sizeof(AES_Td)
    LDW    *$KPA++[2],$Td0[2]
||    LDW    *$KPB++[2],$Td0[3]
||    MV    $TEA,$TEB
    NOP
    .if    .BIG_ENDIAN
    MV    A9,$s[0]
||    MV    A8,$s[1]
||    MV    B9,$s[2]
||    MV    B8,$s[3]
    .else
    MV    A8,$s[0]
||    MV    A9,$s[1]
||    MV    B8,$s[2]
||    MV    B9,$s[3]
    .endif
    XOR    $Td0[0],$s[0],$s[0]
||    XOR    $Td0[1],$s[1],$s[1]
||    LDW    *$KPA++[2],$K[0]        ; 1st round key
||    LDW    *$KPB++[2],$K[1]
    SUB    B0,2,B0

    SPLOOPD    13
||    MVC    B0,ILC
||    LDW    *$KPA++[2],$K[2]
||    LDW    *$KPB++[2],$K[3]
;;====================================================================
    EXTU    $s[1],EXT3,24,$Td3[1]
||    EXTU    $s[0],EXT1,24,$Td1[0]
    LDW    *${TEB}[$Td3[1]],$Td3[1]    ; Td3[s1>>24],    t0
||    LDW    *${TEA}[$Td1[0]],$Td1[0]    ; Td1[s0>>8],    t1
||    XOR    $s[2],$Td0[2],$s[2]        ; modulo-scheduled
||    XOR    $s[3],$Td0[3],$s[3]        ; modulo-scheduled
||    EXTU    $s[1],EXT1,24,$Td1[1]
||    EXTU    $s[0],EXT3,24,$Td3[0]
    LDW    *${TEB}[$Td1[1]],$Td1[1]    ; Td1[s1>>8],    t2
||    LDW    *${TEA}[$Td3[0]],$Td3[0]    ; Td3[s0>>24],    t3
||    EXTU    $s[2],EXT2,24,$Td2[2]
||    EXTU    $s[3],EXT2,24,$Td2[3]
    LDW    *${TEA}[$Td2[2]],$Td2[2]    ; Td2[s2>>16],    t0
||    LDW    *${TEB}[$Td2[3]],$Td2[3]    ; Td2[s3>>16],    t1
||    EXTU    $s[3],EXT1,24,$Td1[3]
||    EXTU    $s[2],EXT3,24,$Td3[2]
    LDW    *${TEB}[$Td1[3]],$Td1[3]    ; Td1[s3>>8],    t0
||    LDW    *${TEA}[$Td3[2]],$Td3[2]    ; Td3[s2>>24],    t1
||    EXTU    $s[0],EXT2,24,$Td2[0]
||    EXTU    $s[1],EXT2,24,$Td2[1]
    LDW    *${TEA}[$Td2[0]],$Td2[0]    ; Td2[s0>>16],    t2
||    LDW    *${TEB}[$Td2[1]],$Td2[1]    ; Td2[s1>>16],    t3
||    EXTU    $s[3],EXT3,24,$Td3[3]
||    EXTU    $s[2],EXT1,24,$Td1[2]
    LDW    *${TEB}[$Td3[3]],$Td3[3]    ; Td3[s3>>24],    t2
||    LDW    *${TEA}[$Td1[2]],$Td1[2]    ; Td1[s2>>8],    t3
||    ROTL    $Td3[1],TBL3,$Td1[0]        ; t0
||    ROTL    $Td1[0],TBL1,$Td3[1]        ; t1
||    EXTU    $s[0],EXT0,24,$Td0[0]
||    EXTU    $s[1],EXT0,24,$Td0[1]
    LDW    *${TEA}[$Td0[0]],$Td0[0]    ; Td0[s0],    t0
||    LDW    *${TEB}[$Td0[1]],$Td0[1]    ; Td0[s1],    t1
||    ROTL    $Td1[1],TBL1,$Td3[0]        ; t2
||    ROTL    $Td3[0],TBL3,$Td1[1]        ; t3
||    EXTU    $s[2],EXT0,24,$Td0[2]
||    EXTU    $s[3],EXT0,24,$Td0[3]
    LDW    *${TEA}[$Td0[2]],$Td0[2]    ; Td0[s2],    t2
||    LDW    *${TEB}[$Td0[3]],$Td0[3]    ; Td0[s3],    t3
||    ROTL    $Td2[2],TBL2,$Td2[2]        ; t0
||    ROTL    $Td2[3],TBL2,$Td2[3]        ; t1
||    XOR    $K[0],$Td1[0],$s[0]
||    XOR    $K[1],$Td3[1],$s[1]
    ROTL    $Td1[3],TBL1,$Td3[2]        ; t0
||    ROTL    $Td3[2],TBL3,$Td1[3]        ; t1
||    XOR    $K[2],$Td3[0],$s[2]
||    XOR    $K[3],$Td1[1],$s[3]
||    LDW    *$KPA++[2],$K[0]        ; next round key
||    LDW    *$KPB++[2],$K[1]
    ROTL    $Td2[0],TBL2,$Td2[0]        ; t2
||    ROTL    $Td2[1],TBL2,$Td2[1]        ; t3
||    XOR    $s[0],$Td2[2],$s[0]
||    XOR    $s[1],$Td2[3],$s[1]
||    LDW    *$KPA++[2],$K[2]
||    LDW    *$KPB++[2],$K[3]
    ROTL    $Td3[3],TBL3,$Td1[2]        ; t2
||    ROTL    $Td1[2],TBL1,$Td3[3]        ; t3
||    XOR    $s[0],$Td3[2],$s[0]
||    XOR    $s[1],$Td1[3],$s[1]
    XOR    $s[2],$Td2[0],$s[2]
||    XOR    $s[3],$Td2[1],$s[3]
||    XOR    $s[0],$Td0[0],$s[0]
||    XOR    $s[1],$Td0[1],$s[1]
    SPKERNEL
||    XOR.L    $s[2],$Td1[2],$s[2]
||    XOR.L    $s[3],$Td3[3],$s[3]
;;====================================================================
    ADD.D    ${TEA},A0,${TEA}        ; point to Td4
||    ADD.D    ${TEB},A0,${TEB}
||    EXTU    $s[1],EXT3,24,$Td3[1]
||    EXTU    $s[0],EXT1,24,$Td1[0]
    LDBU    *${TEB}[$Td3[1]],$Td3[1]    ; Td3[s1>>24],    t0
||    LDBU    *${TEA}[$Td1[0]],$Td1[0]    ; Td1[s0>>8],    t1
||    XOR    $s[2],$Td0[2],$s[2]        ; modulo-scheduled
||    XOR    $s[3],$Td0[3],$s[3]        ; modulo-scheduled
||    EXTU    $s[0],EXT0,24,$Td0[0]
||    EXTU    $s[1],EXT0,24,$Td0[1]
    LDBU    *${TEA}[$Td0[0]],$Td0[0]    ; Td0[s0],    t0
||    LDBU    *${TEB}[$Td0[1]],$Td0[1]    ; Td0[s1],    t1
||    EXTU    $s[2],EXT2,24,$Td2[2]
||    EXTU    $s[3],EXT2,24,$Td2[3]
    LDBU    *${TEA}[$Td2[2]],$Td2[2]    ; Td2[s2>>16],    t0
||    LDBU    *${TEB}[$Td2[3]],$Td2[3]    ; Td2[s3>>16],    t1
||    EXTU    $s[3],EXT1,24,$Td1[3]
||    EXTU    $s[2],EXT3,24,$Td3[2]
    LDBU    *${TEB}[$Td1[3]],$Td1[3]    ; Td1[s3>>8],    t0
||    LDBU    *${TEA}[$Td3[2]],$Td3[2]    ; Td3[s2>>24],    t1
||    EXTU    $s[1],EXT1,24,$Td1[1]
||    EXTU    $s[0],EXT3,24,$Td3[0]
    LDBU    *${TEB}[$Td1[1]],$Td1[1]    ; Td1[s1>>8],    t2
||    LDBU    *${TEA}[$Td3[0]],$Td3[0]    ; Td3[s0>>24],    t3
||    EXTU    $s[0],EXT2,24,$Td2[0]
||    EXTU    $s[1],EXT2,24,$Td2[1]
    LDBU    *${TEA}[$Td2[0]],$Td2[0]    ; Td2[s0>>16],    t2
||    LDBU    *${TEB}[$Td2[1]],$Td2[1]    ; Td2[s1>>16],    t3
||    EXTU    $s[3],EXT3,24,$Td3[3]
||    EXTU    $s[2],EXT1,24,$Td1[2]
    LDBU    *${TEB}[$Td3[3]],$Td3[3]    ; Td3[s3>>24],    t2
||    LDBU    *${TEA}[$Td1[2]],$Td1[2]    ; Td1[s2>>8],    t3
||    EXTU    $s[2],EXT0,24,$Td0[2]
||    EXTU    $s[3],EXT0,24,$Td0[3]
    LDBU    *${TEA}[$Td0[2]],$Td0[2]    ; Td0[s2],    t2
||    LDBU    *${TEB}[$Td0[3]],$Td0[3]    ; Td0[s3],    t3

    .if    .BIG_ENDIAN
    PACK2    $Td0[0],$Td1[3],$Td0[0]
||    PACK2    $Td0[1],$Td1[0],$Td0[1]
    PACK2    $Td2[2],$Td3[1],$Td2[2]
||    PACK2    $Td2[3],$Td3[2],$Td2[3]
    PACKL4    $Td0[0],$Td2[2],$Td0[0]
||    PACKL4    $Td0[1],$Td2[3],$Td0[1]
    XOR    $K[0],$Td0[0],$Td0[0]        ; s[0]
||    XOR    $K[1],$Td0[1],$Td0[1]        ; s[1]

    PACK2    $Td0[2],$Td1[1],$Td0[2]
||    PACK2    $Td0[3],$Td1[2],$Td0[3]
    PACK2    $Td2[0],$Td3[3],$Td2[0]
||    PACK2    $Td2[1],$Td3[0],$Td2[1]
||    BNOP    RA
    PACKL4    $Td0[2],$Td2[0],$Td0[2]
||    PACKL4    $Td0[3],$Td2[1],$Td0[3]
    XOR    $K[2],$Td0[2],$Td0[2]        ; s[2]
||    XOR    $K[3],$Td0[3],$Td0[3]        ; s[3]

    MV    $Td0[0],A9
||    MV    $Td0[1],A8
    MV    $Td0[2],B9
||    MV    $Td0[3],B8
|| [B2]    STNDW    A9:A8,*OUT++
   [B2]    STNDW    B9:B8,*OUT++
    .else
    PACK2    $Td1[3],$Td0[0],$Td1[3]
||    PACK2    $Td1[0],$Td0[1],$Td1[0]
    PACK2    $Td3[1],$Td2[2],$Td3[1]
||    PACK2    $Td3[2],$Td2[3],$Td3[2]
    PACKL4    $Td3[1],$Td1[3],$Td1[3]
||    PACKL4    $Td3[2],$Td1[0],$Td1[0]
    XOR    $K[0],$Td1[3],$Td1[3]        ; s[0]
||    XOR    $K[1],$Td1[0],$Td1[0]        ; s[1]

    PACK2    $Td1[1],$Td0[2],$Td1[1]
||    PACK2    $Td1[2],$Td0[3],$Td1[2]
    PACK2    $Td3[3],$Td2[0],$Td3[3]
||    PACK2    $Td3[0],$Td2[1],$Td3[0]
||    BNOP    RA
    PACKL4    $Td3[3],$Td1[1],$Td1[1]
||    PACKL4    $Td3[0],$Td1[2],$Td1[2]
    XOR    $K[2],$Td1[1],$Td1[1]        ; s[2]
||    XOR    $K[3],$Td1[2],$Td1[2]        ; s[3]

    MV    $Td1[3],A8
||    MV    $Td1[0],A9
    MV    $Td1[1],B8
||    MV    $Td1[2],B9
|| [B2]    STNDW    A9:A8,*OUT++
   [B2]    STNDW    B9:B8,*OUT++
    .endif
    .endasmfunc
___
{
my @K=(@K,@s);            # extended key
my @Te4=map("B$_",(16..19));

my @Kx9=@Te0;            # used in AES_set_decrypt_key
my @KxB=@Te1;
my @KxD=@Te2;
my @KxE=@Te3;

$code.=<<___;
    .asg    OUT,BITS

    .global    _AES_set_encrypt_key
_AES_set_encrypt_key:
__set_encrypt_key:
    .asmfunc
    MV    INP,A0
||    SHRU    BITS,5,BITS            ; 128-192-256 -> 4-6-8
||    MV    KEY,A1
  [!A0]    B    RA
||[!A0]    MVK    -1,RET
||[!A0]    MVK    1,A1                ; only one B RA
  [!A1]    B    RA
||[!A1]    MVK    -1,RET
||[!A1]    MVK    0,A0
||    MVK    0,B0
||    MVK    0,A1
   [A0]    LDNDW    *INP++,A9:A8
|| [A0]    CMPEQ    4,BITS,B0
|| [A0]    CMPLT    3,BITS,A1
   [B0]    B    key128?
|| [A1]    LDNDW    *INP++,B9:B8
|| [A0]    CMPEQ    6,BITS,B0
|| [A0]    CMPLT    5,BITS,A1
   [B0]    B    key192?
|| [A1]    LDNDW    *INP++,B17:B16
|| [A0]    CMPEQ    8,BITS,B0
|| [A0]    CMPLT    7,BITS,A1
   [B0]    B    key256?
|| [A1]    LDNDW    *INP++,B19:B18

    .if    __TI_EABI__
   [A0]    ADD    0,KEY,$KPA
|| [A0]    ADD    4,KEY,$KPB
|| [A0]    MVKL    \$PCR_OFFSET(AES_Te4,__set_encrypt_key),$TEA
|| [A0]    ADDKPC    __set_encrypt_key,B6
   [A0]    MVKH    \$PCR_OFFSET(AES_Te4,__set_encrypt_key),$TEA
   [A0]    ADD    B6,$TEA,$TEA            ; AES_Te4
    .else
   [A0]    ADD    0,KEY,$KPA
|| [A0]    ADD    4,KEY,$KPB
|| [A0]    MVKL    (AES_Te4-__set_encrypt_key),$TEA
|| [A0]    ADDKPC    __set_encrypt_key,B6
   [A0]    MVKH    (AES_Te4-__set_encrypt_key),$TEA
   [A0]    ADD    B6,$TEA,$TEA            ; AES_Te4
    .endif
    NOP
    NOP

    BNOP    RA,5
||    MVK    -2,RET                ; unknown bit length
||    MVK    0,B0                ; redundant
;;====================================================================
;;====================================================================
key128?:
    .if    .BIG_ENDIAN
    MV    A9,$K[0]
||    MV    A8,$K[1]
||    MV    B9,$Te4[2]
||    MV    B8,$K[3]
    .else
    MV    A8,$K[0]
||    MV    A9,$K[1]
||    MV    B8,$Te4[2]
||    MV    B9,$K[3]
    .endif

    MVK    256,A0
||    MVK    9,B0

    SPLOOPD    14
||    MVC    B0,ILC
||    MV    $TEA,$TEB
||    ADD    $TEA,A0,A30            ; rcon
;;====================================================================
    LDW    *A30++[1],A31            ; rcon[i]
||    MV    $Te4[2],$K[2]
||    EXTU    $K[3],EXT1,24,$Te4[0]
    LDBU    *${TEB}[$Te4[0]],$Te4[0]
||    MV    $K[3],A0
||    EXTU    $K[3],EXT2,24,$Te4[1]
    LDBU    *${TEB}[$Te4[1]],$Te4[1]
||    EXTU    A0,EXT3,24,A0
||    EXTU    $K[3],EXT0,24,$Te4[3]
    .if    .BIG_ENDIAN
    LDBU    *${TEA}[A0],$Te4[3]
||    LDBU    *${TEB}[$Te4[3]],A0
    .else
    LDBU    *${TEA}[A0],A0
||    LDBU    *${TEB}[$Te4[3]],$Te4[3]
    .endif

    STW    $K[0],*$KPA++[2]
||    STW    $K[1],*$KPB++[2]
    STW    $K[2],*$KPA++[2]
||    STW    $K[3],*$KPB++[2]

    XOR    A31,$K[0],$K[0]            ; ^=rcon[i]
    .if    .BIG_ENDIAN
    PACK2    $Te4[0],$Te4[1],$Te4[1]
    PACK2    $Te4[3],A0,$Te4[3]
    PACKL4    $Te4[1],$Te4[3],$Te4[3]
    .else
    PACK2    $Te4[1],$Te4[0],$Te4[1]
    PACK2    $Te4[3],A0,$Te4[3]
    PACKL4    $Te4[3],$Te4[1],$Te4[3]
    .endif
    XOR    $Te4[3],$K[0],$Te4[0]        ; K[0]
    XOR    $Te4[0],$K[1],$K[1]        ; K[1]
    MV    $Te4[0],$K[0]
||    XOR    $K[1],$K[2],$Te4[2]        ; K[2]
    XOR    $Te4[2],$K[3],$K[3]        ; K[3]
    SPKERNEL
;;====================================================================
    BNOP    RA
    MV    $Te4[2],$K[2]
||    STW    $K[0],*$KPA++[2]
||    STW    $K[1],*$KPB++[2]
    STW    $K[2],*$KPA++[2]
||    STW    $K[3],*$KPB++[2]
    MVK    10,B0                ; rounds
    STW    B0,*++${KPB}[15]
    MVK    0,RET
;;====================================================================
;;====================================================================
key192?:
    .if    .BIG_ENDIAN
    MV    A9,$K[0]
||    MV    A8,$K[1]
||    MV    B9,$K[2]
||    MV    B8,$K[3]
    MV    B17,$Te4[2]
||    MV    B16,$K[5]
    .else
    MV    A8,$K[0]
||    MV    A9,$K[1]
||    MV    B8,$K[2]
||    MV    B9,$K[3]
    MV    B16,$Te4[2]
||    MV    B17,$K[5]
    .endif

    MVK    256,A0
||    MVK    6,B0
    MV    $TEA,$TEB
||    ADD    $TEA,A0,A30            ; rcon
;;====================================================================
loop192?:
    LDW    *A30++[1],A31            ; rcon[i]
||    MV    $Te4[2],$K[4]
||    EXTU    $K[5],EXT1,24,$Te4[0]
    LDBU    *${TEB}[$Te4[0]],$Te4[0]
||    MV    $K[5],A0
||    EXTU    $K[5],EXT2,24,$Te4[1]
    LDBU    *${TEB}[$Te4[1]],$Te4[1]
||    EXTU    A0,EXT3,24,A0
||    EXTU    $K[5],EXT0,24,$Te4[3]
    .if    .BIG_ENDIAN
    LDBU    *${TEA}[A0],$Te4[3]
||    LDBU    *${TEB}[$Te4[3]],A0
    .else
    LDBU    *${TEA}[A0],A0
||    LDBU    *${TEB}[$Te4[3]],$Te4[3]
    .endif

    STW    $K[0],*$KPA++[2]
||    STW    $K[1],*$KPB++[2]
    STW    $K[2],*$KPA++[2]
||    STW    $K[3],*$KPB++[2]
    STW    $K[4],*$KPA++[2]
||    STW    $K[5],*$KPB++[2]

    XOR    A31,$K[0],$K[0]            ; ^=rcon[i]
    .if    .BIG_ENDIAN
    PACK2    $Te4[0],$Te4[1],$Te4[1]
||    PACK2    $Te4[3],A0,$Te4[3]
    PACKL4    $Te4[1],$Te4[3],$Te4[3]
    .else
    PACK2    $Te4[1],$Te4[0],$Te4[1]
||    PACK2    $Te4[3],A0,$Te4[3]
    PACKL4    $Te4[3],$Te4[1],$Te4[3]
    .endif
    BDEC    loop192?,B0
||    XOR    $Te4[3],$K[0],$Te4[0]        ; K[0]
    XOR    $Te4[0],$K[1],$K[1]        ; K[1]
    MV    $Te4[0],$K[0]
||    XOR    $K[1],$K[2],$Te4[2]        ; K[2]
    XOR    $Te4[2],$K[3],$K[3]        ; K[3]
    MV    $Te4[2],$K[2]
||    XOR    $K[3],$K[4],$Te4[2]        ; K[4]
    XOR    $Te4[2],$K[5],$K[5]        ; K[5]
;;====================================================================
    BNOP    RA
    STW    $K[0],*$KPA++[2]
||    STW    $K[1],*$KPB++[2]
    STW    $K[2],*$KPA++[2]
||    STW    $K[3],*$KPB++[2]
    MVK    12,B0                ; rounds
    STW    B0,*++${KPB}[7]
    MVK    0,RET
;;====================================================================
;;====================================================================
key256?:
    .if    .BIG_ENDIAN
    MV    A9,$K[0]
||    MV    A8,$K[1]
||    MV    B9,$K[2]
||    MV    B8,$K[3]
    MV    B17,$K[4]
||    MV    B16,$K[5]
||    MV    B19,$Te4[2]
||    MV    B18,$K[7]
    .else
    MV    A8,$K[0]
||    MV    A9,$K[1]
||    MV    B8,$K[2]
||    MV    B9,$K[3]
    MV    B16,$K[4]
||    MV    B17,$K[5]
||    MV    B18,$Te4[2]
||    MV    B19,$K[7]
    .endif

    MVK    256,A0
||    MVK    6,B0
    MV    $TEA,$TEB
||    ADD    $TEA,A0,A30            ; rcon
;;====================================================================
loop256?:
    LDW    *A30++[1],A31            ; rcon[i]
||    MV    $Te4[2],$K[6]
||    EXTU    $K[7],EXT1,24,$Te4[0]
    LDBU    *${TEB}[$Te4[0]],$Te4[0]
||    MV    $K[7],A0
||    EXTU    $K[7],EXT2,24,$Te4[1]
    LDBU    *${TEB}[$Te4[1]],$Te4[1]
||    EXTU    A0,EXT3,24,A0
||    EXTU    $K[7],EXT0,24,$Te4[3]
    .if    .BIG_ENDIAN
    LDBU    *${TEA}[A0],$Te4[3]
||    LDBU    *${TEB}[$Te4[3]],A0
    .else
    LDBU    *${TEA}[A0],A0
||    LDBU    *${TEB}[$Te4[3]],$Te4[3]
    .endif

    STW    $K[0],*$KPA++[2]
||    STW    $K[1],*$KPB++[2]
    STW    $K[2],*$KPA++[2]
||    STW    $K[3],*$KPB++[2]
    STW    $K[4],*$KPA++[2]
||    STW    $K[5],*$KPB++[2]
    STW    $K[6],*$KPA++[2]
||    STW    $K[7],*$KPB++[2]
||    XOR    A31,$K[0],$K[0]            ; ^=rcon[i]
    .if    .BIG_ENDIAN
    PACK2    $Te4[0],$Te4[1],$Te4[1]
||    PACK2    $Te4[3],A0,$Te4[3]
    PACKL4    $Te4[1],$Te4[3],$Te4[3]
||[!B0]    B    done256?
    .else
    PACK2    $Te4[1],$Te4[0],$Te4[1]
||    PACK2    $Te4[3],A0,$Te4[3]
    PACKL4    $Te4[3],$Te4[1],$Te4[3]
||[!B0]    B    done256?
    .endif
    XOR    $Te4[3],$K[0],$Te4[0]        ; K[0]
    XOR    $Te4[0],$K[1],$K[1]        ; K[1]
    MV    $Te4[0],$K[0]
||    XOR    $K[1],$K[2],$Te4[2]        ; K[2]
    XOR    $Te4[2],$K[3],$K[3]        ; K[3]

    MV    $Te4[2],$K[2]
|| [B0]    EXTU    $K[3],EXT0,24,$Te4[0]
|| [B0]    SUB    B0,1,B0
    LDBU    *${TEB}[$Te4[0]],$Te4[0]
||    MV    $K[3],A0
||    EXTU    $K[3],EXT1,24,$Te4[1]
    LDBU    *${TEB}[$Te4[1]],$Te4[1]
||    EXTU    A0,EXT2,24,A0
||    EXTU    $K[3],EXT3,24,$Te4[3]

    .if    .BIG_ENDIAN
    LDBU    *${TEA}[A0],$Te4[3]
||    LDBU    *${TEB}[$Te4[3]],A0
    NOP    3
    PACK2    $Te4[0],$Te4[1],$Te4[1]
    PACK2    $Te4[3],A0,$Te4[3]
||    B    loop256?
    PACKL4    $Te4[1],$Te4[3],$Te4[3]
    .else
    LDBU    *${TEA}[A0],A0
||    LDBU    *${TEB}[$Te4[3]],$Te4[3]
    NOP    3
    PACK2    $Te4[1],$Te4[0],$Te4[1]
    PACK2    $Te4[3],A0,$Te4[3]
||    B    loop256?
    PACKL4    $Te4[3],$Te4[1],$Te4[3]
    .endif

    XOR    $Te4[3],$K[4],$Te4[0]        ; K[4]
    XOR    $Te4[0],$K[5],$K[5]        ; K[5]
    MV    $Te4[0],$K[4]
||    XOR    $K[5],$K[6],$Te4[2]        ; K[6]
    XOR    $Te4[2],$K[7],$K[7]        ; K[7]
;;====================================================================
done256?:
    BNOP    RA
    STW    $K[0],*$KPA++[2]
||    STW    $K[1],*$KPB++[2]
    STW    $K[2],*$KPA++[2]
||    STW    $K[3],*$KPB++[2]
    MVK    14,B0                ; rounds
    STW    B0,*--${KPB}[1]
    MVK    0,RET
    .endasmfunc

    .global    _AES_set_decrypt_key
_AES_set_decrypt_key:
    .asmfunc
    B    __set_encrypt_key        ; guarantee local call
    MV    KEY,B30                ; B30 is not modified
    MV    RA, B31                ; B31 is not modified
    ADDKPC    ret?,RA,2
ret?:                        ; B0 holds rounds or zero
  [!B0]    BNOP    B31                ; return if zero
   [B0]    SHL    B0,4,A0                ; offset to last round key
   [B0]    SHRU    B0,1,B1
   [B0]    SUB    B1,1,B1
   [B0]    MVK    0x0000001B,B3            ; AES polynomial
   [B0]    MVKH    0x07000000,B3

    SPLOOPD    9                ; flip round keys
||    MVC    B1,ILC
||    MV    B30,$KPA
||    ADD    B30,A0,$KPB
||    MVK    16,A0                ; sizeof(round key)
;;====================================================================
    LDW    *${KPA}[0],A16
||    LDW    *${KPB}[0],B16
    LDW    *${KPA}[1],A17
||    LDW    *${KPB}[1],B17
    LDW    *${KPA}[2],A18
||    LDW    *${KPB}[2],B18
    LDW    *${KPA}[3],A19
||    ADD    $KPA,A0,$KPA
||    LDW    *${KPB}[3],B19
||    SUB    $KPB,A0,$KPB
    NOP
    STW    B16,*${KPA}[-4]
||    STW    A16,*${KPB}[4]
    STW    B17,*${KPA}[-3]
||    STW    A17,*${KPB}[5]
    STW    B18,*${KPA}[-2]
||    STW    A18,*${KPB}[6]
    STW    B19,*${KPA}[-1]
||    STW    A19,*${KPB}[7]
    SPKERNEL
;;====================================================================
    SUB    B0,1,B0                ; skip last round
||    ADD    B30,A0,$KPA            ; skip first round
||    ADD    B30,A0,$KPB
||    MVC    GFPGFR,B30            ; save GFPGFR
    LDW    *${KPA}[0],$K[0]
||    LDW    *${KPB}[1],$K[1]
||    MVC    B3,GFPGFR
    LDW    *${KPA}[2],$K[2]
||    LDW    *${KPB}[3],$K[3]
    MVK    0x00000909,A24
||    MVK    0x00000B0B,B24
    MVKH    0x09090000,A24
||    MVKH    0x0B0B0000,B24
    MVC    B0,ILC
||    SUB    B0,1,B0

    GMPY4    $K[0],A24,$Kx9[0]        ; ·0x09
||    GMPY4    $K[1],A24,$Kx9[1]
||    MVK    0x00000D0D,A25
||    MVK    0x00000E0E,B25
    GMPY4    $K[2],A24,$Kx9[2]
||    GMPY4    $K[3],A24,$Kx9[3]
||    MVKH    0x0D0D0000,A25
||    MVKH    0x0E0E0000,B25

    GMPY4    $K[0],B24,$KxB[0]        ; ·0x0B
||    GMPY4    $K[1],B24,$KxB[1]
    GMPY4    $K[2],B24,$KxB[2]
||    GMPY4    $K[3],B24,$KxB[3]

    SPLOOP    11                ; InvMixColumns
;;====================================================================
    GMPY4    $K[0],A25,$KxD[0]        ; ·0x0D
||    GMPY4    $K[1],A25,$KxD[1]
||    SWAP2    $Kx9[0],$Kx9[0]            ; rotate by 16
||    SWAP2    $Kx9[1],$Kx9[1]
||    MV    $K[0],$s[0]            ; this or DINT
||    MV    $K[1],$s[1]
|| [B0]    LDW    *${KPA}[4],$K[0]
|| [B0]    LDW    *${KPB}[5],$K[1]
    GMPY4    $K[2],A25,$KxD[2]
||    GMPY4    $K[3],A25,$KxD[3]
||    SWAP2    $Kx9[2],$Kx9[2]
||    SWAP2    $Kx9[3],$Kx9[3]
||    MV    $K[2],$s[2]
||    MV    $K[3],$s[3]
|| [B0]    LDW    *${KPA}[6],$K[2]
|| [B0]    LDW    *${KPB}[7],$K[3]

    GMPY4    $s[0],B25,$KxE[0]        ; ·0x0E
||    GMPY4    $s[1],B25,$KxE[1]
||    XOR    $Kx9[0],$KxB[0],$KxB[0]
||    XOR    $Kx9[1],$KxB[1],$KxB[1]
    GMPY4    $s[2],B25,$KxE[2]
||    GMPY4    $s[3],B25,$KxE[3]
||    XOR    $Kx9[2],$KxB[2],$KxB[2]
||    XOR    $Kx9[3],$KxB[3],$KxB[3]

    ROTL    $KxB[0],TBL3,$KxB[0]
||    ROTL    $KxB[1],TBL3,$KxB[1]
||    SWAP2    $KxD[0],$KxD[0]            ; rotate by 16
||    SWAP2    $KxD[1],$KxD[1]
    ROTL    $KxB[2],TBL3,$KxB[2]
||    ROTL    $KxB[3],TBL3,$KxB[3]
||    SWAP2    $KxD[2],$KxD[2]
||    SWAP2    $KxD[3],$KxD[3]

    XOR    $KxE[0],$KxD[0],$KxE[0]
||    XOR    $KxE[1],$KxD[1],$KxE[1]
|| [B0]    GMPY4    $K[0],A24,$Kx9[0]        ; ·0x09
|| [B0]    GMPY4    $K[1],A24,$Kx9[1]
||    ADDAW    $KPA,4,$KPA
    XOR    $KxE[2],$KxD[2],$KxE[2]
||    XOR    $KxE[3],$KxD[3],$KxE[3]
|| [B0]    GMPY4    $K[2],A24,$Kx9[2]
|| [B0]    GMPY4    $K[3],A24,$Kx9[3]
||    ADDAW    $KPB,4,$KPB

    XOR    $KxB[0],$KxE[0],$KxE[0]
||    XOR    $KxB[1],$KxE[1],$KxE[1]
|| [B0]    GMPY4    $K[0],B24,$KxB[0]        ; ·0x0B
|| [B0]    GMPY4    $K[1],B24,$KxB[1]
    XOR    $KxB[2],$KxE[2],$KxE[2]
||    XOR    $KxB[3],$KxE[3],$KxE[3]
|| [B0]    GMPY4    $K[2],B24,$KxB[2]
|| [B0]    GMPY4    $K[3],B24,$KxB[3]
||    STW    $KxE[0],*${KPA}[-4]
||    STW    $KxE[1],*${KPB}[-3]
    STW    $KxE[2],*${KPA}[-2]
||    STW    $KxE[3],*${KPB}[-1]
|| [B0]    SUB    B0,1,B0
    SPKERNEL
;;====================================================================
    BNOP    B31,3
    MVC    B30,GFPGFR            ; restore GFPGFR(*)
    MVK    0,RET
    .endasmfunc
___
# (*)    Even though ABI doesn't specify GFPGFR as non-volatile, there
#    are code samples out there that *assume* its default value.
}
{
my ($inp,$out,$blocks,$key,$ivp)=("A4","B4","A6","B6","A8");
$code.=<<___;
    .global    _AES_ctr32_encrypt
_AES_ctr32_encrypt:
    .asmfunc
    LDNDW    *${ivp}[0],A31:A30    ; load counter value
||    MV    $blocks,A2        ; reassign $blocks
||    DMV    RA,$key,B27:B26        ; reassign RA and $key
    LDNDW    *${ivp}[1],B31:B30
||    MVK    0,B2            ; don't let __encrypt load input
||    MVK    0,A1            ; and postpone writing output
    .if    .BIG_ENDIAN
    NOP
    .else
    NOP    4
    SWAP2    B31,B31            ; keep least significant 32 bits
    SWAP4    B31,B31            ; in host byte order
    .endif
ctr32_loop?:
   [A2]    BNOP    __encrypt
|| [A1]    XOR    A29,A9,A9        ; input^Ek(counter)
|| [A1]    XOR    A28,A8,A8
|| [A2]    LDNDW    *INP++,A29:A28        ; load input
  [!A2]    BNOP    B27            ; return
|| [A1]    XOR    B29,B9,B9
|| [A1]    XOR    B28,B8,B8
|| [A2]    LDNDW    *INP++,B29:B28
    .if    .BIG_ENDIAN
   [A1]    STNDW    A9:A8,*OUT++        ; save output
|| [A2]    DMV    A31,A30,A9:A8        ; pass counter value to __encrypt
   [A1]    STNDW    B9:B8,*OUT++
|| [A2]    DMV    B31,B30,B9:B8
|| [A2]    ADD    B30,1,B30        ; counter++
    .else
   [A1]    STNDW    A9:A8,*OUT++        ; save output
|| [A2]    DMV    A31,A30,A9:A8
|| [A2]    SWAP2    B31,B0
|| [A2]    ADD    B31,1,B31        ; counter++
   [A1]    STNDW    B9:B8,*OUT++
|| [A2]    MV    B30,B8
|| [A2]    SWAP4    B0,B9
    .endif
   [A2]    ADDKPC    ctr32_loop?,RA        ; return to ctr32_loop?
|| [A2]    MV    B26,KEY            ; pass $key
|| [A2]    SUB    A2,1,A2            ; $blocks--
||[!A1]    MVK    1,A1
    NOP
    NOP
    .endasmfunc
___
}
# Tables are kept in endian-neutral manner
$code.=<<___;
    .if    __TI_EABI__
    .sect    ".text:aes_asm.const"
    .else
    .sect    ".const:aes_asm"
    .endif
    .align    128
AES_Te:
    .byte    0xc6,0x63,0x63,0xa5,    0xf8,0x7c,0x7c,0x84
    .byte    0xee,0x77,0x77,0x99,    0xf6,0x7b,0x7b,0x8d
    .byte    0xff,0xf2,0xf2,0x0d,    0xd6,0x6b,0x6b,0xbd
    .byte    0xde,0x6f,0x6f,0xb1,    0x91,0xc5,0xc5,0x54
    .byte    0x60,0x30,0x30,0x50,    0x02,0x01,0x01,0x03
    .byte    0xce,0x67,0x67,0xa9,    0x56,0x2b,0x2b,0x7d
    .byte    0xe7,0xfe,0xfe,0x19,    0xb5,0xd7,0xd7,0x62
    .byte    0x4d,0xab,0xab,0xe6,    0xec,0x76,0x76,0x9a
    .byte    0x8f,0xca,0xca,0x45,    0x1f,0x82,0x82,0x9d
    .byte    0x89,0xc9,0xc9,0x40,    0xfa,0x7d,0x7d,0x87
    .byte    0xef,0xfa,0xfa,0x15,    0xb2,0x59,0x59,0xeb
    .byte    0x8e,0x47,0x47,0xc9,    0xfb,0xf0,0xf0,0x0b
    .byte    0x41,0xad,0xad,0xec,    0xb3,0xd4,0xd4,0x67
    .byte    0x5f,0xa2,0xa2,0xfd,    0x45,0xaf,0xaf,0xea
    .byte    0x23,0x9c,0x9c,0xbf,    0x53,0xa4,0xa4,0xf7
    .byte    0xe4,0x72,0x72,0x96,    0x9b,0xc0,0xc0,0x5b
    .byte    0x75,0xb7,0xb7,0xc2,    0xe1,0xfd,0xfd,0x1c
    .byte    0x3d,0x93,0x93,0xae,    0x4c,0x26,0x26,0x6a
    .byte    0x6c,0x36,0x36,0x5a,    0x7e,0x3f,0x3f,0x41
    .byte    0xf5,0xf7,0xf7,0x02,    0x83,0xcc,0xcc,0x4f
    .byte    0x68,0x34,0x34,0x5c,    0x51,0xa5,0xa5,0xf4
    .byte    0xd1,0xe5,0xe5,0x34,    0xf9,0xf1,0xf1,0x08
    .byte    0xe2,0x71,0x71,0x93,    0xab,0xd8,0xd8,0x73
    .byte    0x62,0x31,0x31,0x53,    0x2a,0x15,0x15,0x3f
    .byte    0x08,0x04,0x04,0x0c,    0x95,0xc7,0xc7,0x52
    .byte    0x46,0x23,0x23,0x65,    0x9d,0xc3,0xc3,0x5e
    .byte    0x30,0x18,0x18,0x28,    0x37,0x96,0x96,0xa1
    .byte    0x0a,0x05,0x05,0x0f,    0x2f,0x9a,0x9a,0xb5
    .byte    0x0e,0x07,0x07,0x09,    0x24,0x12,0x12,0x36
    .byte    0x1b,0x80,0x80,0x9b,    0xdf,0xe2,0xe2,0x3d
    .byte    0xcd,0xeb,0xeb,0x26,    0x4e,0x27,0x27,0x69
    .byte    0x7f,0xb2,0xb2,0xcd,    0xea,0x75,0x75,0x9f
    .byte    0x12,0x09,0x09,0x1b,    0x1d,0x83,0x83,0x9e
    .byte    0x58,0x2c,0x2c,0x74,    0x34,0x1a,0x1a,0x2e
    .byte    0x36,0x1b,0x1b,0x2d,    0xdc,0x6e,0x6e,0xb2
    .byte    0xb4,0x5a,0x5a,0xee,    0x5b,0xa0,0xa0,0xfb
    .byte    0xa4,0x52,0x52,0xf6,    0x76,0x3b,0x3b,0x4d
    .byte    0xb7,0xd6,0xd6,0x61,    0x7d,0xb3,0xb3,0xce
    .byte    0x52,0x29,0x29,0x7b,    0xdd,0xe3,0xe3,0x3e
    .byte    0x5e,0x2f,0x2f,0x71,    0x13,0x84,0x84,0x97
    .byte    0xa6,0x53,0x53,0xf5,    0xb9,0xd1,0xd1,0x68
    .byte    0x00,0x00,0x00,0x00,    0xc1,0xed,0xed,0x2c
    .byte    0x40,0x20,0x20,0x60,    0xe3,0xfc,0xfc,0x1f
    .byte    0x79,0xb1,0xb1,0xc8,    0xb6,0x5b,0x5b,0xed
    .byte    0xd4,0x6a,0x6a,0xbe,    0x8d,0xcb,0xcb,0x46
    .byte    0x67,0xbe,0xbe,0xd9,    0x72,0x39,0x39,0x4b
    .byte    0x94,0x4a,0x4a,0xde,    0x98,0x4c,0x4c,0xd4
    .byte    0xb0,0x58,0x58,0xe8,    0x85,0xcf,0xcf,0x4a
    .byte    0xbb,0xd0,0xd0,0x6b,    0xc5,0xef,0xef,0x2a
    .byte    0x4f,0xaa,0xaa,0xe5,    0xed,0xfb,0xfb,0x16
    .byte    0x86,0x43,0x43,0xc5,    0x9a,0x4d,0x4d,0xd7
    .byte    0x66,0x33,0x33,0x55,    0x11,0x85,0x85,0x94
    .byte    0x8a,0x45,0x45,0xcf,    0xe9,0xf9,0xf9,0x10
    .byte    0x04,0x02,0x02,0x06,    0xfe,0x7f,0x7f,0x81
    .byte    0xa0,0x50,0x50,0xf0,    0x78,0x3c,0x3c,0x44
    .byte    0x25,0x9f,0x9f,0xba,    0x4b,0xa8,0xa8,0xe3
    .byte    0xa2,0x51,0x51,0xf3,    0x5d,0xa3,0xa3,0xfe
    .byte    0x80,0x40,0x40,0xc0,    0x05,0x8f,0x8f,0x8a
    .byte    0x3f,0x92,0x92,0xad,    0x21,0x9d,0x9d,0xbc
    .byte    0x70,0x38,0x38,0x48,    0xf1,0xf5,0xf5,0x04
    .byte    0x63,0xbc,0xbc,0xdf,    0x77,0xb6,0xb6,0xc1
    .byte    0xaf,0xda,0xda,0x75,    0x42,0x21,0x21,0x63
    .byte    0x20,0x10,0x10,0x30,    0xe5,0xff,0xff,0x1a
    .byte    0xfd,0xf3,0xf3,0x0e,    0xbf,0xd2,0xd2,0x6d
    .byte    0x81,0xcd,0xcd,0x4c,    0x18,0x0c,0x0c,0x14
    .byte    0x26,0x13,0x13,0x35,    0xc3,0xec,0xec,0x2f
    .byte    0xbe,0x5f,0x5f,0xe1,    0x35,0x97,0x97,0xa2
    .byte    0x88,0x44,0x44,0xcc,    0x2e,0x17,0x17,0x39
    .byte    0x93,0xc4,0xc4,0x57,    0x55,0xa7,0xa7,0xf2
    .byte    0xfc,0x7e,0x7e,0x82,    0x7a,0x3d,0x3d,0x47
    .byte    0xc8,0x64,0x64,0xac,    0xba,0x5d,0x5d,0xe7
    .byte    0x32,0x19,0x19,0x2b,    0xe6,0x73,0x73,0x95
    .byte    0xc0,0x60,0x60,0xa0,    0x19,0x81,0x81,0x98
    .byte    0x9e,0x4f,0x4f,0xd1,    0xa3,0xdc,0xdc,0x7f
    .byte    0x44,0x22,0x22,0x66,    0x54,0x2a,0x2a,0x7e
    .byte    0x3b,0x90,0x90,0xab,    0x0b,0x88,0x88,0x83
    .byte    0x8c,0x46,0x46,0xca,    0xc7,0xee,0xee,0x29
    .byte    0x6b,0xb8,0xb8,0xd3,    0x28,0x14,0x14,0x3c
    .byte    0xa7,0xde,0xde,0x79,    0xbc,0x5e,0x5e,0xe2
    .byte    0x16,0x0b,0x0b,0x1d,    0xad,0xdb,0xdb,0x76
    .byte    0xdb,0xe0,0xe0,0x3b,    0x64,0x32,0x32,0x56
    .byte    0x74,0x3a,0x3a,0x4e,    0x14,0x0a,0x0a,0x1e
    .byte    0x92,0x49,0x49,0xdb,    0x0c,0x06,0x06,0x0a
    .byte    0x48,0x24,0x24,0x6c,    0xb8,0x5c,0x5c,0xe4
    .byte    0x9f,0xc2,0xc2,0x5d,    0xbd,0xd3,0xd3,0x6e
    .byte    0x43,0xac,0xac,0xef,    0xc4,0x62,0x62,0xa6
    .byte    0x39,0x91,0x91,0xa8,    0x31,0x95,0x95,0xa4
    .byte    0xd3,0xe4,0xe4,0x37,    0xf2,0x79,0x79,0x8b
    .byte    0xd5,0xe7,0xe7,0x32,    0x8b,0xc8,0xc8,0x43
    .byte    0x6e,0x37,0x37,0x59,    0xda,0x6d,0x6d,0xb7
    .byte    0x01,0x8d,0x8d,0x8c,    0xb1,0xd5,0xd5,0x64
    .byte    0x9c,0x4e,0x4e,0xd2,    0x49,0xa9,0xa9,0xe0
    .byte    0xd8,0x6c,0x6c,0xb4,    0xac,0x56,0x56,0xfa
    .byte    0xf3,0xf4,0xf4,0x07,    0xcf,0xea,0xea,0x25
    .byte    0xca,0x65,0x65,0xaf,    0xf4,0x7a,0x7a,0x8e
    .byte    0x47,0xae,0xae,0xe9,    0x10,0x08,0x08,0x18
    .byte    0x6f,0xba,0xba,0xd5,    0xf0,0x78,0x78,0x88
    .byte    0x4a,0x25,0x25,0x6f,    0x5c,0x2e,0x2e,0x72
    .byte    0x38,0x1c,0x1c,0x24,    0x57,0xa6,0xa6,0xf1
    .byte    0x73,0xb4,0xb4,0xc7,    0x97,0xc6,0xc6,0x51
    .byte    0xcb,0xe8,0xe8,0x23,    0xa1,0xdd,0xdd,0x7c
    .byte    0xe8,0x74,0x74,0x9c,    0x3e,0x1f,0x1f,0x21
    .byte    0x96,0x4b,0x4b,0xdd,    0x61,0xbd,0xbd,0xdc
    .byte    0x0d,0x8b,0x8b,0x86,    0x0f,0x8a,0x8a,0x85
    .byte    0xe0,0x70,0x70,0x90,    0x7c,0x3e,0x3e,0x42
    .byte    0x71,0xb5,0xb5,0xc4,    0xcc,0x66,0x66,0xaa
    .byte    0x90,0x48,0x48,0xd8,    0x06,0x03,0x03,0x05
    .byte    0xf7,0xf6,0xf6,0x01,    0x1c,0x0e,0x0e,0x12
    .byte    0xc2,0x61,0x61,0xa3,    0x6a,0x35,0x35,0x5f
    .byte    0xae,0x57,0x57,0xf9,    0x69,0xb9,0xb9,0xd0
    .byte    0x17,0x86,0x86,0x91,    0x99,0xc1,0xc1,0x58
    .byte    0x3a,0x1d,0x1d,0x27,    0x27,0x9e,0x9e,0xb9
    .byte    0xd9,0xe1,0xe1,0x38,    0xeb,0xf8,0xf8,0x13
    .byte    0x2b,0x98,0x98,0xb3,    0x22,0x11,0x11,0x33
    .byte    0xd2,0x69,0x69,0xbb,    0xa9,0xd9,0xd9,0x70
    .byte    0x07,0x8e,0x8e,0x89,    0x33,0x94,0x94,0xa7
    .byte    0x2d,0x9b,0x9b,0xb6,    0x3c,0x1e,0x1e,0x22
    .byte    0x15,0x87,0x87,0x92,    0xc9,0xe9,0xe9,0x20
    .byte    0x87,0xce,0xce,0x49,    0xaa,0x55,0x55,0xff
    .byte    0x50,0x28,0x28,0x78,    0xa5,0xdf,0xdf,0x7a
    .byte    0x03,0x8c,0x8c,0x8f,    0x59,0xa1,0xa1,0xf8
    .byte    0x09,0x89,0x89,0x80,    0x1a,0x0d,0x0d,0x17
    .byte    0x65,0xbf,0xbf,0xda,    0xd7,0xe6,0xe6,0x31
    .byte    0x84,0x42,0x42,0xc6,    0xd0,0x68,0x68,0xb8
    .byte    0x82,0x41,0x41,0xc3,    0x29,0x99,0x99,0xb0
    .byte    0x5a,0x2d,0x2d,0x77,    0x1e,0x0f,0x0f,0x11
    .byte    0x7b,0xb0,0xb0,0xcb,    0xa8,0x54,0x54,0xfc
    .byte    0x6d,0xbb,0xbb,0xd6,    0x2c,0x16,0x16,0x3a
AES_Te4:
    .byte    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5
    .byte    0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
    .byte    0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
    .byte    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
    .byte    0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
    .byte    0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
    .byte    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
    .byte    0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
    .byte    0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
    .byte    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
    .byte    0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
    .byte    0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
    .byte    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
    .byte    0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
    .byte    0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
    .byte    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
    .byte    0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
    .byte    0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
    .byte    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
    .byte    0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
    .byte    0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
    .byte    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
    .byte    0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
    .byte    0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
    .byte    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
    .byte    0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
    .byte    0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
    .byte    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
    .byte    0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
    .byte    0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
    .byte    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
    .byte    0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
rcon:
    .byte    0x01,0x00,0x00,0x00,    0x02,0x00,0x00,0x00
    .byte    0x04,0x00,0x00,0x00,    0x08,0x00,0x00,0x00
    .byte    0x10,0x00,0x00,0x00,    0x20,0x00,0x00,0x00
    .byte    0x40,0x00,0x00,0x00,    0x80,0x00,0x00,0x00
    .byte    0x1B,0x00,0x00,0x00,    0x36,0x00,0x00,0x00
    .align    128
AES_Td:
    .byte    0x51,0xf4,0xa7,0x50,    0x7e,0x41,0x65,0x53
    .byte    0x1a,0x17,0xa4,0xc3,    0x3a,0x27,0x5e,0x96
    .byte    0x3b,0xab,0x6b,0xcb,    0x1f,0x9d,0x45,0xf1
    .byte    0xac,0xfa,0x58,0xab,    0x4b,0xe3,0x03,0x93
    .byte    0x20,0x30,0xfa,0x55,    0xad,0x76,0x6d,0xf6
    .byte    0x88,0xcc,0x76,0x91,    0xf5,0x02,0x4c,0x25
    .byte    0x4f,0xe5,0xd7,0xfc,    0xc5,0x2a,0xcb,0xd7
    .byte    0x26,0x35,0x44,0x80,    0xb5,0x62,0xa3,0x8f
    .byte    0xde,0xb1,0x5a,0x49,    0x25,0xba,0x1b,0x67
    .byte    0x45,0xea,0x0e,0x98,    0x5d,0xfe,0xc0,0xe1
    .byte    0xc3,0x2f,0x75,0x02,    0x81,0x4c,0xf0,0x12
    .byte    0x8d,0x46,0x97,0xa3,    0x6b,0xd3,0xf9,0xc6
    .byte    0x03,0x8f,0x5f,0xe7,    0x15,0x92,0x9c,0x95
    .byte    0xbf,0x6d,0x7a,0xeb,    0x95,0x52,0x59,0xda
    .byte    0xd4,0xbe,0x83,0x2d,    0x58,0x74,0x21,0xd3
    .byte    0x49,0xe0,0x69,0x29,    0x8e,0xc9,0xc8,0x44
    .byte    0x75,0xc2,0x89,0x6a,    0xf4,0x8e,0x79,0x78
    .byte    0x99,0x58,0x3e,0x6b,    0x27,0xb9,0x71,0xdd
    .byte    0xbe,0xe1,0x4f,0xb6,    0xf0,0x88,0xad,0x17
    .byte    0xc9,0x20,0xac,0x66,    0x7d,0xce,0x3a,0xb4
    .byte    0x63,0xdf,0x4a,0x18,    0xe5,0x1a,0x31,0x82
    .byte    0x97,0x51,0x33,0x60,    0x62,0x53,0x7f,0x45
    .byte    0xb1,0x64,0x77,0xe0,    0xbb,0x6b,0xae,0x84
    .byte    0xfe,0x81,0xa0,0x1c,    0xf9,0x08,0x2b,0x94
    .byte    0x70,0x48,0x68,0x58,    0x8f,0x45,0xfd,0x19
    .byte    0x94,0xde,0x6c,0x87,    0x52,0x7b,0xf8,0xb7
    .byte    0xab,0x73,0xd3,0x23,    0x72,0x4b,0x02,0xe2
    .byte    0xe3,0x1f,0x8f,0x57,    0x66,0x55,0xab,0x2a
    .byte    0xb2,0xeb,0x28,0x07,    0x2f,0xb5,0xc2,0x03
    .byte    0x86,0xc5,0x7b,0x9a,    0xd3,0x37,0x08,0xa5
    .byte    0x30,0x28,0x87,0xf2,    0x23,0xbf,0xa5,0xb2
    .byte    0x02,0x03,0x6a,0xba,    0xed,0x16,0x82,0x5c
    .byte    0x8a,0xcf,0x1c,0x2b,    0xa7,0x79,0xb4,0x92
    .byte    0xf3,0x07,0xf2,0xf0,    0x4e,0x69,0xe2,0xa1
    .byte    0x65,0xda,0xf4,0xcd,    0x06,0x05,0xbe,0xd5
    .byte    0xd1,0x34,0x62,0x1f,    0xc4,0xa6,0xfe,0x8a
    .byte    0x34,0x2e,0x53,0x9d,    0xa2,0xf3,0x55,0xa0
    .byte    0x05,0x8a,0xe1,0x32,    0xa4,0xf6,0xeb,0x75
    .byte    0x0b,0x83,0xec,0x39,    0x40,0x60,0xef,0xaa
    .byte    0x5e,0x71,0x9f,0x06,    0xbd,0x6e,0x10,0x51
    .byte    0x3e,0x21,0x8a,0xf9,    0x96,0xdd,0x06,0x3d
    .byte    0xdd,0x3e,0x05,0xae,    0x4d,0xe6,0xbd,0x46
    .byte    0x91,0x54,0x8d,0xb5,    0x71,0xc4,0x5d,0x05
    .byte    0x04,0x06,0xd4,0x6f,    0x60,0x50,0x15,0xff
    .byte    0x19,0x98,0xfb,0x24,    0xd6,0xbd,0xe9,0x97
    .byte    0x89,0x40,0x43,0xcc,    0x67,0xd9,0x9e,0x77
    .byte    0xb0,0xe8,0x42,0xbd,    0x07,0x89,0x8b,0x88
    .byte    0xe7,0x19,0x5b,0x38,    0x79,0xc8,0xee,0xdb
    .byte    0xa1,0x7c,0x0a,0x47,    0x7c,0x42,0x0f,0xe9
    .byte    0xf8,0x84,0x1e,0xc9,    0x00,0x00,0x00,0x00
    .byte    0x09,0x80,0x86,0x83,    0x32,0x2b,0xed,0x48
    .byte    0x1e,0x11,0x70,0xac,    0x6c,0x5a,0x72,0x4e
    .byte    0xfd,0x0e,0xff,0xfb,    0x0f,0x85,0x38,0x56
    .byte    0x3d,0xae,0xd5,0x1e,    0x36,0x2d,0x39,0x27
    .byte    0x0a,0x0f,0xd9,0x64,    0x68,0x5c,0xa6,0x21
    .byte    0x9b,0x5b,0x54,0xd1,    0x24,0x36,0x2e,0x3a
    .byte    0x0c,0x0a,0x67,0xb1,    0x93,0x57,0xe7,0x0f
    .byte    0xb4,0xee,0x96,0xd2,    0x1b,0x9b,0x91,0x9e
    .byte    0x80,0xc0,0xc5,0x4f,    0x61,0xdc,0x20,0xa2
    .byte    0x5a,0x77,0x4b,0x69,    0x1c,0x12,0x1a,0x16
    .byte    0xe2,0x93,0xba,0x0a,    0xc0,0xa0,0x2a,0xe5
    .byte    0x3c,0x22,0xe0,0x43,    0x12,0x1b,0x17,0x1d
    .byte    0x0e,0x09,0x0d,0x0b,    0xf2,0x8b,0xc7,0xad
    .byte    0x2d,0xb6,0xa8,0xb9,    0x14,0x1e,0xa9,0xc8
    .byte    0x57,0xf1,0x19,0x85,    0xaf,0x75,0x07,0x4c
    .byte    0xee,0x99,0xdd,0xbb,    0xa3,0x7f,0x60,0xfd
    .byte    0xf7,0x01,0x26,0x9f,    0x5c,0x72,0xf5,0xbc
    .byte    0x44,0x66,0x3b,0xc5,    0x5b,0xfb,0x7e,0x34
    .byte    0x8b,0x43,0x29,0x76,    0xcb,0x23,0xc6,0xdc
    .byte    0xb6,0xed,0xfc,0x68,    0xb8,0xe4,0xf1,0x63
    .byte    0xd7,0x31,0xdc,0xca,    0x42,0x63,0x85,0x10
    .byte    0x13,0x97,0x22,0x40,    0x84,0xc6,0x11,0x20
    .byte    0x85,0x4a,0x24,0x7d,    0xd2,0xbb,0x3d,0xf8
    .byte    0xae,0xf9,0x32,0x11,    0xc7,0x29,0xa1,0x6d
    .byte    0x1d,0x9e,0x2f,0x4b,    0xdc,0xb2,0x30,0xf3
    .byte    0x0d,0x86,0x52,0xec,    0x77,0xc1,0xe3,0xd0
    .byte    0x2b,0xb3,0x16,0x6c,    0xa9,0x70,0xb9,0x99
    .byte    0x11,0x94,0x48,0xfa,    0x47,0xe9,0x64,0x22
    .byte    0xa8,0xfc,0x8c,0xc4,    0xa0,0xf0,0x3f,0x1a
    .byte    0x56,0x7d,0x2c,0xd8,    0x22,0x33,0x90,0xef
    .byte    0x87,0x49,0x4e,0xc7,    0xd9,0x38,0xd1,0xc1
    .byte    0x8c,0xca,0xa2,0xfe,    0x98,0xd4,0x0b,0x36
    .byte    0xa6,0xf5,0x81,0xcf,    0xa5,0x7a,0xde,0x28
    .byte    0xda,0xb7,0x8e,0x26,    0x3f,0xad,0xbf,0xa4
    .byte    0x2c,0x3a,0x9d,0xe4,    0x50,0x78,0x92,0x0d
    .byte    0x6a,0x5f,0xcc,0x9b,    0x54,0x7e,0x46,0x62
    .byte    0xf6,0x8d,0x13,0xc2,    0x90,0xd8,0xb8,0xe8
    .byte    0x2e,0x39,0xf7,0x5e,    0x82,0xc3,0xaf,0xf5
    .byte    0x9f,0x5d,0x80,0xbe,    0x69,0xd0,0x93,0x7c
    .byte    0x6f,0xd5,0x2d,0xa9,    0xcf,0x25,0x12,0xb3
    .byte    0xc8,0xac,0x99,0x3b,    0x10,0x18,0x7d,0xa7
    .byte    0xe8,0x9c,0x63,0x6e,    0xdb,0x3b,0xbb,0x7b
    .byte    0xcd,0x26,0x78,0x09,    0x6e,0x59,0x18,0xf4
    .byte    0xec,0x9a,0xb7,0x01,    0x83,0x4f,0x9a,0xa8
    .byte    0xe6,0x95,0x6e,0x65,    0xaa,0xff,0xe6,0x7e
    .byte    0x21,0xbc,0xcf,0x08,    0xef,0x15,0xe8,0xe6
    .byte    0xba,0xe7,0x9b,0xd9,    0x4a,0x6f,0x36,0xce
    .byte    0xea,0x9f,0x09,0xd4,    0x29,0xb0,0x7c,0xd6
    .byte    0x31,0xa4,0xb2,0xaf,    0x2a,0x3f,0x23,0x31
    .byte    0xc6,0xa5,0x94,0x30,    0x35,0xa2,0x66,0xc0
    .byte    0x74,0x4e,0xbc,0x37,    0xfc,0x82,0xca,0xa6
    .byte    0xe0,0x90,0xd0,0xb0,    0x33,0xa7,0xd8,0x15
    .byte    0xf1,0x04,0x98,0x4a,    0x41,0xec,0xda,0xf7
    .byte    0x7f,0xcd,0x50,0x0e,    0x17,0x91,0xf6,0x2f
    .byte    0x76,0x4d,0xd6,0x8d,    0x43,0xef,0xb0,0x4d
    .byte    0xcc,0xaa,0x4d,0x54,    0xe4,0x96,0x04,0xdf
    .byte    0x9e,0xd1,0xb5,0xe3,    0x4c,0x6a,0x88,0x1b
    .byte    0xc1,0x2c,0x1f,0xb8,    0x46,0x65,0x51,0x7f
    .byte    0x9d,0x5e,0xea,0x04,    0x01,0x8c,0x35,0x5d
    .byte    0xfa,0x87,0x74,0x73,    0xfb,0x0b,0x41,0x2e
    .byte    0xb3,0x67,0x1d,0x5a,    0x92,0xdb,0xd2,0x52
    .byte    0xe9,0x10,0x56,0x33,    0x6d,0xd6,0x47,0x13
    .byte    0x9a,0xd7,0x61,0x8c,    0x37,0xa1,0x0c,0x7a
    .byte    0x59,0xf8,0x14,0x8e,    0xeb,0x13,0x3c,0x89
    .byte    0xce,0xa9,0x27,0xee,    0xb7,0x61,0xc9,0x35
    .byte    0xe1,0x1c,0xe5,0xed,    0x7a,0x47,0xb1,0x3c
    .byte    0x9c,0xd2,0xdf,0x59,    0x55,0xf2,0x73,0x3f
    .byte    0x18,0x14,0xce,0x79,    0x73,0xc7,0x37,0xbf
    .byte    0x53,0xf7,0xcd,0xea,    0x5f,0xfd,0xaa,0x5b
    .byte    0xdf,0x3d,0x6f,0x14,    0x78,0x44,0xdb,0x86
    .byte    0xca,0xaf,0xf3,0x81,    0xb9,0x68,0xc4,0x3e
    .byte    0x38,0x24,0x34,0x2c,    0xc2,0xa3,0x40,0x5f
    .byte    0x16,0x1d,0xc3,0x72,    0xbc,0xe2,0x25,0x0c
    .byte    0x28,0x3c,0x49,0x8b,    0xff,0x0d,0x95,0x41
    .byte    0x39,0xa8,0x01,0x71,    0x08,0x0c,0xb3,0xde
    .byte    0xd8,0xb4,0xe4,0x9c,    0x64,0x56,0xc1,0x90
    .byte    0x7b,0xcb,0x84,0x61,    0xd5,0x32,0xb6,0x70
    .byte    0x48,0x6c,0x5c,0x74,    0xd0,0xb8,0x57,0x42
AES_Td4:
    .byte    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38
    .byte    0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
    .byte    0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
    .byte    0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
    .byte    0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
    .byte    0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
    .byte    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
    .byte    0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
    .byte    0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
    .byte    0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
    .byte    0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
    .byte    0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
    .byte    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
    .byte    0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
    .byte    0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
    .byte    0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
    .byte    0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
    .byte    0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
    .byte    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
    .byte    0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
    .byte    0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
    .byte    0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
    .byte    0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
    .byte    0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
    .byte    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
    .byte    0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
    .byte    0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
    .byte    0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
    .byte    0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
    .byte    0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
    .byte    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
    .byte    0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
    .cstring "AES for C64x+, CRYPTOGAMS by <appro\@openssl.org>"
    .align    4
___

print $code;
close STDOUT or die "error closing STDOUT: $!";

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ ok ]

:: Make Dir ::
 
[ ok ]
:: Make File ::
 
[ ok ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 2.1 [PHP 8 Update] [02.02.2022] maintained byC99Shell Github | Generation time: 0.6334 ]--