#! /usr/bin/env perl # Copyright 2022 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 # $output is the last argument if it looks like a file (it has an extension) # $flavour is the first argument if it doesn't look like a file $output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef; $flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef; $output and open STDOUT,">$output"; ################################################################################ # Utility functions to help with keeping track of which registers to stack/ # unstack when entering / exiting routines. ################################################################################ { # Callee-saved registers my @callee_saved = map("x$_",(2,8,9,18..27)); # Caller-saved registers my @caller_saved = map("x$_",(1,5..7,10..17,28..31)); my @must_save; sub use_reg { my $reg = shift; if (grep(/^$reg$/, @callee_saved)) { push(@must_save, $reg); } elsif (!grep(/^$reg$/, @caller_saved)) { # Register is not usable! die("Unusable register ".$reg); } return $reg; } sub use_regs { return map(use_reg("x$_"), @_); } sub save_regs { my $ret = ''; my $stack_reservation = ($#must_save + 1) * 8; my $stack_offset = $stack_reservation; if ($stack_reservation % 16) { $stack_reservation += 8; } $ret.=" addi sp,sp,-$stack_reservation\n"; foreach (@must_save) { $stack_offset -= 8; $ret.=" sd $_,$stack_offset(sp)\n"; } return $ret; } sub load_regs { my $ret = ''; my $stack_reservation = ($#must_save + 1) * 8; my $stack_offset = $stack_reservation; if ($stack_reservation % 16) { $stack_reservation += 8; } foreach (@must_save) { $stack_offset -= 8; $ret.=" ld $_,$stack_offset(sp)\n"; } $ret.=" addi sp,sp,$stack_reservation\n"; return $ret; } sub clear_regs { @must_save = (); } } ################################################################################ # Register assignment for AES_encrypt and AES_decrypt ################################################################################ # Registers to hold AES state (called s0-s3 or y0-y3 elsewhere) my ($Q0,$Q1,$Q2,$Q3) = use_regs(6..9); # Function arguments (x10-x12 are a0-a2 in the ABI) # Input block pointer, output block pointer, key pointer my ($INP,$OUTP,$KEYP) = use_regs(10..12); # Temporaries my ($T0,$T1,$T2,$T3) = use_regs(13..16); my ($T4,$T5,$T6,$T7,$T8,$T9,$T10,$T11) = use_regs(17..24); my ($T12,$T13,$T14,$T15) = use_regs(25..28); # Register to hold table offset my ($I0) = use_regs(29); # Loop counter my ($loopcntr) = use_regs(30); # Lookup table address register my ($TBL) = use_regs(31); # Lookup table mask register my ($MSK) = use_regs(5); # Aliases for readability my $K0 = $loopcntr; my $K1 = $KEYP; ################################################################################ # Table lookup utility functions for AES_encrypt and AES_decrypt ################################################################################ # do_lookup([destination regs], [state regs], [temporary regs], shamt) # do_lookup loads four entries from an AES encryption/decryption table # and stores the result in the specified destination register set # Ds->[0] = Table[Qs->[0] >> shamt] # Ds->[1] = Table[Qs->[1] >> shamt] # Ds->[2] = Table[Qs->[2] >> shamt] # Ds->[3] = Table[Qs->[3] >> shamt] # Four temporary regs are used to generate these lookups. The temporary regs # can be equal to the destination regs, but only if they appear in the same # order. I.e. do_lookup([A,B,C,D],[...],[A,B,C,D],...) is OK sub do_lookup { # (destination regs, state regs, temporary regs, shift amount) my ($Ds, $Qs, $Ts, $shamt) = @_; my $ret = ''; # AES encryption/decryption table entries have word-sized (4-byte) entries. # To convert the table index into a byte offset, we compute # ((Qs->[i] >> shamt) & 0xFF) << 2 # However, to save work, we compute the equivalent expression # (Qs->[i] >> (shamt-2)) & 0x3FC if ($shamt < 2) { $ret .= <<___; slli $Ts->[0],$Qs->[0],$shamt+2 slli $Ts->[1],$Qs->[1],$shamt+2 slli $Ts->[2],$Qs->[2],$shamt+2 slli $Ts->[3],$Qs->[3],$shamt+2 ___ } else { $ret .= <<___; srli $Ts->[0],$Qs->[0],$shamt-2 srli $Ts->[1],$Qs->[1],$shamt-2 srli $Ts->[2],$Qs->[2],$shamt-2 srli $Ts->[3],$Qs->[3],$shamt-2 ___ } $ret .= <<___; andi $Ts->[0],$Ts->[0],0x3FC andi $Ts->[1],$Ts->[1],0x3FC andi $Ts->[2],$Ts->[2],0x3FC andi $Ts->[3],$Ts->[3],0x3FC # Index into table. add $I0,$TBL,$Ts->[0] lwu $Ds->[0],0($I0) add $I0,$TBL,$Ts->[1] lwu $Ds->[1],0($I0) add $I0,$TBL,$Ts->[2] lwu $Ds->[2],0($I0) add $I0,$TBL,$Ts->[3] lwu $Ds->[3],0($I0) ___ return $ret; } # Identical to do_lookup(), but loads only a single byte into each destination # register (replaces lwu with lbu). Used in the final round of AES_encrypt. sub do_lookup_byte { my $ret = do_lookup(@_); $ret =~ s/lwu/lbu/g; return $ret; } # do_lookup_Td4([destination regs], [state regs], [temporary regs]) # Used in final phase of AES_decrypt # Ds->[0] = Table[(Qs->[0]) &0xFF] # Ds->[1] = Table[(Qs->[1] >> 8 )&0xFF] # Ds->[2] = Table[(Qs->[2] >> 16)&0xFF] # Ds->[3] = Table[(Qs->[3] >> 24)&0xFF] # Four temporary regs are used to generate these lookups. The temporary regs # can be equal to the destination regs, but only if they appear in the same # order. I.e. do_lookup([A,B,C,D],[...],[A,B,C,D],...) is OK sub do_lookup_Td4 { my ($Ds, $Qs, $Ts) = @_; my $ret = ''; $ret .= <<___; srli $Ts->[1],$Qs->[1],8 srli $Ts->[2],$Qs->[2],16 srli $Ts->[3],$Qs->[3],24 andi $Ts->[0],$Qs->[0],0xFF andi $Ts->[1],$Ts->[1],0xFF andi $Ts->[2],$Ts->[2],0xFF andi $Ts->[3],$Ts->[3],0xFF add $I0,$TBL,$Ts->[0] lbu $Ds->[0],0($I0) add $I0,$TBL,$Ts->[1] lbu $Ds->[1],0($I0) add $I0,$TBL,$Ts->[2] lbu $Ds->[2],0($I0) add $I0,$TBL,$Ts->[3] lbu $Ds->[3],0($I0) ___ return $ret; } ################################################################################ # void AES_encrypt(const unsigned char *in, unsigned char *out, # const AES_KEY *key); ################################################################################ my $code .= <<___; .text .balign 16 .globl AES_encrypt .type AES_encrypt,\@function AES_encrypt: ___ $code .= save_regs(); $code .= <<___; # Load input to block cipher ld $Q0,0($INP) ld $Q2,8($INP) # Load key ld $T0,0($KEYP) ld $T2,8($KEYP) # Load number of rounds lwu $loopcntr,240($KEYP) # Load address of substitution table and wrap-around mask la $TBL,AES_Te0 li $MSK,~0xFFF # y = n xor k, stored in Q0-Q3 xor $Q0,$Q0,$T0 xor $Q2,$Q2,$T2 srli $Q1,$Q0,32 srli $Q3,$Q2,32 # The main loop only executes the first N-1 rounds. add $loopcntr,$loopcntr,-1 # Do Nr - 1 rounds (final round is special) 1: ___ # Lookup in table Te0 $code .= do_lookup( [$T4,$T5,$T6,$T7], # Destination registers [$Q0,$Q1,$Q2,$Q3], # State registers [$T0,$T1,$T2,$T3], # Temporaries 0 # Shift amount ); $code .= <<___; add $TBL,$TBL,1024 ___ # Lookup in table Te1 $code .= do_lookup( [$T8,$T9,$T10,$T11], [$Q1,$Q2,$Q3,$Q0], [$T0,$T1,$T2,$T3], 8 ); $code .= <<___; add $TBL,$TBL,1024 ___ # Lookup in table Te2 $code .= do_lookup( [$T12,$T13,$T14,$T15], [$Q2,$Q3,$Q0,$Q1], [$T0,$T1,$T2,$T3], 16 ); $code .= <<___; add $TBL,$TBL,1024 ___ # Lookup in table Te3 $code .= do_lookup( [$T0,$T1,$T2,$T3], [$Q3,$Q0,$Q1,$Q2], [$T0,$T1,$T2,$T3], 24 ); $code .= <<___; # Combine table lookups xor $T4,$T4,$T8 xor $T5,$T5,$T9 xor $T6,$T6,$T10 xor $T7,$T7,$T11 xor $T4,$T4,$T12 xor $T5,$T5,$T13 xor $T6,$T6,$T14 xor $T7,$T7,$T15 xor $T0,$T0,$T4 xor $T1,$T1,$T5 xor $T2,$T2,$T6 xor $T3,$T3,$T7 # Update key ptr to point to next key in schedule add $KEYP,$KEYP,16 # Grab next key in schedule ld $T4,0($KEYP) ld $T6,8($KEYP) # Round TBL back to 4k boundary and $TBL,$TBL,$MSK add $loopcntr,$loopcntr,-1 xor $Q0,$T0,$T4 xor $Q2,$T2,$T6 srli $T5,$T4,32 xor $Q1,$T1,$T5 srli $T7,$T6,32 xor $Q3,$T3,$T7 bgtz $loopcntr,1b #================================FINAL ROUND==================================== # In the final round, all lookup table accesses would appear as follows: # # ... compute index I0 # add I0,TBL,T0 # lbu T0,1(I0) # # Instead of indexing with a 1 offset, we can add 1 to the TBL pointer, and use # a 0 offset when indexing in the following code. This enables some instruction # fusion opportunities. add $TBL,$TBL,1 ld $K0,16($KEYP) ld $K1,24($KEYP) ___ $code .= do_lookup_byte( [$T4,$T5,$T6,$T7], [$Q0,$Q1,$Q2,$Q3], [$T0,$T1,$T2,$T3], 0 ); $code .= do_lookup_byte( [$T8,$T9,$T10,$T11], [$Q1,$Q2,$Q3,$Q0], [$T0,$T1,$T2,$T3], 8 ); $code .= do_lookup_byte( [$T12,$T13,$T14,$T15], [$Q2,$Q3,$Q0,$Q1], [$T0,$T1,$T2,$T3], 16 ); $code .= do_lookup_byte( [$T0,$T1,$T2,$T3], [$Q3,$Q0,$Q1,$Q2], [$T0,$T1,$T2,$T3], 24 ); $code .= <<___; # Combine table lookups into T0 and T2 slli $T5,$T5,32 slli $T7,$T7,32 slli $T8,$T8,8 slli $T9,$T9,8+32 slli $T10,$T10,8 slli $T11,$T11,8+32 slli $T12,$T12,16 slli $T13,$T13,16+32 slli $T14,$T14,16 slli $T15,$T15,16+32 slli $T0,$T0,24 slli $T1,$T1,24+32 slli $T2,$T2,24 slli $T3,$T3,24+32 xor $T4,$T4,$T0 xor $T5,$T5,$T1 xor $T6,$T6,$T2 xor $T7,$T7,$T3 xor $T8,$T8,$T12 xor $T9,$T9,$T13 xor $T10,$T10,$T14 xor $T11,$T11,$T15 xor $T0,$T4,$T8 xor $T1,$T5,$T9 xor $T2,$T6,$T10 xor $T3,$T7,$T11 xor $T0,$T0,$T1 # T0 = [T1 T13 T9 T5 T0 T12 T8 T4] xor $T0,$T0,$K0 # XOR in key xor $T2,$T2,$T3 # T2 = [T3 T15 T11 T7 T2 T14 T10 T6] xor $T2,$T2,$K1 # XOR in key sd $T0,0($OUTP) sd $T2,8($OUTP) # Pop registers and return 2: ___ $code .= load_regs(); $code .= <<___; ret ___ ################################################################################ # void AES_decrypt(const unsigned char *in, unsigned char *out, # const AES_KEY *key); ################################################################################ $code .= <<___; .text .balign 16 .globl AES_decrypt .type AES_decrypt,\@function AES_decrypt: ___ $code .= save_regs(); $code .= <<___; # Load input to block cipher ld $Q0,0($INP) ld $Q2,8($INP) # Load key # Note that key is assumed in BE byte order # (This routine was written against a key scheduling implementation that # placed keys in BE byte order.) ld $T0,0($KEYP) ld $T2,8($KEYP) # Load number of rounds lwu $loopcntr,240($KEYP) # Load address of substitution table and wrap-around mask la $TBL,AES_Td0 li $MSK,~0xFFF xor $Q0,$Q0,$T0 xor $Q2,$Q2,$T2 srli $Q1,$Q0,32 srli $Q3,$Q2,32 # The main loop only executes the first N-1 rounds. add $loopcntr,$loopcntr,-1 # Do Nr - 1 rounds (final round is special) 1: ___ # Lookup in Td0 $code .= do_lookup( [$T4,$T5,$T6,$T7], # Destination registers [$Q0,$Q1,$Q2,$Q3], # State registers [$T0,$T1,$T2,$T3], # Temporaries 0 # Shift amount ); $code .= <<___; add $TBL,$TBL,1024 ___ # Lookup in Td1 $code .= do_lookup( [$T8,$T9,$T10,$T11], [$Q3,$Q0,$Q1,$Q2], [$T0,$T1,$T2,$T3], 8 ); $code .= <<___; add $TBL,$TBL,1024 ___ # Lookup in Td2 $code .= do_lookup( [$T12,$T13,$T14,$T15], [$Q2,$Q3,$Q0,$Q1], [$T0,$T1,$T2,$T3], 16 ); $code .= <<___; add $TBL,$TBL,1024 ___ # Lookup in Td3 $code .= do_lookup( [$T0,$T1,$T2,$T3], [$Q1,$Q2,$Q3,$Q0], [$T0,$T1,$T2,$T3], 24 ); $code .= <<___; xor $T4,$T4,$T8 xor $T5,$T5,$T9 xor $T6,$T6,$T10 xor $T7,$T7,$T11 xor $T4,$T4,$T12 xor $T5,$T5,$T13 xor $T6,$T6,$T14 xor $T7,$T7,$T15 xor $T0,$T0,$T4 xor $T1,$T1,$T5 xor $T2,$T2,$T6 xor $T3,$T3,$T7 # Update key ptr to point to next key in schedule add $KEYP,$KEYP,16 # Grab next key in schedule ld $T4,0($KEYP) ld $T6,8($KEYP) # Round TBL back to 4k boundary and $TBL,$TBL,$MSK add $loopcntr,$loopcntr,-1 xor $Q0,$T0,$T4 xor $Q2,$T2,$T6 srli $T5,$T4,32 xor $Q1,$T1,$T5 srli $T7,$T6,32 xor $Q3,$T3,$T7 bgtz $loopcntr,1b #================================FINAL ROUND==================================== la $TBL,AES_Td4 # K0,K1 are aliases for loopcntr,KEYP # As these registers will no longer be used after these loads, reuse them # to store the final key in the schedule. ld $K0,16($KEYP) ld $K1,24($KEYP) ___ $code .= do_lookup_Td4( [$T4,$T5,$T6,$T7], [$Q0,$Q3,$Q2,$Q1], [$T0,$T1,$T2,$T3] ); $code .= do_lookup_Td4( [$T8,$T9,$T10,$T11], [$Q1,$Q0,$Q3,$Q2], [$T0,$T1,$T2,$T3] ); $code .= do_lookup_Td4( [$T12,$T13,$T14,$T15], [$Q2,$Q1,$Q0,$Q3], [$T0,$T1,$T2,$T3] ); $code .= do_lookup_Td4( [$T0,$T1,$T2,$T3], [$Q3,$Q2,$Q1,$Q0], [$T0,$T1,$T2,$T3] ); $code .= <<___; # T0-T15 now contain the decrypted block, minus xoring with the final round # key. We pack T0-T15 into the two 64-bit registers T0 and T4, then xor # in the key and store. slli $T5,$T5,8 slli $T6,$T6,16 slli $T7,$T7,24 slli $T8,$T8,32 slli $T9,$T9,8+32 slli $T10,$T10,16+32 slli $T11,$T11,32+24 slli $T13,$T13,8 slli $T14,$T14,16 slli $T15,$T15,24 slli $T0,$T0,32 slli $T1,$T1,8+32 slli $T2,$T2,16+32 slli $T3,$T3,24+32 xor $T4,$T4,$T5 xor $T6,$T6,$T7 xor $T8,$T8,$T9 xor $T10,$T10,$T11 xor $T12,$T12,$T13 xor $T14,$T14,$T15 xor $T0,$T0,$T1 xor $T2,$T2,$T3 xor $T4,$T4,$T6 xor $T8,$T8,$T10 xor $T12,$T12,$T14 xor $T0,$T0,$T2 xor $T4,$T4,$T8 # T4 = [T11 T10 T9 T8 T7 T6 T5 T4] xor $T4,$T4,$K0 # xor in key xor $T0,$T0,$T12 # T0 = [T3 T2 T1 T0 T15 T14 T13 T12] xor $T0,$T0,$K1 # xor in key sd $T4,0($OUTP) sd $T0,8($OUTP) # Pop registers and return ___ $code .= load_regs(); $code .= <<___; ret ___ clear_regs(); ################################################################################ # Register assignment for AES_set_encrypt_key ################################################################################ # Function arguments (x10-x12 are a0-a2 in the ABI) # Pointer to user key, number of bits in key, key pointer my ($UKEY,$BITS,$KEYP) = use_regs(10..12); # Temporaries my ($T0,$T1,$T2,$T3) = use_regs(6..8,13); my ($T4,$T5,$T6,$T7,$T8,$T9,$T10,$T11) = use_regs(14..17,28..31); # Pointer into rcon table my ($RCON) = use_regs(9); # Register to hold table offset and used as a temporary my ($I0) = use_regs(18); # Loop counter my ($loopcntr) = use_regs(19); # Lookup table address register my ($TBL) = use_regs(20); # Calculates dest = [ # S[(in>>shifts[3])&0xFF], # S[(in>>shifts[2])&0xFF], # S[(in>>shifts[1])&0xFF], # S[(in>>shifts[0])&0xFF] # ] # This routine spreads accesses across Te0-Te3 to help bring those tables # into cache, in anticipation of running AES_[en/de]crypt. sub do_enc_lookup { # (destination reg, input reg, shifts array, temporary regs) my ($dest, $in, $shifts, $Ts) = @_; my $ret = ''; $ret .= <<___; # Round TBL back to 4k boundary srli $TBL,$TBL,12 slli $TBL,$TBL,12 # Offset by 1 byte, since Te0[x] = S[x].[03, 01, 01, 02] # So that, later on, a 0-offset lbu yields S[x].01 == S[x] addi $TBL,$TBL,1 ___ for ($i = 0; $i < 4; $i++) { if ($shifts->[$i] < 2) { $ret .= " slli $Ts->[$i],$in,2-$shifts->[$i]\n"; } else { $ret .= " srli $Ts->[$i],$in,$shifts->[$i]-2\n"; } } $ret .= <<___; andi $Ts->[0],$Ts->[0],0x3FC andi $Ts->[1],$Ts->[1],0x3FC andi $Ts->[2],$Ts->[2],0x3FC andi $Ts->[3],$Ts->[3],0x3FC # Index into tables Te0-Te3 (spread access across tables to help bring # them into cache for later) add $I0,$TBL,$Ts->[0] lbu $Ts->[0],0($I0) add $TBL,$TBL,1025 # yes, 1025 add $I0,$TBL,$Ts->[1] lbu $Ts->[1],0($I0) add $TBL,$TBL,1025 add $I0,$TBL,$Ts->[2] lbu $Ts->[2],0($I0) add $TBL,$TBL,1022 add $I0,$TBL,$Ts->[3] lbu $Ts->[3],0($I0) slli $Ts->[1],$Ts->[1],8 slli $Ts->[2],$Ts->[2],16 slli $Ts->[3],$Ts->[3],24 xor $Ts->[0],$Ts->[0],$Ts->[1] xor $Ts->[2],$Ts->[2],$Ts->[3] xor $dest,$Ts->[0],$Ts->[2] ___ return $ret; } ################################################################################ # void AES_set_encrypt_key(const unsigned char *userKey, const int bits, # AES_KEY *key) ################################################################################ $code .= <<___; .text .balign 16 .globl AES_set_encrypt_key .type AES_set_encrypt_key,\@function AES_set_encrypt_key: ___ $code .= save_regs(); $code .= <<___; bnez $UKEY,1f # if (!userKey || !key) return -1; bnez $KEYP,1f li a0,-1 ret 1: la $RCON,AES_rcon la $TBL,AES_Te0 li $T8,128 li $T9,192 li $T10,256 # Determine number of rounds from key size in bits bne $BITS,$T8,1f li $T3,10 # key->rounds = 10 if bits == 128 j 3f 1: bne $BITS,$T9,2f li $T3,12 # key->rounds = 12 if bits == 192 j 3f 2: li $T3,14 # key->rounds = 14 if bits == 256 beq $BITS,$T10,3f li a0,-2 # If bits != 128, 192, or 256, return -2 j 5f 3: ld $T0,0($UKEY) ld $T2,8($UKEY) sw $T3,240($KEYP) li $loopcntr,0 # == i*4 srli $T1,$T0,32 srli $T3,$T2,32 sd $T0,0($KEYP) sd $T2,8($KEYP) # if bits == 128 # jump into loop beq $BITS,$T8,1f ld $T4,16($UKEY) srli $T5,$T4,32 sd $T4,16($KEYP) # if bits == 192 # jump into loop beq $BITS,$T9,2f ld $T6,24($UKEY) srli $T7,$T6,32 sd $T6,24($KEYP) # bits == 256 j 3f ___ $code .= <<___; 1: addi $KEYP,$KEYP,16 1: ___ $code .= do_enc_lookup($T4,$T3,[8,16,24,0],[$T4,$T5,$T6,$T7]); $code .= <<___; add $T5,$RCON,$loopcntr # rcon[i] (i increments by 4 so it can double as # a word offset) lwu $T5,0($T5) addi $loopcntr,$loopcntr,4 li $I0,10*4 xor $T0,$T0,$T4 xor $T0,$T0,$T5 xor $T1,$T1,$T0 xor $T2,$T2,$T1 xor $T3,$T3,$T2 sw $T0,0($KEYP) sw $T1,4($KEYP) sw $T2,8($KEYP) sw $T3,12($KEYP) addi $KEYP,$KEYP,16 bne $loopcntr,$I0,1b j 4f ___ $code .= <<___; 2: addi $KEYP,$KEYP,24 2: ___ $code .= do_enc_lookup($T6,$T5,[8,16,24,0],[$T6,$T7,$T8,$T9]); $code .= <<___; add $T7,$RCON,$loopcntr # rcon[i] (i increments by 4 so it can double as # a word offset) lwu $T7,0($T7) addi $loopcntr,$loopcntr,4 li $I0,8*4 xor $T0,$T0,$T6 xor $T0,$T0,$T7 xor $T1,$T1,$T0 xor $T2,$T2,$T1 xor $T3,$T3,$T2 sw $T0,0($KEYP) sw $T1,4($KEYP) sw $T2,8($KEYP) sw $T3,12($KEYP) beq $loopcntr,$I0,4f xor $T4,$T4,$T3 xor $T5,$T5,$T4 sw $T4,16($KEYP) sw $T5,20($KEYP) addi $KEYP,$KEYP,24 j 2b ___ $code .= <<___; 3: addi $KEYP,$KEYP,32 3: ___ $code .= do_enc_lookup($T8,$T7,[8,16,24,0],[$T8,$T9,$T10,$T11]); $code .= <<___; add $T9,$RCON,$loopcntr # rcon[i] (i increments by 4 so it can double as # a word offset) lwu $T9,0($T9) addi $loopcntr,$loopcntr,4 li $I0,7*4 xor $T0,$T0,$T8 xor $T0,$T0,$T9 xor $T1,$T1,$T0 xor $T2,$T2,$T1 xor $T3,$T3,$T2 sw $T0,0($KEYP) sw $T1,4($KEYP) sw $T2,8($KEYP) sw $T3,12($KEYP) beq $loopcntr,$I0,4f ___ $code .= do_enc_lookup($T8,$T3,[0,8,16,24],[$T8,$T9,$T10,$T11]); $code .= <<___; xor $T4,$T4,$T8 xor $T5,$T5,$T4 xor $T6,$T6,$T5 xor $T7,$T7,$T6 sw $T4,16($KEYP) sw $T5,20($KEYP) sw $T6,24($KEYP) sw $T7,28($KEYP) addi $KEYP,$KEYP,32 j 3b 4: # return 0 li a0,0 5: # return a0 ___ $code .= load_regs(); $code .= <<___; ret ___ clear_regs(); ################################################################################ # Register assignment for AES_set_decrypt_key ################################################################################ # Function arguments (x10-x12 are a0-a2 in the ABI) # Pointer to user key, number of bits in key, key pointer my ($UKEY,$BITS,$KEYP) = use_regs(10..12); # Temporaries my ($T0,$T1,$T2,$T3) = use_regs(6..8,9); my ($T4,$T5,$T6,$T7,$T8) = use_regs(13..17); my ($I1) = use_regs(18); # Register to hold table offset and used as a temporary my ($I0) = use_regs(19); # Loop counter my ($loopcntr) = use_regs(20); # Lookup table address register my ($TBL) = use_regs(21); # Calculates dest = [ # Td0[Te1[(in >> 24) & 0xff] & 0xff] ^ # Td1[Te1[(in >> 16) & 0xff] & 0xff] ^ # Td2[Te1[(in >> 8) & 0xff] & 0xff] ^ # Td3[Te1[(in ) & 0xff] & 0xff] # ] sub do_dec_lookup { # (destination reg, input reg, temporary regs) my ($dest, $in, $Ts) = @_; my $ret = ''; $ret .= <<___; la $TBL,AES_Te2 slli $Ts->[0],$in,2 srli $Ts->[1],$in,8-2 srli $Ts->[2],$in,16-2 srli $Ts->[3],$in,24-2 andi $Ts->[0],$Ts->[0],0x3FC andi $Ts->[1],$Ts->[1],0x3FC andi $Ts->[2],$Ts->[2],0x3FC andi $Ts->[3],$Ts->[3],0x3FC # Index into table Te2 add $I0,$TBL,$Ts->[0] lwu $Ts->[0],0($I0) add $I0,$TBL,$Ts->[1] lwu $Ts->[1],0($I0) add $I0,$TBL,$Ts->[2] lwu $Ts->[2],0($I0) add $I0,$TBL,$Ts->[3] lwu $Ts->[3],0($I0) andi $Ts->[0],$Ts->[0],0xFF andi $Ts->[1],$Ts->[1],0xFF andi $Ts->[2],$Ts->[2],0xFF andi $Ts->[3],$Ts->[3],0xFF slli $Ts->[0],$Ts->[0],2 slli $Ts->[1],$Ts->[1],2 slli $Ts->[2],$Ts->[2],2 slli $Ts->[3],$Ts->[3],2 la $TBL,AES_Td0 # Lookup in Td0-Td3 add $I0,$TBL,$Ts->[0] lwu $Ts->[0],0($I0) add $TBL,$TBL,1024 add $I0,$TBL,$Ts->[1] lwu $Ts->[1],0($I0) add $TBL,$TBL,1024 add $I0,$TBL,$Ts->[2] lwu $Ts->[2],0($I0) add $TBL,$TBL,1024 add $I0,$TBL,$Ts->[3] lwu $Ts->[3],0($I0) xor $Ts->[0],$Ts->[0],$Ts->[1] xor $Ts->[2],$Ts->[2],$Ts->[3] xor $dest,$Ts->[0],$Ts->[2] ___ return $ret; } ################################################################################ # void AES_set_decrypt_key(const unsigned char *userKey, const int bits, # AES_KEY *key) ################################################################################ $code .= <<___; .text .balign 16 .globl AES_set_decrypt_key .type AES_set_decrypt_key,\@function AES_set_decrypt_key: # Call AES_set_encrypt_key first addi sp,sp,-16 sd $KEYP,0(sp) # We need to hold onto this! sd ra,8(sp) jal ra,AES_set_encrypt_key ld $KEYP,0(sp) ld ra,8(sp) addi sp,sp,16 bgez a0,1f # If error, return error ret 1: ___ $code .= save_regs(); $code .= <<___; li $T4,0 lwu $T8,240($KEYP) slli $T5,$T8,4 # Invert order of round keys 1: add $I0,$KEYP,$T4 ld $T0,0($I0) ld $T1,8($I0) add $I1,$KEYP,$T5 ld $T2,0($I1) ld $T3,8($I1) addi $T4,$T4,16 addi $T5,$T5,-16 sd $T0,0($I1) sd $T1,8($I1) sd $T2,0($I0) sd $T3,8($I0) blt $T4,$T5,1b li $loopcntr,1 1: addi $KEYP,$KEYP,16 lwu $T0,0($KEYP) lwu $T1,4($KEYP) lwu $T2,8($KEYP) lwu $T3,12($KEYP) ___ $code .= do_dec_lookup($T0,$T0,[$T4,$T5,$T6,$T7]); $code .= do_dec_lookup($T1,$T1,[$T4,$T5,$T6,$T7]); $code .= do_dec_lookup($T2,$T2,[$T4,$T5,$T6,$T7]); $code .= do_dec_lookup($T3,$T3,[$T4,$T5,$T6,$T7]); $code .= <<___; sw $T0,0($KEYP) sw $T1,4($KEYP) sw $T2,8($KEYP) sw $T3,12($KEYP) addi $loopcntr,$loopcntr,1 blt $loopcntr,$T8,1b ___ $code .= load_regs(); $code .= <<___; li a0,0 ret ___ $code .= <<___; .section .rodata .p2align 12 .type AES_Te0,\@object AES_Te0: .word 0xa56363c6U, 0x847c7cf8U, 0x997777eeU, 0x8d7b7bf6U .word 0x0df2f2ffU, 0xbd6b6bd6U, 0xb16f6fdeU, 0x54c5c591U .word 0x50303060U, 0x03010102U, 0xa96767ceU, 0x7d2b2b56U .word 0x19fefee7U, 0x62d7d7b5U, 0xe6abab4dU, 0x9a7676ecU .word 0x45caca8fU, 0x9d82821fU, 0x40c9c989U, 0x877d7dfaU .word 0x15fafaefU, 0xeb5959b2U, 0xc947478eU, 0x0bf0f0fbU .word 0xecadad41U, 0x67d4d4b3U, 0xfda2a25fU, 0xeaafaf45U .word 0xbf9c9c23U, 0xf7a4a453U, 0x967272e4U, 0x5bc0c09bU .word 0xc2b7b775U, 0x1cfdfde1U, 0xae93933dU, 0x6a26264cU .word 0x5a36366cU, 0x413f3f7eU, 0x02f7f7f5U, 0x4fcccc83U .word 0x5c343468U, 0xf4a5a551U, 0x34e5e5d1U, 0x08f1f1f9U .word 0x937171e2U, 0x73d8d8abU, 0x53313162U, 0x3f15152aU .word 0x0c040408U, 0x52c7c795U, 0x65232346U, 0x5ec3c39dU .word 0x28181830U, 0xa1969637U, 0x0f05050aU, 0xb59a9a2fU .word 0x0907070eU, 0x36121224U, 0x9b80801bU, 0x3de2e2dfU .word 0x26ebebcdU, 0x6927274eU, 0xcdb2b27fU, 0x9f7575eaU .word 0x1b090912U, 0x9e83831dU, 0x742c2c58U, 0x2e1a1a34U .word 0x2d1b1b36U, 0xb26e6edcU, 0xee5a5ab4U, 0xfba0a05bU .word 0xf65252a4U, 0x4d3b3b76U, 0x61d6d6b7U, 0xceb3b37dU .word 0x7b292952U, 0x3ee3e3ddU, 0x712f2f5eU, 0x97848413U .word 0xf55353a6U, 0x68d1d1b9U, 0x00000000U, 0x2cededc1U .word 0x60202040U, 0x1ffcfce3U, 0xc8b1b179U, 0xed5b5bb6U .word 0xbe6a6ad4U, 0x46cbcb8dU, 0xd9bebe67U, 0x4b393972U .word 0xde4a4a94U, 0xd44c4c98U, 0xe85858b0U, 0x4acfcf85U .word 0x6bd0d0bbU, 0x2aefefc5U, 0xe5aaaa4fU, 0x16fbfbedU .word 0xc5434386U, 0xd74d4d9aU, 0x55333366U, 0x94858511U .word 0xcf45458aU, 0x10f9f9e9U, 0x06020204U, 0x817f7ffeU .word 0xf05050a0U, 0x443c3c78U, 0xba9f9f25U, 0xe3a8a84bU .word 0xf35151a2U, 0xfea3a35dU, 0xc0404080U, 0x8a8f8f05U .word 0xad92923fU, 0xbc9d9d21U, 0x48383870U, 0x04f5f5f1U .word 0xdfbcbc63U, 0xc1b6b677U, 0x75dadaafU, 0x63212142U .word 0x30101020U, 0x1affffe5U, 0x0ef3f3fdU, 0x6dd2d2bfU .word 0x4ccdcd81U, 0x140c0c18U, 0x35131326U, 0x2fececc3U .word 0xe15f5fbeU, 0xa2979735U, 0xcc444488U, 0x3917172eU .word 0x57c4c493U, 0xf2a7a755U, 0x827e7efcU, 0x473d3d7aU .word 0xac6464c8U, 0xe75d5dbaU, 0x2b191932U, 0x957373e6U .word 0xa06060c0U, 0x98818119U, 0xd14f4f9eU, 0x7fdcdca3U .word 0x66222244U, 0x7e2a2a54U, 0xab90903bU, 0x8388880bU .word 0xca46468cU, 0x29eeeec7U, 0xd3b8b86bU, 0x3c141428U .word 0x79dedea7U, 0xe25e5ebcU, 0x1d0b0b16U, 0x76dbdbadU .word 0x3be0e0dbU, 0x56323264U, 0x4e3a3a74U, 0x1e0a0a14U .word 0xdb494992U, 0x0a06060cU, 0x6c242448U, 0xe45c5cb8U .word 0x5dc2c29fU, 0x6ed3d3bdU, 0xefacac43U, 0xa66262c4U .word 0xa8919139U, 0xa4959531U, 0x37e4e4d3U, 0x8b7979f2U .word 0x32e7e7d5U, 0x43c8c88bU, 0x5937376eU, 0xb76d6ddaU .word 0x8c8d8d01U, 0x64d5d5b1U, 0xd24e4e9cU, 0xe0a9a949U .word 0xb46c6cd8U, 0xfa5656acU, 0x07f4f4f3U, 0x25eaeacfU .word 0xaf6565caU, 0x8e7a7af4U, 0xe9aeae47U, 0x18080810U .word 0xd5baba6fU, 0x887878f0U, 0x6f25254aU, 0x722e2e5cU .word 0x241c1c38U, 0xf1a6a657U, 0xc7b4b473U, 0x51c6c697U .word 0x23e8e8cbU, 0x7cdddda1U, 0x9c7474e8U, 0x211f1f3eU .word 0xdd4b4b96U, 0xdcbdbd61U, 0x868b8b0dU, 0x858a8a0fU .word 0x907070e0U, 0x423e3e7cU, 0xc4b5b571U, 0xaa6666ccU .word 0xd8484890U, 0x05030306U, 0x01f6f6f7U, 0x120e0e1cU .word 0xa36161c2U, 0x5f35356aU, 0xf95757aeU, 0xd0b9b969U .word 0x91868617U, 0x58c1c199U, 0x271d1d3aU, 0xb99e9e27U .word 0x38e1e1d9U, 0x13f8f8ebU, 0xb398982bU, 0x33111122U .word 0xbb6969d2U, 0x70d9d9a9U, 0x898e8e07U, 0xa7949433U .word 0xb69b9b2dU, 0x221e1e3cU, 0x92878715U, 0x20e9e9c9U .word 0x49cece87U, 0xff5555aaU, 0x78282850U, 0x7adfdfa5U .word 0x8f8c8c03U, 0xf8a1a159U, 0x80898909U, 0x170d0d1aU .word 0xdabfbf65U, 0x31e6e6d7U, 0xc6424284U, 0xb86868d0U .word 0xc3414182U, 0xb0999929U, 0x772d2d5aU, 0x110f0f1eU .word 0xcbb0b07bU, 0xfc5454a8U, 0xd6bbbb6dU, 0x3a16162cU .type AES_Te1,\@object AES_Te1: .word 0x6363c6a5U, 0x7c7cf884U, 0x7777ee99U, 0x7b7bf68dU .word 0xf2f2ff0dU, 0x6b6bd6bdU, 0x6f6fdeb1U, 0xc5c59154U .word 0x30306050U, 0x01010203U, 0x6767cea9U, 0x2b2b567dU .word 0xfefee719U, 0xd7d7b562U, 0xabab4de6U, 0x7676ec9aU .word 0xcaca8f45U, 0x82821f9dU, 0xc9c98940U, 0x7d7dfa87U .word 0xfafaef15U, 0x5959b2ebU, 0x47478ec9U, 0xf0f0fb0bU .word 0xadad41ecU, 0xd4d4b367U, 0xa2a25ffdU, 0xafaf45eaU .word 0x9c9c23bfU, 0xa4a453f7U, 0x7272e496U, 0xc0c09b5bU .word 0xb7b775c2U, 0xfdfde11cU, 0x93933daeU, 0x26264c6aU .word 0x36366c5aU, 0x3f3f7e41U, 0xf7f7f502U, 0xcccc834fU .word 0x3434685cU, 0xa5a551f4U, 0xe5e5d134U, 0xf1f1f908U .word 0x7171e293U, 0xd8d8ab73U, 0x31316253U, 0x15152a3fU .word 0x0404080cU, 0xc7c79552U, 0x23234665U, 0xc3c39d5eU .word 0x18183028U, 0x969637a1U, 0x05050a0fU, 0x9a9a2fb5U .word 0x07070e09U, 0x12122436U, 0x80801b9bU, 0xe2e2df3dU .word 0xebebcd26U, 0x27274e69U, 0xb2b27fcdU, 0x7575ea9fU .word 0x0909121bU, 0x83831d9eU, 0x2c2c5874U, 0x1a1a342eU .word 0x1b1b362dU, 0x6e6edcb2U, 0x5a5ab4eeU, 0xa0a05bfbU .word 0x5252a4f6U, 0x3b3b764dU, 0xd6d6b761U, 0xb3b37dceU .word 0x2929527bU, 0xe3e3dd3eU, 0x2f2f5e71U, 0x84841397U .word 0x5353a6f5U, 0xd1d1b968U, 0x00000000U, 0xededc12cU .word 0x20204060U, 0xfcfce31fU, 0xb1b179c8U, 0x5b5bb6edU .word 0x6a6ad4beU, 0xcbcb8d46U, 0xbebe67d9U, 0x3939724bU .word 0x4a4a94deU, 0x4c4c98d4U, 0x5858b0e8U, 0xcfcf854aU .word 0xd0d0bb6bU, 0xefefc52aU, 0xaaaa4fe5U, 0xfbfbed16U .word 0x434386c5U, 0x4d4d9ad7U, 0x33336655U, 0x85851194U .word 0x45458acfU, 0xf9f9e910U, 0x02020406U, 0x7f7ffe81U .word 0x5050a0f0U, 0x3c3c7844U, 0x9f9f25baU, 0xa8a84be3U .word 0x5151a2f3U, 0xa3a35dfeU, 0x404080c0U, 0x8f8f058aU .word 0x92923fadU, 0x9d9d21bcU, 0x38387048U, 0xf5f5f104U .word 0xbcbc63dfU, 0xb6b677c1U, 0xdadaaf75U, 0x21214263U .word 0x10102030U, 0xffffe51aU, 0xf3f3fd0eU, 0xd2d2bf6dU .word 0xcdcd814cU, 0x0c0c1814U, 0x13132635U, 0xececc32fU .word 0x5f5fbee1U, 0x979735a2U, 0x444488ccU, 0x17172e39U .word 0xc4c49357U, 0xa7a755f2U, 0x7e7efc82U, 0x3d3d7a47U .word 0x6464c8acU, 0x5d5dbae7U, 0x1919322bU, 0x7373e695U .word 0x6060c0a0U, 0x81811998U, 0x4f4f9ed1U, 0xdcdca37fU .word 0x22224466U, 0x2a2a547eU, 0x90903babU, 0x88880b83U .word 0x46468ccaU, 0xeeeec729U, 0xb8b86bd3U, 0x1414283cU .word 0xdedea779U, 0x5e5ebce2U, 0x0b0b161dU, 0xdbdbad76U .word 0xe0e0db3bU, 0x32326456U, 0x3a3a744eU, 0x0a0a141eU .word 0x494992dbU, 0x06060c0aU, 0x2424486cU, 0x5c5cb8e4U .word 0xc2c29f5dU, 0xd3d3bd6eU, 0xacac43efU, 0x6262c4a6U .word 0x919139a8U, 0x959531a4U, 0xe4e4d337U, 0x7979f28bU .word 0xe7e7d532U, 0xc8c88b43U, 0x37376e59U, 0x6d6ddab7U .word 0x8d8d018cU, 0xd5d5b164U, 0x4e4e9cd2U, 0xa9a949e0U .word 0x6c6cd8b4U, 0x5656acfaU, 0xf4f4f307U, 0xeaeacf25U .word 0x6565caafU, 0x7a7af48eU, 0xaeae47e9U, 0x08081018U .word 0xbaba6fd5U, 0x7878f088U, 0x25254a6fU, 0x2e2e5c72U .word 0x1c1c3824U, 0xa6a657f1U, 0xb4b473c7U, 0xc6c69751U .word 0xe8e8cb23U, 0xdddda17cU, 0x7474e89cU, 0x1f1f3e21U .word 0x4b4b96ddU, 0xbdbd61dcU, 0x8b8b0d86U, 0x8a8a0f85U .word 0x7070e090U, 0x3e3e7c42U, 0xb5b571c4U, 0x6666ccaaU .word 0x484890d8U, 0x03030605U, 0xf6f6f701U, 0x0e0e1c12U .word 0x6161c2a3U, 0x35356a5fU, 0x5757aef9U, 0xb9b969d0U .word 0x86861791U, 0xc1c19958U, 0x1d1d3a27U, 0x9e9e27b9U .word 0xe1e1d938U, 0xf8f8eb13U, 0x98982bb3U, 0x11112233U .word 0x6969d2bbU, 0xd9d9a970U, 0x8e8e0789U, 0x949433a7U .word 0x9b9b2db6U, 0x1e1e3c22U, 0x87871592U, 0xe9e9c920U .word 0xcece8749U, 0x5555aaffU, 0x28285078U, 0xdfdfa57aU .word 0x8c8c038fU, 0xa1a159f8U, 0x89890980U, 0x0d0d1a17U .word 0xbfbf65daU, 0xe6e6d731U, 0x424284c6U, 0x6868d0b8U .word 0x414182c3U, 0x999929b0U, 0x2d2d5a77U, 0x0f0f1e11U .word 0xb0b07bcbU, 0x5454a8fcU, 0xbbbb6dd6U, 0x16162c3aU .type AES_Te2,\@object AES_Te2: .word 0x63c6a563U, 0x7cf8847cU, 0x77ee9977U, 0x7bf68d7bU .word 0xf2ff0df2U, 0x6bd6bd6bU, 0x6fdeb16fU, 0xc59154c5U .word 0x30605030U, 0x01020301U, 0x67cea967U, 0x2b567d2bU .word 0xfee719feU, 0xd7b562d7U, 0xab4de6abU, 0x76ec9a76U .word 0xca8f45caU, 0x821f9d82U, 0xc98940c9U, 0x7dfa877dU .word 0xfaef15faU, 0x59b2eb59U, 0x478ec947U, 0xf0fb0bf0U .word 0xad41ecadU, 0xd4b367d4U, 0xa25ffda2U, 0xaf45eaafU .word 0x9c23bf9cU, 0xa453f7a4U, 0x72e49672U, 0xc09b5bc0U .word 0xb775c2b7U, 0xfde11cfdU, 0x933dae93U, 0x264c6a26U .word 0x366c5a36U, 0x3f7e413fU, 0xf7f502f7U, 0xcc834fccU .word 0x34685c34U, 0xa551f4a5U, 0xe5d134e5U, 0xf1f908f1U .word 0x71e29371U, 0xd8ab73d8U, 0x31625331U, 0x152a3f15U .word 0x04080c04U, 0xc79552c7U, 0x23466523U, 0xc39d5ec3U .word 0x18302818U, 0x9637a196U, 0x050a0f05U, 0x9a2fb59aU .word 0x070e0907U, 0x12243612U, 0x801b9b80U, 0xe2df3de2U .word 0xebcd26ebU, 0x274e6927U, 0xb27fcdb2U, 0x75ea9f75U .word 0x09121b09U, 0x831d9e83U, 0x2c58742cU, 0x1a342e1aU .word 0x1b362d1bU, 0x6edcb26eU, 0x5ab4ee5aU, 0xa05bfba0U .word 0x52a4f652U, 0x3b764d3bU, 0xd6b761d6U, 0xb37dceb3U .word 0x29527b29U, 0xe3dd3ee3U, 0x2f5e712fU, 0x84139784U .word 0x53a6f553U, 0xd1b968d1U, 0x00000000U, 0xedc12cedU .word 0x20406020U, 0xfce31ffcU, 0xb179c8b1U, 0x5bb6ed5bU .word 0x6ad4be6aU, 0xcb8d46cbU, 0xbe67d9beU, 0x39724b39U .word 0x4a94de4aU, 0x4c98d44cU, 0x58b0e858U, 0xcf854acfU .word 0xd0bb6bd0U, 0xefc52aefU, 0xaa4fe5aaU, 0xfbed16fbU .word 0x4386c543U, 0x4d9ad74dU, 0x33665533U, 0x85119485U .word 0x458acf45U, 0xf9e910f9U, 0x02040602U, 0x7ffe817fU .word 0x50a0f050U, 0x3c78443cU, 0x9f25ba9fU, 0xa84be3a8U .word 0x51a2f351U, 0xa35dfea3U, 0x4080c040U, 0x8f058a8fU .word 0x923fad92U, 0x9d21bc9dU, 0x38704838U, 0xf5f104f5U .word 0xbc63dfbcU, 0xb677c1b6U, 0xdaaf75daU, 0x21426321U .word 0x10203010U, 0xffe51affU, 0xf3fd0ef3U, 0xd2bf6dd2U .word 0xcd814ccdU, 0x0c18140cU, 0x13263513U, 0xecc32fecU .word 0x5fbee15fU, 0x9735a297U, 0x4488cc44U, 0x172e3917U .word 0xc49357c4U, 0xa755f2a7U, 0x7efc827eU, 0x3d7a473dU .word 0x64c8ac64U, 0x5dbae75dU, 0x19322b19U, 0x73e69573U .word 0x60c0a060U, 0x81199881U, 0x4f9ed14fU, 0xdca37fdcU .word 0x22446622U, 0x2a547e2aU, 0x903bab90U, 0x880b8388U .word 0x468cca46U, 0xeec729eeU, 0xb86bd3b8U, 0x14283c14U .word 0xdea779deU, 0x5ebce25eU, 0x0b161d0bU, 0xdbad76dbU .word 0xe0db3be0U, 0x32645632U, 0x3a744e3aU, 0x0a141e0aU .word 0x4992db49U, 0x060c0a06U, 0x24486c24U, 0x5cb8e45cU .word 0xc29f5dc2U, 0xd3bd6ed3U, 0xac43efacU, 0x62c4a662U .word 0x9139a891U, 0x9531a495U, 0xe4d337e4U, 0x79f28b79U .word 0xe7d532e7U, 0xc88b43c8U, 0x376e5937U, 0x6ddab76dU .word 0x8d018c8dU, 0xd5b164d5U, 0x4e9cd24eU, 0xa949e0a9U .word 0x6cd8b46cU, 0x56acfa56U, 0xf4f307f4U, 0xeacf25eaU .word 0x65caaf65U, 0x7af48e7aU, 0xae47e9aeU, 0x08101808U .word 0xba6fd5baU, 0x78f08878U, 0x254a6f25U, 0x2e5c722eU .word 0x1c38241cU, 0xa657f1a6U, 0xb473c7b4U, 0xc69751c6U .word 0xe8cb23e8U, 0xdda17cddU, 0x74e89c74U, 0x1f3e211fU .word 0x4b96dd4bU, 0xbd61dcbdU, 0x8b0d868bU, 0x8a0f858aU .word 0x70e09070U, 0x3e7c423eU, 0xb571c4b5U, 0x66ccaa66U .word 0x4890d848U, 0x03060503U, 0xf6f701f6U, 0x0e1c120eU .word 0x61c2a361U, 0x356a5f35U, 0x57aef957U, 0xb969d0b9U .word 0x86179186U, 0xc19958c1U, 0x1d3a271dU, 0x9e27b99eU .word 0xe1d938e1U, 0xf8eb13f8U, 0x982bb398U, 0x11223311U .word 0x69d2bb69U, 0xd9a970d9U, 0x8e07898eU, 0x9433a794U .word 0x9b2db69bU, 0x1e3c221eU, 0x87159287U, 0xe9c920e9U .word 0xce8749ceU, 0x55aaff55U, 0x28507828U, 0xdfa57adfU .word 0x8c038f8cU, 0xa159f8a1U, 0x89098089U, 0x0d1a170dU .word 0xbf65dabfU, 0xe6d731e6U, 0x4284c642U, 0x68d0b868U .word 0x4182c341U, 0x9929b099U, 0x2d5a772dU, 0x0f1e110fU .word 0xb07bcbb0U, 0x54a8fc54U, 0xbb6dd6bbU, 0x162c3a16U .type AES_Te3,\@object AES_Te3: .word 0xc6a56363U, 0xf8847c7cU, 0xee997777U, 0xf68d7b7bU .word 0xff0df2f2U, 0xd6bd6b6bU, 0xdeb16f6fU, 0x9154c5c5U .word 0x60503030U, 0x02030101U, 0xcea96767U, 0x567d2b2bU .word 0xe719fefeU, 0xb562d7d7U, 0x4de6ababU, 0xec9a7676U .word 0x8f45cacaU, 0x1f9d8282U, 0x8940c9c9U, 0xfa877d7dU .word 0xef15fafaU, 0xb2eb5959U, 0x8ec94747U, 0xfb0bf0f0U .word 0x41ecadadU, 0xb367d4d4U, 0x5ffda2a2U, 0x45eaafafU .word 0x23bf9c9cU, 0x53f7a4a4U, 0xe4967272U, 0x9b5bc0c0U .word 0x75c2b7b7U, 0xe11cfdfdU, 0x3dae9393U, 0x4c6a2626U .word 0x6c5a3636U, 0x7e413f3fU, 0xf502f7f7U, 0x834fccccU .word 0x685c3434U, 0x51f4a5a5U, 0xd134e5e5U, 0xf908f1f1U .word 0xe2937171U, 0xab73d8d8U, 0x62533131U, 0x2a3f1515U .word 0x080c0404U, 0x9552c7c7U, 0x46652323U, 0x9d5ec3c3U .word 0x30281818U, 0x37a19696U, 0x0a0f0505U, 0x2fb59a9aU .word 0x0e090707U, 0x24361212U, 0x1b9b8080U, 0xdf3de2e2U .word 0xcd26ebebU, 0x4e692727U, 0x7fcdb2b2U, 0xea9f7575U .word 0x121b0909U, 0x1d9e8383U, 0x58742c2cU, 0x342e1a1aU .word 0x362d1b1bU, 0xdcb26e6eU, 0xb4ee5a5aU, 0x5bfba0a0U .word 0xa4f65252U, 0x764d3b3bU, 0xb761d6d6U, 0x7dceb3b3U .word 0x527b2929U, 0xdd3ee3e3U, 0x5e712f2fU, 0x13978484U .word 0xa6f55353U, 0xb968d1d1U, 0x00000000U, 0xc12cededU .word 0x40602020U, 0xe31ffcfcU, 0x79c8b1b1U, 0xb6ed5b5bU .word 0xd4be6a6aU, 0x8d46cbcbU, 0x67d9bebeU, 0x724b3939U .word 0x94de4a4aU, 0x98d44c4cU, 0xb0e85858U, 0x854acfcfU .word 0xbb6bd0d0U, 0xc52aefefU, 0x4fe5aaaaU, 0xed16fbfbU .word 0x86c54343U, 0x9ad74d4dU, 0x66553333U, 0x11948585U .word 0x8acf4545U, 0xe910f9f9U, 0x04060202U, 0xfe817f7fU .word 0xa0f05050U, 0x78443c3cU, 0x25ba9f9fU, 0x4be3a8a8U .word 0xa2f35151U, 0x5dfea3a3U, 0x80c04040U, 0x058a8f8fU .word 0x3fad9292U, 0x21bc9d9dU, 0x70483838U, 0xf104f5f5U .word 0x63dfbcbcU, 0x77c1b6b6U, 0xaf75dadaU, 0x42632121U .word 0x20301010U, 0xe51affffU, 0xfd0ef3f3U, 0xbf6dd2d2U .word 0x814ccdcdU, 0x18140c0cU, 0x26351313U, 0xc32fececU .word 0xbee15f5fU, 0x35a29797U, 0x88cc4444U, 0x2e391717U .word 0x9357c4c4U, 0x55f2a7a7U, 0xfc827e7eU, 0x7a473d3dU .word 0xc8ac6464U, 0xbae75d5dU, 0x322b1919U, 0xe6957373U .word 0xc0a06060U, 0x19988181U, 0x9ed14f4fU, 0xa37fdcdcU .word 0x44662222U, 0x547e2a2aU, 0x3bab9090U, 0x0b838888U .word 0x8cca4646U, 0xc729eeeeU, 0x6bd3b8b8U, 0x283c1414U .word 0xa779dedeU, 0xbce25e5eU, 0x161d0b0bU, 0xad76dbdbU .word 0xdb3be0e0U, 0x64563232U, 0x744e3a3aU, 0x141e0a0aU .word 0x92db4949U, 0x0c0a0606U, 0x486c2424U, 0xb8e45c5cU .word 0x9f5dc2c2U, 0xbd6ed3d3U, 0x43efacacU, 0xc4a66262U .word 0x39a89191U, 0x31a49595U, 0xd337e4e4U, 0xf28b7979U .word 0xd532e7e7U, 0x8b43c8c8U, 0x6e593737U, 0xdab76d6dU .word 0x018c8d8dU, 0xb164d5d5U, 0x9cd24e4eU, 0x49e0a9a9U .word 0xd8b46c6cU, 0xacfa5656U, 0xf307f4f4U, 0xcf25eaeaU .word 0xcaaf6565U, 0xf48e7a7aU, 0x47e9aeaeU, 0x10180808U .word 0x6fd5babaU, 0xf0887878U, 0x4a6f2525U, 0x5c722e2eU .word 0x38241c1cU, 0x57f1a6a6U, 0x73c7b4b4U, 0x9751c6c6U .word 0xcb23e8e8U, 0xa17cddddU, 0xe89c7474U, 0x3e211f1fU .word 0x96dd4b4bU, 0x61dcbdbdU, 0x0d868b8bU, 0x0f858a8aU .word 0xe0907070U, 0x7c423e3eU, 0x71c4b5b5U, 0xccaa6666U .word 0x90d84848U, 0x06050303U, 0xf701f6f6U, 0x1c120e0eU .word 0xc2a36161U, 0x6a5f3535U, 0xaef95757U, 0x69d0b9b9U .word 0x17918686U, 0x9958c1c1U, 0x3a271d1dU, 0x27b99e9eU .word 0xd938e1e1U, 0xeb13f8f8U, 0x2bb39898U, 0x22331111U .word 0xd2bb6969U, 0xa970d9d9U, 0x07898e8eU, 0x33a79494U .word 0x2db69b9bU, 0x3c221e1eU, 0x15928787U, 0xc920e9e9U .word 0x8749ceceU, 0xaaff5555U, 0x50782828U, 0xa57adfdfU .word 0x038f8c8cU, 0x59f8a1a1U, 0x09808989U, 0x1a170d0dU .word 0x65dabfbfU, 0xd731e6e6U, 0x84c64242U, 0xd0b86868U .word 0x82c34141U, 0x29b09999U, 0x5a772d2dU, 0x1e110f0fU .word 0x7bcbb0b0U, 0xa8fc5454U, 0x6dd6bbbbU, 0x2c3a1616U .p2align 12 .type AES_Td0,\@object AES_Td0: .word 0x50a7f451U, 0x5365417eU, 0xc3a4171aU, 0x965e273aU .word 0xcb6bab3bU, 0xf1459d1fU, 0xab58faacU, 0x9303e34bU .word 0x55fa3020U, 0xf66d76adU, 0x9176cc88U, 0x254c02f5U .word 0xfcd7e54fU, 0xd7cb2ac5U, 0x80443526U, 0x8fa362b5U .word 0x495ab1deU, 0x671bba25U, 0x980eea45U, 0xe1c0fe5dU .word 0x02752fc3U, 0x12f04c81U, 0xa397468dU, 0xc6f9d36bU .word 0xe75f8f03U, 0x959c9215U, 0xeb7a6dbfU, 0xda595295U .word 0x2d83bed4U, 0xd3217458U, 0x2969e049U, 0x44c8c98eU .word 0x6a89c275U, 0x78798ef4U, 0x6b3e5899U, 0xdd71b927U .word 0xb64fe1beU, 0x17ad88f0U, 0x66ac20c9U, 0xb43ace7dU .word 0x184adf63U, 0x82311ae5U, 0x60335197U, 0x457f5362U .word 0xe07764b1U, 0x84ae6bbbU, 0x1ca081feU, 0x942b08f9U .word 0x58684870U, 0x19fd458fU, 0x876cde94U, 0xb7f87b52U .word 0x23d373abU, 0xe2024b72U, 0x578f1fe3U, 0x2aab5566U .word 0x0728ebb2U, 0x03c2b52fU, 0x9a7bc586U, 0xa50837d3U .word 0xf2872830U, 0xb2a5bf23U, 0xba6a0302U, 0x5c8216edU .word 0x2b1ccf8aU, 0x92b479a7U, 0xf0f207f3U, 0xa1e2694eU .word 0xcdf4da65U, 0xd5be0506U, 0x1f6234d1U, 0x8afea6c4U .word 0x9d532e34U, 0xa055f3a2U, 0x32e18a05U, 0x75ebf6a4U .word 0x39ec830bU, 0xaaef6040U, 0x069f715eU, 0x51106ebdU .word 0xf98a213eU, 0x3d06dd96U, 0xae053eddU, 0x46bde64dU .word 0xb58d5491U, 0x055dc471U, 0x6fd40604U, 0xff155060U .word 0x24fb9819U, 0x97e9bdd6U, 0xcc434089U, 0x779ed967U .word 0xbd42e8b0U, 0x888b8907U, 0x385b19e7U, 0xdbeec879U .word 0x470a7ca1U, 0xe90f427cU, 0xc91e84f8U, 0x00000000U .word 0x83868009U, 0x48ed2b32U, 0xac70111eU, 0x4e725a6cU .word 0xfbff0efdU, 0x5638850fU, 0x1ed5ae3dU, 0x27392d36U .word 0x64d90f0aU, 0x21a65c68U, 0xd1545b9bU, 0x3a2e3624U .word 0xb1670a0cU, 0x0fe75793U, 0xd296eeb4U, 0x9e919b1bU .word 0x4fc5c080U, 0xa220dc61U, 0x694b775aU, 0x161a121cU .word 0x0aba93e2U, 0xe52aa0c0U, 0x43e0223cU, 0x1d171b12U .word 0x0b0d090eU, 0xadc78bf2U, 0xb9a8b62dU, 0xc8a91e14U .word 0x8519f157U, 0x4c0775afU, 0xbbdd99eeU, 0xfd607fa3U .word 0x9f2601f7U, 0xbcf5725cU, 0xc53b6644U, 0x347efb5bU .word 0x7629438bU, 0xdcc623cbU, 0x68fcedb6U, 0x63f1e4b8U .word 0xcadc31d7U, 0x10856342U, 0x40229713U, 0x2011c684U .word 0x7d244a85U, 0xf83dbbd2U, 0x1132f9aeU, 0x6da129c7U .word 0x4b2f9e1dU, 0xf330b2dcU, 0xec52860dU, 0xd0e3c177U .word 0x6c16b32bU, 0x99b970a9U, 0xfa489411U, 0x2264e947U .word 0xc48cfca8U, 0x1a3ff0a0U, 0xd82c7d56U, 0xef903322U .word 0xc74e4987U, 0xc1d138d9U, 0xfea2ca8cU, 0x360bd498U .word 0xcf81f5a6U, 0x28de7aa5U, 0x268eb7daU, 0xa4bfad3fU .word 0xe49d3a2cU, 0x0d927850U, 0x9bcc5f6aU, 0x62467e54U .word 0xc2138df6U, 0xe8b8d890U, 0x5ef7392eU, 0xf5afc382U .word 0xbe805d9fU, 0x7c93d069U, 0xa92dd56fU, 0xb31225cfU .word 0x3b99acc8U, 0xa77d1810U, 0x6e639ce8U, 0x7bbb3bdbU .word 0x097826cdU, 0xf418596eU, 0x01b79aecU, 0xa89a4f83U .word 0x656e95e6U, 0x7ee6ffaaU, 0x08cfbc21U, 0xe6e815efU .word 0xd99be7baU, 0xce366f4aU, 0xd4099feaU, 0xd67cb029U .word 0xafb2a431U, 0x31233f2aU, 0x3094a5c6U, 0xc066a235U .word 0x37bc4e74U, 0xa6ca82fcU, 0xb0d090e0U, 0x15d8a733U .word 0x4a9804f1U, 0xf7daec41U, 0x0e50cd7fU, 0x2ff69117U .word 0x8dd64d76U, 0x4db0ef43U, 0x544daaccU, 0xdf0496e4U .word 0xe3b5d19eU, 0x1b886a4cU, 0xb81f2cc1U, 0x7f516546U .word 0x04ea5e9dU, 0x5d358c01U, 0x737487faU, 0x2e410bfbU .word 0x5a1d67b3U, 0x52d2db92U, 0x335610e9U, 0x1347d66dU .word 0x8c61d79aU, 0x7a0ca137U, 0x8e14f859U, 0x893c13ebU .word 0xee27a9ceU, 0x35c961b7U, 0xede51ce1U, 0x3cb1477aU .word 0x59dfd29cU, 0x3f73f255U, 0x79ce1418U, 0xbf37c773U .word 0xeacdf753U, 0x5baafd5fU, 0x146f3ddfU, 0x86db4478U .word 0x81f3afcaU, 0x3ec468b9U, 0x2c342438U, 0x5f40a3c2U .word 0x72c31d16U, 0x0c25e2bcU, 0x8b493c28U, 0x41950dffU .word 0x7101a839U, 0xdeb30c08U, 0x9ce4b4d8U, 0x90c15664U .word 0x6184cb7bU, 0x70b632d5U, 0x745c6c48U, 0x4257b8d0U .type AES_Td1,\@object AES_Td1: .word 0xa7f45150U, 0x65417e53U, 0xa4171ac3U, 0x5e273a96U .word 0x6bab3bcbU, 0x459d1ff1U, 0x58faacabU, 0x03e34b93U .word 0xfa302055U, 0x6d76adf6U, 0x76cc8891U, 0x4c02f525U .word 0xd7e54ffcU, 0xcb2ac5d7U, 0x44352680U, 0xa362b58fU .word 0x5ab1de49U, 0x1bba2567U, 0x0eea4598U, 0xc0fe5de1U .word 0x752fc302U, 0xf04c8112U, 0x97468da3U, 0xf9d36bc6U .word 0x5f8f03e7U, 0x9c921595U, 0x7a6dbfebU, 0x595295daU .word 0x83bed42dU, 0x217458d3U, 0x69e04929U, 0xc8c98e44U .word 0x89c2756aU, 0x798ef478U, 0x3e58996bU, 0x71b927ddU .word 0x4fe1beb6U, 0xad88f017U, 0xac20c966U, 0x3ace7db4U .word 0x4adf6318U, 0x311ae582U, 0x33519760U, 0x7f536245U .word 0x7764b1e0U, 0xae6bbb84U, 0xa081fe1cU, 0x2b08f994U .word 0x68487058U, 0xfd458f19U, 0x6cde9487U, 0xf87b52b7U .word 0xd373ab23U, 0x024b72e2U, 0x8f1fe357U, 0xab55662aU .word 0x28ebb207U, 0xc2b52f03U, 0x7bc5869aU, 0x0837d3a5U .word 0x872830f2U, 0xa5bf23b2U, 0x6a0302baU, 0x8216ed5cU .word 0x1ccf8a2bU, 0xb479a792U, 0xf207f3f0U, 0xe2694ea1U .word 0xf4da65cdU, 0xbe0506d5U, 0x6234d11fU, 0xfea6c48aU .word 0x532e349dU, 0x55f3a2a0U, 0xe18a0532U, 0xebf6a475U .word 0xec830b39U, 0xef6040aaU, 0x9f715e06U, 0x106ebd51U .word 0x8a213ef9U, 0x06dd963dU, 0x053eddaeU, 0xbde64d46U .word 0x8d5491b5U, 0x5dc47105U, 0xd406046fU, 0x155060ffU .word 0xfb981924U, 0xe9bdd697U, 0x434089ccU, 0x9ed96777U .word 0x42e8b0bdU, 0x8b890788U, 0x5b19e738U, 0xeec879dbU .word 0x0a7ca147U, 0x0f427ce9U, 0x1e84f8c9U, 0x00000000U .word 0x86800983U, 0xed2b3248U, 0x70111eacU, 0x725a6c4eU .word 0xff0efdfbU, 0x38850f56U, 0xd5ae3d1eU, 0x392d3627U .word 0xd90f0a64U, 0xa65c6821U, 0x545b9bd1U, 0x2e36243aU .word 0x670a0cb1U, 0xe757930fU, 0x96eeb4d2U, 0x919b1b9eU .word 0xc5c0804fU, 0x20dc61a2U, 0x4b775a69U, 0x1a121c16U .word 0xba93e20aU, 0x2aa0c0e5U, 0xe0223c43U, 0x171b121dU .word 0x0d090e0bU, 0xc78bf2adU, 0xa8b62db9U, 0xa91e14c8U .word 0x19f15785U, 0x0775af4cU, 0xdd99eebbU, 0x607fa3fdU .word 0x2601f79fU, 0xf5725cbcU, 0x3b6644c5U, 0x7efb5b34U .word 0x29438b76U, 0xc623cbdcU, 0xfcedb668U, 0xf1e4b863U .word 0xdc31d7caU, 0x85634210U, 0x22971340U, 0x11c68420U .word 0x244a857dU, 0x3dbbd2f8U, 0x32f9ae11U, 0xa129c76dU .word 0x2f9e1d4bU, 0x30b2dcf3U, 0x52860decU, 0xe3c177d0U .word 0x16b32b6cU, 0xb970a999U, 0x489411faU, 0x64e94722U .word 0x8cfca8c4U, 0x3ff0a01aU, 0x2c7d56d8U, 0x903322efU .word 0x4e4987c7U, 0xd138d9c1U, 0xa2ca8cfeU, 0x0bd49836U .word 0x81f5a6cfU, 0xde7aa528U, 0x8eb7da26U, 0xbfad3fa4U .word 0x9d3a2ce4U, 0x9278500dU, 0xcc5f6a9bU, 0x467e5462U .word 0x138df6c2U, 0xb8d890e8U, 0xf7392e5eU, 0xafc382f5U .word 0x805d9fbeU, 0x93d0697cU, 0x2dd56fa9U, 0x1225cfb3U .word 0x99acc83bU, 0x7d1810a7U, 0x639ce86eU, 0xbb3bdb7bU .word 0x7826cd09U, 0x18596ef4U, 0xb79aec01U, 0x9a4f83a8U .word 0x6e95e665U, 0xe6ffaa7eU, 0xcfbc2108U, 0xe815efe6U .word 0x9be7bad9U, 0x366f4aceU, 0x099fead4U, 0x7cb029d6U .word 0xb2a431afU, 0x233f2a31U, 0x94a5c630U, 0x66a235c0U .word 0xbc4e7437U, 0xca82fca6U, 0xd090e0b0U, 0xd8a73315U .word 0x9804f14aU, 0xdaec41f7U, 0x50cd7f0eU, 0xf691172fU .word 0xd64d768dU, 0xb0ef434dU, 0x4daacc54U, 0x0496e4dfU .word 0xb5d19ee3U, 0x886a4c1bU, 0x1f2cc1b8U, 0x5165467fU .word 0xea5e9d04U, 0x358c015dU, 0x7487fa73U, 0x410bfb2eU .word 0x1d67b35aU, 0xd2db9252U, 0x5610e933U, 0x47d66d13U .word 0x61d79a8cU, 0x0ca1377aU, 0x14f8598eU, 0x3c13eb89U .word 0x27a9ceeeU, 0xc961b735U, 0xe51ce1edU, 0xb1477a3cU .word 0xdfd29c59U, 0x73f2553fU, 0xce141879U, 0x37c773bfU .word 0xcdf753eaU, 0xaafd5f5bU, 0x6f3ddf14U, 0xdb447886U .word 0xf3afca81U, 0xc468b93eU, 0x3424382cU, 0x40a3c25fU .word 0xc31d1672U, 0x25e2bc0cU, 0x493c288bU, 0x950dff41U .word 0x01a83971U, 0xb30c08deU, 0xe4b4d89cU, 0xc1566490U .word 0x84cb7b61U, 0xb632d570U, 0x5c6c4874U, 0x57b8d042U .type AES_Td2,\@object AES_Td2: .word 0xf45150a7U, 0x417e5365U, 0x171ac3a4U, 0x273a965eU .word 0xab3bcb6bU, 0x9d1ff145U, 0xfaacab58U, 0xe34b9303U .word 0x302055faU, 0x76adf66dU, 0xcc889176U, 0x02f5254cU .word 0xe54ffcd7U, 0x2ac5d7cbU, 0x35268044U, 0x62b58fa3U .word 0xb1de495aU, 0xba25671bU, 0xea45980eU, 0xfe5de1c0U .word 0x2fc30275U, 0x4c8112f0U, 0x468da397U, 0xd36bc6f9U .word 0x8f03e75fU, 0x9215959cU, 0x6dbfeb7aU, 0x5295da59U .word 0xbed42d83U, 0x7458d321U, 0xe0492969U, 0xc98e44c8U .word 0xc2756a89U, 0x8ef47879U, 0x58996b3eU, 0xb927dd71U .word 0xe1beb64fU, 0x88f017adU, 0x20c966acU, 0xce7db43aU .word 0xdf63184aU, 0x1ae58231U, 0x51976033U, 0x5362457fU .word 0x64b1e077U, 0x6bbb84aeU, 0x81fe1ca0U, 0x08f9942bU .word 0x48705868U, 0x458f19fdU, 0xde94876cU, 0x7b52b7f8U .word 0x73ab23d3U, 0x4b72e202U, 0x1fe3578fU, 0x55662aabU .word 0xebb20728U, 0xb52f03c2U, 0xc5869a7bU, 0x37d3a508U .word 0x2830f287U, 0xbf23b2a5U, 0x0302ba6aU, 0x16ed5c82U .word 0xcf8a2b1cU, 0x79a792b4U, 0x07f3f0f2U, 0x694ea1e2U .word 0xda65cdf4U, 0x0506d5beU, 0x34d11f62U, 0xa6c48afeU .word 0x2e349d53U, 0xf3a2a055U, 0x8a0532e1U, 0xf6a475ebU .word 0x830b39ecU, 0x6040aaefU, 0x715e069fU, 0x6ebd5110U .word 0x213ef98aU, 0xdd963d06U, 0x3eddae05U, 0xe64d46bdU .word 0x5491b58dU, 0xc471055dU, 0x06046fd4U, 0x5060ff15U .word 0x981924fbU, 0xbdd697e9U, 0x4089cc43U, 0xd967779eU .word 0xe8b0bd42U, 0x8907888bU, 0x19e7385bU, 0xc879dbeeU .word 0x7ca1470aU, 0x427ce90fU, 0x84f8c91eU, 0x00000000U .word 0x80098386U, 0x2b3248edU, 0x111eac70U, 0x5a6c4e72U .word 0x0efdfbffU, 0x850f5638U, 0xae3d1ed5U, 0x2d362739U .word 0x0f0a64d9U, 0x5c6821a6U, 0x5b9bd154U, 0x36243a2eU .word 0x0a0cb167U, 0x57930fe7U, 0xeeb4d296U, 0x9b1b9e91U .word 0xc0804fc5U, 0xdc61a220U, 0x775a694bU, 0x121c161aU .word 0x93e20abaU, 0xa0c0e52aU, 0x223c43e0U, 0x1b121d17U .word 0x090e0b0dU, 0x8bf2adc7U, 0xb62db9a8U, 0x1e14c8a9U .word 0xf1578519U, 0x75af4c07U, 0x99eebbddU, 0x7fa3fd60U .word 0x01f79f26U, 0x725cbcf5U, 0x6644c53bU, 0xfb5b347eU .word 0x438b7629U, 0x23cbdcc6U, 0xedb668fcU, 0xe4b863f1U .word 0x31d7cadcU, 0x63421085U, 0x97134022U, 0xc6842011U .word 0x4a857d24U, 0xbbd2f83dU, 0xf9ae1132U, 0x29c76da1U .word 0x9e1d4b2fU, 0xb2dcf330U, 0x860dec52U, 0xc177d0e3U .word 0xb32b6c16U, 0x70a999b9U, 0x9411fa48U, 0xe9472264U .word 0xfca8c48cU, 0xf0a01a3fU, 0x7d56d82cU, 0x3322ef90U .word 0x4987c74eU, 0x38d9c1d1U, 0xca8cfea2U, 0xd498360bU .word 0xf5a6cf81U, 0x7aa528deU, 0xb7da268eU, 0xad3fa4bfU .word 0x3a2ce49dU, 0x78500d92U, 0x5f6a9bccU, 0x7e546246U .word 0x8df6c213U, 0xd890e8b8U, 0x392e5ef7U, 0xc382f5afU .word 0x5d9fbe80U, 0xd0697c93U, 0xd56fa92dU, 0x25cfb312U .word 0xacc83b99U, 0x1810a77dU, 0x9ce86e63U, 0x3bdb7bbbU .word 0x26cd0978U, 0x596ef418U, 0x9aec01b7U, 0x4f83a89aU .word 0x95e6656eU, 0xffaa7ee6U, 0xbc2108cfU, 0x15efe6e8U .word 0xe7bad99bU, 0x6f4ace36U, 0x9fead409U, 0xb029d67cU .word 0xa431afb2U, 0x3f2a3123U, 0xa5c63094U, 0xa235c066U .word 0x4e7437bcU, 0x82fca6caU, 0x90e0b0d0U, 0xa73315d8U .word 0x04f14a98U, 0xec41f7daU, 0xcd7f0e50U, 0x91172ff6U .word 0x4d768dd6U, 0xef434db0U, 0xaacc544dU, 0x96e4df04U .word 0xd19ee3b5U, 0x6a4c1b88U, 0x2cc1b81fU, 0x65467f51U .word 0x5e9d04eaU, 0x8c015d35U, 0x87fa7374U, 0x0bfb2e41U .word 0x67b35a1dU, 0xdb9252d2U, 0x10e93356U, 0xd66d1347U .word 0xd79a8c61U, 0xa1377a0cU, 0xf8598e14U, 0x13eb893cU .word 0xa9ceee27U, 0x61b735c9U, 0x1ce1ede5U, 0x477a3cb1U .word 0xd29c59dfU, 0xf2553f73U, 0x141879ceU, 0xc773bf37U .word 0xf753eacdU, 0xfd5f5baaU, 0x3ddf146fU, 0x447886dbU .word 0xafca81f3U, 0x68b93ec4U, 0x24382c34U, 0xa3c25f40U .word 0x1d1672c3U, 0xe2bc0c25U, 0x3c288b49U, 0x0dff4195U .word 0xa8397101U, 0x0c08deb3U, 0xb4d89ce4U, 0x566490c1U .word 0xcb7b6184U, 0x32d570b6U, 0x6c48745cU, 0xb8d04257U .type AES_Td3,\@object AES_Td3: .word 0x5150a7f4U, 0x7e536541U, 0x1ac3a417U, 0x3a965e27U .word 0x3bcb6babU, 0x1ff1459dU, 0xacab58faU, 0x4b9303e3U .word 0x2055fa30U, 0xadf66d76U, 0x889176ccU, 0xf5254c02U .word 0x4ffcd7e5U, 0xc5d7cb2aU, 0x26804435U, 0xb58fa362U .word 0xde495ab1U, 0x25671bbaU, 0x45980eeaU, 0x5de1c0feU .word 0xc302752fU, 0x8112f04cU, 0x8da39746U, 0x6bc6f9d3U .word 0x03e75f8fU, 0x15959c92U, 0xbfeb7a6dU, 0x95da5952U .word 0xd42d83beU, 0x58d32174U, 0x492969e0U, 0x8e44c8c9U .word 0x756a89c2U, 0xf478798eU, 0x996b3e58U, 0x27dd71b9U .word 0xbeb64fe1U, 0xf017ad88U, 0xc966ac20U, 0x7db43aceU .word 0x63184adfU, 0xe582311aU, 0x97603351U, 0x62457f53U .word 0xb1e07764U, 0xbb84ae6bU, 0xfe1ca081U, 0xf9942b08U .word 0x70586848U, 0x8f19fd45U, 0x94876cdeU, 0x52b7f87bU .word 0xab23d373U, 0x72e2024bU, 0xe3578f1fU, 0x662aab55U .word 0xb20728ebU, 0x2f03c2b5U, 0x869a7bc5U, 0xd3a50837U .word 0x30f28728U, 0x23b2a5bfU, 0x02ba6a03U, 0xed5c8216U .word 0x8a2b1ccfU, 0xa792b479U, 0xf3f0f207U, 0x4ea1e269U .word 0x65cdf4daU, 0x06d5be05U, 0xd11f6234U, 0xc48afea6U .word 0x349d532eU, 0xa2a055f3U, 0x0532e18aU, 0xa475ebf6U .word 0x0b39ec83U, 0x40aaef60U, 0x5e069f71U, 0xbd51106eU .word 0x3ef98a21U, 0x963d06ddU, 0xddae053eU, 0x4d46bde6U .word 0x91b58d54U, 0x71055dc4U, 0x046fd406U, 0x60ff1550U .word 0x1924fb98U, 0xd697e9bdU, 0x89cc4340U, 0x67779ed9U .word 0xb0bd42e8U, 0x07888b89U, 0xe7385b19U, 0x79dbeec8U .word 0xa1470a7cU, 0x7ce90f42U, 0xf8c91e84U, 0x00000000U .word 0x09838680U, 0x3248ed2bU, 0x1eac7011U, 0x6c4e725aU .word 0xfdfbff0eU, 0x0f563885U, 0x3d1ed5aeU, 0x3627392dU .word 0x0a64d90fU, 0x6821a65cU, 0x9bd1545bU, 0x243a2e36U .word 0x0cb1670aU, 0x930fe757U, 0xb4d296eeU, 0x1b9e919bU .word 0x804fc5c0U, 0x61a220dcU, 0x5a694b77U, 0x1c161a12U .word 0xe20aba93U, 0xc0e52aa0U, 0x3c43e022U, 0x121d171bU .word 0x0e0b0d09U, 0xf2adc78bU, 0x2db9a8b6U, 0x14c8a91eU .word 0x578519f1U, 0xaf4c0775U, 0xeebbdd99U, 0xa3fd607fU .word 0xf79f2601U, 0x5cbcf572U, 0x44c53b66U, 0x5b347efbU .word 0x8b762943U, 0xcbdcc623U, 0xb668fcedU, 0xb863f1e4U .word 0xd7cadc31U, 0x42108563U, 0x13402297U, 0x842011c6U .word 0x857d244aU, 0xd2f83dbbU, 0xae1132f9U, 0xc76da129U .word 0x1d4b2f9eU, 0xdcf330b2U, 0x0dec5286U, 0x77d0e3c1U .word 0x2b6c16b3U, 0xa999b970U, 0x11fa4894U, 0x472264e9U .word 0xa8c48cfcU, 0xa01a3ff0U, 0x56d82c7dU, 0x22ef9033U .word 0x87c74e49U, 0xd9c1d138U, 0x8cfea2caU, 0x98360bd4U .word 0xa6cf81f5U, 0xa528de7aU, 0xda268eb7U, 0x3fa4bfadU .word 0x2ce49d3aU, 0x500d9278U, 0x6a9bcc5fU, 0x5462467eU .word 0xf6c2138dU, 0x90e8b8d8U, 0x2e5ef739U, 0x82f5afc3U .word 0x9fbe805dU, 0x697c93d0U, 0x6fa92dd5U, 0xcfb31225U .word 0xc83b99acU, 0x10a77d18U, 0xe86e639cU, 0xdb7bbb3bU .word 0xcd097826U, 0x6ef41859U, 0xec01b79aU, 0x83a89a4fU .word 0xe6656e95U, 0xaa7ee6ffU, 0x2108cfbcU, 0xefe6e815U .word 0xbad99be7U, 0x4ace366fU, 0xead4099fU, 0x29d67cb0U .word 0x31afb2a4U, 0x2a31233fU, 0xc63094a5U, 0x35c066a2U .word 0x7437bc4eU, 0xfca6ca82U, 0xe0b0d090U, 0x3315d8a7U .word 0xf14a9804U, 0x41f7daecU, 0x7f0e50cdU, 0x172ff691U .word 0x768dd64dU, 0x434db0efU, 0xcc544daaU, 0xe4df0496U .word 0x9ee3b5d1U, 0x4c1b886aU, 0xc1b81f2cU, 0x467f5165U .word 0x9d04ea5eU, 0x015d358cU, 0xfa737487U, 0xfb2e410bU .word 0xb35a1d67U, 0x9252d2dbU, 0xe9335610U, 0x6d1347d6U .word 0x9a8c61d7U, 0x377a0ca1U, 0x598e14f8U, 0xeb893c13U .word 0xceee27a9U, 0xb735c961U, 0xe1ede51cU, 0x7a3cb147U .word 0x9c59dfd2U, 0x553f73f2U, 0x1879ce14U, 0x73bf37c7U .word 0x53eacdf7U, 0x5f5baafdU, 0xdf146f3dU, 0x7886db44U .word 0xca81f3afU, 0xb93ec468U, 0x382c3424U, 0xc25f40a3U .word 0x1672c31dU, 0xbc0c25e2U, 0x288b493cU, 0xff41950dU .word 0x397101a8U, 0x08deb30cU, 0xd89ce4b4U, 0x6490c156U .word 0x7b6184cbU, 0xd570b632U, 0x48745c6cU, 0xd04257b8U .type AES_Td4,\@object AES_Td4: .byte 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U .byte 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU .byte 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U .byte 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU .byte 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU .byte 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU .byte 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U .byte 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U .byte 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U .byte 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U .byte 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU .byte 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U .byte 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU .byte 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U .byte 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U .byte 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU .byte 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU .byte 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U .byte 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U .byte 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU .byte 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U .byte 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU .byte 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U .byte 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U .byte 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U .byte 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU .byte 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU .byte 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU .byte 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U .byte 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U .byte 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U .byte 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU .type AES_rcon,\@object AES_rcon: .word 0x00000001U, 0x00000002U, 0x00000004U, 0x00000008U .word 0x00000010U, 0x00000020U, 0x00000040U, 0x00000080U .word 0x0000001BU, 0x00000036U ___ print $code; close STDOUT or die "error closing STDOUT: $!";