162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci # 362306a36Sopenharmony_ci # Accelerated AES-GCM stitched implementation for ppc64le. 462306a36Sopenharmony_ci # 562306a36Sopenharmony_ci # Copyright 2022- IBM Inc. All rights reserved 662306a36Sopenharmony_ci # 762306a36Sopenharmony_ci #=================================================================================== 862306a36Sopenharmony_ci # Written by Danny Tsen <dtsen@linux.ibm.com> 962306a36Sopenharmony_ci # 1062306a36Sopenharmony_ci # GHASH is based on the Karatsuba multiplication method. 1162306a36Sopenharmony_ci # 1262306a36Sopenharmony_ci # Xi xor X1 1362306a36Sopenharmony_ci # 1462306a36Sopenharmony_ci # X1 * H^4 + X2 * H^3 + x3 * H^2 + X4 * H = 1562306a36Sopenharmony_ci # (X1.h * H4.h + xX.l * H4.l + X1 * H4) + 1662306a36Sopenharmony_ci # (X2.h * H3.h + X2.l * H3.l + X2 * H3) + 1762306a36Sopenharmony_ci # (X3.h * H2.h + X3.l * H2.l + X3 * H2) + 1862306a36Sopenharmony_ci # (X4.h * H.h + X4.l * H.l + X4 * H) 1962306a36Sopenharmony_ci # 2062306a36Sopenharmony_ci # Xi = v0 2162306a36Sopenharmony_ci # H Poly = v2 2262306a36Sopenharmony_ci # Hash keys = v3 - v14 2362306a36Sopenharmony_ci # ( H.l, H, H.h) 2462306a36Sopenharmony_ci # ( H^2.l, H^2, H^2.h) 2562306a36Sopenharmony_ci # ( H^3.l, H^3, H^3.h) 2662306a36Sopenharmony_ci # ( H^4.l, H^4, H^4.h) 2762306a36Sopenharmony_ci # 2862306a36Sopenharmony_ci # v30 is IV 2962306a36Sopenharmony_ci # v31 - counter 1 3062306a36Sopenharmony_ci # 3162306a36Sopenharmony_ci # AES used, 3262306a36Sopenharmony_ci # vs0 - vs14 for round keys 3362306a36Sopenharmony_ci # v15, v16, v17, v18, v19, v20, v21, v22 for 8 blocks (encrypted) 3462306a36Sopenharmony_ci # 3562306a36Sopenharmony_ci # This implementation uses stitched AES-GCM approach to improve overall performance. 3662306a36Sopenharmony_ci # AES is implemented with 8x blocks and GHASH is using 2 4x blocks. 3762306a36Sopenharmony_ci # 3862306a36Sopenharmony_ci # =================================================================================== 3962306a36Sopenharmony_ci # 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#include <asm/ppc_asm.h> 4262306a36Sopenharmony_ci#include <linux/linkage.h> 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci.machine "any" 4562306a36Sopenharmony_ci.text 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci # 4x loops 4862306a36Sopenharmony_ci # v15 - v18 - input states 4962306a36Sopenharmony_ci # vs1 - vs9 - round keys 5062306a36Sopenharmony_ci # 5162306a36Sopenharmony_ci.macro Loop_aes_middle4x 5262306a36Sopenharmony_ci xxlor 19+32, 1, 1 5362306a36Sopenharmony_ci xxlor 20+32, 2, 2 5462306a36Sopenharmony_ci xxlor 21+32, 3, 3 5562306a36Sopenharmony_ci xxlor 22+32, 4, 4 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci vcipher 15, 15, 19 5862306a36Sopenharmony_ci vcipher 16, 16, 19 5962306a36Sopenharmony_ci vcipher 17, 17, 19 6062306a36Sopenharmony_ci vcipher 18, 18, 19 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci vcipher 15, 15, 20 6362306a36Sopenharmony_ci vcipher 16, 16, 20 6462306a36Sopenharmony_ci vcipher 17, 17, 20 6562306a36Sopenharmony_ci vcipher 18, 18, 20 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci vcipher 15, 15, 21 6862306a36Sopenharmony_ci vcipher 16, 16, 21 6962306a36Sopenharmony_ci vcipher 17, 17, 21 7062306a36Sopenharmony_ci vcipher 18, 18, 21 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci vcipher 15, 15, 22 7362306a36Sopenharmony_ci vcipher 16, 16, 22 7462306a36Sopenharmony_ci vcipher 17, 17, 22 7562306a36Sopenharmony_ci vcipher 18, 18, 22 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci xxlor 19+32, 5, 5 7862306a36Sopenharmony_ci xxlor 20+32, 6, 6 7962306a36Sopenharmony_ci xxlor 21+32, 7, 7 8062306a36Sopenharmony_ci xxlor 22+32, 8, 8 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci vcipher 15, 15, 19 8362306a36Sopenharmony_ci vcipher 16, 16, 19 8462306a36Sopenharmony_ci vcipher 17, 17, 19 8562306a36Sopenharmony_ci vcipher 18, 18, 19 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci vcipher 15, 15, 20 8862306a36Sopenharmony_ci vcipher 16, 16, 20 8962306a36Sopenharmony_ci vcipher 17, 17, 20 9062306a36Sopenharmony_ci vcipher 18, 18, 20 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci vcipher 15, 15, 21 9362306a36Sopenharmony_ci vcipher 16, 16, 21 9462306a36Sopenharmony_ci vcipher 17, 17, 21 9562306a36Sopenharmony_ci vcipher 18, 18, 21 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci vcipher 15, 15, 22 9862306a36Sopenharmony_ci vcipher 16, 16, 22 9962306a36Sopenharmony_ci vcipher 17, 17, 22 10062306a36Sopenharmony_ci vcipher 18, 18, 22 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci xxlor 23+32, 9, 9 10362306a36Sopenharmony_ci vcipher 15, 15, 23 10462306a36Sopenharmony_ci vcipher 16, 16, 23 10562306a36Sopenharmony_ci vcipher 17, 17, 23 10662306a36Sopenharmony_ci vcipher 18, 18, 23 10762306a36Sopenharmony_ci.endm 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci # 8x loops 11062306a36Sopenharmony_ci # v15 - v22 - input states 11162306a36Sopenharmony_ci # vs1 - vs9 - round keys 11262306a36Sopenharmony_ci # 11362306a36Sopenharmony_ci.macro Loop_aes_middle8x 11462306a36Sopenharmony_ci xxlor 23+32, 1, 1 11562306a36Sopenharmony_ci xxlor 24+32, 2, 2 11662306a36Sopenharmony_ci xxlor 25+32, 3, 3 11762306a36Sopenharmony_ci xxlor 26+32, 4, 4 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci vcipher 15, 15, 23 12062306a36Sopenharmony_ci vcipher 16, 16, 23 12162306a36Sopenharmony_ci vcipher 17, 17, 23 12262306a36Sopenharmony_ci vcipher 18, 18, 23 12362306a36Sopenharmony_ci vcipher 19, 19, 23 12462306a36Sopenharmony_ci vcipher 20, 20, 23 12562306a36Sopenharmony_ci vcipher 21, 21, 23 12662306a36Sopenharmony_ci vcipher 22, 22, 23 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci vcipher 15, 15, 24 12962306a36Sopenharmony_ci vcipher 16, 16, 24 13062306a36Sopenharmony_ci vcipher 17, 17, 24 13162306a36Sopenharmony_ci vcipher 18, 18, 24 13262306a36Sopenharmony_ci vcipher 19, 19, 24 13362306a36Sopenharmony_ci vcipher 20, 20, 24 13462306a36Sopenharmony_ci vcipher 21, 21, 24 13562306a36Sopenharmony_ci vcipher 22, 22, 24 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci vcipher 15, 15, 25 13862306a36Sopenharmony_ci vcipher 16, 16, 25 13962306a36Sopenharmony_ci vcipher 17, 17, 25 14062306a36Sopenharmony_ci vcipher 18, 18, 25 14162306a36Sopenharmony_ci vcipher 19, 19, 25 14262306a36Sopenharmony_ci vcipher 20, 20, 25 14362306a36Sopenharmony_ci vcipher 21, 21, 25 14462306a36Sopenharmony_ci vcipher 22, 22, 25 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci vcipher 15, 15, 26 14762306a36Sopenharmony_ci vcipher 16, 16, 26 14862306a36Sopenharmony_ci vcipher 17, 17, 26 14962306a36Sopenharmony_ci vcipher 18, 18, 26 15062306a36Sopenharmony_ci vcipher 19, 19, 26 15162306a36Sopenharmony_ci vcipher 20, 20, 26 15262306a36Sopenharmony_ci vcipher 21, 21, 26 15362306a36Sopenharmony_ci vcipher 22, 22, 26 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci xxlor 23+32, 5, 5 15662306a36Sopenharmony_ci xxlor 24+32, 6, 6 15762306a36Sopenharmony_ci xxlor 25+32, 7, 7 15862306a36Sopenharmony_ci xxlor 26+32, 8, 8 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci vcipher 15, 15, 23 16162306a36Sopenharmony_ci vcipher 16, 16, 23 16262306a36Sopenharmony_ci vcipher 17, 17, 23 16362306a36Sopenharmony_ci vcipher 18, 18, 23 16462306a36Sopenharmony_ci vcipher 19, 19, 23 16562306a36Sopenharmony_ci vcipher 20, 20, 23 16662306a36Sopenharmony_ci vcipher 21, 21, 23 16762306a36Sopenharmony_ci vcipher 22, 22, 23 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci vcipher 15, 15, 24 17062306a36Sopenharmony_ci vcipher 16, 16, 24 17162306a36Sopenharmony_ci vcipher 17, 17, 24 17262306a36Sopenharmony_ci vcipher 18, 18, 24 17362306a36Sopenharmony_ci vcipher 19, 19, 24 17462306a36Sopenharmony_ci vcipher 20, 20, 24 17562306a36Sopenharmony_ci vcipher 21, 21, 24 17662306a36Sopenharmony_ci vcipher 22, 22, 24 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci vcipher 15, 15, 25 17962306a36Sopenharmony_ci vcipher 16, 16, 25 18062306a36Sopenharmony_ci vcipher 17, 17, 25 18162306a36Sopenharmony_ci vcipher 18, 18, 25 18262306a36Sopenharmony_ci vcipher 19, 19, 25 18362306a36Sopenharmony_ci vcipher 20, 20, 25 18462306a36Sopenharmony_ci vcipher 21, 21, 25 18562306a36Sopenharmony_ci vcipher 22, 22, 25 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci vcipher 15, 15, 26 18862306a36Sopenharmony_ci vcipher 16, 16, 26 18962306a36Sopenharmony_ci vcipher 17, 17, 26 19062306a36Sopenharmony_ci vcipher 18, 18, 26 19162306a36Sopenharmony_ci vcipher 19, 19, 26 19262306a36Sopenharmony_ci vcipher 20, 20, 26 19362306a36Sopenharmony_ci vcipher 21, 21, 26 19462306a36Sopenharmony_ci vcipher 22, 22, 26 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci xxlor 23+32, 9, 9 19762306a36Sopenharmony_ci vcipher 15, 15, 23 19862306a36Sopenharmony_ci vcipher 16, 16, 23 19962306a36Sopenharmony_ci vcipher 17, 17, 23 20062306a36Sopenharmony_ci vcipher 18, 18, 23 20162306a36Sopenharmony_ci vcipher 19, 19, 23 20262306a36Sopenharmony_ci vcipher 20, 20, 23 20362306a36Sopenharmony_ci vcipher 21, 21, 23 20462306a36Sopenharmony_ci vcipher 22, 22, 23 20562306a36Sopenharmony_ci.endm 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci.macro Loop_aes_middle_1x 20862306a36Sopenharmony_ci xxlor 19+32, 1, 1 20962306a36Sopenharmony_ci xxlor 20+32, 2, 2 21062306a36Sopenharmony_ci xxlor 21+32, 3, 3 21162306a36Sopenharmony_ci xxlor 22+32, 4, 4 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci vcipher 15, 15, 19 21462306a36Sopenharmony_ci vcipher 15, 15, 20 21562306a36Sopenharmony_ci vcipher 15, 15, 21 21662306a36Sopenharmony_ci vcipher 15, 15, 22 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci xxlor 19+32, 5, 5 21962306a36Sopenharmony_ci xxlor 20+32, 6, 6 22062306a36Sopenharmony_ci xxlor 21+32, 7, 7 22162306a36Sopenharmony_ci xxlor 22+32, 8, 8 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci vcipher 15, 15, 19 22462306a36Sopenharmony_ci vcipher 15, 15, 20 22562306a36Sopenharmony_ci vcipher 15, 15, 21 22662306a36Sopenharmony_ci vcipher 15, 15, 22 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci xxlor 19+32, 9, 9 22962306a36Sopenharmony_ci vcipher 15, 15, 19 23062306a36Sopenharmony_ci.endm 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci # 23362306a36Sopenharmony_ci # Compute 4x hash values based on Karatsuba method. 23462306a36Sopenharmony_ci # 23562306a36Sopenharmony_ci.macro ppc_aes_gcm_ghash 23662306a36Sopenharmony_ci vxor 15, 15, 0 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci vpmsumd 23, 12, 15 # H4.L * X.L 23962306a36Sopenharmony_ci vpmsumd 24, 9, 16 24062306a36Sopenharmony_ci vpmsumd 25, 6, 17 24162306a36Sopenharmony_ci vpmsumd 26, 3, 18 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci vxor 23, 23, 24 24462306a36Sopenharmony_ci vxor 23, 23, 25 24562306a36Sopenharmony_ci vxor 23, 23, 26 # L 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci vpmsumd 24, 13, 15 # H4.L * X.H + H4.H * X.L 24862306a36Sopenharmony_ci vpmsumd 25, 10, 16 # H3.L * X1.H + H3.H * X1.L 24962306a36Sopenharmony_ci vpmsumd 26, 7, 17 25062306a36Sopenharmony_ci vpmsumd 27, 4, 18 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci vxor 24, 24, 25 25362306a36Sopenharmony_ci vxor 24, 24, 26 25462306a36Sopenharmony_ci vxor 24, 24, 27 # M 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci # sum hash and reduction with H Poly 25762306a36Sopenharmony_ci vpmsumd 28, 23, 2 # reduction 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci vxor 29, 29, 29 26062306a36Sopenharmony_ci vsldoi 26, 24, 29, 8 # mL 26162306a36Sopenharmony_ci vsldoi 29, 29, 24, 8 # mH 26262306a36Sopenharmony_ci vxor 23, 23, 26 # mL + L 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci vsldoi 23, 23, 23, 8 # swap 26562306a36Sopenharmony_ci vxor 23, 23, 28 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci vpmsumd 24, 14, 15 # H4.H * X.H 26862306a36Sopenharmony_ci vpmsumd 25, 11, 16 26962306a36Sopenharmony_ci vpmsumd 26, 8, 17 27062306a36Sopenharmony_ci vpmsumd 27, 5, 18 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci vxor 24, 24, 25 27362306a36Sopenharmony_ci vxor 24, 24, 26 27462306a36Sopenharmony_ci vxor 24, 24, 27 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci vxor 24, 24, 29 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci # sum hash and reduction with H Poly 27962306a36Sopenharmony_ci vsldoi 27, 23, 23, 8 # swap 28062306a36Sopenharmony_ci vpmsumd 23, 23, 2 28162306a36Sopenharmony_ci vxor 27, 27, 24 28262306a36Sopenharmony_ci vxor 23, 23, 27 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci xxlor 32, 23+32, 23+32 # update hash 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci.endm 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci # 28962306a36Sopenharmony_ci # Combine two 4x ghash 29062306a36Sopenharmony_ci # v15 - v22 - input blocks 29162306a36Sopenharmony_ci # 29262306a36Sopenharmony_ci.macro ppc_aes_gcm_ghash2_4x 29362306a36Sopenharmony_ci # first 4x hash 29462306a36Sopenharmony_ci vxor 15, 15, 0 # Xi + X 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci vpmsumd 23, 12, 15 # H4.L * X.L 29762306a36Sopenharmony_ci vpmsumd 24, 9, 16 29862306a36Sopenharmony_ci vpmsumd 25, 6, 17 29962306a36Sopenharmony_ci vpmsumd 26, 3, 18 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci vxor 23, 23, 24 30262306a36Sopenharmony_ci vxor 23, 23, 25 30362306a36Sopenharmony_ci vxor 23, 23, 26 # L 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci vpmsumd 24, 13, 15 # H4.L * X.H + H4.H * X.L 30662306a36Sopenharmony_ci vpmsumd 25, 10, 16 # H3.L * X1.H + H3.H * X1.L 30762306a36Sopenharmony_ci vpmsumd 26, 7, 17 30862306a36Sopenharmony_ci vpmsumd 27, 4, 18 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci vxor 24, 24, 25 31162306a36Sopenharmony_ci vxor 24, 24, 26 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci # sum hash and reduction with H Poly 31462306a36Sopenharmony_ci vpmsumd 28, 23, 2 # reduction 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci vxor 29, 29, 29 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci vxor 24, 24, 27 # M 31962306a36Sopenharmony_ci vsldoi 26, 24, 29, 8 # mL 32062306a36Sopenharmony_ci vsldoi 29, 29, 24, 8 # mH 32162306a36Sopenharmony_ci vxor 23, 23, 26 # mL + L 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci vsldoi 23, 23, 23, 8 # swap 32462306a36Sopenharmony_ci vxor 23, 23, 28 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci vpmsumd 24, 14, 15 # H4.H * X.H 32762306a36Sopenharmony_ci vpmsumd 25, 11, 16 32862306a36Sopenharmony_ci vpmsumd 26, 8, 17 32962306a36Sopenharmony_ci vpmsumd 27, 5, 18 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci vxor 24, 24, 25 33262306a36Sopenharmony_ci vxor 24, 24, 26 33362306a36Sopenharmony_ci vxor 24, 24, 27 # H 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci vxor 24, 24, 29 # H + mH 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci # sum hash and reduction with H Poly 33862306a36Sopenharmony_ci vsldoi 27, 23, 23, 8 # swap 33962306a36Sopenharmony_ci vpmsumd 23, 23, 2 34062306a36Sopenharmony_ci vxor 27, 27, 24 34162306a36Sopenharmony_ci vxor 27, 23, 27 # 1st Xi 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci # 2nd 4x hash 34462306a36Sopenharmony_ci vpmsumd 24, 9, 20 34562306a36Sopenharmony_ci vpmsumd 25, 6, 21 34662306a36Sopenharmony_ci vpmsumd 26, 3, 22 34762306a36Sopenharmony_ci vxor 19, 19, 27 # Xi + X 34862306a36Sopenharmony_ci vpmsumd 23, 12, 19 # H4.L * X.L 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci vxor 23, 23, 24 35162306a36Sopenharmony_ci vxor 23, 23, 25 35262306a36Sopenharmony_ci vxor 23, 23, 26 # L 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci vpmsumd 24, 13, 19 # H4.L * X.H + H4.H * X.L 35562306a36Sopenharmony_ci vpmsumd 25, 10, 20 # H3.L * X1.H + H3.H * X1.L 35662306a36Sopenharmony_ci vpmsumd 26, 7, 21 35762306a36Sopenharmony_ci vpmsumd 27, 4, 22 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci vxor 24, 24, 25 36062306a36Sopenharmony_ci vxor 24, 24, 26 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci # sum hash and reduction with H Poly 36362306a36Sopenharmony_ci vpmsumd 28, 23, 2 # reduction 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci vxor 29, 29, 29 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci vxor 24, 24, 27 # M 36862306a36Sopenharmony_ci vsldoi 26, 24, 29, 8 # mL 36962306a36Sopenharmony_ci vsldoi 29, 29, 24, 8 # mH 37062306a36Sopenharmony_ci vxor 23, 23, 26 # mL + L 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci vsldoi 23, 23, 23, 8 # swap 37362306a36Sopenharmony_ci vxor 23, 23, 28 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci vpmsumd 24, 14, 19 # H4.H * X.H 37662306a36Sopenharmony_ci vpmsumd 25, 11, 20 37762306a36Sopenharmony_ci vpmsumd 26, 8, 21 37862306a36Sopenharmony_ci vpmsumd 27, 5, 22 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci vxor 24, 24, 25 38162306a36Sopenharmony_ci vxor 24, 24, 26 38262306a36Sopenharmony_ci vxor 24, 24, 27 # H 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci vxor 24, 24, 29 # H + mH 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci # sum hash and reduction with H Poly 38762306a36Sopenharmony_ci vsldoi 27, 23, 23, 8 # swap 38862306a36Sopenharmony_ci vpmsumd 23, 23, 2 38962306a36Sopenharmony_ci vxor 27, 27, 24 39062306a36Sopenharmony_ci vxor 23, 23, 27 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci xxlor 32, 23+32, 23+32 # update hash 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci.endm 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci # 39762306a36Sopenharmony_ci # Compute update single hash 39862306a36Sopenharmony_ci # 39962306a36Sopenharmony_ci.macro ppc_update_hash_1x 40062306a36Sopenharmony_ci vxor 28, 28, 0 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci vxor 19, 19, 19 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci vpmsumd 22, 3, 28 # L 40562306a36Sopenharmony_ci vpmsumd 23, 4, 28 # M 40662306a36Sopenharmony_ci vpmsumd 24, 5, 28 # H 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci vpmsumd 27, 22, 2 # reduction 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci vsldoi 25, 23, 19, 8 # mL 41162306a36Sopenharmony_ci vsldoi 26, 19, 23, 8 # mH 41262306a36Sopenharmony_ci vxor 22, 22, 25 # LL + LL 41362306a36Sopenharmony_ci vxor 24, 24, 26 # HH + HH 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci vsldoi 22, 22, 22, 8 # swap 41662306a36Sopenharmony_ci vxor 22, 22, 27 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci vsldoi 20, 22, 22, 8 # swap 41962306a36Sopenharmony_ci vpmsumd 22, 22, 2 # reduction 42062306a36Sopenharmony_ci vxor 20, 20, 24 42162306a36Sopenharmony_ci vxor 22, 22, 20 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci vmr 0, 22 # update hash 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_ci.endm 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci.macro SAVE_REGS 42862306a36Sopenharmony_ci stdu 1,-640(1) 42962306a36Sopenharmony_ci mflr 0 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci std 14,112(1) 43262306a36Sopenharmony_ci std 15,120(1) 43362306a36Sopenharmony_ci std 16,128(1) 43462306a36Sopenharmony_ci std 17,136(1) 43562306a36Sopenharmony_ci std 18,144(1) 43662306a36Sopenharmony_ci std 19,152(1) 43762306a36Sopenharmony_ci std 20,160(1) 43862306a36Sopenharmony_ci std 21,168(1) 43962306a36Sopenharmony_ci li 9, 256 44062306a36Sopenharmony_ci stvx 20, 9, 1 44162306a36Sopenharmony_ci addi 9, 9, 16 44262306a36Sopenharmony_ci stvx 21, 9, 1 44362306a36Sopenharmony_ci addi 9, 9, 16 44462306a36Sopenharmony_ci stvx 22, 9, 1 44562306a36Sopenharmony_ci addi 9, 9, 16 44662306a36Sopenharmony_ci stvx 23, 9, 1 44762306a36Sopenharmony_ci addi 9, 9, 16 44862306a36Sopenharmony_ci stvx 24, 9, 1 44962306a36Sopenharmony_ci addi 9, 9, 16 45062306a36Sopenharmony_ci stvx 25, 9, 1 45162306a36Sopenharmony_ci addi 9, 9, 16 45262306a36Sopenharmony_ci stvx 26, 9, 1 45362306a36Sopenharmony_ci addi 9, 9, 16 45462306a36Sopenharmony_ci stvx 27, 9, 1 45562306a36Sopenharmony_ci addi 9, 9, 16 45662306a36Sopenharmony_ci stvx 28, 9, 1 45762306a36Sopenharmony_ci addi 9, 9, 16 45862306a36Sopenharmony_ci stvx 29, 9, 1 45962306a36Sopenharmony_ci addi 9, 9, 16 46062306a36Sopenharmony_ci stvx 30, 9, 1 46162306a36Sopenharmony_ci addi 9, 9, 16 46262306a36Sopenharmony_ci stvx 31, 9, 1 46362306a36Sopenharmony_ci stxv 14, 464(1) 46462306a36Sopenharmony_ci stxv 15, 480(1) 46562306a36Sopenharmony_ci stxv 16, 496(1) 46662306a36Sopenharmony_ci stxv 17, 512(1) 46762306a36Sopenharmony_ci stxv 18, 528(1) 46862306a36Sopenharmony_ci stxv 19, 544(1) 46962306a36Sopenharmony_ci stxv 20, 560(1) 47062306a36Sopenharmony_ci stxv 21, 576(1) 47162306a36Sopenharmony_ci stxv 22, 592(1) 47262306a36Sopenharmony_ci std 0, 656(1) 47362306a36Sopenharmony_ci.endm 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci.macro RESTORE_REGS 47662306a36Sopenharmony_ci lxv 14, 464(1) 47762306a36Sopenharmony_ci lxv 15, 480(1) 47862306a36Sopenharmony_ci lxv 16, 496(1) 47962306a36Sopenharmony_ci lxv 17, 512(1) 48062306a36Sopenharmony_ci lxv 18, 528(1) 48162306a36Sopenharmony_ci lxv 19, 544(1) 48262306a36Sopenharmony_ci lxv 20, 560(1) 48362306a36Sopenharmony_ci lxv 21, 576(1) 48462306a36Sopenharmony_ci lxv 22, 592(1) 48562306a36Sopenharmony_ci li 9, 256 48662306a36Sopenharmony_ci lvx 20, 9, 1 48762306a36Sopenharmony_ci addi 9, 9, 16 48862306a36Sopenharmony_ci lvx 21, 9, 1 48962306a36Sopenharmony_ci addi 9, 9, 16 49062306a36Sopenharmony_ci lvx 22, 9, 1 49162306a36Sopenharmony_ci addi 9, 9, 16 49262306a36Sopenharmony_ci lvx 23, 9, 1 49362306a36Sopenharmony_ci addi 9, 9, 16 49462306a36Sopenharmony_ci lvx 24, 9, 1 49562306a36Sopenharmony_ci addi 9, 9, 16 49662306a36Sopenharmony_ci lvx 25, 9, 1 49762306a36Sopenharmony_ci addi 9, 9, 16 49862306a36Sopenharmony_ci lvx 26, 9, 1 49962306a36Sopenharmony_ci addi 9, 9, 16 50062306a36Sopenharmony_ci lvx 27, 9, 1 50162306a36Sopenharmony_ci addi 9, 9, 16 50262306a36Sopenharmony_ci lvx 28, 9, 1 50362306a36Sopenharmony_ci addi 9, 9, 16 50462306a36Sopenharmony_ci lvx 29, 9, 1 50562306a36Sopenharmony_ci addi 9, 9, 16 50662306a36Sopenharmony_ci lvx 30, 9, 1 50762306a36Sopenharmony_ci addi 9, 9, 16 50862306a36Sopenharmony_ci lvx 31, 9, 1 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ci ld 0, 656(1) 51162306a36Sopenharmony_ci ld 14,112(1) 51262306a36Sopenharmony_ci ld 15,120(1) 51362306a36Sopenharmony_ci ld 16,128(1) 51462306a36Sopenharmony_ci ld 17,136(1) 51562306a36Sopenharmony_ci ld 18,144(1) 51662306a36Sopenharmony_ci ld 19,152(1) 51762306a36Sopenharmony_ci ld 20,160(1) 51862306a36Sopenharmony_ci ld 21,168(1) 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_ci mtlr 0 52162306a36Sopenharmony_ci addi 1, 1, 640 52262306a36Sopenharmony_ci.endm 52362306a36Sopenharmony_ci 52462306a36Sopenharmony_ci.macro LOAD_HASH_TABLE 52562306a36Sopenharmony_ci # Load Xi 52662306a36Sopenharmony_ci lxvb16x 32, 0, 8 # load Xi 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ci # load Hash - h^4, h^3, h^2, h 52962306a36Sopenharmony_ci li 10, 32 53062306a36Sopenharmony_ci lxvd2x 2+32, 10, 8 # H Poli 53162306a36Sopenharmony_ci li 10, 48 53262306a36Sopenharmony_ci lxvd2x 3+32, 10, 8 # Hl 53362306a36Sopenharmony_ci li 10, 64 53462306a36Sopenharmony_ci lxvd2x 4+32, 10, 8 # H 53562306a36Sopenharmony_ci li 10, 80 53662306a36Sopenharmony_ci lxvd2x 5+32, 10, 8 # Hh 53762306a36Sopenharmony_ci 53862306a36Sopenharmony_ci li 10, 96 53962306a36Sopenharmony_ci lxvd2x 6+32, 10, 8 # H^2l 54062306a36Sopenharmony_ci li 10, 112 54162306a36Sopenharmony_ci lxvd2x 7+32, 10, 8 # H^2 54262306a36Sopenharmony_ci li 10, 128 54362306a36Sopenharmony_ci lxvd2x 8+32, 10, 8 # H^2h 54462306a36Sopenharmony_ci 54562306a36Sopenharmony_ci li 10, 144 54662306a36Sopenharmony_ci lxvd2x 9+32, 10, 8 # H^3l 54762306a36Sopenharmony_ci li 10, 160 54862306a36Sopenharmony_ci lxvd2x 10+32, 10, 8 # H^3 54962306a36Sopenharmony_ci li 10, 176 55062306a36Sopenharmony_ci lxvd2x 11+32, 10, 8 # H^3h 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_ci li 10, 192 55362306a36Sopenharmony_ci lxvd2x 12+32, 10, 8 # H^4l 55462306a36Sopenharmony_ci li 10, 208 55562306a36Sopenharmony_ci lxvd2x 13+32, 10, 8 # H^4 55662306a36Sopenharmony_ci li 10, 224 55762306a36Sopenharmony_ci lxvd2x 14+32, 10, 8 # H^4h 55862306a36Sopenharmony_ci.endm 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_ci # 56162306a36Sopenharmony_ci # aes_p10_gcm_encrypt (const void *inp, void *out, size_t len, 56262306a36Sopenharmony_ci # const char *rk, unsigned char iv[16], void *Xip); 56362306a36Sopenharmony_ci # 56462306a36Sopenharmony_ci # r3 - inp 56562306a36Sopenharmony_ci # r4 - out 56662306a36Sopenharmony_ci # r5 - len 56762306a36Sopenharmony_ci # r6 - AES round keys 56862306a36Sopenharmony_ci # r7 - iv and other data 56962306a36Sopenharmony_ci # r8 - Xi, HPoli, hash keys 57062306a36Sopenharmony_ci # 57162306a36Sopenharmony_ci # rounds is at offset 240 in rk 57262306a36Sopenharmony_ci # Xi is at 0 in gcm_table (Xip). 57362306a36Sopenharmony_ci # 57462306a36Sopenharmony_ci_GLOBAL(aes_p10_gcm_encrypt) 57562306a36Sopenharmony_ci.align 5 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_ci SAVE_REGS 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci LOAD_HASH_TABLE 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_ci # initialize ICB: GHASH( IV ), IV - r7 58262306a36Sopenharmony_ci lxvb16x 30+32, 0, 7 # load IV - v30 58362306a36Sopenharmony_ci 58462306a36Sopenharmony_ci mr 12, 5 # length 58562306a36Sopenharmony_ci li 11, 0 # block index 58662306a36Sopenharmony_ci 58762306a36Sopenharmony_ci # counter 1 58862306a36Sopenharmony_ci vxor 31, 31, 31 58962306a36Sopenharmony_ci vspltisb 22, 1 59062306a36Sopenharmony_ci vsldoi 31, 31, 22,1 # counter 1 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_ci # load round key to VSR 59362306a36Sopenharmony_ci lxv 0, 0(6) 59462306a36Sopenharmony_ci lxv 1, 0x10(6) 59562306a36Sopenharmony_ci lxv 2, 0x20(6) 59662306a36Sopenharmony_ci lxv 3, 0x30(6) 59762306a36Sopenharmony_ci lxv 4, 0x40(6) 59862306a36Sopenharmony_ci lxv 5, 0x50(6) 59962306a36Sopenharmony_ci lxv 6, 0x60(6) 60062306a36Sopenharmony_ci lxv 7, 0x70(6) 60162306a36Sopenharmony_ci lxv 8, 0x80(6) 60262306a36Sopenharmony_ci lxv 9, 0x90(6) 60362306a36Sopenharmony_ci lxv 10, 0xa0(6) 60462306a36Sopenharmony_ci 60562306a36Sopenharmony_ci # load rounds - 10 (128), 12 (192), 14 (256) 60662306a36Sopenharmony_ci lwz 9,240(6) 60762306a36Sopenharmony_ci 60862306a36Sopenharmony_ci # 60962306a36Sopenharmony_ci # vxor state, state, w # addroundkey 61062306a36Sopenharmony_ci xxlor 32+29, 0, 0 61162306a36Sopenharmony_ci vxor 15, 30, 29 # IV + round key - add round key 0 61262306a36Sopenharmony_ci 61362306a36Sopenharmony_ci cmpdi 9, 10 61462306a36Sopenharmony_ci beq Loop_aes_gcm_8x 61562306a36Sopenharmony_ci 61662306a36Sopenharmony_ci # load 2 more round keys (v11, v12) 61762306a36Sopenharmony_ci lxv 11, 0xb0(6) 61862306a36Sopenharmony_ci lxv 12, 0xc0(6) 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci cmpdi 9, 12 62162306a36Sopenharmony_ci beq Loop_aes_gcm_8x 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_ci # load 2 more round keys (v11, v12, v13, v14) 62462306a36Sopenharmony_ci lxv 13, 0xd0(6) 62562306a36Sopenharmony_ci lxv 14, 0xe0(6) 62662306a36Sopenharmony_ci cmpdi 9, 14 62762306a36Sopenharmony_ci beq Loop_aes_gcm_8x 62862306a36Sopenharmony_ci 62962306a36Sopenharmony_ci b aes_gcm_out 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_ci.align 5 63262306a36Sopenharmony_ciLoop_aes_gcm_8x: 63362306a36Sopenharmony_ci mr 14, 3 63462306a36Sopenharmony_ci mr 9, 4 63562306a36Sopenharmony_ci 63662306a36Sopenharmony_ci # 63762306a36Sopenharmony_ci # check partial block 63862306a36Sopenharmony_ci # 63962306a36Sopenharmony_ciContinue_partial_check: 64062306a36Sopenharmony_ci ld 15, 56(7) 64162306a36Sopenharmony_ci cmpdi 15, 0 64262306a36Sopenharmony_ci beq Continue 64362306a36Sopenharmony_ci bgt Final_block 64462306a36Sopenharmony_ci cmpdi 15, 16 64562306a36Sopenharmony_ci blt Final_block 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_ciContinue: 64862306a36Sopenharmony_ci # n blcoks 64962306a36Sopenharmony_ci li 10, 128 65062306a36Sopenharmony_ci divdu 10, 12, 10 # n 128 bytes-blocks 65162306a36Sopenharmony_ci cmpdi 10, 0 65262306a36Sopenharmony_ci beq Loop_last_block 65362306a36Sopenharmony_ci 65462306a36Sopenharmony_ci vaddudm 30, 30, 31 # IV + counter 65562306a36Sopenharmony_ci vxor 16, 30, 29 65662306a36Sopenharmony_ci vaddudm 30, 30, 31 65762306a36Sopenharmony_ci vxor 17, 30, 29 65862306a36Sopenharmony_ci vaddudm 30, 30, 31 65962306a36Sopenharmony_ci vxor 18, 30, 29 66062306a36Sopenharmony_ci vaddudm 30, 30, 31 66162306a36Sopenharmony_ci vxor 19, 30, 29 66262306a36Sopenharmony_ci vaddudm 30, 30, 31 66362306a36Sopenharmony_ci vxor 20, 30, 29 66462306a36Sopenharmony_ci vaddudm 30, 30, 31 66562306a36Sopenharmony_ci vxor 21, 30, 29 66662306a36Sopenharmony_ci vaddudm 30, 30, 31 66762306a36Sopenharmony_ci vxor 22, 30, 29 66862306a36Sopenharmony_ci 66962306a36Sopenharmony_ci mtctr 10 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_ci li 15, 16 67262306a36Sopenharmony_ci li 16, 32 67362306a36Sopenharmony_ci li 17, 48 67462306a36Sopenharmony_ci li 18, 64 67562306a36Sopenharmony_ci li 19, 80 67662306a36Sopenharmony_ci li 20, 96 67762306a36Sopenharmony_ci li 21, 112 67862306a36Sopenharmony_ci 67962306a36Sopenharmony_ci lwz 10, 240(6) 68062306a36Sopenharmony_ci 68162306a36Sopenharmony_ciLoop_8x_block: 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_ci lxvb16x 15, 0, 14 # load block 68462306a36Sopenharmony_ci lxvb16x 16, 15, 14 # load block 68562306a36Sopenharmony_ci lxvb16x 17, 16, 14 # load block 68662306a36Sopenharmony_ci lxvb16x 18, 17, 14 # load block 68762306a36Sopenharmony_ci lxvb16x 19, 18, 14 # load block 68862306a36Sopenharmony_ci lxvb16x 20, 19, 14 # load block 68962306a36Sopenharmony_ci lxvb16x 21, 20, 14 # load block 69062306a36Sopenharmony_ci lxvb16x 22, 21, 14 # load block 69162306a36Sopenharmony_ci addi 14, 14, 128 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci Loop_aes_middle8x 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ci xxlor 23+32, 10, 10 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_ci cmpdi 10, 10 69862306a36Sopenharmony_ci beq Do_next_ghash 69962306a36Sopenharmony_ci 70062306a36Sopenharmony_ci # 192 bits 70162306a36Sopenharmony_ci xxlor 24+32, 11, 11 70262306a36Sopenharmony_ci 70362306a36Sopenharmony_ci vcipher 15, 15, 23 70462306a36Sopenharmony_ci vcipher 16, 16, 23 70562306a36Sopenharmony_ci vcipher 17, 17, 23 70662306a36Sopenharmony_ci vcipher 18, 18, 23 70762306a36Sopenharmony_ci vcipher 19, 19, 23 70862306a36Sopenharmony_ci vcipher 20, 20, 23 70962306a36Sopenharmony_ci vcipher 21, 21, 23 71062306a36Sopenharmony_ci vcipher 22, 22, 23 71162306a36Sopenharmony_ci 71262306a36Sopenharmony_ci vcipher 15, 15, 24 71362306a36Sopenharmony_ci vcipher 16, 16, 24 71462306a36Sopenharmony_ci vcipher 17, 17, 24 71562306a36Sopenharmony_ci vcipher 18, 18, 24 71662306a36Sopenharmony_ci vcipher 19, 19, 24 71762306a36Sopenharmony_ci vcipher 20, 20, 24 71862306a36Sopenharmony_ci vcipher 21, 21, 24 71962306a36Sopenharmony_ci vcipher 22, 22, 24 72062306a36Sopenharmony_ci 72162306a36Sopenharmony_ci xxlor 23+32, 12, 12 72262306a36Sopenharmony_ci 72362306a36Sopenharmony_ci cmpdi 10, 12 72462306a36Sopenharmony_ci beq Do_next_ghash 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_ci # 256 bits 72762306a36Sopenharmony_ci xxlor 24+32, 13, 13 72862306a36Sopenharmony_ci 72962306a36Sopenharmony_ci vcipher 15, 15, 23 73062306a36Sopenharmony_ci vcipher 16, 16, 23 73162306a36Sopenharmony_ci vcipher 17, 17, 23 73262306a36Sopenharmony_ci vcipher 18, 18, 23 73362306a36Sopenharmony_ci vcipher 19, 19, 23 73462306a36Sopenharmony_ci vcipher 20, 20, 23 73562306a36Sopenharmony_ci vcipher 21, 21, 23 73662306a36Sopenharmony_ci vcipher 22, 22, 23 73762306a36Sopenharmony_ci 73862306a36Sopenharmony_ci vcipher 15, 15, 24 73962306a36Sopenharmony_ci vcipher 16, 16, 24 74062306a36Sopenharmony_ci vcipher 17, 17, 24 74162306a36Sopenharmony_ci vcipher 18, 18, 24 74262306a36Sopenharmony_ci vcipher 19, 19, 24 74362306a36Sopenharmony_ci vcipher 20, 20, 24 74462306a36Sopenharmony_ci vcipher 21, 21, 24 74562306a36Sopenharmony_ci vcipher 22, 22, 24 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_ci xxlor 23+32, 14, 14 74862306a36Sopenharmony_ci 74962306a36Sopenharmony_ci cmpdi 10, 14 75062306a36Sopenharmony_ci beq Do_next_ghash 75162306a36Sopenharmony_ci b aes_gcm_out 75262306a36Sopenharmony_ci 75362306a36Sopenharmony_ciDo_next_ghash: 75462306a36Sopenharmony_ci 75562306a36Sopenharmony_ci # 75662306a36Sopenharmony_ci # last round 75762306a36Sopenharmony_ci vcipherlast 15, 15, 23 75862306a36Sopenharmony_ci vcipherlast 16, 16, 23 75962306a36Sopenharmony_ci 76062306a36Sopenharmony_ci xxlxor 47, 47, 15 76162306a36Sopenharmony_ci stxvb16x 47, 0, 9 # store output 76262306a36Sopenharmony_ci xxlxor 48, 48, 16 76362306a36Sopenharmony_ci stxvb16x 48, 15, 9 # store output 76462306a36Sopenharmony_ci 76562306a36Sopenharmony_ci vcipherlast 17, 17, 23 76662306a36Sopenharmony_ci vcipherlast 18, 18, 23 76762306a36Sopenharmony_ci 76862306a36Sopenharmony_ci xxlxor 49, 49, 17 76962306a36Sopenharmony_ci stxvb16x 49, 16, 9 # store output 77062306a36Sopenharmony_ci xxlxor 50, 50, 18 77162306a36Sopenharmony_ci stxvb16x 50, 17, 9 # store output 77262306a36Sopenharmony_ci 77362306a36Sopenharmony_ci vcipherlast 19, 19, 23 77462306a36Sopenharmony_ci vcipherlast 20, 20, 23 77562306a36Sopenharmony_ci 77662306a36Sopenharmony_ci xxlxor 51, 51, 19 77762306a36Sopenharmony_ci stxvb16x 51, 18, 9 # store output 77862306a36Sopenharmony_ci xxlxor 52, 52, 20 77962306a36Sopenharmony_ci stxvb16x 52, 19, 9 # store output 78062306a36Sopenharmony_ci 78162306a36Sopenharmony_ci vcipherlast 21, 21, 23 78262306a36Sopenharmony_ci vcipherlast 22, 22, 23 78362306a36Sopenharmony_ci 78462306a36Sopenharmony_ci xxlxor 53, 53, 21 78562306a36Sopenharmony_ci stxvb16x 53, 20, 9 # store output 78662306a36Sopenharmony_ci xxlxor 54, 54, 22 78762306a36Sopenharmony_ci stxvb16x 54, 21, 9 # store output 78862306a36Sopenharmony_ci 78962306a36Sopenharmony_ci addi 9, 9, 128 79062306a36Sopenharmony_ci 79162306a36Sopenharmony_ci # ghash here 79262306a36Sopenharmony_ci ppc_aes_gcm_ghash2_4x 79362306a36Sopenharmony_ci 79462306a36Sopenharmony_ci xxlor 27+32, 0, 0 79562306a36Sopenharmony_ci vaddudm 30, 30, 31 # IV + counter 79662306a36Sopenharmony_ci vmr 29, 30 79762306a36Sopenharmony_ci vxor 15, 30, 27 # add round key 79862306a36Sopenharmony_ci vaddudm 30, 30, 31 79962306a36Sopenharmony_ci vxor 16, 30, 27 80062306a36Sopenharmony_ci vaddudm 30, 30, 31 80162306a36Sopenharmony_ci vxor 17, 30, 27 80262306a36Sopenharmony_ci vaddudm 30, 30, 31 80362306a36Sopenharmony_ci vxor 18, 30, 27 80462306a36Sopenharmony_ci vaddudm 30, 30, 31 80562306a36Sopenharmony_ci vxor 19, 30, 27 80662306a36Sopenharmony_ci vaddudm 30, 30, 31 80762306a36Sopenharmony_ci vxor 20, 30, 27 80862306a36Sopenharmony_ci vaddudm 30, 30, 31 80962306a36Sopenharmony_ci vxor 21, 30, 27 81062306a36Sopenharmony_ci vaddudm 30, 30, 31 81162306a36Sopenharmony_ci vxor 22, 30, 27 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_ci addi 12, 12, -128 81462306a36Sopenharmony_ci addi 11, 11, 128 81562306a36Sopenharmony_ci 81662306a36Sopenharmony_ci bdnz Loop_8x_block 81762306a36Sopenharmony_ci 81862306a36Sopenharmony_ci vmr 30, 29 81962306a36Sopenharmony_ci stxvb16x 30+32, 0, 7 # update IV 82062306a36Sopenharmony_ci 82162306a36Sopenharmony_ciLoop_last_block: 82262306a36Sopenharmony_ci cmpdi 12, 0 82362306a36Sopenharmony_ci beq aes_gcm_out 82462306a36Sopenharmony_ci 82562306a36Sopenharmony_ci # loop last few blocks 82662306a36Sopenharmony_ci li 10, 16 82762306a36Sopenharmony_ci divdu 10, 12, 10 82862306a36Sopenharmony_ci 82962306a36Sopenharmony_ci mtctr 10 83062306a36Sopenharmony_ci 83162306a36Sopenharmony_ci lwz 10, 240(6) 83262306a36Sopenharmony_ci 83362306a36Sopenharmony_ci cmpdi 12, 16 83462306a36Sopenharmony_ci blt Final_block 83562306a36Sopenharmony_ci 83662306a36Sopenharmony_ciNext_rem_block: 83762306a36Sopenharmony_ci lxvb16x 15, 0, 14 # load block 83862306a36Sopenharmony_ci 83962306a36Sopenharmony_ci Loop_aes_middle_1x 84062306a36Sopenharmony_ci 84162306a36Sopenharmony_ci xxlor 23+32, 10, 10 84262306a36Sopenharmony_ci 84362306a36Sopenharmony_ci cmpdi 10, 10 84462306a36Sopenharmony_ci beq Do_next_1x 84562306a36Sopenharmony_ci 84662306a36Sopenharmony_ci # 192 bits 84762306a36Sopenharmony_ci xxlor 24+32, 11, 11 84862306a36Sopenharmony_ci 84962306a36Sopenharmony_ci vcipher 15, 15, 23 85062306a36Sopenharmony_ci vcipher 15, 15, 24 85162306a36Sopenharmony_ci 85262306a36Sopenharmony_ci xxlor 23+32, 12, 12 85362306a36Sopenharmony_ci 85462306a36Sopenharmony_ci cmpdi 10, 12 85562306a36Sopenharmony_ci beq Do_next_1x 85662306a36Sopenharmony_ci 85762306a36Sopenharmony_ci # 256 bits 85862306a36Sopenharmony_ci xxlor 24+32, 13, 13 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_ci vcipher 15, 15, 23 86162306a36Sopenharmony_ci vcipher 15, 15, 24 86262306a36Sopenharmony_ci 86362306a36Sopenharmony_ci xxlor 23+32, 14, 14 86462306a36Sopenharmony_ci 86562306a36Sopenharmony_ci cmpdi 10, 14 86662306a36Sopenharmony_ci beq Do_next_1x 86762306a36Sopenharmony_ci 86862306a36Sopenharmony_ciDo_next_1x: 86962306a36Sopenharmony_ci vcipherlast 15, 15, 23 87062306a36Sopenharmony_ci 87162306a36Sopenharmony_ci xxlxor 47, 47, 15 87262306a36Sopenharmony_ci stxvb16x 47, 0, 9 # store output 87362306a36Sopenharmony_ci addi 14, 14, 16 87462306a36Sopenharmony_ci addi 9, 9, 16 87562306a36Sopenharmony_ci 87662306a36Sopenharmony_ci vmr 28, 15 87762306a36Sopenharmony_ci ppc_update_hash_1x 87862306a36Sopenharmony_ci 87962306a36Sopenharmony_ci addi 12, 12, -16 88062306a36Sopenharmony_ci addi 11, 11, 16 88162306a36Sopenharmony_ci xxlor 19+32, 0, 0 88262306a36Sopenharmony_ci vaddudm 30, 30, 31 # IV + counter 88362306a36Sopenharmony_ci vxor 15, 30, 19 # add round key 88462306a36Sopenharmony_ci 88562306a36Sopenharmony_ci bdnz Next_rem_block 88662306a36Sopenharmony_ci 88762306a36Sopenharmony_ci li 15, 0 88862306a36Sopenharmony_ci std 15, 56(7) # clear partial? 88962306a36Sopenharmony_ci stxvb16x 30+32, 0, 7 # update IV 89062306a36Sopenharmony_ci cmpdi 12, 0 89162306a36Sopenharmony_ci beq aes_gcm_out 89262306a36Sopenharmony_ci 89362306a36Sopenharmony_ciFinal_block: 89462306a36Sopenharmony_ci lwz 10, 240(6) 89562306a36Sopenharmony_ci Loop_aes_middle_1x 89662306a36Sopenharmony_ci 89762306a36Sopenharmony_ci xxlor 23+32, 10, 10 89862306a36Sopenharmony_ci 89962306a36Sopenharmony_ci cmpdi 10, 10 90062306a36Sopenharmony_ci beq Do_final_1x 90162306a36Sopenharmony_ci 90262306a36Sopenharmony_ci # 192 bits 90362306a36Sopenharmony_ci xxlor 24+32, 11, 11 90462306a36Sopenharmony_ci 90562306a36Sopenharmony_ci vcipher 15, 15, 23 90662306a36Sopenharmony_ci vcipher 15, 15, 24 90762306a36Sopenharmony_ci 90862306a36Sopenharmony_ci xxlor 23+32, 12, 12 90962306a36Sopenharmony_ci 91062306a36Sopenharmony_ci cmpdi 10, 12 91162306a36Sopenharmony_ci beq Do_final_1x 91262306a36Sopenharmony_ci 91362306a36Sopenharmony_ci # 256 bits 91462306a36Sopenharmony_ci xxlor 24+32, 13, 13 91562306a36Sopenharmony_ci 91662306a36Sopenharmony_ci vcipher 15, 15, 23 91762306a36Sopenharmony_ci vcipher 15, 15, 24 91862306a36Sopenharmony_ci 91962306a36Sopenharmony_ci xxlor 23+32, 14, 14 92062306a36Sopenharmony_ci 92162306a36Sopenharmony_ci cmpdi 10, 14 92262306a36Sopenharmony_ci beq Do_final_1x 92362306a36Sopenharmony_ci 92462306a36Sopenharmony_ciDo_final_1x: 92562306a36Sopenharmony_ci vcipherlast 15, 15, 23 92662306a36Sopenharmony_ci 92762306a36Sopenharmony_ci # check partial block 92862306a36Sopenharmony_ci li 21, 0 # encrypt 92962306a36Sopenharmony_ci ld 15, 56(7) # partial? 93062306a36Sopenharmony_ci cmpdi 15, 0 93162306a36Sopenharmony_ci beq Normal_block 93262306a36Sopenharmony_ci bl Do_partial_block 93362306a36Sopenharmony_ci 93462306a36Sopenharmony_ci cmpdi 12, 0 93562306a36Sopenharmony_ci ble aes_gcm_out 93662306a36Sopenharmony_ci 93762306a36Sopenharmony_ci b Continue_partial_check 93862306a36Sopenharmony_ci 93962306a36Sopenharmony_ciNormal_block: 94062306a36Sopenharmony_ci lxvb16x 15, 0, 14 # load last block 94162306a36Sopenharmony_ci xxlxor 47, 47, 15 94262306a36Sopenharmony_ci 94362306a36Sopenharmony_ci # create partial block mask 94462306a36Sopenharmony_ci li 15, 16 94562306a36Sopenharmony_ci sub 15, 15, 12 # index to the mask 94662306a36Sopenharmony_ci 94762306a36Sopenharmony_ci vspltisb 16, -1 # first 16 bytes - 0xffff...ff 94862306a36Sopenharmony_ci vspltisb 17, 0 # second 16 bytes - 0x0000...00 94962306a36Sopenharmony_ci li 10, 192 95062306a36Sopenharmony_ci stvx 16, 10, 1 95162306a36Sopenharmony_ci addi 10, 10, 16 95262306a36Sopenharmony_ci stvx 17, 10, 1 95362306a36Sopenharmony_ci 95462306a36Sopenharmony_ci addi 10, 1, 192 95562306a36Sopenharmony_ci lxvb16x 16, 15, 10 # load partial block mask 95662306a36Sopenharmony_ci xxland 47, 47, 16 95762306a36Sopenharmony_ci 95862306a36Sopenharmony_ci vmr 28, 15 95962306a36Sopenharmony_ci ppc_update_hash_1x 96062306a36Sopenharmony_ci 96162306a36Sopenharmony_ci # * should store only the remaining bytes. 96262306a36Sopenharmony_ci bl Write_partial_block 96362306a36Sopenharmony_ci 96462306a36Sopenharmony_ci stxvb16x 30+32, 0, 7 # update IV 96562306a36Sopenharmony_ci std 12, 56(7) # update partial? 96662306a36Sopenharmony_ci li 16, 16 96762306a36Sopenharmony_ci 96862306a36Sopenharmony_ci stxvb16x 32, 0, 8 # write out Xi 96962306a36Sopenharmony_ci stxvb16x 32, 16, 8 # write out Xi 97062306a36Sopenharmony_ci b aes_gcm_out 97162306a36Sopenharmony_ci 97262306a36Sopenharmony_ci # 97362306a36Sopenharmony_ci # Compute data mask 97462306a36Sopenharmony_ci # 97562306a36Sopenharmony_ci.macro GEN_MASK _mask _start _end 97662306a36Sopenharmony_ci vspltisb 16, -1 # first 16 bytes - 0xffff...ff 97762306a36Sopenharmony_ci vspltisb 17, 0 # second 16 bytes - 0x0000...00 97862306a36Sopenharmony_ci li 10, 192 97962306a36Sopenharmony_ci stxvb16x 17+32, 10, 1 98062306a36Sopenharmony_ci add 10, 10, \_start 98162306a36Sopenharmony_ci stxvb16x 16+32, 10, 1 98262306a36Sopenharmony_ci add 10, 10, \_end 98362306a36Sopenharmony_ci stxvb16x 17+32, 10, 1 98462306a36Sopenharmony_ci 98562306a36Sopenharmony_ci addi 10, 1, 192 98662306a36Sopenharmony_ci lxvb16x \_mask, 0, 10 # load partial block mask 98762306a36Sopenharmony_ci.endm 98862306a36Sopenharmony_ci 98962306a36Sopenharmony_ci # 99062306a36Sopenharmony_ci # Handle multiple partial blocks for encrypt and decrypt 99162306a36Sopenharmony_ci # operations. 99262306a36Sopenharmony_ci # 99362306a36Sopenharmony_ciSYM_FUNC_START_LOCAL(Do_partial_block) 99462306a36Sopenharmony_ci add 17, 15, 5 99562306a36Sopenharmony_ci cmpdi 17, 16 99662306a36Sopenharmony_ci bgt Big_block 99762306a36Sopenharmony_ci GEN_MASK 18, 15, 5 99862306a36Sopenharmony_ci b _Partial 99962306a36Sopenharmony_ciSYM_FUNC_END(Do_partial_block) 100062306a36Sopenharmony_ciBig_block: 100162306a36Sopenharmony_ci li 16, 16 100262306a36Sopenharmony_ci GEN_MASK 18, 15, 16 100362306a36Sopenharmony_ci 100462306a36Sopenharmony_ci_Partial: 100562306a36Sopenharmony_ci lxvb16x 17+32, 0, 14 # load last block 100662306a36Sopenharmony_ci sldi 16, 15, 3 100762306a36Sopenharmony_ci mtvsrdd 32+16, 0, 16 100862306a36Sopenharmony_ci vsro 17, 17, 16 100962306a36Sopenharmony_ci xxlxor 47, 47, 17+32 101062306a36Sopenharmony_ci xxland 47, 47, 18 101162306a36Sopenharmony_ci 101262306a36Sopenharmony_ci vxor 0, 0, 0 # clear Xi 101362306a36Sopenharmony_ci vmr 28, 15 101462306a36Sopenharmony_ci 101562306a36Sopenharmony_ci cmpdi 21, 0 # encrypt/decrypt ops? 101662306a36Sopenharmony_ci beq Skip_decrypt 101762306a36Sopenharmony_ci xxland 32+28, 32+17, 18 101862306a36Sopenharmony_ci 101962306a36Sopenharmony_ciSkip_decrypt: 102062306a36Sopenharmony_ci 102162306a36Sopenharmony_ci ppc_update_hash_1x 102262306a36Sopenharmony_ci 102362306a36Sopenharmony_ci li 16, 16 102462306a36Sopenharmony_ci lxvb16x 32+29, 16, 8 102562306a36Sopenharmony_ci vxor 0, 0, 29 102662306a36Sopenharmony_ci stxvb16x 32, 0, 8 # save Xi 102762306a36Sopenharmony_ci stxvb16x 32, 16, 8 # save Xi 102862306a36Sopenharmony_ci 102962306a36Sopenharmony_ci # store partial block 103062306a36Sopenharmony_ci # loop the rest of the stream if any 103162306a36Sopenharmony_ci sldi 16, 15, 3 103262306a36Sopenharmony_ci mtvsrdd 32+16, 0, 16 103362306a36Sopenharmony_ci vslo 15, 15, 16 103462306a36Sopenharmony_ci #stxvb16x 15+32, 0, 9 # last block 103562306a36Sopenharmony_ci 103662306a36Sopenharmony_ci li 16, 16 103762306a36Sopenharmony_ci sub 17, 16, 15 # 16 - partial 103862306a36Sopenharmony_ci 103962306a36Sopenharmony_ci add 16, 15, 5 104062306a36Sopenharmony_ci cmpdi 16, 16 104162306a36Sopenharmony_ci bgt Larger_16 104262306a36Sopenharmony_ci mr 17, 5 104362306a36Sopenharmony_ciLarger_16: 104462306a36Sopenharmony_ci 104562306a36Sopenharmony_ci # write partial 104662306a36Sopenharmony_ci li 10, 192 104762306a36Sopenharmony_ci stxvb16x 15+32, 10, 1 # save current block 104862306a36Sopenharmony_ci 104962306a36Sopenharmony_ci addi 10, 9, -1 105062306a36Sopenharmony_ci addi 16, 1, 191 105162306a36Sopenharmony_ci mtctr 17 # move partial byte count 105262306a36Sopenharmony_ci 105362306a36Sopenharmony_ciWrite_last_partial: 105462306a36Sopenharmony_ci lbzu 18, 1(16) 105562306a36Sopenharmony_ci stbu 18, 1(10) 105662306a36Sopenharmony_ci bdnz Write_last_partial 105762306a36Sopenharmony_ci # Complete loop partial 105862306a36Sopenharmony_ci 105962306a36Sopenharmony_ci add 14, 14, 17 106062306a36Sopenharmony_ci add 9, 9, 17 106162306a36Sopenharmony_ci sub 12, 12, 17 106262306a36Sopenharmony_ci add 11, 11, 17 106362306a36Sopenharmony_ci 106462306a36Sopenharmony_ci add 15, 15, 5 106562306a36Sopenharmony_ci cmpdi 15, 16 106662306a36Sopenharmony_ci blt Save_partial 106762306a36Sopenharmony_ci 106862306a36Sopenharmony_ci vaddudm 30, 30, 31 106962306a36Sopenharmony_ci stxvb16x 30+32, 0, 7 # update IV 107062306a36Sopenharmony_ci xxlor 32+29, 0, 0 107162306a36Sopenharmony_ci vxor 15, 30, 29 # IV + round key - add round key 0 107262306a36Sopenharmony_ci li 15, 0 107362306a36Sopenharmony_ci std 15, 56(7) # partial done - clear 107462306a36Sopenharmony_ci b Partial_done 107562306a36Sopenharmony_ciSave_partial: 107662306a36Sopenharmony_ci std 15, 56(7) # partial 107762306a36Sopenharmony_ci 107862306a36Sopenharmony_ciPartial_done: 107962306a36Sopenharmony_ci blr 108062306a36Sopenharmony_ci 108162306a36Sopenharmony_ci # 108262306a36Sopenharmony_ci # Write partial block 108362306a36Sopenharmony_ci # r9 - output 108462306a36Sopenharmony_ci # r12 - remaining bytes 108562306a36Sopenharmony_ci # v15 - partial input data 108662306a36Sopenharmony_ci # 108762306a36Sopenharmony_ciSYM_FUNC_START_LOCAL(Write_partial_block) 108862306a36Sopenharmony_ci li 10, 192 108962306a36Sopenharmony_ci stxvb16x 15+32, 10, 1 # last block 109062306a36Sopenharmony_ci 109162306a36Sopenharmony_ci addi 10, 9, -1 109262306a36Sopenharmony_ci addi 16, 1, 191 109362306a36Sopenharmony_ci 109462306a36Sopenharmony_ci mtctr 12 # remaining bytes 109562306a36Sopenharmony_ci li 15, 0 109662306a36Sopenharmony_ci 109762306a36Sopenharmony_ciWrite_last_byte: 109862306a36Sopenharmony_ci lbzu 14, 1(16) 109962306a36Sopenharmony_ci stbu 14, 1(10) 110062306a36Sopenharmony_ci bdnz Write_last_byte 110162306a36Sopenharmony_ci blr 110262306a36Sopenharmony_ciSYM_FUNC_END(Write_partial_block) 110362306a36Sopenharmony_ci 110462306a36Sopenharmony_ciaes_gcm_out: 110562306a36Sopenharmony_ci # out = state 110662306a36Sopenharmony_ci stxvb16x 32, 0, 8 # write out Xi 110762306a36Sopenharmony_ci add 3, 11, 12 # return count 110862306a36Sopenharmony_ci 110962306a36Sopenharmony_ci RESTORE_REGS 111062306a36Sopenharmony_ci blr 111162306a36Sopenharmony_ci 111262306a36Sopenharmony_ci # 111362306a36Sopenharmony_ci # 8x Decrypt 111462306a36Sopenharmony_ci # 111562306a36Sopenharmony_ci_GLOBAL(aes_p10_gcm_decrypt) 111662306a36Sopenharmony_ci.align 5 111762306a36Sopenharmony_ci 111862306a36Sopenharmony_ci SAVE_REGS 111962306a36Sopenharmony_ci 112062306a36Sopenharmony_ci LOAD_HASH_TABLE 112162306a36Sopenharmony_ci 112262306a36Sopenharmony_ci # initialize ICB: GHASH( IV ), IV - r7 112362306a36Sopenharmony_ci lxvb16x 30+32, 0, 7 # load IV - v30 112462306a36Sopenharmony_ci 112562306a36Sopenharmony_ci mr 12, 5 # length 112662306a36Sopenharmony_ci li 11, 0 # block index 112762306a36Sopenharmony_ci 112862306a36Sopenharmony_ci # counter 1 112962306a36Sopenharmony_ci vxor 31, 31, 31 113062306a36Sopenharmony_ci vspltisb 22, 1 113162306a36Sopenharmony_ci vsldoi 31, 31, 22,1 # counter 1 113262306a36Sopenharmony_ci 113362306a36Sopenharmony_ci # load round key to VSR 113462306a36Sopenharmony_ci lxv 0, 0(6) 113562306a36Sopenharmony_ci lxv 1, 0x10(6) 113662306a36Sopenharmony_ci lxv 2, 0x20(6) 113762306a36Sopenharmony_ci lxv 3, 0x30(6) 113862306a36Sopenharmony_ci lxv 4, 0x40(6) 113962306a36Sopenharmony_ci lxv 5, 0x50(6) 114062306a36Sopenharmony_ci lxv 6, 0x60(6) 114162306a36Sopenharmony_ci lxv 7, 0x70(6) 114262306a36Sopenharmony_ci lxv 8, 0x80(6) 114362306a36Sopenharmony_ci lxv 9, 0x90(6) 114462306a36Sopenharmony_ci lxv 10, 0xa0(6) 114562306a36Sopenharmony_ci 114662306a36Sopenharmony_ci # load rounds - 10 (128), 12 (192), 14 (256) 114762306a36Sopenharmony_ci lwz 9,240(6) 114862306a36Sopenharmony_ci 114962306a36Sopenharmony_ci # 115062306a36Sopenharmony_ci # vxor state, state, w # addroundkey 115162306a36Sopenharmony_ci xxlor 32+29, 0, 0 115262306a36Sopenharmony_ci vxor 15, 30, 29 # IV + round key - add round key 0 115362306a36Sopenharmony_ci 115462306a36Sopenharmony_ci cmpdi 9, 10 115562306a36Sopenharmony_ci beq Loop_aes_gcm_8x_dec 115662306a36Sopenharmony_ci 115762306a36Sopenharmony_ci # load 2 more round keys (v11, v12) 115862306a36Sopenharmony_ci lxv 11, 0xb0(6) 115962306a36Sopenharmony_ci lxv 12, 0xc0(6) 116062306a36Sopenharmony_ci 116162306a36Sopenharmony_ci cmpdi 9, 12 116262306a36Sopenharmony_ci beq Loop_aes_gcm_8x_dec 116362306a36Sopenharmony_ci 116462306a36Sopenharmony_ci # load 2 more round keys (v11, v12, v13, v14) 116562306a36Sopenharmony_ci lxv 13, 0xd0(6) 116662306a36Sopenharmony_ci lxv 14, 0xe0(6) 116762306a36Sopenharmony_ci cmpdi 9, 14 116862306a36Sopenharmony_ci beq Loop_aes_gcm_8x_dec 116962306a36Sopenharmony_ci 117062306a36Sopenharmony_ci b aes_gcm_out 117162306a36Sopenharmony_ci 117262306a36Sopenharmony_ci.align 5 117362306a36Sopenharmony_ciLoop_aes_gcm_8x_dec: 117462306a36Sopenharmony_ci mr 14, 3 117562306a36Sopenharmony_ci mr 9, 4 117662306a36Sopenharmony_ci 117762306a36Sopenharmony_ci # 117862306a36Sopenharmony_ci # check partial block 117962306a36Sopenharmony_ci # 118062306a36Sopenharmony_ciContinue_partial_check_dec: 118162306a36Sopenharmony_ci ld 15, 56(7) 118262306a36Sopenharmony_ci cmpdi 15, 0 118362306a36Sopenharmony_ci beq Continue_dec 118462306a36Sopenharmony_ci bgt Final_block_dec 118562306a36Sopenharmony_ci cmpdi 15, 16 118662306a36Sopenharmony_ci blt Final_block_dec 118762306a36Sopenharmony_ci 118862306a36Sopenharmony_ciContinue_dec: 118962306a36Sopenharmony_ci # n blcoks 119062306a36Sopenharmony_ci li 10, 128 119162306a36Sopenharmony_ci divdu 10, 12, 10 # n 128 bytes-blocks 119262306a36Sopenharmony_ci cmpdi 10, 0 119362306a36Sopenharmony_ci beq Loop_last_block_dec 119462306a36Sopenharmony_ci 119562306a36Sopenharmony_ci vaddudm 30, 30, 31 # IV + counter 119662306a36Sopenharmony_ci vxor 16, 30, 29 119762306a36Sopenharmony_ci vaddudm 30, 30, 31 119862306a36Sopenharmony_ci vxor 17, 30, 29 119962306a36Sopenharmony_ci vaddudm 30, 30, 31 120062306a36Sopenharmony_ci vxor 18, 30, 29 120162306a36Sopenharmony_ci vaddudm 30, 30, 31 120262306a36Sopenharmony_ci vxor 19, 30, 29 120362306a36Sopenharmony_ci vaddudm 30, 30, 31 120462306a36Sopenharmony_ci vxor 20, 30, 29 120562306a36Sopenharmony_ci vaddudm 30, 30, 31 120662306a36Sopenharmony_ci vxor 21, 30, 29 120762306a36Sopenharmony_ci vaddudm 30, 30, 31 120862306a36Sopenharmony_ci vxor 22, 30, 29 120962306a36Sopenharmony_ci 121062306a36Sopenharmony_ci mtctr 10 121162306a36Sopenharmony_ci 121262306a36Sopenharmony_ci li 15, 16 121362306a36Sopenharmony_ci li 16, 32 121462306a36Sopenharmony_ci li 17, 48 121562306a36Sopenharmony_ci li 18, 64 121662306a36Sopenharmony_ci li 19, 80 121762306a36Sopenharmony_ci li 20, 96 121862306a36Sopenharmony_ci li 21, 112 121962306a36Sopenharmony_ci 122062306a36Sopenharmony_ci lwz 10, 240(6) 122162306a36Sopenharmony_ci 122262306a36Sopenharmony_ciLoop_8x_block_dec: 122362306a36Sopenharmony_ci 122462306a36Sopenharmony_ci lxvb16x 15, 0, 14 # load block 122562306a36Sopenharmony_ci lxvb16x 16, 15, 14 # load block 122662306a36Sopenharmony_ci lxvb16x 17, 16, 14 # load block 122762306a36Sopenharmony_ci lxvb16x 18, 17, 14 # load block 122862306a36Sopenharmony_ci lxvb16x 19, 18, 14 # load block 122962306a36Sopenharmony_ci lxvb16x 20, 19, 14 # load block 123062306a36Sopenharmony_ci lxvb16x 21, 20, 14 # load block 123162306a36Sopenharmony_ci lxvb16x 22, 21, 14 # load block 123262306a36Sopenharmony_ci addi 14, 14, 128 123362306a36Sopenharmony_ci 123462306a36Sopenharmony_ci Loop_aes_middle8x 123562306a36Sopenharmony_ci 123662306a36Sopenharmony_ci xxlor 23+32, 10, 10 123762306a36Sopenharmony_ci 123862306a36Sopenharmony_ci cmpdi 10, 10 123962306a36Sopenharmony_ci beq Do_next_ghash_dec 124062306a36Sopenharmony_ci 124162306a36Sopenharmony_ci # 192 bits 124262306a36Sopenharmony_ci xxlor 24+32, 11, 11 124362306a36Sopenharmony_ci 124462306a36Sopenharmony_ci vcipher 15, 15, 23 124562306a36Sopenharmony_ci vcipher 16, 16, 23 124662306a36Sopenharmony_ci vcipher 17, 17, 23 124762306a36Sopenharmony_ci vcipher 18, 18, 23 124862306a36Sopenharmony_ci vcipher 19, 19, 23 124962306a36Sopenharmony_ci vcipher 20, 20, 23 125062306a36Sopenharmony_ci vcipher 21, 21, 23 125162306a36Sopenharmony_ci vcipher 22, 22, 23 125262306a36Sopenharmony_ci 125362306a36Sopenharmony_ci vcipher 15, 15, 24 125462306a36Sopenharmony_ci vcipher 16, 16, 24 125562306a36Sopenharmony_ci vcipher 17, 17, 24 125662306a36Sopenharmony_ci vcipher 18, 18, 24 125762306a36Sopenharmony_ci vcipher 19, 19, 24 125862306a36Sopenharmony_ci vcipher 20, 20, 24 125962306a36Sopenharmony_ci vcipher 21, 21, 24 126062306a36Sopenharmony_ci vcipher 22, 22, 24 126162306a36Sopenharmony_ci 126262306a36Sopenharmony_ci xxlor 23+32, 12, 12 126362306a36Sopenharmony_ci 126462306a36Sopenharmony_ci cmpdi 10, 12 126562306a36Sopenharmony_ci beq Do_next_ghash_dec 126662306a36Sopenharmony_ci 126762306a36Sopenharmony_ci # 256 bits 126862306a36Sopenharmony_ci xxlor 24+32, 13, 13 126962306a36Sopenharmony_ci 127062306a36Sopenharmony_ci vcipher 15, 15, 23 127162306a36Sopenharmony_ci vcipher 16, 16, 23 127262306a36Sopenharmony_ci vcipher 17, 17, 23 127362306a36Sopenharmony_ci vcipher 18, 18, 23 127462306a36Sopenharmony_ci vcipher 19, 19, 23 127562306a36Sopenharmony_ci vcipher 20, 20, 23 127662306a36Sopenharmony_ci vcipher 21, 21, 23 127762306a36Sopenharmony_ci vcipher 22, 22, 23 127862306a36Sopenharmony_ci 127962306a36Sopenharmony_ci vcipher 15, 15, 24 128062306a36Sopenharmony_ci vcipher 16, 16, 24 128162306a36Sopenharmony_ci vcipher 17, 17, 24 128262306a36Sopenharmony_ci vcipher 18, 18, 24 128362306a36Sopenharmony_ci vcipher 19, 19, 24 128462306a36Sopenharmony_ci vcipher 20, 20, 24 128562306a36Sopenharmony_ci vcipher 21, 21, 24 128662306a36Sopenharmony_ci vcipher 22, 22, 24 128762306a36Sopenharmony_ci 128862306a36Sopenharmony_ci xxlor 23+32, 14, 14 128962306a36Sopenharmony_ci 129062306a36Sopenharmony_ci cmpdi 10, 14 129162306a36Sopenharmony_ci beq Do_next_ghash_dec 129262306a36Sopenharmony_ci b aes_gcm_out 129362306a36Sopenharmony_ci 129462306a36Sopenharmony_ciDo_next_ghash_dec: 129562306a36Sopenharmony_ci 129662306a36Sopenharmony_ci # 129762306a36Sopenharmony_ci # last round 129862306a36Sopenharmony_ci vcipherlast 15, 15, 23 129962306a36Sopenharmony_ci vcipherlast 16, 16, 23 130062306a36Sopenharmony_ci 130162306a36Sopenharmony_ci xxlxor 47, 47, 15 130262306a36Sopenharmony_ci stxvb16x 47, 0, 9 # store output 130362306a36Sopenharmony_ci xxlxor 48, 48, 16 130462306a36Sopenharmony_ci stxvb16x 48, 15, 9 # store output 130562306a36Sopenharmony_ci 130662306a36Sopenharmony_ci vcipherlast 17, 17, 23 130762306a36Sopenharmony_ci vcipherlast 18, 18, 23 130862306a36Sopenharmony_ci 130962306a36Sopenharmony_ci xxlxor 49, 49, 17 131062306a36Sopenharmony_ci stxvb16x 49, 16, 9 # store output 131162306a36Sopenharmony_ci xxlxor 50, 50, 18 131262306a36Sopenharmony_ci stxvb16x 50, 17, 9 # store output 131362306a36Sopenharmony_ci 131462306a36Sopenharmony_ci vcipherlast 19, 19, 23 131562306a36Sopenharmony_ci vcipherlast 20, 20, 23 131662306a36Sopenharmony_ci 131762306a36Sopenharmony_ci xxlxor 51, 51, 19 131862306a36Sopenharmony_ci stxvb16x 51, 18, 9 # store output 131962306a36Sopenharmony_ci xxlxor 52, 52, 20 132062306a36Sopenharmony_ci stxvb16x 52, 19, 9 # store output 132162306a36Sopenharmony_ci 132262306a36Sopenharmony_ci vcipherlast 21, 21, 23 132362306a36Sopenharmony_ci vcipherlast 22, 22, 23 132462306a36Sopenharmony_ci 132562306a36Sopenharmony_ci xxlxor 53, 53, 21 132662306a36Sopenharmony_ci stxvb16x 53, 20, 9 # store output 132762306a36Sopenharmony_ci xxlxor 54, 54, 22 132862306a36Sopenharmony_ci stxvb16x 54, 21, 9 # store output 132962306a36Sopenharmony_ci 133062306a36Sopenharmony_ci addi 9, 9, 128 133162306a36Sopenharmony_ci 133262306a36Sopenharmony_ci xxlor 15+32, 15, 15 133362306a36Sopenharmony_ci xxlor 16+32, 16, 16 133462306a36Sopenharmony_ci xxlor 17+32, 17, 17 133562306a36Sopenharmony_ci xxlor 18+32, 18, 18 133662306a36Sopenharmony_ci xxlor 19+32, 19, 19 133762306a36Sopenharmony_ci xxlor 20+32, 20, 20 133862306a36Sopenharmony_ci xxlor 21+32, 21, 21 133962306a36Sopenharmony_ci xxlor 22+32, 22, 22 134062306a36Sopenharmony_ci 134162306a36Sopenharmony_ci # ghash here 134262306a36Sopenharmony_ci ppc_aes_gcm_ghash2_4x 134362306a36Sopenharmony_ci 134462306a36Sopenharmony_ci xxlor 27+32, 0, 0 134562306a36Sopenharmony_ci vaddudm 30, 30, 31 # IV + counter 134662306a36Sopenharmony_ci vmr 29, 30 134762306a36Sopenharmony_ci vxor 15, 30, 27 # add round key 134862306a36Sopenharmony_ci vaddudm 30, 30, 31 134962306a36Sopenharmony_ci vxor 16, 30, 27 135062306a36Sopenharmony_ci vaddudm 30, 30, 31 135162306a36Sopenharmony_ci vxor 17, 30, 27 135262306a36Sopenharmony_ci vaddudm 30, 30, 31 135362306a36Sopenharmony_ci vxor 18, 30, 27 135462306a36Sopenharmony_ci vaddudm 30, 30, 31 135562306a36Sopenharmony_ci vxor 19, 30, 27 135662306a36Sopenharmony_ci vaddudm 30, 30, 31 135762306a36Sopenharmony_ci vxor 20, 30, 27 135862306a36Sopenharmony_ci vaddudm 30, 30, 31 135962306a36Sopenharmony_ci vxor 21, 30, 27 136062306a36Sopenharmony_ci vaddudm 30, 30, 31 136162306a36Sopenharmony_ci vxor 22, 30, 27 136262306a36Sopenharmony_ci 136362306a36Sopenharmony_ci addi 12, 12, -128 136462306a36Sopenharmony_ci addi 11, 11, 128 136562306a36Sopenharmony_ci 136662306a36Sopenharmony_ci bdnz Loop_8x_block_dec 136762306a36Sopenharmony_ci 136862306a36Sopenharmony_ci vmr 30, 29 136962306a36Sopenharmony_ci stxvb16x 30+32, 0, 7 # update IV 137062306a36Sopenharmony_ci 137162306a36Sopenharmony_ciLoop_last_block_dec: 137262306a36Sopenharmony_ci cmpdi 12, 0 137362306a36Sopenharmony_ci beq aes_gcm_out 137462306a36Sopenharmony_ci 137562306a36Sopenharmony_ci # loop last few blocks 137662306a36Sopenharmony_ci li 10, 16 137762306a36Sopenharmony_ci divdu 10, 12, 10 137862306a36Sopenharmony_ci 137962306a36Sopenharmony_ci mtctr 10 138062306a36Sopenharmony_ci 138162306a36Sopenharmony_ci lwz 10, 240(6) 138262306a36Sopenharmony_ci 138362306a36Sopenharmony_ci cmpdi 12, 16 138462306a36Sopenharmony_ci blt Final_block_dec 138562306a36Sopenharmony_ci 138662306a36Sopenharmony_ciNext_rem_block_dec: 138762306a36Sopenharmony_ci lxvb16x 15, 0, 14 # load block 138862306a36Sopenharmony_ci 138962306a36Sopenharmony_ci Loop_aes_middle_1x 139062306a36Sopenharmony_ci 139162306a36Sopenharmony_ci xxlor 23+32, 10, 10 139262306a36Sopenharmony_ci 139362306a36Sopenharmony_ci cmpdi 10, 10 139462306a36Sopenharmony_ci beq Do_next_1x_dec 139562306a36Sopenharmony_ci 139662306a36Sopenharmony_ci # 192 bits 139762306a36Sopenharmony_ci xxlor 24+32, 11, 11 139862306a36Sopenharmony_ci 139962306a36Sopenharmony_ci vcipher 15, 15, 23 140062306a36Sopenharmony_ci vcipher 15, 15, 24 140162306a36Sopenharmony_ci 140262306a36Sopenharmony_ci xxlor 23+32, 12, 12 140362306a36Sopenharmony_ci 140462306a36Sopenharmony_ci cmpdi 10, 12 140562306a36Sopenharmony_ci beq Do_next_1x_dec 140662306a36Sopenharmony_ci 140762306a36Sopenharmony_ci # 256 bits 140862306a36Sopenharmony_ci xxlor 24+32, 13, 13 140962306a36Sopenharmony_ci 141062306a36Sopenharmony_ci vcipher 15, 15, 23 141162306a36Sopenharmony_ci vcipher 15, 15, 24 141262306a36Sopenharmony_ci 141362306a36Sopenharmony_ci xxlor 23+32, 14, 14 141462306a36Sopenharmony_ci 141562306a36Sopenharmony_ci cmpdi 10, 14 141662306a36Sopenharmony_ci beq Do_next_1x_dec 141762306a36Sopenharmony_ci 141862306a36Sopenharmony_ciDo_next_1x_dec: 141962306a36Sopenharmony_ci vcipherlast 15, 15, 23 142062306a36Sopenharmony_ci 142162306a36Sopenharmony_ci xxlxor 47, 47, 15 142262306a36Sopenharmony_ci stxvb16x 47, 0, 9 # store output 142362306a36Sopenharmony_ci addi 14, 14, 16 142462306a36Sopenharmony_ci addi 9, 9, 16 142562306a36Sopenharmony_ci 142662306a36Sopenharmony_ci xxlor 28+32, 15, 15 142762306a36Sopenharmony_ci #vmr 28, 15 142862306a36Sopenharmony_ci ppc_update_hash_1x 142962306a36Sopenharmony_ci 143062306a36Sopenharmony_ci addi 12, 12, -16 143162306a36Sopenharmony_ci addi 11, 11, 16 143262306a36Sopenharmony_ci xxlor 19+32, 0, 0 143362306a36Sopenharmony_ci vaddudm 30, 30, 31 # IV + counter 143462306a36Sopenharmony_ci vxor 15, 30, 19 # add round key 143562306a36Sopenharmony_ci 143662306a36Sopenharmony_ci bdnz Next_rem_block_dec 143762306a36Sopenharmony_ci 143862306a36Sopenharmony_ci li 15, 0 143962306a36Sopenharmony_ci std 15, 56(7) # clear partial? 144062306a36Sopenharmony_ci stxvb16x 30+32, 0, 7 # update IV 144162306a36Sopenharmony_ci cmpdi 12, 0 144262306a36Sopenharmony_ci beq aes_gcm_out 144362306a36Sopenharmony_ci 144462306a36Sopenharmony_ciFinal_block_dec: 144562306a36Sopenharmony_ci lwz 10, 240(6) 144662306a36Sopenharmony_ci Loop_aes_middle_1x 144762306a36Sopenharmony_ci 144862306a36Sopenharmony_ci xxlor 23+32, 10, 10 144962306a36Sopenharmony_ci 145062306a36Sopenharmony_ci cmpdi 10, 10 145162306a36Sopenharmony_ci beq Do_final_1x_dec 145262306a36Sopenharmony_ci 145362306a36Sopenharmony_ci # 192 bits 145462306a36Sopenharmony_ci xxlor 24+32, 11, 11 145562306a36Sopenharmony_ci 145662306a36Sopenharmony_ci vcipher 15, 15, 23 145762306a36Sopenharmony_ci vcipher 15, 15, 24 145862306a36Sopenharmony_ci 145962306a36Sopenharmony_ci xxlor 23+32, 12, 12 146062306a36Sopenharmony_ci 146162306a36Sopenharmony_ci cmpdi 10, 12 146262306a36Sopenharmony_ci beq Do_final_1x_dec 146362306a36Sopenharmony_ci 146462306a36Sopenharmony_ci # 256 bits 146562306a36Sopenharmony_ci xxlor 24+32, 13, 13 146662306a36Sopenharmony_ci 146762306a36Sopenharmony_ci vcipher 15, 15, 23 146862306a36Sopenharmony_ci vcipher 15, 15, 24 146962306a36Sopenharmony_ci 147062306a36Sopenharmony_ci xxlor 23+32, 14, 14 147162306a36Sopenharmony_ci 147262306a36Sopenharmony_ci cmpdi 10, 14 147362306a36Sopenharmony_ci beq Do_final_1x_dec 147462306a36Sopenharmony_ci 147562306a36Sopenharmony_ciDo_final_1x_dec: 147662306a36Sopenharmony_ci vcipherlast 15, 15, 23 147762306a36Sopenharmony_ci 147862306a36Sopenharmony_ci # check partial block 147962306a36Sopenharmony_ci li 21, 1 # decrypt 148062306a36Sopenharmony_ci ld 15, 56(7) # partial? 148162306a36Sopenharmony_ci cmpdi 15, 0 148262306a36Sopenharmony_ci beq Normal_block_dec 148362306a36Sopenharmony_ci bl Do_partial_block 148462306a36Sopenharmony_ci cmpdi 12, 0 148562306a36Sopenharmony_ci ble aes_gcm_out 148662306a36Sopenharmony_ci 148762306a36Sopenharmony_ci b Continue_partial_check_dec 148862306a36Sopenharmony_ci 148962306a36Sopenharmony_ciNormal_block_dec: 149062306a36Sopenharmony_ci lxvb16x 15, 0, 14 # load last block 149162306a36Sopenharmony_ci xxlxor 47, 47, 15 149262306a36Sopenharmony_ci 149362306a36Sopenharmony_ci # create partial block mask 149462306a36Sopenharmony_ci li 15, 16 149562306a36Sopenharmony_ci sub 15, 15, 12 # index to the mask 149662306a36Sopenharmony_ci 149762306a36Sopenharmony_ci vspltisb 16, -1 # first 16 bytes - 0xffff...ff 149862306a36Sopenharmony_ci vspltisb 17, 0 # second 16 bytes - 0x0000...00 149962306a36Sopenharmony_ci li 10, 192 150062306a36Sopenharmony_ci stvx 16, 10, 1 150162306a36Sopenharmony_ci addi 10, 10, 16 150262306a36Sopenharmony_ci stvx 17, 10, 1 150362306a36Sopenharmony_ci 150462306a36Sopenharmony_ci addi 10, 1, 192 150562306a36Sopenharmony_ci lxvb16x 16, 15, 10 # load partial block mask 150662306a36Sopenharmony_ci xxland 47, 47, 16 150762306a36Sopenharmony_ci 150862306a36Sopenharmony_ci xxland 32+28, 15, 16 150962306a36Sopenharmony_ci #vmr 28, 15 151062306a36Sopenharmony_ci ppc_update_hash_1x 151162306a36Sopenharmony_ci 151262306a36Sopenharmony_ci # * should store only the remaining bytes. 151362306a36Sopenharmony_ci bl Write_partial_block 151462306a36Sopenharmony_ci 151562306a36Sopenharmony_ci stxvb16x 30+32, 0, 7 # update IV 151662306a36Sopenharmony_ci std 12, 56(7) # update partial? 151762306a36Sopenharmony_ci li 16, 16 151862306a36Sopenharmony_ci 151962306a36Sopenharmony_ci stxvb16x 32, 0, 8 # write out Xi 152062306a36Sopenharmony_ci stxvb16x 32, 16, 8 # write out Xi 152162306a36Sopenharmony_ci b aes_gcm_out 1522