MatrixSSL 4.3.0
This commit is contained in:
@@ -58,7 +58,7 @@ CFLAGS_GARBAGE_COLLECTION ?= -ffunction-sections -fdata-sections
|
||||
noinst_LIBRARIES=libcore_s.a libsfzutf_s.a libtestsupp_s.a
|
||||
libcore_s_a_SOURCES=$(SRC_CORE)
|
||||
libcore_s_a_API=core
|
||||
libcore_s_a_CFLAGS=$(CFLAGS_POSITION_INDEPENDENT) $(CFLAGS_GARBAGE_COLLECTION)
|
||||
libcore_s_a_CFLAGS=$(CFLAGS_POSITION_INDEPENDENT) $(CFLAGS_GARBAGE_COLLECTION) -fno-math-errno
|
||||
VPATH+=src
|
||||
|
||||
libsfzutf_s_a_SOURCES=$(addprefix testsupp/src/sfzutf/, \
|
||||
|
||||
@@ -103,6 +103,37 @@
|
||||
# define USE_PS_NETWORKING
|
||||
# endif /* NO_PS_NETWORKING */
|
||||
|
||||
/**
|
||||
Use the psStat statistics measurement for CL/SL.
|
||||
|
||||
psStat is a generic statistics module. It contains features
|
||||
e.g. required for measuring performance.
|
||||
These capabilities can only be used on platforms with support for
|
||||
thread-local storage and pthreads, such as Linux. Currently the support
|
||||
will only be enabled for x86-64 Linux systems.
|
||||
If statistics feature is not in use, the performance effect is minimal,
|
||||
but for optimal performance in production environment, you may use
|
||||
NO_PS_STAT_CL.
|
||||
*/
|
||||
# ifdef __x86_64__
|
||||
# ifndef NO_PS_STAT_CL
|
||||
# define USE_PS_STAT_CL
|
||||
# endif /* NO_PS_STAT_CL */
|
||||
# endif /* __x86_64__ */
|
||||
|
||||
/**
|
||||
Use the psStat statistics measurement for CL/SL by default.
|
||||
|
||||
When psStat support has been compiled in (see above), USE_PS_STAT_CL,
|
||||
it is disabled by default. To enabled statistics framework, set
|
||||
environment variable PS_ENABLE_STATS to any value. Enabled setting below
|
||||
to get statistics measuring without any environment variable. When
|
||||
statistics are on by default, they can still be disabled with
|
||||
environment variable PS_SKIP_STATS. Disabling statistics is recommended
|
||||
to minimize footprint.
|
||||
*/
|
||||
/* # define USE_PS_STAT_CL_BY_DEFAULT */
|
||||
|
||||
#endif /* _h_PS_CORECONFIG */
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
@@ -31,6 +31,186 @@
|
||||
#ifndef INCLUDE_GUARD_PSSTAT_H
|
||||
#define INCLUDE_GUARD_PSSTAT_H
|
||||
|
||||
typedef long long psStatItem_t;
|
||||
typedef long double psStatItemFloat_t;
|
||||
|
||||
/* Macros for printf formatting. */
|
||||
#define PR_PSSTAT "lld"
|
||||
#define PR_PSSTATF "Lf"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
psStatItem_t min;
|
||||
psStatItem_t max;
|
||||
psStatItem_t sum;
|
||||
psStatItemFloat_t sumsq;
|
||||
psStatItem_t count;
|
||||
} psStat_t;
|
||||
|
||||
psStat_t *psStatNew(void);
|
||||
void psStatFree(psStat_t *stat);
|
||||
psStat_t *psStatDup(psStat_t *stat);
|
||||
void psStatInit(psStat_t *stat);
|
||||
void psStatUpdate(psStat_t *stat, psStatItem_t new);
|
||||
void psStatErase(psStat_t *stat);
|
||||
int psStatIsClear(psStat_t * const stat);
|
||||
psStatItem_t psStatGetCount(psStat_t * const stat);
|
||||
psStatItem_t psStatGetSum(psStat_t * const stat);
|
||||
psStatItemFloat_t psStatGetAverage(psStat_t * const stat);
|
||||
psStatItem_t psStatGetMin(psStat_t * const stat);
|
||||
psStatItem_t psStatGetMax(psStat_t * const stat);
|
||||
psStatItemFloat_t psStatGetVariance(psStat_t * const stat);
|
||||
psStatItemFloat_t psStatGetStdDeviation(psStat_t * const stat);
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PS_STAT_ID_UNDEFINED,
|
||||
PS_STAT_ID_CRYPT_AUTH_INIT,
|
||||
PS_STAT_ID_CIPHER_CONTINUE,
|
||||
PS_STAT_ID_CIPHER_CONTINUE_CBC_DEC,
|
||||
PS_STAT_ID_CIPHER_CONTINUE_CBC_ENC,
|
||||
PS_STAT_ID_CIPHER_FINISH,
|
||||
PS_STAT_ID_CIPHER_INIT,
|
||||
PS_STAT_ID_CIPHER_INIT_CBC_DEC,
|
||||
PS_STAT_ID_CIPHER_INIT_CBC_ENC,
|
||||
PS_STAT_ID_CRYPT_AUTH_CONTINUE,
|
||||
PS_STAT_ID_CRYPT_GCM_AAD_CONTINUE,
|
||||
PS_STAT_ID_CRYPT_GCM_AAD_FINISH,
|
||||
PS_STAT_ID_DECRYPT_AUTH_FINISH,
|
||||
PS_STAT_ID_DERIVE_TLS_PRF,
|
||||
PS_STAT_ID_ENCRYPT_AUTH_FINISH,
|
||||
PS_STAT_ID_ENCRYPT_AUTH_PACKET_FINISH,
|
||||
PS_STAT_ID_MAC_GENERATE_CONTINUE,
|
||||
PS_STAT_ID_MAC_GENERATE_FINISH,
|
||||
PS_STAT_ID_MAC_GENERATE_INIT,
|
||||
PS_STAT_ID_ASSET_FREE_LOCAL,
|
||||
PS_STAT_ID_ASSET_FREE,
|
||||
PS_STAT_ID_ASSET_STORE_STATUS,
|
||||
PS_STAT_ID_LIB_INIT,
|
||||
PS_STAT_ID_LIB_UNINIT,
|
||||
PS_STAT_ID_ROOT_KEY_ALLOCATE_AND_LOAD_VALUE,
|
||||
PS_STAT_ID_RBG_REQUEST_SECURITY_STRENGTH,
|
||||
PS_STAT_ID_RBG_USE_NONBLOCKING_ENTROPY_SOURCE,
|
||||
PS_STAT_ID_RBG_INSTALL_ENTROPY_SOURCE,
|
||||
PS_STAT_ID_LIB_ENTER_USER_ROLE,
|
||||
PS_STAT_ID_LIB_SELF_TEST,
|
||||
PS_STAT_ID_ASSET_ALLOCATE_BASIC,
|
||||
PS_STAT_ID_ASSET_ALLOCATE,
|
||||
PS_STAT_ID_ASSET_ALLOCATE_AND_ASSOCIATE_KEY_EXTRA,
|
||||
PS_STAT_ID_ASSET_LOAD_VALUE,
|
||||
PS_STAT_ID_ASSET_LOAD_MULTIPART,
|
||||
PS_STAT_ID_ASSET_LOAD_MULTIPART_CONVERT_BIG_INT,
|
||||
PS_STAT_ID_ASSET_LOAD_RANDOM,
|
||||
PS_STAT_ID_RBG_GENERATE_RANDOM,
|
||||
PS_STAT_ID_RBG_RESEED,
|
||||
PS_STAT_ID_ASSET_GENERATE_KEY_PAIR,
|
||||
PS_STAT_ID_ASSET_SHOW,
|
||||
PS_STAT_ID_ASSET_CHECK,
|
||||
PS_STAT_ID_MAC_VERIFY_INIT,
|
||||
PS_STAT_ID_MAC_VERIFY_CONTINUE,
|
||||
PS_STAT_ID_MAC_VERIFY_FINISH,
|
||||
PS_STAT_ID_HASH_INIT,
|
||||
PS_STAT_ID_HASH_CONTINUE,
|
||||
PS_STAT_ID_HASH_FINISH,
|
||||
PS_STAT_ID_HASH_SINGLE,
|
||||
PS_STAT_ID_RUNTIME_CONFIG_GET_PROPERTY,
|
||||
PS_STAT_ID_RUNTIME_CONFIG_SET_PROPERTY,
|
||||
PS_STAT_ID_ASSET_PEEK,
|
||||
PS_STAT_ID_ASSET_POKE,
|
||||
PS_STAT_ID_TRUSTED_KDK_DERIVE,
|
||||
PS_STAT_ID_TRUSTED_KEKDK_DERIVE,
|
||||
PS_STAT_ID_TRUSTED_KEY_DERIVE,
|
||||
PS_STAT_ID_KEY_DERIVE_KDK,
|
||||
PS_STAT_ID_KEY_DERIVE_PBKDF2,
|
||||
PS_STAT_ID_ASSETS_WRAP_RSA_OAEP,
|
||||
PS_STAT_ID_ASSETS_UNWRAP_RSA_OAEP,
|
||||
PS_STAT_ID_CRYPT_KW,
|
||||
PS_STAT_ID_ASSETS_WRAP_AES,
|
||||
PS_STAT_ID_ASSETS_WRAP_AES_38F,
|
||||
PS_STAT_ID_ASSETS_UNWRAP_AES,
|
||||
PS_STAT_ID_ASSETS_UNWRAP_AES_38F,
|
||||
PS_STAT_ID_ASSETS_WRAP_TRUSTED,
|
||||
PS_STAT_ID_ASSETS_UNWRAP_TRUSTED,
|
||||
PS_STAT_ID_PKCS1_RSAEP,
|
||||
PS_STAT_ID_PKCS1_RSADP,
|
||||
PS_STAT_ID_PKCS1_RSASP1,
|
||||
PS_STAT_ID_PKCS1_RSAVP1,
|
||||
PS_STAT_ID_ASSETS_WRAP_RSA_KEM,
|
||||
PS_STAT_ID_ASSETS_UNWRAP_RSA_KEM,
|
||||
PS_STAT_ID_ASSETS_WRAP_PKCS1V15,
|
||||
PS_STAT_ID_ASSETS_UNWRAP_PKCS1V15,
|
||||
PS_STAT_ID_HASH_SIGN_FIPS186_132,
|
||||
PS_STAT_ID_HASH_SIGN_FIPS186,
|
||||
PS_STAT_ID_HASH_SIGN_PKCS1,
|
||||
PS_STAT_ID_HASH_VERIFY_FIPS186_132,
|
||||
PS_STAT_ID_HASH_VERIFY_FIPS186,
|
||||
PS_STAT_ID_HASH_VERIFY_RECOVER_PKCS1,
|
||||
PS_STAT_ID_HASH_VERIFY_PKCS1,
|
||||
PS_STAT_ID_HASH_SIGN_PKCS1_PSS,
|
||||
PS_STAT_ID_HASH_VERIFY_PKCS1_PSS,
|
||||
PS_STAT_ID_DERIVE_DH,
|
||||
PS_STAT_ID_ENCRYPT_AUTH_INIT_RANDOM,
|
||||
PS_STAT_ID_ENCRYPT_AUTH_INIT_DETERMINISTIC,
|
||||
PS_STAT_ID_ASSET_COPY_VALUE,
|
||||
PS_STAT_ID_ASSET_ALLOCATE_SAME_POLICY,
|
||||
PS_STAT_ID_LOAD_FINISHED_HASH_STATE_ALGO,
|
||||
PS_STAT_ID_LOAD_FINISHED_HASH_STATE,
|
||||
PS_STAT_ID_HASH_FINISH_KEEP,
|
||||
PS_STAT_ID_IKE_PRF_EXTRACT,
|
||||
PS_STAT_ID_IKEV2_EXTRACT_SKEYSEED,
|
||||
PS_STAT_ID_IKEV1_EXTRACT_SKEYID_DSA,
|
||||
PS_STAT_ID_IKEV1_EXTRACT_SKEYID_PSK,
|
||||
PS_STAT_ID_IKEV1_EXTRACT_SKEYID_PKE,
|
||||
PS_STAT_ID_IKEV2_DERIVE_DKM,
|
||||
PS_STAT_ID_IKEV2_EXTRACT_SKEYSEED_REKEY,
|
||||
PS_STAT_ID_IKEV1_DERIVE_KEYING_MATERIAL,
|
||||
PS_STAT_ID_RBG_TEST_VECTOR,
|
||||
PS_STAT_ID_ASSET_ALLOCATE_EX,
|
||||
PS_STAT_ID_ASSET_REBIND,
|
||||
PS_STAT_ID_ASSET_ALLOCATE_AND_ASSOCIATE_KEY_EXTRA_EX,
|
||||
PS_STAT_ID_DH_DERIVE,
|
||||
PS_STAT_ID_DH_KEYGEN,
|
||||
PS_STAT_ID_NUM
|
||||
} psStatId_t;
|
||||
|
||||
const char *resolve_ps_stat_id(psStatId_t id);
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PS_STAT_EVENT_NORMAL_LOCK,
|
||||
PS_STAT_EVENT_NORMAL_UNLOCK,
|
||||
PS_STAT_EVENT_SKIP_LOCK,
|
||||
PS_STAT_EVENT_SKIP_UNLOCK,
|
||||
PS_STAT_EVENT_ERROR_CODE,
|
||||
PS_STAT_EVENT_TEMPORARIES_ACCESS,
|
||||
PS_STAT_EVENT_NUM
|
||||
} psStatEvent_t;
|
||||
|
||||
/* Per function statistics. */
|
||||
typedef struct
|
||||
{
|
||||
psStat_t time;
|
||||
psStat_t size;
|
||||
psStat_t time_per_size;
|
||||
psStat_t wait_time;
|
||||
} psStatTimeSizeItem_t;
|
||||
|
||||
typedef struct psStatTimeSize
|
||||
{
|
||||
psStatTimeSizeItem_t stsi[(int)PS_STAT_ID_NUM];
|
||||
psStatItem_t events[(int)PS_STAT_ID_NUM][(int)PS_STAT_EVENT_NUM];
|
||||
struct psStatTimeSize *next;
|
||||
} psStatTimeSize_t;
|
||||
|
||||
#ifdef USE_PS_STAT_CL
|
||||
/* Only provide psGetThreadSts and depent functions if USE_PS_STAT_CL
|
||||
is set. */
|
||||
psStatTimeSize_t *psGetThreadSts(void);
|
||||
void psGetThreadStsUpdate(psStatId_t id, psStatItem_t time, psStatItem_t size);
|
||||
void psGetThreadStsUpdateWait(psStatId_t id, psStatItem_t wait_time);
|
||||
void psGetThreadStsUpdateEvent(psStatId_t id, psStatEvent_t e);
|
||||
#endif /* USE_PS_STAT_CL */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int filled;
|
||||
|
||||
@@ -233,7 +233,7 @@ void *psDynBufSubFinish(psDynBuf_t *sub);
|
||||
# define psDynBufAppendStrf(ps_dyn_buf_p, ...) \
|
||||
do { \
|
||||
char tmp; \
|
||||
size_t len = 1 + Snprintf(&tmp, 1, __VA_ARGS__); \
|
||||
size_t len = 1 + Snprintf(&tmp, 0, __VA_ARGS__); \
|
||||
char *target = psDynBufAppendSize((ps_dyn_buf_p), len); \
|
||||
if (target) { \
|
||||
Snprintf(target, len, __VA_ARGS__); \
|
||||
|
||||
@@ -8,6 +8,14 @@
|
||||
# Allow building inclusion paths relative to location of common.mk file.
|
||||
#COMMON_MK_PATH:=$(dir $(lastword $(MAKEFILE_LIST)))
|
||||
|
||||
# clang on MACOS does not support -print-multiarch
|
||||
ifeq ($(shell uname),Darwin)
|
||||
PRINT_MULTIARCH =
|
||||
else
|
||||
PRINT_MULTIARCH = -print-multiarch
|
||||
endif
|
||||
|
||||
|
||||
# Find core library.
|
||||
CORE_PATH:=$(patsubst %/,%/..,$(dir $(lastword $(MAKEFILE_LIST))))
|
||||
include $(CORE_PATH)/Makefile.inc
|
||||
@@ -68,6 +76,24 @@ endif
|
||||
# Execute commands in environment with default locale.
|
||||
CLEAN_ENV=LC_ALL=POSIX
|
||||
|
||||
ifdef USE_FUZZ
|
||||
# Use https://github.com/google/honggfuzz
|
||||
CC=hfuzz-clang
|
||||
CXX="$CC"++
|
||||
# Use address sanitizer, but disable leak checker as it does not work well
|
||||
# (HINT: LeakSanitizer does not work under ptrace (strace, gdb, etc))
|
||||
# Also fuzzer does not have a LLVMFuzzerDeInitialize
|
||||
# api to clean up so there are leaks.
|
||||
HFUZZ_CC_ASAN=1
|
||||
ASAN_OPTIONS="detect_leaks=0"
|
||||
export HFUZZ_CC_ASAN ASAN_OPTIONS
|
||||
MATRIX_DEBUG:=1
|
||||
# -mssse3 added here as temporary hack to get chacha compiling
|
||||
CFLAGS+=-DUSE_FUZZ -mssse3
|
||||
# clang does not support -print-multiarch
|
||||
CCARCH:=$(shell $(CLEAN_ENV) $(CC) -dumpmachine)
|
||||
endif
|
||||
|
||||
## Based on the value of CC, determine the target, eg.
|
||||
# x86_64-redhat-linux
|
||||
# i686-linux-gnu
|
||||
@@ -81,7 +107,7 @@ CLEAN_ENV=LC_ALL=POSIX
|
||||
# i386-redhat-linux
|
||||
# x86_64-redhat-linux
|
||||
ifeq '$(CCARCH)' ''
|
||||
CCARCH:=$(shell $(CLEAN_ENV) $(CC) $(CFLAGS_ARCHITECTURE_VARIANT) $(FLAGS_ARCHITECTURE_VARIANT) -print-multiarch)
|
||||
CCARCH:=$(shell $(CLEAN_ENV) $(CC) $(CFLAGS_ARCHITECTURE_VARIANT) $(FLAGS_ARCHITECTURE_VARIANT) $(PRINT_MULTIARCH))
|
||||
ifeq '$(CCARCH)' ''
|
||||
CCARCH:=$(shell $(CLEAN_ENV) $(CC) -v 2>&1 | sed -n '/Target: / s/// p')
|
||||
ifeq '$(CCARCH)' ''
|
||||
@@ -90,7 +116,7 @@ ifeq '$(CCARCH)' ''
|
||||
CCARCH:=$(shell $(CLEAN_ENV) $(CC) -dumpmachine)
|
||||
ifeq '$(CCARCH)' ''
|
||||
$(error Unable to determine compiler architecture.
|
||||
$(CC) $(CFLAGS_ARCHITECTURE_VARIANT) $(FLAGS_ARCHITECTURE_VARIANT) -print-multiarch or $(CC) -v or $(CC) -dumpmachine does not work. Please, provide CCARCH manually via an environment variable.)
|
||||
$(CC) $(CFLAGS_ARCHITECTURE_VARIANT) $(FLAGS_ARCHITECTURE_VARIANT) $(PRINT_MULTIARCH) or $(CC) -v or $(CC) -dumpmachine does not work. Please, provide CCARCH manually via an environment variable.)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
@@ -421,7 +447,6 @@ LIBCORE_S_A=$(CORE_PATH)/libcore_s$(A)
|
||||
LIBCRYPT_S_A=$(MATRIXSSL_ROOT)/crypto/libcrypt_s$(A)
|
||||
LIBCMS_S_A=$(MATRIXSSL_ROOT)/crypto/cms/libcms_s$(A)
|
||||
LIBSSL_S_A=$(MATRIXSSL_ROOT)/matrixssl/libssl_s$(A)
|
||||
LIBROT_S_A=$(MATRIXSSL_ROOT)/crypto-rot/rot/lib/libdriver_val_up$(A)
|
||||
|
||||
# Optional external libraries
|
||||
LIBZ=-lz
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
# Get or detect compilation architecture.
|
||||
|
||||
# clang on MACOS does not support -print-multiarch
|
||||
ifeq ($(shell uname),Darwin)
|
||||
PRINT_MULTIARCH =
|
||||
else
|
||||
PRINT_MULTIARCH = -print-multiarch
|
||||
endif
|
||||
|
||||
# Detect target architecture
|
||||
ifeq '$(CCARCH)' ''
|
||||
CCARCH:=$(shell $(CLEAN_ENV) $(CC) $(CFLAGS_ARCHITECTURE_VARIANT) $(FLAGS_ARCHITECTURE_VARIANT) -print-multiarch)
|
||||
CCARCH:=$(shell $(CLEAN_ENV) $(CC) $(CFLAGS_ARCHITECTURE_VARIANT) $(FLAGS_ARCHITECTURE_VARIANT) $(PRINT_MULTIARCH))
|
||||
ifeq '$(CCARCH)' ''
|
||||
CCARCH:=$(shell $(CLEAN_ENV) $(CC) -v 2>&1 | sed -n '/Target: / s/// p')
|
||||
ifeq '$(CCARCH)' ''
|
||||
@@ -14,7 +21,7 @@ ARM_ARCH ?= armv7-a
|
||||
|
||||
ifeq '$(CCARCH)' ''
|
||||
$(error Unable to determine compiler architecture.)
|
||||
$(CC) $(CFLAGS_ARCHITECTURE_VARIANT) $(FLAGS_ARCHITECTURE_VARIANT) -print-multiarch or $(CC) -v or $(CC) -dumpmachine does not work. Please, provide CCARCH manually via an environment variable.)
|
||||
$(CC) $(CFLAGS_ARCHITECTURE_VARIANT) $(FLAGS_ARCHITECTURE_VARIANT) $(PRINT_MULTIARCH) or $(CC) -v or $(CC) -dumpmachine does not work. Please, provide CCARCH manually via an environment variable.)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -89,13 +89,16 @@ endif
|
||||
include $(CORE_DIR)/Makefile.inc
|
||||
|
||||
# Common dependencies
|
||||
DL=-ldl
|
||||
DL=-ldl -lm
|
||||
ifeq '$(origin PTHREAD)' 'undefined'
|
||||
PTHREAD=-lpthread
|
||||
endif
|
||||
|
||||
LM=-lm
|
||||
# API spec for core (only)
|
||||
core_API_CFLAGS:=$(CFLAGS_CORE_INCLUDE)
|
||||
core_API_CXXFLAGS:=$(CFLAGS_CORE_INCLUDE)
|
||||
core_API_LIBADD=$(CORE_DIR)/libcore_s.a $(PTHREAD)
|
||||
core_API_LIBADD=$(CORE_DIR)/libcore_s.a $(PTHREAD) $(LM)
|
||||
|
||||
# API spec for software using matrixssl API and/or psCrypto API.
|
||||
MATRIXSSL_PATH=$(CORE_PATH)/../matrixssl/matrixssl
|
||||
|
||||
@@ -168,8 +168,8 @@ int32 psGetTime(psTime_t *t, void *userPtr)
|
||||
{
|
||||
t = <
|
||||
}
|
||||
*t.psTimeInternal = mach_absolute_time();
|
||||
return (int32) ((*t.psTimeInternal * hiresFreq.numer) /
|
||||
t->psTimeInternal = mach_absolute_time();
|
||||
return (int32) ((t->psTimeInternal * hiresFreq.numer) /
|
||||
(hiresFreq.denom * 1000000000L));
|
||||
}
|
||||
|
||||
|
||||
@@ -210,7 +210,9 @@
|
||||
# if defined(WIN32)
|
||||
# include "osdep_windows.h"
|
||||
# define strcasecmp LstrcmpiA
|
||||
# define snprintf _snprintf
|
||||
# if defined(_MSC_VER) && _MSC_VER < 1900 /* MSVC2015 */
|
||||
# define snprintf _snprintf
|
||||
# endif
|
||||
# endif
|
||||
# include "osdep_stdint.h"
|
||||
typedef int32_t int32;
|
||||
|
||||
@@ -38,15 +38,20 @@
|
||||
#ifndef OSDEP_LIBC_VERSION_H_DEFINED
|
||||
#define OSDEP_LIBC_VERSION_H_DEFINED 1
|
||||
|
||||
/* Get (build time) libc version on Linux from GLIBC headers.
|
||||
This header is no-op on other systems.
|
||||
Android systems are autodetected, they do not use GLIBC.
|
||||
There is -DPS_NO_GLIBC for other linux kernel based systems not using
|
||||
GLIBC. */
|
||||
|
||||
#ifdef __unix__
|
||||
#ifdef __linux__
|
||||
#ifndef __ANDROID__
|
||||
#ifndef PS_NO_GLIBC
|
||||
#include <gnu/libc-version.h>
|
||||
|
||||
/* You may redefine the wrappers below in case your target system does not
|
||||
provide all of the functions below. The functions are from C standard
|
||||
ISO C99 and other common standards.
|
||||
The defines may be overrided from command line. */
|
||||
|
||||
|
||||
|
||||
#endif /* PS_NO_GLIBC */
|
||||
#endif /* __ANDROID__ */
|
||||
#endif /* __linux__ */
|
||||
#endif /* __unix__ */
|
||||
|
||||
#endif /* OSDEP_LIBC_VERSION_H_DEFINED */
|
||||
|
||||
66
core/osdep/include/osdep_sys_random.h
Normal file
66
core/osdep/include/osdep_sys_random.h
Normal file
@@ -0,0 +1,66 @@
|
||||
/** osdep_sys_random.h
|
||||
*
|
||||
* Wrapper for system header sys_random.h
|
||||
*/
|
||||
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2018 INSIDE Secure Oy. All Rights Reserved.
|
||||
*
|
||||
* This confidential and proprietary software may be used only as authorized
|
||||
* by a licensing agreement from INSIDE Secure.
|
||||
*
|
||||
* The entire notice above must be reproduced on all authorized copies that
|
||||
* may only be made to the extent permitted by a licensing agreement from
|
||||
* INSIDE Secure.
|
||||
*****************************************************************************/
|
||||
|
||||
/* This file just includes system header sys_random.h.
|
||||
In case your system does not include all functions
|
||||
malloc/free/calloc/realloc/abort/getenv via that file or
|
||||
does not have implementation of sys_random.h, please
|
||||
customize this place holder header.
|
||||
*/
|
||||
|
||||
#ifndef OSDEP_SYS_RANDOM_H_DEFINED
|
||||
#define OSDEP_SYS_RANDOM_H_DEFINED 1
|
||||
|
||||
#ifdef OSDEP_HAVE_GLIBC_GETRANDOM
|
||||
/* Obtain getrandom() if available.
|
||||
It's available in Glibc starting with 2.25 (2017). */
|
||||
#include <sys/random.h>
|
||||
|
||||
#define Getrandom getrandom
|
||||
#elif defined(__linux__) && !defined(OSDEP_NO_LINUX_GETRANDOM)
|
||||
|
||||
/* Emulate getrandom() function using the system call.
|
||||
The system call is available starting with Linux 3.17 kernel. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <unistd.h>
|
||||
#ifdef SYS_getrandom
|
||||
#include <linux/random.h>
|
||||
#endif /* SYS_getrandom */
|
||||
|
||||
/* Provide prototype for syscall function. */
|
||||
long syscall(long number, ...);
|
||||
|
||||
#ifdef __GNUC__
|
||||
/* Request always inlining for this function. */
|
||||
static inline
|
||||
ssize_t getrandom_inline(void *buf, size_t buflen, unsigned int flags)
|
||||
__attribute__((__always_inline__));
|
||||
#endif
|
||||
|
||||
#ifdef SYS_getrandom
|
||||
static inline
|
||||
ssize_t getrandom_inline(void *buf, size_t buflen, unsigned int flags)
|
||||
{
|
||||
return syscall(__NR_getrandom, buf, buflen, flags);
|
||||
}
|
||||
#define Getrandom getrandom_inline
|
||||
#endif /* SYS_getrandom */
|
||||
|
||||
#endif /* OSDEP_HAVE_GLIBC_GETRANDOM */
|
||||
|
||||
#endif /* OSDEP_SYS_RANDOM_H_DEFINED */
|
||||
@@ -38,7 +38,7 @@
|
||||
#ifndef OSDEP_UNISTD_H_DEFINED
|
||||
#define OSDEP_UNISTD_H_DEFINED 1
|
||||
|
||||
#if defined _POSIX_C_SOURCE || defined __unix__ || defined __linux__ || defined __android__
|
||||
#if defined _POSIX_C_SOURCE || defined __unix__ || defined __linux__ || defined __android_ || defined __APPLE__
|
||||
#include <unistd.h>
|
||||
|
||||
/* You may redefine the wrappers below in case your target system does not
|
||||
|
||||
@@ -2,10 +2,8 @@
|
||||
#if defined USE_SL_CHACHA20_POLY1305_IETF || defined USE_SL_SODIUM
|
||||
# include "osdep_stddef.h"
|
||||
# include "osdep_stdint.h"
|
||||
# ifdef HAVE_ANDROID_GETCPUFEATURES
|
||||
# include "osdep_cpu-features.h"
|
||||
# endif
|
||||
|
||||
# include "osdep_stdlib.h"
|
||||
# include "osdep_stdbool.h"
|
||||
# include "private/common.h"
|
||||
# include "runtime.h"
|
||||
# include "pscompilerdep.h"
|
||||
@@ -44,27 +42,34 @@ static CPUFeatures _cpu_features;
|
||||
static int
|
||||
SLSodium_runtime_arm_cpu_features(CPUFeatures * const cpu_features)
|
||||
{
|
||||
# ifndef __arm__
|
||||
# if !defined(__arm__) && !defined(__aarch64__) && !defined(__aarch32__)
|
||||
cpu_features->has_neon = 0;
|
||||
return -1;
|
||||
# else
|
||||
#else /* some ARM platform. */
|
||||
# define NO_INTEL /* This architecture is definitely not x86/x86-64.
|
||||
No need to probe for Intel CPU features. */
|
||||
# ifdef __APPLE__
|
||||
# ifdef __ARM_NEON__
|
||||
cpu_features->has_neon = 1;
|
||||
# else
|
||||
cpu_features->has_neon = 0;
|
||||
# endif
|
||||
# elif defined(HAVE_ANDROID_GETCPUFEATURES) && \
|
||||
defined(ANDROID_CPU_ARM_FEATURE_NEON)
|
||||
cpu_features->has_neon =
|
||||
(android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0x0;
|
||||
# else
|
||||
cpu_features->has_neon = 0;
|
||||
# endif
|
||||
/* Customization for INSIDE Secure FIPS Toolkit: */
|
||||
/* Use sl_cpu.c for ARM feature detection, instead of
|
||||
the default sodium code. */
|
||||
|
||||
extern bool SL_ArmDetectionDone;
|
||||
extern bool SL_hasNEON;
|
||||
void SL_DetectArmFeatures(void);
|
||||
|
||||
if (!SL_ArmDetectionDone)
|
||||
{
|
||||
if (!getenv("SAFEZONE_DISABLE_HW"))
|
||||
{
|
||||
SL_DetectArmFeatures();
|
||||
}
|
||||
else
|
||||
{
|
||||
SL_ArmDetectionDone = 1;
|
||||
}
|
||||
}
|
||||
cpu_features->has_neon = SL_hasNEON;
|
||||
return 0;
|
||||
# endif
|
||||
# endif /* ARM variant (including ARMv7 or ARMv8). */
|
||||
}
|
||||
|
||||
#ifndef NO_INTEL
|
||||
|
||||
@@ -30,8 +30,14 @@
|
||||
|
||||
#include "osdep.h"
|
||||
#include "osdep_stdio.h"
|
||||
#include "osdep_stdlib.h"
|
||||
#include "osdep_string.h"
|
||||
#include "osdep_math.h"
|
||||
#include "psStat.h"
|
||||
#include "psUtil.h"
|
||||
#ifdef USE_PS_STAT_CL
|
||||
#include "pthread.h"
|
||||
#endif /* USE_PS_STAT_CL */
|
||||
|
||||
psStatCompByteSeqResult_t psStatCompByteSeq(const unsigned char *a,
|
||||
const char *aName,
|
||||
@@ -321,4 +327,628 @@ psRes_t psStatTest(void)
|
||||
}
|
||||
# endif /* PS_STAT_TEST */
|
||||
|
||||
|
||||
void psStatInit(psStat_t *stat)
|
||||
{
|
||||
if (stat)
|
||||
{
|
||||
Memset(stat, 0, sizeof(*stat));
|
||||
stat->sumsq = (psStatItemFloat_t)0.0;
|
||||
}
|
||||
}
|
||||
|
||||
void psStatUpdate(psStat_t *stat, psStatItem_t new)
|
||||
{
|
||||
psStatItemFloat_t newf = (psStatItemFloat_t) new;
|
||||
|
||||
if (stat)
|
||||
{
|
||||
if (stat->count == 0)
|
||||
{
|
||||
stat->min = new;
|
||||
stat->max = new;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (new < stat->min)
|
||||
{
|
||||
stat->min = new;
|
||||
}
|
||||
if (new > stat->max)
|
||||
{
|
||||
stat->max = new;
|
||||
}
|
||||
}
|
||||
stat->sum += new;
|
||||
stat->count += 1;
|
||||
stat->sumsq += newf * newf;
|
||||
}
|
||||
}
|
||||
|
||||
void psStatErase(psStat_t *stat)
|
||||
{
|
||||
psStatInit(stat); /* Initialization also erases. */
|
||||
}
|
||||
|
||||
psStatItem_t psStatGetCount(psStat_t * const stat)
|
||||
{
|
||||
return stat ? stat->count : 0;
|
||||
}
|
||||
|
||||
int psStatIsClear(psStat_t * const stat)
|
||||
{
|
||||
return psStatGetCount(stat) == 0;
|
||||
}
|
||||
|
||||
psStatItem_t psStatGetSum(psStat_t * const stat)
|
||||
{
|
||||
return stat ? stat->sum : 0;
|
||||
}
|
||||
|
||||
psStatItem_t psStatGetMin(psStat_t * const stat)
|
||||
{
|
||||
return stat ? stat->min : 0;
|
||||
}
|
||||
|
||||
psStatItem_t psStatGetMax(psStat_t * const stat)
|
||||
{
|
||||
return stat ? stat->max : 0;
|
||||
}
|
||||
|
||||
static psStatItemFloat_t psStatGetNan(void)
|
||||
{
|
||||
#ifdef NAN
|
||||
return (psStatItemFloat_t) NAN;
|
||||
#else
|
||||
return (psStatItemFloat_t) (0.0 / 0.0);
|
||||
#endif
|
||||
}
|
||||
|
||||
psStatItemFloat_t psStatGetAverage(psStat_t * const stat)
|
||||
{
|
||||
psStatItem_t div = psStatGetCount(stat);
|
||||
psStatItemFloat_t sumf = (psStatItemFloat_t) psStatGetSum(stat);
|
||||
|
||||
return div > 0 ? sumf / div : psStatGetNan();
|
||||
}
|
||||
|
||||
psStatItemFloat_t psStatGetVariance(psStat_t * const stat)
|
||||
{
|
||||
psStatItem_t div = psStatGetCount(stat);
|
||||
|
||||
if (div > 0)
|
||||
{
|
||||
psStatItemFloat_t sumsqf;
|
||||
|
||||
sumsqf = (psStatItemFloat_t) psStatGetSum(stat);
|
||||
sumsqf = sumsqf * sumsqf;
|
||||
|
||||
return (stat->sumsq - (sumsqf / div)) / div;
|
||||
}
|
||||
return psStatGetNan();
|
||||
}
|
||||
|
||||
psStatItemFloat_t psStatGetStdDeviation(psStat_t * const stat)
|
||||
{
|
||||
long double __builtin_sqrtl(long double x);
|
||||
psStatItemFloat_t r = psStatGetVariance(stat);
|
||||
|
||||
return __builtin_sqrtl(r); /* Note: Use built-in function to avoid need for -lm. On non-x86 platforms use sqrtl() instead and add -lm. */
|
||||
}
|
||||
|
||||
psStat_t *psStatNew(void)
|
||||
{
|
||||
psStat_t *stat = Malloc(sizeof(psStat_t));
|
||||
|
||||
psStatInit(stat);
|
||||
return stat;
|
||||
}
|
||||
|
||||
void psStatFree(psStat_t *stat)
|
||||
{
|
||||
psStatErase(stat);
|
||||
Free(stat);
|
||||
}
|
||||
|
||||
psStat_t *psStatDup(psStat_t *stat)
|
||||
{
|
||||
psStat_t *newStat = NULL;
|
||||
|
||||
if (stat)
|
||||
{
|
||||
newStat = psStatNew();
|
||||
|
||||
if (newStat)
|
||||
{
|
||||
Memcpy(newStat, stat, sizeof(psStat_t));
|
||||
}
|
||||
}
|
||||
|
||||
return newStat;
|
||||
}
|
||||
|
||||
#ifdef USE_PS_STAT_CL
|
||||
/* Only provide psGetThreadSts and depent functions if USE_PS_STAT_CL
|
||||
is set. */
|
||||
static pthread_mutex_t stat_list_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
static psStatTimeSize_t *stat_list = NULL;
|
||||
static __thread psStatTimeSize_t *thread_sts = NULL;
|
||||
|
||||
psStatTimeSize_t *psGetThreadSts(void)
|
||||
{
|
||||
psStatTimeSize_t *sts;
|
||||
int count = 0;
|
||||
|
||||
sts = thread_sts;
|
||||
if (sts == NULL)
|
||||
{
|
||||
sts = malloc(sizeof(psStatTimeSize_t));
|
||||
|
||||
if (sts)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = 0; i < (int) PS_STAT_ID_NUM; i++)
|
||||
{
|
||||
psStatInit(&sts->stsi[i].time);
|
||||
psStatInit(&sts->stsi[i].size);
|
||||
psStatInit(&sts->stsi[i].time_per_size);
|
||||
}
|
||||
sts->next = NULL;
|
||||
|
||||
/* Add statistics to the global list. */
|
||||
pthread_mutex_lock(&stat_list_mutex);
|
||||
thread_sts = sts;
|
||||
if (stat_list == NULL)
|
||||
{
|
||||
stat_list = thread_sts;
|
||||
}
|
||||
else
|
||||
{
|
||||
psStatTimeSize_t *next_ptr = NULL;
|
||||
|
||||
next_ptr = stat_list;
|
||||
while (next_ptr->next)
|
||||
{
|
||||
count++;
|
||||
next_ptr = next_ptr->next;
|
||||
}
|
||||
next_ptr->next = sts;
|
||||
}
|
||||
pthread_mutex_unlock(&stat_list_mutex);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "Memory allocation error: statistics\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
return sts;
|
||||
}
|
||||
|
||||
void psGetThreadStsUpdate(psStatId_t id,
|
||||
psStatItem_t time,
|
||||
psStatItem_t size)
|
||||
{
|
||||
psStatTimeSize_t *sts = psGetThreadSts();
|
||||
|
||||
if (sts)
|
||||
{
|
||||
psStatTimeSizeItem_t *stsi = &sts->stsi[(int) id];
|
||||
|
||||
psStatUpdate(&stsi->time, time);
|
||||
if (size > 0)
|
||||
{
|
||||
psStatItem_t time_per_size = time / size;
|
||||
|
||||
psStatUpdate(&stsi->size, size);
|
||||
psStatUpdate(&stsi->time_per_size, time_per_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void psGetThreadStsUpdateWait(psStatId_t id, psStatItem_t wait_time)
|
||||
{
|
||||
psStatTimeSize_t *sts = psGetThreadSts();
|
||||
|
||||
if (sts)
|
||||
{
|
||||
psStatTimeSizeItem_t *stsi = &sts->stsi[(int) id];
|
||||
|
||||
psStatUpdate(&stsi->wait_time, wait_time);
|
||||
}
|
||||
}
|
||||
|
||||
void psGetThreadStsUpdateEvent(psStatId_t id, psStatEvent_t e)
|
||||
{
|
||||
psStatTimeSize_t *sts = psGetThreadSts();
|
||||
|
||||
if (sts)
|
||||
{
|
||||
sts->events[id][e] ++;
|
||||
}
|
||||
}
|
||||
#endif /* USE_PS_STAT_CL */
|
||||
|
||||
#include "osdep_math.h"
|
||||
/* Print number that can be nan.
|
||||
If number is nan, always produce "NaN" as output. */
|
||||
static char *printoptnan(char *buf, psStatItemFloat_t val)
|
||||
{
|
||||
if (val == val)
|
||||
{
|
||||
/* Number. */
|
||||
sprintf(buf, "%.2"PR_PSSTATF, val);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Not a number. */
|
||||
memcpy(buf, "NaN", 4);
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
const char *resolve_ps_stat_id(psStatId_t id)
|
||||
{
|
||||
const char *name;
|
||||
|
||||
switch(id)
|
||||
{
|
||||
case PS_STAT_ID_CRYPT_AUTH_INIT: name = "crypt_auth_init"; break;
|
||||
case PS_STAT_ID_CIPHER_INIT: name = "cipher_init"; break;
|
||||
case PS_STAT_ID_CIPHER_CONTINUE: name = "cipher_continue"; break;
|
||||
case PS_STAT_ID_CIPHER_FINISH: name = "cipher_finish"; break;
|
||||
case PS_STAT_ID_CIPHER_INIT_CBC_ENC: name = "cipher_init_cbc_enc"; break;
|
||||
case PS_STAT_ID_CIPHER_CONTINUE_CBC_ENC: name = "cipher_continue_cbc_enc"; break;
|
||||
case PS_STAT_ID_CIPHER_INIT_CBC_DEC: name = "cipher_init_cbc_dec"; break;
|
||||
case PS_STAT_ID_CIPHER_CONTINUE_CBC_DEC: name = "cipher_continue_cbc_dec"; break;
|
||||
case PS_STAT_ID_CRYPT_AUTH_CONTINUE: name = "crypt_auth_continue"; break;
|
||||
case PS_STAT_ID_CRYPT_GCM_AAD_CONTINUE: name = "crypt_gcm_aad_continue"; break;
|
||||
case PS_STAT_ID_CRYPT_GCM_AAD_FINISH: name = "crypt_gcm_aad_finish"; break;
|
||||
case PS_STAT_ID_DECRYPT_AUTH_FINISH: name = "decrypt_auth_finish"; break;
|
||||
case PS_STAT_ID_DERIVE_TLS_PRF: name = "derive_tls_prf"; break;
|
||||
case PS_STAT_ID_ENCRYPT_AUTH_FINISH: name = "encrypt_auth_finish"; break;
|
||||
case PS_STAT_ID_ENCRYPT_AUTH_PACKET_FINISH: name = "encrypt_auth_packet_finish"; break;
|
||||
case PS_STAT_ID_MAC_GENERATE_CONTINUE: name = "mac_generate_continue"; break;
|
||||
case PS_STAT_ID_MAC_GENERATE_FINISH: name = "mac_generate_finish"; break;
|
||||
case PS_STAT_ID_MAC_GENERATE_INIT: name = "mac_generate_init"; break;
|
||||
case PS_STAT_ID_ASSET_FREE_LOCAL: name = "asset_free_local"; break;
|
||||
case PS_STAT_ID_ASSET_FREE: name = "asset_free"; break;
|
||||
case PS_STAT_ID_ASSET_STORE_STATUS: name = "asset_store_status"; break;
|
||||
case PS_STAT_ID_LIB_INIT: name = "lib_init"; break;
|
||||
case PS_STAT_ID_LIB_UNINIT: name = "lib_uninit"; break;
|
||||
case PS_STAT_ID_ROOT_KEY_ALLOCATE_AND_LOAD_VALUE: name = "root_key_allocate_and_load_value"; break;
|
||||
case PS_STAT_ID_RBG_REQUEST_SECURITY_STRENGTH: name = "rbg_request_security_strength"; break;
|
||||
case PS_STAT_ID_RBG_USE_NONBLOCKING_ENTROPY_SOURCE: name = "rbg_use_nonblocking_entropy_source"; break;
|
||||
case PS_STAT_ID_RBG_INSTALL_ENTROPY_SOURCE: name = "rbg_install_entropy_source"; break;
|
||||
case PS_STAT_ID_LIB_ENTER_USER_ROLE: name = "lib_enter_user_role"; break;
|
||||
case PS_STAT_ID_LIB_SELF_TEST: name = "lib_self_test"; break;
|
||||
case PS_STAT_ID_ASSET_ALLOCATE_BASIC: name = "asset_allocate_basic"; break;
|
||||
case PS_STAT_ID_ASSET_ALLOCATE: name = "asset_allocate"; break;
|
||||
case PS_STAT_ID_ASSET_ALLOCATE_AND_ASSOCIATE_KEY_EXTRA: name = "asset_allocate_and_associate_key_extra"; break;
|
||||
case PS_STAT_ID_ASSET_LOAD_VALUE: name = "asset_load_value"; break;
|
||||
case PS_STAT_ID_ASSET_LOAD_MULTIPART: name = "asset_load_multipart"; break;
|
||||
case PS_STAT_ID_ASSET_LOAD_MULTIPART_CONVERT_BIG_INT: name = "asset_load_multipart_convert_big_int"; break;
|
||||
case PS_STAT_ID_ASSET_LOAD_RANDOM: name = "asset_load_random"; break;
|
||||
case PS_STAT_ID_RBG_GENERATE_RANDOM: name = "rbg_generate_random"; break;
|
||||
case PS_STAT_ID_RBG_RESEED: name = "rbg_reseed"; break;
|
||||
case PS_STAT_ID_ASSET_GENERATE_KEY_PAIR: name = "asset_generate_key_pair"; break;
|
||||
case PS_STAT_ID_ASSET_SHOW: name = "asset_show"; break;
|
||||
case PS_STAT_ID_ASSET_CHECK: name = "asset_check"; break;
|
||||
case PS_STAT_ID_MAC_VERIFY_INIT: name = "mac_verify_init"; break;
|
||||
case PS_STAT_ID_MAC_VERIFY_CONTINUE: name = "mac_verify_continue"; break;
|
||||
case PS_STAT_ID_MAC_VERIFY_FINISH: name = "mac_verify_finish"; break;
|
||||
case PS_STAT_ID_HASH_INIT: name = "hash_init"; break;
|
||||
case PS_STAT_ID_HASH_CONTINUE: name = "hash_continue"; break;
|
||||
case PS_STAT_ID_HASH_FINISH: name = "hash_finish"; break;
|
||||
case PS_STAT_ID_HASH_SINGLE: name = "hash_single"; break;
|
||||
case PS_STAT_ID_RUNTIME_CONFIG_GET_PROPERTY: name = "runtime_config_get_property"; break;
|
||||
case PS_STAT_ID_RUNTIME_CONFIG_SET_PROPERTY: name = "runtime_config_set_property"; break;
|
||||
case PS_STAT_ID_ASSET_PEEK: name = "asset_peek"; break;
|
||||
case PS_STAT_ID_ASSET_POKE: name = "asset_poke"; break;
|
||||
case PS_STAT_ID_TRUSTED_KDK_DERIVE: name = "trusted_kdk_derive"; break;
|
||||
case PS_STAT_ID_TRUSTED_KEKDK_DERIVE: name = "trusted_kekdk_derive"; break;
|
||||
case PS_STAT_ID_TRUSTED_KEY_DERIVE: name = "trusted_key_derive"; break;
|
||||
case PS_STAT_ID_KEY_DERIVE_KDK: name = "key_derive_kdk"; break;
|
||||
case PS_STAT_ID_KEY_DERIVE_PBKDF2: name = "key_derive_pbkdf2"; break;
|
||||
case PS_STAT_ID_ASSETS_WRAP_RSA_OAEP: name = "assets_wrap_rsa_oaep"; break;
|
||||
case PS_STAT_ID_ASSETS_UNWRAP_RSA_OAEP: name = "assets_unwrap_rsa_oaep"; break;
|
||||
case PS_STAT_ID_CRYPT_KW: name = "crypt_kw"; break;
|
||||
case PS_STAT_ID_ASSETS_WRAP_AES: name = "assets_wrap_aes"; break;
|
||||
case PS_STAT_ID_ASSETS_WRAP_AES_38F: name = "assets_wrap_aes_38f"; break;
|
||||
case PS_STAT_ID_ASSETS_UNWRAP_AES: name = "assets_unwrap_aes"; break;
|
||||
case PS_STAT_ID_ASSETS_UNWRAP_AES_38F: name = "assets_unwrap_aes_38f"; break;
|
||||
case PS_STAT_ID_ASSETS_WRAP_TRUSTED: name = "assets_wrap_trusted"; break;
|
||||
case PS_STAT_ID_ASSETS_UNWRAP_TRUSTED: name = "assets_unwrap_trusted"; break;
|
||||
case PS_STAT_ID_PKCS1_RSAEP: name = "pkcs1_rsaep"; break;
|
||||
case PS_STAT_ID_PKCS1_RSADP: name = "pkcs1_rsadp"; break;
|
||||
case PS_STAT_ID_PKCS1_RSASP1: name = "pkcs1_rsasp1"; break;
|
||||
case PS_STAT_ID_PKCS1_RSAVP1: name = "pkcs1_rsavp1"; break;
|
||||
case PS_STAT_ID_ASSETS_WRAP_RSA_KEM: name = "assets_wrap_rsa_kem"; break;
|
||||
case PS_STAT_ID_ASSETS_UNWRAP_RSA_KEM: name = "assets_unwrap_rsa_kem"; break;
|
||||
case PS_STAT_ID_ASSETS_WRAP_PKCS1V15: name = "assets_wrap_pkcs1v15"; break;
|
||||
case PS_STAT_ID_ASSETS_UNWRAP_PKCS1V15: name = "assets_unwrap_pkcs1v15"; break;
|
||||
case PS_STAT_ID_HASH_SIGN_FIPS186_132: name = "hash_sign_fips186_132"; break;
|
||||
case PS_STAT_ID_HASH_SIGN_FIPS186: name = "hash_sign_fips186"; break;
|
||||
case PS_STAT_ID_HASH_SIGN_PKCS1: name = "hash_sign_pkcs1"; break;
|
||||
case PS_STAT_ID_HASH_VERIFY_FIPS186_132: name = "hash_verify_fips186_132"; break;
|
||||
case PS_STAT_ID_HASH_VERIFY_FIPS186: name = "hash_verify_fips186"; break;
|
||||
case PS_STAT_ID_HASH_VERIFY_RECOVER_PKCS1: name = "hash_verify_recover_pkcs1"; break;
|
||||
case PS_STAT_ID_HASH_VERIFY_PKCS1: name = "hash_verify_pkcs1"; break;
|
||||
case PS_STAT_ID_HASH_SIGN_PKCS1_PSS: name = "hash_sign_pkcs1_pss"; break;
|
||||
case PS_STAT_ID_HASH_VERIFY_PKCS1_PSS: name = "hash_verify_pkcs1_pss"; break;
|
||||
case PS_STAT_ID_DERIVE_DH: name = "derive_dh"; break;
|
||||
case PS_STAT_ID_ENCRYPT_AUTH_INIT_RANDOM: name = "encrypt_auth_init_random"; break;
|
||||
case PS_STAT_ID_ENCRYPT_AUTH_INIT_DETERMINISTIC: name = "encrypt_auth_init_deterministic"; break;
|
||||
case PS_STAT_ID_ASSET_COPY_VALUE: name = "asset_copy_value"; break;
|
||||
case PS_STAT_ID_ASSET_ALLOCATE_SAME_POLICY: name = "asset_allocate_same_policy"; break;
|
||||
case PS_STAT_ID_LOAD_FINISHED_HASH_STATE_ALGO: name = "load_finished_hash_state_algo"; break;
|
||||
case PS_STAT_ID_LOAD_FINISHED_HASH_STATE: name = "load_finished_hash_state"; break;
|
||||
case PS_STAT_ID_HASH_FINISH_KEEP: name = "hash_finish_keep"; break;
|
||||
case PS_STAT_ID_IKE_PRF_EXTRACT: name = "ike_prf_extract"; break;
|
||||
case PS_STAT_ID_IKEV2_EXTRACT_SKEYSEED: name = "ikev2_extract_skeyseed"; break;
|
||||
case PS_STAT_ID_IKEV1_EXTRACT_SKEYID_DSA: name = "ikev1_extract_skeyid_dsa"; break;
|
||||
case PS_STAT_ID_IKEV1_EXTRACT_SKEYID_PSK: name = "ikev1_extract_skeyid_psk"; break;
|
||||
case PS_STAT_ID_IKEV1_EXTRACT_SKEYID_PKE: name = "ikev1_extract_skeyid_pke"; break;
|
||||
case PS_STAT_ID_IKEV2_DERIVE_DKM: name = "ikev2_derive_dkm"; break;
|
||||
case PS_STAT_ID_IKEV2_EXTRACT_SKEYSEED_REKEY: name = "ikev2_extract_skeyseed_rekey"; break;
|
||||
case PS_STAT_ID_IKEV1_DERIVE_KEYING_MATERIAL: name = "ikev1_derive_keying_material"; break;
|
||||
case PS_STAT_ID_RBG_TEST_VECTOR: name = "rbg_test_vector"; break;
|
||||
case PS_STAT_ID_ASSET_ALLOCATE_EX: name = "asset_allocate_ex"; break;
|
||||
case PS_STAT_ID_ASSET_REBIND: name = "asset_rebind"; break;
|
||||
case PS_STAT_ID_ASSET_ALLOCATE_AND_ASSOCIATE_KEY_EXTRA_EX: name = "asset_allocate_and_associate_key_extra_ex"; break;
|
||||
case PS_STAT_ID_DH_DERIVE: name = "dh_derive"; break;
|
||||
case PS_STAT_ID_DH_KEYGEN: name = "dh_keygen"; break;
|
||||
default: /* PS_STAT_ID_UNDEFINED etc. */
|
||||
name = "undefined";
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
static const char *resolve_ps_stat_event(psStatEvent_t event)
|
||||
{
|
||||
const char *name;
|
||||
|
||||
switch(event)
|
||||
{
|
||||
case PS_STAT_EVENT_NORMAL_LOCK: name = "locks"; break;
|
||||
case PS_STAT_EVENT_NORMAL_UNLOCK: name = "unlocks"; break;
|
||||
case PS_STAT_EVENT_SKIP_LOCK: name = "skip_lock"; break;
|
||||
case PS_STAT_EVENT_SKIP_UNLOCK: name = "skip_unlock"; break;
|
||||
case PS_STAT_EVENT_ERROR_CODE: name = "errors"; break;
|
||||
case PS_STAT_EVENT_TEMPORARIES_ACCESS: name = "temp_access"; break;
|
||||
default: /* PS_STAT_EVENT_UNDEFINED etc. */
|
||||
name = "undefined";
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
#ifdef USE_PS_STAT_CL
|
||||
/* Dump CL statistics at the end of software binary execution.
|
||||
The intent is that statistics are not being updated during this function,
|
||||
but unfortunately, the function cannot prevent that from happening. In the
|
||||
most cases, operating system should call destructor when there is no longer
|
||||
active processing with threads.
|
||||
|
||||
This destructor assumes standard IO can be performed while executing the
|
||||
destructor.
|
||||
*/
|
||||
void psDumpThreadSts(void) __attribute__((__destructor__));
|
||||
void psDumpThreadSts(void)
|
||||
{
|
||||
FILE *out = stderr;
|
||||
int thread_idx;
|
||||
int close_out = 0;
|
||||
psStatTimeSize_t *sts;
|
||||
int first = 1;
|
||||
|
||||
if (getenv("STATS_FILE_APPEND") != NULL)
|
||||
{
|
||||
out = fopen(getenv("STATS_FILE_APPEND"), "a");
|
||||
if (out == NULL)
|
||||
{
|
||||
fprintf(stderr, "Cannot open %s for output; statistics skipped.\n",
|
||||
getenv("STATS_FILE_APPEND"));
|
||||
return;
|
||||
}
|
||||
close_out = 1;
|
||||
}
|
||||
else if (getenv("STATS_FILE") != NULL)
|
||||
{
|
||||
out = fopen(getenv("STATS_FILE"), "w");
|
||||
if (out == NULL)
|
||||
{
|
||||
fprintf(stderr, "Cannot open %s for output; statistics skipped.\n",
|
||||
getenv("STATS_FILE"));
|
||||
return;
|
||||
}
|
||||
close_out = 1;
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&stat_list_mutex);
|
||||
sts = stat_list;
|
||||
thread_idx = 0;
|
||||
while(sts != NULL)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = (int) PS_STAT_ID_UNDEFINED; i < (int) PS_STAT_ID_NUM; i++)
|
||||
{
|
||||
const char *name;
|
||||
psStatTimeSizeItem_t *stsi;
|
||||
char out2[100];
|
||||
char out3[100];
|
||||
psStat_t *s;
|
||||
|
||||
name = resolve_ps_stat_id((psStatId_t) i);
|
||||
|
||||
stsi = &sts->stsi[(int) i];
|
||||
s = &stsi->time;
|
||||
|
||||
if (!psStatIsClear(s))
|
||||
{
|
||||
if (first)
|
||||
{
|
||||
FILE *f;
|
||||
|
||||
fprintf(out, "---statistics---\n");
|
||||
fprintf(out, "thread,stat,aspect,count,avg,min,max,std");
|
||||
f = popen("cat /proc/cpuinfo | grep 'cpu MHz'", "r");
|
||||
if (f)
|
||||
{
|
||||
char buf[128];
|
||||
char *s;
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
s = fgets(buf, 100, f);
|
||||
if (s)
|
||||
{
|
||||
s = strchr(buf, ':');
|
||||
}
|
||||
if (s)
|
||||
{
|
||||
fprintf(out, ",hz=%s", s + 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(out, "\n");
|
||||
}
|
||||
pclose(f);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(out, "\n");
|
||||
}
|
||||
first = 0;
|
||||
}
|
||||
fprintf(out,
|
||||
"%d,%s,%s,%"PR_PSSTAT",%s,%"PR_PSSTAT",%"PR_PSSTAT
|
||||
",%s\n",
|
||||
thread_idx,
|
||||
name,
|
||||
"time",
|
||||
psStatGetCount(s),
|
||||
printoptnan(out2, psStatGetAverage(s)),
|
||||
psStatGetMin(s),
|
||||
psStatGetMax(s),
|
||||
printoptnan(out3, psStatGetStdDeviation(s)));
|
||||
|
||||
s = &stsi->size;
|
||||
if (!psStatIsClear(s))
|
||||
{
|
||||
fprintf(out,
|
||||
"%d,%s,%s,%"PR_PSSTAT",%s,%"PR_PSSTAT",%"PR_PSSTAT
|
||||
",%s\n",
|
||||
thread_idx,
|
||||
name,
|
||||
"size",
|
||||
psStatGetCount(s),
|
||||
printoptnan(out2, psStatGetAverage(s)),
|
||||
psStatGetMin(s),
|
||||
psStatGetMax(s),
|
||||
printoptnan(out3, psStatGetStdDeviation(s)));
|
||||
}
|
||||
|
||||
s = &stsi->time_per_size;
|
||||
if (!psStatIsClear(s))
|
||||
{
|
||||
fprintf(out,
|
||||
"%d,%s,%s,%"PR_PSSTAT",%s,%"PR_PSSTAT",%"PR_PSSTAT
|
||||
",%s\n",
|
||||
thread_idx,
|
||||
name,
|
||||
"time_per_size",
|
||||
psStatGetCount(s),
|
||||
printoptnan(out2, psStatGetAverage(s)),
|
||||
psStatGetMin(s),
|
||||
psStatGetMax(s),
|
||||
printoptnan(out3, psStatGetStdDeviation(s)));
|
||||
}
|
||||
|
||||
s = &stsi->wait_time;
|
||||
if (!psStatIsClear(s))
|
||||
{
|
||||
fprintf(out,
|
||||
"%d,%s,%s,%"PR_PSSTAT",%s,%"PR_PSSTAT",%"PR_PSSTAT
|
||||
",%s\n",
|
||||
thread_idx,
|
||||
name,
|
||||
"wait_time",
|
||||
psStatGetCount(s),
|
||||
printoptnan(out2, psStatGetAverage(s)),
|
||||
psStatGetMin(s),
|
||||
psStatGetMax(s),
|
||||
printoptnan(out3, psStatGetStdDeviation(s)));
|
||||
}
|
||||
}
|
||||
}
|
||||
sts = sts->next;
|
||||
thread_idx ++;
|
||||
}
|
||||
if (first == 0)
|
||||
{
|
||||
fprintf(out, "---statistics---\n");
|
||||
}
|
||||
|
||||
sts = stat_list;
|
||||
thread_idx = 0;
|
||||
first = 1;
|
||||
while(sts != NULL)
|
||||
{
|
||||
int i;
|
||||
int l;
|
||||
|
||||
for(i = (int) PS_STAT_ID_UNDEFINED; i < (int) PS_STAT_ID_NUM; i++)
|
||||
{
|
||||
const char *name;
|
||||
char out2[100];
|
||||
|
||||
name = resolve_ps_stat_id((psStatId_t) i);
|
||||
for (l = 0; l < (int) PS_STAT_EVENT_NUM; l++)
|
||||
{
|
||||
psStatItem_t event = sts->events[i][l];
|
||||
if (event > 0)
|
||||
{
|
||||
if (first == 1)
|
||||
{
|
||||
fprintf(out, "---events---\n");
|
||||
fprintf(out, "thread,stat");
|
||||
for (l = 0; l < (int) PS_STAT_EVENT_NUM; l++)
|
||||
{
|
||||
fprintf(out, ",%s",
|
||||
resolve_ps_stat_event((psStatEvent_t) l));
|
||||
}
|
||||
fprintf(out, "\n");
|
||||
first = 0;
|
||||
}
|
||||
fprintf(out, "%d,%s", thread_idx, name);
|
||||
for (l = 0; l < (int) PS_STAT_EVENT_NUM; l++)
|
||||
{
|
||||
psStatItem_t event = sts->events[i][l];
|
||||
fprintf(out, ",%"PR_PSSTAT, event);
|
||||
}
|
||||
fprintf(out, "\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
sts = sts->next;
|
||||
thread_idx ++;
|
||||
}
|
||||
if (first == 0)
|
||||
{
|
||||
fprintf(out, "---events---\n");
|
||||
}
|
||||
pthread_mutex_unlock(&stat_list_mutex);
|
||||
|
||||
if (close_out)
|
||||
{
|
||||
fclose(out);
|
||||
}
|
||||
}
|
||||
#endif /* USE_PS_STAT_CL */
|
||||
|
||||
/* end of file psStat.c */
|
||||
|
||||
@@ -302,7 +302,7 @@ void *psDynBufDetachPsSize(psDynBuf_t *db, psSize_t *len_p)
|
||||
}
|
||||
|
||||
db->pool = NULL;
|
||||
if (len > PS_SIZE_MAX)
|
||||
if (len > (size_t) PS_SIZE_MAX)
|
||||
{
|
||||
psDynBufUninit(db);
|
||||
return NULL;
|
||||
@@ -1373,7 +1373,7 @@ int psParseTlsVariableLengthVec(const unsigned char *start,
|
||||
return PS_ARG_FAIL;
|
||||
}
|
||||
|
||||
if ((end - start) < numLenBytes)
|
||||
if ((psSizeL_t) (end - start) < numLenBytes)
|
||||
{
|
||||
psTraceCore("Error parsing vec len\n");
|
||||
return PS_LIMIT_FAIL;
|
||||
@@ -1392,7 +1392,7 @@ int psParseTlsVariableLengthVec(const unsigned char *start,
|
||||
}
|
||||
}
|
||||
|
||||
if ((end - p) < len)
|
||||
if ((psSizeL_t) (end - p) < len)
|
||||
{
|
||||
psTraceCore("Error: vector has less data than indicated " \
|
||||
"by the length encoding\n");
|
||||
|
||||
@@ -35,20 +35,42 @@
|
||||
#if defined(__aarch64__) || defined(__aarch32__) || defined(__arm__)
|
||||
|
||||
#include "pscompilerdep.h"
|
||||
|
||||
#ifndef CRYPTOPP_NO_GETAUXV_AVAILABLE
|
||||
#include <osdep_libc-version.h>
|
||||
|
||||
// Capability queries, requires Glibc 2.16, http://lwn.net/Articles/519085/
|
||||
// CRYPTOPP_GLIBC_VERSION not used because config.h is missing <feature.h>
|
||||
/* Capability queries, requires Glibc 2.16, http://lwn.net/Articles/519085/
|
||||
CRYPTOPP_GLIBC_VERSION not used because config.h is missing <feature.h> */
|
||||
#if (((__GLIBC__ * 100) + __GLIBC_MINOR__) >= 216)
|
||||
# define CRYPTOPP_GETAUXV_AVAILABLE 1
|
||||
# ifndef CRYPTOPP_GETAUXV_AVAILABLE
|
||||
# define CRYPTOPP_GETAUXV_AVAILABLE 1
|
||||
# endif
|
||||
#endif
|
||||
#ifdef __ANDROID__
|
||||
/* We also use getauxval() functionality on Android. */
|
||||
# ifndef CRYPTOPP_GETAUXV_AVAILABLE
|
||||
# define CRYPTOPP_GETAUXV_AVAILABLE 1
|
||||
# endif
|
||||
#endif
|
||||
#endif /* CRYPTOPP_NO_GETAUXV_AVAILABLE */
|
||||
|
||||
#include "osdep_stdbool.h"
|
||||
|
||||
#if CRYPTOPP_GETAUXV_AVAILABLE
|
||||
# include "osdep_sys_auxv.h"
|
||||
#else
|
||||
unsigned long int getauxval(unsigned long int) { return 0; }
|
||||
/* Provide stub for getauxval() API with AT_HWCAP and AT_HWCAP2. */
|
||||
unsigned long int getauxval(unsigned long int type)
|
||||
{
|
||||
(void) type; /* Parameter not used. */
|
||||
return 0;
|
||||
}
|
||||
#ifndef AT_HWCAP
|
||||
#define AT_HWCAP 16
|
||||
#endif
|
||||
#ifndef AT_HWCAP2
|
||||
#define AT_HWCAP2 26
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "osdep_unistd.h"
|
||||
@@ -123,23 +145,32 @@ unsigned int SL_cacheLineSize;
|
||||
# define HWCAP2_SHA2 (1 << 3)
|
||||
#endif
|
||||
|
||||
/* Use generic pattern for hardware capabilities detection from auxval. */
|
||||
#if defined __linux__ && !defined PS_USE_GETAUXVAL
|
||||
#define PS_USE_GETAUXVAL 1
|
||||
#endif
|
||||
|
||||
#if defined __ANDROID__ && !defined PS_USE_GETAUXVAL
|
||||
#define PS_USE_ANDROID_GET_CPU_FAMILY 1 /* Android can also use this. */
|
||||
#endif
|
||||
|
||||
static inline bool CPU_QueryNEON()
|
||||
{
|
||||
#if defined(__ANDROID__) && defined(__aarch64__)
|
||||
#if defined(PS_USE_ANDROID_GET_CPU_FAMILY) && defined(__aarch64__)
|
||||
if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) &&
|
||||
(android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_ASIMD))
|
||||
return true;
|
||||
#elif defined(__ANDROID__) && defined(__arm__)
|
||||
#elif defined(PS_USE_ANDROID_GET_CPU_FAMILY) && defined(__arm__)
|
||||
if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) &&
|
||||
(android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON))
|
||||
return true;
|
||||
#elif defined(__linux__) && defined(__aarch64__)
|
||||
#elif defined(PS_USE_GETAUXVAL) && defined(__aarch64__)
|
||||
if (getauxval(AT_HWCAP) & HWCAP_ASIMD)
|
||||
return true;
|
||||
#elif defined(__linux__) && defined(__aarch32__)
|
||||
#elif defined(PS_USE_GETAUXVAL) && defined(__aarch32__)
|
||||
if (getauxval(AT_HWCAP2) & HWCAP2_ASIMD)
|
||||
return true;
|
||||
#elif defined(__linux__) && defined(__arm__)
|
||||
#elif defined(PS_USE_GETAUXVAL) && defined(__arm__)
|
||||
if (getauxval(AT_HWCAP) & HWCAP_ARM_NEON)
|
||||
return true;
|
||||
#elif defined(__APPLE__) && defined(__aarch64__)
|
||||
@@ -151,18 +182,18 @@ static inline bool CPU_QueryNEON()
|
||||
|
||||
static inline bool CPU_QueryCRC32()
|
||||
{
|
||||
#if defined(__ANDROID__) && defined(__aarch64__)
|
||||
#if defined(PS_USE_ANDROID_GET_CPU_FAMILY) && defined(__aarch64__)
|
||||
if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) &&
|
||||
(android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_CRC32))
|
||||
return true;
|
||||
#elif defined(__ANDROID__) && defined(__aarch32__)
|
||||
#elif defined(PS_USE_ANDROID_GET_CPU_FAMILY) && defined(__aarch32__)
|
||||
if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) &&
|
||||
(android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_CRC32))
|
||||
return true;
|
||||
#elif defined(__linux__) && defined(__aarch64__)
|
||||
#elif defined(PS_USE_GETAUXVAL) && defined(__aarch64__)
|
||||
if (getauxval(AT_HWCAP) & HWCAP_CRC32)
|
||||
return true;
|
||||
#elif defined(__linux__) && defined(__aarch32__)
|
||||
#elif defined(PS_USE_GETAUXVAL) && defined(__aarch32__)
|
||||
if (getauxval(AT_HWCAP2) & HWCAP2_CRC32)
|
||||
return true;
|
||||
#elif defined(__APPLE__) && defined(__aarch64__)
|
||||
@@ -174,18 +205,18 @@ static inline bool CPU_QueryCRC32()
|
||||
|
||||
static inline bool CPU_QueryPMULL()
|
||||
{
|
||||
#if defined(__ANDROID__) && defined(__aarch64__)
|
||||
#if defined(PS_USE_ANDROID_GET_CPU_FAMILY) && defined(__aarch64__)
|
||||
if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) &&
|
||||
(android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_PMULL))
|
||||
return true;
|
||||
#elif defined(__ANDROID__) && defined(__aarch32__)
|
||||
#elif defined(PS_USE_ANDROID_GET_CPU_FAMILY) && defined(__aarch32__)
|
||||
if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) &&
|
||||
(android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_PMULL))
|
||||
return true;
|
||||
#elif defined(__linux__) && defined(__aarch64__)
|
||||
#elif defined(PS_USE_GETAUXVAL) && defined(__aarch64__)
|
||||
if (getauxval(AT_HWCAP) & HWCAP_PMULL)
|
||||
return true;
|
||||
#elif defined(__linux__) && defined(__aarch32__)
|
||||
#elif defined(PS_USE_GETAUXVAL) && defined(__aarch32__)
|
||||
if (getauxval(AT_HWCAP2) & HWCAP2_PMULL)
|
||||
return true;
|
||||
#elif defined(__APPLE__) && defined(__aarch64__)
|
||||
@@ -197,18 +228,18 @@ static inline bool CPU_QueryPMULL()
|
||||
|
||||
static inline bool CPU_QueryAES()
|
||||
{
|
||||
#if defined(__ANDROID__) && defined(__aarch64__)
|
||||
#if defined(PS_USE_ANDROID_GET_CPU_FAMILY) && defined(__aarch64__)
|
||||
if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) &&
|
||||
(android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_AES))
|
||||
return true;
|
||||
#elif defined(__ANDROID__) && defined(__aarch32__)
|
||||
#elif defined(PS_USE_ANDROID_GET_CPU_FAMILY) && defined(__aarch32__)
|
||||
if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) &&
|
||||
(android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_AES))
|
||||
return true;
|
||||
#elif defined(__linux__) && defined(__aarch64__)
|
||||
#elif defined(PS_USE_GETAUXVAL) && defined(__aarch64__)
|
||||
if (getauxval(AT_HWCAP) & HWCAP_AES)
|
||||
return true;
|
||||
#elif defined(__linux__) && defined(__aarch32__)
|
||||
#elif defined(PS_USE_GETAUXVAL) && defined(__aarch32__)
|
||||
if (getauxval(AT_HWCAP2) & HWCAP2_AES)
|
||||
return true;
|
||||
#elif defined(__APPLE__) && defined(__aarch64__)
|
||||
@@ -232,18 +263,18 @@ static inline bool CPU_QueryAES()
|
||||
|
||||
static inline bool CPU_QuerySHA1()
|
||||
{
|
||||
#if defined(__ANDROID__) && defined(__aarch64__)
|
||||
#if defined(PS_USE_ANDROID_GET_CPU_FAMILY) && defined(__aarch64__)
|
||||
if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) &&
|
||||
(android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA1))
|
||||
return true;
|
||||
#elif defined(__ANDROID__) && defined(__aarch32__)
|
||||
#elif defined(PS_USE_ANDROID_GET_CPU_FAMILY) && defined(__aarch32__)
|
||||
if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) &&
|
||||
(android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA1))
|
||||
return true;
|
||||
#elif defined(__linux__) && defined(__aarch64__)
|
||||
#elif defined(PS_USE_GETAUXVAL) && defined(__aarch64__)
|
||||
if (getauxval(AT_HWCAP) & HWCAP_SHA1)
|
||||
return true;
|
||||
#elif defined(__linux__) && defined(__aarch32__)
|
||||
#elif defined(PS_USE_GETAUXVAL) && defined(__aarch32__)
|
||||
if (getauxval(AT_HWCAP2) & HWCAP2_SHA1)
|
||||
return true;
|
||||
#elif defined(__APPLE__) && defined(__aarch64__)
|
||||
@@ -264,20 +295,21 @@ static inline bool CPU_QuerySHA1()
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool CPU_QuerySHA2()
|
||||
{
|
||||
#if defined(__ANDROID__) && defined(__aarch64__)
|
||||
#if defined(PS_USE_ANDROID_GET_CPU_FAMILY) && defined(__aarch64__)
|
||||
if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) &&
|
||||
(android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA2))
|
||||
return true;
|
||||
#elif defined(__ANDROID__) && defined(__aarch32__)
|
||||
#elif defined(PS_USE_ANDROID_GET_CPU_FAMILY) && defined(__aarch32__)
|
||||
if ((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) &&
|
||||
(android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA2))
|
||||
return true;
|
||||
#elif defined(__linux__) && defined(__aarch64__)
|
||||
#elif defined(PS_USE_GETAUXVAL) && defined(__aarch64__)
|
||||
if (getauxval(AT_HWCAP) & HWCAP_SHA2)
|
||||
return true;
|
||||
#elif defined(__linux__) && defined(__aarch32__)
|
||||
#elif defined(PS_USE_GETAUXVAL) && defined(__aarch32__)
|
||||
if (getauxval(AT_HWCAP2) & HWCAP2_SHA2)
|
||||
return true;
|
||||
#elif defined(__APPLE__) && defined(__aarch64__)
|
||||
|
||||
@@ -298,7 +298,8 @@ struct TestEntry AutoTestEntryDefault =
|
||||
TEST_ENABLED,
|
||||
OK,
|
||||
NULL,
|
||||
NULL
|
||||
NULL,
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
/* Finish test, with handling of a special case: listing of tests. */
|
||||
|
||||
Reference in New Issue
Block a user