Commit 8b65f34c authored by Eric Biggers's avatar Eric Biggers Committed by Herbert Xu

crypto: x86/chacha20 - refactor to allow varying number of rounds

In preparation for adding XChaCha12 support, rename/refactor the x86_64
SIMD implementations of ChaCha20 to support different numbers of rounds.
Reviewed-by: default avatarMartin Willi <martin@strongswan.org>
Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 4af78261
...@@ -24,7 +24,7 @@ obj-$(CONFIG_CRYPTO_CAMELLIA_X86_64) += camellia-x86_64.o ...@@ -24,7 +24,7 @@ obj-$(CONFIG_CRYPTO_CAMELLIA_X86_64) += camellia-x86_64.o
obj-$(CONFIG_CRYPTO_BLOWFISH_X86_64) += blowfish-x86_64.o obj-$(CONFIG_CRYPTO_BLOWFISH_X86_64) += blowfish-x86_64.o
obj-$(CONFIG_CRYPTO_TWOFISH_X86_64) += twofish-x86_64.o obj-$(CONFIG_CRYPTO_TWOFISH_X86_64) += twofish-x86_64.o
obj-$(CONFIG_CRYPTO_TWOFISH_X86_64_3WAY) += twofish-x86_64-3way.o obj-$(CONFIG_CRYPTO_TWOFISH_X86_64_3WAY) += twofish-x86_64-3way.o
obj-$(CONFIG_CRYPTO_CHACHA20_X86_64) += chacha20-x86_64.o obj-$(CONFIG_CRYPTO_CHACHA20_X86_64) += chacha-x86_64.o
obj-$(CONFIG_CRYPTO_SERPENT_SSE2_X86_64) += serpent-sse2-x86_64.o obj-$(CONFIG_CRYPTO_SERPENT_SSE2_X86_64) += serpent-sse2-x86_64.o
obj-$(CONFIG_CRYPTO_AES_NI_INTEL) += aesni-intel.o obj-$(CONFIG_CRYPTO_AES_NI_INTEL) += aesni-intel.o
obj-$(CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL) += ghash-clmulni-intel.o obj-$(CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL) += ghash-clmulni-intel.o
...@@ -78,7 +78,7 @@ camellia-x86_64-y := camellia-x86_64-asm_64.o camellia_glue.o ...@@ -78,7 +78,7 @@ camellia-x86_64-y := camellia-x86_64-asm_64.o camellia_glue.o
blowfish-x86_64-y := blowfish-x86_64-asm_64.o blowfish_glue.o blowfish-x86_64-y := blowfish-x86_64-asm_64.o blowfish_glue.o
twofish-x86_64-y := twofish-x86_64-asm_64.o twofish_glue.o twofish-x86_64-y := twofish-x86_64-asm_64.o twofish_glue.o
twofish-x86_64-3way-y := twofish-x86_64-asm_64-3way.o twofish_glue_3way.o twofish-x86_64-3way-y := twofish-x86_64-asm_64-3way.o twofish_glue_3way.o
chacha20-x86_64-y := chacha20-ssse3-x86_64.o chacha20_glue.o chacha-x86_64-y := chacha-ssse3-x86_64.o chacha_glue.o
serpent-sse2-x86_64-y := serpent-sse2-x86_64-asm_64.o serpent_sse2_glue.o serpent-sse2-x86_64-y := serpent-sse2-x86_64-asm_64.o serpent_sse2_glue.o
aegis128-aesni-y := aegis128-aesni-asm.o aegis128-aesni-glue.o aegis128-aesni-y := aegis128-aesni-asm.o aegis128-aesni-glue.o
...@@ -103,7 +103,7 @@ endif ...@@ -103,7 +103,7 @@ endif
ifeq ($(avx2_supported),yes) ifeq ($(avx2_supported),yes)
camellia-aesni-avx2-y := camellia-aesni-avx2-asm_64.o camellia_aesni_avx2_glue.o camellia-aesni-avx2-y := camellia-aesni-avx2-asm_64.o camellia_aesni_avx2_glue.o
chacha20-x86_64-y += chacha20-avx2-x86_64.o chacha-x86_64-y += chacha-avx2-x86_64.o
serpent-avx2-y := serpent-avx2-asm_64.o serpent_avx2_glue.o serpent-avx2-y := serpent-avx2-asm_64.o serpent_avx2_glue.o
morus1280-avx2-y := morus1280-avx2-asm.o morus1280-avx2-glue.o morus1280-avx2-y := morus1280-avx2-asm.o morus1280-avx2-glue.o
...@@ -112,7 +112,7 @@ ifeq ($(avx2_supported),yes) ...@@ -112,7 +112,7 @@ ifeq ($(avx2_supported),yes)
endif endif
ifeq ($(avx512_supported),yes) ifeq ($(avx512_supported),yes)
chacha20-x86_64-y += chacha20-avx512vl-x86_64.o chacha-x86_64-y += chacha-avx512vl-x86_64.o
endif endif
aesni-intel-y := aesni-intel_asm.o aesni-intel_glue.o aesni-intel-y := aesni-intel_asm.o aesni-intel_glue.o
......
/* /*
* ChaCha20 256-bit cipher algorithm, RFC7539, x64 AVX2 functions * ChaCha 256-bit cipher algorithm, x64 AVX2 functions
* *
* Copyright (C) 2015 Martin Willi * Copyright (C) 2015 Martin Willi
* *
...@@ -38,13 +38,14 @@ CTR4BL: .octa 0x00000000000000000000000000000002 ...@@ -38,13 +38,14 @@ CTR4BL: .octa 0x00000000000000000000000000000002
.text .text
ENTRY(chacha20_2block_xor_avx2) ENTRY(chacha_2block_xor_avx2)
# %rdi: Input state matrix, s # %rdi: Input state matrix, s
# %rsi: up to 2 data blocks output, o # %rsi: up to 2 data blocks output, o
# %rdx: up to 2 data blocks input, i # %rdx: up to 2 data blocks input, i
# %rcx: input/output length in bytes # %rcx: input/output length in bytes
# %r8d: nrounds
# This function encrypts two ChaCha20 blocks by loading the state # This function encrypts two ChaCha blocks by loading the state
# matrix twice across four AVX registers. It performs matrix operations # matrix twice across four AVX registers. It performs matrix operations
# on four words in each matrix in parallel, but requires shuffling to # on four words in each matrix in parallel, but requires shuffling to
# rearrange the words after each round. # rearrange the words after each round.
...@@ -68,7 +69,6 @@ ENTRY(chacha20_2block_xor_avx2) ...@@ -68,7 +69,6 @@ ENTRY(chacha20_2block_xor_avx2)
vmovdqa ROT16(%rip),%ymm5 vmovdqa ROT16(%rip),%ymm5
mov %rcx,%rax mov %rcx,%rax
mov $10,%ecx
.Ldoubleround: .Ldoubleround:
...@@ -138,7 +138,7 @@ ENTRY(chacha20_2block_xor_avx2) ...@@ -138,7 +138,7 @@ ENTRY(chacha20_2block_xor_avx2)
# x3 = shuffle32(x3, MASK(0, 3, 2, 1)) # x3 = shuffle32(x3, MASK(0, 3, 2, 1))
vpshufd $0x39,%ymm3,%ymm3 vpshufd $0x39,%ymm3,%ymm3
dec %ecx sub $2,%r8d
jnz .Ldoubleround jnz .Ldoubleround
# o0 = i0 ^ (x0 + s0) # o0 = i0 ^ (x0 + s0)
...@@ -228,15 +228,16 @@ ENTRY(chacha20_2block_xor_avx2) ...@@ -228,15 +228,16 @@ ENTRY(chacha20_2block_xor_avx2)
lea -8(%r10),%rsp lea -8(%r10),%rsp
jmp .Ldone2 jmp .Ldone2
ENDPROC(chacha20_2block_xor_avx2) ENDPROC(chacha_2block_xor_avx2)
ENTRY(chacha20_4block_xor_avx2) ENTRY(chacha_4block_xor_avx2)
# %rdi: Input state matrix, s # %rdi: Input state matrix, s
# %rsi: up to 4 data blocks output, o # %rsi: up to 4 data blocks output, o
# %rdx: up to 4 data blocks input, i # %rdx: up to 4 data blocks input, i
# %rcx: input/output length in bytes # %rcx: input/output length in bytes
# %r8d: nrounds
# This function encrypts four ChaCha20 block by loading the state # This function encrypts four ChaCha blocks by loading the state
# matrix four times across eight AVX registers. It performs matrix # matrix four times across eight AVX registers. It performs matrix
# operations on four words in two matrices in parallel, sequentially # operations on four words in two matrices in parallel, sequentially
# to the operations on the four words of the other two matrices. The # to the operations on the four words of the other two matrices. The
...@@ -269,7 +270,6 @@ ENTRY(chacha20_4block_xor_avx2) ...@@ -269,7 +270,6 @@ ENTRY(chacha20_4block_xor_avx2)
vmovdqa ROT16(%rip),%ymm9 vmovdqa ROT16(%rip),%ymm9
mov %rcx,%rax mov %rcx,%rax
mov $10,%ecx
.Ldoubleround4: .Ldoubleround4:
...@@ -389,7 +389,7 @@ ENTRY(chacha20_4block_xor_avx2) ...@@ -389,7 +389,7 @@ ENTRY(chacha20_4block_xor_avx2)
vpshufd $0x39,%ymm3,%ymm3 vpshufd $0x39,%ymm3,%ymm3
vpshufd $0x39,%ymm7,%ymm7 vpshufd $0x39,%ymm7,%ymm7
dec %ecx sub $2,%r8d
jnz .Ldoubleround4 jnz .Ldoubleround4
# o0 = i0 ^ (x0 + s0), first block # o0 = i0 ^ (x0 + s0), first block
...@@ -533,15 +533,16 @@ ENTRY(chacha20_4block_xor_avx2) ...@@ -533,15 +533,16 @@ ENTRY(chacha20_4block_xor_avx2)
lea -8(%r10),%rsp lea -8(%r10),%rsp
jmp .Ldone4 jmp .Ldone4
ENDPROC(chacha20_4block_xor_avx2) ENDPROC(chacha_4block_xor_avx2)
ENTRY(chacha20_8block_xor_avx2) ENTRY(chacha_8block_xor_avx2)
# %rdi: Input state matrix, s # %rdi: Input state matrix, s
# %rsi: up to 8 data blocks output, o # %rsi: up to 8 data blocks output, o
# %rdx: up to 8 data blocks input, i # %rdx: up to 8 data blocks input, i
# %rcx: input/output length in bytes # %rcx: input/output length in bytes
# %r8d: nrounds
# This function encrypts eight consecutive ChaCha20 blocks by loading # This function encrypts eight consecutive ChaCha blocks by loading
# the state matrix in AVX registers eight times. As we need some # the state matrix in AVX registers eight times. As we need some
# scratch registers, we save the first four registers on the stack. The # scratch registers, we save the first four registers on the stack. The
# algorithm performs each operation on the corresponding word of each # algorithm performs each operation on the corresponding word of each
...@@ -588,8 +589,6 @@ ENTRY(chacha20_8block_xor_avx2) ...@@ -588,8 +589,6 @@ ENTRY(chacha20_8block_xor_avx2)
# x12 += counter values 0-3 # x12 += counter values 0-3
vpaddd %ymm1,%ymm12,%ymm12 vpaddd %ymm1,%ymm12,%ymm12
mov $10,%ecx
.Ldoubleround8: .Ldoubleround8:
# x0 += x4, x12 = rotl32(x12 ^ x0, 16) # x0 += x4, x12 = rotl32(x12 ^ x0, 16)
vpaddd 0x00(%rsp),%ymm4,%ymm0 vpaddd 0x00(%rsp),%ymm4,%ymm0
...@@ -775,7 +774,7 @@ ENTRY(chacha20_8block_xor_avx2) ...@@ -775,7 +774,7 @@ ENTRY(chacha20_8block_xor_avx2)
vpsrld $25,%ymm4,%ymm4 vpsrld $25,%ymm4,%ymm4
vpor %ymm0,%ymm4,%ymm4 vpor %ymm0,%ymm4,%ymm4
dec %ecx sub $2,%r8d
jnz .Ldoubleround8 jnz .Ldoubleround8
# x0..15[0-3] += s[0..15] # x0..15[0-3] += s[0..15]
...@@ -1023,4 +1022,4 @@ ENTRY(chacha20_8block_xor_avx2) ...@@ -1023,4 +1022,4 @@ ENTRY(chacha20_8block_xor_avx2)
jmp .Ldone8 jmp .Ldone8
ENDPROC(chacha20_8block_xor_avx2) ENDPROC(chacha_8block_xor_avx2)
/* SPDX-License-Identifier: GPL-2.0+ */ /* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* ChaCha20 256-bit cipher algorithm, RFC7539, x64 AVX-512VL functions * ChaCha 256-bit cipher algorithm, x64 AVX-512VL functions
* *
* Copyright (C) 2018 Martin Willi * Copyright (C) 2018 Martin Willi
*/ */
...@@ -24,13 +24,14 @@ CTR8BL: .octa 0x00000003000000020000000100000000 ...@@ -24,13 +24,14 @@ CTR8BL: .octa 0x00000003000000020000000100000000
.text .text
ENTRY(chacha20_2block_xor_avx512vl) ENTRY(chacha_2block_xor_avx512vl)
# %rdi: Input state matrix, s # %rdi: Input state matrix, s
# %rsi: up to 2 data blocks output, o # %rsi: up to 2 data blocks output, o
# %rdx: up to 2 data blocks input, i # %rdx: up to 2 data blocks input, i
# %rcx: input/output length in bytes # %rcx: input/output length in bytes
# %r8d: nrounds
# This function encrypts two ChaCha20 blocks by loading the state # This function encrypts two ChaCha blocks by loading the state
# matrix twice across four AVX registers. It performs matrix operations # matrix twice across four AVX registers. It performs matrix operations
# on four words in each matrix in parallel, but requires shuffling to # on four words in each matrix in parallel, but requires shuffling to
# rearrange the words after each round. # rearrange the words after each round.
...@@ -50,8 +51,6 @@ ENTRY(chacha20_2block_xor_avx512vl) ...@@ -50,8 +51,6 @@ ENTRY(chacha20_2block_xor_avx512vl)
vmovdqa %ymm2,%ymm10 vmovdqa %ymm2,%ymm10
vmovdqa %ymm3,%ymm11 vmovdqa %ymm3,%ymm11
mov $10,%rax
.Ldoubleround: .Ldoubleround:
# x0 += x1, x3 = rotl32(x3 ^ x0, 16) # x0 += x1, x3 = rotl32(x3 ^ x0, 16)
...@@ -108,7 +107,7 @@ ENTRY(chacha20_2block_xor_avx512vl) ...@@ -108,7 +107,7 @@ ENTRY(chacha20_2block_xor_avx512vl)
# x3 = shuffle32(x3, MASK(0, 3, 2, 1)) # x3 = shuffle32(x3, MASK(0, 3, 2, 1))
vpshufd $0x39,%ymm3,%ymm3 vpshufd $0x39,%ymm3,%ymm3
dec %rax sub $2,%r8d
jnz .Ldoubleround jnz .Ldoubleround
# o0 = i0 ^ (x0 + s0) # o0 = i0 ^ (x0 + s0)
...@@ -188,15 +187,16 @@ ENTRY(chacha20_2block_xor_avx512vl) ...@@ -188,15 +187,16 @@ ENTRY(chacha20_2block_xor_avx512vl)
jmp .Ldone2 jmp .Ldone2
ENDPROC(chacha20_2block_xor_avx512vl) ENDPROC(chacha_2block_xor_avx512vl)
ENTRY(chacha20_4block_xor_avx512vl) ENTRY(chacha_4block_xor_avx512vl)
# %rdi: Input state matrix, s # %rdi: Input state matrix, s
# %rsi: up to 4 data blocks output, o # %rsi: up to 4 data blocks output, o
# %rdx: up to 4 data blocks input, i # %rdx: up to 4 data blocks input, i
# %rcx: input/output length in bytes # %rcx: input/output length in bytes
# %r8d: nrounds
# This function encrypts four ChaCha20 block by loading the state # This function encrypts four ChaCha blocks by loading the state
# matrix four times across eight AVX registers. It performs matrix # matrix four times across eight AVX registers. It performs matrix
# operations on four words in two matrices in parallel, sequentially # operations on four words in two matrices in parallel, sequentially
# to the operations on the four words of the other two matrices. The # to the operations on the four words of the other two matrices. The
...@@ -225,8 +225,6 @@ ENTRY(chacha20_4block_xor_avx512vl) ...@@ -225,8 +225,6 @@ ENTRY(chacha20_4block_xor_avx512vl)
vmovdqa %ymm3,%ymm14 vmovdqa %ymm3,%ymm14
vmovdqa %ymm7,%ymm15 vmovdqa %ymm7,%ymm15
mov $10,%rax
.Ldoubleround4: .Ldoubleround4:
# x0 += x1, x3 = rotl32(x3 ^ x0, 16) # x0 += x1, x3 = rotl32(x3 ^ x0, 16)
...@@ -321,7 +319,7 @@ ENTRY(chacha20_4block_xor_avx512vl) ...@@ -321,7 +319,7 @@ ENTRY(chacha20_4block_xor_avx512vl)
vpshufd $0x39,%ymm3,%ymm3 vpshufd $0x39,%ymm3,%ymm3
vpshufd $0x39,%ymm7,%ymm7 vpshufd $0x39,%ymm7,%ymm7
dec %rax sub $2,%r8d
jnz .Ldoubleround4 jnz .Ldoubleround4
# o0 = i0 ^ (x0 + s0), first block # o0 = i0 ^ (x0 + s0), first block
...@@ -455,15 +453,16 @@ ENTRY(chacha20_4block_xor_avx512vl) ...@@ -455,15 +453,16 @@ ENTRY(chacha20_4block_xor_avx512vl)
jmp .Ldone4 jmp .Ldone4
ENDPROC(chacha20_4block_xor_avx512vl) ENDPROC(chacha_4block_xor_avx512vl)
ENTRY(chacha20_8block_xor_avx512vl) ENTRY(chacha_8block_xor_avx512vl)
# %rdi: Input state matrix, s # %rdi: Input state matrix, s
# %rsi: up to 8 data blocks output, o # %rsi: up to 8 data blocks output, o
# %rdx: up to 8 data blocks input, i # %rdx: up to 8 data blocks input, i
# %rcx: input/output length in bytes # %rcx: input/output length in bytes
# %r8d: nrounds
# This function encrypts eight consecutive ChaCha20 blocks by loading # This function encrypts eight consecutive ChaCha blocks by loading
# the state matrix in AVX registers eight times. Compared to AVX2, this # the state matrix in AVX registers eight times. Compared to AVX2, this
# mostly benefits from the new rotate instructions in VL and the # mostly benefits from the new rotate instructions in VL and the
# additional registers. # additional registers.
...@@ -508,8 +507,6 @@ ENTRY(chacha20_8block_xor_avx512vl) ...@@ -508,8 +507,6 @@ ENTRY(chacha20_8block_xor_avx512vl)
vmovdqa64 %ymm14,%ymm30 vmovdqa64 %ymm14,%ymm30
vmovdqa64 %ymm15,%ymm31 vmovdqa64 %ymm15,%ymm31
mov $10,%eax
.Ldoubleround8: .Ldoubleround8:
# x0 += x4, x12 = rotl32(x12 ^ x0, 16) # x0 += x4, x12 = rotl32(x12 ^ x0, 16)
vpaddd %ymm0,%ymm4,%ymm0 vpaddd %ymm0,%ymm4,%ymm0
...@@ -647,7 +644,7 @@ ENTRY(chacha20_8block_xor_avx512vl) ...@@ -647,7 +644,7 @@ ENTRY(chacha20_8block_xor_avx512vl)
vpxord %ymm9,%ymm4,%ymm4 vpxord %ymm9,%ymm4,%ymm4
vprold $7,%ymm4,%ymm4 vprold $7,%ymm4,%ymm4
dec %eax sub $2,%r8d
jnz .Ldoubleround8 jnz .Ldoubleround8
# x0..15[0-3] += s[0..15] # x0..15[0-3] += s[0..15]
...@@ -836,4 +833,4 @@ ENTRY(chacha20_8block_xor_avx512vl) ...@@ -836,4 +833,4 @@ ENTRY(chacha20_8block_xor_avx512vl)
jmp .Ldone8 jmp .Ldone8
ENDPROC(chacha20_8block_xor_avx512vl) ENDPROC(chacha_8block_xor_avx512vl)
/* /*
* ChaCha20 256-bit cipher algorithm, RFC7539, x64 SSSE3 functions * ChaCha 256-bit cipher algorithm, x64 SSSE3 functions
* *
* Copyright (C) 2015 Martin Willi * Copyright (C) 2015 Martin Willi
* *
...@@ -25,7 +25,7 @@ CTRINC: .octa 0x00000003000000020000000100000000 ...@@ -25,7 +25,7 @@ CTRINC: .octa 0x00000003000000020000000100000000
.text .text
/* /*
* chacha20_permute - permute one block * chacha_permute - permute one block
* *
* Permute one 64-byte block where the state matrix is in %xmm0-%xmm3. This * Permute one 64-byte block where the state matrix is in %xmm0-%xmm3. This
* function performs matrix operations on four words in parallel, but requires * function performs matrix operations on four words in parallel, but requires
...@@ -33,13 +33,14 @@ CTRINC: .octa 0x00000003000000020000000100000000 ...@@ -33,13 +33,14 @@ CTRINC: .octa 0x00000003000000020000000100000000
* done with the slightly better performing SSSE3 byte shuffling, 7/12-bit word * done with the slightly better performing SSSE3 byte shuffling, 7/12-bit word
* rotation uses traditional shift+OR. * rotation uses traditional shift+OR.
* *
* Clobbers: %ecx, %xmm4-%xmm7 * The round count is given in %r8d.
*
* Clobbers: %r8d, %xmm4-%xmm7
*/ */
chacha20_permute: chacha_permute:
movdqa ROT8(%rip),%xmm4 movdqa ROT8(%rip),%xmm4
movdqa ROT16(%rip),%xmm5 movdqa ROT16(%rip),%xmm5
mov $10,%ecx
.Ldoubleround: .Ldoubleround:
# x0 += x1, x3 = rotl32(x3 ^ x0, 16) # x0 += x1, x3 = rotl32(x3 ^ x0, 16)
...@@ -108,17 +109,18 @@ chacha20_permute: ...@@ -108,17 +109,18 @@ chacha20_permute:
# x3 = shuffle32(x3, MASK(0, 3, 2, 1)) # x3 = shuffle32(x3, MASK(0, 3, 2, 1))
pshufd $0x39,%xmm3,%xmm3 pshufd $0x39,%xmm3,%xmm3
dec %ecx sub $2,%r8d
jnz .Ldoubleround jnz .Ldoubleround
ret ret
ENDPROC(chacha20_permute) ENDPROC(chacha_permute)
ENTRY(chacha20_block_xor_ssse3) ENTRY(chacha_block_xor_ssse3)
# %rdi: Input state matrix, s # %rdi: Input state matrix, s
# %rsi: up to 1 data block output, o # %rsi: up to 1 data block output, o
# %rdx: up to 1 data block input, i # %rdx: up to 1 data block input, i
# %rcx: input/output length in bytes # %rcx: input/output length in bytes
# %r8d: nrounds
FRAME_BEGIN FRAME_BEGIN
# x0..3 = s0..3 # x0..3 = s0..3
...@@ -132,7 +134,7 @@ ENTRY(chacha20_block_xor_ssse3) ...@@ -132,7 +134,7 @@ ENTRY(chacha20_block_xor_ssse3)
movdqa %xmm3,%xmm11 movdqa %xmm3,%xmm11
mov %rcx,%rax mov %rcx,%rax
call chacha20_permute call chacha_permute
# o0 = i0 ^ (x0 + s0) # o0 = i0 ^ (x0 + s0)
paddd %xmm8,%xmm0 paddd %xmm8,%xmm0
...@@ -199,11 +201,12 @@ ENTRY(chacha20_block_xor_ssse3) ...@@ -199,11 +201,12 @@ ENTRY(chacha20_block_xor_ssse3)
lea -8(%r10),%rsp lea -8(%r10),%rsp
jmp .Ldone jmp .Ldone
ENDPROC(chacha20_block_xor_ssse3) ENDPROC(chacha_block_xor_ssse3)
ENTRY(hchacha20_block_ssse3) ENTRY(hchacha_block_ssse3)
# %rdi: Input state matrix, s # %rdi: Input state matrix, s
# %rsi: output (8 32-bit words) # %rsi: output (8 32-bit words)
# %edx: nrounds
FRAME_BEGIN FRAME_BEGIN
movdqa 0x00(%rdi),%xmm0 movdqa 0x00(%rdi),%xmm0
...@@ -211,22 +214,24 @@ ENTRY(hchacha20_block_ssse3) ...@@ -211,22 +214,24 @@ ENTRY(hchacha20_block_ssse3)
movdqa 0x20(%rdi),%xmm2 movdqa 0x20(%rdi),%xmm2
movdqa 0x30(%rdi),%xmm3 movdqa 0x30(%rdi),%xmm3
call chacha20_permute mov %edx,%r8d
call chacha_permute
movdqu %xmm0,0x00(%rsi) movdqu %xmm0,0x00(%rsi)
movdqu %xmm3,0x10(%rsi) movdqu %xmm3,0x10(%rsi)
FRAME_END FRAME_END
ret ret
ENDPROC(hchacha20_block_ssse3) ENDPROC(hchacha_block_ssse3)
ENTRY(chacha20_4block_xor_ssse3) ENTRY(chacha_4block_xor_ssse3)
# %rdi: Input state matrix, s # %rdi: Input state matrix, s
# %rsi: up to 4 data blocks output, o # %rsi: up to 4 data blocks output, o
# %rdx: up to 4 data blocks input, i # %rdx: up to 4 data blocks input, i
# %rcx: input/output length in bytes # %rcx: input/output length in bytes
# %r8d: nrounds
# This function encrypts four consecutive ChaCha20 blocks by loading the # This function encrypts four consecutive ChaCha blocks by loading the
# the state matrix in SSE registers four times. As we need some scratch # the state matrix in SSE registers four times. As we need some scratch
# registers, we save the first four registers on the stack. The # registers, we save the first four registers on the stack. The
# algorithm performs each operation on the corresponding word of each # algorithm performs each operation on the corresponding word of each
...@@ -279,8 +284,6 @@ ENTRY(chacha20_4block_xor_ssse3) ...@@ -279,8 +284,6 @@ ENTRY(chacha20_4block_xor_ssse3)
# x12 += counter values 0-3 # x12 += counter values 0-3
paddd %xmm1,%xmm12 paddd %xmm1,%xmm12
mov $10,%ecx
.Ldoubleround4: .Ldoubleround4:
# x0 += x4, x12 = rotl32(x12 ^ x0, 16) # x0 += x4, x12 = rotl32(x12 ^ x0, 16)
movdqa 0x00(%rsp),%xmm0 movdqa 0x00(%rsp),%xmm0
...@@ -498,7 +501,7 @@ ENTRY(chacha20_4block_xor_ssse3) ...@@ -498,7 +501,7 @@ ENTRY(chacha20_4block_xor_ssse3)
psrld $25,%xmm4 psrld $25,%xmm4
por %xmm0,%xmm4 por %xmm0,%xmm4
dec %ecx sub $2,%r8d
jnz .Ldoubleround4 jnz .Ldoubleround4
# x0[0-3] += s0[0] # x0[0-3] += s0[0]
...@@ -789,4 +792,4 @@ ENTRY(chacha20_4block_xor_ssse3) ...@@ -789,4 +792,4 @@ ENTRY(chacha20_4block_xor_ssse3)
jmp .Ldone4 jmp .Ldone4
ENDPROC(chacha20_4block_xor_ssse3) ENDPROC(chacha_4block_xor_ssse3)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment