1*2874c5fdSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-or-later */ 2f2e2ad2eSMarkus Stockhausen/* 3f2e2ad2eSMarkus Stockhausen * AES modes (ECB/CBC/CTR/XTS) for PPC AES implementation 4f2e2ad2eSMarkus Stockhausen * 5f2e2ad2eSMarkus Stockhausen * Copyright (c) 2015 Markus Stockhausen <stockhausen@collogia.de> 6f2e2ad2eSMarkus Stockhausen */ 7f2e2ad2eSMarkus Stockhausen 8f2e2ad2eSMarkus Stockhausen#include <asm/ppc_asm.h> 9f2e2ad2eSMarkus Stockhausen#include "aes-spe-regs.h" 10f2e2ad2eSMarkus Stockhausen 11f2e2ad2eSMarkus Stockhausen#ifdef __BIG_ENDIAN__ /* Macros for big endian builds */ 12f2e2ad2eSMarkus Stockhausen 13f2e2ad2eSMarkus Stockhausen#define LOAD_DATA(reg, off) \ 14f2e2ad2eSMarkus Stockhausen lwz reg,off(rSP); /* load with offset */ 15f2e2ad2eSMarkus Stockhausen#define SAVE_DATA(reg, off) \ 16f2e2ad2eSMarkus Stockhausen stw reg,off(rDP); /* save with offset */ 17f2e2ad2eSMarkus Stockhausen#define NEXT_BLOCK \ 18f2e2ad2eSMarkus Stockhausen addi rSP,rSP,16; /* increment pointers per bloc */ \ 19f2e2ad2eSMarkus Stockhausen addi rDP,rDP,16; 20f2e2ad2eSMarkus Stockhausen#define LOAD_IV(reg, off) \ 21f2e2ad2eSMarkus Stockhausen lwz reg,off(rIP); /* IV loading with offset */ 22f2e2ad2eSMarkus Stockhausen#define SAVE_IV(reg, off) \ 23f2e2ad2eSMarkus Stockhausen stw reg,off(rIP); /* IV saving with offset */ 24f2e2ad2eSMarkus Stockhausen#define START_IV /* nothing to reset */ 25f2e2ad2eSMarkus Stockhausen#define CBC_DEC 16 /* CBC decrement per block */ 26f2e2ad2eSMarkus Stockhausen#define CTR_DEC 1 /* CTR decrement one byte */ 27f2e2ad2eSMarkus Stockhausen 28f2e2ad2eSMarkus Stockhausen#else /* Macros for little endian */ 29f2e2ad2eSMarkus Stockhausen 30f2e2ad2eSMarkus Stockhausen#define LOAD_DATA(reg, off) \ 31f2e2ad2eSMarkus Stockhausen lwbrx reg,0,rSP; /* load reversed */ \ 32f2e2ad2eSMarkus Stockhausen addi rSP,rSP,4; /* and increment pointer */ 33f2e2ad2eSMarkus Stockhausen#define SAVE_DATA(reg, off) \ 34f2e2ad2eSMarkus Stockhausen stwbrx reg,0,rDP; /* save reversed */ \ 35f2e2ad2eSMarkus Stockhausen addi rDP,rDP,4; /* and increment pointer */ 36f2e2ad2eSMarkus Stockhausen#define NEXT_BLOCK /* nothing todo */ 37f2e2ad2eSMarkus Stockhausen#define LOAD_IV(reg, off) \ 38f2e2ad2eSMarkus Stockhausen lwbrx reg,0,rIP; /* load reversed */ \ 39f2e2ad2eSMarkus Stockhausen addi rIP,rIP,4; /* and increment pointer */ 40f2e2ad2eSMarkus Stockhausen#define SAVE_IV(reg, off) \ 41f2e2ad2eSMarkus Stockhausen stwbrx reg,0,rIP; /* load reversed */ \ 42f2e2ad2eSMarkus Stockhausen addi rIP,rIP,4; /* and increment pointer */ 43f2e2ad2eSMarkus Stockhausen#define START_IV \ 44f2e2ad2eSMarkus Stockhausen subi rIP,rIP,16; /* must reset pointer */ 45f2e2ad2eSMarkus Stockhausen#define CBC_DEC 32 /* 2 blocks because of incs */ 46f2e2ad2eSMarkus Stockhausen#define CTR_DEC 17 /* 1 block because of incs */ 47f2e2ad2eSMarkus Stockhausen 48f2e2ad2eSMarkus Stockhausen#endif 49f2e2ad2eSMarkus Stockhausen 50f2e2ad2eSMarkus Stockhausen#define SAVE_0_REGS 51f2e2ad2eSMarkus Stockhausen#define LOAD_0_REGS 52f2e2ad2eSMarkus Stockhausen 53f2e2ad2eSMarkus Stockhausen#define SAVE_4_REGS \ 54f2e2ad2eSMarkus Stockhausen stw rI0,96(r1); /* save 32 bit registers */ \ 55f2e2ad2eSMarkus Stockhausen stw rI1,100(r1); \ 56f2e2ad2eSMarkus Stockhausen stw rI2,104(r1); \ 57f2e2ad2eSMarkus Stockhausen stw rI3,108(r1); 58f2e2ad2eSMarkus Stockhausen 59f2e2ad2eSMarkus Stockhausen#define LOAD_4_REGS \ 60f2e2ad2eSMarkus Stockhausen lwz rI0,96(r1); /* restore 32 bit registers */ \ 61f2e2ad2eSMarkus Stockhausen lwz rI1,100(r1); \ 62f2e2ad2eSMarkus Stockhausen lwz rI2,104(r1); \ 63f2e2ad2eSMarkus Stockhausen lwz rI3,108(r1); 64f2e2ad2eSMarkus Stockhausen 65f2e2ad2eSMarkus Stockhausen#define SAVE_8_REGS \ 66f2e2ad2eSMarkus Stockhausen SAVE_4_REGS \ 67f2e2ad2eSMarkus Stockhausen stw rG0,112(r1); /* save 32 bit registers */ \ 68f2e2ad2eSMarkus Stockhausen stw rG1,116(r1); \ 69f2e2ad2eSMarkus Stockhausen stw rG2,120(r1); \ 70f2e2ad2eSMarkus Stockhausen stw rG3,124(r1); 71f2e2ad2eSMarkus Stockhausen 72f2e2ad2eSMarkus Stockhausen#define LOAD_8_REGS \ 73f2e2ad2eSMarkus Stockhausen LOAD_4_REGS \ 74f2e2ad2eSMarkus Stockhausen lwz rG0,112(r1); /* restore 32 bit registers */ \ 75f2e2ad2eSMarkus Stockhausen lwz rG1,116(r1); \ 76f2e2ad2eSMarkus Stockhausen lwz rG2,120(r1); \ 77f2e2ad2eSMarkus Stockhausen lwz rG3,124(r1); 78f2e2ad2eSMarkus Stockhausen 79f2e2ad2eSMarkus Stockhausen#define INITIALIZE_CRYPT(tab,nr32bitregs) \ 80f2e2ad2eSMarkus Stockhausen mflr r0; \ 81f2e2ad2eSMarkus Stockhausen stwu r1,-160(r1); /* create stack frame */ \ 82f2e2ad2eSMarkus Stockhausen lis rT0,tab@h; /* en-/decryption table pointer */ \ 83f2e2ad2eSMarkus Stockhausen stw r0,8(r1); /* save link register */ \ 84f2e2ad2eSMarkus Stockhausen ori rT0,rT0,tab@l; \ 85f2e2ad2eSMarkus Stockhausen evstdw r14,16(r1); \ 86f2e2ad2eSMarkus Stockhausen mr rKS,rKP; \ 87f2e2ad2eSMarkus Stockhausen evstdw r15,24(r1); /* We must save non volatile */ \ 88f2e2ad2eSMarkus Stockhausen evstdw r16,32(r1); /* registers. Take the chance */ \ 89f2e2ad2eSMarkus Stockhausen evstdw r17,40(r1); /* and save the SPE part too */ \ 90f2e2ad2eSMarkus Stockhausen evstdw r18,48(r1); \ 91f2e2ad2eSMarkus Stockhausen evstdw r19,56(r1); \ 92f2e2ad2eSMarkus Stockhausen evstdw r20,64(r1); \ 93f2e2ad2eSMarkus Stockhausen evstdw r21,72(r1); \ 94f2e2ad2eSMarkus Stockhausen evstdw r22,80(r1); \ 95f2e2ad2eSMarkus Stockhausen evstdw r23,88(r1); \ 96f2e2ad2eSMarkus Stockhausen SAVE_##nr32bitregs##_REGS 97f2e2ad2eSMarkus Stockhausen 98f2e2ad2eSMarkus Stockhausen#define FINALIZE_CRYPT(nr32bitregs) \ 99f2e2ad2eSMarkus Stockhausen lwz r0,8(r1); \ 100f2e2ad2eSMarkus Stockhausen evldw r14,16(r1); /* restore SPE registers */ \ 101f2e2ad2eSMarkus Stockhausen evldw r15,24(r1); \ 102f2e2ad2eSMarkus Stockhausen evldw r16,32(r1); \ 103f2e2ad2eSMarkus Stockhausen evldw r17,40(r1); \ 104f2e2ad2eSMarkus Stockhausen evldw r18,48(r1); \ 105f2e2ad2eSMarkus Stockhausen evldw r19,56(r1); \ 106f2e2ad2eSMarkus Stockhausen evldw r20,64(r1); \ 107f2e2ad2eSMarkus Stockhausen evldw r21,72(r1); \ 108f2e2ad2eSMarkus Stockhausen evldw r22,80(r1); \ 109f2e2ad2eSMarkus Stockhausen evldw r23,88(r1); \ 110f2e2ad2eSMarkus Stockhausen LOAD_##nr32bitregs##_REGS \ 111f2e2ad2eSMarkus Stockhausen mtlr r0; /* restore link register */ \ 112f2e2ad2eSMarkus Stockhausen xor r0,r0,r0; \ 113f2e2ad2eSMarkus Stockhausen stw r0,16(r1); /* delete sensitive data */ \ 114f2e2ad2eSMarkus Stockhausen stw r0,24(r1); /* that we might have pushed */ \ 115f2e2ad2eSMarkus Stockhausen stw r0,32(r1); /* from other context that runs */ \ 116f2e2ad2eSMarkus Stockhausen stw r0,40(r1); /* the same code */ \ 117f2e2ad2eSMarkus Stockhausen stw r0,48(r1); \ 118f2e2ad2eSMarkus Stockhausen stw r0,56(r1); \ 119f2e2ad2eSMarkus Stockhausen stw r0,64(r1); \ 120f2e2ad2eSMarkus Stockhausen stw r0,72(r1); \ 121f2e2ad2eSMarkus Stockhausen stw r0,80(r1); \ 122f2e2ad2eSMarkus Stockhausen stw r0,88(r1); \ 123f2e2ad2eSMarkus Stockhausen addi r1,r1,160; /* cleanup stack frame */ 124f2e2ad2eSMarkus Stockhausen 125f2e2ad2eSMarkus Stockhausen#define ENDIAN_SWAP(t0, t1, s0, s1) \ 126f2e2ad2eSMarkus Stockhausen rotrwi t0,s0,8; /* swap endianness for 2 GPRs */ \ 127f2e2ad2eSMarkus Stockhausen rotrwi t1,s1,8; \ 128f2e2ad2eSMarkus Stockhausen rlwimi t0,s0,8,8,15; \ 129f2e2ad2eSMarkus Stockhausen rlwimi t1,s1,8,8,15; \ 130f2e2ad2eSMarkus Stockhausen rlwimi t0,s0,8,24,31; \ 131f2e2ad2eSMarkus Stockhausen rlwimi t1,s1,8,24,31; 132f2e2ad2eSMarkus Stockhausen 133f2e2ad2eSMarkus Stockhausen#define GF128_MUL(d0, d1, d2, d3, t0) \ 134f2e2ad2eSMarkus Stockhausen li t0,0x87; /* multiplication in GF128 */ \ 135f2e2ad2eSMarkus Stockhausen cmpwi d3,-1; \ 136f2e2ad2eSMarkus Stockhausen iselgt t0,0,t0; \ 137f2e2ad2eSMarkus Stockhausen rlwimi d3,d2,0,0,0; /* propagate "carry" bits */ \ 138f2e2ad2eSMarkus Stockhausen rotlwi d3,d3,1; \ 139f2e2ad2eSMarkus Stockhausen rlwimi d2,d1,0,0,0; \ 140f2e2ad2eSMarkus Stockhausen rotlwi d2,d2,1; \ 141f2e2ad2eSMarkus Stockhausen rlwimi d1,d0,0,0,0; \ 142f2e2ad2eSMarkus Stockhausen slwi d0,d0,1; /* shift left 128 bit */ \ 143f2e2ad2eSMarkus Stockhausen rotlwi d1,d1,1; \ 144f2e2ad2eSMarkus Stockhausen xor d0,d0,t0; 145f2e2ad2eSMarkus Stockhausen 146f2e2ad2eSMarkus Stockhausen#define START_KEY(d0, d1, d2, d3) \ 147f2e2ad2eSMarkus Stockhausen lwz rW0,0(rKP); \ 148f2e2ad2eSMarkus Stockhausen mtctr rRR; \ 149f2e2ad2eSMarkus Stockhausen lwz rW1,4(rKP); \ 150f2e2ad2eSMarkus Stockhausen lwz rW2,8(rKP); \ 151f2e2ad2eSMarkus Stockhausen lwz rW3,12(rKP); \ 152f2e2ad2eSMarkus Stockhausen xor rD0,d0,rW0; \ 153f2e2ad2eSMarkus Stockhausen xor rD1,d1,rW1; \ 154f2e2ad2eSMarkus Stockhausen xor rD2,d2,rW2; \ 155f2e2ad2eSMarkus Stockhausen xor rD3,d3,rW3; 156f2e2ad2eSMarkus Stockhausen 157f2e2ad2eSMarkus Stockhausen/* 158f2e2ad2eSMarkus Stockhausen * ppc_encrypt_aes(u8 *out, const u8 *in, u32 *key_enc, 159f2e2ad2eSMarkus Stockhausen * u32 rounds) 160f2e2ad2eSMarkus Stockhausen * 161f2e2ad2eSMarkus Stockhausen * called from glue layer to encrypt a single 16 byte block 162f2e2ad2eSMarkus Stockhausen * round values are AES128 = 4, AES192 = 5, AES256 = 6 163f2e2ad2eSMarkus Stockhausen * 164f2e2ad2eSMarkus Stockhausen */ 165f2e2ad2eSMarkus Stockhausen_GLOBAL(ppc_encrypt_aes) 166f2e2ad2eSMarkus Stockhausen INITIALIZE_CRYPT(PPC_AES_4K_ENCTAB, 0) 167f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD0, 0) 168f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD1, 4) 169f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD2, 8) 170f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD3, 12) 171f2e2ad2eSMarkus Stockhausen START_KEY(rD0, rD1, rD2, rD3) 172f2e2ad2eSMarkus Stockhausen bl ppc_encrypt_block 173f2e2ad2eSMarkus Stockhausen xor rD0,rD0,rW0 174f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD0, 0) 175f2e2ad2eSMarkus Stockhausen xor rD1,rD1,rW1 176f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD1, 4) 177f2e2ad2eSMarkus Stockhausen xor rD2,rD2,rW2 178f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD2, 8) 179f2e2ad2eSMarkus Stockhausen xor rD3,rD3,rW3 180f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD3, 12) 181f2e2ad2eSMarkus Stockhausen FINALIZE_CRYPT(0) 182f2e2ad2eSMarkus Stockhausen blr 183f2e2ad2eSMarkus Stockhausen 184f2e2ad2eSMarkus Stockhausen/* 185f2e2ad2eSMarkus Stockhausen * ppc_decrypt_aes(u8 *out, const u8 *in, u32 *key_dec, 186f2e2ad2eSMarkus Stockhausen * u32 rounds) 187f2e2ad2eSMarkus Stockhausen * 188f2e2ad2eSMarkus Stockhausen * called from glue layer to decrypt a single 16 byte block 189f2e2ad2eSMarkus Stockhausen * round values are AES128 = 4, AES192 = 5, AES256 = 6 190f2e2ad2eSMarkus Stockhausen * 191f2e2ad2eSMarkus Stockhausen */ 192f2e2ad2eSMarkus Stockhausen_GLOBAL(ppc_decrypt_aes) 193f2e2ad2eSMarkus Stockhausen INITIALIZE_CRYPT(PPC_AES_4K_DECTAB,0) 194f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD0, 0) 195f2e2ad2eSMarkus Stockhausen addi rT1,rT0,4096 196f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD1, 4) 197f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD2, 8) 198f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD3, 12) 199f2e2ad2eSMarkus Stockhausen START_KEY(rD0, rD1, rD2, rD3) 200f2e2ad2eSMarkus Stockhausen bl ppc_decrypt_block 201f2e2ad2eSMarkus Stockhausen xor rD0,rD0,rW0 202f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD0, 0) 203f2e2ad2eSMarkus Stockhausen xor rD1,rD1,rW1 204f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD1, 4) 205f2e2ad2eSMarkus Stockhausen xor rD2,rD2,rW2 206f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD2, 8) 207f2e2ad2eSMarkus Stockhausen xor rD3,rD3,rW3 208f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD3, 12) 209f2e2ad2eSMarkus Stockhausen FINALIZE_CRYPT(0) 210f2e2ad2eSMarkus Stockhausen blr 211f2e2ad2eSMarkus Stockhausen 212f2e2ad2eSMarkus Stockhausen/* 213f2e2ad2eSMarkus Stockhausen * ppc_encrypt_ecb(u8 *out, const u8 *in, u32 *key_enc, 214f2e2ad2eSMarkus Stockhausen * u32 rounds, u32 bytes); 215f2e2ad2eSMarkus Stockhausen * 216f2e2ad2eSMarkus Stockhausen * called from glue layer to encrypt multiple blocks via ECB 217f2e2ad2eSMarkus Stockhausen * Bytes must be larger or equal 16 and only whole blocks are 218f2e2ad2eSMarkus Stockhausen * processed. round values are AES128 = 4, AES192 = 5 and 219f2e2ad2eSMarkus Stockhausen * AES256 = 6 220f2e2ad2eSMarkus Stockhausen * 221f2e2ad2eSMarkus Stockhausen */ 222f2e2ad2eSMarkus Stockhausen_GLOBAL(ppc_encrypt_ecb) 223f2e2ad2eSMarkus Stockhausen INITIALIZE_CRYPT(PPC_AES_4K_ENCTAB, 0) 224f2e2ad2eSMarkus Stockhausenppc_encrypt_ecb_loop: 225f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD0, 0) 226f2e2ad2eSMarkus Stockhausen mr rKP,rKS 227f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD1, 4) 228f2e2ad2eSMarkus Stockhausen subi rLN,rLN,16 229f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD2, 8) 230f2e2ad2eSMarkus Stockhausen cmpwi rLN,15 231f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD3, 12) 232f2e2ad2eSMarkus Stockhausen START_KEY(rD0, rD1, rD2, rD3) 233f2e2ad2eSMarkus Stockhausen bl ppc_encrypt_block 234f2e2ad2eSMarkus Stockhausen xor rD0,rD0,rW0 235f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD0, 0) 236f2e2ad2eSMarkus Stockhausen xor rD1,rD1,rW1 237f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD1, 4) 238f2e2ad2eSMarkus Stockhausen xor rD2,rD2,rW2 239f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD2, 8) 240f2e2ad2eSMarkus Stockhausen xor rD3,rD3,rW3 241f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD3, 12) 242f2e2ad2eSMarkus Stockhausen NEXT_BLOCK 243f2e2ad2eSMarkus Stockhausen bt gt,ppc_encrypt_ecb_loop 244f2e2ad2eSMarkus Stockhausen FINALIZE_CRYPT(0) 245f2e2ad2eSMarkus Stockhausen blr 246f2e2ad2eSMarkus Stockhausen 247f2e2ad2eSMarkus Stockhausen/* 248f2e2ad2eSMarkus Stockhausen * ppc_decrypt_ecb(u8 *out, const u8 *in, u32 *key_dec, 249f2e2ad2eSMarkus Stockhausen * u32 rounds, u32 bytes); 250f2e2ad2eSMarkus Stockhausen * 251f2e2ad2eSMarkus Stockhausen * called from glue layer to decrypt multiple blocks via ECB 252f2e2ad2eSMarkus Stockhausen * Bytes must be larger or equal 16 and only whole blocks are 253f2e2ad2eSMarkus Stockhausen * processed. round values are AES128 = 4, AES192 = 5 and 254f2e2ad2eSMarkus Stockhausen * AES256 = 6 255f2e2ad2eSMarkus Stockhausen * 256f2e2ad2eSMarkus Stockhausen */ 257f2e2ad2eSMarkus Stockhausen_GLOBAL(ppc_decrypt_ecb) 258f2e2ad2eSMarkus Stockhausen INITIALIZE_CRYPT(PPC_AES_4K_DECTAB, 0) 259f2e2ad2eSMarkus Stockhausen addi rT1,rT0,4096 260f2e2ad2eSMarkus Stockhausenppc_decrypt_ecb_loop: 261f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD0, 0) 262f2e2ad2eSMarkus Stockhausen mr rKP,rKS 263f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD1, 4) 264f2e2ad2eSMarkus Stockhausen subi rLN,rLN,16 265f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD2, 8) 266f2e2ad2eSMarkus Stockhausen cmpwi rLN,15 267f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD3, 12) 268f2e2ad2eSMarkus Stockhausen START_KEY(rD0, rD1, rD2, rD3) 269f2e2ad2eSMarkus Stockhausen bl ppc_decrypt_block 270f2e2ad2eSMarkus Stockhausen xor rD0,rD0,rW0 271f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD0, 0) 272f2e2ad2eSMarkus Stockhausen xor rD1,rD1,rW1 273f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD1, 4) 274f2e2ad2eSMarkus Stockhausen xor rD2,rD2,rW2 275f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD2, 8) 276f2e2ad2eSMarkus Stockhausen xor rD3,rD3,rW3 277f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD3, 12) 278f2e2ad2eSMarkus Stockhausen NEXT_BLOCK 279f2e2ad2eSMarkus Stockhausen bt gt,ppc_decrypt_ecb_loop 280f2e2ad2eSMarkus Stockhausen FINALIZE_CRYPT(0) 281f2e2ad2eSMarkus Stockhausen blr 282f2e2ad2eSMarkus Stockhausen 283f2e2ad2eSMarkus Stockhausen/* 284f2e2ad2eSMarkus Stockhausen * ppc_encrypt_cbc(u8 *out, const u8 *in, u32 *key_enc, 285f2e2ad2eSMarkus Stockhausen * 32 rounds, u32 bytes, u8 *iv); 286f2e2ad2eSMarkus Stockhausen * 287f2e2ad2eSMarkus Stockhausen * called from glue layer to encrypt multiple blocks via CBC 288f2e2ad2eSMarkus Stockhausen * Bytes must be larger or equal 16 and only whole blocks are 289f2e2ad2eSMarkus Stockhausen * processed. round values are AES128 = 4, AES192 = 5 and 290f2e2ad2eSMarkus Stockhausen * AES256 = 6 291f2e2ad2eSMarkus Stockhausen * 292f2e2ad2eSMarkus Stockhausen */ 293f2e2ad2eSMarkus Stockhausen_GLOBAL(ppc_encrypt_cbc) 294f2e2ad2eSMarkus Stockhausen INITIALIZE_CRYPT(PPC_AES_4K_ENCTAB, 4) 295f2e2ad2eSMarkus Stockhausen LOAD_IV(rI0, 0) 296f2e2ad2eSMarkus Stockhausen LOAD_IV(rI1, 4) 297f2e2ad2eSMarkus Stockhausen LOAD_IV(rI2, 8) 298f2e2ad2eSMarkus Stockhausen LOAD_IV(rI3, 12) 299f2e2ad2eSMarkus Stockhausenppc_encrypt_cbc_loop: 300f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD0, 0) 301f2e2ad2eSMarkus Stockhausen mr rKP,rKS 302f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD1, 4) 303f2e2ad2eSMarkus Stockhausen subi rLN,rLN,16 304f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD2, 8) 305f2e2ad2eSMarkus Stockhausen cmpwi rLN,15 306f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD3, 12) 307f2e2ad2eSMarkus Stockhausen xor rD0,rD0,rI0 308f2e2ad2eSMarkus Stockhausen xor rD1,rD1,rI1 309f2e2ad2eSMarkus Stockhausen xor rD2,rD2,rI2 310f2e2ad2eSMarkus Stockhausen xor rD3,rD3,rI3 311f2e2ad2eSMarkus Stockhausen START_KEY(rD0, rD1, rD2, rD3) 312f2e2ad2eSMarkus Stockhausen bl ppc_encrypt_block 313f2e2ad2eSMarkus Stockhausen xor rI0,rD0,rW0 314f2e2ad2eSMarkus Stockhausen SAVE_DATA(rI0, 0) 315f2e2ad2eSMarkus Stockhausen xor rI1,rD1,rW1 316f2e2ad2eSMarkus Stockhausen SAVE_DATA(rI1, 4) 317f2e2ad2eSMarkus Stockhausen xor rI2,rD2,rW2 318f2e2ad2eSMarkus Stockhausen SAVE_DATA(rI2, 8) 319f2e2ad2eSMarkus Stockhausen xor rI3,rD3,rW3 320f2e2ad2eSMarkus Stockhausen SAVE_DATA(rI3, 12) 321f2e2ad2eSMarkus Stockhausen NEXT_BLOCK 322f2e2ad2eSMarkus Stockhausen bt gt,ppc_encrypt_cbc_loop 323f2e2ad2eSMarkus Stockhausen START_IV 324f2e2ad2eSMarkus Stockhausen SAVE_IV(rI0, 0) 325f2e2ad2eSMarkus Stockhausen SAVE_IV(rI1, 4) 326f2e2ad2eSMarkus Stockhausen SAVE_IV(rI2, 8) 327f2e2ad2eSMarkus Stockhausen SAVE_IV(rI3, 12) 328f2e2ad2eSMarkus Stockhausen FINALIZE_CRYPT(4) 329f2e2ad2eSMarkus Stockhausen blr 330f2e2ad2eSMarkus Stockhausen 331f2e2ad2eSMarkus Stockhausen/* 332f2e2ad2eSMarkus Stockhausen * ppc_decrypt_cbc(u8 *out, const u8 *in, u32 *key_dec, 333f2e2ad2eSMarkus Stockhausen * u32 rounds, u32 bytes, u8 *iv); 334f2e2ad2eSMarkus Stockhausen * 335f2e2ad2eSMarkus Stockhausen * called from glue layer to decrypt multiple blocks via CBC 336f2e2ad2eSMarkus Stockhausen * round values are AES128 = 4, AES192 = 5, AES256 = 6 337f2e2ad2eSMarkus Stockhausen * 338f2e2ad2eSMarkus Stockhausen */ 339f2e2ad2eSMarkus Stockhausen_GLOBAL(ppc_decrypt_cbc) 340f2e2ad2eSMarkus Stockhausen INITIALIZE_CRYPT(PPC_AES_4K_DECTAB, 4) 341f2e2ad2eSMarkus Stockhausen li rT1,15 342f2e2ad2eSMarkus Stockhausen LOAD_IV(rI0, 0) 343f2e2ad2eSMarkus Stockhausen andc rLN,rLN,rT1 344f2e2ad2eSMarkus Stockhausen LOAD_IV(rI1, 4) 345f2e2ad2eSMarkus Stockhausen subi rLN,rLN,16 346f2e2ad2eSMarkus Stockhausen LOAD_IV(rI2, 8) 347f2e2ad2eSMarkus Stockhausen add rSP,rSP,rLN /* reverse processing */ 348f2e2ad2eSMarkus Stockhausen LOAD_IV(rI3, 12) 349f2e2ad2eSMarkus Stockhausen add rDP,rDP,rLN 350f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD0, 0) 351f2e2ad2eSMarkus Stockhausen addi rT1,rT0,4096 352f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD1, 4) 353f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD2, 8) 354f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD3, 12) 355f2e2ad2eSMarkus Stockhausen START_IV 356f2e2ad2eSMarkus Stockhausen SAVE_IV(rD0, 0) 357f2e2ad2eSMarkus Stockhausen SAVE_IV(rD1, 4) 358f2e2ad2eSMarkus Stockhausen SAVE_IV(rD2, 8) 359f2e2ad2eSMarkus Stockhausen cmpwi rLN,16 360f2e2ad2eSMarkus Stockhausen SAVE_IV(rD3, 12) 361f2e2ad2eSMarkus Stockhausen bt lt,ppc_decrypt_cbc_end 362f2e2ad2eSMarkus Stockhausenppc_decrypt_cbc_loop: 363f2e2ad2eSMarkus Stockhausen mr rKP,rKS 364f2e2ad2eSMarkus Stockhausen START_KEY(rD0, rD1, rD2, rD3) 365f2e2ad2eSMarkus Stockhausen bl ppc_decrypt_block 366f2e2ad2eSMarkus Stockhausen subi rLN,rLN,16 367f2e2ad2eSMarkus Stockhausen subi rSP,rSP,CBC_DEC 368f2e2ad2eSMarkus Stockhausen xor rW0,rD0,rW0 369f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD0, 0) 370f2e2ad2eSMarkus Stockhausen xor rW1,rD1,rW1 371f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD1, 4) 372f2e2ad2eSMarkus Stockhausen xor rW2,rD2,rW2 373f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD2, 8) 374f2e2ad2eSMarkus Stockhausen xor rW3,rD3,rW3 375f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD3, 12) 376f2e2ad2eSMarkus Stockhausen xor rW0,rW0,rD0 377f2e2ad2eSMarkus Stockhausen SAVE_DATA(rW0, 0) 378f2e2ad2eSMarkus Stockhausen xor rW1,rW1,rD1 379f2e2ad2eSMarkus Stockhausen SAVE_DATA(rW1, 4) 380f2e2ad2eSMarkus Stockhausen xor rW2,rW2,rD2 381f2e2ad2eSMarkus Stockhausen SAVE_DATA(rW2, 8) 382f2e2ad2eSMarkus Stockhausen xor rW3,rW3,rD3 383f2e2ad2eSMarkus Stockhausen SAVE_DATA(rW3, 12) 384f2e2ad2eSMarkus Stockhausen cmpwi rLN,15 385f2e2ad2eSMarkus Stockhausen subi rDP,rDP,CBC_DEC 386f2e2ad2eSMarkus Stockhausen bt gt,ppc_decrypt_cbc_loop 387f2e2ad2eSMarkus Stockhausenppc_decrypt_cbc_end: 388f2e2ad2eSMarkus Stockhausen mr rKP,rKS 389f2e2ad2eSMarkus Stockhausen START_KEY(rD0, rD1, rD2, rD3) 390f2e2ad2eSMarkus Stockhausen bl ppc_decrypt_block 391f2e2ad2eSMarkus Stockhausen xor rW0,rW0,rD0 392f2e2ad2eSMarkus Stockhausen xor rW1,rW1,rD1 393f2e2ad2eSMarkus Stockhausen xor rW2,rW2,rD2 394f2e2ad2eSMarkus Stockhausen xor rW3,rW3,rD3 395f2e2ad2eSMarkus Stockhausen xor rW0,rW0,rI0 /* decrypt with initial IV */ 396f2e2ad2eSMarkus Stockhausen SAVE_DATA(rW0, 0) 397f2e2ad2eSMarkus Stockhausen xor rW1,rW1,rI1 398f2e2ad2eSMarkus Stockhausen SAVE_DATA(rW1, 4) 399f2e2ad2eSMarkus Stockhausen xor rW2,rW2,rI2 400f2e2ad2eSMarkus Stockhausen SAVE_DATA(rW2, 8) 401f2e2ad2eSMarkus Stockhausen xor rW3,rW3,rI3 402f2e2ad2eSMarkus Stockhausen SAVE_DATA(rW3, 12) 403f2e2ad2eSMarkus Stockhausen FINALIZE_CRYPT(4) 404f2e2ad2eSMarkus Stockhausen blr 405f2e2ad2eSMarkus Stockhausen 406f2e2ad2eSMarkus Stockhausen/* 407f2e2ad2eSMarkus Stockhausen * ppc_crypt_ctr(u8 *out, const u8 *in, u32 *key_enc, 408f2e2ad2eSMarkus Stockhausen * u32 rounds, u32 bytes, u8 *iv); 409f2e2ad2eSMarkus Stockhausen * 410f2e2ad2eSMarkus Stockhausen * called from glue layer to encrypt/decrypt multiple blocks 411f2e2ad2eSMarkus Stockhausen * via CTR. Number of bytes does not need to be a multiple of 412f2e2ad2eSMarkus Stockhausen * 16. Round values are AES128 = 4, AES192 = 5, AES256 = 6 413f2e2ad2eSMarkus Stockhausen * 414f2e2ad2eSMarkus Stockhausen */ 415f2e2ad2eSMarkus Stockhausen_GLOBAL(ppc_crypt_ctr) 416f2e2ad2eSMarkus Stockhausen INITIALIZE_CRYPT(PPC_AES_4K_ENCTAB, 4) 417f2e2ad2eSMarkus Stockhausen LOAD_IV(rI0, 0) 418f2e2ad2eSMarkus Stockhausen LOAD_IV(rI1, 4) 419f2e2ad2eSMarkus Stockhausen LOAD_IV(rI2, 8) 420f2e2ad2eSMarkus Stockhausen cmpwi rLN,16 421f2e2ad2eSMarkus Stockhausen LOAD_IV(rI3, 12) 422f2e2ad2eSMarkus Stockhausen START_IV 423f2e2ad2eSMarkus Stockhausen bt lt,ppc_crypt_ctr_partial 424f2e2ad2eSMarkus Stockhausenppc_crypt_ctr_loop: 425f2e2ad2eSMarkus Stockhausen mr rKP,rKS 426f2e2ad2eSMarkus Stockhausen START_KEY(rI0, rI1, rI2, rI3) 427f2e2ad2eSMarkus Stockhausen bl ppc_encrypt_block 428f2e2ad2eSMarkus Stockhausen xor rW0,rD0,rW0 429f2e2ad2eSMarkus Stockhausen xor rW1,rD1,rW1 430f2e2ad2eSMarkus Stockhausen xor rW2,rD2,rW2 431f2e2ad2eSMarkus Stockhausen xor rW3,rD3,rW3 432f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD0, 0) 433f2e2ad2eSMarkus Stockhausen subi rLN,rLN,16 434f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD1, 4) 435f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD2, 8) 436f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD3, 12) 437f2e2ad2eSMarkus Stockhausen xor rD0,rD0,rW0 438f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD0, 0) 439f2e2ad2eSMarkus Stockhausen xor rD1,rD1,rW1 440f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD1, 4) 441f2e2ad2eSMarkus Stockhausen xor rD2,rD2,rW2 442f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD2, 8) 443f2e2ad2eSMarkus Stockhausen xor rD3,rD3,rW3 444f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD3, 12) 445f2e2ad2eSMarkus Stockhausen addic rI3,rI3,1 /* increase counter */ 446f2e2ad2eSMarkus Stockhausen addze rI2,rI2 447f2e2ad2eSMarkus Stockhausen addze rI1,rI1 448f2e2ad2eSMarkus Stockhausen addze rI0,rI0 449f2e2ad2eSMarkus Stockhausen NEXT_BLOCK 450f2e2ad2eSMarkus Stockhausen cmpwi rLN,15 451f2e2ad2eSMarkus Stockhausen bt gt,ppc_crypt_ctr_loop 452f2e2ad2eSMarkus Stockhausenppc_crypt_ctr_partial: 453f2e2ad2eSMarkus Stockhausen cmpwi rLN,0 454f2e2ad2eSMarkus Stockhausen bt eq,ppc_crypt_ctr_end 455f2e2ad2eSMarkus Stockhausen mr rKP,rKS 456f2e2ad2eSMarkus Stockhausen START_KEY(rI0, rI1, rI2, rI3) 457f2e2ad2eSMarkus Stockhausen bl ppc_encrypt_block 458f2e2ad2eSMarkus Stockhausen xor rW0,rD0,rW0 459f2e2ad2eSMarkus Stockhausen SAVE_IV(rW0, 0) 460f2e2ad2eSMarkus Stockhausen xor rW1,rD1,rW1 461f2e2ad2eSMarkus Stockhausen SAVE_IV(rW1, 4) 462f2e2ad2eSMarkus Stockhausen xor rW2,rD2,rW2 463f2e2ad2eSMarkus Stockhausen SAVE_IV(rW2, 8) 464f2e2ad2eSMarkus Stockhausen xor rW3,rD3,rW3 465f2e2ad2eSMarkus Stockhausen SAVE_IV(rW3, 12) 466f2e2ad2eSMarkus Stockhausen mtctr rLN 467f2e2ad2eSMarkus Stockhausen subi rIP,rIP,CTR_DEC 468f2e2ad2eSMarkus Stockhausen subi rSP,rSP,1 469f2e2ad2eSMarkus Stockhausen subi rDP,rDP,1 470f2e2ad2eSMarkus Stockhausenppc_crypt_ctr_xorbyte: 471f2e2ad2eSMarkus Stockhausen lbzu rW4,1(rIP) /* bytewise xor for partial block */ 472f2e2ad2eSMarkus Stockhausen lbzu rW5,1(rSP) 473f2e2ad2eSMarkus Stockhausen xor rW4,rW4,rW5 474f2e2ad2eSMarkus Stockhausen stbu rW4,1(rDP) 475f2e2ad2eSMarkus Stockhausen bdnz ppc_crypt_ctr_xorbyte 476f2e2ad2eSMarkus Stockhausen subf rIP,rLN,rIP 477f2e2ad2eSMarkus Stockhausen addi rIP,rIP,1 478f2e2ad2eSMarkus Stockhausen addic rI3,rI3,1 479f2e2ad2eSMarkus Stockhausen addze rI2,rI2 480f2e2ad2eSMarkus Stockhausen addze rI1,rI1 481f2e2ad2eSMarkus Stockhausen addze rI0,rI0 482f2e2ad2eSMarkus Stockhausenppc_crypt_ctr_end: 483f2e2ad2eSMarkus Stockhausen SAVE_IV(rI0, 0) 484f2e2ad2eSMarkus Stockhausen SAVE_IV(rI1, 4) 485f2e2ad2eSMarkus Stockhausen SAVE_IV(rI2, 8) 486f2e2ad2eSMarkus Stockhausen SAVE_IV(rI3, 12) 487f2e2ad2eSMarkus Stockhausen FINALIZE_CRYPT(4) 488f2e2ad2eSMarkus Stockhausen blr 489f2e2ad2eSMarkus Stockhausen 490f2e2ad2eSMarkus Stockhausen/* 491f2e2ad2eSMarkus Stockhausen * ppc_encrypt_xts(u8 *out, const u8 *in, u32 *key_enc, 492f2e2ad2eSMarkus Stockhausen * u32 rounds, u32 bytes, u8 *iv, u32 *key_twk); 493f2e2ad2eSMarkus Stockhausen * 494f2e2ad2eSMarkus Stockhausen * called from glue layer to encrypt multiple blocks via XTS 495f2e2ad2eSMarkus Stockhausen * If key_twk is given, the initial IV encryption will be 496f2e2ad2eSMarkus Stockhausen * processed too. Round values are AES128 = 4, AES192 = 5, 497f2e2ad2eSMarkus Stockhausen * AES256 = 6 498f2e2ad2eSMarkus Stockhausen * 499f2e2ad2eSMarkus Stockhausen */ 500f2e2ad2eSMarkus Stockhausen_GLOBAL(ppc_encrypt_xts) 501f2e2ad2eSMarkus Stockhausen INITIALIZE_CRYPT(PPC_AES_4K_ENCTAB, 8) 502f2e2ad2eSMarkus Stockhausen LOAD_IV(rI0, 0) 503f2e2ad2eSMarkus Stockhausen LOAD_IV(rI1, 4) 504f2e2ad2eSMarkus Stockhausen LOAD_IV(rI2, 8) 505f2e2ad2eSMarkus Stockhausen cmpwi rKT,0 506f2e2ad2eSMarkus Stockhausen LOAD_IV(rI3, 12) 507f2e2ad2eSMarkus Stockhausen bt eq,ppc_encrypt_xts_notweak 508f2e2ad2eSMarkus Stockhausen mr rKP,rKT 509f2e2ad2eSMarkus Stockhausen START_KEY(rI0, rI1, rI2, rI3) 510f2e2ad2eSMarkus Stockhausen bl ppc_encrypt_block 511f2e2ad2eSMarkus Stockhausen xor rI0,rD0,rW0 512f2e2ad2eSMarkus Stockhausen xor rI1,rD1,rW1 513f2e2ad2eSMarkus Stockhausen xor rI2,rD2,rW2 514f2e2ad2eSMarkus Stockhausen xor rI3,rD3,rW3 515f2e2ad2eSMarkus Stockhausenppc_encrypt_xts_notweak: 516f2e2ad2eSMarkus Stockhausen ENDIAN_SWAP(rG0, rG1, rI0, rI1) 517f2e2ad2eSMarkus Stockhausen ENDIAN_SWAP(rG2, rG3, rI2, rI3) 518f2e2ad2eSMarkus Stockhausenppc_encrypt_xts_loop: 519f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD0, 0) 520f2e2ad2eSMarkus Stockhausen mr rKP,rKS 521f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD1, 4) 522f2e2ad2eSMarkus Stockhausen subi rLN,rLN,16 523f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD2, 8) 524f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD3, 12) 525f2e2ad2eSMarkus Stockhausen xor rD0,rD0,rI0 526f2e2ad2eSMarkus Stockhausen xor rD1,rD1,rI1 527f2e2ad2eSMarkus Stockhausen xor rD2,rD2,rI2 528f2e2ad2eSMarkus Stockhausen xor rD3,rD3,rI3 529f2e2ad2eSMarkus Stockhausen START_KEY(rD0, rD1, rD2, rD3) 530f2e2ad2eSMarkus Stockhausen bl ppc_encrypt_block 531f2e2ad2eSMarkus Stockhausen xor rD0,rD0,rW0 532f2e2ad2eSMarkus Stockhausen xor rD1,rD1,rW1 533f2e2ad2eSMarkus Stockhausen xor rD2,rD2,rW2 534f2e2ad2eSMarkus Stockhausen xor rD3,rD3,rW3 535f2e2ad2eSMarkus Stockhausen xor rD0,rD0,rI0 536f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD0, 0) 537f2e2ad2eSMarkus Stockhausen xor rD1,rD1,rI1 538f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD1, 4) 539f2e2ad2eSMarkus Stockhausen xor rD2,rD2,rI2 540f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD2, 8) 541f2e2ad2eSMarkus Stockhausen xor rD3,rD3,rI3 542f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD3, 12) 543f2e2ad2eSMarkus Stockhausen GF128_MUL(rG0, rG1, rG2, rG3, rW0) 544f2e2ad2eSMarkus Stockhausen ENDIAN_SWAP(rI0, rI1, rG0, rG1) 545f2e2ad2eSMarkus Stockhausen ENDIAN_SWAP(rI2, rI3, rG2, rG3) 546f2e2ad2eSMarkus Stockhausen cmpwi rLN,0 547f2e2ad2eSMarkus Stockhausen NEXT_BLOCK 548f2e2ad2eSMarkus Stockhausen bt gt,ppc_encrypt_xts_loop 549f2e2ad2eSMarkus Stockhausen START_IV 550f2e2ad2eSMarkus Stockhausen SAVE_IV(rI0, 0) 551f2e2ad2eSMarkus Stockhausen SAVE_IV(rI1, 4) 552f2e2ad2eSMarkus Stockhausen SAVE_IV(rI2, 8) 553f2e2ad2eSMarkus Stockhausen SAVE_IV(rI3, 12) 554f2e2ad2eSMarkus Stockhausen FINALIZE_CRYPT(8) 555f2e2ad2eSMarkus Stockhausen blr 556f2e2ad2eSMarkus Stockhausen 557f2e2ad2eSMarkus Stockhausen/* 558f2e2ad2eSMarkus Stockhausen * ppc_decrypt_xts(u8 *out, const u8 *in, u32 *key_dec, 559f2e2ad2eSMarkus Stockhausen * u32 rounds, u32 blocks, u8 *iv, u32 *key_twk); 560f2e2ad2eSMarkus Stockhausen * 561f2e2ad2eSMarkus Stockhausen * called from glue layer to decrypt multiple blocks via XTS 562f2e2ad2eSMarkus Stockhausen * If key_twk is given, the initial IV encryption will be 563f2e2ad2eSMarkus Stockhausen * processed too. Round values are AES128 = 4, AES192 = 5, 564f2e2ad2eSMarkus Stockhausen * AES256 = 6 565f2e2ad2eSMarkus Stockhausen * 566f2e2ad2eSMarkus Stockhausen */ 567f2e2ad2eSMarkus Stockhausen_GLOBAL(ppc_decrypt_xts) 568f2e2ad2eSMarkus Stockhausen INITIALIZE_CRYPT(PPC_AES_4K_DECTAB, 8) 569f2e2ad2eSMarkus Stockhausen LOAD_IV(rI0, 0) 570f2e2ad2eSMarkus Stockhausen addi rT1,rT0,4096 571f2e2ad2eSMarkus Stockhausen LOAD_IV(rI1, 4) 572f2e2ad2eSMarkus Stockhausen LOAD_IV(rI2, 8) 573f2e2ad2eSMarkus Stockhausen cmpwi rKT,0 574f2e2ad2eSMarkus Stockhausen LOAD_IV(rI3, 12) 575f2e2ad2eSMarkus Stockhausen bt eq,ppc_decrypt_xts_notweak 576f2e2ad2eSMarkus Stockhausen subi rT0,rT0,4096 577f2e2ad2eSMarkus Stockhausen mr rKP,rKT 578f2e2ad2eSMarkus Stockhausen START_KEY(rI0, rI1, rI2, rI3) 579f2e2ad2eSMarkus Stockhausen bl ppc_encrypt_block 580f2e2ad2eSMarkus Stockhausen xor rI0,rD0,rW0 581f2e2ad2eSMarkus Stockhausen xor rI1,rD1,rW1 582f2e2ad2eSMarkus Stockhausen xor rI2,rD2,rW2 583f2e2ad2eSMarkus Stockhausen xor rI3,rD3,rW3 584f2e2ad2eSMarkus Stockhausen addi rT0,rT0,4096 585f2e2ad2eSMarkus Stockhausenppc_decrypt_xts_notweak: 586f2e2ad2eSMarkus Stockhausen ENDIAN_SWAP(rG0, rG1, rI0, rI1) 587f2e2ad2eSMarkus Stockhausen ENDIAN_SWAP(rG2, rG3, rI2, rI3) 588f2e2ad2eSMarkus Stockhausenppc_decrypt_xts_loop: 589f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD0, 0) 590f2e2ad2eSMarkus Stockhausen mr rKP,rKS 591f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD1, 4) 592f2e2ad2eSMarkus Stockhausen subi rLN,rLN,16 593f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD2, 8) 594f2e2ad2eSMarkus Stockhausen LOAD_DATA(rD3, 12) 595f2e2ad2eSMarkus Stockhausen xor rD0,rD0,rI0 596f2e2ad2eSMarkus Stockhausen xor rD1,rD1,rI1 597f2e2ad2eSMarkus Stockhausen xor rD2,rD2,rI2 598f2e2ad2eSMarkus Stockhausen xor rD3,rD3,rI3 599f2e2ad2eSMarkus Stockhausen START_KEY(rD0, rD1, rD2, rD3) 600f2e2ad2eSMarkus Stockhausen bl ppc_decrypt_block 601f2e2ad2eSMarkus Stockhausen xor rD0,rD0,rW0 602f2e2ad2eSMarkus Stockhausen xor rD1,rD1,rW1 603f2e2ad2eSMarkus Stockhausen xor rD2,rD2,rW2 604f2e2ad2eSMarkus Stockhausen xor rD3,rD3,rW3 605f2e2ad2eSMarkus Stockhausen xor rD0,rD0,rI0 606f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD0, 0) 607f2e2ad2eSMarkus Stockhausen xor rD1,rD1,rI1 608f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD1, 4) 609f2e2ad2eSMarkus Stockhausen xor rD2,rD2,rI2 610f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD2, 8) 611f2e2ad2eSMarkus Stockhausen xor rD3,rD3,rI3 612f2e2ad2eSMarkus Stockhausen SAVE_DATA(rD3, 12) 613f2e2ad2eSMarkus Stockhausen GF128_MUL(rG0, rG1, rG2, rG3, rW0) 614f2e2ad2eSMarkus Stockhausen ENDIAN_SWAP(rI0, rI1, rG0, rG1) 615f2e2ad2eSMarkus Stockhausen ENDIAN_SWAP(rI2, rI3, rG2, rG3) 616f2e2ad2eSMarkus Stockhausen cmpwi rLN,0 617f2e2ad2eSMarkus Stockhausen NEXT_BLOCK 618f2e2ad2eSMarkus Stockhausen bt gt,ppc_decrypt_xts_loop 619f2e2ad2eSMarkus Stockhausen START_IV 620f2e2ad2eSMarkus Stockhausen SAVE_IV(rI0, 0) 621f2e2ad2eSMarkus Stockhausen SAVE_IV(rI1, 4) 622f2e2ad2eSMarkus Stockhausen SAVE_IV(rI2, 8) 623f2e2ad2eSMarkus Stockhausen SAVE_IV(rI3, 12) 624f2e2ad2eSMarkus Stockhausen FINALIZE_CRYPT(8) 625f2e2ad2eSMarkus Stockhausen blr 626