Path: blob/main/sys/crypto/openssl/powerpc/aes-gcm-ppc.S
108036 views
/* Do not modify. This file is auto-generated from aes-gcm-ppc.pl. */1.machine "any"2.text34.macro SAVE_REGS5mflr 06std 0, 16(1)7stdu 1,-512(1)89std 14, 112(1)10std 15, 120(1)11std 16, 128(1)12std 17, 136(1)13std 18, 144(1)14std 19, 152(1)15std 20, 160(1)16std 21, 168(1)17std 22, 176(1)18std 23, 184(1)19std 24, 192(1)2021stxv 32+20, 256(1)22stxv 32+21, 256+16(1)23stxv 32+22, 256+32(1)24stxv 32+23, 256+48(1)25stxv 32+24, 256+64(1)26stxv 32+25, 256+80(1)27stxv 32+26, 256+96(1)28stxv 32+27, 256+112(1)29stxv 32+28, 256+128(1)30stxv 32+29, 256+144(1)31stxv 32+30, 256+160(1)32stxv 32+31, 256+176(1)33.endm # SAVE_REGS3435.macro RESTORE_REGS36lxv 32+20, 256(1)37lxv 32+21, 256+16(1)38lxv 32+22, 256+32(1)39lxv 32+23, 256+48(1)40lxv 32+24, 256+64(1)41lxv 32+25, 256+80(1)42lxv 32+26, 256+96(1)43lxv 32+27, 256+112(1)44lxv 32+28, 256+128(1)45lxv 32+29, 256+144(1)46lxv 32+30, 256+160(1)47lxv 32+31, 256+176(1)4849ld 14, 112(1)50ld 15, 120(1)51ld 16, 128(1)52ld 17, 136(1)53ld 18, 144(1)54ld 19, 152(1)55ld 20, 160(1)56ld 21, 168(1)57ld 22, 176(1)58ld 23, 184(1)59ld 24, 192(1)6061addi 1, 1, 51262ld 0, 16(1)63mtlr 064.endm # RESTORE_REGS6566# 4x loops67.macro AES_CIPHER_4x r68vcipher 15, 15, \r69vcipher 16, 16, \r70vcipher 17, 17, \r71vcipher 18, 18, \r72.endm7374# 8x loops75.macro AES_CIPHER_8x r76vcipher 15, 15, \r77vcipher 16, 16, \r78vcipher 17, 17, \r79vcipher 18, 18, \r80vcipher 19, 19, \r81vcipher 20, 20, \r82vcipher 21, 21, \r83vcipher 22, 22, \r84.endm8586.macro LOOP_8AES_STATE87AES_CIPHER_8x 2388AES_CIPHER_8x 2489AES_CIPHER_8x 2590AES_CIPHER_8x 2691AES_CIPHER_8x 2792AES_CIPHER_8x 2893AES_CIPHER_8x 2994AES_CIPHER_8x 195.endm9697#98# PPC_GFMUL128_8x: Compute hash values of 8 blocks based on Karatsuba method.99#100# S1 should xor with the previous digest101#102# Xi = v0103# H Poly = v2104# Hash keys = v3 - v14105# vs10: vpermxor vector106# Scratch: v23 - v29107#108.macro PPC_GFMUL128_8x109110vpmsumd 23, 12, 15 # H4.L * X.L111vpmsumd 24, 9, 16112vpmsumd 25, 6, 17113vpmsumd 26, 3, 18114115vxor 23, 23, 24116vxor 23, 23, 25117vxor 23, 23, 26 # L118119vpmsumd 27, 13, 15 # H4.L * X.H + H4.H * X.L120vpmsumd 28, 10, 16 # H3.L * X1.H + H3.H * X1.L121vpmsumd 25, 7, 17122vpmsumd 26, 4, 18123124vxor 24, 27, 28125vxor 24, 24, 25126vxor 24, 24, 26 # M127128vpmsumd 26, 14, 15 # H4.H * X.H129vpmsumd 27, 11, 16130vpmsumd 28, 8, 17131vpmsumd 29, 5, 18132133vxor 26, 26, 27134vxor 26, 26, 28135vxor 26, 26, 29136137# sum hash and reduction with H Poly138vpmsumd 28, 23, 2 # reduction139140vxor 1, 1, 1141vsldoi 25, 24, 1, 8 # mL142vsldoi 1, 1, 24, 8 # mH143vxor 23, 23, 25 # mL + L144145# This performs swap and xor like,146# vsldoi 23, 23, 23, 8 # swap147# vxor 23, 23, 28148xxlor 32+29, 10, 10149vpermxor 23, 23, 28, 29150151vxor 24, 26, 1 # H152153# sum hash and reduction with H Poly154#155# vsldoi 25, 23, 23, 8 # swap156# vpmsumd 23, 23, 2157# vxor 27, 25, 24158#159vpermxor 27, 23, 24, 29160vpmsumd 23, 23, 2161vxor 0, 23, 27 # Digest of 4 blocks162163vxor 19, 19, 0164165# Compute digest for the next 4 blocks166vpmsumd 24, 9, 20167vpmsumd 25, 6, 21168vpmsumd 26, 3, 22169vpmsumd 23, 12, 19 # H4.L * X.L170171vxor 23, 23, 24172vxor 23, 23, 25173vxor 23, 23, 26 # L174175vpmsumd 27, 13, 19 # H4.L * X.H + H4.H * X.L176vpmsumd 28, 10, 20 # H3.L * X1.H + H3.H * X1.L177vpmsumd 25, 7, 21178vpmsumd 26, 4, 22179180vxor 24, 27, 28181vxor 24, 24, 25182vxor 24, 24, 26 # M183184vpmsumd 26, 14, 19 # H4.H * X.H185vpmsumd 27, 11, 20186vpmsumd 28, 8, 21187vpmsumd 29, 5, 22188189vxor 26, 26, 27190vxor 26, 26, 28191vxor 26, 26, 29192193# sum hash and reduction with H Poly194vpmsumd 28, 23, 2 # reduction195196vxor 1, 1, 1197vsldoi 25, 24, 1, 8 # mL198vsldoi 1, 1, 24, 8 # mH199vxor 23, 23, 25 # mL + L200201# This performs swap and xor like,202# vsldoi 23, 23, 23, 8 # swap203# vxor 23, 23, 28204xxlor 32+29, 10, 10205vpermxor 23, 23, 28, 29206207vxor 24, 26, 1 # H208209# sum hash and reduction with H Poly210#211# vsldoi 25, 23, 23, 8 # swap212# vpmsumd 23, 23, 2213# vxor 27, 25, 24214#215vpermxor 27, 23, 24, 29216vpmsumd 23, 23, 2217vxor 0, 23, 27 # Digest of 8 blocks218.endm219220#221# Compute update single ghash222# vs10: vpermxor vector223# scratch: v1, v22..v27224#225.macro PPC_GHASH1x H S1226227vxor 1, 1, 1228229vpmsumd 22, 3, \S1 # L230vpmsumd 23, 4, \S1 # M231vpmsumd 24, 5, \S1 # H232233vpmsumd 27, 22, 2 # reduction234235vsldoi 25, 23, 1, 8 # mL236vsldoi 26, 1, 23, 8 # mH237vxor 22, 22, 25 # LL + LL238vxor 24, 24, 26 # HH + HH239240xxlor 32+25, 10, 10241vpermxor 22, 22, 27, 25242243# vsldoi 23, 22, 22, 8 # swap244# vpmsumd 22, 22, 2 # reduction245# vxor 23, 23, 24246vpermxor 23, 22, 24, 25247vpmsumd 22, 22, 2 # reduction248249vxor \H, 22, 23250.endm251252#253# LOAD_HASH_TABLE254# Xi = v0255# H Poly = v2256# Hash keys = v3 - v14257#258.macro LOAD_HASH_TABLE259# Load Xi260lxvb16x 32, 0, 8 # load Xi261262vxor 1, 1, 1263264li 10, 32265lxvd2x 2+32, 10, 8 # H Poli266267# load Hash - h^4, h^3, h^2, h268li 10, 64269lxvd2x 4+32, 10, 8 # H270vsldoi 3, 1, 4, 8 # l271vsldoi 5, 4, 1, 8 # h272li 10, 112273lxvd2x 7+32, 10, 8 # H^2274vsldoi 6, 1, 7, 8 # l275vsldoi 8, 7, 1, 8 # h276li 10, 160277lxvd2x 10+32, 10, 8 # H^3278vsldoi 9, 1, 10, 8 # l279vsldoi 11, 10, 1, 8 # h280li 10, 208281lxvd2x 13+32, 10, 8 # H^4282vsldoi 12, 1, 13, 8 # l283vsldoi 14, 13, 1, 8 # h284.endm285286.macro PROCESS_8X_AES_STATES287vcipherlast 15, 15, 1288vcipherlast 16, 16, 1289vcipherlast 17, 17, 1290vcipherlast 18, 18, 1291vcipherlast 19, 19, 1292vcipherlast 20, 20, 1293vcipherlast 21, 21, 1294vcipherlast 22, 22, 1295296lxvb16x 32+23, 0, 14 # load block297lxvb16x 32+24, 15, 14 # load block298lxvb16x 32+25, 16, 14 # load block299lxvb16x 32+26, 17, 14 # load block300lxvb16x 32+27, 18, 14 # load block301lxvb16x 32+28, 19, 14 # load block302lxvb16x 32+29, 20, 14 # load block303lxvb16x 32+30, 21, 14 # load block304addi 14, 14, 128305306vxor 15, 15, 23307vxor 16, 16, 24308vxor 17, 17, 25309vxor 18, 18, 26310vxor 19, 19, 27311vxor 20, 20, 28312vxor 21, 21, 29313vxor 22, 22, 30314315stxvb16x 47, 0, 9 # store output316stxvb16x 48, 15, 9 # store output317stxvb16x 49, 16, 9 # store output318stxvb16x 50, 17, 9 # store output319stxvb16x 51, 18, 9 # store output320stxvb16x 52, 19, 9 # store output321stxvb16x 53, 20, 9 # store output322stxvb16x 54, 21, 9 # store output323addi 9, 9, 128324.endm325326.macro COMPUTE_STATES327xxlor 32+15, 9, 9 # last state328vadduwm 15, 15, 31 # state + counter329vadduwm 16, 15, 31330vadduwm 17, 16, 31331vadduwm 18, 17, 31332vadduwm 19, 18, 31333vadduwm 20, 19, 31334vadduwm 21, 20, 31335vadduwm 22, 21, 31336xxlor 9, 32+22, 32+22 # save last state337338xxlxor 32+15, 32+15, 0 # IV + round key - add round key 0339xxlxor 32+16, 32+16, 0340xxlxor 32+17, 32+17, 0341xxlxor 32+18, 32+18, 0342xxlxor 32+19, 32+19, 0343xxlxor 32+20, 32+20, 0344xxlxor 32+21, 32+21, 0345xxlxor 32+22, 32+22, 0346.endm347348################################################################################349# Compute AES and ghash one block at a time.350# r23: AES rounds351# v30: current IV352# vs0: roundkey 0353#354################################################################################355.align 4356aes_gcm_crypt_1x:357.localentry aes_gcm_crypt_1x,0358359cmpdi 5, 16360bge __More_1x361blr362__More_1x:363li 10, 16364divdu 12, 5, 10365366xxlxor 32+15, 32+30, 0367368# Pre-load 8 AES rounds to scratch vectors.369lxv 32+16, 16(6) # round key 1370lxv 32+17, 32(6) # round key 2371lxv 32+18, 48(6) # round key 3372lxv 32+19, 64(6) # round key 4373lxv 32+20, 80(6) # round key 5374lxv 32+21, 96(6) # round key 6375lxv 32+28, 112(6) # round key 7376lxv 32+29, 128(6) # round key 8377378lwz 23, 240(6) # n rounds379addi 22, 23, -9 # remaining AES rounds380381cmpdi 12, 0382bgt __Loop_1x383blr384385__Loop_1x:386mtctr 22387addi 10, 6, 144388vcipher 15, 15, 16389vcipher 15, 15, 17390vcipher 15, 15, 18391vcipher 15, 15, 19392vcipher 15, 15, 20393vcipher 15, 15, 21394vcipher 15, 15, 28395vcipher 15, 15, 29396397__Loop_aes_1state:398lxv 32+1, 0(10)399vcipher 15, 15, 1400addi 10, 10, 16401bdnz __Loop_aes_1state402lxv 32+1, 0(10) # last round key403lxvb16x 11, 0, 14 # load input block404vcipherlast 15, 15, 1405406xxlxor 32+15, 32+15, 11407stxvb16x 32+15, 0, 9 # store output408addi 14, 14, 16409addi 9, 9, 16410411cmpdi 24, 0 # decrypt?412bne __Encrypt_1x413xxlor 15+32, 11, 11414__Encrypt_1x:415vxor 15, 15, 0416PPC_GHASH1x 0, 15417418addi 5, 5, -16419addi 11, 11, 16420421vadduwm 30, 30, 31 # IV + counter422xxlxor 32+15, 32+30, 0423addi 12, 12, -1424cmpdi 12, 0425bgt __Loop_1x426427stxvb16x 32+0, 0, 8 # update Xi428blr429.size aes_gcm_crypt_1x,.-aes_gcm_crypt_1x430431################################################################################432# Process a normal partial block when we come here.433# Compute partial mask, Load and store partial block to stack.434# Compute AES state.435# Compute ghash.436#437################################################################################438.align 4439__Process_partial:440.localentry __Process_partial,0441442# create partial mask443vspltisb 16, -1444li 12, 16445sub 12, 12, 5446sldi 12, 12, 3447mtvsrdd 32+17, 0, 12448vslo 16, 16, 17 # partial block mask449450lxvb16x 11, 0, 14 # load partial block451xxland 11, 11, 32+16452453# AES crypt partial454xxlxor 32+15, 32+30, 0455lwz 23, 240(6) # n rounds456addi 22, 23, -1 # loop - 1457mtctr 22458addi 10, 6, 16459460__Loop_aes_pstate:461lxv 32+1, 0(10)462vcipher 15, 15, 1463addi 10, 10, 16464bdnz __Loop_aes_pstate465lxv 32+1, 0(10) # last round key466vcipherlast 15, 15, 1467468xxlxor 32+15, 32+15, 11469vand 15, 15, 16470471# AES crypt output v15472# Write partial473li 10, 224474stxvb16x 15+32, 10, 1 # write v15 to stack475addi 10, 1, 223476addi 12, 9, -1477mtctr 5 # partial block len478__Write_partial:479lbzu 22, 1(10)480stbu 22, 1(12)481bdnz __Write_partial482483cmpdi 24, 0 # decrypt?484bne __Encrypt_partial485xxlor 32+15, 11, 11 # decrypt using the input block486__Encrypt_partial:487vxor 15, 15, 0 # ^ previous hash488PPC_GHASH1x 0, 15489li 5, 0 # done last byte490stxvb16x 32+0, 0, 8 # Update X1491blr492.size __Process_partial,.-__Process_partial493494################################################################################495# ppc_aes_gcm_encrypt (const void *inp, void *out, size_t len,496# const char *rk, unsigned char iv[16], void *Xip);497#498# r3 - inp499# r4 - out500# r5 - len501# r6 - AES round keys502# r7 - iv503# r8 - Xi, HPoli, hash keys504#505# rounds is at offset 240 in rk506# Xi is at 0 in gcm_table (Xip).507#508################################################################################509.global ppc_aes_gcm_encrypt510.align 5511ppc_aes_gcm_encrypt:512.localentry ppc_aes_gcm_encrypt,0513514SAVE_REGS515LOAD_HASH_TABLE516517# initialize ICB: GHASH( IV ), IV - r7518lxvb16x 30+32, 0, 7 # load IV - v30519520mr 14, 3521mr 9, 4522523# counter 1524vxor 31, 31, 31525vspltisb 22, 1526vsldoi 31, 31, 22,1 # counter 1527528addis 11, 2, permx@toc@ha529addi 11, 11, permx@toc@l530lxv 10, 0(11) # vs10: vpermxor vector531li 11, 0532533lxv 0, 0(6) # round key 0534535#536# Process different blocks537#538cmpdi 5, 128539blt __Process_more_enc540541# load 9 round keys542lxv 32+23, 16(6) # round key 1543lxv 32+24, 32(6) # round key 2544lxv 32+25, 48(6) # round key 3545lxv 32+26, 64(6) # round key 4546lxv 32+27, 80(6) # round key 5547lxv 32+28, 96(6) # round key 6548lxv 32+29, 112(6) # round key 7549lxv 32+1, 128(6) # round key 8550551# load rounds - 10 (128), 12 (192), 14 (256)552lwz 23, 240(6) # n rounds553554__Process_encrypt:555#556# Process 8x AES/GCM blocks557#558__Process_8x_enc:559# 8x blocks560li 10, 128561divdu 12, 5, 10 # n 128 bytes-blocks562563addi 12, 12, -1 # loop - 1564565vmr 15, 30 # first state: IV566vadduwm 16, 15, 31 # state + counter567vadduwm 17, 16, 31568vadduwm 18, 17, 31569vadduwm 19, 18, 31570vadduwm 20, 19, 31571vadduwm 21, 20, 31572vadduwm 22, 21, 31573xxlor 9, 32+22, 32+22 # save last state574575# vxor state, state, w # addroundkey576xxlxor 32+15, 32+15, 0 # IV + round key - add round key 0577xxlxor 32+16, 32+16, 0578xxlxor 32+17, 32+17, 0579xxlxor 32+18, 32+18, 0580xxlxor 32+19, 32+19, 0581xxlxor 32+20, 32+20, 0582xxlxor 32+21, 32+21, 0583xxlxor 32+22, 32+22, 0584585li 15, 16586li 16, 32587li 17, 48588li 18, 64589li 19, 80590li 20, 96591li 21, 112592593#594# Pre-compute first 8 AES state and leave 1/3/5 more rounds595# for the loop.596#597addi 22, 23, -9 # process 8 keys598mtctr 22 # AES key loop599addi 10, 6, 144600601LOOP_8AES_STATE # process 8 AES keys602603__PreLoop_aes_state:604lxv 32+1, 0(10) # round key605AES_CIPHER_8x 1606addi 10, 10, 16607bdnz __PreLoop_aes_state608lxv 32+1, 0(10) # last round key (v1)609610cmpdi 12, 0 # Only one loop (8 block)611beq __Finish_ghash612613#614# Loop 8x blocks and compute ghash615#616__Loop_8x_block_enc:617PROCESS_8X_AES_STATES618619# Compute ghash here620vxor 15, 15, 0621PPC_GFMUL128_8x622623COMPUTE_STATES624625addi 5, 5, -128626addi 11, 11, 128627628lxv 32+23, 16(6) # round key 1629lxv 32+24, 32(6) # round key 2630lxv 32+25, 48(6) # round key 3631lxv 32+26, 64(6) # round key 4632lxv 32+27, 80(6) # round key 5633lxv 32+28, 96(6) # round key 6634lxv 32+29, 112(6) # round key 7635lxv 32+1, 128(6) # round key 8636637# Compute first 8 AES state and leave 1/3/5 more rounds638# for the loop.639LOOP_8AES_STATE # process 8 AES keys640mtctr 22 # AES key loop641addi 10, 6, 144642643__LastLoop_aes_state:644lxv 32+1, 0(10) # round key645AES_CIPHER_8x 1646addi 10, 10, 16647bdnz __LastLoop_aes_state648649lxv 32+1, 0(10) # last round key (v1)650651addi 12, 12, -1652cmpdi 12, 0653bne __Loop_8x_block_enc654655#656# Remainng blocks657#658__Finish_ghash:659PROCESS_8X_AES_STATES660661# Compute ghash here662vxor 15, 15, 0663PPC_GFMUL128_8x664665# Update IV and Xi666xxlor 30+32, 9, 9 # last ctr667vadduwm 30, 30, 31 # increase ctr668stxvb16x 32+0, 0, 8 # update Xi669670addi 5, 5, -128671addi 11, 11, 128672673#674# Done 8x blocks675#676677cmpdi 5, 0678beq aes_gcm_out679680__Process_more_enc:681li 24, 1 # encrypt682bl aes_gcm_crypt_1x683cmpdi 5, 0684beq aes_gcm_out685686bl __Process_partial687b aes_gcm_out688689.size ppc_aes_gcm_encrypt,.-ppc_aes_gcm_encrypt690691################################################################################692# ppc_aes_gcm_decrypt (const void *inp, void *out, size_t len,693# const char *rk, unsigned char iv[16], void *Xip);694# 8x Decrypt695#696################################################################################697.global ppc_aes_gcm_decrypt698.align 5699ppc_aes_gcm_decrypt:700.localentry ppc_aes_gcm_decrypt, 0701702SAVE_REGS703LOAD_HASH_TABLE704705# initialize ICB: GHASH( IV ), IV - r7706lxvb16x 30+32, 0, 7 # load IV - v30707708mr 14, 3709mr 9, 4710711# counter 1712vxor 31, 31, 31713vspltisb 22, 1714vsldoi 31, 31, 22,1 # counter 1715716addis 11, 2, permx@toc@ha717addi 11, 11, permx@toc@l718lxv 10, 0(11) # vs10: vpermxor vector719li 11, 0720721lxv 0, 0(6) # round key 0722723#724# Process different blocks725#726cmpdi 5, 128727blt __Process_more_dec728729# load 9 round keys730lxv 32+23, 16(6) # round key 1731lxv 32+24, 32(6) # round key 2732lxv 32+25, 48(6) # round key 3733lxv 32+26, 64(6) # round key 4734lxv 32+27, 80(6) # round key 5735lxv 32+28, 96(6) # round key 6736lxv 32+29, 112(6) # round key 7737lxv 32+1, 128(6) # round key 8738739# load rounds - 10 (128), 12 (192), 14 (256)740lwz 23, 240(6) # n rounds741742__Process_decrypt:743#744# Process 8x AES/GCM blocks745#746__Process_8x_dec:747# 8x blocks748li 10, 128749divdu 12, 5, 10 # n 128 bytes-blocks750751addi 12, 12, -1 # loop - 1752753vmr 15, 30 # first state: IV754vadduwm 16, 15, 31 # state + counter755vadduwm 17, 16, 31756vadduwm 18, 17, 31757vadduwm 19, 18, 31758vadduwm 20, 19, 31759vadduwm 21, 20, 31760vadduwm 22, 21, 31761xxlor 9, 32+22, 32+22 # save last state762763# vxor state, state, w # addroundkey764xxlxor 32+15, 32+15, 0 # IV + round key - add round key 0765xxlxor 32+16, 32+16, 0766xxlxor 32+17, 32+17, 0767xxlxor 32+18, 32+18, 0768xxlxor 32+19, 32+19, 0769xxlxor 32+20, 32+20, 0770xxlxor 32+21, 32+21, 0771xxlxor 32+22, 32+22, 0772773li 15, 16774li 16, 32775li 17, 48776li 18, 64777li 19, 80778li 20, 96779li 21, 112780781#782# Pre-compute first 8 AES state and leave 1/3/5 more rounds783# for the loop.784#785addi 22, 23, -9 # process 8 keys786mtctr 22 # AES key loop787addi 10, 6, 144788789LOOP_8AES_STATE # process 8 AES keys790791__PreLoop_aes_state_dec:792lxv 32+1, 0(10) # round key793AES_CIPHER_8x 1794addi 10, 10, 16795bdnz __PreLoop_aes_state_dec796lxv 32+1, 0(10) # last round key (v1)797798cmpdi 12, 0 # Only one loop (8 block)799beq __Finish_ghash_dec800801#802# Loop 8x blocks and compute ghash803#804__Loop_8x_block_dec:805vcipherlast 15, 15, 1806vcipherlast 16, 16, 1807vcipherlast 17, 17, 1808vcipherlast 18, 18, 1809vcipherlast 19, 19, 1810vcipherlast 20, 20, 1811vcipherlast 21, 21, 1812vcipherlast 22, 22, 1813814lxvb16x 32+23, 0, 14 # load block815lxvb16x 32+24, 15, 14 # load block816lxvb16x 32+25, 16, 14 # load block817lxvb16x 32+26, 17, 14 # load block818lxvb16x 32+27, 18, 14 # load block819lxvb16x 32+28, 19, 14 # load block820lxvb16x 32+29, 20, 14 # load block821lxvb16x 32+30, 21, 14 # load block822addi 14, 14, 128823824vxor 15, 15, 23825vxor 16, 16, 24826vxor 17, 17, 25827vxor 18, 18, 26828vxor 19, 19, 27829vxor 20, 20, 28830vxor 21, 21, 29831vxor 22, 22, 30832833stxvb16x 47, 0, 9 # store output834stxvb16x 48, 15, 9 # store output835stxvb16x 49, 16, 9 # store output836stxvb16x 50, 17, 9 # store output837stxvb16x 51, 18, 9 # store output838stxvb16x 52, 19, 9 # store output839stxvb16x 53, 20, 9 # store output840stxvb16x 54, 21, 9 # store output841842addi 9, 9, 128843844vmr 15, 23845vmr 16, 24846vmr 17, 25847vmr 18, 26848vmr 19, 27849vmr 20, 28850vmr 21, 29851vmr 22, 30852853# ghash here854vxor 15, 15, 0855PPC_GFMUL128_8x856857xxlor 32+15, 9, 9 # last state858vadduwm 15, 15, 31 # state + counter859vadduwm 16, 15, 31860vadduwm 17, 16, 31861vadduwm 18, 17, 31862vadduwm 19, 18, 31863vadduwm 20, 19, 31864vadduwm 21, 20, 31865vadduwm 22, 21, 31866xxlor 9, 32+22, 32+22 # save last state867868xxlor 32+27, 0, 0 # restore roundkey 0869vxor 15, 15, 27 # IV + round key - add round key 0870vxor 16, 16, 27871vxor 17, 17, 27872vxor 18, 18, 27873vxor 19, 19, 27874vxor 20, 20, 27875vxor 21, 21, 27876vxor 22, 22, 27877878addi 5, 5, -128879addi 11, 11, 128880881lxv 32+23, 16(6) # round key 1882lxv 32+24, 32(6) # round key 2883lxv 32+25, 48(6) # round key 3884lxv 32+26, 64(6) # round key 4885lxv 32+27, 80(6) # round key 5886lxv 32+28, 96(6) # round key 6887lxv 32+29, 112(6) # round key 7888lxv 32+1, 128(6) # round key 8889890LOOP_8AES_STATE # process 8 AES keys891mtctr 22 # AES key loop892addi 10, 6, 144893__LastLoop_aes_state_dec:894lxv 32+1, 0(10) # round key895AES_CIPHER_8x 1896addi 10, 10, 16897bdnz __LastLoop_aes_state_dec898lxv 32+1, 0(10) # last round key (v1)899900addi 12, 12, -1901cmpdi 12, 0902bne __Loop_8x_block_dec903904__Finish_ghash_dec:905vcipherlast 15, 15, 1906vcipherlast 16, 16, 1907vcipherlast 17, 17, 1908vcipherlast 18, 18, 1909vcipherlast 19, 19, 1910vcipherlast 20, 20, 1911vcipherlast 21, 21, 1912vcipherlast 22, 22, 1913914lxvb16x 32+23, 0, 14 # load block915lxvb16x 32+24, 15, 14 # load block916lxvb16x 32+25, 16, 14 # load block917lxvb16x 32+26, 17, 14 # load block918lxvb16x 32+27, 18, 14 # load block919lxvb16x 32+28, 19, 14 # load block920lxvb16x 32+29, 20, 14 # load block921lxvb16x 32+30, 21, 14 # load block922addi 14, 14, 128923924vxor 15, 15, 23925vxor 16, 16, 24926vxor 17, 17, 25927vxor 18, 18, 26928vxor 19, 19, 27929vxor 20, 20, 28930vxor 21, 21, 29931vxor 22, 22, 30932933stxvb16x 47, 0, 9 # store output934stxvb16x 48, 15, 9 # store output935stxvb16x 49, 16, 9 # store output936stxvb16x 50, 17, 9 # store output937stxvb16x 51, 18, 9 # store output938stxvb16x 52, 19, 9 # store output939stxvb16x 53, 20, 9 # store output940stxvb16x 54, 21, 9 # store output941addi 9, 9, 128942943vxor 15, 23, 0944vmr 16, 24945vmr 17, 25946vmr 18, 26947vmr 19, 27948vmr 20, 28949vmr 21, 29950vmr 22, 30951952#vxor 15, 15, 0953PPC_GFMUL128_8x954955xxlor 30+32, 9, 9 # last ctr956vadduwm 30, 30, 31 # increase ctr957stxvb16x 32+0, 0, 8 # update Xi958959addi 5, 5, -128960addi 11, 11, 128961962#963# Done 8x blocks964#965966cmpdi 5, 0967beq aes_gcm_out968969__Process_more_dec:970li 24, 0 # decrypt971bl aes_gcm_crypt_1x972cmpdi 5, 0973beq aes_gcm_out974975bl __Process_partial976b aes_gcm_out977.size ppc_aes_gcm_decrypt,.-ppc_aes_gcm_decrypt978979aes_gcm_out:980.localentry aes_gcm_out,0981982mr 3, 11 # return count983984RESTORE_REGS985blr986.size aes_gcm_out,.-aes_gcm_out987988.rodata989.align 4990# for vector permute and xor991permx:992.long 0x4c5d6e7f, 0x08192a3b, 0xc4d5e6f7, 0x8091a2b3993994995