arch/arm64/crypto/aes-ce-ccm-core.S

Source file repositories/reference/linux-study-clean/arch/arm64/crypto/aes-ce-ccm-core.S

File Facts

System
Linux kernel
Corpus path
arch/arm64/crypto/aes-ce-ccm-core.S
Extension
.S
Size
3940 bytes
Lines
143
Domain
Architecture Layer
Bucket
arch/arm64
Inferred role
Architecture Layer: arch/arm64
Status
atlas-only

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

#include <linux/linkage.h>
#include <asm/assembler.h>

	.text
	.arch	armv8-a+crypto

	.macro	load_round_keys, rk, nr, tmp
	sub	w\tmp, \nr, #10
	add	\tmp, \rk, w\tmp, sxtw #4
	ld1	{v10.4s-v13.4s}, [\rk]
	ld1	{v14.4s-v17.4s}, [\tmp], #64
	ld1	{v18.4s-v21.4s}, [\tmp], #64
	ld1	{v3.4s-v5.4s}, [\tmp]
	.endm

	.macro	dround, va, vb, vk
	aese	\va\().16b, \vk\().16b
	aesmc	\va\().16b, \va\().16b
	aese	\vb\().16b, \vk\().16b
	aesmc	\vb\().16b, \vb\().16b
	.endm

	.macro	aes_encrypt, va, vb, nr
	tbz	\nr, #2, .L\@
	dround	\va, \vb, v10
	dround	\va, \vb, v11
	tbz	\nr, #1, .L\@
	dround	\va, \vb, v12
	dround	\va, \vb, v13
.L\@:	.irp	v, v14, v15, v16, v17, v18, v19, v20, v21, v3
	dround	\va, \vb, \v
	.endr
	aese	\va\().16b, v4.16b
	aese	\vb\().16b, v4.16b
	.endm

	.macro	aes_ccm_do_crypt,enc
	load_round_keys	x3, w4, x10

	ld1	{v0.16b}, [x5]			/* load mac */
	cbz	x2, ce_aes_ccm_final
	ldr	x8, [x6, #8]			/* load lower ctr */
CPU_LE(	rev	x8, x8			)	/* keep swabbed ctr in reg */
0:	/* outer loop */
	ld1	{v1.8b}, [x6]			/* load upper ctr */
	prfm	pldl1strm, [x1]
	add	x8, x8, #1
	rev	x9, x8
	ins	v1.d[1], x9			/* no carry in lower ctr */

	aes_encrypt	v0, v1, w4

	subs	w2, w2, #16
	bmi	ce_aes_ccm_crypt_tail
	ld1	{v2.16b}, [x1], #16		/* load next input block */
	.if	\enc == 1
	eor	v2.16b, v2.16b, v5.16b		/* final round enc+mac */
	eor	v6.16b, v1.16b, v2.16b		/* xor with crypted ctr */
	.else
	eor	v2.16b, v2.16b, v1.16b		/* xor with crypted ctr */
	eor	v6.16b, v2.16b, v5.16b		/* final round enc */
	.endif
	eor	v0.16b, v0.16b, v2.16b		/* xor mac with pt ^ rk[last] */
	st1	{v6.16b}, [x0], #16		/* write output block */
	bne	0b
CPU_LE(	rev	x8, x8			)
	str	x8, [x6, #8]			/* store lsb end of ctr (BE) */
	cbnz	x7, ce_aes_ccm_final
	st1	{v0.16b}, [x5]			/* store mac */
	ret

Annotation

Implementation Notes