From 4c131bdeb6667cd7d3c5adee9b3e3284123a5844 Mon Sep 17 00:00:00 2001 From: Emman Date: Fri, 29 Apr 2022 08:56:53 +0800 Subject: [PATCH] refactoring and fix bug --- sm4/gcm_sm4ni_arm64.s | 252 ++++++++++++++---------------------------- 1 file changed, 83 insertions(+), 169 deletions(-) diff --git a/sm4/gcm_sm4ni_arm64.s b/sm4/gcm_sm4ni_arm64.s index ee40b10..5312c73 100644 --- a/sm4/gcm_sm4ni_arm64.s +++ b/sm4/gcm_sm4ni_arm64.s @@ -59,6 +59,75 @@ VPMULL T0.D1, T2.D1, T3.Q1 \ VEOR T3.B16, ACCM.B16, ACCM.B16 +#define sm4eEnc1block() \ + WORD 0x6086c0ce \ //SM4E V0.4S, V19.4S + WORD 0x8086c0ce \ //SM4E V0.4S, V20.4S + WORD 0xa086c0ce \ //SM4E V0.4S, V21.4S + WORD 0xc086c0ce \ //SM4E V0.4S, V22.4S + WORD 0xe086c0ce \ //SM4E V0.4S, V23.4S + WORD 0x0087c0ce \ //SM4E V0.4S, V24.4S + WORD 0x2087c0ce \ //SM4E V0.4S, V25.4S + WORD 0x4087c0ce //SM4E V0.4S, V26.4S + +#define sm4eEnc8blocks() \ + sm4eEnc1block() \ + WORD 0x6186c0ce \ //SM4E V1.4S, V19.4S + WORD 0x8186c0ce \ //SM4E V1.4S, V20.4S + WORD 0xa186c0ce \ //SM4E V1.4S, V21.4S + WORD 0xc186c0ce \ //SM4E V1.4S, V22.4S + WORD 0xe186c0ce \ //SM4E V1.4S, V23.4S + WORD 0x0187c0ce \ //SM4E V1.4S, V24.4S + WORD 0x2187c0ce \ //SM4E V1.4S, V25.4S + WORD 0x4187c0ce \ //SM4E V1.4S, V26.4S + WORD 0x6286c0ce \ //SM4E V2.4S, V19.4S + WORD 0x8286c0ce \ //SM4E V2.4S, V20.4S + WORD 0xa286c0ce \ //SM4E V2.4S, V21.4S + WORD 0xc286c0ce \ //SM4E V2.4S, V22.4S + WORD 0xe286c0ce \ //SM4E V2.4S, V23.4S + WORD 0x0287c0ce \ //SM4E V2.4S, V24.4S + WORD 0x2287c0ce \ //SM4E V2.4S, V25.4S + WORD 0x4287c0ce \ //SM4E V2.4S, V26.4S + WORD 0x6386c0ce \ //SM4E V3.4S, V19.4S + WORD 0x8386c0ce \ //SM4E V3.4S, V20.4S + WORD 0xa386c0ce \ //SM4E V3.4S, V21.4S + WORD 0xc386c0ce \ //SM4E V3.4S, V22.4S + WORD 0xe386c0ce \ //SM4E V3.4S, V23.4S + WORD 0x0387c0ce \ //SM4E V3.4S, V24.4S + WORD 0x2387c0ce \ //SM4E V3.4S, V25.4S + WORD 0x4387c0ce \ //SM4E V3.4S, V26.4S + WORD 0x6486c0ce \ //SM4E V4.4S, V19.4S + WORD 0x8486c0ce \ //SM4E V4.4S, V20.4S + WORD 0xa486c0ce \ //SM4E V4.4S, V21.4S + WORD 0xc486c0ce \ //SM4E V4.4S, V22.4S + WORD 0xe486c0ce \ //SM4E V4.4S, V23.4S + WORD 0x0487c0ce \ //SM4E V4.4S, V24.4S + WORD 0x2487c0ce \ //SM4E V4.4S, V25.4S + WORD 0x4487c0ce \ //SM4E V4.4S, V26.4S + WORD 0x6586c0ce \ //SM4E V5.4S, V19.4S + WORD 0x8586c0ce \ //SM4E V5.4S, V20.4S + WORD 0xa586c0ce \ //SM4E V5.4S, V21.4S + WORD 0xc586c0ce \ //SM4E V5.4S, V22.4S + WORD 0xe586c0ce \ //SM4E V5.4S, V23.4S + WORD 0x0587c0ce \ //SM4E V5.4S, V24.4S + WORD 0x2587c0ce \ //SM4E V5.4S, V25.4S + WORD 0x4587c0ce \ //SM4E V5.4S, V26.4S + WORD 0x6686c0ce \ //SM4E V6.4S, V19.4S + WORD 0x8686c0ce \ //SM4E V6.4S, V20.4S + WORD 0xa686c0ce \ //SM4E V6.4S, V21.4S + WORD 0xc686c0ce \ //SM4E V6.4S, V22.4S + WORD 0xe686c0ce \ //SM4E V6.4S, V23.4S + WORD 0x0687c0ce \ //SM4E V6.4S, V24.4S + WORD 0x2687c0ce \ //SM4E V6.4S, V25.4S + WORD 0x4687c0ce \ //SM4E V6.4S, V26.4S + WORD 0x6786c0ce \ //SM4E V7.4S, V19.4S + WORD 0x8786c0ce \ //SM4E V7.4S, V20.4S + WORD 0xa786c0ce \ //SM4E V7.4S, V21.4S + WORD 0xc786c0ce \ //SM4E V7.4S, V22.4S + WORD 0xe786c0ce \ //SM4E V7.4S, V23.4S + WORD 0x0787c0ce \ //SM4E V7.4S, V24.4S + WORD 0x2787c0ce \ //SM4E V7.4S, V25.4S + WORD 0x4787c0ce //SM4E V7.4S, V26.4S + // func gcmSm4niEnc(productTable *[256]byte, dst, src []byte, ctr, T *[16]byte, rk []uint32) TEXT ·gcmSm4niEnc(SB),NOSPLIT,$0 #define pTbl R0 @@ -123,70 +192,7 @@ octetsLoop: VADD B6.S4, INC.S4, B7.S4 VADD B7.S4, INC.S4, CTR.S4 - WORD 0x6086c0ce //SM4E V0.4S, V19.4S - WORD 0x8086c0ce //SM4E V0.4S, V20.4S - WORD 0xa086c0ce //SM4E V0.4S, V21.4S - WORD 0xc086c0ce //SM4E V0.4S, V22.4S - WORD 0xe086c0ce //SM4E V0.4S, V23.4S - WORD 0x0087c0ce //SM4E V0.4S, V24.4S - WORD 0x2087c0ce //SM4E V0.4S, V25.4S - WORD 0x4087c0ce //SM4E V0.4S, V26.4S - WORD 0x6186c0ce //SM4E V1.4S, V19.4S - WORD 0x8186c0ce //SM4E V1.4S, V20.4S - WORD 0xa186c0ce //SM4E V1.4S, V21.4S - WORD 0xc186c0ce //SM4E V1.4S, V22.4S - WORD 0xe186c0ce //SM4E V1.4S, V23.4S - WORD 0x0187c0ce //SM4E V1.4S, V24.4S - WORD 0x2187c0ce //SM4E V1.4S, V25.4S - WORD 0x4187c0ce //SM4E V1.4S, V26.4S - WORD 0x6286c0ce //SM4E V2.4S, V19.4S - WORD 0x8286c0ce //SM4E V2.4S, V20.4S - WORD 0xa286c0ce //SM4E V2.4S, V21.4S - WORD 0xc286c0ce //SM4E V2.4S, V22.4S - WORD 0xe286c0ce //SM4E V2.4S, V23.4S - WORD 0x0287c0ce //SM4E V2.4S, V24.4S - WORD 0x2287c0ce //SM4E V2.4S, V25.4S - WORD 0x4287c0ce //SM4E V2.4S, V26.4S - WORD 0x6386c0ce //SM4E V3.4S, V19.4S - WORD 0x8386c0ce //SM4E V3.4S, V20.4S - WORD 0xa386c0ce //SM4E V3.4S, V21.4S - WORD 0xc386c0ce //SM4E V3.4S, V22.4S - WORD 0xe386c0ce //SM4E V3.4S, V23.4S - WORD 0x0387c0ce //SM4E V3.4S, V24.4S - WORD 0x2387c0ce //SM4E V3.4S, V25.4S - WORD 0x4387c0ce //SM4E V3.4S, V26.4S - WORD 0x6486c0ce //SM4E V4.4S, V19.4S - WORD 0x8486c0ce //SM4E V4.4S, V20.4S - WORD 0xa486c0ce //SM4E V4.4S, V21.4S - WORD 0xc486c0ce //SM4E V4.4S, V22.4S - WORD 0xe486c0ce //SM4E V4.4S, V23.4S - WORD 0x0487c0ce //SM4E V4.4S, V24.4S - WORD 0x2487c0ce //SM4E V4.4S, V25.4S - WORD 0x4487c0ce //SM4E V4.4S, V26.4S - WORD 0x6586c0ce //SM4E V5.4S, V19.4S - WORD 0x8586c0ce //SM4E V5.4S, V20.4S - WORD 0xa586c0ce //SM4E V5.4S, V21.4S - WORD 0xc586c0ce //SM4E V5.4S, V22.4S - WORD 0xe586c0ce //SM4E V5.4S, V23.4S - WORD 0x0587c0ce //SM4E V5.4S, V24.4S - WORD 0x2587c0ce //SM4E V5.4S, V25.4S - WORD 0x4587c0ce //SM4E V5.4S, V26.4S - WORD 0x6686c0ce //SM4E V6.4S, V19.4S - WORD 0x8686c0ce //SM4E V6.4S, V20.4S - WORD 0xa686c0ce //SM4E V6.4S, V21.4S - WORD 0xc686c0ce //SM4E V6.4S, V22.4S - WORD 0xe686c0ce //SM4E V6.4S, V23.4S - WORD 0x0687c0ce //SM4E V6.4S, V24.4S - WORD 0x2687c0ce //SM4E V6.4S, V25.4S - WORD 0x4687c0ce //SM4E V6.4S, V26.4S - WORD 0x6786c0ce //SM4E V7.4S, V19.4S - WORD 0x8786c0ce //SM4E V7.4S, V20.4S - WORD 0xa786c0ce //SM4E V7.4S, V21.4S - WORD 0xc786c0ce //SM4E V7.4S, V22.4S - WORD 0xe786c0ce //SM4E V7.4S, V23.4S - WORD 0x0787c0ce //SM4E V7.4S, V24.4S - WORD 0x2787c0ce //SM4E V7.4S, V25.4S - WORD 0x4787c0ce //SM4E V7.4S, V26.4S + sm4eEnc8blocks() VREV32 B0.B16, B0.B16 VREV32 B1.B16, B1.B16 VREV32 B2.B16, B2.B16 @@ -249,15 +255,7 @@ singlesLoop: VMOV CTR.B16, B0.B16 VADD CTR.S4, INC.S4, CTR.S4 - // SM4 8 rounds - WORD 0x6086c0ce //SM4E V0.4S, V19.4S - WORD 0x8086c0ce //SM4E V0.4S, V20.4S - WORD 0xa086c0ce //SM4E V0.4S, V21.4S - WORD 0xc086c0ce //SM4E V0.4S, V22.4S - WORD 0xe086c0ce //SM4E V0.4S, V23.4S - WORD 0x0087c0ce //SM4E V0.4S, V24.4S - WORD 0x2087c0ce //SM4E V0.4S, V25.4S - WORD 0x4087c0ce //SM4E V0.4S, V26.4S + sm4eEnc1block() VREV32 B0.B16, B0.B16 singlesLast: @@ -317,15 +315,7 @@ ld1: ld0: MOVD ZR, srcPtrLen VMOV CTR.B16, B0.B16 - // SM4 8 rounds - WORD 0x6086c0ce //SM4E V0.4S, V19.4S - WORD 0x8086c0ce //SM4E V0.4S, V20.4S - WORD 0xa086c0ce //SM4E V0.4S, V21.4S - WORD 0xc086c0ce //SM4E V0.4S, V22.4S - WORD 0xe086c0ce //SM4E V0.4S, V23.4S - WORD 0x0087c0ce //SM4E V0.4S, V24.4S - WORD 0x2087c0ce //SM4E V0.4S, V25.4S - WORD 0x4087c0ce //SM4E V0.4S, V26.4S + sm4eEnc1block() VREV32 B0.B16, B0.B16 tailLast: @@ -390,70 +380,7 @@ octetsLoop: VADD B6.S4, INC.S4, B7.S4 VADD B7.S4, INC.S4, CTR.S4 - WORD 0x6086c0ce //SM4E V0.4S, V19.4S - WORD 0x8086c0ce //SM4E V0.4S, V20.4S - WORD 0xa086c0ce //SM4E V0.4S, V21.4S - WORD 0xc086c0ce //SM4E V0.4S, V22.4S - WORD 0xe086c0ce //SM4E V0.4S, V23.4S - WORD 0x0087c0ce //SM4E V0.4S, V24.4S - WORD 0x2087c0ce //SM4E V0.4S, V25.4S - WORD 0x4087c0ce //SM4E V0.4S, V26.4S - WORD 0x6186c0ce //SM4E V1.4S, V19.4S - WORD 0x8186c0ce //SM4E V1.4S, V20.4S - WORD 0xa186c0ce //SM4E V1.4S, V21.4S - WORD 0xc186c0ce //SM4E V1.4S, V22.4S - WORD 0xe186c0ce //SM4E V1.4S, V23.4S - WORD 0x0187c0ce //SM4E V1.4S, V24.4S - WORD 0x2187c0ce //SM4E V1.4S, V25.4S - WORD 0x4187c0ce //SM4E V1.4S, V26.4S - WORD 0x6286c0ce //SM4E V2.4S, V19.4S - WORD 0x8286c0ce //SM4E V2.4S, V20.4S - WORD 0xa286c0ce //SM4E V2.4S, V21.4S - WORD 0xc286c0ce //SM4E V2.4S, V22.4S - WORD 0xe286c0ce //SM4E V2.4S, V23.4S - WORD 0x0287c0ce //SM4E V2.4S, V24.4S - WORD 0x2287c0ce //SM4E V2.4S, V25.4S - WORD 0x4287c0ce //SM4E V2.4S, V26.4S - WORD 0x6386c0ce //SM4E V3.4S, V19.4S - WORD 0x8386c0ce //SM4E V3.4S, V20.4S - WORD 0xa386c0ce //SM4E V3.4S, V21.4S - WORD 0xc386c0ce //SM4E V3.4S, V22.4S - WORD 0xe386c0ce //SM4E V3.4S, V23.4S - WORD 0x0387c0ce //SM4E V3.4S, V24.4S - WORD 0x2387c0ce //SM4E V3.4S, V25.4S - WORD 0x4387c0ce //SM4E V3.4S, V26.4S - WORD 0x6486c0ce //SM4E V4.4S, V19.4S - WORD 0x8486c0ce //SM4E V4.4S, V20.4S - WORD 0xa486c0ce //SM4E V4.4S, V21.4S - WORD 0xc486c0ce //SM4E V4.4S, V22.4S - WORD 0xe486c0ce //SM4E V4.4S, V23.4S - WORD 0x0487c0ce //SM4E V4.4S, V24.4S - WORD 0x2487c0ce //SM4E V4.4S, V25.4S - WORD 0x4487c0ce //SM4E V4.4S, V26.4S - WORD 0x6586c0ce //SM4E V5.4S, V19.4S - WORD 0x8586c0ce //SM4E V5.4S, V20.4S - WORD 0xa586c0ce //SM4E V5.4S, V21.4S - WORD 0xc586c0ce //SM4E V5.4S, V22.4S - WORD 0xe586c0ce //SM4E V5.4S, V23.4S - WORD 0x0587c0ce //SM4E V5.4S, V24.4S - WORD 0x2587c0ce //SM4E V5.4S, V25.4S - WORD 0x4587c0ce //SM4E V5.4S, V26.4S - WORD 0x6686c0ce //SM4E V6.4S, V19.4S - WORD 0x8686c0ce //SM4E V6.4S, V20.4S - WORD 0xa686c0ce //SM4E V6.4S, V21.4S - WORD 0xc686c0ce //SM4E V6.4S, V22.4S - WORD 0xe686c0ce //SM4E V6.4S, V23.4S - WORD 0x0687c0ce //SM4E V6.4S, V24.4S - WORD 0x2687c0ce //SM4E V6.4S, V25.4S - WORD 0x4687c0ce //SM4E V6.4S, V26.4S - WORD 0x6786c0ce //SM4E V7.4S, V19.4S - WORD 0x8786c0ce //SM4E V7.4S, V20.4S - WORD 0xa786c0ce //SM4E V7.4S, V21.4S - WORD 0xc786c0ce //SM4E V7.4S, V22.4S - WORD 0xe786c0ce //SM4E V7.4S, V23.4S - WORD 0x0787c0ce //SM4E V7.4S, V24.4S - WORD 0x2787c0ce //SM4E V7.4S, V25.4S - WORD 0x4787c0ce //SM4E V7.4S, V26.4S + sm4eEnc8blocks() VREV32 B0.B16, T1.B16 VREV32 B1.B16, T2.B16 VREV32 B2.B16, B2.B16 @@ -516,21 +443,15 @@ singlesLoop: BLT tail SUB $16, srcPtrLen + VLD1.P 16(srcPtr), [T0.B16] + VREV64 T0.B16, B5.B16 + VMOV CTR.B16, B0.B16 VADD CTR.S4, INC.S4, CTR.S4 - // SM4 8 rounds - WORD 0x6086c0ce //SM4E V0.4S, V19.4S - WORD 0x8086c0ce //SM4E V0.4S, V20.4S - WORD 0xa086c0ce //SM4E V0.4S, V21.4S - WORD 0xc086c0ce //SM4E V0.4S, V22.4S - WORD 0xe086c0ce //SM4E V0.4S, V23.4S - WORD 0x0087c0ce //SM4E V0.4S, V24.4S - WORD 0x2087c0ce //SM4E V0.4S, V25.4S - WORD 0x4087c0ce //SM4E V0.4S, V26.4S + sm4eEnc1block() VREV32 B0.B16, B0.B16 singlesLast: - VLD1.P 16(srcPtr), [T0.B16] VEOR T0.B16, B0.B16, B0.B16 VST1.P [B0.B16], 16(dstPtr) @@ -547,18 +468,11 @@ tail: CBZ srcPtrLen, done VMOV CTR.B16, B0.B16 VADD CTR.S4, INC.S4, CTR.S4 - // SM4 8 rounds - WORD 0x6086c0ce //SM4E V0.4S, V19.4S - WORD 0x8086c0ce //SM4E V0.4S, V20.4S - WORD 0xa086c0ce //SM4E V0.4S, V21.4S - WORD 0xc086c0ce //SM4E V0.4S, V22.4S - WORD 0xe086c0ce //SM4E V0.4S, V23.4S - WORD 0x0087c0ce //SM4E V0.4S, V24.4S - WORD 0x2087c0ce //SM4E V0.4S, V25.4S - WORD 0x4087c0ce //SM4E V0.4S, V26.4S + sm4eEnc1block() VREV32 B0.B16, B0.B16 tailLast: // Assuming it is safe to load past dstPtr due to the presence of the tag + // B5 stored last ciphertext VLD1 (srcPtr), [B5.B16] VEOR B5.B16, B0.B16, B0.B16 @@ -567,27 +481,27 @@ tailLast: MOVD $0, H1 SUB $1, H1 - TBZ $3, srcPtrLen, ld4 + TBZ $3, srcPtrLen, ld4 // Test if srcPtrLen < 8, if yes, goto ld4 VMOV B0.D[0], H0 MOVD.P H0, 8(dstPtr) VMOV H1, T3.D[0] VEXT $8, ZERO.B16, B0.B16, B0.B16 ld4: - TBZ $2, srcPtrLen, ld2 + TBZ $2, srcPtrLen, ld2 // Test if srcPtrLen < 4, if yes, goto ld2 VMOV B0.S[0], H0 MOVW.P H0, 4(dstPtr) VEXT $12, T3.B16, ZERO.B16, T3.B16 VMOV H1, T3.S[0] VEXT $4, ZERO.B16, B0.B16, B0.B16 ld2: - TBZ $1, srcPtrLen, ld1 + TBZ $1, srcPtrLen, ld1 // Test if srcPtrLen < 2, if yes, goto ld1 VMOV B0.H[0], H0 MOVH.P H0, 2(dstPtr) VEXT $14, T3.B16, ZERO.B16, T3.B16 VMOV H1, T3.H[0] VEXT $2, ZERO.B16, B0.B16, B0.B16 ld1: - TBZ $0, srcPtrLen, ld0 + TBZ $0, srcPtrLen, ld0 // Test if srcPtrLen < 1, if yes, goto ld0 VMOV B0.B[0], H0 MOVB.P H0, 1(dstPtr) VEXT $15, T3.B16, ZERO.B16, T3.B16