mirror of
https://github.com/AFLplusplus/AFLplusplus.git
synced 2025-06-15 11:28:08 +00:00
code format
This commit is contained in:
4
TODO.md
4
TODO.md
@ -2,17 +2,15 @@
|
|||||||
|
|
||||||
## Must
|
## Must
|
||||||
|
|
||||||
- UI revamp
|
|
||||||
- hardened_usercopy=0 page_alloc.shuffle=0
|
- hardened_usercopy=0 page_alloc.shuffle=0
|
||||||
- add value_profile but only enable after 15 minutes without finds
|
- add value_profile but only enable after 15 minutes without finds
|
||||||
- cmplog max len, cmplog max items envs?
|
- cmplog max items env?
|
||||||
- adapt MOpt to new mutation engine
|
- adapt MOpt to new mutation engine
|
||||||
- Update afl->pending_not_fuzzed for MOpt
|
- Update afl->pending_not_fuzzed for MOpt
|
||||||
- cmplog rtn sanity check on fixed length? currently we ignore the length
|
- cmplog rtn sanity check on fixed length? currently we ignore the length
|
||||||
- afl-showmap -f support
|
- afl-showmap -f support
|
||||||
- afl-fuzz multicore wrapper script
|
- afl-fuzz multicore wrapper script
|
||||||
- when trimming then perform crash detection
|
- when trimming then perform crash detection
|
||||||
- problem: either -L0 and/or -p mmopt results in zero new coverage
|
|
||||||
|
|
||||||
|
|
||||||
## Should
|
## Should
|
||||||
|
@ -4,13 +4,31 @@
|
|||||||
release of the tool. See README.md for the general instruction manual.
|
release of the tool. See README.md for the general instruction manual.
|
||||||
|
|
||||||
### Version ++4.20a (dev)
|
### Version ++4.20a (dev)
|
||||||
|
! A new forkserver communication model is now introduced. afl-fuzz is
|
||||||
|
backward compatible to old compiled targets if they are not built
|
||||||
|
for CMPLOG/Redqueen, but new compiled targets will not work with
|
||||||
|
old afl-fuzz versions!
|
||||||
|
! Recompiled all targets that are instrumented for CMPLOG/Redqueen!
|
||||||
|
- AFL++ now supports up to 4 billion coverage edges, up from 6 million.
|
||||||
|
- New compile option: `make PERFORMANCE=1` - this will enable special
|
||||||
|
CPU dependent optimizations that make everything more performant - but
|
||||||
|
the binaries will likely won't work on different platforms. Also
|
||||||
|
enables a faster hasher if the CPU requirements are met.
|
||||||
|
- The persistent record feature (see config.h) was expanded to also
|
||||||
|
support replay, thanks to @quarta-qti !
|
||||||
- afl-fuzz:
|
- afl-fuzz:
|
||||||
- the new deterministic fuzzing feature is now activated by default,
|
- the new deterministic fuzzing feature is now activated by default,
|
||||||
deactivate with -z. Parameters -d and -D are ignored.
|
deactivate with -z. Parameters -d and -D are ignored.
|
||||||
|
- small improvements to CMPLOG/redqueen
|
||||||
|
- workround for a bug with MOpt -L when used with -M - in the future
|
||||||
|
we will either remove or rewrite MOpt.
|
||||||
- afl-cc:
|
- afl-cc:
|
||||||
- added collision free caller instrumentation to LTO mode. activate with
|
- added collision free caller instrumentation to LTO mode. activate with
|
||||||
`AFL_LLVM_LTO_CALLER=1`. You can set a max depth to go through single
|
`AFL_LLVM_LTO_CALLER=1`. You can set a max depth to go through single
|
||||||
block functions with `AFL_LLVM_LTO_CALLER_DEPTH` (default 0)
|
block functions with `AFL_LLVM_LTO_CALLER_DEPTH` (default 0)
|
||||||
|
- Minor edits to afl-persistent-config
|
||||||
|
- Prevent temporary files being left behind on aborted afl-whatsup
|
||||||
|
- More CPU benchmarks added to benchmark/
|
||||||
|
|
||||||
|
|
||||||
### Version ++4.10c (release)
|
### Version ++4.10c (release)
|
||||||
|
@ -41,13 +41,12 @@
|
|||||||
#define CMP_TYPE_INS 0
|
#define CMP_TYPE_INS 0
|
||||||
#define CMP_TYPE_RTN 1
|
#define CMP_TYPE_RTN 1
|
||||||
|
|
||||||
struct cmp_header {
|
struct cmp_header { // 16 bit = 2 bytes
|
||||||
|
|
||||||
unsigned hits : 6; // up to 63 entries, we have CMP_MAP_H = 32
|
unsigned hits : 6; // up to 63 entries, we have CMP_MAP_H = 32
|
||||||
unsigned shape : 5; // 31+1 bytes
|
unsigned shape : 5; // 31+1 bytes max
|
||||||
unsigned type : 1; // 4, we use 3: none, rtn, cmp
|
unsigned type : 1; // 2: cmp, rtn
|
||||||
unsigned attribute : 4; // 16 for arithmetic comparison types
|
unsigned attribute : 4; // 16 for arithmetic comparison types
|
||||||
//unsigned reserved : 6;
|
|
||||||
|
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
@ -64,6 +64,8 @@ static char *afl_environment_variables[] = {
|
|||||||
"AFL_REAL_LD", "AFL_LD_PRELOAD", "AFL_LD_VERBOSE", "AFL_LLVM_ALLOWLIST",
|
"AFL_REAL_LD", "AFL_LD_PRELOAD", "AFL_LD_VERBOSE", "AFL_LLVM_ALLOWLIST",
|
||||||
"AFL_LLVM_DENYLIST", "AFL_LLVM_BLOCKLIST", "AFL_CMPLOG", "AFL_LLVM_CMPLOG",
|
"AFL_LLVM_DENYLIST", "AFL_LLVM_BLOCKLIST", "AFL_CMPLOG", "AFL_LLVM_CMPLOG",
|
||||||
"AFL_GCC_CMPLOG", "AFL_LLVM_INSTRIM", "AFL_LLVM_CALLER", "AFL_LLVM_CTX",
|
"AFL_GCC_CMPLOG", "AFL_LLVM_INSTRIM", "AFL_LLVM_CALLER", "AFL_LLVM_CTX",
|
||||||
|
"AFL_LLVM_LTO_CALLER", "AFL_LLVM_LTO_CTX", "AFL_LLVM_LTO_CALLER_DEPTH",
|
||||||
|
"AFL_LLVM_LTO_CTX_DEPTH", "AFL_LLVM_CALLER_DEPTH", "AFL_LLVM_CTX_DEPTH",
|
||||||
"AFL_LLVM_CTX_K", "AFL_LLVM_DICT2FILE", "AFL_LLVM_DICT2FILE_NO_MAIN",
|
"AFL_LLVM_CTX_K", "AFL_LLVM_DICT2FILE", "AFL_LLVM_DICT2FILE_NO_MAIN",
|
||||||
"AFL_LLVM_DOCUMENT_IDS", "AFL_LLVM_INSTRIM_LOOPHEAD", "AFL_LLVM_INSTRUMENT",
|
"AFL_LLVM_DOCUMENT_IDS", "AFL_LLVM_INSTRIM_LOOPHEAD", "AFL_LLVM_INSTRUMENT",
|
||||||
"AFL_LLVM_LTO_AUTODICTIONARY", "AFL_LLVM_AUTODICTIONARY",
|
"AFL_LLVM_LTO_AUTODICTIONARY", "AFL_LLVM_AUTODICTIONARY",
|
||||||
|
509
include/t1ha.h
509
include/t1ha.h
@ -172,56 +172,56 @@
|
|||||||
#define T1HA_VERSION_RELEASE 1
|
#define T1HA_VERSION_RELEASE 1
|
||||||
|
|
||||||
#ifndef __has_attribute
|
#ifndef __has_attribute
|
||||||
#define __has_attribute(x) (0)
|
#define __has_attribute(x) (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __has_include
|
#ifndef __has_include
|
||||||
#define __has_include(x) (0)
|
#define __has_include(x) (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GNUC_PREREQ
|
#ifndef __GNUC_PREREQ
|
||||||
#if defined(__GNUC__) && defined(__GNUC_MINOR__)
|
#if defined(__GNUC__) && defined(__GNUC_MINOR__)
|
||||||
#define __GNUC_PREREQ(maj, min) \
|
#define __GNUC_PREREQ(maj, min) \
|
||||||
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
|
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
|
||||||
#else
|
#else
|
||||||
#define __GNUC_PREREQ(maj, min) 0
|
#define __GNUC_PREREQ(maj, min) 0
|
||||||
#endif
|
#endif
|
||||||
#endif /* __GNUC_PREREQ */
|
#endif /* __GNUC_PREREQ */
|
||||||
|
|
||||||
#ifndef __CLANG_PREREQ
|
#ifndef __CLANG_PREREQ
|
||||||
#ifdef __clang__
|
#ifdef __clang__
|
||||||
#define __CLANG_PREREQ(maj, min) \
|
#define __CLANG_PREREQ(maj, min) \
|
||||||
((__clang_major__ << 16) + __clang_minor__ >= ((maj) << 16) + (min))
|
((__clang_major__ << 16) + __clang_minor__ >= ((maj) << 16) + (min))
|
||||||
#else
|
#else
|
||||||
#define __CLANG_PREREQ(maj, min) (0)
|
#define __CLANG_PREREQ(maj, min) (0)
|
||||||
#endif
|
#endif
|
||||||
#endif /* __CLANG_PREREQ */
|
#endif /* __CLANG_PREREQ */
|
||||||
|
|
||||||
#ifndef __LCC_PREREQ
|
#ifndef __LCC_PREREQ
|
||||||
#ifdef __LCC__
|
#ifdef __LCC__
|
||||||
#define __LCC_PREREQ(maj, min) \
|
#define __LCC_PREREQ(maj, min) \
|
||||||
((__LCC__ << 16) + __LCC_MINOR__ >= ((maj) << 16) + (min))
|
((__LCC__ << 16) + __LCC_MINOR__ >= ((maj) << 16) + (min))
|
||||||
#else
|
#else
|
||||||
#define __LCC_PREREQ(maj, min) (0)
|
#define __LCC_PREREQ(maj, min) (0)
|
||||||
#endif
|
#endif
|
||||||
#endif /* __LCC_PREREQ */
|
#endif /* __LCC_PREREQ */
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
/* Avoid '16' bytes padding added after data member 't1ha_context::total'
|
/* Avoid '16' bytes padding added after data member 't1ha_context::total'
|
||||||
* and other warnings from std-headers if warning-level > 3. */
|
* and other warnings from std-headers if warning-level > 3. */
|
||||||
#pragma warning(push, 3)
|
#pragma warning(push, 3)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__cplusplus) && __cplusplus >= 201103L
|
#if defined(__cplusplus) && __cplusplus >= 201103L
|
||||||
#include <climits>
|
#include <climits>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#else
|
#else
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@ -234,18 +234,18 @@
|
|||||||
defined(__INTEL__) || defined(__x86_64) || defined(__x86_64__) || \
|
defined(__INTEL__) || defined(__x86_64) || defined(__x86_64__) || \
|
||||||
defined(__amd64__) || defined(__amd64) || defined(_M_X64) || \
|
defined(__amd64__) || defined(__amd64) || defined(_M_X64) || \
|
||||||
defined(_M_AMD64) || defined(__IA32__) || defined(__INTEL__)
|
defined(_M_AMD64) || defined(__IA32__) || defined(__INTEL__)
|
||||||
#ifndef __ia32__
|
#ifndef __ia32__
|
||||||
/* LY: define neutral __ia32__ for x86 and x86-64 archs */
|
/* LY: define neutral __ia32__ for x86 and x86-64 archs */
|
||||||
#define __ia32__ 1
|
#define __ia32__ 1
|
||||||
#endif /* __ia32__ */
|
#endif /* __ia32__ */
|
||||||
#if !defined(__amd64__) && (defined(__x86_64) || defined(__x86_64__) || \
|
#if !defined(__amd64__) && (defined(__x86_64) || defined(__x86_64__) || \
|
||||||
defined(__amd64) || defined(_M_X64))
|
defined(__amd64) || defined(_M_X64))
|
||||||
/* LY: define trusty __amd64__ for all AMD64/x86-64 arch */
|
/* LY: define trusty __amd64__ for all AMD64/x86-64 arch */
|
||||||
#define __amd64__ 1
|
#define __amd64__ 1
|
||||||
#endif /* __amd64__ */
|
#endif /* __amd64__ */
|
||||||
#endif /* all x86 */
|
#endif /* all x86 */
|
||||||
|
|
||||||
#if !defined(__BYTE_ORDER__) || !defined(__ORDER_LITTLE_ENDIAN__) || \
|
#if !defined(__BYTE_ORDER__) || !defined(__ORDER_LITTLE_ENDIAN__) || \
|
||||||
!defined(__ORDER_BIG_ENDIAN__)
|
!defined(__ORDER_BIG_ENDIAN__)
|
||||||
|
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
@ -267,160 +267,168 @@
|
|||||||
defined(__NETBSD__) || defined(__NetBSD__) || \
|
defined(__NETBSD__) || defined(__NetBSD__) || \
|
||||||
defined(HAVE_SYS_PARAM_H) || __has_include(<sys/param.h>)
|
defined(HAVE_SYS_PARAM_H) || __has_include(<sys/param.h>)
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#endif /* OS */
|
#endif /* OS */
|
||||||
|
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
/* clang-format on */
|
/* clang-format on */
|
||||||
|
|
||||||
#if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN)
|
#if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN)
|
||||||
#define __ORDER_LITTLE_ENDIAN__ __LITTLE_ENDIAN
|
#define __ORDER_LITTLE_ENDIAN__ __LITTLE_ENDIAN
|
||||||
#define __ORDER_BIG_ENDIAN__ __BIG_ENDIAN
|
#define __ORDER_BIG_ENDIAN__ __BIG_ENDIAN
|
||||||
#define __BYTE_ORDER__ __BYTE_ORDER
|
#define __BYTE_ORDER__ __BYTE_ORDER
|
||||||
#elif defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN) && defined(_BIG_ENDIAN)
|
#elif defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN) && defined(_BIG_ENDIAN)
|
||||||
#define __ORDER_LITTLE_ENDIAN__ _LITTLE_ENDIAN
|
#define __ORDER_LITTLE_ENDIAN__ _LITTLE_ENDIAN
|
||||||
#define __ORDER_BIG_ENDIAN__ _BIG_ENDIAN
|
#define __ORDER_BIG_ENDIAN__ _BIG_ENDIAN
|
||||||
#define __BYTE_ORDER__ _BYTE_ORDER
|
#define __BYTE_ORDER__ _BYTE_ORDER
|
||||||
#else
|
#else
|
||||||
#define __ORDER_LITTLE_ENDIAN__ 1234
|
#define __ORDER_LITTLE_ENDIAN__ 1234
|
||||||
#define __ORDER_BIG_ENDIAN__ 4321
|
#define __ORDER_BIG_ENDIAN__ 4321
|
||||||
|
|
||||||
#if defined(__LITTLE_ENDIAN__) || \
|
#if defined(__LITTLE_ENDIAN__) || \
|
||||||
(defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)) || \
|
(defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)) || \
|
||||||
defined(__ARMEL__) || defined(__THUMBEL__) || defined(__AARCH64EL__) || \
|
defined(__ARMEL__) || defined(__THUMBEL__) || \
|
||||||
defined(__MIPSEL__) || defined(_MIPSEL) || defined(__MIPSEL) || \
|
defined(__AARCH64EL__) || defined(__MIPSEL__) || defined(_MIPSEL) || \
|
||||||
defined(_M_ARM) || defined(_M_ARM64) || defined(__e2k__) || \
|
defined(__MIPSEL) || defined(_M_ARM) || defined(_M_ARM64) || \
|
||||||
defined(__elbrus_4c__) || defined(__elbrus_8c__) || defined(__bfin__) || \
|
defined(__e2k__) || defined(__elbrus_4c__) || \
|
||||||
defined(__BFIN__) || defined(__ia64__) || defined(_IA64) || \
|
defined(__elbrus_8c__) || defined(__bfin__) || defined(__BFIN__) || \
|
||||||
defined(__IA64__) || defined(__ia64) || defined(_M_IA64) || \
|
defined(__ia64__) || defined(_IA64) || defined(__IA64__) || \
|
||||||
defined(__itanium__) || defined(__ia32__) || defined(__CYGWIN__) || \
|
defined(__ia64) || defined(_M_IA64) || defined(__itanium__) || \
|
||||||
defined(_WIN64) || defined(_WIN32) || defined(__TOS_WIN__) || \
|
defined(__ia32__) || defined(__CYGWIN__) || defined(_WIN64) || \
|
||||||
defined(__WINDOWS__)
|
defined(_WIN32) || defined(__TOS_WIN__) || defined(__WINDOWS__)
|
||||||
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
|
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
|
||||||
|
|
||||||
#elif defined(__BIG_ENDIAN__) || \
|
#elif defined(__BIG_ENDIAN__) || \
|
||||||
(defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)) || \
|
(defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)) || \
|
||||||
defined(__ARMEB__) || defined(__THUMBEB__) || defined(__AARCH64EB__) || \
|
defined(__ARMEB__) || defined(__THUMBEB__) || \
|
||||||
defined(__MIPSEB__) || defined(_MIPSEB) || defined(__MIPSEB) || \
|
defined(__AARCH64EB__) || defined(__MIPSEB__) || defined(_MIPSEB) || \
|
||||||
defined(__m68k__) || defined(M68000) || defined(__hppa__) || \
|
defined(__MIPSEB) || defined(__m68k__) || defined(M68000) || \
|
||||||
defined(__hppa) || defined(__HPPA__) || defined(__sparc__) || \
|
defined(__hppa__) || defined(__hppa) || defined(__HPPA__) || \
|
||||||
defined(__sparc) || defined(__370__) || defined(__THW_370__) || \
|
defined(__sparc__) || defined(__sparc) || defined(__370__) || \
|
||||||
defined(__s390__) || defined(__s390x__) || defined(__SYSC_ZARCH__)
|
defined(__THW_370__) || defined(__s390__) || defined(__s390x__) || \
|
||||||
#define __BYTE_ORDER__ __ORDER_BIG_ENDIAN__
|
defined(__SYSC_ZARCH__)
|
||||||
|
#define __BYTE_ORDER__ __ORDER_BIG_ENDIAN__
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#error __BYTE_ORDER__ should be defined.
|
#error __BYTE_ORDER__ should be defined.
|
||||||
#endif /* Arch */
|
#endif /* Arch */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif /* __BYTE_ORDER__ || __ORDER_LITTLE_ENDIAN__ || __ORDER_BIG_ENDIAN__ */
|
#endif /* __BYTE_ORDER__ || __ORDER_LITTLE_ENDIAN__ || __ORDER_BIG_ENDIAN__ */
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#ifndef __dll_export
|
#ifndef __dll_export
|
||||||
#if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)
|
#if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)
|
||||||
#if defined(__GNUC__) || __has_attribute(dllexport)
|
#if defined(__GNUC__) || __has_attribute(dllexport)
|
||||||
#define __dll_export __attribute__((dllexport))
|
#define __dll_export __attribute__((dllexport))
|
||||||
#else
|
#else
|
||||||
#define __dll_export __declspec(dllexport)
|
#define __dll_export __declspec(dllexport)
|
||||||
#endif
|
#endif
|
||||||
#elif defined(__GNUC__) || __has_attribute(__visibility__)
|
#elif defined(__GNUC__) || __has_attribute(__visibility__)
|
||||||
#define __dll_export __attribute__((__visibility__("default")))
|
#define __dll_export __attribute__((__visibility__("default")))
|
||||||
#else
|
#else
|
||||||
#define __dll_export
|
#define __dll_export
|
||||||
#endif
|
#endif
|
||||||
#endif /* __dll_export */
|
#endif /* __dll_export */
|
||||||
|
|
||||||
#ifndef __dll_import
|
#ifndef __dll_import
|
||||||
#if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)
|
#if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)
|
||||||
#if defined(__GNUC__) || __has_attribute(dllimport)
|
#if defined(__GNUC__) || __has_attribute(dllimport)
|
||||||
#define __dll_import __attribute__((dllimport))
|
#define __dll_import __attribute__((dllimport))
|
||||||
#else
|
#else
|
||||||
#define __dll_import __declspec(dllimport)
|
#define __dll_import __declspec(dllimport)
|
||||||
#endif
|
#endif
|
||||||
#elif defined(__GNUC__) || __has_attribute(__visibility__)
|
#elif defined(__GNUC__) || __has_attribute(__visibility__)
|
||||||
#define __dll_import __attribute__((__visibility__("default")))
|
#define __dll_import __attribute__((__visibility__("default")))
|
||||||
#else
|
#else
|
||||||
#define __dll_import
|
#define __dll_import
|
||||||
#endif
|
#endif
|
||||||
#endif /* __dll_import */
|
#endif /* __dll_import */
|
||||||
|
|
||||||
#ifndef __force_inline
|
#ifndef __force_inline
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#define __force_inline __forceinline
|
#define __force_inline __forceinline
|
||||||
#elif __GNUC_PREREQ(3, 2) || __has_attribute(__always_inline__)
|
#elif __GNUC_PREREQ(3, 2) || __has_attribute(__always_inline__)
|
||||||
#define __force_inline __inline __attribute__((__always_inline__))
|
#define __force_inline __inline __attribute__((__always_inline__))
|
||||||
#else
|
#else
|
||||||
#define __force_inline __inline
|
#define __force_inline __inline
|
||||||
#endif
|
#endif
|
||||||
#endif /* __force_inline */
|
#endif /* __force_inline */
|
||||||
|
|
||||||
#ifndef T1HA_API
|
#ifndef T1HA_API
|
||||||
#if defined(t1ha_EXPORTS)
|
#if defined(t1ha_EXPORTS)
|
||||||
#define T1HA_API __dll_export
|
#define T1HA_API __dll_export
|
||||||
#elif defined(t1ha_IMPORTS)
|
#elif defined(t1ha_IMPORTS)
|
||||||
#define T1HA_API __dll_import
|
#define T1HA_API __dll_import
|
||||||
#else
|
#else
|
||||||
#define T1HA_API
|
#define T1HA_API
|
||||||
#endif
|
#endif
|
||||||
#endif /* T1HA_API */
|
#endif /* T1HA_API */
|
||||||
|
|
||||||
#if defined(_MSC_VER) && defined(__ia32__)
|
#if defined(_MSC_VER) && defined(__ia32__)
|
||||||
#define T1HA_ALIGN_PREFIX __declspec(align(32)) /* required only for SIMD */
|
#define T1HA_ALIGN_PREFIX __declspec(align(32)) /* required only for SIMD */
|
||||||
#else
|
#else
|
||||||
#define T1HA_ALIGN_PREFIX
|
#define T1HA_ALIGN_PREFIX
|
||||||
#endif /* _MSC_VER */
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
#if defined(__GNUC__) && defined(__ia32__)
|
#if defined(__GNUC__) && defined(__ia32__)
|
||||||
#define T1HA_ALIGN_SUFFIX \
|
#define T1HA_ALIGN_SUFFIX \
|
||||||
__attribute__((__aligned__(32))) /* required only for SIMD */
|
__attribute__((__aligned__(32))) /* required only for SIMD */
|
||||||
#else
|
#else
|
||||||
#define T1HA_ALIGN_SUFFIX
|
#define T1HA_ALIGN_SUFFIX
|
||||||
#endif /* GCC x86 */
|
#endif /* GCC x86 */
|
||||||
|
|
||||||
#ifndef T1HA_USE_INDIRECT_FUNCTIONS
|
#ifndef T1HA_USE_INDIRECT_FUNCTIONS
|
||||||
/* GNU ELF indirect functions usage control. For more info please see
|
/* GNU ELF indirect functions usage control. For more info please see
|
||||||
* https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
|
* https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
|
||||||
* and https://sourceware.org/glibc/wiki/GNU_IFUNC */
|
* and https://sourceware.org/glibc/wiki/GNU_IFUNC */
|
||||||
#if defined(__ELF__) && defined(__amd64__) && \
|
#if defined(__ELF__) && defined(__amd64__) && \
|
||||||
(__has_attribute(__ifunc__) || \
|
(__has_attribute(__ifunc__) || \
|
||||||
(!defined(__clang__) && defined(__GNUC__) && __GNUC__ >= 4 && \
|
(!defined(__clang__) && defined(__GNUC__) && __GNUC__ >= 4 && \
|
||||||
!defined(__SANITIZE_ADDRESS__) && !defined(__SSP_ALL__)))
|
!defined(__SANITIZE_ADDRESS__) && !defined(__SSP_ALL__)))
|
||||||
/* Enable gnu_indirect_function by default if :
|
/* Enable gnu_indirect_function by default if :
|
||||||
* - ELF AND x86_64
|
* - ELF AND x86_64
|
||||||
* - attribute(__ifunc__) is available OR
|
* - attribute(__ifunc__) is available OR
|
||||||
* GCC >= 4 WITHOUT -fsanitize=address NOR -fstack-protector-all */
|
* GCC >= 4 WITHOUT -fsanitize=address NOR -fstack-protector-all */
|
||||||
#define T1HA_USE_INDIRECT_FUNCTIONS 1
|
#define T1HA_USE_INDIRECT_FUNCTIONS 1
|
||||||
#else
|
#else
|
||||||
#define T1HA_USE_INDIRECT_FUNCTIONS 0
|
#define T1HA_USE_INDIRECT_FUNCTIONS 0
|
||||||
#endif
|
#endif
|
||||||
#endif /* T1HA_USE_INDIRECT_FUNCTIONS */
|
#endif /* T1HA_USE_INDIRECT_FUNCTIONS */
|
||||||
|
|
||||||
#if __GNUC_PREREQ(4, 0)
|
#if __GNUC_PREREQ(4, 0)
|
||||||
#pragma GCC visibility push(hidden)
|
#pragma GCC visibility push(hidden)
|
||||||
#endif /* __GNUC_PREREQ(4,0) */
|
#endif /* __GNUC_PREREQ(4,0) */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef union T1HA_ALIGN_PREFIX t1ha_state256 {
|
typedef union T1HA_ALIGN_PREFIX t1ha_state256 {
|
||||||
uint8_t bytes[32];
|
|
||||||
|
uint8_t bytes[32];
|
||||||
uint32_t u32[8];
|
uint32_t u32[8];
|
||||||
uint64_t u64[4];
|
uint64_t u64[4];
|
||||||
struct {
|
struct {
|
||||||
|
|
||||||
uint64_t a, b, c, d;
|
uint64_t a, b, c, d;
|
||||||
|
|
||||||
} n;
|
} n;
|
||||||
|
|
||||||
} t1ha_state256_t T1HA_ALIGN_SUFFIX;
|
} t1ha_state256_t T1HA_ALIGN_SUFFIX;
|
||||||
|
|
||||||
typedef struct t1ha_context {
|
typedef struct t1ha_context {
|
||||||
|
|
||||||
t1ha_state256_t state;
|
t1ha_state256_t state;
|
||||||
t1ha_state256_t buffer;
|
t1ha_state256_t buffer;
|
||||||
size_t partial;
|
size_t partial;
|
||||||
uint64_t total;
|
uint64_t total;
|
||||||
|
|
||||||
} t1ha_context_t;
|
} t1ha_context_t;
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@ -443,37 +451,37 @@ T1HA_API int t1ha_selfcheck__t1ha2_atonce(void);
|
|||||||
T1HA_API int t1ha_selfcheck__t1ha2_atonce128(void);
|
T1HA_API int t1ha_selfcheck__t1ha2_atonce128(void);
|
||||||
T1HA_API int t1ha_selfcheck__t1ha2_stream(void);
|
T1HA_API int t1ha_selfcheck__t1ha2_stream(void);
|
||||||
T1HA_API int t1ha_selfcheck__t1ha2(void);
|
T1HA_API int t1ha_selfcheck__t1ha2(void);
|
||||||
#endif /* T1HA2_DISABLED */
|
#endif /* T1HA2_DISABLED */
|
||||||
|
|
||||||
#ifndef T1HA1_DISABLED
|
#ifndef T1HA1_DISABLED
|
||||||
T1HA_API int t1ha_selfcheck__t1ha1_le(void);
|
T1HA_API int t1ha_selfcheck__t1ha1_le(void);
|
||||||
T1HA_API int t1ha_selfcheck__t1ha1_be(void);
|
T1HA_API int t1ha_selfcheck__t1ha1_be(void);
|
||||||
T1HA_API int t1ha_selfcheck__t1ha1(void);
|
T1HA_API int t1ha_selfcheck__t1ha1(void);
|
||||||
#endif /* T1HA1_DISABLED */
|
#endif /* T1HA1_DISABLED */
|
||||||
|
|
||||||
#ifndef T1HA0_DISABLED
|
#ifndef T1HA0_DISABLED
|
||||||
T1HA_API int t1ha_selfcheck__t1ha0_32le(void);
|
T1HA_API int t1ha_selfcheck__t1ha0_32le(void);
|
||||||
T1HA_API int t1ha_selfcheck__t1ha0_32be(void);
|
T1HA_API int t1ha_selfcheck__t1ha0_32be(void);
|
||||||
T1HA_API int t1ha_selfcheck__t1ha0(void);
|
T1HA_API int t1ha_selfcheck__t1ha0(void);
|
||||||
|
|
||||||
/* Define T1HA0_AESNI_AVAILABLE to 0 for disable AES-NI support. */
|
/* Define T1HA0_AESNI_AVAILABLE to 0 for disable AES-NI support. */
|
||||||
#ifndef T1HA0_AESNI_AVAILABLE
|
#ifndef T1HA0_AESNI_AVAILABLE
|
||||||
#if defined(__e2k__) || \
|
#if defined(__e2k__) || \
|
||||||
(defined(__ia32__) && (!defined(_M_IX86) || _MSC_VER > 1800))
|
(defined(__ia32__) && (!defined(_M_IX86) || _MSC_VER > 1800))
|
||||||
#define T1HA0_AESNI_AVAILABLE 1
|
#define T1HA0_AESNI_AVAILABLE 1
|
||||||
#else
|
#else
|
||||||
#define T1HA0_AESNI_AVAILABLE 0
|
#define T1HA0_AESNI_AVAILABLE 0
|
||||||
#endif
|
#endif
|
||||||
#endif /* ifndef T1HA0_AESNI_AVAILABLE */
|
#endif /* ifndef T1HA0_AESNI_AVAILABLE */
|
||||||
|
|
||||||
#if T1HA0_AESNI_AVAILABLE
|
#if T1HA0_AESNI_AVAILABLE
|
||||||
T1HA_API int t1ha_selfcheck__t1ha0_ia32aes_noavx(void);
|
T1HA_API int t1ha_selfcheck__t1ha0_ia32aes_noavx(void);
|
||||||
T1HA_API int t1ha_selfcheck__t1ha0_ia32aes_avx(void);
|
T1HA_API int t1ha_selfcheck__t1ha0_ia32aes_avx(void);
|
||||||
#ifndef __e2k__
|
#ifndef __e2k__
|
||||||
T1HA_API int t1ha_selfcheck__t1ha0_ia32aes_avx2(void);
|
T1HA_API int t1ha_selfcheck__t1ha0_ia32aes_avx2(void);
|
||||||
#endif
|
#endif
|
||||||
#endif /* if T1HA0_AESNI_AVAILABLE */
|
#endif /* if T1HA0_AESNI_AVAILABLE */
|
||||||
#endif /* T1HA0_DISABLED */
|
#endif /* T1HA0_DISABLED */
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
@ -521,7 +529,7 @@ T1HA_API void t1ha2_update(t1ha_context_t *__restrict ctx,
|
|||||||
T1HA_API uint64_t t1ha2_final(t1ha_context_t *__restrict ctx,
|
T1HA_API uint64_t t1ha2_final(t1ha_context_t *__restrict ctx,
|
||||||
uint64_t *__restrict extra_result /* optional */);
|
uint64_t *__restrict extra_result /* optional */);
|
||||||
|
|
||||||
#endif /* T1HA2_DISABLED */
|
#endif /* T1HA2_DISABLED */
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
@ -546,7 +554,7 @@ T1HA_API uint64_t t1ha1_le(const void *data, size_t length, uint64_t seed);
|
|||||||
/* The big-endian variant. */
|
/* The big-endian variant. */
|
||||||
T1HA_API uint64_t t1ha1_be(const void *data, size_t length, uint64_t seed);
|
T1HA_API uint64_t t1ha1_be(const void *data, size_t length, uint64_t seed);
|
||||||
|
|
||||||
#endif /* T1HA1_DISABLED */
|
#endif /* T1HA1_DISABLED */
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
@ -589,131 +597,142 @@ uint64_t t1ha0_32le(const void *data, size_t length, uint64_t seed);
|
|||||||
/* The big-endian variant for 32-bit CPU. */
|
/* The big-endian variant for 32-bit CPU. */
|
||||||
uint64_t t1ha0_32be(const void *data, size_t length, uint64_t seed);
|
uint64_t t1ha0_32be(const void *data, size_t length, uint64_t seed);
|
||||||
|
|
||||||
/* Define T1HA0_AESNI_AVAILABLE to 0 for disable AES-NI support. */
|
/* Define T1HA0_AESNI_AVAILABLE to 0 for disable AES-NI support. */
|
||||||
#ifndef T1HA0_AESNI_AVAILABLE
|
#ifndef T1HA0_AESNI_AVAILABLE
|
||||||
#if defined(__e2k__) || \
|
#if defined(__e2k__) || \
|
||||||
(defined(__ia32__) && (!defined(_M_IX86) || _MSC_VER > 1800))
|
(defined(__ia32__) && (!defined(_M_IX86) || _MSC_VER > 1800))
|
||||||
#define T1HA0_AESNI_AVAILABLE 1
|
#define T1HA0_AESNI_AVAILABLE 1
|
||||||
#else
|
#else
|
||||||
#define T1HA0_AESNI_AVAILABLE 0
|
#define T1HA0_AESNI_AVAILABLE 0
|
||||||
#endif
|
#endif
|
||||||
#endif /* T1HA0_AESNI_AVAILABLE */
|
#endif /* T1HA0_AESNI_AVAILABLE */
|
||||||
|
|
||||||
/* Define T1HA0_RUNTIME_SELECT to 0 for disable dispatching t1ha0 at runtime. */
|
/* Define T1HA0_RUNTIME_SELECT to 0 for disable dispatching t1ha0 at runtime.
|
||||||
#ifndef T1HA0_RUNTIME_SELECT
|
*/
|
||||||
#if T1HA0_AESNI_AVAILABLE && !defined(__e2k__)
|
#ifndef T1HA0_RUNTIME_SELECT
|
||||||
#define T1HA0_RUNTIME_SELECT 1
|
#if T1HA0_AESNI_AVAILABLE && !defined(__e2k__)
|
||||||
#else
|
#define T1HA0_RUNTIME_SELECT 1
|
||||||
#define T1HA0_RUNTIME_SELECT 0
|
#else
|
||||||
#endif
|
#define T1HA0_RUNTIME_SELECT 0
|
||||||
#endif /* T1HA0_RUNTIME_SELECT */
|
#endif
|
||||||
|
#endif /* T1HA0_RUNTIME_SELECT */
|
||||||
|
|
||||||
#if !T1HA0_RUNTIME_SELECT && !defined(T1HA0_USE_DEFINE)
|
#if !T1HA0_RUNTIME_SELECT && !defined(T1HA0_USE_DEFINE)
|
||||||
#if defined(__LCC__)
|
#if defined(__LCC__)
|
||||||
#define T1HA0_USE_DEFINE 1
|
#define T1HA0_USE_DEFINE 1
|
||||||
#else
|
#else
|
||||||
#define T1HA0_USE_DEFINE 0
|
#define T1HA0_USE_DEFINE 0
|
||||||
#endif
|
#endif
|
||||||
#endif /* T1HA0_USE_DEFINE */
|
#endif /* T1HA0_USE_DEFINE */
|
||||||
|
|
||||||
#if T1HA0_AESNI_AVAILABLE
|
#if T1HA0_AESNI_AVAILABLE
|
||||||
uint64_t t1ha0_ia32aes_noavx(const void *data, size_t length, uint64_t seed);
|
uint64_t t1ha0_ia32aes_noavx(const void *data, size_t length, uint64_t seed);
|
||||||
uint64_t t1ha0_ia32aes_avx(const void *data, size_t length, uint64_t seed);
|
uint64_t t1ha0_ia32aes_avx(const void *data, size_t length, uint64_t seed);
|
||||||
#ifndef __e2k__
|
#ifndef __e2k__
|
||||||
uint64_t t1ha0_ia32aes_avx2(const void *data, size_t length, uint64_t seed);
|
uint64_t t1ha0_ia32aes_avx2(const void *data, size_t length, uint64_t seed);
|
||||||
#endif
|
#endif
|
||||||
#endif /* T1HA0_AESNI_AVAILABLE */
|
#endif /* T1HA0_AESNI_AVAILABLE */
|
||||||
|
|
||||||
#if T1HA0_RUNTIME_SELECT
|
#if T1HA0_RUNTIME_SELECT
|
||||||
typedef uint64_t (*t1ha0_function_t)(const void *, size_t, uint64_t);
|
typedef uint64_t (*t1ha0_function_t)(const void *, size_t, uint64_t);
|
||||||
T1HA_API t1ha0_function_t t1ha0_resolve(void);
|
T1HA_API t1ha0_function_t t1ha0_resolve(void);
|
||||||
#if T1HA_USE_INDIRECT_FUNCTIONS
|
#if T1HA_USE_INDIRECT_FUNCTIONS
|
||||||
T1HA_API uint64_t t1ha0(const void *data, size_t length, uint64_t seed);
|
T1HA_API uint64_t t1ha0(const void *data, size_t length, uint64_t seed);
|
||||||
#else
|
#else
|
||||||
/* Otherwise function pointer will be used.
|
/* Otherwise function pointer will be used.
|
||||||
* Unfortunately this may cause some overhead calling. */
|
* Unfortunately this may cause some overhead calling. */
|
||||||
T1HA_API extern uint64_t (*t1ha0_funcptr)(const void *data, size_t length,
|
T1HA_API extern uint64_t (*t1ha0_funcptr)(const void *data, size_t length,
|
||||||
uint64_t seed);
|
uint64_t seed);
|
||||||
static __force_inline uint64_t t1ha0(const void *data, size_t length,
|
static __force_inline uint64_t t1ha0(const void *data, size_t length,
|
||||||
uint64_t seed) {
|
uint64_t seed) {
|
||||||
|
|
||||||
return t1ha0_funcptr(data, length, seed);
|
return t1ha0_funcptr(data, length, seed);
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif /* T1HA_USE_INDIRECT_FUNCTIONS */
|
|
||||||
|
|
||||||
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
#endif /* T1HA_USE_INDIRECT_FUNCTIONS */
|
||||||
|
|
||||||
#if T1HA0_USE_DEFINE
|
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||||
|
|
||||||
#if (UINTPTR_MAX > 0xffffFFFFul || ULONG_MAX > 0xffffFFFFul) && \
|
#if T1HA0_USE_DEFINE
|
||||||
(!defined(T1HA1_DISABLED) || !defined(T1HA2_DISABLED))
|
|
||||||
#if defined(T1HA1_DISABLED)
|
|
||||||
#define t1ha0 t1ha2_atonce
|
|
||||||
#else
|
|
||||||
#define t1ha0 t1ha1_be
|
|
||||||
#endif /* T1HA1_DISABLED */
|
|
||||||
#else /* 32/64 */
|
|
||||||
#define t1ha0 t1ha0_32be
|
|
||||||
#endif /* 32/64 */
|
|
||||||
|
|
||||||
#else /* T1HA0_USE_DEFINE */
|
#if (UINTPTR_MAX > 0xffffFFFFul || ULONG_MAX > 0xffffFFFFul) && \
|
||||||
|
(!defined(T1HA1_DISABLED) || !defined(T1HA2_DISABLED))
|
||||||
|
#if defined(T1HA1_DISABLED)
|
||||||
|
#define t1ha0 t1ha2_atonce
|
||||||
|
#else
|
||||||
|
#define t1ha0 t1ha1_be
|
||||||
|
#endif /* T1HA1_DISABLED */
|
||||||
|
#else /* 32/64 */
|
||||||
|
#define t1ha0 t1ha0_32be
|
||||||
|
#endif /* 32/64 */
|
||||||
|
|
||||||
|
#else /* T1HA0_USE_DEFINE */
|
||||||
|
|
||||||
static __force_inline uint64_t t1ha0(const void *data, size_t length,
|
static __force_inline uint64_t t1ha0(const void *data, size_t length,
|
||||||
uint64_t seed) {
|
uint64_t seed) {
|
||||||
#if (UINTPTR_MAX > 0xffffFFFFul || ULONG_MAX > 0xffffFFFFul) && \
|
|
||||||
(!defined(T1HA1_DISABLED) || !defined(T1HA2_DISABLED))
|
#if (UINTPTR_MAX > 0xffffFFFFul || ULONG_MAX > 0xffffFFFFul) && \
|
||||||
#if defined(T1HA1_DISABLED)
|
(!defined(T1HA1_DISABLED) || !defined(T1HA2_DISABLED))
|
||||||
|
#if defined(T1HA1_DISABLED)
|
||||||
return t1ha2_atonce(data, length, seed);
|
return t1ha2_atonce(data, length, seed);
|
||||||
#else
|
#else
|
||||||
return t1ha1_be(data, length, seed);
|
return t1ha1_be(data, length, seed);
|
||||||
#endif /* T1HA1_DISABLED */
|
#endif /* T1HA1_DISABLED */
|
||||||
#else /* 32/64 */
|
#else /* 32/64 */
|
||||||
return t1ha0_32be(data, length, seed);
|
return t1ha0_32be(data, length, seed);
|
||||||
#endif /* 32/64 */
|
#endif /* 32/64 */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* !T1HA0_USE_DEFINE */
|
#endif /* !T1HA0_USE_DEFINE */
|
||||||
|
|
||||||
#else /* !T1HA0_RUNTIME_SELECT && __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__ */
|
#else /* !T1HA0_RUNTIME_SELECT && __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__ */
|
||||||
|
|
||||||
#if T1HA0_USE_DEFINE
|
#if T1HA0_USE_DEFINE
|
||||||
|
|
||||||
#if (UINTPTR_MAX > 0xffffFFFFul || ULONG_MAX > 0xffffFFFFul) && \
|
#if (UINTPTR_MAX > 0xffffFFFFul || ULONG_MAX > 0xffffFFFFul) && \
|
||||||
(!defined(T1HA1_DISABLED) || !defined(T1HA2_DISABLED))
|
(!defined(T1HA1_DISABLED) || !defined(T1HA2_DISABLED))
|
||||||
#if defined(T1HA1_DISABLED)
|
#if defined(T1HA1_DISABLED)
|
||||||
#define t1ha0 t1ha2_atonce
|
#define t1ha0 t1ha2_atonce
|
||||||
#else
|
#else
|
||||||
#define t1ha0 t1ha1_le
|
#define t1ha0 t1ha1_le
|
||||||
#endif /* T1HA1_DISABLED */
|
#endif /* T1HA1_DISABLED */
|
||||||
#else /* 32/64 */
|
#else /* 32/64 */
|
||||||
#define t1ha0 t1ha0_32le
|
#define t1ha0 t1ha0_32le
|
||||||
#endif /* 32/64 */
|
#endif /* 32/64 */
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static __force_inline uint64_t t1ha0(const void *data, size_t length,
|
static __force_inline uint64_t t1ha0(const void *data, size_t length,
|
||||||
uint64_t seed) {
|
uint64_t seed) {
|
||||||
#if (UINTPTR_MAX > 0xffffFFFFul || ULONG_MAX > 0xffffFFFFul) && \
|
|
||||||
(!defined(T1HA1_DISABLED) || !defined(T1HA2_DISABLED))
|
#if (UINTPTR_MAX > 0xffffFFFFul || ULONG_MAX > 0xffffFFFFul) && \
|
||||||
#if defined(T1HA1_DISABLED)
|
(!defined(T1HA1_DISABLED) || !defined(T1HA2_DISABLED))
|
||||||
|
#if defined(T1HA1_DISABLED)
|
||||||
return t1ha2_atonce(data, length, seed);
|
return t1ha2_atonce(data, length, seed);
|
||||||
#else
|
#else
|
||||||
return t1ha1_le(data, length, seed);
|
return t1ha1_le(data, length, seed);
|
||||||
#endif /* T1HA1_DISABLED */
|
#endif /* T1HA1_DISABLED */
|
||||||
#else /* 32/64 */
|
#else /* 32/64 */
|
||||||
return t1ha0_32le(data, length, seed);
|
return t1ha0_32le(data, length, seed);
|
||||||
#endif /* 32/64 */
|
#endif /* 32/64 */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* !T1HA0_USE_DEFINE */
|
#endif /* !T1HA0_USE_DEFINE */
|
||||||
|
|
||||||
#endif /* !T1HA0_RUNTIME_SELECT */
|
#endif /* !T1HA0_RUNTIME_SELECT */
|
||||||
|
|
||||||
#endif /* T1HA0_DISABLED */
|
#endif /* T1HA0_DISABLED */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __GNUC_PREREQ(4, 0)
|
#if __GNUC_PREREQ(4, 0)
|
||||||
#pragma GCC visibility pop
|
#pragma GCC visibility pop
|
||||||
#endif /* __GNUC_PREREQ(4,0) */
|
#endif /* __GNUC_PREREQ(4,0) */
|
||||||
|
|
||||||
|
@ -47,27 +47,34 @@
|
|||||||
#if T1HA0_AESNI_AVAILABLE
|
#if T1HA0_AESNI_AVAILABLE
|
||||||
|
|
||||||
uint64_t T1HA_IA32AES_NAME(const void *data, uint32_t len) {
|
uint64_t T1HA_IA32AES_NAME(const void *data, uint32_t len) {
|
||||||
|
|
||||||
uint64_t a = 0;
|
uint64_t a = 0;
|
||||||
uint64_t b = len;
|
uint64_t b = len;
|
||||||
|
|
||||||
if (likely(len > 32)) {
|
if (likely(len > 32)) {
|
||||||
|
|
||||||
__m128i x = _mm_set_epi64x(a, b);
|
__m128i x = _mm_set_epi64x(a, b);
|
||||||
__m128i y = _mm_aesenc_si128(x, _mm_set_epi64x(prime_0, prime_1));
|
__m128i y = _mm_aesenc_si128(x, _mm_set_epi64x(prime_0, prime_1));
|
||||||
|
|
||||||
const __m128i *v = (const __m128i *)data;
|
const __m128i *v = (const __m128i *)data;
|
||||||
const __m128i *const detent =
|
const __m128i *const detent =
|
||||||
(const __m128i *)((const uint8_t *)data + (len & ~15ul));
|
(const __m128i *)((const uint8_t *)data + (len & ~15ul));
|
||||||
data = detent;
|
data = detent;
|
||||||
|
|
||||||
if (len & 16) {
|
if (len & 16) {
|
||||||
|
|
||||||
x = _mm_add_epi64(x, _mm_loadu_si128(v++));
|
x = _mm_add_epi64(x, _mm_loadu_si128(v++));
|
||||||
y = _mm_aesenc_si128(x, y);
|
y = _mm_aesenc_si128(x, y);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
len &= 15;
|
len &= 15;
|
||||||
|
|
||||||
if (v + 7 < detent) {
|
if (v + 7 < detent) {
|
||||||
|
|
||||||
__m128i salt = y;
|
__m128i salt = y;
|
||||||
do {
|
do {
|
||||||
|
|
||||||
__m128i t = _mm_aesenc_si128(_mm_loadu_si128(v++), salt);
|
__m128i t = _mm_aesenc_si128(_mm_loadu_si128(v++), salt);
|
||||||
t = _mm_aesdec_si128(t, _mm_loadu_si128(v++));
|
t = _mm_aesdec_si128(t, _mm_loadu_si128(v++));
|
||||||
t = _mm_aesdec_si128(t, _mm_loadu_si128(v++));
|
t = _mm_aesdec_si128(t, _mm_loadu_si128(v++));
|
||||||
@ -82,86 +89,95 @@ uint64_t T1HA_IA32AES_NAME(const void *data, uint32_t len) {
|
|||||||
t = _mm_aesenc_si128(x, t);
|
t = _mm_aesenc_si128(x, t);
|
||||||
x = _mm_add_epi64(y, x);
|
x = _mm_add_epi64(y, x);
|
||||||
y = t;
|
y = t;
|
||||||
|
|
||||||
} while (v + 7 < detent);
|
} while (v + 7 < detent);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while (v < detent) {
|
while (v < detent) {
|
||||||
|
|
||||||
__m128i v0y = _mm_add_epi64(y, _mm_loadu_si128(v++));
|
__m128i v0y = _mm_add_epi64(y, _mm_loadu_si128(v++));
|
||||||
__m128i v1x = _mm_sub_epi64(x, _mm_loadu_si128(v++));
|
__m128i v1x = _mm_sub_epi64(x, _mm_loadu_si128(v++));
|
||||||
x = _mm_aesdec_si128(x, v0y);
|
x = _mm_aesdec_si128(x, v0y);
|
||||||
y = _mm_aesdec_si128(y, v1x);
|
y = _mm_aesdec_si128(y, v1x);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
x = _mm_add_epi64(_mm_aesdec_si128(x, _mm_aesenc_si128(y, x)), y);
|
x = _mm_add_epi64(_mm_aesdec_si128(x, _mm_aesenc_si128(y, x)), y);
|
||||||
#if defined(__x86_64__) || defined(_M_X64)
|
#if defined(__x86_64__) || defined(_M_X64)
|
||||||
#if defined(__SSE4_1__) || defined(__AVX__)
|
#if defined(__SSE4_1__) || defined(__AVX__)
|
||||||
a = _mm_extract_epi64(x, 0);
|
a = _mm_extract_epi64(x, 0);
|
||||||
b = _mm_extract_epi64(x, 1);
|
b = _mm_extract_epi64(x, 1);
|
||||||
#else
|
#else
|
||||||
a = _mm_cvtsi128_si64(x);
|
a = _mm_cvtsi128_si64(x);
|
||||||
b = _mm_cvtsi128_si64(_mm_unpackhi_epi64(x, x));
|
b = _mm_cvtsi128_si64(_mm_unpackhi_epi64(x, x));
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#if defined(__SSE4_1__) || defined(__AVX__)
|
#if defined(__SSE4_1__) || defined(__AVX__)
|
||||||
a = (uint32_t)_mm_extract_epi32(x, 0) | (uint64_t)_mm_extract_epi32(x, 1)
|
a = (uint32_t)_mm_extract_epi32(x, 0) | (uint64_t)_mm_extract_epi32(x, 1)
|
||||||
<< 32;
|
<< 32;
|
||||||
b = (uint32_t)_mm_extract_epi32(x, 2) | (uint64_t)_mm_extract_epi32(x, 3)
|
b = (uint32_t)_mm_extract_epi32(x, 2) | (uint64_t)_mm_extract_epi32(x, 3)
|
||||||
<< 32;
|
<< 32;
|
||||||
#else
|
#else
|
||||||
a = (uint32_t)_mm_cvtsi128_si32(x);
|
a = (uint32_t)_mm_cvtsi128_si32(x);
|
||||||
a |= (uint64_t)_mm_cvtsi128_si32(_mm_shuffle_epi32(x, 1)) << 32;
|
a |= (uint64_t)_mm_cvtsi128_si32(_mm_shuffle_epi32(x, 1)) << 32;
|
||||||
x = _mm_unpackhi_epi64(x, x);
|
x = _mm_unpackhi_epi64(x, x);
|
||||||
b = (uint32_t)_mm_cvtsi128_si32(x);
|
b = (uint32_t)_mm_cvtsi128_si32(x);
|
||||||
b |= (uint64_t)_mm_cvtsi128_si32(_mm_shuffle_epi32(x, 1)) << 32;
|
b |= (uint64_t)_mm_cvtsi128_si32(_mm_shuffle_epi32(x, 1)) << 32;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifdef __AVX__
|
#ifdef __AVX__
|
||||||
_mm256_zeroupper();
|
_mm256_zeroupper();
|
||||||
#elif !(defined(_X86_64_) || defined(__x86_64__) || defined(_M_X64) || \
|
#elif !(defined(_X86_64_) || defined(__x86_64__) || defined(_M_X64) || \
|
||||||
defined(__e2k__))
|
defined(__e2k__))
|
||||||
_mm_empty();
|
_mm_empty();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint64_t *v = (const uint64_t *)data;
|
const uint64_t *v = (const uint64_t *)data;
|
||||||
switch (len) {
|
switch (len) {
|
||||||
default:
|
|
||||||
mixup64(&a, &b, fetch64_le_unaligned(v++), prime_4);
|
default:
|
||||||
/* fall through */
|
mixup64(&a, &b, fetch64_le_unaligned(v++), prime_4);
|
||||||
case 24:
|
/* fall through */
|
||||||
case 23:
|
case 24:
|
||||||
case 22:
|
case 23:
|
||||||
case 21:
|
case 22:
|
||||||
case 20:
|
case 21:
|
||||||
case 19:
|
case 20:
|
||||||
case 18:
|
case 19:
|
||||||
case 17:
|
case 18:
|
||||||
mixup64(&b, &a, fetch64_le_unaligned(v++), prime_3);
|
case 17:
|
||||||
/* fall through */
|
mixup64(&b, &a, fetch64_le_unaligned(v++), prime_3);
|
||||||
case 16:
|
/* fall through */
|
||||||
case 15:
|
case 16:
|
||||||
case 14:
|
case 15:
|
||||||
case 13:
|
case 14:
|
||||||
case 12:
|
case 13:
|
||||||
case 11:
|
case 12:
|
||||||
case 10:
|
case 11:
|
||||||
case 9:
|
case 10:
|
||||||
mixup64(&a, &b, fetch64_le_unaligned(v++), prime_2);
|
case 9:
|
||||||
/* fall through */
|
mixup64(&a, &b, fetch64_le_unaligned(v++), prime_2);
|
||||||
case 8:
|
/* fall through */
|
||||||
case 7:
|
case 8:
|
||||||
case 6:
|
case 7:
|
||||||
case 5:
|
case 6:
|
||||||
case 4:
|
case 5:
|
||||||
case 3:
|
case 4:
|
||||||
case 2:
|
case 3:
|
||||||
case 1:
|
case 2:
|
||||||
mixup64(&b, &a, tail64_le_unaligned(v, len), prime_1);
|
case 1:
|
||||||
/* fall through */
|
mixup64(&b, &a, tail64_le_unaligned(v, len), prime_1);
|
||||||
case 0:
|
/* fall through */
|
||||||
return final64(a, b);
|
case 0:
|
||||||
|
return final64(a, b);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* T1HA0_AESNI_AVAILABLE */
|
#endif /* T1HA0_AESNI_AVAILABLE */
|
||||||
#undef T1HA_IA32AES_NAME
|
#undef T1HA_IA32AES_NAME
|
||||||
|
|
||||||
|
1452
include/t1ha_bits.h
1452
include/t1ha_bits.h
File diff suppressed because it is too large
Load Diff
@ -43,8 +43,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#if defined(_MSC_VER) && _MSC_VER > 1800
|
#if defined(_MSC_VER) && _MSC_VER > 1800
|
||||||
#pragma warning(disable : 4464) /* relative include path contains '..' */
|
#pragma warning(disable : 4464) /* relative include path contains '..' */
|
||||||
#endif /* MSVC */
|
#endif /* MSVC */
|
||||||
#include "t1ha.h"
|
#include "t1ha.h"
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
@ -59,18 +59,19 @@ extern const uint64_t t1ha_refval_2atonce[81];
|
|||||||
extern const uint64_t t1ha_refval_2atonce128[81];
|
extern const uint64_t t1ha_refval_2atonce128[81];
|
||||||
extern const uint64_t t1ha_refval_2stream[81];
|
extern const uint64_t t1ha_refval_2stream[81];
|
||||||
extern const uint64_t t1ha_refval_2stream128[81];
|
extern const uint64_t t1ha_refval_2stream128[81];
|
||||||
#endif /* T1HA2_DISABLED */
|
#endif /* T1HA2_DISABLED */
|
||||||
|
|
||||||
#ifndef T1HA1_DISABLED
|
#ifndef T1HA1_DISABLED
|
||||||
extern const uint64_t t1ha_refval_64le[81];
|
extern const uint64_t t1ha_refval_64le[81];
|
||||||
extern const uint64_t t1ha_refval_64be[81];
|
extern const uint64_t t1ha_refval_64be[81];
|
||||||
#endif /* T1HA1_DISABLED */
|
#endif /* T1HA1_DISABLED */
|
||||||
|
|
||||||
#ifndef T1HA0_DISABLED
|
#ifndef T1HA0_DISABLED
|
||||||
extern const uint64_t t1ha_refval_32le[81];
|
extern const uint64_t t1ha_refval_32le[81];
|
||||||
extern const uint64_t t1ha_refval_32be[81];
|
extern const uint64_t t1ha_refval_32be[81];
|
||||||
#if T1HA0_AESNI_AVAILABLE
|
#if T1HA0_AESNI_AVAILABLE
|
||||||
extern const uint64_t t1ha_refval_ia32aes_a[81];
|
extern const uint64_t t1ha_refval_ia32aes_a[81];
|
||||||
extern const uint64_t t1ha_refval_ia32aes_b[81];
|
extern const uint64_t t1ha_refval_ia32aes_b[81];
|
||||||
#endif /* T1HA0_AESNI_AVAILABLE */
|
#endif /* T1HA0_AESNI_AVAILABLE */
|
||||||
#endif /* T1HA0_DISABLED */
|
#endif /* T1HA0_DISABLED */
|
||||||
|
|
||||||
|
10171
include/xxhash.h
10171
include/xxhash.h
File diff suppressed because it is too large
Load Diff
@ -1967,6 +1967,7 @@ static u8 cmp_fuzz(afl_state_t *afl, u32 key, u8 *orig_buf, u8 *buf, u8 *cbuf,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
@ -2789,6 +2790,7 @@ static u8 rtn_fuzz(afl_state_t *afl, u32 key, u8 *orig_buf, u8 *buf, u8 *cbuf,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
t = taint;
|
t = taint;
|
||||||
|
@ -402,7 +402,9 @@ static void usage(u8 *argv0, int more_help) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _AFL_SPECIAL_PERFORMANCE
|
#ifdef _AFL_SPECIAL_PERFORMANCE
|
||||||
SAYF("Compiled with special performance options for this specific system, it might not work on other platforms!\n");
|
SAYF(
|
||||||
|
"Compiled with special performance options for this specific system, it "
|
||||||
|
"might not work on other platforms!\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SAYF("For additional help please consult %s/README.md :)\n\n", doc_path);
|
SAYF("For additional help please consult %s/README.md :)\n\n", doc_path);
|
||||||
|
@ -3,18 +3,17 @@
|
|||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
#ifdef _HAVE_AVX2
|
#ifdef _HAVE_AVX2
|
||||||
#define T1HA0_AESNI_AVAILABLE 1
|
#define T1HA0_AESNI_AVAILABLE 1
|
||||||
#define T1HA_USE_FAST_ONESHOT_READ 1
|
#define T1HA_USE_FAST_ONESHOT_READ 1
|
||||||
#define T1HA_USE_INDIRECT_FUNCTIONS 1
|
#define T1HA_USE_INDIRECT_FUNCTIONS 1
|
||||||
#define T1HA_IA32AES_NAME XXH3_64bits
|
#define T1HA_IA32AES_NAME XXH3_64bits
|
||||||
#include "t1ha0_ia32aes_b.h"
|
#include "t1ha0_ia32aes_b.h"
|
||||||
#else
|
#else
|
||||||
#define XXH_INLINE_ALL
|
#define XXH_INLINE_ALL
|
||||||
#include "xxhash.h"
|
#include "xxhash.h"
|
||||||
#undef XXH_INLINE_ALL
|
#undef XXH_INLINE_ALL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void rand_set_seed(afl_state_t *afl, s64 init_seed) {
|
void rand_set_seed(afl_state_t *afl, s64 init_seed) {
|
||||||
|
|
||||||
afl->init_seed = init_seed;
|
afl->init_seed = init_seed;
|
||||||
|
@ -13,30 +13,41 @@
|
|||||||
#undef XXH_INLINE_ALL
|
#undef XXH_INLINE_ALL
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
char *data = malloc(4097);
|
|
||||||
|
char *data = malloc(4097);
|
||||||
struct timespec start, end;
|
struct timespec start, end;
|
||||||
long long duration;
|
long long duration;
|
||||||
int i;
|
int i;
|
||||||
uint64_t res;
|
uint64_t res;
|
||||||
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &start);
|
clock_gettime(CLOCK_MONOTONIC, &start);
|
||||||
for (i = 0; i < 100000000; ++i) {
|
for (i = 0; i < 100000000; ++i) {
|
||||||
res = XXH3_64bits(data, 4097);
|
|
||||||
memcpy(data + 16, (char*)&res, 8);
|
res = XXH3_64bits(data, 4097);
|
||||||
|
memcpy(data + 16, (char *)&res, 8);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &end);
|
clock_gettime(CLOCK_MONOTONIC, &end);
|
||||||
duration = (end.tv_sec - start.tv_sec) * 1000000000LL + (end.tv_nsec - start.tv_nsec);
|
duration = (end.tv_sec - start.tv_sec) * 1000000000LL +
|
||||||
|
(end.tv_nsec - start.tv_nsec);
|
||||||
printf("xxh3 duration: %lld ns\n", duration);
|
printf("xxh3 duration: %lld ns\n", duration);
|
||||||
|
|
||||||
memset(data, 0, 4097);
|
memset(data, 0, 4097);
|
||||||
clock_gettime(CLOCK_MONOTONIC, &start);
|
clock_gettime(CLOCK_MONOTONIC, &start);
|
||||||
for (i = 0; i < 100000000; ++i) {
|
for (i = 0; i < 100000000; ++i) {
|
||||||
res = t1ha0_ia32aes(data, 4097);
|
|
||||||
memcpy(data + 16, (char*)&res, 8);
|
res = t1ha0_ia32aes(data, 4097);
|
||||||
|
memcpy(data + 16, (char *)&res, 8);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &end);
|
clock_gettime(CLOCK_MONOTONIC, &end);
|
||||||
duration = (end.tv_sec - start.tv_sec) * 1000000000LL + (end.tv_nsec - start.tv_nsec);
|
duration = (end.tv_sec - start.tv_sec) * 1000000000LL +
|
||||||
|
(end.tv_nsec - start.tv_nsec);
|
||||||
printf("t1ha0_ia32aes duration: %lld ns\n", duration);
|
printf("t1ha0_ia32aes duration: %lld ns\n", duration);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user