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