xref: /linux/lib/crypto/arm64/aes-ce-core.S (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1*2b1ef7aeSEric Biggers/* SPDX-License-Identifier: GPL-2.0-only */
2*2b1ef7aeSEric Biggers/*
3*2b1ef7aeSEric Biggers * Copyright (C) 2013 - 2017 Linaro Ltd <ard.biesheuvel@linaro.org>
4*2b1ef7aeSEric Biggers */
5*2b1ef7aeSEric Biggers
6*2b1ef7aeSEric Biggers#include <linux/linkage.h>
7*2b1ef7aeSEric Biggers#include <asm/assembler.h>
8*2b1ef7aeSEric Biggers
9*2b1ef7aeSEric Biggers	.arch		armv8-a+crypto
10*2b1ef7aeSEric Biggers
11*2b1ef7aeSEric BiggersSYM_FUNC_START(__aes_ce_encrypt)
12*2b1ef7aeSEric Biggers	sub		w3, w3, #2
13*2b1ef7aeSEric Biggers	ld1		{v0.16b}, [x2]
14*2b1ef7aeSEric Biggers	ld1		{v1.4s}, [x0], #16
15*2b1ef7aeSEric Biggers	cmp		w3, #10
16*2b1ef7aeSEric Biggers	bmi		0f
17*2b1ef7aeSEric Biggers	bne		3f
18*2b1ef7aeSEric Biggers	mov		v3.16b, v1.16b
19*2b1ef7aeSEric Biggers	b		2f
20*2b1ef7aeSEric Biggers0:	mov		v2.16b, v1.16b
21*2b1ef7aeSEric Biggers	ld1		{v3.4s}, [x0], #16
22*2b1ef7aeSEric Biggers1:	aese		v0.16b, v2.16b
23*2b1ef7aeSEric Biggers	aesmc		v0.16b, v0.16b
24*2b1ef7aeSEric Biggers2:	ld1		{v1.4s}, [x0], #16
25*2b1ef7aeSEric Biggers	aese		v0.16b, v3.16b
26*2b1ef7aeSEric Biggers	aesmc		v0.16b, v0.16b
27*2b1ef7aeSEric Biggers3:	ld1		{v2.4s}, [x0], #16
28*2b1ef7aeSEric Biggers	subs		w3, w3, #3
29*2b1ef7aeSEric Biggers	aese		v0.16b, v1.16b
30*2b1ef7aeSEric Biggers	aesmc		v0.16b, v0.16b
31*2b1ef7aeSEric Biggers	ld1		{v3.4s}, [x0], #16
32*2b1ef7aeSEric Biggers	bpl		1b
33*2b1ef7aeSEric Biggers	aese		v0.16b, v2.16b
34*2b1ef7aeSEric Biggers	eor		v0.16b, v0.16b, v3.16b
35*2b1ef7aeSEric Biggers	st1		{v0.16b}, [x1]
36*2b1ef7aeSEric Biggers	ret
37*2b1ef7aeSEric BiggersSYM_FUNC_END(__aes_ce_encrypt)
38*2b1ef7aeSEric Biggers
39*2b1ef7aeSEric BiggersSYM_FUNC_START(__aes_ce_decrypt)
40*2b1ef7aeSEric Biggers	sub		w3, w3, #2
41*2b1ef7aeSEric Biggers	ld1		{v0.16b}, [x2]
42*2b1ef7aeSEric Biggers	ld1		{v1.4s}, [x0], #16
43*2b1ef7aeSEric Biggers	cmp		w3, #10
44*2b1ef7aeSEric Biggers	bmi		0f
45*2b1ef7aeSEric Biggers	bne		3f
46*2b1ef7aeSEric Biggers	mov		v3.16b, v1.16b
47*2b1ef7aeSEric Biggers	b		2f
48*2b1ef7aeSEric Biggers0:	mov		v2.16b, v1.16b
49*2b1ef7aeSEric Biggers	ld1		{v3.4s}, [x0], #16
50*2b1ef7aeSEric Biggers1:	aesd		v0.16b, v2.16b
51*2b1ef7aeSEric Biggers	aesimc		v0.16b, v0.16b
52*2b1ef7aeSEric Biggers2:	ld1		{v1.4s}, [x0], #16
53*2b1ef7aeSEric Biggers	aesd		v0.16b, v3.16b
54*2b1ef7aeSEric Biggers	aesimc		v0.16b, v0.16b
55*2b1ef7aeSEric Biggers3:	ld1		{v2.4s}, [x0], #16
56*2b1ef7aeSEric Biggers	subs		w3, w3, #3
57*2b1ef7aeSEric Biggers	aesd		v0.16b, v1.16b
58*2b1ef7aeSEric Biggers	aesimc		v0.16b, v0.16b
59*2b1ef7aeSEric Biggers	ld1		{v3.4s}, [x0], #16
60*2b1ef7aeSEric Biggers	bpl		1b
61*2b1ef7aeSEric Biggers	aesd		v0.16b, v2.16b
62*2b1ef7aeSEric Biggers	eor		v0.16b, v0.16b, v3.16b
63*2b1ef7aeSEric Biggers	st1		{v0.16b}, [x1]
64*2b1ef7aeSEric Biggers	ret
65*2b1ef7aeSEric BiggersSYM_FUNC_END(__aes_ce_decrypt)
66*2b1ef7aeSEric Biggers
67*2b1ef7aeSEric Biggers/*
68*2b1ef7aeSEric Biggers * __aes_ce_sub() - use the aese instruction to perform the AES sbox
69*2b1ef7aeSEric Biggers *                  substitution on each byte in 'input'
70*2b1ef7aeSEric Biggers */
71*2b1ef7aeSEric BiggersSYM_FUNC_START(__aes_ce_sub)
72*2b1ef7aeSEric Biggers	dup		v1.4s, w0
73*2b1ef7aeSEric Biggers	movi		v0.16b, #0
74*2b1ef7aeSEric Biggers	aese		v0.16b, v1.16b
75*2b1ef7aeSEric Biggers	umov		w0, v0.s[0]
76*2b1ef7aeSEric Biggers	ret
77*2b1ef7aeSEric BiggersSYM_FUNC_END(__aes_ce_sub)
78*2b1ef7aeSEric Biggers
79*2b1ef7aeSEric BiggersSYM_FUNC_START(__aes_ce_invert)
80*2b1ef7aeSEric Biggers	ld1		{v0.4s}, [x1]
81*2b1ef7aeSEric Biggers	aesimc		v1.16b, v0.16b
82*2b1ef7aeSEric Biggers	st1		{v1.4s}, [x0]
83*2b1ef7aeSEric Biggers	ret
84*2b1ef7aeSEric BiggersSYM_FUNC_END(__aes_ce_invert)
85