xref: /freebsd/contrib/bearssl/src/symcipher/aes_pwr8_cbcdec.c (revision 2aaf9152a852aba9eb2036b95f4948ee77988826)
1*0957b409SSimon J. Gerraty /*
2*0957b409SSimon J. Gerraty  * Copyright (c) 2017 Thomas Pornin <pornin@bolet.org>
3*0957b409SSimon J. Gerraty  *
4*0957b409SSimon J. Gerraty  * Permission is hereby granted, free of charge, to any person obtaining
5*0957b409SSimon J. Gerraty  * a copy of this software and associated documentation files (the
6*0957b409SSimon J. Gerraty  * "Software"), to deal in the Software without restriction, including
7*0957b409SSimon J. Gerraty  * without limitation the rights to use, copy, modify, merge, publish,
8*0957b409SSimon J. Gerraty  * distribute, sublicense, and/or sell copies of the Software, and to
9*0957b409SSimon J. Gerraty  * permit persons to whom the Software is furnished to do so, subject to
10*0957b409SSimon J. Gerraty  * the following conditions:
11*0957b409SSimon J. Gerraty  *
12*0957b409SSimon J. Gerraty  * The above copyright notice and this permission notice shall be
13*0957b409SSimon J. Gerraty  * included in all copies or substantial portions of the Software.
14*0957b409SSimon J. Gerraty  *
15*0957b409SSimon J. Gerraty  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*0957b409SSimon J. Gerraty  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*0957b409SSimon J. Gerraty  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18*0957b409SSimon J. Gerraty  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19*0957b409SSimon J. Gerraty  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20*0957b409SSimon J. Gerraty  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21*0957b409SSimon J. Gerraty  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*0957b409SSimon J. Gerraty  * SOFTWARE.
23*0957b409SSimon J. Gerraty  */
24*0957b409SSimon J. Gerraty 
25*0957b409SSimon J. Gerraty #define BR_POWER_ASM_MACROS   1
26*0957b409SSimon J. Gerraty #include "inner.h"
27*0957b409SSimon J. Gerraty 
28*0957b409SSimon J. Gerraty #if BR_POWER8
29*0957b409SSimon J. Gerraty 
30*0957b409SSimon J. Gerraty /* see bearssl_block.h */
31*0957b409SSimon J. Gerraty void
br_aes_pwr8_cbcdec_init(br_aes_pwr8_cbcdec_keys * ctx,const void * key,size_t len)32*0957b409SSimon J. Gerraty br_aes_pwr8_cbcdec_init(br_aes_pwr8_cbcdec_keys *ctx,
33*0957b409SSimon J. Gerraty 	const void *key, size_t len)
34*0957b409SSimon J. Gerraty {
35*0957b409SSimon J. Gerraty 	ctx->vtable = &br_aes_pwr8_cbcdec_vtable;
36*0957b409SSimon J. Gerraty 	ctx->num_rounds = br_aes_pwr8_keysched(ctx->skey.skni, key, len);
37*0957b409SSimon J. Gerraty }
38*0957b409SSimon J. Gerraty 
39*0957b409SSimon J. Gerraty static void
cbcdec_128(const unsigned char * sk,const unsigned char * iv,unsigned char * buf,size_t num_blocks)40*0957b409SSimon J. Gerraty cbcdec_128(const unsigned char *sk,
41*0957b409SSimon J. Gerraty 	const unsigned char *iv, unsigned char *buf, size_t num_blocks)
42*0957b409SSimon J. Gerraty {
43*0957b409SSimon J. Gerraty 	long cc0, cc1, cc2, cc3;
44*0957b409SSimon J. Gerraty 
45*0957b409SSimon J. Gerraty #if BR_POWER8_LE
46*0957b409SSimon J. Gerraty 	static const uint32_t idx2be[] = {
47*0957b409SSimon J. Gerraty 		0x03020100, 0x07060504, 0x0B0A0908, 0x0F0E0D0C
48*0957b409SSimon J. Gerraty 	};
49*0957b409SSimon J. Gerraty #endif
50*0957b409SSimon J. Gerraty 
51*0957b409SSimon J. Gerraty 	cc0 = 0;
52*0957b409SSimon J. Gerraty 	cc1 = 16;
53*0957b409SSimon J. Gerraty 	cc2 = 32;
54*0957b409SSimon J. Gerraty 	cc3 = 48;
55*0957b409SSimon J. Gerraty 	asm volatile (
56*0957b409SSimon J. Gerraty 
57*0957b409SSimon J. Gerraty 		/*
58*0957b409SSimon J. Gerraty 		 * Load subkeys into v0..v10
59*0957b409SSimon J. Gerraty 		 */
60*0957b409SSimon J. Gerraty 		lxvw4x(32, %[cc0], %[sk])
61*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
62*0957b409SSimon J. Gerraty 		lxvw4x(33, %[cc0], %[sk])
63*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
64*0957b409SSimon J. Gerraty 		lxvw4x(34, %[cc0], %[sk])
65*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
66*0957b409SSimon J. Gerraty 		lxvw4x(35, %[cc0], %[sk])
67*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
68*0957b409SSimon J. Gerraty 		lxvw4x(36, %[cc0], %[sk])
69*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
70*0957b409SSimon J. Gerraty 		lxvw4x(37, %[cc0], %[sk])
71*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
72*0957b409SSimon J. Gerraty 		lxvw4x(38, %[cc0], %[sk])
73*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
74*0957b409SSimon J. Gerraty 		lxvw4x(39, %[cc0], %[sk])
75*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
76*0957b409SSimon J. Gerraty 		lxvw4x(40, %[cc0], %[sk])
77*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
78*0957b409SSimon J. Gerraty 		lxvw4x(41, %[cc0], %[sk])
79*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
80*0957b409SSimon J. Gerraty 		lxvw4x(42, %[cc0], %[sk])
81*0957b409SSimon J. Gerraty 		li(%[cc0], 0)
82*0957b409SSimon J. Gerraty 
83*0957b409SSimon J. Gerraty #if BR_POWER8_LE
84*0957b409SSimon J. Gerraty 		/*
85*0957b409SSimon J. Gerraty 		 * v15 = constant for byteswapping words
86*0957b409SSimon J. Gerraty 		 */
87*0957b409SSimon J. Gerraty 		lxvw4x(47, 0, %[idx2be])
88*0957b409SSimon J. Gerraty #endif
89*0957b409SSimon J. Gerraty 		/*
90*0957b409SSimon J. Gerraty 		 * Load IV into v24.
91*0957b409SSimon J. Gerraty 		 */
92*0957b409SSimon J. Gerraty 		lxvw4x(56, 0, %[iv])
93*0957b409SSimon J. Gerraty #if BR_POWER8_LE
94*0957b409SSimon J. Gerraty 		vperm(24, 24, 24, 15)
95*0957b409SSimon J. Gerraty #endif
96*0957b409SSimon J. Gerraty 
97*0957b409SSimon J. Gerraty 		mtctr(%[num_blocks])
98*0957b409SSimon J. Gerraty 	label(loop)
99*0957b409SSimon J. Gerraty 		/*
100*0957b409SSimon J. Gerraty 		 * Load next ciphertext words in v16..v19. Also save them
101*0957b409SSimon J. Gerraty 		 * in v20..v23.
102*0957b409SSimon J. Gerraty 		 */
103*0957b409SSimon J. Gerraty 		lxvw4x(48, %[cc0], %[buf])
104*0957b409SSimon J. Gerraty 		lxvw4x(49, %[cc1], %[buf])
105*0957b409SSimon J. Gerraty 		lxvw4x(50, %[cc2], %[buf])
106*0957b409SSimon J. Gerraty 		lxvw4x(51, %[cc3], %[buf])
107*0957b409SSimon J. Gerraty #if BR_POWER8_LE
108*0957b409SSimon J. Gerraty 		vperm(16, 16, 16, 15)
109*0957b409SSimon J. Gerraty 		vperm(17, 17, 17, 15)
110*0957b409SSimon J. Gerraty 		vperm(18, 18, 18, 15)
111*0957b409SSimon J. Gerraty 		vperm(19, 19, 19, 15)
112*0957b409SSimon J. Gerraty #endif
113*0957b409SSimon J. Gerraty 		vand(20, 16, 16)
114*0957b409SSimon J. Gerraty 		vand(21, 17, 17)
115*0957b409SSimon J. Gerraty 		vand(22, 18, 18)
116*0957b409SSimon J. Gerraty 		vand(23, 19, 19)
117*0957b409SSimon J. Gerraty 
118*0957b409SSimon J. Gerraty 		/*
119*0957b409SSimon J. Gerraty 		 * Decrypt the blocks.
120*0957b409SSimon J. Gerraty 		 */
121*0957b409SSimon J. Gerraty 		vxor(16, 16, 10)
122*0957b409SSimon J. Gerraty 		vxor(17, 17, 10)
123*0957b409SSimon J. Gerraty 		vxor(18, 18, 10)
124*0957b409SSimon J. Gerraty 		vxor(19, 19, 10)
125*0957b409SSimon J. Gerraty 		vncipher(16, 16, 9)
126*0957b409SSimon J. Gerraty 		vncipher(17, 17, 9)
127*0957b409SSimon J. Gerraty 		vncipher(18, 18, 9)
128*0957b409SSimon J. Gerraty 		vncipher(19, 19, 9)
129*0957b409SSimon J. Gerraty 		vncipher(16, 16, 8)
130*0957b409SSimon J. Gerraty 		vncipher(17, 17, 8)
131*0957b409SSimon J. Gerraty 		vncipher(18, 18, 8)
132*0957b409SSimon J. Gerraty 		vncipher(19, 19, 8)
133*0957b409SSimon J. Gerraty 		vncipher(16, 16, 7)
134*0957b409SSimon J. Gerraty 		vncipher(17, 17, 7)
135*0957b409SSimon J. Gerraty 		vncipher(18, 18, 7)
136*0957b409SSimon J. Gerraty 		vncipher(19, 19, 7)
137*0957b409SSimon J. Gerraty 		vncipher(16, 16, 6)
138*0957b409SSimon J. Gerraty 		vncipher(17, 17, 6)
139*0957b409SSimon J. Gerraty 		vncipher(18, 18, 6)
140*0957b409SSimon J. Gerraty 		vncipher(19, 19, 6)
141*0957b409SSimon J. Gerraty 		vncipher(16, 16, 5)
142*0957b409SSimon J. Gerraty 		vncipher(17, 17, 5)
143*0957b409SSimon J. Gerraty 		vncipher(18, 18, 5)
144*0957b409SSimon J. Gerraty 		vncipher(19, 19, 5)
145*0957b409SSimon J. Gerraty 		vncipher(16, 16, 4)
146*0957b409SSimon J. Gerraty 		vncipher(17, 17, 4)
147*0957b409SSimon J. Gerraty 		vncipher(18, 18, 4)
148*0957b409SSimon J. Gerraty 		vncipher(19, 19, 4)
149*0957b409SSimon J. Gerraty 		vncipher(16, 16, 3)
150*0957b409SSimon J. Gerraty 		vncipher(17, 17, 3)
151*0957b409SSimon J. Gerraty 		vncipher(18, 18, 3)
152*0957b409SSimon J. Gerraty 		vncipher(19, 19, 3)
153*0957b409SSimon J. Gerraty 		vncipher(16, 16, 2)
154*0957b409SSimon J. Gerraty 		vncipher(17, 17, 2)
155*0957b409SSimon J. Gerraty 		vncipher(18, 18, 2)
156*0957b409SSimon J. Gerraty 		vncipher(19, 19, 2)
157*0957b409SSimon J. Gerraty 		vncipher(16, 16, 1)
158*0957b409SSimon J. Gerraty 		vncipher(17, 17, 1)
159*0957b409SSimon J. Gerraty 		vncipher(18, 18, 1)
160*0957b409SSimon J. Gerraty 		vncipher(19, 19, 1)
161*0957b409SSimon J. Gerraty 		vncipherlast(16, 16, 0)
162*0957b409SSimon J. Gerraty 		vncipherlast(17, 17, 0)
163*0957b409SSimon J. Gerraty 		vncipherlast(18, 18, 0)
164*0957b409SSimon J. Gerraty 		vncipherlast(19, 19, 0)
165*0957b409SSimon J. Gerraty 
166*0957b409SSimon J. Gerraty 		/*
167*0957b409SSimon J. Gerraty 		 * XOR decrypted blocks with IV / previous block.
168*0957b409SSimon J. Gerraty 		 */
169*0957b409SSimon J. Gerraty 		vxor(16, 16, 24)
170*0957b409SSimon J. Gerraty 		vxor(17, 17, 20)
171*0957b409SSimon J. Gerraty 		vxor(18, 18, 21)
172*0957b409SSimon J. Gerraty 		vxor(19, 19, 22)
173*0957b409SSimon J. Gerraty 
174*0957b409SSimon J. Gerraty 		/*
175*0957b409SSimon J. Gerraty 		 * Store back result (with byteswap)
176*0957b409SSimon J. Gerraty 		 */
177*0957b409SSimon J. Gerraty #if BR_POWER8_LE
178*0957b409SSimon J. Gerraty 		vperm(16, 16, 16, 15)
179*0957b409SSimon J. Gerraty 		vperm(17, 17, 17, 15)
180*0957b409SSimon J. Gerraty 		vperm(18, 18, 18, 15)
181*0957b409SSimon J. Gerraty 		vperm(19, 19, 19, 15)
182*0957b409SSimon J. Gerraty #endif
183*0957b409SSimon J. Gerraty 		stxvw4x(48, %[cc0], %[buf])
184*0957b409SSimon J. Gerraty 		stxvw4x(49, %[cc1], %[buf])
185*0957b409SSimon J. Gerraty 		stxvw4x(50, %[cc2], %[buf])
186*0957b409SSimon J. Gerraty 		stxvw4x(51, %[cc3], %[buf])
187*0957b409SSimon J. Gerraty 
188*0957b409SSimon J. Gerraty 		/*
189*0957b409SSimon J. Gerraty 		 * Fourth encrypted block is IV for next run.
190*0957b409SSimon J. Gerraty 		 */
191*0957b409SSimon J. Gerraty 		vand(24, 23, 23)
192*0957b409SSimon J. Gerraty 
193*0957b409SSimon J. Gerraty 		addi(%[buf], %[buf], 64)
194*0957b409SSimon J. Gerraty 
195*0957b409SSimon J. Gerraty 		bdnz(loop)
196*0957b409SSimon J. Gerraty 
197*0957b409SSimon J. Gerraty : [cc0] "+b" (cc0), [cc1] "+b" (cc1), [cc2] "+b" (cc2), [cc3] "+b" (cc3),
198*0957b409SSimon J. Gerraty   [buf] "+b" (buf)
199*0957b409SSimon J. Gerraty : [sk] "b" (sk), [iv] "b" (iv), [num_blocks] "b" (num_blocks >> 2)
200*0957b409SSimon J. Gerraty #if BR_POWER8_LE
201*0957b409SSimon J. Gerraty 	, [idx2be] "b" (idx2be)
202*0957b409SSimon J. Gerraty #endif
203*0957b409SSimon J. Gerraty : "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9",
204*0957b409SSimon J. Gerraty   "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19",
205*0957b409SSimon J. Gerraty   "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29",
206*0957b409SSimon J. Gerraty   "ctr", "memory"
207*0957b409SSimon J. Gerraty 	);
208*0957b409SSimon J. Gerraty }
209*0957b409SSimon J. Gerraty 
210*0957b409SSimon J. Gerraty static void
cbcdec_192(const unsigned char * sk,const unsigned char * iv,unsigned char * buf,size_t num_blocks)211*0957b409SSimon J. Gerraty cbcdec_192(const unsigned char *sk,
212*0957b409SSimon J. Gerraty 	const unsigned char *iv, unsigned char *buf, size_t num_blocks)
213*0957b409SSimon J. Gerraty {
214*0957b409SSimon J. Gerraty 	long cc0, cc1, cc2, cc3;
215*0957b409SSimon J. Gerraty 
216*0957b409SSimon J. Gerraty #if BR_POWER8_LE
217*0957b409SSimon J. Gerraty 	static const uint32_t idx2be[] = {
218*0957b409SSimon J. Gerraty 		0x03020100, 0x07060504, 0x0B0A0908, 0x0F0E0D0C
219*0957b409SSimon J. Gerraty 	};
220*0957b409SSimon J. Gerraty #endif
221*0957b409SSimon J. Gerraty 
222*0957b409SSimon J. Gerraty 	cc0 = 0;
223*0957b409SSimon J. Gerraty 	cc1 = 16;
224*0957b409SSimon J. Gerraty 	cc2 = 32;
225*0957b409SSimon J. Gerraty 	cc3 = 48;
226*0957b409SSimon J. Gerraty 	asm volatile (
227*0957b409SSimon J. Gerraty 
228*0957b409SSimon J. Gerraty 		/*
229*0957b409SSimon J. Gerraty 		 * Load subkeys into v0..v12
230*0957b409SSimon J. Gerraty 		 */
231*0957b409SSimon J. Gerraty 		lxvw4x(32, %[cc0], %[sk])
232*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
233*0957b409SSimon J. Gerraty 		lxvw4x(33, %[cc0], %[sk])
234*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
235*0957b409SSimon J. Gerraty 		lxvw4x(34, %[cc0], %[sk])
236*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
237*0957b409SSimon J. Gerraty 		lxvw4x(35, %[cc0], %[sk])
238*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
239*0957b409SSimon J. Gerraty 		lxvw4x(36, %[cc0], %[sk])
240*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
241*0957b409SSimon J. Gerraty 		lxvw4x(37, %[cc0], %[sk])
242*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
243*0957b409SSimon J. Gerraty 		lxvw4x(38, %[cc0], %[sk])
244*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
245*0957b409SSimon J. Gerraty 		lxvw4x(39, %[cc0], %[sk])
246*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
247*0957b409SSimon J. Gerraty 		lxvw4x(40, %[cc0], %[sk])
248*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
249*0957b409SSimon J. Gerraty 		lxvw4x(41, %[cc0], %[sk])
250*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
251*0957b409SSimon J. Gerraty 		lxvw4x(42, %[cc0], %[sk])
252*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
253*0957b409SSimon J. Gerraty 		lxvw4x(43, %[cc0], %[sk])
254*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
255*0957b409SSimon J. Gerraty 		lxvw4x(44, %[cc0], %[sk])
256*0957b409SSimon J. Gerraty 		li(%[cc0], 0)
257*0957b409SSimon J. Gerraty 
258*0957b409SSimon J. Gerraty #if BR_POWER8_LE
259*0957b409SSimon J. Gerraty 		/*
260*0957b409SSimon J. Gerraty 		 * v15 = constant for byteswapping words
261*0957b409SSimon J. Gerraty 		 */
262*0957b409SSimon J. Gerraty 		lxvw4x(47, 0, %[idx2be])
263*0957b409SSimon J. Gerraty #endif
264*0957b409SSimon J. Gerraty 		/*
265*0957b409SSimon J. Gerraty 		 * Load IV into v24.
266*0957b409SSimon J. Gerraty 		 */
267*0957b409SSimon J. Gerraty 		lxvw4x(56, 0, %[iv])
268*0957b409SSimon J. Gerraty #if BR_POWER8_LE
269*0957b409SSimon J. Gerraty 		vperm(24, 24, 24, 15)
270*0957b409SSimon J. Gerraty #endif
271*0957b409SSimon J. Gerraty 
272*0957b409SSimon J. Gerraty 		mtctr(%[num_blocks])
273*0957b409SSimon J. Gerraty 	label(loop)
274*0957b409SSimon J. Gerraty 		/*
275*0957b409SSimon J. Gerraty 		 * Load next ciphertext words in v16..v19. Also save them
276*0957b409SSimon J. Gerraty 		 * in v20..v23.
277*0957b409SSimon J. Gerraty 		 */
278*0957b409SSimon J. Gerraty 		lxvw4x(48, %[cc0], %[buf])
279*0957b409SSimon J. Gerraty 		lxvw4x(49, %[cc1], %[buf])
280*0957b409SSimon J. Gerraty 		lxvw4x(50, %[cc2], %[buf])
281*0957b409SSimon J. Gerraty 		lxvw4x(51, %[cc3], %[buf])
282*0957b409SSimon J. Gerraty #if BR_POWER8_LE
283*0957b409SSimon J. Gerraty 		vperm(16, 16, 16, 15)
284*0957b409SSimon J. Gerraty 		vperm(17, 17, 17, 15)
285*0957b409SSimon J. Gerraty 		vperm(18, 18, 18, 15)
286*0957b409SSimon J. Gerraty 		vperm(19, 19, 19, 15)
287*0957b409SSimon J. Gerraty #endif
288*0957b409SSimon J. Gerraty 		vand(20, 16, 16)
289*0957b409SSimon J. Gerraty 		vand(21, 17, 17)
290*0957b409SSimon J. Gerraty 		vand(22, 18, 18)
291*0957b409SSimon J. Gerraty 		vand(23, 19, 19)
292*0957b409SSimon J. Gerraty 
293*0957b409SSimon J. Gerraty 		/*
294*0957b409SSimon J. Gerraty 		 * Decrypt the blocks.
295*0957b409SSimon J. Gerraty 		 */
296*0957b409SSimon J. Gerraty 		vxor(16, 16, 12)
297*0957b409SSimon J. Gerraty 		vxor(17, 17, 12)
298*0957b409SSimon J. Gerraty 		vxor(18, 18, 12)
299*0957b409SSimon J. Gerraty 		vxor(19, 19, 12)
300*0957b409SSimon J. Gerraty 		vncipher(16, 16, 11)
301*0957b409SSimon J. Gerraty 		vncipher(17, 17, 11)
302*0957b409SSimon J. Gerraty 		vncipher(18, 18, 11)
303*0957b409SSimon J. Gerraty 		vncipher(19, 19, 11)
304*0957b409SSimon J. Gerraty 		vncipher(16, 16, 10)
305*0957b409SSimon J. Gerraty 		vncipher(17, 17, 10)
306*0957b409SSimon J. Gerraty 		vncipher(18, 18, 10)
307*0957b409SSimon J. Gerraty 		vncipher(19, 19, 10)
308*0957b409SSimon J. Gerraty 		vncipher(16, 16, 9)
309*0957b409SSimon J. Gerraty 		vncipher(17, 17, 9)
310*0957b409SSimon J. Gerraty 		vncipher(18, 18, 9)
311*0957b409SSimon J. Gerraty 		vncipher(19, 19, 9)
312*0957b409SSimon J. Gerraty 		vncipher(16, 16, 8)
313*0957b409SSimon J. Gerraty 		vncipher(17, 17, 8)
314*0957b409SSimon J. Gerraty 		vncipher(18, 18, 8)
315*0957b409SSimon J. Gerraty 		vncipher(19, 19, 8)
316*0957b409SSimon J. Gerraty 		vncipher(16, 16, 7)
317*0957b409SSimon J. Gerraty 		vncipher(17, 17, 7)
318*0957b409SSimon J. Gerraty 		vncipher(18, 18, 7)
319*0957b409SSimon J. Gerraty 		vncipher(19, 19, 7)
320*0957b409SSimon J. Gerraty 		vncipher(16, 16, 6)
321*0957b409SSimon J. Gerraty 		vncipher(17, 17, 6)
322*0957b409SSimon J. Gerraty 		vncipher(18, 18, 6)
323*0957b409SSimon J. Gerraty 		vncipher(19, 19, 6)
324*0957b409SSimon J. Gerraty 		vncipher(16, 16, 5)
325*0957b409SSimon J. Gerraty 		vncipher(17, 17, 5)
326*0957b409SSimon J. Gerraty 		vncipher(18, 18, 5)
327*0957b409SSimon J. Gerraty 		vncipher(19, 19, 5)
328*0957b409SSimon J. Gerraty 		vncipher(16, 16, 4)
329*0957b409SSimon J. Gerraty 		vncipher(17, 17, 4)
330*0957b409SSimon J. Gerraty 		vncipher(18, 18, 4)
331*0957b409SSimon J. Gerraty 		vncipher(19, 19, 4)
332*0957b409SSimon J. Gerraty 		vncipher(16, 16, 3)
333*0957b409SSimon J. Gerraty 		vncipher(17, 17, 3)
334*0957b409SSimon J. Gerraty 		vncipher(18, 18, 3)
335*0957b409SSimon J. Gerraty 		vncipher(19, 19, 3)
336*0957b409SSimon J. Gerraty 		vncipher(16, 16, 2)
337*0957b409SSimon J. Gerraty 		vncipher(17, 17, 2)
338*0957b409SSimon J. Gerraty 		vncipher(18, 18, 2)
339*0957b409SSimon J. Gerraty 		vncipher(19, 19, 2)
340*0957b409SSimon J. Gerraty 		vncipher(16, 16, 1)
341*0957b409SSimon J. Gerraty 		vncipher(17, 17, 1)
342*0957b409SSimon J. Gerraty 		vncipher(18, 18, 1)
343*0957b409SSimon J. Gerraty 		vncipher(19, 19, 1)
344*0957b409SSimon J. Gerraty 		vncipherlast(16, 16, 0)
345*0957b409SSimon J. Gerraty 		vncipherlast(17, 17, 0)
346*0957b409SSimon J. Gerraty 		vncipherlast(18, 18, 0)
347*0957b409SSimon J. Gerraty 		vncipherlast(19, 19, 0)
348*0957b409SSimon J. Gerraty 
349*0957b409SSimon J. Gerraty 		/*
350*0957b409SSimon J. Gerraty 		 * XOR decrypted blocks with IV / previous block.
351*0957b409SSimon J. Gerraty 		 */
352*0957b409SSimon J. Gerraty 		vxor(16, 16, 24)
353*0957b409SSimon J. Gerraty 		vxor(17, 17, 20)
354*0957b409SSimon J. Gerraty 		vxor(18, 18, 21)
355*0957b409SSimon J. Gerraty 		vxor(19, 19, 22)
356*0957b409SSimon J. Gerraty 
357*0957b409SSimon J. Gerraty 		/*
358*0957b409SSimon J. Gerraty 		 * Store back result (with byteswap)
359*0957b409SSimon J. Gerraty 		 */
360*0957b409SSimon J. Gerraty #if BR_POWER8_LE
361*0957b409SSimon J. Gerraty 		vperm(16, 16, 16, 15)
362*0957b409SSimon J. Gerraty 		vperm(17, 17, 17, 15)
363*0957b409SSimon J. Gerraty 		vperm(18, 18, 18, 15)
364*0957b409SSimon J. Gerraty 		vperm(19, 19, 19, 15)
365*0957b409SSimon J. Gerraty #endif
366*0957b409SSimon J. Gerraty 		stxvw4x(48, %[cc0], %[buf])
367*0957b409SSimon J. Gerraty 		stxvw4x(49, %[cc1], %[buf])
368*0957b409SSimon J. Gerraty 		stxvw4x(50, %[cc2], %[buf])
369*0957b409SSimon J. Gerraty 		stxvw4x(51, %[cc3], %[buf])
370*0957b409SSimon J. Gerraty 
371*0957b409SSimon J. Gerraty 		/*
372*0957b409SSimon J. Gerraty 		 * Fourth encrypted block is IV for next run.
373*0957b409SSimon J. Gerraty 		 */
374*0957b409SSimon J. Gerraty 		vand(24, 23, 23)
375*0957b409SSimon J. Gerraty 
376*0957b409SSimon J. Gerraty 		addi(%[buf], %[buf], 64)
377*0957b409SSimon J. Gerraty 
378*0957b409SSimon J. Gerraty 		bdnz(loop)
379*0957b409SSimon J. Gerraty 
380*0957b409SSimon J. Gerraty : [cc0] "+b" (cc0), [cc1] "+b" (cc1), [cc2] "+b" (cc2), [cc3] "+b" (cc3),
381*0957b409SSimon J. Gerraty   [buf] "+b" (buf)
382*0957b409SSimon J. Gerraty : [sk] "b" (sk), [iv] "b" (iv), [num_blocks] "b" (num_blocks >> 2)
383*0957b409SSimon J. Gerraty #if BR_POWER8_LE
384*0957b409SSimon J. Gerraty 	, [idx2be] "b" (idx2be)
385*0957b409SSimon J. Gerraty #endif
386*0957b409SSimon J. Gerraty : "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9",
387*0957b409SSimon J. Gerraty   "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19",
388*0957b409SSimon J. Gerraty   "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29",
389*0957b409SSimon J. Gerraty   "ctr", "memory"
390*0957b409SSimon J. Gerraty 	);
391*0957b409SSimon J. Gerraty }
392*0957b409SSimon J. Gerraty 
393*0957b409SSimon J. Gerraty static void
cbcdec_256(const unsigned char * sk,const unsigned char * iv,unsigned char * buf,size_t num_blocks)394*0957b409SSimon J. Gerraty cbcdec_256(const unsigned char *sk,
395*0957b409SSimon J. Gerraty 	const unsigned char *iv, unsigned char *buf, size_t num_blocks)
396*0957b409SSimon J. Gerraty {
397*0957b409SSimon J. Gerraty 	long cc0, cc1, cc2, cc3;
398*0957b409SSimon J. Gerraty 
399*0957b409SSimon J. Gerraty #if BR_POWER8_LE
400*0957b409SSimon J. Gerraty 	static const uint32_t idx2be[] = {
401*0957b409SSimon J. Gerraty 		0x03020100, 0x07060504, 0x0B0A0908, 0x0F0E0D0C
402*0957b409SSimon J. Gerraty 	};
403*0957b409SSimon J. Gerraty #endif
404*0957b409SSimon J. Gerraty 
405*0957b409SSimon J. Gerraty 	cc0 = 0;
406*0957b409SSimon J. Gerraty 	cc1 = 16;
407*0957b409SSimon J. Gerraty 	cc2 = 32;
408*0957b409SSimon J. Gerraty 	cc3 = 48;
409*0957b409SSimon J. Gerraty 	asm volatile (
410*0957b409SSimon J. Gerraty 
411*0957b409SSimon J. Gerraty 		/*
412*0957b409SSimon J. Gerraty 		 * Load subkeys into v0..v14
413*0957b409SSimon J. Gerraty 		 */
414*0957b409SSimon J. Gerraty 		lxvw4x(32, %[cc0], %[sk])
415*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
416*0957b409SSimon J. Gerraty 		lxvw4x(33, %[cc0], %[sk])
417*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
418*0957b409SSimon J. Gerraty 		lxvw4x(34, %[cc0], %[sk])
419*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
420*0957b409SSimon J. Gerraty 		lxvw4x(35, %[cc0], %[sk])
421*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
422*0957b409SSimon J. Gerraty 		lxvw4x(36, %[cc0], %[sk])
423*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
424*0957b409SSimon J. Gerraty 		lxvw4x(37, %[cc0], %[sk])
425*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
426*0957b409SSimon J. Gerraty 		lxvw4x(38, %[cc0], %[sk])
427*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
428*0957b409SSimon J. Gerraty 		lxvw4x(39, %[cc0], %[sk])
429*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
430*0957b409SSimon J. Gerraty 		lxvw4x(40, %[cc0], %[sk])
431*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
432*0957b409SSimon J. Gerraty 		lxvw4x(41, %[cc0], %[sk])
433*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
434*0957b409SSimon J. Gerraty 		lxvw4x(42, %[cc0], %[sk])
435*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
436*0957b409SSimon J. Gerraty 		lxvw4x(43, %[cc0], %[sk])
437*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
438*0957b409SSimon J. Gerraty 		lxvw4x(44, %[cc0], %[sk])
439*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
440*0957b409SSimon J. Gerraty 		lxvw4x(45, %[cc0], %[sk])
441*0957b409SSimon J. Gerraty 		addi(%[cc0], %[cc0], 16)
442*0957b409SSimon J. Gerraty 		lxvw4x(46, %[cc0], %[sk])
443*0957b409SSimon J. Gerraty 		li(%[cc0], 0)
444*0957b409SSimon J. Gerraty 
445*0957b409SSimon J. Gerraty #if BR_POWER8_LE
446*0957b409SSimon J. Gerraty 		/*
447*0957b409SSimon J. Gerraty 		 * v15 = constant for byteswapping words
448*0957b409SSimon J. Gerraty 		 */
449*0957b409SSimon J. Gerraty 		lxvw4x(47, 0, %[idx2be])
450*0957b409SSimon J. Gerraty #endif
451*0957b409SSimon J. Gerraty 		/*
452*0957b409SSimon J. Gerraty 		 * Load IV into v24.
453*0957b409SSimon J. Gerraty 		 */
454*0957b409SSimon J. Gerraty 		lxvw4x(56, 0, %[iv])
455*0957b409SSimon J. Gerraty #if BR_POWER8_LE
456*0957b409SSimon J. Gerraty 		vperm(24, 24, 24, 15)
457*0957b409SSimon J. Gerraty #endif
458*0957b409SSimon J. Gerraty 
459*0957b409SSimon J. Gerraty 		mtctr(%[num_blocks])
460*0957b409SSimon J. Gerraty 	label(loop)
461*0957b409SSimon J. Gerraty 		/*
462*0957b409SSimon J. Gerraty 		 * Load next ciphertext words in v16..v19. Also save them
463*0957b409SSimon J. Gerraty 		 * in v20..v23.
464*0957b409SSimon J. Gerraty 		 */
465*0957b409SSimon J. Gerraty 		lxvw4x(48, %[cc0], %[buf])
466*0957b409SSimon J. Gerraty 		lxvw4x(49, %[cc1], %[buf])
467*0957b409SSimon J. Gerraty 		lxvw4x(50, %[cc2], %[buf])
468*0957b409SSimon J. Gerraty 		lxvw4x(51, %[cc3], %[buf])
469*0957b409SSimon J. Gerraty #if BR_POWER8_LE
470*0957b409SSimon J. Gerraty 		vperm(16, 16, 16, 15)
471*0957b409SSimon J. Gerraty 		vperm(17, 17, 17, 15)
472*0957b409SSimon J. Gerraty 		vperm(18, 18, 18, 15)
473*0957b409SSimon J. Gerraty 		vperm(19, 19, 19, 15)
474*0957b409SSimon J. Gerraty #endif
475*0957b409SSimon J. Gerraty 		vand(20, 16, 16)
476*0957b409SSimon J. Gerraty 		vand(21, 17, 17)
477*0957b409SSimon J. Gerraty 		vand(22, 18, 18)
478*0957b409SSimon J. Gerraty 		vand(23, 19, 19)
479*0957b409SSimon J. Gerraty 
480*0957b409SSimon J. Gerraty 		/*
481*0957b409SSimon J. Gerraty 		 * Decrypt the blocks.
482*0957b409SSimon J. Gerraty 		 */
483*0957b409SSimon J. Gerraty 		vxor(16, 16, 14)
484*0957b409SSimon J. Gerraty 		vxor(17, 17, 14)
485*0957b409SSimon J. Gerraty 		vxor(18, 18, 14)
486*0957b409SSimon J. Gerraty 		vxor(19, 19, 14)
487*0957b409SSimon J. Gerraty 		vncipher(16, 16, 13)
488*0957b409SSimon J. Gerraty 		vncipher(17, 17, 13)
489*0957b409SSimon J. Gerraty 		vncipher(18, 18, 13)
490*0957b409SSimon J. Gerraty 		vncipher(19, 19, 13)
491*0957b409SSimon J. Gerraty 		vncipher(16, 16, 12)
492*0957b409SSimon J. Gerraty 		vncipher(17, 17, 12)
493*0957b409SSimon J. Gerraty 		vncipher(18, 18, 12)
494*0957b409SSimon J. Gerraty 		vncipher(19, 19, 12)
495*0957b409SSimon J. Gerraty 		vncipher(16, 16, 11)
496*0957b409SSimon J. Gerraty 		vncipher(17, 17, 11)
497*0957b409SSimon J. Gerraty 		vncipher(18, 18, 11)
498*0957b409SSimon J. Gerraty 		vncipher(19, 19, 11)
499*0957b409SSimon J. Gerraty 		vncipher(16, 16, 10)
500*0957b409SSimon J. Gerraty 		vncipher(17, 17, 10)
501*0957b409SSimon J. Gerraty 		vncipher(18, 18, 10)
502*0957b409SSimon J. Gerraty 		vncipher(19, 19, 10)
503*0957b409SSimon J. Gerraty 		vncipher(16, 16, 9)
504*0957b409SSimon J. Gerraty 		vncipher(17, 17, 9)
505*0957b409SSimon J. Gerraty 		vncipher(18, 18, 9)
506*0957b409SSimon J. Gerraty 		vncipher(19, 19, 9)
507*0957b409SSimon J. Gerraty 		vncipher(16, 16, 8)
508*0957b409SSimon J. Gerraty 		vncipher(17, 17, 8)
509*0957b409SSimon J. Gerraty 		vncipher(18, 18, 8)
510*0957b409SSimon J. Gerraty 		vncipher(19, 19, 8)
511*0957b409SSimon J. Gerraty 		vncipher(16, 16, 7)
512*0957b409SSimon J. Gerraty 		vncipher(17, 17, 7)
513*0957b409SSimon J. Gerraty 		vncipher(18, 18, 7)
514*0957b409SSimon J. Gerraty 		vncipher(19, 19, 7)
515*0957b409SSimon J. Gerraty 		vncipher(16, 16, 6)
516*0957b409SSimon J. Gerraty 		vncipher(17, 17, 6)
517*0957b409SSimon J. Gerraty 		vncipher(18, 18, 6)
518*0957b409SSimon J. Gerraty 		vncipher(19, 19, 6)
519*0957b409SSimon J. Gerraty 		vncipher(16, 16, 5)
520*0957b409SSimon J. Gerraty 		vncipher(17, 17, 5)
521*0957b409SSimon J. Gerraty 		vncipher(18, 18, 5)
522*0957b409SSimon J. Gerraty 		vncipher(19, 19, 5)
523*0957b409SSimon J. Gerraty 		vncipher(16, 16, 4)
524*0957b409SSimon J. Gerraty 		vncipher(17, 17, 4)
525*0957b409SSimon J. Gerraty 		vncipher(18, 18, 4)
526*0957b409SSimon J. Gerraty 		vncipher(19, 19, 4)
527*0957b409SSimon J. Gerraty 		vncipher(16, 16, 3)
528*0957b409SSimon J. Gerraty 		vncipher(17, 17, 3)
529*0957b409SSimon J. Gerraty 		vncipher(18, 18, 3)
530*0957b409SSimon J. Gerraty 		vncipher(19, 19, 3)
531*0957b409SSimon J. Gerraty 		vncipher(16, 16, 2)
532*0957b409SSimon J. Gerraty 		vncipher(17, 17, 2)
533*0957b409SSimon J. Gerraty 		vncipher(18, 18, 2)
534*0957b409SSimon J. Gerraty 		vncipher(19, 19, 2)
535*0957b409SSimon J. Gerraty 		vncipher(16, 16, 1)
536*0957b409SSimon J. Gerraty 		vncipher(17, 17, 1)
537*0957b409SSimon J. Gerraty 		vncipher(18, 18, 1)
538*0957b409SSimon J. Gerraty 		vncipher(19, 19, 1)
539*0957b409SSimon J. Gerraty 		vncipherlast(16, 16, 0)
540*0957b409SSimon J. Gerraty 		vncipherlast(17, 17, 0)
541*0957b409SSimon J. Gerraty 		vncipherlast(18, 18, 0)
542*0957b409SSimon J. Gerraty 		vncipherlast(19, 19, 0)
543*0957b409SSimon J. Gerraty 
544*0957b409SSimon J. Gerraty 		/*
545*0957b409SSimon J. Gerraty 		 * XOR decrypted blocks with IV / previous block.
546*0957b409SSimon J. Gerraty 		 */
547*0957b409SSimon J. Gerraty 		vxor(16, 16, 24)
548*0957b409SSimon J. Gerraty 		vxor(17, 17, 20)
549*0957b409SSimon J. Gerraty 		vxor(18, 18, 21)
550*0957b409SSimon J. Gerraty 		vxor(19, 19, 22)
551*0957b409SSimon J. Gerraty 
552*0957b409SSimon J. Gerraty 		/*
553*0957b409SSimon J. Gerraty 		 * Store back result (with byteswap)
554*0957b409SSimon J. Gerraty 		 */
555*0957b409SSimon J. Gerraty #if BR_POWER8_LE
556*0957b409SSimon J. Gerraty 		vperm(16, 16, 16, 15)
557*0957b409SSimon J. Gerraty 		vperm(17, 17, 17, 15)
558*0957b409SSimon J. Gerraty 		vperm(18, 18, 18, 15)
559*0957b409SSimon J. Gerraty 		vperm(19, 19, 19, 15)
560*0957b409SSimon J. Gerraty #endif
561*0957b409SSimon J. Gerraty 		stxvw4x(48, %[cc0], %[buf])
562*0957b409SSimon J. Gerraty 		stxvw4x(49, %[cc1], %[buf])
563*0957b409SSimon J. Gerraty 		stxvw4x(50, %[cc2], %[buf])
564*0957b409SSimon J. Gerraty 		stxvw4x(51, %[cc3], %[buf])
565*0957b409SSimon J. Gerraty 
566*0957b409SSimon J. Gerraty 		/*
567*0957b409SSimon J. Gerraty 		 * Fourth encrypted block is IV for next run.
568*0957b409SSimon J. Gerraty 		 */
569*0957b409SSimon J. Gerraty 		vand(24, 23, 23)
570*0957b409SSimon J. Gerraty 
571*0957b409SSimon J. Gerraty 		addi(%[buf], %[buf], 64)
572*0957b409SSimon J. Gerraty 
573*0957b409SSimon J. Gerraty 		bdnz(loop)
574*0957b409SSimon J. Gerraty 
575*0957b409SSimon J. Gerraty : [cc0] "+b" (cc0), [cc1] "+b" (cc1), [cc2] "+b" (cc2), [cc3] "+b" (cc3),
576*0957b409SSimon J. Gerraty   [buf] "+b" (buf)
577*0957b409SSimon J. Gerraty : [sk] "b" (sk), [iv] "b" (iv), [num_blocks] "b" (num_blocks >> 2)
578*0957b409SSimon J. Gerraty #if BR_POWER8_LE
579*0957b409SSimon J. Gerraty 	, [idx2be] "b" (idx2be)
580*0957b409SSimon J. Gerraty #endif
581*0957b409SSimon J. Gerraty : "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9",
582*0957b409SSimon J. Gerraty   "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19",
583*0957b409SSimon J. Gerraty   "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29",
584*0957b409SSimon J. Gerraty   "ctr", "memory"
585*0957b409SSimon J. Gerraty 	);
586*0957b409SSimon J. Gerraty }
587*0957b409SSimon J. Gerraty 
588*0957b409SSimon J. Gerraty /* see bearssl_block.h */
589*0957b409SSimon J. Gerraty void
br_aes_pwr8_cbcdec_run(const br_aes_pwr8_cbcdec_keys * ctx,void * iv,void * data,size_t len)590*0957b409SSimon J. Gerraty br_aes_pwr8_cbcdec_run(const br_aes_pwr8_cbcdec_keys *ctx,
591*0957b409SSimon J. Gerraty 	void *iv, void *data, size_t len)
592*0957b409SSimon J. Gerraty {
593*0957b409SSimon J. Gerraty 	unsigned char nextiv[16];
594*0957b409SSimon J. Gerraty 	unsigned char *buf;
595*0957b409SSimon J. Gerraty 
596*0957b409SSimon J. Gerraty 	if (len == 0) {
597*0957b409SSimon J. Gerraty 		return;
598*0957b409SSimon J. Gerraty 	}
599*0957b409SSimon J. Gerraty 	buf = data;
600*0957b409SSimon J. Gerraty 	memcpy(nextiv, buf + len - 16, 16);
601*0957b409SSimon J. Gerraty 	if (len >= 64) {
602*0957b409SSimon J. Gerraty 		size_t num_blocks;
603*0957b409SSimon J. Gerraty 		unsigned char tmp[16];
604*0957b409SSimon J. Gerraty 
605*0957b409SSimon J. Gerraty 		num_blocks = (len >> 4) & ~(size_t)3;
606*0957b409SSimon J. Gerraty 		memcpy(tmp, buf + (num_blocks << 4) - 16, 16);
607*0957b409SSimon J. Gerraty 		switch (ctx->num_rounds) {
608*0957b409SSimon J. Gerraty 		case 10:
609*0957b409SSimon J. Gerraty 			cbcdec_128(ctx->skey.skni, iv, buf, num_blocks);
610*0957b409SSimon J. Gerraty 			break;
611*0957b409SSimon J. Gerraty 		case 12:
612*0957b409SSimon J. Gerraty 			cbcdec_192(ctx->skey.skni, iv, buf, num_blocks);
613*0957b409SSimon J. Gerraty 			break;
614*0957b409SSimon J. Gerraty 		default:
615*0957b409SSimon J. Gerraty 			cbcdec_256(ctx->skey.skni, iv, buf, num_blocks);
616*0957b409SSimon J. Gerraty 			break;
617*0957b409SSimon J. Gerraty 		}
618*0957b409SSimon J. Gerraty 		buf += num_blocks << 4;
619*0957b409SSimon J. Gerraty 		len &= 63;
620*0957b409SSimon J. Gerraty 		memcpy(iv, tmp, 16);
621*0957b409SSimon J. Gerraty 	}
622*0957b409SSimon J. Gerraty 	if (len > 0) {
623*0957b409SSimon J. Gerraty 		unsigned char tmp[64];
624*0957b409SSimon J. Gerraty 
625*0957b409SSimon J. Gerraty 		memcpy(tmp, buf, len);
626*0957b409SSimon J. Gerraty 		memset(tmp + len, 0, (sizeof tmp) - len);
627*0957b409SSimon J. Gerraty 		switch (ctx->num_rounds) {
628*0957b409SSimon J. Gerraty 		case 10:
629*0957b409SSimon J. Gerraty 			cbcdec_128(ctx->skey.skni, iv, tmp, 4);
630*0957b409SSimon J. Gerraty 			break;
631*0957b409SSimon J. Gerraty 		case 12:
632*0957b409SSimon J. Gerraty 			cbcdec_192(ctx->skey.skni, iv, tmp, 4);
633*0957b409SSimon J. Gerraty 			break;
634*0957b409SSimon J. Gerraty 		default:
635*0957b409SSimon J. Gerraty 			cbcdec_256(ctx->skey.skni, iv, tmp, 4);
636*0957b409SSimon J. Gerraty 			break;
637*0957b409SSimon J. Gerraty 		}
638*0957b409SSimon J. Gerraty 		memcpy(buf, tmp, len);
639*0957b409SSimon J. Gerraty 	}
640*0957b409SSimon J. Gerraty 	memcpy(iv, nextiv, 16);
641*0957b409SSimon J. Gerraty }
642*0957b409SSimon J. Gerraty 
643*0957b409SSimon J. Gerraty /* see bearssl_block.h */
644*0957b409SSimon J. Gerraty const br_block_cbcdec_class br_aes_pwr8_cbcdec_vtable = {
645*0957b409SSimon J. Gerraty 	sizeof(br_aes_pwr8_cbcdec_keys),
646*0957b409SSimon J. Gerraty 	16,
647*0957b409SSimon J. Gerraty 	4,
648*0957b409SSimon J. Gerraty 	(void (*)(const br_block_cbcdec_class **, const void *, size_t))
649*0957b409SSimon J. Gerraty 		&br_aes_pwr8_cbcdec_init,
650*0957b409SSimon J. Gerraty 	(void (*)(const br_block_cbcdec_class *const *, void *, void *, size_t))
651*0957b409SSimon J. Gerraty 		&br_aes_pwr8_cbcdec_run
652*0957b409SSimon J. Gerraty };
653*0957b409SSimon J. Gerraty 
654*0957b409SSimon J. Gerraty /* see bearssl_block.h */
655*0957b409SSimon J. Gerraty const br_block_cbcdec_class *
br_aes_pwr8_cbcdec_get_vtable(void)656*0957b409SSimon J. Gerraty br_aes_pwr8_cbcdec_get_vtable(void)
657*0957b409SSimon J. Gerraty {
658*0957b409SSimon J. Gerraty 	return br_aes_pwr8_supported() ? &br_aes_pwr8_cbcdec_vtable : NULL;
659*0957b409SSimon J. Gerraty }
660*0957b409SSimon J. Gerraty 
661*0957b409SSimon J. Gerraty #else
662*0957b409SSimon J. Gerraty 
663*0957b409SSimon J. Gerraty /* see bearssl_block.h */
664*0957b409SSimon J. Gerraty const br_block_cbcdec_class *
br_aes_pwr8_cbcdec_get_vtable(void)665*0957b409SSimon J. Gerraty br_aes_pwr8_cbcdec_get_vtable(void)
666*0957b409SSimon J. Gerraty {
667*0957b409SSimon J. Gerraty 	return NULL;
668*0957b409SSimon J. Gerraty }
669*0957b409SSimon J. Gerraty 
670*0957b409SSimon J. Gerraty #endif
671