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