#include "arm_asm.h" // Copyright 2022-2025 The OpenSSL Project Authors. All Rights Reserved. // // Licensed under the Apache License 2.0 (the "License"). You may not use // this file except in compliance with the License. You can obtain a copy // in the file LICENSE in the source distribution or at // https://www.openssl.org/source/license.html // // This module implements support for SM4 hw support on aarch64 // Oct 2021 // // $output is the last argument if it looks like a file (it has an extension) // $flavour is the first argument if it doesn't look like a file #include "arm_arch.h" .arch armv8-a+crypto .text .section .rodata .type _sm4_v8_consts,%object .align 6 _sm4_v8_consts: .Lck: .long 0x00070E15, 0x1C232A31, 0x383F464D, 0x545B6269 .long 0x70777E85, 0x8C939AA1, 0xA8AFB6BD, 0xC4CBD2D9 .long 0xE0E7EEF5, 0xFC030A11, 0x181F262D, 0x343B4249 .long 0x50575E65, 0x6C737A81, 0x888F969D, 0xA4ABB2B9 .long 0xC0C7CED5, 0xDCE3EAF1, 0xF8FF060D, 0x141B2229 .long 0x30373E45, 0x4C535A61, 0x686F767D, 0x848B9299 .long 0xA0A7AEB5, 0xBCC3CAD1, 0xD8DFE6ED, 0xF4FB0209 .long 0x10171E25, 0x2C333A41, 0x484F565D, 0x646B7279 .Lfk: .long 0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc .size _sm4_v8_consts,.-_sm4_v8_consts .previous .globl sm4_v8_set_encrypt_key .type sm4_v8_set_encrypt_key,%function .align 5 sm4_v8_set_encrypt_key: AARCH64_VALID_CALL_TARGET ld1 {v0.4s},[x0] adrp x2,.Lfk add x2,x2,#:lo12:.Lfk ld1 {v24.4s},[x2] adrp x2,.Lck add x2,x2,#:lo12:.Lck ld1 {v16.4s,v17.4s,v18.4s,v19.4s},[x2],64 #ifndef __AARCH64EB__ rev32 v0.16b,v0.16b #endif ld1 {v20.4s,v21.4s,v22.4s,v23.4s},[x2] eor v0.16b,v0.16b,v24.16b; .inst 0xce70c800 //sm4ekey v0.4S,v0.4S,v16.4S .inst 0xce71c801 //sm4ekey v1.4S,v0.4S,v17.4S .inst 0xce72c822 //sm4ekey v2.4S,v1.4S,v18.4S .inst 0xce73c843 //sm4ekey v3.4S,v2.4S,v19.4S .inst 0xce74c864 //sm4ekey v4.4S,v3.4S,v20.4S st1 {v0.4s,v1.4s,v2.4s,v3.4s},[x1],64 .inst 0xce75c885 //sm4ekey v5.4S,v4.4S,v21.4S .inst 0xce76c8a6 //sm4ekey v6.4S,v5.4S,v22.4S .inst 0xce77c8c7 //sm4ekey v7.4S,v6.4S,v23.4S st1 {v4.4s,v5.4s,v6.4s,v7.4s},[x1] ret .size sm4_v8_set_encrypt_key,.-sm4_v8_set_encrypt_key .globl sm4_v8_set_decrypt_key .type sm4_v8_set_decrypt_key,%function .align 5 sm4_v8_set_decrypt_key: AARCH64_VALID_CALL_TARGET ld1 {v7.4s},[x0] adrp x2,.Lfk add x2,x2,#:lo12:.Lfk ld1 {v24.4s},[x2] adrp x2,.Lck add x2,x2,#:lo12:.Lck ld1 {v16.4s,v17.4s,v18.4s,v19.4s},[x2],64 #ifndef __AARCH64EB__ rev32 v7.16b,v7.16b #endif ld1 {v20.4s,v21.4s,v22.4s,v23.4s},[x2] eor v7.16b, v7.16b,v24.16b; .inst 0xce70c8e7 //sm4ekey v7.4S,v7.4S,v16.4S .inst 0xce71c8e6 //sm4ekey v6.4S,v7.4S,v17.4S .inst 0xce72c8c5 //sm4ekey v5.4S,v6.4S,v18.4S rev64 v7.4s,v7.4s rev64 v6.4s,v6.4s ext v7.16b,v7.16b,v7.16b,#8 ext v6.16b,v6.16b,v6.16b,#8 .inst 0xce73c8a4 //sm4ekey v4.4S,v5.4S,v19.4S .inst 0xce74c883 //sm4ekey v3.4S,v4.4S,v20.4S rev64 v5.4s,v5.4s rev64 v4.4s,v4.4s ext v5.16b,v5.16b,v5.16b,#8 ext v4.16b,v4.16b,v4.16b,#8 .inst 0xce75c862 //sm4ekey v2.4S,v3.4S,v21.4S .inst 0xce76c841 //sm4ekey v1.4S,v2.4S,v22.4S rev64 v3.4s,v3.4s rev64 v2.4s,v2.4s ext v3.16b,v3.16b,v3.16b,#8 ext v2.16b,v2.16b,v2.16b,#8 .inst 0xce77c820 //sm4ekey v0.4S,v1.4S,v23.4S rev64 v1.4s, v1.4s rev64 v0.4s, v0.4s ext v1.16b,v1.16b,v1.16b,#8 ext v0.16b,v0.16b,v0.16b,#8 st1 {v0.4s,v1.4s,v2.4s,v3.4s},[x1],64 st1 {v4.4s,v5.4s,v6.4s,v7.4s},[x1] ret .size sm4_v8_set_decrypt_key,.-sm4_v8_set_decrypt_key .globl sm4_v8_encrypt .type sm4_v8_encrypt,%function .align 5 sm4_v8_encrypt: AARCH64_VALID_CALL_TARGET ld1 {v16.4s},[x0] ld1 {v0.4s,v1.4s,v2.4s,v3.4s},[x2],64 ld1 {v4.4s,v5.4s,v6.4s,v7.4s},[x2] #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif .inst 0xcec08410 //sm4e v16.4s,v0.4s .inst 0xcec08430 //sm4e v16.4s,v1.4s .inst 0xcec08450 //sm4e v16.4s,v2.4s .inst 0xcec08470 //sm4e v16.4s,v3.4s .inst 0xcec08490 //sm4e v16.4s,v4.4s .inst 0xcec084b0 //sm4e v16.4s,v5.4s .inst 0xcec084d0 //sm4e v16.4s,v6.4s .inst 0xcec084f0 //sm4e v16.4s,v7.4s rev64 v16.4S,v16.4S ext v16.16b,v16.16b,v16.16b,#8 #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif st1 {v16.4s},[x1] ret .size sm4_v8_encrypt,.-sm4_v8_encrypt .globl sm4_v8_decrypt .type sm4_v8_decrypt,%function .align 5 sm4_v8_decrypt: AARCH64_VALID_CALL_TARGET ld1 {v16.4s},[x0] ld1 {v0.4s,v1.4s,v2.4s,v3.4s},[x2],64 ld1 {v4.4s,v5.4s,v6.4s,v7.4s},[x2] #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif .inst 0xcec08410 //sm4e v16.4s,v0.4s .inst 0xcec08430 //sm4e v16.4s,v1.4s .inst 0xcec08450 //sm4e v16.4s,v2.4s .inst 0xcec08470 //sm4e v16.4s,v3.4s .inst 0xcec08490 //sm4e v16.4s,v4.4s .inst 0xcec084b0 //sm4e v16.4s,v5.4s .inst 0xcec084d0 //sm4e v16.4s,v6.4s .inst 0xcec084f0 //sm4e v16.4s,v7.4s rev64 v16.4S,v16.4S ext v16.16b,v16.16b,v16.16b,#8 #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif st1 {v16.4s},[x1] ret .size sm4_v8_decrypt,.-sm4_v8_decrypt .globl sm4_v8_ecb_encrypt .type sm4_v8_ecb_encrypt,%function .align 5 sm4_v8_ecb_encrypt: AARCH64_VALID_CALL_TARGET ld1 {v0.4s,v1.4s,v2.4s,v3.4s},[x3],#64 ld1 {v4.4s,v5.4s,v6.4s,v7.4s},[x3] 1: cmp x2,#64 b.lt 1f ld1 {v16.4s,v17.4s,v18.4s,v19.4s},[x0],#64 cmp x2,#128 b.lt 2f ld1 {v20.4s,v21.4s,v22.4s,v23.4s},[x0],#64 // 8 blocks #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif #ifndef __AARCH64EB__ rev32 v17.16b,v17.16b #endif #ifndef __AARCH64EB__ rev32 v18.16b,v18.16b #endif #ifndef __AARCH64EB__ rev32 v19.16b,v19.16b #endif #ifndef __AARCH64EB__ rev32 v20.16b,v20.16b #endif #ifndef __AARCH64EB__ rev32 v21.16b,v21.16b #endif #ifndef __AARCH64EB__ rev32 v22.16b,v22.16b #endif #ifndef __AARCH64EB__ rev32 v23.16b,v23.16b #endif .inst 0xcec08410 //sm4e v16.4s,v0.4s .inst 0xcec08411 //sm4e v17.4s,v0.4s .inst 0xcec08412 //sm4e v18.4s,v0.4s .inst 0xcec08413 //sm4e v19.4s,v0.4s .inst 0xcec08430 //sm4e v16.4s,v1.4s .inst 0xcec08431 //sm4e v17.4s,v1.4s .inst 0xcec08432 //sm4e v18.4s,v1.4s .inst 0xcec08433 //sm4e v19.4s,v1.4s .inst 0xcec08450 //sm4e v16.4s,v2.4s .inst 0xcec08451 //sm4e v17.4s,v2.4s .inst 0xcec08452 //sm4e v18.4s,v2.4s .inst 0xcec08453 //sm4e v19.4s,v2.4s .inst 0xcec08470 //sm4e v16.4s,v3.4s .inst 0xcec08471 //sm4e v17.4s,v3.4s .inst 0xcec08472 //sm4e v18.4s,v3.4s .inst 0xcec08473 //sm4e v19.4s,v3.4s .inst 0xcec08490 //sm4e v16.4s,v4.4s .inst 0xcec08491 //sm4e v17.4s,v4.4s .inst 0xcec08492 //sm4e v18.4s,v4.4s .inst 0xcec08493 //sm4e v19.4s,v4.4s .inst 0xcec084b0 //sm4e v16.4s,v5.4s .inst 0xcec084b1 //sm4e v17.4s,v5.4s .inst 0xcec084b2 //sm4e v18.4s,v5.4s .inst 0xcec084b3 //sm4e v19.4s,v5.4s .inst 0xcec084d0 //sm4e v16.4s,v6.4s .inst 0xcec084d1 //sm4e v17.4s,v6.4s .inst 0xcec084d2 //sm4e v18.4s,v6.4s .inst 0xcec084d3 //sm4e v19.4s,v6.4s .inst 0xcec084f0 //sm4e v16.4s,v7.4s rev64 v16.4S,v16.4S .inst 0xcec084f1 //sm4e v17.4s,v7.4s ext v16.16b,v16.16b,v16.16b,#8 rev64 v17.4S,v17.4S .inst 0xcec084f2 //sm4e v18.4s,v7.4s ext v17.16b,v17.16b,v17.16b,#8 rev64 v18.4S,v18.4S .inst 0xcec084f3 //sm4e v19.4s,v7.4s ext v18.16b,v18.16b,v18.16b,#8 rev64 v19.4S,v19.4S ext v19.16b,v19.16b,v19.16b,#8 .inst 0xcec08414 //sm4e v20.4s,v0.4s .inst 0xcec08415 //sm4e v21.4s,v0.4s .inst 0xcec08416 //sm4e v22.4s,v0.4s .inst 0xcec08417 //sm4e v23.4s,v0.4s .inst 0xcec08434 //sm4e v20.4s,v1.4s .inst 0xcec08435 //sm4e v21.4s,v1.4s .inst 0xcec08436 //sm4e v22.4s,v1.4s .inst 0xcec08437 //sm4e v23.4s,v1.4s .inst 0xcec08454 //sm4e v20.4s,v2.4s .inst 0xcec08455 //sm4e v21.4s,v2.4s .inst 0xcec08456 //sm4e v22.4s,v2.4s .inst 0xcec08457 //sm4e v23.4s,v2.4s .inst 0xcec08474 //sm4e v20.4s,v3.4s .inst 0xcec08475 //sm4e v21.4s,v3.4s .inst 0xcec08476 //sm4e v22.4s,v3.4s .inst 0xcec08477 //sm4e v23.4s,v3.4s .inst 0xcec08494 //sm4e v20.4s,v4.4s .inst 0xcec08495 //sm4e v21.4s,v4.4s .inst 0xcec08496 //sm4e v22.4s,v4.4s .inst 0xcec08497 //sm4e v23.4s,v4.4s .inst 0xcec084b4 //sm4e v20.4s,v5.4s .inst 0xcec084b5 //sm4e v21.4s,v5.4s .inst 0xcec084b6 //sm4e v22.4s,v5.4s .inst 0xcec084b7 //sm4e v23.4s,v5.4s .inst 0xcec084d4 //sm4e v20.4s,v6.4s .inst 0xcec084d5 //sm4e v21.4s,v6.4s .inst 0xcec084d6 //sm4e v22.4s,v6.4s .inst 0xcec084d7 //sm4e v23.4s,v6.4s .inst 0xcec084f4 //sm4e v20.4s,v7.4s rev64 v20.4S,v20.4S .inst 0xcec084f5 //sm4e v21.4s,v7.4s ext v20.16b,v20.16b,v20.16b,#8 rev64 v21.4S,v21.4S .inst 0xcec084f6 //sm4e v22.4s,v7.4s ext v21.16b,v21.16b,v21.16b,#8 rev64 v22.4S,v22.4S .inst 0xcec084f7 //sm4e v23.4s,v7.4s ext v22.16b,v22.16b,v22.16b,#8 rev64 v23.4S,v23.4S ext v23.16b,v23.16b,v23.16b,#8 #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif #ifndef __AARCH64EB__ rev32 v17.16b,v17.16b #endif #ifndef __AARCH64EB__ rev32 v18.16b,v18.16b #endif #ifndef __AARCH64EB__ rev32 v19.16b,v19.16b #endif #ifndef __AARCH64EB__ rev32 v20.16b,v20.16b #endif #ifndef __AARCH64EB__ rev32 v21.16b,v21.16b #endif st1 {v16.4s,v17.4s,v18.4s,v19.4s},[x1],#64 #ifndef __AARCH64EB__ rev32 v22.16b,v22.16b #endif #ifndef __AARCH64EB__ rev32 v23.16b,v23.16b #endif st1 {v20.4s,v21.4s,v22.4s,v23.4s},[x1],#64 subs x2,x2,#128 b.gt 1b ret // 4 blocks 2: #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif #ifndef __AARCH64EB__ rev32 v17.16b,v17.16b #endif #ifndef __AARCH64EB__ rev32 v18.16b,v18.16b #endif #ifndef __AARCH64EB__ rev32 v19.16b,v19.16b #endif .inst 0xcec08410 //sm4e v16.4s,v0.4s .inst 0xcec08411 //sm4e v17.4s,v0.4s .inst 0xcec08412 //sm4e v18.4s,v0.4s .inst 0xcec08413 //sm4e v19.4s,v0.4s .inst 0xcec08430 //sm4e v16.4s,v1.4s .inst 0xcec08431 //sm4e v17.4s,v1.4s .inst 0xcec08432 //sm4e v18.4s,v1.4s .inst 0xcec08433 //sm4e v19.4s,v1.4s .inst 0xcec08450 //sm4e v16.4s,v2.4s .inst 0xcec08451 //sm4e v17.4s,v2.4s .inst 0xcec08452 //sm4e v18.4s,v2.4s .inst 0xcec08453 //sm4e v19.4s,v2.4s .inst 0xcec08470 //sm4e v16.4s,v3.4s .inst 0xcec08471 //sm4e v17.4s,v3.4s .inst 0xcec08472 //sm4e v18.4s,v3.4s .inst 0xcec08473 //sm4e v19.4s,v3.4s .inst 0xcec08490 //sm4e v16.4s,v4.4s .inst 0xcec08491 //sm4e v17.4s,v4.4s .inst 0xcec08492 //sm4e v18.4s,v4.4s .inst 0xcec08493 //sm4e v19.4s,v4.4s .inst 0xcec084b0 //sm4e v16.4s,v5.4s .inst 0xcec084b1 //sm4e v17.4s,v5.4s .inst 0xcec084b2 //sm4e v18.4s,v5.4s .inst 0xcec084b3 //sm4e v19.4s,v5.4s .inst 0xcec084d0 //sm4e v16.4s,v6.4s .inst 0xcec084d1 //sm4e v17.4s,v6.4s .inst 0xcec084d2 //sm4e v18.4s,v6.4s .inst 0xcec084d3 //sm4e v19.4s,v6.4s .inst 0xcec084f0 //sm4e v16.4s,v7.4s rev64 v16.4S,v16.4S .inst 0xcec084f1 //sm4e v17.4s,v7.4s ext v16.16b,v16.16b,v16.16b,#8 rev64 v17.4S,v17.4S .inst 0xcec084f2 //sm4e v18.4s,v7.4s ext v17.16b,v17.16b,v17.16b,#8 rev64 v18.4S,v18.4S .inst 0xcec084f3 //sm4e v19.4s,v7.4s ext v18.16b,v18.16b,v18.16b,#8 rev64 v19.4S,v19.4S ext v19.16b,v19.16b,v19.16b,#8 #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif #ifndef __AARCH64EB__ rev32 v17.16b,v17.16b #endif #ifndef __AARCH64EB__ rev32 v18.16b,v18.16b #endif #ifndef __AARCH64EB__ rev32 v19.16b,v19.16b #endif st1 {v16.4s,v17.4s,v18.4s,v19.4s},[x1],#64 subs x2,x2,#64 b.gt 1b 1: subs x2,x2,#16 b.lt 1f ld1 {v16.4s},[x0],#16 #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif .inst 0xcec08410 //sm4e v16.4s,v0.4s .inst 0xcec08430 //sm4e v16.4s,v1.4s .inst 0xcec08450 //sm4e v16.4s,v2.4s .inst 0xcec08470 //sm4e v16.4s,v3.4s .inst 0xcec08490 //sm4e v16.4s,v4.4s .inst 0xcec084b0 //sm4e v16.4s,v5.4s .inst 0xcec084d0 //sm4e v16.4s,v6.4s .inst 0xcec084f0 //sm4e v16.4s,v7.4s rev64 v16.4S,v16.4S ext v16.16b,v16.16b,v16.16b,#8 #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif st1 {v16.4s},[x1],#16 b.ne 1b 1: ret .size sm4_v8_ecb_encrypt,.-sm4_v8_ecb_encrypt .globl sm4_v8_cbc_encrypt .type sm4_v8_cbc_encrypt,%function .align 5 sm4_v8_cbc_encrypt: AARCH64_VALID_CALL_TARGET stp d8,d9,[sp, #-16]! ld1 {v0.4s,v1.4s,v2.4s,v3.4s},[x3],#64 ld1 {v4.4s,v5.4s,v6.4s,v7.4s},[x3] ld1 {v8.4s},[x4] cmp w5,#0 b.eq .Ldec 1: cmp x2, #64 b.lt 1f ld1 {v16.4s,v17.4s,v18.4s,v19.4s},[x0],#64 eor v16.16b,v16.16b,v8.16b #ifndef __AARCH64EB__ rev32 v17.16b,v17.16b #endif #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif #ifndef __AARCH64EB__ rev32 v18.16b,v18.16b #endif #ifndef __AARCH64EB__ rev32 v19.16b,v19.16b #endif .inst 0xcec08410 //sm4e v16.4s,v0.4s .inst 0xcec08430 //sm4e v16.4s,v1.4s .inst 0xcec08450 //sm4e v16.4s,v2.4s .inst 0xcec08470 //sm4e v16.4s,v3.4s .inst 0xcec08490 //sm4e v16.4s,v4.4s .inst 0xcec084b0 //sm4e v16.4s,v5.4s .inst 0xcec084d0 //sm4e v16.4s,v6.4s .inst 0xcec084f0 //sm4e v16.4s,v7.4s rev64 v16.4S,v16.4S ext v16.16b,v16.16b,v16.16b,#8 eor v17.16b,v17.16b,v16.16b .inst 0xcec08411 //sm4e v17.4s,v0.4s .inst 0xcec08431 //sm4e v17.4s,v1.4s .inst 0xcec08451 //sm4e v17.4s,v2.4s .inst 0xcec08471 //sm4e v17.4s,v3.4s .inst 0xcec08491 //sm4e v17.4s,v4.4s .inst 0xcec084b1 //sm4e v17.4s,v5.4s .inst 0xcec084d1 //sm4e v17.4s,v6.4s .inst 0xcec084f1 //sm4e v17.4s,v7.4s rev64 v17.4S,v17.4S ext v17.16b,v17.16b,v17.16b,#8 #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif eor v18.16b,v18.16b,v17.16b .inst 0xcec08412 //sm4e v18.4s,v0.4s .inst 0xcec08432 //sm4e v18.4s,v1.4s .inst 0xcec08452 //sm4e v18.4s,v2.4s .inst 0xcec08472 //sm4e v18.4s,v3.4s .inst 0xcec08492 //sm4e v18.4s,v4.4s .inst 0xcec084b2 //sm4e v18.4s,v5.4s .inst 0xcec084d2 //sm4e v18.4s,v6.4s .inst 0xcec084f2 //sm4e v18.4s,v7.4s rev64 v18.4S,v18.4S ext v18.16b,v18.16b,v18.16b,#8 #ifndef __AARCH64EB__ rev32 v17.16b,v17.16b #endif eor v19.16b,v19.16b,v18.16b .inst 0xcec08413 //sm4e v19.4s,v0.4s .inst 0xcec08433 //sm4e v19.4s,v1.4s .inst 0xcec08453 //sm4e v19.4s,v2.4s .inst 0xcec08473 //sm4e v19.4s,v3.4s .inst 0xcec08493 //sm4e v19.4s,v4.4s .inst 0xcec084b3 //sm4e v19.4s,v5.4s .inst 0xcec084d3 //sm4e v19.4s,v6.4s .inst 0xcec084f3 //sm4e v19.4s,v7.4s rev64 v19.4S,v19.4S ext v19.16b,v19.16b,v19.16b,#8 #ifndef __AARCH64EB__ rev32 v18.16b,v18.16b #endif #ifndef __AARCH64EB__ rev32 v19.16b,v19.16b #endif mov v8.16b,v19.16b st1 {v16.4s,v17.4s,v18.4s,v19.4s},[x1],#64 subs x2,x2,#64 b.ne 1b 1: subs x2,x2,#16 b.lt 3f ld1 {v16.4s},[x0],#16 eor v8.16b,v8.16b,v16.16b #ifndef __AARCH64EB__ rev32 v8.16b,v8.16b #endif .inst 0xcec08408 //sm4e v8.4s,v0.4s .inst 0xcec08428 //sm4e v8.4s,v1.4s .inst 0xcec08448 //sm4e v8.4s,v2.4s .inst 0xcec08468 //sm4e v8.4s,v3.4s .inst 0xcec08488 //sm4e v8.4s,v4.4s .inst 0xcec084a8 //sm4e v8.4s,v5.4s .inst 0xcec084c8 //sm4e v8.4s,v6.4s .inst 0xcec084e8 //sm4e v8.4s,v7.4s rev64 v8.4S,v8.4S ext v8.16b,v8.16b,v8.16b,#8 #ifndef __AARCH64EB__ rev32 v8.16b,v8.16b #endif st1 {v8.4s},[x1],#16 b.ne 1b b 3f .Ldec: 1: cmp x2, #64 b.lt 1f ld1 {v16.4s,v17.4s,v18.4s,v19.4s},[x0] ld1 {v24.4s,v25.4s,v26.4s,v27.4s},[x0],#64 cmp x2,#128 b.lt 2f // 8 blocks mode ld1 {v20.4s,v21.4s,v22.4s,v23.4s},[x0] ld1 {v28.4s,v29.4s,v30.4s,v31.4s},[x0],#64 #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif #ifndef __AARCH64EB__ rev32 v17.16b,v17.16b #endif #ifndef __AARCH64EB__ rev32 v18.16b,v18.16b #endif #ifndef __AARCH64EB__ rev32 v19.16b,v19.16b #endif #ifndef __AARCH64EB__ rev32 v20.16b,v20.16b #endif #ifndef __AARCH64EB__ rev32 v21.16b,v21.16b #endif #ifndef __AARCH64EB__ rev32 v22.16b,v22.16b #endif #ifndef __AARCH64EB__ rev32 v23.16b,v23.16b #endif .inst 0xcec08410 //sm4e v16.4s,v0.4s .inst 0xcec08411 //sm4e v17.4s,v0.4s .inst 0xcec08412 //sm4e v18.4s,v0.4s .inst 0xcec08413 //sm4e v19.4s,v0.4s .inst 0xcec08430 //sm4e v16.4s,v1.4s .inst 0xcec08431 //sm4e v17.4s,v1.4s .inst 0xcec08432 //sm4e v18.4s,v1.4s .inst 0xcec08433 //sm4e v19.4s,v1.4s .inst 0xcec08450 //sm4e v16.4s,v2.4s .inst 0xcec08451 //sm4e v17.4s,v2.4s .inst 0xcec08452 //sm4e v18.4s,v2.4s .inst 0xcec08453 //sm4e v19.4s,v2.4s .inst 0xcec08470 //sm4e v16.4s,v3.4s .inst 0xcec08471 //sm4e v17.4s,v3.4s .inst 0xcec08472 //sm4e v18.4s,v3.4s .inst 0xcec08473 //sm4e v19.4s,v3.4s .inst 0xcec08490 //sm4e v16.4s,v4.4s .inst 0xcec08491 //sm4e v17.4s,v4.4s .inst 0xcec08492 //sm4e v18.4s,v4.4s .inst 0xcec08493 //sm4e v19.4s,v4.4s .inst 0xcec084b0 //sm4e v16.4s,v5.4s .inst 0xcec084b1 //sm4e v17.4s,v5.4s .inst 0xcec084b2 //sm4e v18.4s,v5.4s .inst 0xcec084b3 //sm4e v19.4s,v5.4s .inst 0xcec084d0 //sm4e v16.4s,v6.4s .inst 0xcec084d1 //sm4e v17.4s,v6.4s .inst 0xcec084d2 //sm4e v18.4s,v6.4s .inst 0xcec084d3 //sm4e v19.4s,v6.4s .inst 0xcec084f0 //sm4e v16.4s,v7.4s rev64 v16.4S,v16.4S .inst 0xcec084f1 //sm4e v17.4s,v7.4s ext v16.16b,v16.16b,v16.16b,#8 rev64 v17.4S,v17.4S .inst 0xcec084f2 //sm4e v18.4s,v7.4s ext v17.16b,v17.16b,v17.16b,#8 rev64 v18.4S,v18.4S .inst 0xcec084f3 //sm4e v19.4s,v7.4s ext v18.16b,v18.16b,v18.16b,#8 rev64 v19.4S,v19.4S ext v19.16b,v19.16b,v19.16b,#8 .inst 0xcec08414 //sm4e v20.4s,v0.4s .inst 0xcec08415 //sm4e v21.4s,v0.4s .inst 0xcec08416 //sm4e v22.4s,v0.4s .inst 0xcec08417 //sm4e v23.4s,v0.4s .inst 0xcec08434 //sm4e v20.4s,v1.4s .inst 0xcec08435 //sm4e v21.4s,v1.4s .inst 0xcec08436 //sm4e v22.4s,v1.4s .inst 0xcec08437 //sm4e v23.4s,v1.4s .inst 0xcec08454 //sm4e v20.4s,v2.4s .inst 0xcec08455 //sm4e v21.4s,v2.4s .inst 0xcec08456 //sm4e v22.4s,v2.4s .inst 0xcec08457 //sm4e v23.4s,v2.4s .inst 0xcec08474 //sm4e v20.4s,v3.4s .inst 0xcec08475 //sm4e v21.4s,v3.4s .inst 0xcec08476 //sm4e v22.4s,v3.4s .inst 0xcec08477 //sm4e v23.4s,v3.4s .inst 0xcec08494 //sm4e v20.4s,v4.4s .inst 0xcec08495 //sm4e v21.4s,v4.4s .inst 0xcec08496 //sm4e v22.4s,v4.4s .inst 0xcec08497 //sm4e v23.4s,v4.4s .inst 0xcec084b4 //sm4e v20.4s,v5.4s .inst 0xcec084b5 //sm4e v21.4s,v5.4s .inst 0xcec084b6 //sm4e v22.4s,v5.4s .inst 0xcec084b7 //sm4e v23.4s,v5.4s .inst 0xcec084d4 //sm4e v20.4s,v6.4s .inst 0xcec084d5 //sm4e v21.4s,v6.4s .inst 0xcec084d6 //sm4e v22.4s,v6.4s .inst 0xcec084d7 //sm4e v23.4s,v6.4s .inst 0xcec084f4 //sm4e v20.4s,v7.4s rev64 v20.4S,v20.4S .inst 0xcec084f5 //sm4e v21.4s,v7.4s ext v20.16b,v20.16b,v20.16b,#8 rev64 v21.4S,v21.4S .inst 0xcec084f6 //sm4e v22.4s,v7.4s ext v21.16b,v21.16b,v21.16b,#8 rev64 v22.4S,v22.4S .inst 0xcec084f7 //sm4e v23.4s,v7.4s ext v22.16b,v22.16b,v22.16b,#8 rev64 v23.4S,v23.4S ext v23.16b,v23.16b,v23.16b,#8 #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif #ifndef __AARCH64EB__ rev32 v17.16b,v17.16b #endif #ifndef __AARCH64EB__ rev32 v18.16b,v18.16b #endif #ifndef __AARCH64EB__ rev32 v19.16b,v19.16b #endif #ifndef __AARCH64EB__ rev32 v20.16b,v20.16b #endif #ifndef __AARCH64EB__ rev32 v21.16b,v21.16b #endif #ifndef __AARCH64EB__ rev32 v22.16b,v22.16b #endif #ifndef __AARCH64EB__ rev32 v23.16b,v23.16b #endif eor v16.16b,v16.16b,v8.16b eor v17.16b,v17.16b,v24.16b eor v18.16b,v18.16b,v25.16b mov v8.16b,v31.16b eor v19.16b,v19.16b,v26.16b eor v20.16b,v20.16b,v27.16b eor v21.16b,v21.16b,v28.16b eor v22.16b,v22.16b,v29.16b eor v23.16b,v23.16b,v30.16b st1 {v16.4s,v17.4s,v18.4s,v19.4s},[x1],#64 st1 {v20.4s,v21.4s,v22.4s,v23.4s},[x1],#64 subs x2,x2,128 b.gt 1b b 3f // 4 blocks mode 2: #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif #ifndef __AARCH64EB__ rev32 v17.16b,v17.16b #endif #ifndef __AARCH64EB__ rev32 v18.16b,v18.16b #endif #ifndef __AARCH64EB__ rev32 v19.16b,v19.16b #endif .inst 0xcec08410 //sm4e v16.4s,v0.4s .inst 0xcec08411 //sm4e v17.4s,v0.4s .inst 0xcec08412 //sm4e v18.4s,v0.4s .inst 0xcec08413 //sm4e v19.4s,v0.4s .inst 0xcec08430 //sm4e v16.4s,v1.4s .inst 0xcec08431 //sm4e v17.4s,v1.4s .inst 0xcec08432 //sm4e v18.4s,v1.4s .inst 0xcec08433 //sm4e v19.4s,v1.4s .inst 0xcec08450 //sm4e v16.4s,v2.4s .inst 0xcec08451 //sm4e v17.4s,v2.4s .inst 0xcec08452 //sm4e v18.4s,v2.4s .inst 0xcec08453 //sm4e v19.4s,v2.4s .inst 0xcec08470 //sm4e v16.4s,v3.4s .inst 0xcec08471 //sm4e v17.4s,v3.4s .inst 0xcec08472 //sm4e v18.4s,v3.4s .inst 0xcec08473 //sm4e v19.4s,v3.4s .inst 0xcec08490 //sm4e v16.4s,v4.4s .inst 0xcec08491 //sm4e v17.4s,v4.4s .inst 0xcec08492 //sm4e v18.4s,v4.4s .inst 0xcec08493 //sm4e v19.4s,v4.4s .inst 0xcec084b0 //sm4e v16.4s,v5.4s .inst 0xcec084b1 //sm4e v17.4s,v5.4s .inst 0xcec084b2 //sm4e v18.4s,v5.4s .inst 0xcec084b3 //sm4e v19.4s,v5.4s .inst 0xcec084d0 //sm4e v16.4s,v6.4s .inst 0xcec084d1 //sm4e v17.4s,v6.4s .inst 0xcec084d2 //sm4e v18.4s,v6.4s .inst 0xcec084d3 //sm4e v19.4s,v6.4s .inst 0xcec084f0 //sm4e v16.4s,v7.4s rev64 v16.4S,v16.4S .inst 0xcec084f1 //sm4e v17.4s,v7.4s ext v16.16b,v16.16b,v16.16b,#8 rev64 v17.4S,v17.4S .inst 0xcec084f2 //sm4e v18.4s,v7.4s ext v17.16b,v17.16b,v17.16b,#8 rev64 v18.4S,v18.4S .inst 0xcec084f3 //sm4e v19.4s,v7.4s ext v18.16b,v18.16b,v18.16b,#8 rev64 v19.4S,v19.4S ext v19.16b,v19.16b,v19.16b,#8 #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif #ifndef __AARCH64EB__ rev32 v17.16b,v17.16b #endif #ifndef __AARCH64EB__ rev32 v18.16b,v18.16b #endif #ifndef __AARCH64EB__ rev32 v19.16b,v19.16b #endif eor v16.16b,v16.16b,v8.16b eor v17.16b,v17.16b,v24.16b mov v8.16b,v27.16b eor v18.16b,v18.16b,v25.16b eor v19.16b,v19.16b,v26.16b st1 {v16.4s,v17.4s,v18.4s,v19.4s},[x1],#64 subs x2,x2,#64 b.gt 1b 1: subs x2,x2,#16 b.lt 3f ld1 {v16.4s},[x0],#16 mov v24.16b,v16.16b #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif .inst 0xcec08410 //sm4e v16.4s,v0.4s .inst 0xcec08430 //sm4e v16.4s,v1.4s .inst 0xcec08450 //sm4e v16.4s,v2.4s .inst 0xcec08470 //sm4e v16.4s,v3.4s .inst 0xcec08490 //sm4e v16.4s,v4.4s .inst 0xcec084b0 //sm4e v16.4s,v5.4s .inst 0xcec084d0 //sm4e v16.4s,v6.4s .inst 0xcec084f0 //sm4e v16.4s,v7.4s rev64 v16.4S,v16.4S ext v16.16b,v16.16b,v16.16b,#8 #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif eor v16.16b,v16.16b,v8.16b mov v8.16b,v24.16b st1 {v16.4s},[x1],#16 b.ne 1b 3: // save back IV st1 {v8.4s},[x4] ldp d8,d9,[sp],#16 ret .size sm4_v8_cbc_encrypt,.-sm4_v8_cbc_encrypt .globl sm4_v8_ctr32_encrypt_blocks .type sm4_v8_ctr32_encrypt_blocks,%function .align 5 sm4_v8_ctr32_encrypt_blocks: AARCH64_VALID_CALL_TARGET stp d8,d9,[sp, #-16]! ld1 {v8.4s},[x4] ld1 {v0.4s,v1.4s,v2.4s,v3.4s},[x3],64 ld1 {v4.4s,v5.4s,v6.4s,v7.4s},[x3] #ifndef __AARCH64EB__ rev32 v8.16b,v8.16b #endif mov w5,v8.s[3] 1: cmp x2,#4 b.lt 1f ld1 {v24.4s,v25.4s,v26.4s,v27.4s},[x0],#64 mov v16.16b,v8.16b mov v17.16b,v8.16b mov v18.16b,v8.16b mov v19.16b,v8.16b add w5,w5,#1 mov v17.s[3],w5 add w5,w5,#1 mov v18.s[3],w5 add w5,w5,#1 mov v19.s[3],w5 cmp x2,#8 b.lt 2f ld1 {v28.4s,v29.4s,v30.4s,v31.4s},[x0],#64 mov v20.16b,v8.16b mov v21.16b,v8.16b mov v22.16b,v8.16b mov v23.16b,v8.16b add w5,w5,#1 mov v20.s[3],w5 add w5,w5,#1 mov v21.s[3],w5 add w5,w5,#1 mov v22.s[3],w5 add w5,w5,#1 mov v23.s[3],w5 .inst 0xcec08410 //sm4e v16.4s,v0.4s .inst 0xcec08411 //sm4e v17.4s,v0.4s .inst 0xcec08412 //sm4e v18.4s,v0.4s .inst 0xcec08413 //sm4e v19.4s,v0.4s .inst 0xcec08430 //sm4e v16.4s,v1.4s .inst 0xcec08431 //sm4e v17.4s,v1.4s .inst 0xcec08432 //sm4e v18.4s,v1.4s .inst 0xcec08433 //sm4e v19.4s,v1.4s .inst 0xcec08450 //sm4e v16.4s,v2.4s .inst 0xcec08451 //sm4e v17.4s,v2.4s .inst 0xcec08452 //sm4e v18.4s,v2.4s .inst 0xcec08453 //sm4e v19.4s,v2.4s .inst 0xcec08470 //sm4e v16.4s,v3.4s .inst 0xcec08471 //sm4e v17.4s,v3.4s .inst 0xcec08472 //sm4e v18.4s,v3.4s .inst 0xcec08473 //sm4e v19.4s,v3.4s .inst 0xcec08490 //sm4e v16.4s,v4.4s .inst 0xcec08491 //sm4e v17.4s,v4.4s .inst 0xcec08492 //sm4e v18.4s,v4.4s .inst 0xcec08493 //sm4e v19.4s,v4.4s .inst 0xcec084b0 //sm4e v16.4s,v5.4s .inst 0xcec084b1 //sm4e v17.4s,v5.4s .inst 0xcec084b2 //sm4e v18.4s,v5.4s .inst 0xcec084b3 //sm4e v19.4s,v5.4s .inst 0xcec084d0 //sm4e v16.4s,v6.4s .inst 0xcec084d1 //sm4e v17.4s,v6.4s .inst 0xcec084d2 //sm4e v18.4s,v6.4s .inst 0xcec084d3 //sm4e v19.4s,v6.4s .inst 0xcec084f0 //sm4e v16.4s,v7.4s rev64 v16.4S,v16.4S .inst 0xcec084f1 //sm4e v17.4s,v7.4s ext v16.16b,v16.16b,v16.16b,#8 rev64 v17.4S,v17.4S .inst 0xcec084f2 //sm4e v18.4s,v7.4s ext v17.16b,v17.16b,v17.16b,#8 rev64 v18.4S,v18.4S .inst 0xcec084f3 //sm4e v19.4s,v7.4s ext v18.16b,v18.16b,v18.16b,#8 rev64 v19.4S,v19.4S ext v19.16b,v19.16b,v19.16b,#8 .inst 0xcec08414 //sm4e v20.4s,v0.4s .inst 0xcec08415 //sm4e v21.4s,v0.4s .inst 0xcec08416 //sm4e v22.4s,v0.4s .inst 0xcec08417 //sm4e v23.4s,v0.4s .inst 0xcec08434 //sm4e v20.4s,v1.4s .inst 0xcec08435 //sm4e v21.4s,v1.4s .inst 0xcec08436 //sm4e v22.4s,v1.4s .inst 0xcec08437 //sm4e v23.4s,v1.4s .inst 0xcec08454 //sm4e v20.4s,v2.4s .inst 0xcec08455 //sm4e v21.4s,v2.4s .inst 0xcec08456 //sm4e v22.4s,v2.4s .inst 0xcec08457 //sm4e v23.4s,v2.4s .inst 0xcec08474 //sm4e v20.4s,v3.4s .inst 0xcec08475 //sm4e v21.4s,v3.4s .inst 0xcec08476 //sm4e v22.4s,v3.4s .inst 0xcec08477 //sm4e v23.4s,v3.4s .inst 0xcec08494 //sm4e v20.4s,v4.4s .inst 0xcec08495 //sm4e v21.4s,v4.4s .inst 0xcec08496 //sm4e v22.4s,v4.4s .inst 0xcec08497 //sm4e v23.4s,v4.4s .inst 0xcec084b4 //sm4e v20.4s,v5.4s .inst 0xcec084b5 //sm4e v21.4s,v5.4s .inst 0xcec084b6 //sm4e v22.4s,v5.4s .inst 0xcec084b7 //sm4e v23.4s,v5.4s .inst 0xcec084d4 //sm4e v20.4s,v6.4s .inst 0xcec084d5 //sm4e v21.4s,v6.4s .inst 0xcec084d6 //sm4e v22.4s,v6.4s .inst 0xcec084d7 //sm4e v23.4s,v6.4s .inst 0xcec084f4 //sm4e v20.4s,v7.4s rev64 v20.4S,v20.4S .inst 0xcec084f5 //sm4e v21.4s,v7.4s ext v20.16b,v20.16b,v20.16b,#8 rev64 v21.4S,v21.4S .inst 0xcec084f6 //sm4e v22.4s,v7.4s ext v21.16b,v21.16b,v21.16b,#8 rev64 v22.4S,v22.4S .inst 0xcec084f7 //sm4e v23.4s,v7.4s ext v22.16b,v22.16b,v22.16b,#8 rev64 v23.4S,v23.4S ext v23.16b,v23.16b,v23.16b,#8 #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif #ifndef __AARCH64EB__ rev32 v17.16b,v17.16b #endif #ifndef __AARCH64EB__ rev32 v18.16b,v18.16b #endif #ifndef __AARCH64EB__ rev32 v19.16b,v19.16b #endif #ifndef __AARCH64EB__ rev32 v20.16b,v20.16b #endif #ifndef __AARCH64EB__ rev32 v21.16b,v21.16b #endif #ifndef __AARCH64EB__ rev32 v22.16b,v22.16b #endif #ifndef __AARCH64EB__ rev32 v23.16b,v23.16b #endif eor v16.16b,v16.16b,v24.16b eor v17.16b,v17.16b,v25.16b eor v18.16b,v18.16b,v26.16b eor v19.16b,v19.16b,v27.16b eor v20.16b,v20.16b,v28.16b eor v21.16b,v21.16b,v29.16b eor v22.16b,v22.16b,v30.16b eor v23.16b,v23.16b,v31.16b st1 {v16.4s,v17.4s,v18.4s,v19.4s},[x1],#64 st1 {v20.4s,v21.4s,v22.4s,v23.4s},[x1],#64 subs x2,x2,#8 b.eq 3f add w5,w5,#1 mov v8.s[3],w5 b 1b 2: .inst 0xcec08410 //sm4e v16.4s,v0.4s .inst 0xcec08411 //sm4e v17.4s,v0.4s .inst 0xcec08412 //sm4e v18.4s,v0.4s .inst 0xcec08413 //sm4e v19.4s,v0.4s .inst 0xcec08430 //sm4e v16.4s,v1.4s .inst 0xcec08431 //sm4e v17.4s,v1.4s .inst 0xcec08432 //sm4e v18.4s,v1.4s .inst 0xcec08433 //sm4e v19.4s,v1.4s .inst 0xcec08450 //sm4e v16.4s,v2.4s .inst 0xcec08451 //sm4e v17.4s,v2.4s .inst 0xcec08452 //sm4e v18.4s,v2.4s .inst 0xcec08453 //sm4e v19.4s,v2.4s .inst 0xcec08470 //sm4e v16.4s,v3.4s .inst 0xcec08471 //sm4e v17.4s,v3.4s .inst 0xcec08472 //sm4e v18.4s,v3.4s .inst 0xcec08473 //sm4e v19.4s,v3.4s .inst 0xcec08490 //sm4e v16.4s,v4.4s .inst 0xcec08491 //sm4e v17.4s,v4.4s .inst 0xcec08492 //sm4e v18.4s,v4.4s .inst 0xcec08493 //sm4e v19.4s,v4.4s .inst 0xcec084b0 //sm4e v16.4s,v5.4s .inst 0xcec084b1 //sm4e v17.4s,v5.4s .inst 0xcec084b2 //sm4e v18.4s,v5.4s .inst 0xcec084b3 //sm4e v19.4s,v5.4s .inst 0xcec084d0 //sm4e v16.4s,v6.4s .inst 0xcec084d1 //sm4e v17.4s,v6.4s .inst 0xcec084d2 //sm4e v18.4s,v6.4s .inst 0xcec084d3 //sm4e v19.4s,v6.4s .inst 0xcec084f0 //sm4e v16.4s,v7.4s rev64 v16.4S,v16.4S .inst 0xcec084f1 //sm4e v17.4s,v7.4s ext v16.16b,v16.16b,v16.16b,#8 rev64 v17.4S,v17.4S .inst 0xcec084f2 //sm4e v18.4s,v7.4s ext v17.16b,v17.16b,v17.16b,#8 rev64 v18.4S,v18.4S .inst 0xcec084f3 //sm4e v19.4s,v7.4s ext v18.16b,v18.16b,v18.16b,#8 rev64 v19.4S,v19.4S ext v19.16b,v19.16b,v19.16b,#8 #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif #ifndef __AARCH64EB__ rev32 v17.16b,v17.16b #endif #ifndef __AARCH64EB__ rev32 v18.16b,v18.16b #endif #ifndef __AARCH64EB__ rev32 v19.16b,v19.16b #endif eor v16.16b,v16.16b,v24.16b eor v17.16b,v17.16b,v25.16b eor v18.16b,v18.16b,v26.16b eor v19.16b,v19.16b,v27.16b st1 {v16.4s,v17.4s,v18.4s,v19.4s},[x1],#64 subs x2,x2,#4 b.eq 3f add w5,w5,#1 mov v8.s[3],w5 b 1b 1: subs x2,x2,#1 b.lt 3f mov v16.16b,v8.16b ld1 {v24.4s},[x0],#16 .inst 0xcec08410 //sm4e v16.4s,v0.4s .inst 0xcec08430 //sm4e v16.4s,v1.4s .inst 0xcec08450 //sm4e v16.4s,v2.4s .inst 0xcec08470 //sm4e v16.4s,v3.4s .inst 0xcec08490 //sm4e v16.4s,v4.4s .inst 0xcec084b0 //sm4e v16.4s,v5.4s .inst 0xcec084d0 //sm4e v16.4s,v6.4s .inst 0xcec084f0 //sm4e v16.4s,v7.4s rev64 v16.4S,v16.4S ext v16.16b,v16.16b,v16.16b,#8 #ifndef __AARCH64EB__ rev32 v16.16b,v16.16b #endif eor v16.16b,v16.16b,v24.16b st1 {v16.4s},[x1],#16 b.eq 3f add w5,w5,#1 mov v8.s[3],w5 b 1b 3: ldp d8,d9,[sp],#16 ret .size sm4_v8_ctr32_encrypt_blocks,.-sm4_v8_ctr32_encrypt_blocks