MatrixSSL 4.3.0

This commit is contained in:
Janne Johansson
2020-07-31 13:31:27 +03:00
parent f0b0d0a5c3
commit eec42aa814
107 changed files with 7044 additions and 1777 deletions

View File

@@ -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/, \

View File

@@ -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 */
/******************************************************************************/

View File

@@ -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;

View File

@@ -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__); \

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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));
}

View File

@@ -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;

View File

@@ -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 */

View 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 */

View File

@@ -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

View File

@@ -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

View File

@@ -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 */

View File

@@ -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");

View File

@@ -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__)

View File

@@ -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. */