Add ARM SHA512 asm implementation from Cryptogams (GH #841)
parent
4c9ca6b723
commit
86cc94ec1a
|
|
@ -318,6 +318,8 @@ sha1_armv4.h
|
||||||
sha1_armv4.S
|
sha1_armv4.S
|
||||||
sha256_armv4.h
|
sha256_armv4.h
|
||||||
sha256_armv4.S
|
sha256_armv4.S
|
||||||
|
sha512_armv4.h
|
||||||
|
sha512_armv4.S
|
||||||
sha3.cpp
|
sha3.cpp
|
||||||
sha3.h
|
sha3.h
|
||||||
shacal2.cpp
|
shacal2.cpp
|
||||||
|
|
|
||||||
|
|
@ -1059,7 +1059,7 @@ endif
|
||||||
ifeq ($(IS_ARM32),1)
|
ifeq ($(IS_ARM32),1)
|
||||||
CRYPTOGAMS_ARCH_FLAG = -march=armv7-a
|
CRYPTOGAMS_ARCH_FLAG = -march=armv7-a
|
||||||
CRYPTOGAMS_ARCH_FLAG += -Wa,--noexecstack
|
CRYPTOGAMS_ARCH_FLAG += -Wa,--noexecstack
|
||||||
SRCS += aes_armv4.S sha1_armv4.S sha256_armv4.S
|
SRCS += aes_armv4.S sha1_armv4.S sha256_armv4.S sha512_armv4.S
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# List cryptlib.cpp first, then cpu.cpp, then integer.cpp to tame C++ static initialization problems.
|
# List cryptlib.cpp first, then cpu.cpp, then integer.cpp to tame C++ static initialization problems.
|
||||||
|
|
@ -1513,6 +1513,10 @@ sha1_armv4.o : sha1_armv4.S
|
||||||
sha256_armv4.o : sha256_armv4.S
|
sha256_armv4.o : sha256_armv4.S
|
||||||
$(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $<
|
$(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $<
|
||||||
|
|
||||||
|
# Cryptogams ARM asm implementation.
|
||||||
|
sha512_armv4.o : sha512_armv4.S
|
||||||
|
$(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $<
|
||||||
|
|
||||||
sha3_simd.o : sha3_simd.cpp
|
sha3_simd.o : sha3_simd.cpp
|
||||||
$(CXX) $(strip $(CXXFLAGS) $(SHA3_FLAG) -c) $<
|
$(CXX) $(strip $(CXXFLAGS) $(SHA3_FLAG) -c) $<
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -594,7 +594,7 @@ ifeq ($(IS_ARM32),1)
|
||||||
ifneq ($(IS_IOS),1)
|
ifneq ($(IS_IOS),1)
|
||||||
CRYPTOGAMS_ARCH_FLAG = -march=armv7-a
|
CRYPTOGAMS_ARCH_FLAG = -march=armv7-a
|
||||||
CRYPTOGAMS_ARCH_FLAG += -Wa,--noexecstack
|
CRYPTOGAMS_ARCH_FLAG += -Wa,--noexecstack
|
||||||
SRCS += aes_armv4.S sha1_armv4.S sha256_armv4.S
|
SRCS += aes_armv4.S sha1_armv4.S sha256_armv4.S sha512_armv4.S
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
@ -873,6 +873,10 @@ sha1_armv4.o : sha1_armv4.S
|
||||||
sha256_armv4.o : sha256_armv4.S
|
sha256_armv4.o : sha256_armv4.S
|
||||||
$(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $<
|
$(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $<
|
||||||
|
|
||||||
|
# Cryptogams ARM asm implementation.
|
||||||
|
sha512_armv4.o : sha512_armv4.S
|
||||||
|
$(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $<
|
||||||
|
|
||||||
# SSE4.2/SHA-NI or ARMv8a available
|
# SSE4.2/SHA-NI or ARMv8a available
|
||||||
shacal2_simd.o : shacal2_simd.cpp
|
shacal2_simd.o : shacal2_simd.cpp
|
||||||
$(CXX) $(strip $(CXXFLAGS) $(SHA_FLAG) -c) $<
|
$(CXX) $(strip $(CXXFLAGS) $(SHA_FLAG) -c) $<
|
||||||
|
|
|
||||||
|
|
@ -366,6 +366,7 @@
|
||||||
# define CRYPTOGAMS_ARM_AES 1
|
# define CRYPTOGAMS_ARM_AES 1
|
||||||
# define CRYPTOGAMS_ARM_SHA1 1
|
# define CRYPTOGAMS_ARM_SHA1 1
|
||||||
# define CRYPTOGAMS_ARM_SHA256 1
|
# define CRYPTOGAMS_ARM_SHA256 1
|
||||||
|
# define CRYPTOGAMS_ARM_SHA512 1
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
28
sha.cpp
28
sha.cpp
|
|
@ -83,6 +83,11 @@ extern void SHA256_HashMultipleBlocks_POWER8(word32 *state, const word32 *data,
|
||||||
extern void SHA512_HashMultipleBlocks_POWER8(word64 *state, const word64 *data, size_t length, ByteOrder order);
|
extern void SHA512_HashMultipleBlocks_POWER8(word64 *state, const word64 *data, size_t length, ByteOrder order);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if (CRYPTOGAMS_ARM_SHA512)
|
||||||
|
extern "C" unsigned int CRYPTOGAMS_armcaps;
|
||||||
|
extern "C" int sha512_block_data_order(word64* state, const word64 *data, size_t blocks);
|
||||||
|
#endif
|
||||||
|
|
||||||
// We add extern to export table to sha_simd.cpp, but it
|
// We add extern to export table to sha_simd.cpp, but it
|
||||||
// cleared http://github.com/weidai11/cryptopp/issues/502
|
// cleared http://github.com/weidai11/cryptopp/issues/502
|
||||||
extern const word32 SHA256_K[64];
|
extern const word32 SHA256_K[64];
|
||||||
|
|
@ -997,6 +1002,12 @@ std::string SHA512_AlgorithmProvider()
|
||||||
if (HasSSE2())
|
if (HasSSE2())
|
||||||
return "SSE2";
|
return "SSE2";
|
||||||
#endif
|
#endif
|
||||||
|
#if CRYPTOGAMS_ARM_SHA512
|
||||||
|
if (HasNEON())
|
||||||
|
return "NEON";
|
||||||
|
if (HasARMv7())
|
||||||
|
return "ARMv7";
|
||||||
|
#endif
|
||||||
#if (CRYPTOPP_POWER8_SHA_AVAILABLE)
|
#if (CRYPTOPP_POWER8_SHA_AVAILABLE)
|
||||||
if (HasSHA512())
|
if (HasSHA512())
|
||||||
return "Power8";
|
return "Power8";
|
||||||
|
|
@ -1303,6 +1314,23 @@ void SHA512::Transform(word64 *state, const word64 *data)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if CRYPTOGAMS_ARM_SHA512
|
||||||
|
if (HasARMv7())
|
||||||
|
{
|
||||||
|
// The Cryptogams code uses a global variable named CRYPTOGAMS_armcaps
|
||||||
|
// for capabilities like ARMv7 and NEON. Storage is allocated in the
|
||||||
|
// module. We still need to set CRYPTOGAMS_armcaps accordingly.
|
||||||
|
// The Cryptogams code defines NEON as 1<<0; see ARMV7_NEON.
|
||||||
|
static const unsigned int unused = CRYPTOGAMS_armcaps = HasNEON() ? (1<<0) : 0;
|
||||||
|
CRYPTOPP_UNUSED(unused);
|
||||||
|
|
||||||
|
word64 dataBuf[16];
|
||||||
|
ByteReverse(dataBuf, data, SHA512::BLOCKSIZE);
|
||||||
|
sha512_block_data_order(state, dataBuf, 1);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#if CRYPTOPP_POWER8_SHA_AVAILABLE
|
#if CRYPTOPP_POWER8_SHA_AVAILABLE
|
||||||
if (HasSHA512())
|
if (HasSHA512())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,21 @@
|
||||||
|
/* Header file for use with Cryptogam's ARMv4 SHA512. */
|
||||||
|
/* Also see http://www.openssl.org/~appro/cryptogams/ */
|
||||||
|
/* https://wiki.openssl.org/index.php/Cryptogams_SHA. */
|
||||||
|
|
||||||
|
#ifndef CRYPTOGAMS_SHA512_ARMV4_H
|
||||||
|
#define CRYPTOGAMS_SHA512_ARMV4_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void sha512_block_data_order(void *state, const void *data, size_t blocks);
|
||||||
|
|
||||||
|
/* Cryptogams arm caps */
|
||||||
|
#define ARMV7_NEON (1<<0)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* CRYPTOGAMS_SHA512_ARMV4_H */
|
||||||
Loading…
Reference in New Issue