zupt/jasmin/zupt_aes_ctr.s
Cristian Cezar Moisés e5f5d32aab v2.2.2
2026-05-01 09:58:47 -03:00

231 lines
6.8 KiB
ArmAsm
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SPDX-License-Identifier: AGPL-3.0-or-later
# Copyright (c) 2026 Cristian Cezar Moisés
# Generated from jasmin/zupt_aes_ctr.jazz by jasminc.
.intel_syntax noprefix
.text
.p2align 5
.global zupt_aes256_blk
.type zupt_aes256_blk, %function
/* zupt_aes256_blk(out_ptr=rdi, in_blk=rsi, key=rdx, ctr_blk=rcx)
* AES-256 single-block encrypt: out = AES(key, ctr) XOR in
*
* FIX v2.0.0: Round keys at [rsp+0], [rsp+16], [rsp+32], ..., [rsp+224]
* The previous version had [rsp+0], [rsp+1], ..., [rsp+14] (byte offsets).
*
* Stack layout: 15 × 16 bytes = 240 bytes for round keys, 16-byte aligned.
*/
zupt_aes256_blk:
mov r10, rsp
lea rsp, qword ptr[rsp - 256]
and rsp, -16
/* Load 256-bit key (two u128 halves) */
vmovdqu xmm0, xmmword ptr[rdx] /* key[0] = first 128 bits */
vmovdqu xmm1, xmmword ptr[rdx + 16] /* key[1] = second 128 bits */
/* Store round keys 0-1 (the raw key halves) */
vmovdqa xmmword ptr[rsp + 0], xmm0 /* rk0 */
vmovdqa xmmword ptr[rsp + 16], xmm1 /* rk1 */
/* Round key 2 (even): RCON=0x01 */
vaeskeygenassist xmm2, xmm1, 0x01
vpshufd xmm2, xmm2, 0xFF
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpxor xmm0, xmm0, xmm2
vmovdqa xmmword ptr[rsp + 32], xmm0 /* rk2 */
/* Round key 3 (odd) */
vaeskeygenassist xmm2, xmm0, 0
vpshufd xmm2, xmm2, 0xAA
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpxor xmm1, xmm1, xmm2
vmovdqa xmmword ptr[rsp + 48], xmm1 /* rk3 */
/* Round key 4 (even): RCON=0x02 */
vaeskeygenassist xmm2, xmm1, 0x02
vpshufd xmm2, xmm2, 0xFF
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpxor xmm0, xmm0, xmm2
vmovdqa xmmword ptr[rsp + 64], xmm0 /* rk4 */
/* Round key 5 (odd) */
vaeskeygenassist xmm2, xmm0, 0
vpshufd xmm2, xmm2, 0xAA
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpxor xmm1, xmm1, xmm2
vmovdqa xmmword ptr[rsp + 80], xmm1 /* rk5 */
/* Round key 6 (even): RCON=0x04 */
vaeskeygenassist xmm2, xmm1, 0x04
vpshufd xmm2, xmm2, 0xFF
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpxor xmm0, xmm0, xmm2
vmovdqa xmmword ptr[rsp + 96], xmm0 /* rk6 */
/* Round key 7 (odd) */
vaeskeygenassist xmm2, xmm0, 0
vpshufd xmm2, xmm2, 0xAA
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpxor xmm1, xmm1, xmm2
vmovdqa xmmword ptr[rsp + 112], xmm1 /* rk7 */
/* Round key 8 (even): RCON=0x08 */
vaeskeygenassist xmm2, xmm1, 0x08
vpshufd xmm2, xmm2, 0xFF
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpxor xmm0, xmm0, xmm2
vmovdqa xmmword ptr[rsp + 128], xmm0 /* rk8 */
/* Round key 9 (odd) */
vaeskeygenassist xmm2, xmm0, 0
vpshufd xmm2, xmm2, 0xAA
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpxor xmm1, xmm1, xmm2
vmovdqa xmmword ptr[rsp + 144], xmm1 /* rk9 */
/* Round key 10 (even): RCON=0x10 */
vaeskeygenassist xmm2, xmm1, 0x10
vpshufd xmm2, xmm2, 0xFF
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpxor xmm0, xmm0, xmm2
vmovdqa xmmword ptr[rsp + 160], xmm0 /* rk10 */
/* Round key 11 (odd) */
vaeskeygenassist xmm2, xmm0, 0
vpshufd xmm2, xmm2, 0xAA
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpxor xmm1, xmm1, xmm2
vmovdqa xmmword ptr[rsp + 176], xmm1 /* rk11 */
/* Round key 12 (even): RCON=0x20 */
vaeskeygenassist xmm2, xmm1, 0x20
vpshufd xmm2, xmm2, 0xFF
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpxor xmm0, xmm0, xmm2
vmovdqa xmmword ptr[rsp + 192], xmm0 /* rk12 */
/* Round key 13 (odd) */
vaeskeygenassist xmm2, xmm0, 0
vpshufd xmm2, xmm2, 0xAA
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpslldq xmm3, xmm1, 4
vpxor xmm1, xmm1, xmm3
vpxor xmm1, xmm1, xmm2
vmovdqa xmmword ptr[rsp + 208], xmm1 /* rk13 */
/* Round key 14 (even): RCON=0x40 */
vaeskeygenassist xmm2, xmm1, 0x40
vpshufd xmm2, xmm2, 0xFF
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpslldq xmm3, xmm0, 4
vpxor xmm0, xmm0, xmm3
vpxor xmm0, xmm0, xmm2
vmovdqa xmmword ptr[rsp + 224], xmm0 /* rk14 */
/* ═══ Encrypt: AES-256 14 rounds ═══ */
vmovdqu xmm4, xmmword ptr[rcx] /* Load counter block */
vpxor xmm4, xmm4, xmmword ptr[rsp + 0] /* AddRoundKey(rk0) */
vaesenc xmm4, xmm4, xmmword ptr[rsp + 16] /* Round 1 */
vaesenc xmm4, xmm4, xmmword ptr[rsp + 32] /* Round 2 */
vaesenc xmm4, xmm4, xmmword ptr[rsp + 48] /* Round 3 */
vaesenc xmm4, xmm4, xmmword ptr[rsp + 64] /* Round 4 */
vaesenc xmm4, xmm4, xmmword ptr[rsp + 80] /* Round 5 */
vaesenc xmm4, xmm4, xmmword ptr[rsp + 96] /* Round 6 */
vaesenc xmm4, xmm4, xmmword ptr[rsp + 112] /* Round 7 */
vaesenc xmm4, xmm4, xmmword ptr[rsp + 128] /* Round 8 */
vaesenc xmm4, xmm4, xmmword ptr[rsp + 144] /* Round 9 */
vaesenc xmm4, xmm4, xmmword ptr[rsp + 160] /* Round 10 */
vaesenc xmm4, xmm4, xmmword ptr[rsp + 176] /* Round 11 */
vaesenc xmm4, xmm4, xmmword ptr[rsp + 192] /* Round 12 */
vaesenc xmm4, xmm4, xmmword ptr[rsp + 208] /* Round 13 */
vaesenclast xmm4, xmm4, xmmword ptr[rsp + 224] /* Round 14 (final) */
/* XOR keystream with plaintext */
vmovdqu xmm5, xmmword ptr[rsi] /* Load plaintext block */
vpxor xmm4, xmm4, xmm5
vmovdqu xmmword ptr[rdi], xmm4 /* Store result */
/* Wipe round keys from stack */
vpxor xmm0, xmm0, xmm0
vmovdqa xmmword ptr[rsp + 0], xmm0
vmovdqa xmmword ptr[rsp + 16], xmm0
vmovdqa xmmword ptr[rsp + 32], xmm0
vmovdqa xmmword ptr[rsp + 48], xmm0
vmovdqa xmmword ptr[rsp + 64], xmm0
vmovdqa xmmword ptr[rsp + 80], xmm0
vmovdqa xmmword ptr[rsp + 96], xmm0
vmovdqa xmmword ptr[rsp + 112], xmm0
vmovdqa xmmword ptr[rsp + 128], xmm0
vmovdqa xmmword ptr[rsp + 144], xmm0
vmovdqa xmmword ptr[rsp + 160], xmm0
vmovdqa xmmword ptr[rsp + 176], xmm0
vmovdqa xmmword ptr[rsp + 192], xmm0
vmovdqa xmmword ptr[rsp + 208], xmm0
vmovdqa xmmword ptr[rsp + 224], xmm0
mov rsp, r10
ret
.size zupt_aes256_blk, . - zupt_aes256_blk
.section .note.GNU-stack,"",@progbits