Linux Audio

Check our new training course

Linux kernel drivers training

May 6-19, 2025
Register
Loading...
v6.8
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2/*
  3 * Glue code for AES implementation for SPE instructions (PPC)
  4 *
  5 * Based on generic implementation. The assembler module takes care
  6 * about the SPE registers so it can run from interrupt context.
  7 *
  8 * Copyright (c) 2015 Markus Stockhausen <stockhausen@collogia.de>
 
 
 
 
 
 
  9 */
 10
 11#include <crypto/aes.h>
 12#include <linux/module.h>
 13#include <linux/init.h>
 14#include <linux/types.h>
 15#include <linux/errno.h>
 16#include <linux/crypto.h>
 17#include <asm/byteorder.h>
 18#include <asm/switch_to.h>
 19#include <crypto/algapi.h>
 20#include <crypto/internal/skcipher.h>
 21#include <crypto/xts.h>
 22#include <crypto/gf128mul.h>
 23#include <crypto/scatterwalk.h>
 24
 25/*
 26 * MAX_BYTES defines the number of bytes that are allowed to be processed
 27 * between preempt_disable() and preempt_enable(). e500 cores can issue two
 28 * instructions per clock cycle using one 32/64 bit unit (SU1) and one 32
 29 * bit unit (SU2). One of these can be a memory access that is executed via
 30 * a single load and store unit (LSU). XTS-AES-256 takes ~780 operations per
 31 * 16 byte block or 25 cycles per byte. Thus 768 bytes of input data
 32 * will need an estimated maximum of 20,000 cycles. Headroom for cache misses
 33 * included. Even with the low end model clocked at 667 MHz this equals to a
 34 * critical time window of less than 30us. The value has been chosen to
 35 * process a 512 byte disk block in one or a large 1400 bytes IPsec network
 36 * packet in two runs.
 37 *
 38 */
 39#define MAX_BYTES 768
 40
 41struct ppc_aes_ctx {
 42	u32 key_enc[AES_MAX_KEYLENGTH_U32];
 43	u32 key_dec[AES_MAX_KEYLENGTH_U32];
 44	u32 rounds;
 45};
 46
 47struct ppc_xts_ctx {
 48	u32 key_enc[AES_MAX_KEYLENGTH_U32];
 49	u32 key_dec[AES_MAX_KEYLENGTH_U32];
 50	u32 key_twk[AES_MAX_KEYLENGTH_U32];
 51	u32 rounds;
 52};
 53
 54extern void ppc_encrypt_aes(u8 *out, const u8 *in, u32 *key_enc, u32 rounds);
 55extern void ppc_decrypt_aes(u8 *out, const u8 *in, u32 *key_dec, u32 rounds);
 56extern void ppc_encrypt_ecb(u8 *out, const u8 *in, u32 *key_enc, u32 rounds,
 57			    u32 bytes);
 58extern void ppc_decrypt_ecb(u8 *out, const u8 *in, u32 *key_dec, u32 rounds,
 59			    u32 bytes);
 60extern void ppc_encrypt_cbc(u8 *out, const u8 *in, u32 *key_enc, u32 rounds,
 61			    u32 bytes, u8 *iv);
 62extern void ppc_decrypt_cbc(u8 *out, const u8 *in, u32 *key_dec, u32 rounds,
 63			    u32 bytes, u8 *iv);
 64extern void ppc_crypt_ctr  (u8 *out, const u8 *in, u32 *key_enc, u32 rounds,
 65			    u32 bytes, u8 *iv);
 66extern void ppc_encrypt_xts(u8 *out, const u8 *in, u32 *key_enc, u32 rounds,
 67			    u32 bytes, u8 *iv, u32 *key_twk);
 68extern void ppc_decrypt_xts(u8 *out, const u8 *in, u32 *key_dec, u32 rounds,
 69			    u32 bytes, u8 *iv, u32 *key_twk);
 70
 71extern void ppc_expand_key_128(u32 *key_enc, const u8 *key);
 72extern void ppc_expand_key_192(u32 *key_enc, const u8 *key);
 73extern void ppc_expand_key_256(u32 *key_enc, const u8 *key);
 74
 75extern void ppc_generate_decrypt_key(u32 *key_dec,u32 *key_enc,
 76				     unsigned int key_len);
 77
 78static void spe_begin(void)
 79{
 80	/* disable preemption and save users SPE registers if required */
 81	preempt_disable();
 82	enable_kernel_spe();
 83}
 84
 85static void spe_end(void)
 86{
 87	disable_kernel_spe();
 88	/* reenable preemption */
 89	preempt_enable();
 90}
 91
 92static int ppc_aes_setkey(struct crypto_tfm *tfm, const u8 *in_key,
 93		unsigned int key_len)
 94{
 95	struct ppc_aes_ctx *ctx = crypto_tfm_ctx(tfm);
 96
 
 
 
 
 
 
 
 97	switch (key_len) {
 98	case AES_KEYSIZE_128:
 99		ctx->rounds = 4;
100		ppc_expand_key_128(ctx->key_enc, in_key);
101		break;
102	case AES_KEYSIZE_192:
103		ctx->rounds = 5;
104		ppc_expand_key_192(ctx->key_enc, in_key);
105		break;
106	case AES_KEYSIZE_256:
107		ctx->rounds = 6;
108		ppc_expand_key_256(ctx->key_enc, in_key);
109		break;
110	default:
111		return -EINVAL;
112	}
113
114	ppc_generate_decrypt_key(ctx->key_dec, ctx->key_enc, key_len);
115
116	return 0;
117}
118
119static int ppc_aes_setkey_skcipher(struct crypto_skcipher *tfm,
120				   const u8 *in_key, unsigned int key_len)
121{
122	return ppc_aes_setkey(crypto_skcipher_tfm(tfm), in_key, key_len);
123}
124
125static int ppc_xts_setkey(struct crypto_skcipher *tfm, const u8 *in_key,
126		   unsigned int key_len)
127{
128	struct ppc_xts_ctx *ctx = crypto_skcipher_ctx(tfm);
129	int err;
130
131	err = xts_verify_key(tfm, in_key, key_len);
132	if (err)
133		return err;
134
135	key_len >>= 1;
136
 
 
 
 
 
 
 
137	switch (key_len) {
138	case AES_KEYSIZE_128:
139		ctx->rounds = 4;
140		ppc_expand_key_128(ctx->key_enc, in_key);
141		ppc_expand_key_128(ctx->key_twk, in_key + AES_KEYSIZE_128);
142		break;
143	case AES_KEYSIZE_192:
144		ctx->rounds = 5;
145		ppc_expand_key_192(ctx->key_enc, in_key);
146		ppc_expand_key_192(ctx->key_twk, in_key + AES_KEYSIZE_192);
147		break;
148	case AES_KEYSIZE_256:
149		ctx->rounds = 6;
150		ppc_expand_key_256(ctx->key_enc, in_key);
151		ppc_expand_key_256(ctx->key_twk, in_key + AES_KEYSIZE_256);
152		break;
153	default:
154		return -EINVAL;
155	}
156
157	ppc_generate_decrypt_key(ctx->key_dec, ctx->key_enc, key_len);
158
159	return 0;
160}
161
162static void ppc_aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
163{
164	struct ppc_aes_ctx *ctx = crypto_tfm_ctx(tfm);
165
166	spe_begin();
167	ppc_encrypt_aes(out, in, ctx->key_enc, ctx->rounds);
168	spe_end();
169}
170
171static void ppc_aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
172{
173	struct ppc_aes_ctx *ctx = crypto_tfm_ctx(tfm);
174
175	spe_begin();
176	ppc_decrypt_aes(out, in, ctx->key_dec, ctx->rounds);
177	spe_end();
178}
179
180static int ppc_ecb_crypt(struct skcipher_request *req, bool enc)
 
181{
182	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
183	struct ppc_aes_ctx *ctx = crypto_skcipher_ctx(tfm);
184	struct skcipher_walk walk;
185	unsigned int nbytes;
186	int err;
187
188	err = skcipher_walk_virt(&walk, req, false);
189
190	while ((nbytes = walk.nbytes) != 0) {
191		nbytes = min_t(unsigned int, nbytes, MAX_BYTES);
192		nbytes = round_down(nbytes, AES_BLOCK_SIZE);
 
 
 
193
194		spe_begin();
195		if (enc)
196			ppc_encrypt_ecb(walk.dst.virt.addr, walk.src.virt.addr,
197					ctx->key_enc, ctx->rounds, nbytes);
198		else
199			ppc_decrypt_ecb(walk.dst.virt.addr, walk.src.virt.addr,
200					ctx->key_dec, ctx->rounds, nbytes);
201		spe_end();
202
203		err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
204	}
205
206	return err;
207}
208
209static int ppc_ecb_encrypt(struct skcipher_request *req)
 
210{
211	return ppc_ecb_crypt(req, true);
212}
 
 
213
214static int ppc_ecb_decrypt(struct skcipher_request *req)
215{
216	return ppc_ecb_crypt(req, false);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217}
218
219static int ppc_cbc_crypt(struct skcipher_request *req, bool enc)
 
220{
221	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
222	struct ppc_aes_ctx *ctx = crypto_skcipher_ctx(tfm);
223	struct skcipher_walk walk;
224	unsigned int nbytes;
225	int err;
226
227	err = skcipher_walk_virt(&walk, req, false);
228
229	while ((nbytes = walk.nbytes) != 0) {
230		nbytes = min_t(unsigned int, nbytes, MAX_BYTES);
231		nbytes = round_down(nbytes, AES_BLOCK_SIZE);
 
 
 
232
233		spe_begin();
234		if (enc)
235			ppc_encrypt_cbc(walk.dst.virt.addr, walk.src.virt.addr,
236					ctx->key_enc, ctx->rounds, nbytes,
237					walk.iv);
238		else
239			ppc_decrypt_cbc(walk.dst.virt.addr, walk.src.virt.addr,
240					ctx->key_dec, ctx->rounds, nbytes,
241					walk.iv);
242		spe_end();
243
244		err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
245	}
246
247	return err;
248}
249
250static int ppc_cbc_encrypt(struct skcipher_request *req)
 
251{
252	return ppc_cbc_crypt(req, true);
253}
 
 
254
255static int ppc_cbc_decrypt(struct skcipher_request *req)
256{
257	return ppc_cbc_crypt(req, false);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
258}
259
260static int ppc_ctr_crypt(struct skcipher_request *req)
 
261{
262	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
263	struct ppc_aes_ctx *ctx = crypto_skcipher_ctx(tfm);
264	struct skcipher_walk walk;
265	unsigned int nbytes;
266	int err;
267
268	err = skcipher_walk_virt(&walk, req, false);
269
270	while ((nbytes = walk.nbytes) != 0) {
271		nbytes = min_t(unsigned int, nbytes, MAX_BYTES);
272		if (nbytes < walk.total)
273			nbytes = round_down(nbytes, AES_BLOCK_SIZE);
 
 
 
274
275		spe_begin();
276		ppc_crypt_ctr(walk.dst.virt.addr, walk.src.virt.addr,
277			      ctx->key_enc, ctx->rounds, nbytes, walk.iv);
278		spe_end();
279
280		err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
 
281	}
282
283	return err;
284}
285
286static int ppc_xts_crypt(struct skcipher_request *req, bool enc)
 
287{
288	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
289	struct ppc_xts_ctx *ctx = crypto_skcipher_ctx(tfm);
290	struct skcipher_walk walk;
291	unsigned int nbytes;
292	int err;
293	u32 *twk;
294
295	err = skcipher_walk_virt(&walk, req, false);
 
 
296	twk = ctx->key_twk;
297
298	while ((nbytes = walk.nbytes) != 0) {
299		nbytes = min_t(unsigned int, nbytes, MAX_BYTES);
300		nbytes = round_down(nbytes, AES_BLOCK_SIZE);
 
301
302		spe_begin();
303		if (enc)
304			ppc_encrypt_xts(walk.dst.virt.addr, walk.src.virt.addr,
305					ctx->key_enc, ctx->rounds, nbytes,
306					walk.iv, twk);
307		else
308			ppc_decrypt_xts(walk.dst.virt.addr, walk.src.virt.addr,
309					ctx->key_dec, ctx->rounds, nbytes,
310					walk.iv, twk);
311		spe_end();
312
313		twk = NULL;
314		err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
315	}
316
317	return err;
318}
319
320static int ppc_xts_encrypt(struct skcipher_request *req)
 
321{
322	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
323	struct ppc_xts_ctx *ctx = crypto_skcipher_ctx(tfm);
324	int tail = req->cryptlen % AES_BLOCK_SIZE;
325	int offset = req->cryptlen - tail - AES_BLOCK_SIZE;
326	struct skcipher_request subreq;
327	u8 b[2][AES_BLOCK_SIZE];
328	int err;
 
329
330	if (req->cryptlen < AES_BLOCK_SIZE)
331		return -EINVAL;
332
333	if (tail) {
334		subreq = *req;
335		skcipher_request_set_crypt(&subreq, req->src, req->dst,
336					   req->cryptlen - tail, req->iv);
337		req = &subreq;
338	}
339
340	err = ppc_xts_crypt(req, true);
341	if (err || !tail)
342		return err;
343
344	scatterwalk_map_and_copy(b[0], req->dst, offset, AES_BLOCK_SIZE, 0);
345	memcpy(b[1], b[0], tail);
346	scatterwalk_map_and_copy(b[0], req->src, offset + AES_BLOCK_SIZE, tail, 0);
347
348	spe_begin();
349	ppc_encrypt_xts(b[0], b[0], ctx->key_enc, ctx->rounds, AES_BLOCK_SIZE,
350			req->iv, NULL);
351	spe_end();
352
353	scatterwalk_map_and_copy(b[0], req->dst, offset, AES_BLOCK_SIZE + tail, 1);
354
355	return 0;
356}
 
 
357
358static int ppc_xts_decrypt(struct skcipher_request *req)
359{
360	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
361	struct ppc_xts_ctx *ctx = crypto_skcipher_ctx(tfm);
362	int tail = req->cryptlen % AES_BLOCK_SIZE;
363	int offset = req->cryptlen - tail - AES_BLOCK_SIZE;
364	struct skcipher_request subreq;
365	u8 b[3][AES_BLOCK_SIZE];
366	le128 twk;
367	int err;
368
369	if (req->cryptlen < AES_BLOCK_SIZE)
370		return -EINVAL;
371
372	if (tail) {
373		subreq = *req;
374		skcipher_request_set_crypt(&subreq, req->src, req->dst,
375					   offset, req->iv);
376		req = &subreq;
377	}
378
379	err = ppc_xts_crypt(req, false);
380	if (err || !tail)
381		return err;
382
383	scatterwalk_map_and_copy(b[1], req->src, offset, AES_BLOCK_SIZE + tail, 0);
384
385	spe_begin();
386	if (!offset)
387		ppc_encrypt_ecb(req->iv, req->iv, ctx->key_twk, ctx->rounds,
388				AES_BLOCK_SIZE);
389
390	gf128mul_x_ble(&twk, (le128 *)req->iv);
391
392	ppc_decrypt_xts(b[1], b[1], ctx->key_dec, ctx->rounds, AES_BLOCK_SIZE,
393			(u8 *)&twk, NULL);
394	memcpy(b[0], b[2], tail);
395	memcpy(b[0] + tail, b[1] + tail, AES_BLOCK_SIZE - tail);
396	ppc_decrypt_xts(b[0], b[0], ctx->key_dec, ctx->rounds, AES_BLOCK_SIZE,
397			req->iv, NULL);
398	spe_end();
399
400	scatterwalk_map_and_copy(b[0], req->dst, offset, AES_BLOCK_SIZE + tail, 1);
401
402	return 0;
403}
404
405/*
406 * Algorithm definitions. Disabling alignment (cra_alignmask=0) was chosen
407 * because the e500 platform can handle unaligned reads/writes very efficiently.
408 * This improves IPsec thoughput by another few percent. Additionally we assume
409 * that AES context is always aligned to at least 8 bytes because it is created
410 * with kmalloc() in the crypto infrastructure
 
411 */
412
413static struct crypto_alg aes_cipher_alg = {
414	.cra_name		=	"aes",
415	.cra_driver_name	=	"aes-ppc-spe",
416	.cra_priority		=	300,
417	.cra_flags		=	CRYPTO_ALG_TYPE_CIPHER,
418	.cra_blocksize		=	AES_BLOCK_SIZE,
419	.cra_ctxsize		=	sizeof(struct ppc_aes_ctx),
420	.cra_alignmask		=	0,
421	.cra_module		=	THIS_MODULE,
422	.cra_u			=	{
423		.cipher = {
424			.cia_min_keysize	=	AES_MIN_KEY_SIZE,
425			.cia_max_keysize	=	AES_MAX_KEY_SIZE,
426			.cia_setkey		=	ppc_aes_setkey,
427			.cia_encrypt		=	ppc_aes_encrypt,
428			.cia_decrypt		=	ppc_aes_decrypt
429		}
430	}
431};
432
433static struct skcipher_alg aes_skcipher_algs[] = {
434	{
435		.base.cra_name		=	"ecb(aes)",
436		.base.cra_driver_name	=	"ecb-ppc-spe",
437		.base.cra_priority	=	300,
438		.base.cra_blocksize	=	AES_BLOCK_SIZE,
439		.base.cra_ctxsize	=	sizeof(struct ppc_aes_ctx),
440		.base.cra_module	=	THIS_MODULE,
441		.min_keysize		=	AES_MIN_KEY_SIZE,
442		.max_keysize		=	AES_MAX_KEY_SIZE,
443		.setkey			=	ppc_aes_setkey_skcipher,
444		.encrypt		=	ppc_ecb_encrypt,
445		.decrypt		=	ppc_ecb_decrypt,
446	}, {
447		.base.cra_name		=	"cbc(aes)",
448		.base.cra_driver_name	=	"cbc-ppc-spe",
449		.base.cra_priority	=	300,
450		.base.cra_blocksize	=	AES_BLOCK_SIZE,
451		.base.cra_ctxsize	=	sizeof(struct ppc_aes_ctx),
452		.base.cra_module	=	THIS_MODULE,
453		.min_keysize		=	AES_MIN_KEY_SIZE,
454		.max_keysize		=	AES_MAX_KEY_SIZE,
455		.ivsize			=	AES_BLOCK_SIZE,
456		.setkey			=	ppc_aes_setkey_skcipher,
457		.encrypt		=	ppc_cbc_encrypt,
458		.decrypt		=	ppc_cbc_decrypt,
459	}, {
460		.base.cra_name		=	"ctr(aes)",
461		.base.cra_driver_name	=	"ctr-ppc-spe",
462		.base.cra_priority	=	300,
463		.base.cra_blocksize	=	1,
464		.base.cra_ctxsize	=	sizeof(struct ppc_aes_ctx),
465		.base.cra_module	=	THIS_MODULE,
466		.min_keysize		=	AES_MIN_KEY_SIZE,
467		.max_keysize		=	AES_MAX_KEY_SIZE,
468		.ivsize			=	AES_BLOCK_SIZE,
469		.setkey			=	ppc_aes_setkey_skcipher,
470		.encrypt		=	ppc_ctr_crypt,
471		.decrypt		=	ppc_ctr_crypt,
472		.chunksize		=	AES_BLOCK_SIZE,
473	}, {
474		.base.cra_name		=	"xts(aes)",
475		.base.cra_driver_name	=	"xts-ppc-spe",
476		.base.cra_priority	=	300,
477		.base.cra_blocksize	=	AES_BLOCK_SIZE,
478		.base.cra_ctxsize	=	sizeof(struct ppc_xts_ctx),
479		.base.cra_module	=	THIS_MODULE,
480		.min_keysize		=	AES_MIN_KEY_SIZE * 2,
481		.max_keysize		=	AES_MAX_KEY_SIZE * 2,
482		.ivsize			=	AES_BLOCK_SIZE,
483		.setkey			=	ppc_xts_setkey,
484		.encrypt		=	ppc_xts_encrypt,
485		.decrypt		=	ppc_xts_decrypt,
486	}
487};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
488
489static int __init ppc_aes_mod_init(void)
490{
491	int err;
492
493	err = crypto_register_alg(&aes_cipher_alg);
494	if (err)
495		return err;
496
497	err = crypto_register_skciphers(aes_skcipher_algs,
498					ARRAY_SIZE(aes_skcipher_algs));
499	if (err)
500		crypto_unregister_alg(&aes_cipher_alg);
501	return err;
502}
503
504static void __exit ppc_aes_mod_fini(void)
505{
506	crypto_unregister_alg(&aes_cipher_alg);
507	crypto_unregister_skciphers(aes_skcipher_algs,
508				    ARRAY_SIZE(aes_skcipher_algs));
509}
510
511module_init(ppc_aes_mod_init);
512module_exit(ppc_aes_mod_fini);
513
514MODULE_LICENSE("GPL");
515MODULE_DESCRIPTION("AES-ECB/CBC/CTR/XTS, SPE optimized");
516
517MODULE_ALIAS_CRYPTO("aes");
518MODULE_ALIAS_CRYPTO("ecb(aes)");
519MODULE_ALIAS_CRYPTO("cbc(aes)");
520MODULE_ALIAS_CRYPTO("ctr(aes)");
521MODULE_ALIAS_CRYPTO("xts(aes)");
522MODULE_ALIAS_CRYPTO("aes-ppc-spe");
v4.6
 
  1/*
  2 * Glue code for AES implementation for SPE instructions (PPC)
  3 *
  4 * Based on generic implementation. The assembler module takes care
  5 * about the SPE registers so it can run from interrupt context.
  6 *
  7 * Copyright (c) 2015 Markus Stockhausen <stockhausen@collogia.de>
  8 *
  9 * This program is free software; you can redistribute it and/or modify it
 10 * under the terms of the GNU General Public License as published by the Free
 11 * Software Foundation; either version 2 of the License, or (at your option)
 12 * any later version.
 13 *
 14 */
 15
 16#include <crypto/aes.h>
 17#include <linux/module.h>
 18#include <linux/init.h>
 19#include <linux/types.h>
 20#include <linux/errno.h>
 21#include <linux/crypto.h>
 22#include <asm/byteorder.h>
 23#include <asm/switch_to.h>
 24#include <crypto/algapi.h>
 
 25#include <crypto/xts.h>
 
 
 26
 27/*
 28 * MAX_BYTES defines the number of bytes that are allowed to be processed
 29 * between preempt_disable() and preempt_enable(). e500 cores can issue two
 30 * instructions per clock cycle using one 32/64 bit unit (SU1) and one 32
 31 * bit unit (SU2). One of these can be a memory access that is executed via
 32 * a single load and store unit (LSU). XTS-AES-256 takes ~780 operations per
 33 * 16 byte block block or 25 cycles per byte. Thus 768 bytes of input data
 34 * will need an estimated maximum of 20,000 cycles. Headroom for cache misses
 35 * included. Even with the low end model clocked at 667 MHz this equals to a
 36 * critical time window of less than 30us. The value has been chosen to
 37 * process a 512 byte disk block in one or a large 1400 bytes IPsec network
 38 * packet in two runs.
 39 *
 40 */
 41#define MAX_BYTES 768
 42
 43struct ppc_aes_ctx {
 44	u32 key_enc[AES_MAX_KEYLENGTH_U32];
 45	u32 key_dec[AES_MAX_KEYLENGTH_U32];
 46	u32 rounds;
 47};
 48
 49struct ppc_xts_ctx {
 50	u32 key_enc[AES_MAX_KEYLENGTH_U32];
 51	u32 key_dec[AES_MAX_KEYLENGTH_U32];
 52	u32 key_twk[AES_MAX_KEYLENGTH_U32];
 53	u32 rounds;
 54};
 55
 56extern void ppc_encrypt_aes(u8 *out, const u8 *in, u32 *key_enc, u32 rounds);
 57extern void ppc_decrypt_aes(u8 *out, const u8 *in, u32 *key_dec, u32 rounds);
 58extern void ppc_encrypt_ecb(u8 *out, const u8 *in, u32 *key_enc, u32 rounds,
 59			    u32 bytes);
 60extern void ppc_decrypt_ecb(u8 *out, const u8 *in, u32 *key_dec, u32 rounds,
 61			    u32 bytes);
 62extern void ppc_encrypt_cbc(u8 *out, const u8 *in, u32 *key_enc, u32 rounds,
 63			    u32 bytes, u8 *iv);
 64extern void ppc_decrypt_cbc(u8 *out, const u8 *in, u32 *key_dec, u32 rounds,
 65			    u32 bytes, u8 *iv);
 66extern void ppc_crypt_ctr  (u8 *out, const u8 *in, u32 *key_enc, u32 rounds,
 67			    u32 bytes, u8 *iv);
 68extern void ppc_encrypt_xts(u8 *out, const u8 *in, u32 *key_enc, u32 rounds,
 69			    u32 bytes, u8 *iv, u32 *key_twk);
 70extern void ppc_decrypt_xts(u8 *out, const u8 *in, u32 *key_dec, u32 rounds,
 71			    u32 bytes, u8 *iv, u32 *key_twk);
 72
 73extern void ppc_expand_key_128(u32 *key_enc, const u8 *key);
 74extern void ppc_expand_key_192(u32 *key_enc, const u8 *key);
 75extern void ppc_expand_key_256(u32 *key_enc, const u8 *key);
 76
 77extern void ppc_generate_decrypt_key(u32 *key_dec,u32 *key_enc,
 78				     unsigned int key_len);
 79
 80static void spe_begin(void)
 81{
 82	/* disable preemption and save users SPE registers if required */
 83	preempt_disable();
 84	enable_kernel_spe();
 85}
 86
 87static void spe_end(void)
 88{
 89	disable_kernel_spe();
 90	/* reenable preemption */
 91	preempt_enable();
 92}
 93
 94static int ppc_aes_setkey(struct crypto_tfm *tfm, const u8 *in_key,
 95		unsigned int key_len)
 96{
 97	struct ppc_aes_ctx *ctx = crypto_tfm_ctx(tfm);
 98
 99	if (key_len != AES_KEYSIZE_128 &&
100	    key_len != AES_KEYSIZE_192 &&
101	    key_len != AES_KEYSIZE_256) {
102		tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
103		return -EINVAL;
104	}
105
106	switch (key_len) {
107	case AES_KEYSIZE_128:
108		ctx->rounds = 4;
109		ppc_expand_key_128(ctx->key_enc, in_key);
110		break;
111	case AES_KEYSIZE_192:
112		ctx->rounds = 5;
113		ppc_expand_key_192(ctx->key_enc, in_key);
114		break;
115	case AES_KEYSIZE_256:
116		ctx->rounds = 6;
117		ppc_expand_key_256(ctx->key_enc, in_key);
118		break;
 
 
119	}
120
121	ppc_generate_decrypt_key(ctx->key_dec, ctx->key_enc, key_len);
122
123	return 0;
124}
125
126static int ppc_xts_setkey(struct crypto_tfm *tfm, const u8 *in_key,
 
 
 
 
 
 
127		   unsigned int key_len)
128{
129	struct ppc_xts_ctx *ctx = crypto_tfm_ctx(tfm);
130	int err;
131
132	err = xts_check_key(tfm, in_key, key_len);
133	if (err)
134		return err;
135
136	key_len >>= 1;
137
138	if (key_len != AES_KEYSIZE_128 &&
139	    key_len != AES_KEYSIZE_192 &&
140	    key_len != AES_KEYSIZE_256) {
141		tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
142		return -EINVAL;
143	}
144
145	switch (key_len) {
146	case AES_KEYSIZE_128:
147		ctx->rounds = 4;
148		ppc_expand_key_128(ctx->key_enc, in_key);
149		ppc_expand_key_128(ctx->key_twk, in_key + AES_KEYSIZE_128);
150		break;
151	case AES_KEYSIZE_192:
152		ctx->rounds = 5;
153		ppc_expand_key_192(ctx->key_enc, in_key);
154		ppc_expand_key_192(ctx->key_twk, in_key + AES_KEYSIZE_192);
155		break;
156	case AES_KEYSIZE_256:
157		ctx->rounds = 6;
158		ppc_expand_key_256(ctx->key_enc, in_key);
159		ppc_expand_key_256(ctx->key_twk, in_key + AES_KEYSIZE_256);
160		break;
 
 
161	}
162
163	ppc_generate_decrypt_key(ctx->key_dec, ctx->key_enc, key_len);
164
165	return 0;
166}
167
168static void ppc_aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
169{
170	struct ppc_aes_ctx *ctx = crypto_tfm_ctx(tfm);
171
172	spe_begin();
173	ppc_encrypt_aes(out, in, ctx->key_enc, ctx->rounds);
174	spe_end();
175}
176
177static void ppc_aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
178{
179	struct ppc_aes_ctx *ctx = crypto_tfm_ctx(tfm);
180
181	spe_begin();
182	ppc_decrypt_aes(out, in, ctx->key_dec, ctx->rounds);
183	spe_end();
184}
185
186static int ppc_ecb_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
187			   struct scatterlist *src, unsigned int nbytes)
188{
189	struct ppc_aes_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
190	struct blkcipher_walk walk;
191	unsigned int ubytes;
 
192	int err;
193
194	desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
195	blkcipher_walk_init(&walk, dst, src, nbytes);
196	err = blkcipher_walk_virt(desc, &walk);
197
198	while ((nbytes = walk.nbytes)) {
199		ubytes = nbytes > MAX_BYTES ?
200			 nbytes - MAX_BYTES : nbytes & (AES_BLOCK_SIZE - 1);
201		nbytes -= ubytes;
202
203		spe_begin();
204		ppc_encrypt_ecb(walk.dst.virt.addr, walk.src.virt.addr,
205				ctx->key_enc, ctx->rounds, nbytes);
 
 
 
 
206		spe_end();
207
208		err = blkcipher_walk_done(desc, &walk, ubytes);
209	}
210
211	return err;
212}
213
214static int ppc_ecb_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
215			   struct scatterlist *src, unsigned int nbytes)
216{
217	struct ppc_aes_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
218	struct blkcipher_walk walk;
219	unsigned int ubytes;
220	int err;
221
222	desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
223	blkcipher_walk_init(&walk, dst, src, nbytes);
224	err = blkcipher_walk_virt(desc, &walk);
225
226	while ((nbytes = walk.nbytes)) {
227		ubytes = nbytes > MAX_BYTES ?
228			 nbytes - MAX_BYTES : nbytes & (AES_BLOCK_SIZE - 1);
229		nbytes -= ubytes;
230
231		spe_begin();
232		ppc_decrypt_ecb(walk.dst.virt.addr, walk.src.virt.addr,
233				ctx->key_dec, ctx->rounds, nbytes);
234		spe_end();
235
236		err = blkcipher_walk_done(desc, &walk, ubytes);
237	}
238
239	return err;
240}
241
242static int ppc_cbc_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
243			   struct scatterlist *src, unsigned int nbytes)
244{
245	struct ppc_aes_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
246	struct blkcipher_walk walk;
247	unsigned int ubytes;
 
248	int err;
249
250	desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
251	blkcipher_walk_init(&walk, dst, src, nbytes);
252	err = blkcipher_walk_virt(desc, &walk);
253
254	while ((nbytes = walk.nbytes)) {
255		ubytes = nbytes > MAX_BYTES ?
256			 nbytes - MAX_BYTES : nbytes & (AES_BLOCK_SIZE - 1);
257		nbytes -= ubytes;
258
259		spe_begin();
260		ppc_encrypt_cbc(walk.dst.virt.addr, walk.src.virt.addr,
261				ctx->key_enc, ctx->rounds, nbytes, walk.iv);
 
 
 
 
 
 
262		spe_end();
263
264		err = blkcipher_walk_done(desc, &walk, ubytes);
265	}
266
267	return err;
268}
269
270static int ppc_cbc_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
271			   struct scatterlist *src, unsigned int nbytes)
272{
273	struct ppc_aes_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
274	struct blkcipher_walk walk;
275	unsigned int ubytes;
276	int err;
277
278	desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
279	blkcipher_walk_init(&walk, dst, src, nbytes);
280	err = blkcipher_walk_virt(desc, &walk);
281
282	while ((nbytes = walk.nbytes)) {
283		ubytes = nbytes > MAX_BYTES ?
284			 nbytes - MAX_BYTES : nbytes & (AES_BLOCK_SIZE - 1);
285		nbytes -= ubytes;
286
287		spe_begin();
288		ppc_decrypt_cbc(walk.dst.virt.addr, walk.src.virt.addr,
289				ctx->key_dec, ctx->rounds, nbytes, walk.iv);
290		spe_end();
291
292		err = blkcipher_walk_done(desc, &walk, ubytes);
293	}
294
295	return err;
296}
297
298static int ppc_ctr_crypt(struct blkcipher_desc *desc, struct scatterlist *dst,
299			 struct scatterlist *src, unsigned int nbytes)
300{
301	struct ppc_aes_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
302	struct blkcipher_walk walk;
303	unsigned int pbytes, ubytes;
 
304	int err;
305
306	desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
307	blkcipher_walk_init(&walk, dst, src, nbytes);
308	err = blkcipher_walk_virt_block(desc, &walk, AES_BLOCK_SIZE);
309
310	while ((pbytes = walk.nbytes)) {
311		pbytes = pbytes > MAX_BYTES ? MAX_BYTES : pbytes;
312		pbytes = pbytes == nbytes ?
313			 nbytes : pbytes & ~(AES_BLOCK_SIZE - 1);
314		ubytes = walk.nbytes - pbytes;
315
316		spe_begin();
317		ppc_crypt_ctr(walk.dst.virt.addr, walk.src.virt.addr,
318			      ctx->key_enc, ctx->rounds, pbytes , walk.iv);
319		spe_end();
320
321		nbytes -= pbytes;
322		err = blkcipher_walk_done(desc, &walk, ubytes);
323	}
324
325	return err;
326}
327
328static int ppc_xts_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
329			   struct scatterlist *src, unsigned int nbytes)
330{
331	struct ppc_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
332	struct blkcipher_walk walk;
333	unsigned int ubytes;
 
334	int err;
335	u32 *twk;
336
337	desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
338	blkcipher_walk_init(&walk, dst, src, nbytes);
339	err = blkcipher_walk_virt(desc, &walk);
340	twk = ctx->key_twk;
341
342	while ((nbytes = walk.nbytes)) {
343		ubytes = nbytes > MAX_BYTES ?
344			 nbytes - MAX_BYTES : nbytes & (AES_BLOCK_SIZE - 1);
345		nbytes -= ubytes;
346
347		spe_begin();
348		ppc_encrypt_xts(walk.dst.virt.addr, walk.src.virt.addr,
349				ctx->key_enc, ctx->rounds, nbytes, walk.iv, twk);
 
 
 
 
 
 
350		spe_end();
351
352		twk = NULL;
353		err = blkcipher_walk_done(desc, &walk, ubytes);
354	}
355
356	return err;
357}
358
359static int ppc_xts_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
360			   struct scatterlist *src, unsigned int nbytes)
361{
362	struct ppc_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
363	struct blkcipher_walk walk;
364	unsigned int ubytes;
 
 
 
365	int err;
366	u32 *twk;
367
368	desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
369	blkcipher_walk_init(&walk, dst, src, nbytes);
370	err = blkcipher_walk_virt(desc, &walk);
371	twk = ctx->key_twk;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
372
373	while ((nbytes = walk.nbytes)) {
374		ubytes = nbytes > MAX_BYTES ?
375			 nbytes - MAX_BYTES : nbytes & (AES_BLOCK_SIZE - 1);
376		nbytes -= ubytes;
377
378		spe_begin();
379		ppc_decrypt_xts(walk.dst.virt.addr, walk.src.virt.addr,
380				ctx->key_dec, ctx->rounds, nbytes, walk.iv, twk);
381		spe_end();
 
 
 
 
 
 
 
 
 
382
383		twk = NULL;
384		err = blkcipher_walk_done(desc, &walk, ubytes);
 
 
 
385	}
386
387	return err;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
388}
389
390/*
391 * Algorithm definitions. Disabling alignment (cra_alignmask=0) was chosen
392 * because the e500 platform can handle unaligned reads/writes very efficently.
393 * This improves IPsec thoughput by another few percent. Additionally we assume
394 * that AES context is always aligned to at least 8 bytes because it is created
395 * with kmalloc() in the crypto infrastructure
396 *
397 */
398static struct crypto_alg aes_algs[] = { {
 
399	.cra_name		=	"aes",
400	.cra_driver_name	=	"aes-ppc-spe",
401	.cra_priority		=	300,
402	.cra_flags		=	CRYPTO_ALG_TYPE_CIPHER,
403	.cra_blocksize		=	AES_BLOCK_SIZE,
404	.cra_ctxsize		=	sizeof(struct ppc_aes_ctx),
405	.cra_alignmask		=	0,
406	.cra_module		=	THIS_MODULE,
407	.cra_u			=	{
408		.cipher = {
409			.cia_min_keysize	=	AES_MIN_KEY_SIZE,
410			.cia_max_keysize	=	AES_MAX_KEY_SIZE,
411			.cia_setkey		=	ppc_aes_setkey,
412			.cia_encrypt		=	ppc_aes_encrypt,
413			.cia_decrypt		=	ppc_aes_decrypt
414		}
415	}
416}, {
417	.cra_name		=	"ecb(aes)",
418	.cra_driver_name	=	"ecb-ppc-spe",
419	.cra_priority		=	300,
420	.cra_flags		=	CRYPTO_ALG_TYPE_BLKCIPHER,
421	.cra_blocksize		=	AES_BLOCK_SIZE,
422	.cra_ctxsize		=	sizeof(struct ppc_aes_ctx),
423	.cra_alignmask		=	0,
424	.cra_type		=	&crypto_blkcipher_type,
425	.cra_module		=	THIS_MODULE,
426	.cra_u = {
427		.blkcipher = {
428			.min_keysize		=	AES_MIN_KEY_SIZE,
429			.max_keysize		=	AES_MAX_KEY_SIZE,
430			.ivsize			=	AES_BLOCK_SIZE,
431			.setkey			=	ppc_aes_setkey,
432			.encrypt		=	ppc_ecb_encrypt,
433			.decrypt		=	ppc_ecb_decrypt,
434		}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
435	}
436}, {
437	.cra_name		=	"cbc(aes)",
438	.cra_driver_name	=	"cbc-ppc-spe",
439	.cra_priority		=	300,
440	.cra_flags		=	CRYPTO_ALG_TYPE_BLKCIPHER,
441	.cra_blocksize		=	AES_BLOCK_SIZE,
442	.cra_ctxsize		=	sizeof(struct ppc_aes_ctx),
443	.cra_alignmask		=	0,
444	.cra_type		=	&crypto_blkcipher_type,
445	.cra_module		=	THIS_MODULE,
446	.cra_u = {
447		.blkcipher = {
448			.min_keysize		=	AES_MIN_KEY_SIZE,
449			.max_keysize		=	AES_MAX_KEY_SIZE,
450			.ivsize			=	AES_BLOCK_SIZE,
451			.setkey			=	ppc_aes_setkey,
452			.encrypt		=	ppc_cbc_encrypt,
453			.decrypt		=	ppc_cbc_decrypt,
454		}
455	}
456}, {
457	.cra_name		=	"ctr(aes)",
458	.cra_driver_name	=	"ctr-ppc-spe",
459	.cra_priority		=	300,
460	.cra_flags		=	CRYPTO_ALG_TYPE_BLKCIPHER,
461	.cra_blocksize		=	1,
462	.cra_ctxsize		=	sizeof(struct ppc_aes_ctx),
463	.cra_alignmask		=	0,
464	.cra_type		=	&crypto_blkcipher_type,
465	.cra_module		=	THIS_MODULE,
466	.cra_u = {
467		.blkcipher = {
468			.min_keysize		=	AES_MIN_KEY_SIZE,
469			.max_keysize		=	AES_MAX_KEY_SIZE,
470			.ivsize			=	AES_BLOCK_SIZE,
471			.setkey			=	ppc_aes_setkey,
472			.encrypt		=	ppc_ctr_crypt,
473			.decrypt		=	ppc_ctr_crypt,
474		}
475	}
476}, {
477	.cra_name		=	"xts(aes)",
478	.cra_driver_name	=	"xts-ppc-spe",
479	.cra_priority		=	300,
480	.cra_flags		=	CRYPTO_ALG_TYPE_BLKCIPHER,
481	.cra_blocksize		=	AES_BLOCK_SIZE,
482	.cra_ctxsize		=	sizeof(struct ppc_xts_ctx),
483	.cra_alignmask		=	0,
484	.cra_type		=	&crypto_blkcipher_type,
485	.cra_module		=	THIS_MODULE,
486	.cra_u = {
487		.blkcipher = {
488			.min_keysize		=	AES_MIN_KEY_SIZE * 2,
489			.max_keysize		=	AES_MAX_KEY_SIZE * 2,
490			.ivsize			=	AES_BLOCK_SIZE,
491			.setkey			=	ppc_xts_setkey,
492			.encrypt		=	ppc_xts_encrypt,
493			.decrypt		=	ppc_xts_decrypt,
494		}
495	}
496} };
497
498static int __init ppc_aes_mod_init(void)
499{
500	return crypto_register_algs(aes_algs, ARRAY_SIZE(aes_algs));
 
 
 
 
 
 
 
 
 
 
501}
502
503static void __exit ppc_aes_mod_fini(void)
504{
505	crypto_unregister_algs(aes_algs, ARRAY_SIZE(aes_algs));
 
 
506}
507
508module_init(ppc_aes_mod_init);
509module_exit(ppc_aes_mod_fini);
510
511MODULE_LICENSE("GPL");
512MODULE_DESCRIPTION("AES-ECB/CBC/CTR/XTS, SPE optimized");
513
514MODULE_ALIAS_CRYPTO("aes");
515MODULE_ALIAS_CRYPTO("ecb(aes)");
516MODULE_ALIAS_CRYPTO("cbc(aes)");
517MODULE_ALIAS_CRYPTO("ctr(aes)");
518MODULE_ALIAS_CRYPTO("xts(aes)");
519MODULE_ALIAS_CRYPTO("aes-ppc-spe");