File Index
Files and directories
Sign in
FILE

aes-glue.c

File preview with syntax highlighting.

linux-6.19.14/arch/arm64/crypto/aes-glue.c C
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * linux/arch/arm64/crypto/aes-glue.c - wrapper code for ARMv8 AES
  4 *
  5 * Copyright (C) 2013 - 2017 Linaro Ltd <ard.biesheuvel@linaro.org>
  6 */
  7
  8#include <crypto/aes.h>
  9#include <crypto/ctr.h>
 10#include <crypto/internal/hash.h>
 11#include <crypto/internal/skcipher.h>
 12#include <crypto/scatterwalk.h>
 13#include <crypto/sha2.h>
 14#include <crypto/utils.h>
 15#include <crypto/xts.h>
 16#include <linux/cpufeature.h>
 17#include <linux/kernel.h>
 18#include <linux/module.h>
 19#include <linux/string.h>
 20
 21#include <asm/hwcap.h>
 22#include <asm/simd.h>
 23
 24#include "aes-ce-setkey.h"
 25
 26#ifdef USE_V8_CRYPTO_EXTENSIONS
 27#define MODE			"ce"
 28#define PRIO			300
 29#define aes_expandkey		ce_aes_expandkey
 30#define aes_ecb_encrypt		ce_aes_ecb_encrypt
 31#define aes_ecb_decrypt		ce_aes_ecb_decrypt
 32#define aes_cbc_encrypt		ce_aes_cbc_encrypt
 33#define aes_cbc_decrypt		ce_aes_cbc_decrypt
 34#define aes_cbc_cts_encrypt	ce_aes_cbc_cts_encrypt
 35#define aes_cbc_cts_decrypt	ce_aes_cbc_cts_decrypt
 36#define aes_essiv_cbc_encrypt	ce_aes_essiv_cbc_encrypt
 37#define aes_essiv_cbc_decrypt	ce_aes_essiv_cbc_decrypt
 38#define aes_ctr_encrypt		ce_aes_ctr_encrypt
 39#define aes_xctr_encrypt	ce_aes_xctr_encrypt
 40#define aes_xts_encrypt		ce_aes_xts_encrypt
 41#define aes_xts_decrypt		ce_aes_xts_decrypt
 42#define aes_mac_update		ce_aes_mac_update
 43MODULE_DESCRIPTION("AES-ECB/CBC/CTR/XTS/XCTR using ARMv8 Crypto Extensions");
 44#else
 45#define MODE			"neon"
 46#define PRIO			200
 47#define aes_ecb_encrypt		neon_aes_ecb_encrypt
 48#define aes_ecb_decrypt		neon_aes_ecb_decrypt
 49#define aes_cbc_encrypt		neon_aes_cbc_encrypt
 50#define aes_cbc_decrypt		neon_aes_cbc_decrypt
 51#define aes_cbc_cts_encrypt	neon_aes_cbc_cts_encrypt
 52#define aes_cbc_cts_decrypt	neon_aes_cbc_cts_decrypt
 53#define aes_essiv_cbc_encrypt	neon_aes_essiv_cbc_encrypt
 54#define aes_essiv_cbc_decrypt	neon_aes_essiv_cbc_decrypt
 55#define aes_ctr_encrypt		neon_aes_ctr_encrypt
 56#define aes_xctr_encrypt	neon_aes_xctr_encrypt
 57#define aes_xts_encrypt		neon_aes_xts_encrypt
 58#define aes_xts_decrypt		neon_aes_xts_decrypt
 59#define aes_mac_update		neon_aes_mac_update
 60MODULE_DESCRIPTION("AES-ECB/CBC/CTR/XTS/XCTR using ARMv8 NEON");
 61#endif
 62#if defined(USE_V8_CRYPTO_EXTENSIONS) || !IS_ENABLED(CONFIG_CRYPTO_AES_ARM64_BS)
 63MODULE_ALIAS_CRYPTO("ecb(aes)");
 64MODULE_ALIAS_CRYPTO("cbc(aes)");
 65MODULE_ALIAS_CRYPTO("ctr(aes)");
 66MODULE_ALIAS_CRYPTO("xts(aes)");
 67MODULE_ALIAS_CRYPTO("xctr(aes)");
 68#endif
 69MODULE_ALIAS_CRYPTO("cts(cbc(aes))");
 70MODULE_ALIAS_CRYPTO("essiv(cbc(aes),sha256)");
 71MODULE_ALIAS_CRYPTO("cmac(aes)");
 72MODULE_ALIAS_CRYPTO("xcbc(aes)");
 73MODULE_ALIAS_CRYPTO("cbcmac(aes)");
 74
 75MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
 76MODULE_LICENSE("GPL v2");
 77
 78/* defined in aes-modes.S */
 79asmlinkage void aes_ecb_encrypt(u8 out[], u8 const in[], u32 const rk[],
 80				int rounds, int blocks);
 81asmlinkage void aes_ecb_decrypt(u8 out[], u8 const in[], u32 const rk[],
 82				int rounds, int blocks);
 83
 84asmlinkage void aes_cbc_encrypt(u8 out[], u8 const in[], u32 const rk[],
 85				int rounds, int blocks, u8 iv[]);
 86asmlinkage void aes_cbc_decrypt(u8 out[], u8 const in[], u32 const rk[],
 87				int rounds, int blocks, u8 iv[]);
 88
 89asmlinkage void aes_cbc_cts_encrypt(u8 out[], u8 const in[], u32 const rk[],
 90				int rounds, int bytes, u8 const iv[]);
 91asmlinkage void aes_cbc_cts_decrypt(u8 out[], u8 const in[], u32 const rk[],
 92				int rounds, int bytes, u8 const iv[]);
 93
 94asmlinkage void aes_ctr_encrypt(u8 out[], u8 const in[], u32 const rk[],
 95				int rounds, int bytes, u8 ctr[]);
 96
 97asmlinkage void aes_xctr_encrypt(u8 out[], u8 const in[], u32 const rk[],
 98				 int rounds, int bytes, u8 ctr[], int byte_ctr);
 99
100asmlinkage void aes_xts_encrypt(u8 out[], u8 const in[], u32 const rk1[],
101				int rounds, int bytes, u32 const rk2[], u8 iv[],
102				int first);
103asmlinkage void aes_xts_decrypt(u8 out[], u8 const in[], u32 const rk1[],
104				int rounds, int bytes, u32 const rk2[], u8 iv[],
105				int first);
106
107asmlinkage void aes_essiv_cbc_encrypt(u8 out[], u8 const in[], u32 const rk1[],
108				      int rounds, int blocks, u8 iv[],
109				      u32 const rk2[]);
110asmlinkage void aes_essiv_cbc_decrypt(u8 out[], u8 const in[], u32 const rk1[],
111				      int rounds, int blocks, u8 iv[],
112				      u32 const rk2[]);
113
114asmlinkage int aes_mac_update(u8 const in[], u32 const rk[], int rounds,
115			      int blocks, u8 dg[], int enc_before,
116			      int enc_after);
117
118struct crypto_aes_xts_ctx {
119	struct crypto_aes_ctx key1;
120	struct crypto_aes_ctx __aligned(8) key2;
121};
122
123struct crypto_aes_essiv_cbc_ctx {
124	struct crypto_aes_ctx key1;
125	struct crypto_aes_ctx __aligned(8) key2;
126};
127
128struct mac_tfm_ctx {
129	struct crypto_aes_ctx key;
130	u8 __aligned(8) consts[];
131};
132
133struct mac_desc_ctx {
134	u8 dg[AES_BLOCK_SIZE];
135};
136
137static int skcipher_aes_setkey(struct crypto_skcipher *tfm, const u8 *in_key,
138			       unsigned int key_len)
139{
140	struct crypto_aes_ctx *ctx = crypto_skcipher_ctx(tfm);
141
142	return aes_expandkey(ctx, in_key, key_len);
143}
144
145static int __maybe_unused xts_set_key(struct crypto_skcipher *tfm,
146				      const u8 *in_key, unsigned int key_len)
147{
148	struct crypto_aes_xts_ctx *ctx = crypto_skcipher_ctx(tfm);
149	int ret;
150
151	ret = xts_verify_key(tfm, in_key, key_len);
152	if (ret)
153		return ret;
154
155	ret = aes_expandkey(&ctx->key1, in_key, key_len / 2);
156	if (!ret)
157		ret = aes_expandkey(&ctx->key2, &in_key[key_len / 2],
158				    key_len / 2);
159	return ret;
160}
161
162static int __maybe_unused essiv_cbc_set_key(struct crypto_skcipher *tfm,
163					    const u8 *in_key,
164					    unsigned int key_len)
165{
166	struct crypto_aes_essiv_cbc_ctx *ctx = crypto_skcipher_ctx(tfm);
167	u8 digest[SHA256_DIGEST_SIZE];
168	int ret;
169
170	ret = aes_expandkey(&ctx->key1, in_key, key_len);
171	if (ret)
172		return ret;
173
174	sha256(in_key, key_len, digest);
175
176	return aes_expandkey(&ctx->key2, digest, sizeof(digest));
177}
178
179static int __maybe_unused ecb_encrypt(struct skcipher_request *req)
180{
181	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
182	struct crypto_aes_ctx *ctx = crypto_skcipher_ctx(tfm);
183	int err, rounds = 6 + ctx->key_length / 4;
184	struct skcipher_walk walk;
185	unsigned int blocks;
186
187	err = skcipher_walk_virt(&walk, req, false);
188
189	while ((blocks = (walk.nbytes / AES_BLOCK_SIZE))) {
190		scoped_ksimd()
191			aes_ecb_encrypt(walk.dst.virt.addr, walk.src.virt.addr,
192					ctx->key_enc, rounds, blocks);
193		err = skcipher_walk_done(&walk, walk.nbytes % AES_BLOCK_SIZE);
194	}
195	return err;
196}
197
198static int __maybe_unused ecb_decrypt(struct skcipher_request *req)
199{
200	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
201	struct crypto_aes_ctx *ctx = crypto_skcipher_ctx(tfm);
202	int err, rounds = 6 + ctx->key_length / 4;
203	struct skcipher_walk walk;
204	unsigned int blocks;
205
206	err = skcipher_walk_virt(&walk, req, false);
207
208	while ((blocks = (walk.nbytes / AES_BLOCK_SIZE))) {
209		scoped_ksimd()
210			aes_ecb_decrypt(walk.dst.virt.addr, walk.src.virt.addr,
211					ctx->key_dec, rounds, blocks);
212		err = skcipher_walk_done(&walk, walk.nbytes % AES_BLOCK_SIZE);
213	}
214	return err;
215}
216
217static int cbc_encrypt_walk(struct skcipher_request *req,
218			    struct skcipher_walk *walk)
219{
220	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
221	struct crypto_aes_ctx *ctx = crypto_skcipher_ctx(tfm);
222	int err = 0, rounds = 6 + ctx->key_length / 4;
223	unsigned int blocks;
224
225	while ((blocks = (walk->nbytes / AES_BLOCK_SIZE))) {
226		scoped_ksimd()
227			aes_cbc_encrypt(walk->dst.virt.addr, walk->src.virt.addr,
228					ctx->key_enc, rounds, blocks, walk->iv);
229		err = skcipher_walk_done(walk, walk->nbytes % AES_BLOCK_SIZE);
230	}
231	return err;
232}
233
234static int __maybe_unused cbc_encrypt(struct skcipher_request *req)
235{
236	struct skcipher_walk walk;
237	int err;
238
239	err = skcipher_walk_virt(&walk, req, false);
240	if (err)
241		return err;
242	return cbc_encrypt_walk(req, &walk);
243}
244
245static int cbc_decrypt_walk(struct skcipher_request *req,
246			    struct skcipher_walk *walk)
247{
248	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
249	struct crypto_aes_ctx *ctx = crypto_skcipher_ctx(tfm);
250	int err = 0, rounds = 6 + ctx->key_length / 4;
251	unsigned int blocks;
252
253	while ((blocks = (walk->nbytes / AES_BLOCK_SIZE))) {
254		scoped_ksimd()
255			aes_cbc_decrypt(walk->dst.virt.addr, walk->src.virt.addr,
256					ctx->key_dec, rounds, blocks, walk->iv);
257		err = skcipher_walk_done(walk, walk->nbytes % AES_BLOCK_SIZE);
258	}
259	return err;
260}
261
262static int __maybe_unused cbc_decrypt(struct skcipher_request *req)
263{
264	struct skcipher_walk walk;
265	int err;
266
267	err = skcipher_walk_virt(&walk, req, false);
268	if (err)
269		return err;
270	return cbc_decrypt_walk(req, &walk);
271}
272
273static int cts_cbc_encrypt(struct skcipher_request *req)
274{
275	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
276	struct crypto_aes_ctx *ctx = crypto_skcipher_ctx(tfm);
277	int err, rounds = 6 + ctx->key_length / 4;
278	int cbc_blocks = DIV_ROUND_UP(req->cryptlen, AES_BLOCK_SIZE) - 2;
279	struct scatterlist *src = req->src, *dst = req->dst;
280	struct scatterlist sg_src[2], sg_dst[2];
281	struct skcipher_request subreq;
282	struct skcipher_walk walk;
283
284	skcipher_request_set_tfm(&subreq, tfm);
285	skcipher_request_set_callback(&subreq, skcipher_request_flags(req),
286				      NULL, NULL);
287
288	if (req->cryptlen <= AES_BLOCK_SIZE) {
289		if (req->cryptlen < AES_BLOCK_SIZE)
290			return -EINVAL;
291		cbc_blocks = 1;
292	}
293
294	if (cbc_blocks > 0) {
295		skcipher_request_set_crypt(&subreq, req->src, req->dst,
296					   cbc_blocks * AES_BLOCK_SIZE,
297					   req->iv);
298
299		err = skcipher_walk_virt(&walk, &subreq, false) ?:
300		      cbc_encrypt_walk(&subreq, &walk);
301		if (err)
302			return err;
303
304		if (req->cryptlen == AES_BLOCK_SIZE)
305			return 0;
306
307		dst = src = scatterwalk_ffwd(sg_src, req->src, subreq.cryptlen);
308		if (req->dst != req->src)
309			dst = scatterwalk_ffwd(sg_dst, req->dst,
310					       subreq.cryptlen);
311	}
312
313	/* handle ciphertext stealing */
314	skcipher_request_set_crypt(&subreq, src, dst,
315				   req->cryptlen - cbc_blocks * AES_BLOCK_SIZE,
316				   req->iv);
317
318	err = skcipher_walk_virt(&walk, &subreq, false);
319	if (err)
320		return err;
321
322	scoped_ksimd()
323		aes_cbc_cts_encrypt(walk.dst.virt.addr, walk.src.virt.addr,
324				    ctx->key_enc, rounds, walk.nbytes, walk.iv);
325
326	return skcipher_walk_done(&walk, 0);
327}
328
329static int cts_cbc_decrypt(struct skcipher_request *req)
330{
331	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
332	struct crypto_aes_ctx *ctx = crypto_skcipher_ctx(tfm);
333	int err, rounds = 6 + ctx->key_length / 4;
334	int cbc_blocks = DIV_ROUND_UP(req->cryptlen, AES_BLOCK_SIZE) - 2;
335	struct scatterlist *src = req->src, *dst = req->dst;
336	struct scatterlist sg_src[2], sg_dst[2];
337	struct skcipher_request subreq;
338	struct skcipher_walk walk;
339
340	skcipher_request_set_tfm(&subreq, tfm);
341	skcipher_request_set_callback(&subreq, skcipher_request_flags(req),
342				      NULL, NULL);
343
344	if (req->cryptlen <= AES_BLOCK_SIZE) {
345		if (req->cryptlen < AES_BLOCK_SIZE)
346			return -EINVAL;
347		cbc_blocks = 1;
348	}
349
350	if (cbc_blocks > 0) {
351		skcipher_request_set_crypt(&subreq, req->src, req->dst,
352					   cbc_blocks * AES_BLOCK_SIZE,
353					   req->iv);
354
355		err = skcipher_walk_virt(&walk, &subreq, false) ?:
356		      cbc_decrypt_walk(&subreq, &walk);
357		if (err)
358			return err;
359
360		if (req->cryptlen == AES_BLOCK_SIZE)
361			return 0;
362
363		dst = src = scatterwalk_ffwd(sg_src, req->src, subreq.cryptlen);
364		if (req->dst != req->src)
365			dst = scatterwalk_ffwd(sg_dst, req->dst,
366					       subreq.cryptlen);
367	}
368
369	/* handle ciphertext stealing */
370	skcipher_request_set_crypt(&subreq, src, dst,
371				   req->cryptlen - cbc_blocks * AES_BLOCK_SIZE,
372				   req->iv);
373
374	err = skcipher_walk_virt(&walk, &subreq, false);
375	if (err)
376		return err;
377
378	scoped_ksimd()
379		aes_cbc_cts_decrypt(walk.dst.virt.addr, walk.src.virt.addr,
380				    ctx->key_dec, rounds, walk.nbytes, walk.iv);
381
382	return skcipher_walk_done(&walk, 0);
383}
384
385static int __maybe_unused essiv_cbc_encrypt(struct skcipher_request *req)
386{
387	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
388	struct crypto_aes_essiv_cbc_ctx *ctx = crypto_skcipher_ctx(tfm);
389	int err, rounds = 6 + ctx->key1.key_length / 4;
390	struct skcipher_walk walk;
391	unsigned int blocks;
392
393	err = skcipher_walk_virt(&walk, req, false);
394
395	blocks = walk.nbytes / AES_BLOCK_SIZE;
396	if (blocks) {
397		scoped_ksimd()
398			aes_essiv_cbc_encrypt(walk.dst.virt.addr,
399					      walk.src.virt.addr,
400					      ctx->key1.key_enc, rounds, blocks,
401					      req->iv, ctx->key2.key_enc);
402		err = skcipher_walk_done(&walk, walk.nbytes % AES_BLOCK_SIZE);
403	}
404	return err ?: cbc_encrypt_walk(req, &walk);
405}
406
407static int __maybe_unused essiv_cbc_decrypt(struct skcipher_request *req)
408{
409	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
410	struct crypto_aes_essiv_cbc_ctx *ctx = crypto_skcipher_ctx(tfm);
411	int err, rounds = 6 + ctx->key1.key_length / 4;
412	struct skcipher_walk walk;
413	unsigned int blocks;
414
415	err = skcipher_walk_virt(&walk, req, false);
416
417	blocks = walk.nbytes / AES_BLOCK_SIZE;
418	if (blocks) {
419		scoped_ksimd()
420			aes_essiv_cbc_decrypt(walk.dst.virt.addr,
421					      walk.src.virt.addr,
422					      ctx->key1.key_dec, rounds, blocks,
423					      req->iv, ctx->key2.key_enc);
424		err = skcipher_walk_done(&walk, walk.nbytes % AES_BLOCK_SIZE);
425	}
426	return err ?: cbc_decrypt_walk(req, &walk);
427}
428
429static int __maybe_unused xctr_encrypt(struct skcipher_request *req)
430{
431	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
432	struct crypto_aes_ctx *ctx = crypto_skcipher_ctx(tfm);
433	int err, rounds = 6 + ctx->key_length / 4;
434	struct skcipher_walk walk;
435	unsigned int byte_ctr = 0;
436
437	err = skcipher_walk_virt(&walk, req, false);
438
439	while (walk.nbytes > 0) {
440		const u8 *src = walk.src.virt.addr;
441		unsigned int nbytes = walk.nbytes;
442		u8 *dst = walk.dst.virt.addr;
443		u8 buf[AES_BLOCK_SIZE];
444
445		/*
446		 * If given less than 16 bytes, we must copy the partial block
447		 * into a temporary buffer of 16 bytes to avoid out of bounds
448		 * reads and writes.  Furthermore, this code is somewhat unusual
449		 * in that it expects the end of the data to be at the end of
450		 * the temporary buffer, rather than the start of the data at
451		 * the start of the temporary buffer.
452		 */
453		if (unlikely(nbytes < AES_BLOCK_SIZE))
454			src = dst = memcpy(buf + sizeof(buf) - nbytes,
455					   src, nbytes);
456		else if (nbytes < walk.total)
457			nbytes &= ~(AES_BLOCK_SIZE - 1);
458
459		scoped_ksimd()
460			aes_xctr_encrypt(dst, src, ctx->key_enc, rounds, nbytes,
461							 walk.iv, byte_ctr);
462
463		if (unlikely(nbytes < AES_BLOCK_SIZE))
464			memcpy(walk.dst.virt.addr,
465			       buf + sizeof(buf) - nbytes, nbytes);
466		byte_ctr += nbytes;
467
468		err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
469	}
470
471	return err;
472}
473
474static int __maybe_unused ctr_encrypt(struct skcipher_request *req)
475{
476	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
477	struct crypto_aes_ctx *ctx = crypto_skcipher_ctx(tfm);
478	int err, rounds = 6 + ctx->key_length / 4;
479	struct skcipher_walk walk;
480
481	err = skcipher_walk_virt(&walk, req, false);
482
483	while (walk.nbytes > 0) {
484		const u8 *src = walk.src.virt.addr;
485		unsigned int nbytes = walk.nbytes;
486		u8 *dst = walk.dst.virt.addr;
487		u8 buf[AES_BLOCK_SIZE];
488
489		/*
490		 * If given less than 16 bytes, we must copy the partial block
491		 * into a temporary buffer of 16 bytes to avoid out of bounds
492		 * reads and writes.  Furthermore, this code is somewhat unusual
493		 * in that it expects the end of the data to be at the end of
494		 * the temporary buffer, rather than the start of the data at
495		 * the start of the temporary buffer.
496		 */
497		if (unlikely(nbytes < AES_BLOCK_SIZE))
498			src = dst = memcpy(buf + sizeof(buf) - nbytes,
499					   src, nbytes);
500		else if (nbytes < walk.total)
501			nbytes &= ~(AES_BLOCK_SIZE - 1);
502
503		scoped_ksimd()
504			aes_ctr_encrypt(dst, src, ctx->key_enc, rounds, nbytes,
505					walk.iv);
506
507		if (unlikely(nbytes < AES_BLOCK_SIZE))
508			memcpy(walk.dst.virt.addr,
509			       buf + sizeof(buf) - nbytes, nbytes);
510
511		err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
512	}
513
514	return err;
515}
516
517static int __maybe_unused xts_encrypt(struct skcipher_request *req)
518{
519	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
520	struct crypto_aes_xts_ctx *ctx = crypto_skcipher_ctx(tfm);
521	int err, first, rounds = 6 + ctx->key1.key_length / 4;
522	int tail = req->cryptlen % AES_BLOCK_SIZE;
523	struct scatterlist sg_src[2], sg_dst[2];
524	struct skcipher_request subreq;
525	struct scatterlist *src, *dst;
526	struct skcipher_walk walk;
527
528	if (req->cryptlen < AES_BLOCK_SIZE)
529		return -EINVAL;
530
531	err = skcipher_walk_virt(&walk, req, false);
532
533	if (unlikely(tail > 0 && walk.nbytes < walk.total)) {
534		int xts_blocks = DIV_ROUND_UP(req->cryptlen,
535					      AES_BLOCK_SIZE) - 2;
536
537		skcipher_walk_abort(&walk);
538
539		skcipher_request_set_tfm(&subreq, tfm);
540		skcipher_request_set_callback(&subreq,
541					      skcipher_request_flags(req),
542					      NULL, NULL);
543		skcipher_request_set_crypt(&subreq, req->src, req->dst,
544					   xts_blocks * AES_BLOCK_SIZE,
545					   req->iv);
546		req = &subreq;
547		err = skcipher_walk_virt(&walk, req, false);
548	} else {
549		tail = 0;
550	}
551
552	scoped_ksimd() {
553		for (first = 1; walk.nbytes >= AES_BLOCK_SIZE; first = 0) {
554			int nbytes = walk.nbytes;
555
556			if (walk.nbytes < walk.total)
557				nbytes &= ~(AES_BLOCK_SIZE - 1);
558
559			aes_xts_encrypt(walk.dst.virt.addr, walk.src.virt.addr,
560					ctx->key1.key_enc, rounds, nbytes,
561					ctx->key2.key_enc, walk.iv, first);
562			err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
563		}
564
565		if (err || likely(!tail))
566			return err;
567
568		dst = src = scatterwalk_ffwd(sg_src, req->src, req->cryptlen);
569		if (req->dst != req->src)
570			dst = scatterwalk_ffwd(sg_dst, req->dst, req->cryptlen);
571
572		skcipher_request_set_crypt(req, src, dst, AES_BLOCK_SIZE + tail,
573					   req->iv);
574
575		err = skcipher_walk_virt(&walk, &subreq, false);
576		if (err)
577			return err;
578
579		aes_xts_encrypt(walk.dst.virt.addr, walk.src.virt.addr,
580				ctx->key1.key_enc, rounds, walk.nbytes,
581				ctx->key2.key_enc, walk.iv, first);
582	}
583	return skcipher_walk_done(&walk, 0);
584}
585
586static int __maybe_unused xts_decrypt(struct skcipher_request *req)
587{
588	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
589	struct crypto_aes_xts_ctx *ctx = crypto_skcipher_ctx(tfm);
590	int err, first, rounds = 6 + ctx->key1.key_length / 4;
591	int tail = req->cryptlen % AES_BLOCK_SIZE;
592	struct scatterlist sg_src[2], sg_dst[2];
593	struct skcipher_request subreq;
594	struct scatterlist *src, *dst;
595	struct skcipher_walk walk;
596
597	if (req->cryptlen < AES_BLOCK_SIZE)
598		return -EINVAL;
599
600	err = skcipher_walk_virt(&walk, req, false);
601
602	if (unlikely(tail > 0 && walk.nbytes < walk.total)) {
603		int xts_blocks = DIV_ROUND_UP(req->cryptlen,
604					      AES_BLOCK_SIZE) - 2;
605
606		skcipher_walk_abort(&walk);
607
608		skcipher_request_set_tfm(&subreq, tfm);
609		skcipher_request_set_callback(&subreq,
610					      skcipher_request_flags(req),
611					      NULL, NULL);
612		skcipher_request_set_crypt(&subreq, req->src, req->dst,
613					   xts_blocks * AES_BLOCK_SIZE,
614					   req->iv);
615		req = &subreq;
616		err = skcipher_walk_virt(&walk, req, false);
617	} else {
618		tail = 0;
619	}
620
621	scoped_ksimd() {
622		for (first = 1; walk.nbytes >= AES_BLOCK_SIZE; first = 0) {
623			int nbytes = walk.nbytes;
624
625			if (walk.nbytes < walk.total)
626				nbytes &= ~(AES_BLOCK_SIZE - 1);
627
628			aes_xts_decrypt(walk.dst.virt.addr, walk.src.virt.addr,
629					ctx->key1.key_dec, rounds, nbytes,
630					ctx->key2.key_enc, walk.iv, first);
631			err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
632		}
633
634		if (err || likely(!tail))
635			return err;
636
637		dst = src = scatterwalk_ffwd(sg_src, req->src, req->cryptlen);
638		if (req->dst != req->src)
639			dst = scatterwalk_ffwd(sg_dst, req->dst, req->cryptlen);
640
641		skcipher_request_set_crypt(req, src, dst, AES_BLOCK_SIZE + tail,
642					   req->iv);
643
644		err = skcipher_walk_virt(&walk, &subreq, false);
645		if (err)
646			return err;
647
648		aes_xts_decrypt(walk.dst.virt.addr, walk.src.virt.addr,
649				ctx->key1.key_dec, rounds, walk.nbytes,
650				ctx->key2.key_enc, walk.iv, first);
651	}
652	return skcipher_walk_done(&walk, 0);
653}
654
655static struct skcipher_alg aes_algs[] = { {
656#if defined(USE_V8_CRYPTO_EXTENSIONS) || !IS_ENABLED(CONFIG_CRYPTO_AES_ARM64_BS)
657	.base = {
658		.cra_name		= "ecb(aes)",
659		.cra_driver_name	= "ecb-aes-" MODE,
660		.cra_priority		= PRIO,
661		.cra_blocksize		= AES_BLOCK_SIZE,
662		.cra_ctxsize		= sizeof(struct crypto_aes_ctx),
663		.cra_module		= THIS_MODULE,
664	},
665	.min_keysize	= AES_MIN_KEY_SIZE,
666	.max_keysize	= AES_MAX_KEY_SIZE,
667	.setkey		= skcipher_aes_setkey,
668	.encrypt	= ecb_encrypt,
669	.decrypt	= ecb_decrypt,
670}, {
671	.base = {
672		.cra_name		= "cbc(aes)",
673		.cra_driver_name	= "cbc-aes-" MODE,
674		.cra_priority		= PRIO,
675		.cra_blocksize		= AES_BLOCK_SIZE,
676		.cra_ctxsize		= sizeof(struct crypto_aes_ctx),
677		.cra_module		= THIS_MODULE,
678	},
679	.min_keysize	= AES_MIN_KEY_SIZE,
680	.max_keysize	= AES_MAX_KEY_SIZE,
681	.ivsize		= AES_BLOCK_SIZE,
682	.setkey		= skcipher_aes_setkey,
683	.encrypt	= cbc_encrypt,
684	.decrypt	= cbc_decrypt,
685}, {
686	.base = {
687		.cra_name		= "ctr(aes)",
688		.cra_driver_name	= "ctr-aes-" MODE,
689		.cra_priority		= PRIO,
690		.cra_blocksize		= 1,
691		.cra_ctxsize		= sizeof(struct crypto_aes_ctx),
692		.cra_module		= THIS_MODULE,
693	},
694	.min_keysize	= AES_MIN_KEY_SIZE,
695	.max_keysize	= AES_MAX_KEY_SIZE,
696	.ivsize		= AES_BLOCK_SIZE,
697	.chunksize	= AES_BLOCK_SIZE,
698	.setkey		= skcipher_aes_setkey,
699	.encrypt	= ctr_encrypt,
700	.decrypt	= ctr_encrypt,
701}, {
702	.base = {
703		.cra_name		= "xctr(aes)",
704		.cra_driver_name	= "xctr-aes-" MODE,
705		.cra_priority		= PRIO,
706		.cra_blocksize		= 1,
707		.cra_ctxsize		= sizeof(struct crypto_aes_ctx),
708		.cra_module		= THIS_MODULE,
709	},
710	.min_keysize	= AES_MIN_KEY_SIZE,
711	.max_keysize	= AES_MAX_KEY_SIZE,
712	.ivsize		= AES_BLOCK_SIZE,
713	.chunksize	= AES_BLOCK_SIZE,
714	.setkey		= skcipher_aes_setkey,
715	.encrypt	= xctr_encrypt,
716	.decrypt	= xctr_encrypt,
717}, {
718	.base = {
719		.cra_name		= "xts(aes)",
720		.cra_driver_name	= "xts-aes-" MODE,
721		.cra_priority		= PRIO,
722		.cra_blocksize		= AES_BLOCK_SIZE,
723		.cra_ctxsize		= sizeof(struct crypto_aes_xts_ctx),
724		.cra_module		= THIS_MODULE,
725	},
726	.min_keysize	= 2 * AES_MIN_KEY_SIZE,
727	.max_keysize	= 2 * AES_MAX_KEY_SIZE,
728	.ivsize		= AES_BLOCK_SIZE,
729	.walksize	= 2 * AES_BLOCK_SIZE,
730	.setkey		= xts_set_key,
731	.encrypt	= xts_encrypt,
732	.decrypt	= xts_decrypt,
733}, {
734#endif
735	.base = {
736		.cra_name		= "cts(cbc(aes))",
737		.cra_driver_name	= "cts-cbc-aes-" MODE,
738		.cra_priority		= PRIO,
739		.cra_blocksize		= AES_BLOCK_SIZE,
740		.cra_ctxsize		= sizeof(struct crypto_aes_ctx),
741		.cra_module		= THIS_MODULE,
742	},
743	.min_keysize	= AES_MIN_KEY_SIZE,
744	.max_keysize	= AES_MAX_KEY_SIZE,
745	.ivsize		= AES_BLOCK_SIZE,
746	.walksize	= 2 * AES_BLOCK_SIZE,
747	.setkey		= skcipher_aes_setkey,
748	.encrypt	= cts_cbc_encrypt,
749	.decrypt	= cts_cbc_decrypt,
750}, {
751	.base = {
752		.cra_name		= "essiv(cbc(aes),sha256)",
753		.cra_driver_name	= "essiv-cbc-aes-sha256-" MODE,
754		.cra_priority		= PRIO + 1,
755		.cra_blocksize		= AES_BLOCK_SIZE,
756		.cra_ctxsize		= sizeof(struct crypto_aes_essiv_cbc_ctx),
757		.cra_module		= THIS_MODULE,
758	},
759	.min_keysize	= AES_MIN_KEY_SIZE,
760	.max_keysize	= AES_MAX_KEY_SIZE,
761	.ivsize		= AES_BLOCK_SIZE,
762	.setkey		= essiv_cbc_set_key,
763	.encrypt	= essiv_cbc_encrypt,
764	.decrypt	= essiv_cbc_decrypt,
765} };
766
767static int cbcmac_setkey(struct crypto_shash *tfm, const u8 *in_key,
768			 unsigned int key_len)
769{
770	struct mac_tfm_ctx *ctx = crypto_shash_ctx(tfm);
771
772	return aes_expandkey(&ctx->key, in_key, key_len);
773}
774
775static void cmac_gf128_mul_by_x(be128 *y, const be128 *x)
776{
777	u64 a = be64_to_cpu(x->a);
778	u64 b = be64_to_cpu(x->b);
779
780	y->a = cpu_to_be64((a << 1) | (b >> 63));
781	y->b = cpu_to_be64((b << 1) ^ ((a >> 63) ? 0x87 : 0));
782}
783
784static int cmac_setkey(struct crypto_shash *tfm, const u8 *in_key,
785		       unsigned int key_len)
786{
787	struct mac_tfm_ctx *ctx = crypto_shash_ctx(tfm);
788	be128 *consts = (be128 *)ctx->consts;
789	int rounds = 6 + key_len / 4;
790	int err;
791
792	err = cbcmac_setkey(tfm, in_key, key_len);
793	if (err)
794		return err;
795
796	/* encrypt the zero vector */
797	scoped_ksimd()
798		aes_ecb_encrypt(ctx->consts, (u8[AES_BLOCK_SIZE]){},
799				ctx->key.key_enc, rounds, 1);
800
801	cmac_gf128_mul_by_x(consts, consts);
802	cmac_gf128_mul_by_x(consts + 1, consts);
803
804	return 0;
805}
806
807static int xcbc_setkey(struct crypto_shash *tfm, const u8 *in_key,
808		       unsigned int key_len)
809{
810	static u8 const ks[3][AES_BLOCK_SIZE] = {
811		{ [0 ... AES_BLOCK_SIZE - 1] = 0x1 },
812		{ [0 ... AES_BLOCK_SIZE - 1] = 0x2 },
813		{ [0 ... AES_BLOCK_SIZE - 1] = 0x3 },
814	};
815
816	struct mac_tfm_ctx *ctx = crypto_shash_ctx(tfm);
817	int rounds = 6 + key_len / 4;
818	u8 key[AES_BLOCK_SIZE];
819	int err;
820
821	err = cbcmac_setkey(tfm, in_key, key_len);
822	if (err)
823		return err;
824
825	scoped_ksimd() {
826		aes_ecb_encrypt(key, ks[0], ctx->key.key_enc, rounds, 1);
827		aes_ecb_encrypt(ctx->consts, ks[1], ctx->key.key_enc, rounds, 2);
828	}
829
830	return cbcmac_setkey(tfm, key, sizeof(key));
831}
832
833static int mac_init(struct shash_desc *desc)
834{
835	struct mac_desc_ctx *ctx = shash_desc_ctx(desc);
836
837	memset(ctx->dg, 0, AES_BLOCK_SIZE);
838	return 0;
839}
840
841static void mac_do_update(struct crypto_aes_ctx *ctx, u8 const in[], int blocks,
842			  u8 dg[], int enc_before)
843{
844	int rounds = 6 + ctx->key_length / 4;
845	int rem;
846
847	do {
848		scoped_ksimd()
849			rem = aes_mac_update(in, ctx->key_enc, rounds, blocks,
850					     dg, enc_before, !enc_before);
851		in += (blocks - rem) * AES_BLOCK_SIZE;
852		blocks = rem;
853	} while (blocks);
854}
855
856static int mac_update(struct shash_desc *desc, const u8 *p, unsigned int len)
857{
858	struct mac_tfm_ctx *tctx = crypto_shash_ctx(desc->tfm);
859	struct mac_desc_ctx *ctx = shash_desc_ctx(desc);
860	int blocks = len / AES_BLOCK_SIZE;
861
862	len %= AES_BLOCK_SIZE;
863	mac_do_update(&tctx->key, p, blocks, ctx->dg, 0);
864	return len;
865}
866
867static int cbcmac_finup(struct shash_desc *desc, const u8 *src,
868			unsigned int len, u8 *out)
869{
870	struct mac_tfm_ctx *tctx = crypto_shash_ctx(desc->tfm);
871	struct mac_desc_ctx *ctx = shash_desc_ctx(desc);
872
873	if (len) {
874		crypto_xor(ctx->dg, src, len);
875		mac_do_update(&tctx->key, NULL, 0, ctx->dg, 1);
876	}
877	memcpy(out, ctx->dg, AES_BLOCK_SIZE);
878	return 0;
879}
880
881static int cmac_finup(struct shash_desc *desc, const u8 *src, unsigned int len,
882		      u8 *out)
883{
884	struct mac_tfm_ctx *tctx = crypto_shash_ctx(desc->tfm);
885	struct mac_desc_ctx *ctx = shash_desc_ctx(desc);
886	u8 *consts = tctx->consts;
887
888	crypto_xor(ctx->dg, src, len);
889	if (len != AES_BLOCK_SIZE) {
890		ctx->dg[len] ^= 0x80;
891		consts += AES_BLOCK_SIZE;
892	}
893	mac_do_update(&tctx->key, consts, 1, ctx->dg, 0);
894	memcpy(out, ctx->dg, AES_BLOCK_SIZE);
895	return 0;
896}
897
898static struct shash_alg mac_algs[] = { {
899	.base.cra_name		= "cmac(aes)",
900	.base.cra_driver_name	= "cmac-aes-" MODE,
901	.base.cra_priority	= PRIO,
902	.base.cra_flags		= CRYPTO_AHASH_ALG_BLOCK_ONLY |
903				  CRYPTO_AHASH_ALG_FINAL_NONZERO,
904	.base.cra_blocksize	= AES_BLOCK_SIZE,
905	.base.cra_ctxsize	= sizeof(struct mac_tfm_ctx) +
906				  2 * AES_BLOCK_SIZE,
907	.base.cra_module	= THIS_MODULE,
908
909	.digestsize		= AES_BLOCK_SIZE,
910	.init			= mac_init,
911	.update			= mac_update,
912	.finup			= cmac_finup,
913	.setkey			= cmac_setkey,
914	.descsize		= sizeof(struct mac_desc_ctx),
915}, {
916	.base.cra_name		= "xcbc(aes)",
917	.base.cra_driver_name	= "xcbc-aes-" MODE,
918	.base.cra_priority	= PRIO,
919	.base.cra_flags		= CRYPTO_AHASH_ALG_BLOCK_ONLY |
920				  CRYPTO_AHASH_ALG_FINAL_NONZERO,
921	.base.cra_blocksize	= AES_BLOCK_SIZE,
922	.base.cra_ctxsize	= sizeof(struct mac_tfm_ctx) +
923				  2 * AES_BLOCK_SIZE,
924	.base.cra_module	= THIS_MODULE,
925
926	.digestsize		= AES_BLOCK_SIZE,
927	.init			= mac_init,
928	.update			= mac_update,
929	.finup			= cmac_finup,
930	.setkey			= xcbc_setkey,
931	.descsize		= sizeof(struct mac_desc_ctx),
932}, {
933	.base.cra_name		= "cbcmac(aes)",
934	.base.cra_driver_name	= "cbcmac-aes-" MODE,
935	.base.cra_priority	= PRIO,
936	.base.cra_flags		= CRYPTO_AHASH_ALG_BLOCK_ONLY,
937	.base.cra_blocksize	= AES_BLOCK_SIZE,
938	.base.cra_ctxsize	= sizeof(struct mac_tfm_ctx),
939	.base.cra_module	= THIS_MODULE,
940
941	.digestsize		= AES_BLOCK_SIZE,
942	.init			= mac_init,
943	.update			= mac_update,
944	.finup			= cbcmac_finup,
945	.setkey			= cbcmac_setkey,
946	.descsize		= sizeof(struct mac_desc_ctx),
947} };
948
949static void aes_exit(void)
950{
951	crypto_unregister_shashes(mac_algs, ARRAY_SIZE(mac_algs));
952	crypto_unregister_skciphers(aes_algs, ARRAY_SIZE(aes_algs));
953}
954
955static int __init aes_init(void)
956{
957	int err;
958
959	err = crypto_register_skciphers(aes_algs, ARRAY_SIZE(aes_algs));
960	if (err)
961		return err;
962
963	err = crypto_register_shashes(mac_algs, ARRAY_SIZE(mac_algs));
964	if (err)
965		goto unregister_ciphers;
966
967	return 0;
968
969unregister_ciphers:
970	crypto_unregister_skciphers(aes_algs, ARRAY_SIZE(aes_algs));
971	return err;
972}
973
974#ifdef USE_V8_CRYPTO_EXTENSIONS
975module_cpu_feature_match(AES, aes_init);
976EXPORT_SYMBOL_NS(ce_aes_mac_update, "CRYPTO_INTERNAL");
977#else
978module_init(aes_init);
979EXPORT_SYMBOL(neon_aes_ecb_encrypt);
980EXPORT_SYMBOL(neon_aes_cbc_encrypt);
981EXPORT_SYMBOL(neon_aes_ctr_encrypt);
982EXPORT_SYMBOL(neon_aes_xts_encrypt);
983EXPORT_SYMBOL(neon_aes_xts_decrypt);
984#endif
985module_exit(aes_exit);
~/ Read-only file preview.