mirror of
https://github.com/kdave/btrfs-progs
synced 2025-05-16 23:08:38 +00:00
btrfs-progs: crypto: add SSE4.1 implementation of BLAKE2
Copy SSE4.1 implementation from https://github.com/BLAKE2/BLAKE2 . Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
1f2117eae8
commit
d61739003d
4
Makefile
4
Makefile
@ -131,6 +131,7 @@ CRYPTO_OBJECTS =
|
|||||||
|
|
||||||
ifeq ($(shell uname -m),x86_64)
|
ifeq ($(shell uname -m),x86_64)
|
||||||
crypto_blake2b_sse2_cflags = -msse2
|
crypto_blake2b_sse2_cflags = -msse2
|
||||||
|
crypto_blake2b_sse41_cflags = -msse4.1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LIBS = $(LIBS_BASE) $(LIBS_CRYPTO)
|
LIBS = $(LIBS_BASE) $(LIBS_CRYPTO)
|
||||||
@ -351,7 +352,8 @@ btrfs_fragments_libs = -lgd -lpng -ljpeg -lfreetype
|
|||||||
cmds_restore_cflags = -DCOMPRESSION_LZO=$(COMPRESSION_LZO) -DCOMPRESSION_ZSTD=$(COMPRESSION_ZSTD)
|
cmds_restore_cflags = -DCOMPRESSION_LZO=$(COMPRESSION_LZO) -DCOMPRESSION_ZSTD=$(COMPRESSION_ZSTD)
|
||||||
|
|
||||||
ifeq ($(CRYPTOPROVIDER_BUILTIN),1)
|
ifeq ($(CRYPTOPROVIDER_BUILTIN),1)
|
||||||
CRYPTO_OBJECTS = crypto/sha224-256.o crypto/blake2b-ref.o crypto/blake2b-sse2.o
|
CRYPTO_OBJECTS = crypto/sha224-256.o crypto/blake2b-ref.o crypto/blake2b-sse2.o \
|
||||||
|
crypto/blake2b-sse41.o
|
||||||
CRYPTO_CFLAGS = -DCRYPTOPROVIDER_BUILTIN=1
|
CRYPTO_CFLAGS = -DCRYPTOPROVIDER_BUILTIN=1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
402
crypto/blake2b-load-sse41.h
Normal file
402
crypto/blake2b-load-sse41.h
Normal file
@ -0,0 +1,402 @@
|
|||||||
|
/*
|
||||||
|
BLAKE2 reference source code package - optimized C implementations
|
||||||
|
|
||||||
|
Copyright 2012, Samuel Neves <sneves@dei.uc.pt>. You may use this under the
|
||||||
|
terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at
|
||||||
|
your option. The terms of these licenses can be found at:
|
||||||
|
|
||||||
|
- CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
|
||||||
|
- OpenSSL license : https://www.openssl.org/source/license.html
|
||||||
|
- Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
More information about the BLAKE2 hash function can be found at
|
||||||
|
https://blake2.net.
|
||||||
|
*/
|
||||||
|
#ifndef BLAKE2B_LOAD_SSE41_H
|
||||||
|
#define BLAKE2B_LOAD_SSE41_H
|
||||||
|
|
||||||
|
#define LOAD_MSG_0_1(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m0, m1); \
|
||||||
|
b1 = _mm_unpacklo_epi64(m2, m3); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_0_2(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpackhi_epi64(m0, m1); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m2, m3); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_0_3(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m4, m5); \
|
||||||
|
b1 = _mm_unpacklo_epi64(m6, m7); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_0_4(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpackhi_epi64(m4, m5); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m6, m7); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_1_1(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m7, m2); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m4, m6); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_1_2(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m5, m4); \
|
||||||
|
b1 = _mm_alignr_epi8(m3, m7, 8); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_1_3(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_shuffle_epi32(m0, _MM_SHUFFLE(1,0,3,2)); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m5, m2); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_1_4(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m6, m1); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m3, m1); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_2_1(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_alignr_epi8(m6, m5, 8); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m2, m7); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_2_2(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m4, m0); \
|
||||||
|
b1 = _mm_blend_epi16(m1, m6, 0xF0); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_2_3(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_blend_epi16(m5, m1, 0xF0); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m3, m4); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_2_4(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m7, m3); \
|
||||||
|
b1 = _mm_alignr_epi8(m2, m0, 8); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_3_1(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpackhi_epi64(m3, m1); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m6, m5); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_3_2(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpackhi_epi64(m4, m0); \
|
||||||
|
b1 = _mm_unpacklo_epi64(m6, m7); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_3_3(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_blend_epi16(m1, m2, 0xF0); \
|
||||||
|
b1 = _mm_blend_epi16(m2, m7, 0xF0); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_3_4(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m3, m5); \
|
||||||
|
b1 = _mm_unpacklo_epi64(m0, m4); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_4_1(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpackhi_epi64(m4, m2); \
|
||||||
|
b1 = _mm_unpacklo_epi64(m1, m5); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_4_2(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_blend_epi16(m0, m3, 0xF0); \
|
||||||
|
b1 = _mm_blend_epi16(m2, m7, 0xF0); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_4_3(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_blend_epi16(m7, m5, 0xF0); \
|
||||||
|
b1 = _mm_blend_epi16(m3, m1, 0xF0); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_4_4(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_alignr_epi8(m6, m0, 8); \
|
||||||
|
b1 = _mm_blend_epi16(m4, m6, 0xF0); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_5_1(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m1, m3); \
|
||||||
|
b1 = _mm_unpacklo_epi64(m0, m4); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_5_2(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m6, m5); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m5, m1); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_5_3(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_blend_epi16(m2, m3, 0xF0); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m7, m0); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_5_4(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpackhi_epi64(m6, m2); \
|
||||||
|
b1 = _mm_blend_epi16(m7, m4, 0xF0); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_6_1(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_blend_epi16(m6, m0, 0xF0); \
|
||||||
|
b1 = _mm_unpacklo_epi64(m7, m2); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_6_2(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpackhi_epi64(m2, m7); \
|
||||||
|
b1 = _mm_alignr_epi8(m5, m6, 8); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_6_3(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m0, m3); \
|
||||||
|
b1 = _mm_shuffle_epi32(m4, _MM_SHUFFLE(1,0,3,2)); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_6_4(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpackhi_epi64(m3, m1); \
|
||||||
|
b1 = _mm_blend_epi16(m1, m5, 0xF0); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_7_1(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpackhi_epi64(m6, m3); \
|
||||||
|
b1 = _mm_blend_epi16(m6, m1, 0xF0); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_7_2(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_alignr_epi8(m7, m5, 8); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m0, m4); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_7_3(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpackhi_epi64(m2, m7); \
|
||||||
|
b1 = _mm_unpacklo_epi64(m4, m1); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_7_4(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m0, m2); \
|
||||||
|
b1 = _mm_unpacklo_epi64(m3, m5); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_8_1(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m3, m7); \
|
||||||
|
b1 = _mm_alignr_epi8(m0, m5, 8); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_8_2(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpackhi_epi64(m7, m4); \
|
||||||
|
b1 = _mm_alignr_epi8(m4, m1, 8); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_8_3(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = m6; \
|
||||||
|
b1 = _mm_alignr_epi8(m5, m0, 8); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_8_4(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_blend_epi16(m1, m3, 0xF0); \
|
||||||
|
b1 = m2; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_9_1(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m5, m4); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m3, m0); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_9_2(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m1, m2); \
|
||||||
|
b1 = _mm_blend_epi16(m3, m2, 0xF0); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_9_3(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpackhi_epi64(m7, m4); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m1, m6); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_9_4(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_alignr_epi8(m7, m5, 8); \
|
||||||
|
b1 = _mm_unpacklo_epi64(m6, m0); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_10_1(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m0, m1); \
|
||||||
|
b1 = _mm_unpacklo_epi64(m2, m3); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_10_2(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpackhi_epi64(m0, m1); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m2, m3); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_10_3(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m4, m5); \
|
||||||
|
b1 = _mm_unpacklo_epi64(m6, m7); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_10_4(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpackhi_epi64(m4, m5); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m6, m7); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_11_1(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m7, m2); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m4, m6); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_11_2(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m5, m4); \
|
||||||
|
b1 = _mm_alignr_epi8(m3, m7, 8); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_11_3(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_shuffle_epi32(m0, _MM_SHUFFLE(1,0,3,2)); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m5, m2); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_11_4(b0, b1) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
b0 = _mm_unpacklo_epi64(m6, m1); \
|
||||||
|
b1 = _mm_unpackhi_epi64(m3, m1); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -221,9 +221,14 @@ static void blake2b_compress_ref( blake2b_state *S, const uint8_t block[BLAKE2B_
|
|||||||
#undef ROUND
|
#undef ROUND
|
||||||
|
|
||||||
void blake2b_compress_sse2( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] );
|
void blake2b_compress_sse2( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] );
|
||||||
|
void blake2b_compress_sse41( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] );
|
||||||
|
|
||||||
static void blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] )
|
static void blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] )
|
||||||
{
|
{
|
||||||
|
#if HAVE_SSE41
|
||||||
|
if (cpu_has_feature(CPU_FLAG_SSE41))
|
||||||
|
return blake2b_compress_sse41(S, block);
|
||||||
|
#endif
|
||||||
#if HAVE_SSE2
|
#if HAVE_SSE2
|
||||||
if (cpu_has_feature(CPU_FLAG_SSE2))
|
if (cpu_has_feature(CPU_FLAG_SSE2))
|
||||||
return blake2b_compress_sse2(S, block);
|
return blake2b_compress_sse2(S, block);
|
||||||
|
98
crypto/blake2b-sse41.c
Normal file
98
crypto/blake2b-sse41.c
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
BLAKE2 reference source code package - optimized C implementations
|
||||||
|
|
||||||
|
Copyright 2012, Samuel Neves <sneves@dei.uc.pt>. You may use this under the
|
||||||
|
terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at
|
||||||
|
your option. The terms of these licenses can be found at:
|
||||||
|
|
||||||
|
- CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
|
||||||
|
- OpenSSL license : https://www.openssl.org/source/license.html
|
||||||
|
- Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
More information about the BLAKE2 hash function can be found at
|
||||||
|
https://blake2.net.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "blake2.h"
|
||||||
|
#include "blake2-impl.h"
|
||||||
|
#include "blake2-config.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_SSE41
|
||||||
|
|
||||||
|
#include <emmintrin.h>
|
||||||
|
#if defined(HAVE_SSSE3)
|
||||||
|
#include <tmmintrin.h>
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_SSE41)
|
||||||
|
#include <smmintrin.h>
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_XOP)
|
||||||
|
#include <x86intrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "blake2b-round.h"
|
||||||
|
|
||||||
|
static const uint64_t blake2b_IV[8] =
|
||||||
|
{
|
||||||
|
0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,
|
||||||
|
0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,
|
||||||
|
0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,
|
||||||
|
0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL
|
||||||
|
};
|
||||||
|
|
||||||
|
void blake2b_compress_sse41( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] )
|
||||||
|
{
|
||||||
|
__m128i row1l, row1h;
|
||||||
|
__m128i row2l, row2h;
|
||||||
|
__m128i row3l, row3h;
|
||||||
|
__m128i row4l, row4h;
|
||||||
|
__m128i b0, b1;
|
||||||
|
__m128i t0, t1;
|
||||||
|
#if defined(HAVE_SSSE3) && !defined(HAVE_XOP)
|
||||||
|
const __m128i r16 = _mm_setr_epi8( 2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9 );
|
||||||
|
const __m128i r24 = _mm_setr_epi8( 3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10 );
|
||||||
|
#endif
|
||||||
|
const __m128i m0 = LOADU( block + 00 );
|
||||||
|
const __m128i m1 = LOADU( block + 16 );
|
||||||
|
const __m128i m2 = LOADU( block + 32 );
|
||||||
|
const __m128i m3 = LOADU( block + 48 );
|
||||||
|
const __m128i m4 = LOADU( block + 64 );
|
||||||
|
const __m128i m5 = LOADU( block + 80 );
|
||||||
|
const __m128i m6 = LOADU( block + 96 );
|
||||||
|
const __m128i m7 = LOADU( block + 112 );
|
||||||
|
|
||||||
|
row1l = LOADU( &S->h[0] );
|
||||||
|
row1h = LOADU( &S->h[2] );
|
||||||
|
row2l = LOADU( &S->h[4] );
|
||||||
|
row2h = LOADU( &S->h[6] );
|
||||||
|
row3l = LOADU( &blake2b_IV[0] );
|
||||||
|
row3h = LOADU( &blake2b_IV[2] );
|
||||||
|
row4l = _mm_xor_si128( LOADU( &blake2b_IV[4] ), LOADU( &S->t[0] ) );
|
||||||
|
row4h = _mm_xor_si128( LOADU( &blake2b_IV[6] ), LOADU( &S->f[0] ) );
|
||||||
|
ROUND( 0 );
|
||||||
|
ROUND( 1 );
|
||||||
|
ROUND( 2 );
|
||||||
|
ROUND( 3 );
|
||||||
|
ROUND( 4 );
|
||||||
|
ROUND( 5 );
|
||||||
|
ROUND( 6 );
|
||||||
|
ROUND( 7 );
|
||||||
|
ROUND( 8 );
|
||||||
|
ROUND( 9 );
|
||||||
|
ROUND( 10 );
|
||||||
|
ROUND( 11 );
|
||||||
|
row1l = _mm_xor_si128( row3l, row1l );
|
||||||
|
row1h = _mm_xor_si128( row3h, row1h );
|
||||||
|
STOREU( &S->h[0], _mm_xor_si128( LOADU( &S->h[0] ), row1l ) );
|
||||||
|
STOREU( &S->h[2], _mm_xor_si128( LOADU( &S->h[2] ), row1h ) );
|
||||||
|
row2l = _mm_xor_si128( row4l, row2l );
|
||||||
|
row2h = _mm_xor_si128( row4h, row2h );
|
||||||
|
STOREU( &S->h[4], _mm_xor_si128( LOADU( &S->h[4] ), row2l ) );
|
||||||
|
STOREU( &S->h[6], _mm_xor_si128( LOADU( &S->h[6] ), row2h ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user