mirror of
https://github.com/emmansun/gmsm.git
synced 2025-04-28 05:06:18 +08:00
sm4: amd64, a bit change for single block
This commit is contained in:
parent
6eb5efd898
commit
761746de78
@ -158,20 +158,15 @@ GLOBL fk_mask<>(SB), 8, $16
|
|||||||
|
|
||||||
// SM4 single round function, handle 16 bytes data
|
// SM4 single round function, handle 16 bytes data
|
||||||
// t0 ^= tao_l1(t1^t2^t3^xk)
|
// t0 ^= tao_l1(t1^t2^t3^xk)
|
||||||
// used R19 as temp 32/64 bits register
|
|
||||||
// parameters:
|
// parameters:
|
||||||
// - index: round key index immediate number
|
// - x: 128 bits temp register (also as input RK)
|
||||||
// - RK: round key register
|
|
||||||
// - IND: round key index base register
|
|
||||||
// - x: 128 bits temp register
|
|
||||||
// - y: 128 bits temp register
|
// - y: 128 bits temp register
|
||||||
// - z: 128 bits temp register
|
// - z: 128 bits temp register
|
||||||
// - t0: 128 bits register for data as result
|
// - t0: 128 bits register for data as result
|
||||||
// - t1: 128 bits register for data
|
// - t1: 128 bits register for data
|
||||||
// - t2: 128 bits register for data
|
// - t2: 128 bits register for data
|
||||||
// - t3: 128 bits register for data
|
// - t3: 128 bits register for data
|
||||||
#define SM4_SINGLE_ROUND(index, RK, IND, x, y, z, t0, t1, t2, t3) \
|
#define SM4_SINGLE_ROUND(x, y, z, t0, t1, t2, t3) \
|
||||||
MOVL (index * 4)(RK)(IND*1), x; \
|
|
||||||
PXOR t1, x; \
|
PXOR t1, x; \
|
||||||
PXOR t2, x; \
|
PXOR t2, x; \
|
||||||
PXOR t3, x; \
|
PXOR t3, x; \
|
||||||
|
@ -327,7 +327,7 @@ TEXT ·encryptBlockAsm(SB),NOSPLIT,$0
|
|||||||
MOVQ dst+8(FP), BX
|
MOVQ dst+8(FP), BX
|
||||||
MOVQ src+16(FP), DX
|
MOVQ src+16(FP), DX
|
||||||
|
|
||||||
MOVOU (DX), t0
|
MOVUPS (DX), t0
|
||||||
PSHUFB flip_mask<>(SB), t0
|
PSHUFB flip_mask<>(SB), t0
|
||||||
PSHUFD $1, t0, t1
|
PSHUFD $1, t0, t1
|
||||||
PSHUFD $2, t0, t2
|
PSHUFD $2, t0, t2
|
||||||
@ -336,21 +336,25 @@ TEXT ·encryptBlockAsm(SB),NOSPLIT,$0
|
|||||||
XORL CX, CX
|
XORL CX, CX
|
||||||
|
|
||||||
loop:
|
loop:
|
||||||
SM4_SINGLE_ROUND(0, AX, CX, x, y, XTMP6, t0, t1, t2, t3)
|
MOVUPS (AX)(CX*1), XTMP7
|
||||||
SM4_SINGLE_ROUND(1, AX, CX, x, y, XTMP6, t1, t2, t3, t0)
|
MOVOU XTMP7, x
|
||||||
SM4_SINGLE_ROUND(2, AX, CX, x, y, XTMP6, t2, t3, t0, t1)
|
SM4_SINGLE_ROUND(x, y, XTMP6, t0, t1, t2, t3)
|
||||||
SM4_SINGLE_ROUND(3, AX, CX, x, y, XTMP6, t3, t0, t1, t2)
|
PSHUFD $1, XTMP7, x
|
||||||
|
SM4_SINGLE_ROUND(x, y, XTMP6, t1, t2, t3, t0)
|
||||||
|
PSHUFD $2, XTMP7, x
|
||||||
|
SM4_SINGLE_ROUND(x, y, XTMP6, t2, t3, t0, t1)
|
||||||
|
PSHUFD $3, XTMP7, x
|
||||||
|
SM4_SINGLE_ROUND(x, y, XTMP6, t3, t0, t1, t2)
|
||||||
|
|
||||||
ADDL $16, CX
|
ADDL $16, CX
|
||||||
CMPL CX, $4*32
|
CMPL CX, $4*32
|
||||||
JB loop
|
JB loop
|
||||||
|
|
||||||
PALIGNR $4, t3, t3
|
PUNPCKLLQ t2, t3
|
||||||
PALIGNR $4, t3, t2
|
PUNPCKLLQ t0, t1
|
||||||
PALIGNR $4, t2, t1
|
PUNPCKLQDQ t1, t3
|
||||||
PALIGNR $4, t1, t0
|
PSHUFB flip_mask<>(SB), t3
|
||||||
PSHUFB flip_mask<>(SB), t0
|
MOVUPS t3, (BX)
|
||||||
MOVOU t0, (BX)
|
|
||||||
|
|
||||||
done_sm4:
|
done_sm4:
|
||||||
RET
|
RET
|
||||||
|
@ -131,10 +131,23 @@ func TestEncryptBlocksDoubleWithAESNI(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkExpand(b *testing.B) {
|
func BenchmarkExpandAESNI(b *testing.B) {
|
||||||
c := &sm4Cipher{}
|
c := &sm4Cipher{}
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
expandKey(encryptTests[0].key, c.enc[:], c.dec[:])
|
expandKeyAsm(&encryptTests[0].key[0], &ck[0], &c.enc[0], &c.dec[0], INST_AES)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkEncryptAsm(b *testing.B) {
|
||||||
|
src := []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10}
|
||||||
|
encRes2 := make([]uint32, 32)
|
||||||
|
decRes2 := make([]uint32, 32)
|
||||||
|
expandKeyAsm(&src[0], &ck[0], &encRes2[0], &decRes2[0], 0)
|
||||||
|
dst := make([]byte, 16)
|
||||||
|
b.SetBytes(int64(len(src)))
|
||||||
|
b.ResetTimer()
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
encryptBlockAsm(&encRes2[0], &dst[0], &src[0], 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -166,14 +166,19 @@ TEXT ·gcmSm4Init(SB),NOSPLIT,$0
|
|||||||
XORL CX, CX
|
XORL CX, CX
|
||||||
|
|
||||||
sm4InitEncLoop:
|
sm4InitEncLoop:
|
||||||
SM4_SINGLE_ROUND(0, RK, CX, T0, T1, T2, B3, B2, B1, B0)
|
MOVUPS (RK)(CX*1), B4
|
||||||
SM4_SINGLE_ROUND(1, RK, CX, T0, T1, T2, B2, B1, B0, B3)
|
MOVOU B4, T0
|
||||||
SM4_SINGLE_ROUND(2, RK, CX, T0, T1, T2, B1, B0, B3, B2)
|
SM4_SINGLE_ROUND(T0, T1, T2, B3, B2, B1, B0)
|
||||||
SM4_SINGLE_ROUND(3, RK, CX, T0, T1, T2, B0, B3, B2, B1)
|
PSHUFD $1, B4, T0
|
||||||
|
SM4_SINGLE_ROUND(T0, T1, T2, B2, B1, B0, B3)
|
||||||
|
PSHUFD $2, B4, T0
|
||||||
|
SM4_SINGLE_ROUND(T0, T1, T2, B1, B0, B3, B2)
|
||||||
|
PSHUFD $3, B4, T0
|
||||||
|
SM4_SINGLE_ROUND(T0, T1, T2, B0, B3, B2, B1)
|
||||||
|
|
||||||
ADDL $16, CX
|
ADDL $16, CX
|
||||||
CMPL CX, $4*32
|
CMPL CX, $4*32
|
||||||
JB sm4InitEncLoop
|
JB sm4InitEncLoop
|
||||||
|
|
||||||
PALIGNR $4, B3, B3
|
PALIGNR $4, B3, B3
|
||||||
PALIGNR $4, B3, B2
|
PALIGNR $4, B3, B2
|
||||||
|
Loading…
x
Reference in New Issue
Block a user