xref: /linux/arch/powerpc/crypto/aes-spe-modes.S (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
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