summaryrefslogtreecommitdiff
path: root/lib/liboqs/src/common/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/liboqs/src/common/common.c')
-rw-r--r--lib/liboqs/src/common/common.c324
1 files changed, 0 insertions, 324 deletions
diff --git a/lib/liboqs/src/common/common.c b/lib/liboqs/src/common/common.c
deleted file mode 100644
index 43f6b58aa..000000000
--- a/lib/liboqs/src/common/common.c
+++ /dev/null
@@ -1,324 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0 AND MIT
-
-#if !defined(_WIN32) && !defined(OQS_HAVE_EXPLICIT_BZERO)
-// Request memset_s
-#define __STDC_WANT_LIB_EXT1__ 1
-#endif
-
-#include <oqs/common.h>
-
-#include <errno.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#if !defined(OQS_HAVE_POSIX_MEMALIGN) || defined(__MINGW32__) || defined(__MINGW64__) || defined(_MSC_VER)
-#include <malloc.h>
-#endif
-
-#if defined(_WIN32)
-#include <windows.h>
-#endif
-
-/* Identifying the CPU is expensive so we cache the results in cpu_ext_data */
-#if defined(OQS_DIST_BUILD)
-static unsigned int cpu_ext_data[OQS_CPU_EXT_COUNT] = {0};
-#endif
-
-#if defined(OQS_DIST_X86_64_BUILD)
-/* set_available_cpu_extensions_x86_64() has been written using:
- * https://github.com/google/cpu_features/blob/master/src/cpuinfo_x86.c
- */
-#include "x86_64_helpers.h"
-static void set_available_cpu_extensions(void) {
- /* mark that this function has been called */
- cpu_ext_data[OQS_CPU_EXT_INIT] = 1;
-
- cpuid_out leaf_1;
- cpuid(&leaf_1, 1);
- if (leaf_1.eax == 0) {
- return;
- }
-
- cpuid_out leaf_7;
- cpuid(&leaf_7, 7);
-
- const unsigned int has_xsave = is_bit_set(leaf_1.ecx, 26);
- const unsigned int has_osxsave = is_bit_set(leaf_1.ecx, 27);
- const uint32_t xcr0_eax = (has_xsave && has_osxsave) ? xgetbv_eax(0) : 0;
-
- cpu_ext_data[OQS_CPU_EXT_AES] = is_bit_set(leaf_1.ecx, 25);
- if (has_mask(xcr0_eax, MASK_XMM | MASK_YMM)) {
- cpu_ext_data[OQS_CPU_EXT_AVX] = is_bit_set(leaf_1.ecx, 28);
- cpu_ext_data[OQS_CPU_EXT_AVX2] = is_bit_set(leaf_7.ebx, 5);
- }
- cpu_ext_data[OQS_CPU_EXT_PCLMULQDQ] = is_bit_set(leaf_1.ecx, 1);
- cpu_ext_data[OQS_CPU_EXT_POPCNT] = is_bit_set(leaf_1.ecx, 23);
- cpu_ext_data[OQS_CPU_EXT_BMI1] = is_bit_set(leaf_7.ebx, 3);
- cpu_ext_data[OQS_CPU_EXT_BMI2] = is_bit_set(leaf_7.ebx, 8);
- cpu_ext_data[OQS_CPU_EXT_ADX] = is_bit_set(leaf_7.ebx, 19);
-
- if (has_mask(xcr0_eax, MASK_XMM)) {
- cpu_ext_data[OQS_CPU_EXT_SSE] = is_bit_set(leaf_1.edx, 25);
- cpu_ext_data[OQS_CPU_EXT_SSE2] = is_bit_set(leaf_1.edx, 26);
- cpu_ext_data[OQS_CPU_EXT_SSE3] = is_bit_set(leaf_1.ecx, 0);
- }
-
- if (has_mask(xcr0_eax, MASK_XMM | MASK_YMM | MASK_MASKREG | MASK_ZMM0_15 | MASK_ZMM16_31)) {
- unsigned int avx512f = is_bit_set(leaf_7.ebx, 16);
- unsigned int avx512bw = is_bit_set(leaf_7.ebx, 30);
- unsigned int avx512dq = is_bit_set(leaf_7.ebx, 17);
- if (avx512f && avx512bw && avx512dq) {
- cpu_ext_data[OQS_CPU_EXT_AVX512] = 1;
- }
- cpu_ext_data[OQS_CPU_EXT_VPCLMULQDQ] = is_bit_set(leaf_7.ecx, 10);
- }
-}
-#elif defined(OQS_DIST_X86_BUILD)
-static void set_available_cpu_extensions(void) {
- /* mark that this function has been called */
- cpu_ext_data[OQS_CPU_EXT_INIT] = 1;
-}
-#elif defined(OQS_DIST_ARM64_V8_BUILD)
-#if defined(__APPLE__)
-#include <sys/sysctl.h>
-static unsigned int macos_feature_detection(const char *feature_name) {
- int p;
- size_t p_len = sizeof(p);
- int res = sysctlbyname(feature_name, &p, &p_len, NULL, 0);
- if (res != 0) {
- return 0;
- } else {
- return (p != 0) ? 1 : 0;
- }
-}
-static void set_available_cpu_extensions(void) {
- /* mark that this function has been called */
- cpu_ext_data[OQS_CPU_EXT_ARM_AES] = 1;
- cpu_ext_data[OQS_CPU_EXT_ARM_SHA2] = 1;
- cpu_ext_data[OQS_CPU_EXT_ARM_SHA3] = macos_feature_detection("hw.optional.armv8_2_sha3");
- cpu_ext_data[OQS_CPU_EXT_ARM_NEON] = macos_feature_detection("hw.optional.neon");
- cpu_ext_data[OQS_CPU_EXT_INIT] = 1;
-}
-#elif defined(__FreeBSD__) || defined(__FreeBSD)
-#include <sys/auxv.h>
-#include <machine/elf.h>
-
-static void set_available_cpu_extensions(void) {
- /* mark that this function has been called */
- u_long hwcaps = 0;
- cpu_ext_data[OQS_CPU_EXT_INIT] = 1;
- if (elf_aux_info(AT_HWCAP, &hwcaps, sizeof(u_long))) {
- fprintf(stderr, "Error getting HWCAP for ARM on FreeBSD\n");
- return;
- }
- if (hwcaps & HWCAP_AES) {
- cpu_ext_data[OQS_CPU_EXT_ARM_AES] = 1;
- }
- if (hwcaps & HWCAP_ASIMD) {
- cpu_ext_data[OQS_CPU_EXT_ARM_NEON] = 1;
- }
- if (hwcaps & HWCAP_SHA2) {
- cpu_ext_data[OQS_CPU_EXT_ARM_SHA2] = 1;
- }
- if (hwcaps & HWCAP_SHA3) {
- cpu_ext_data[OQS_CPU_EXT_ARM_SHA3] = 1;
- }
-}
-#else
-#include <sys/auxv.h>
-#include <asm/hwcap.h>
-static void set_available_cpu_extensions(void) {
- /* mark that this function has been called */
- cpu_ext_data[OQS_CPU_EXT_INIT] = 1;
- unsigned long int hwcaps = getauxval(AT_HWCAP);
- if (hwcaps & HWCAP_AES) {
- cpu_ext_data[OQS_CPU_EXT_ARM_AES] = 1;
- }
- if (hwcaps & HWCAP_SHA2) {
- cpu_ext_data[OQS_CPU_EXT_ARM_SHA2] = 1;
- }
- if (hwcaps & HWCAP_SHA3) {
- cpu_ext_data[OQS_CPU_EXT_ARM_SHA3] = 1;
- }
- if (hwcaps & HWCAP_ASIMD) {
- cpu_ext_data[OQS_CPU_EXT_ARM_NEON] = 1;
- }
-}
-#endif
-#elif defined(OQS_DIST_ARM32v7_BUILD)
-#include <sys/auxv.h>
-#include <asm/hwcap.h>
-static void set_available_cpu_extensions(void) {
- /* mark that this function has been called */
- cpu_ext_data[OQS_CPU_EXT_INIT] = 1;
- unsigned long int hwcaps = getauxval(AT_HWCAP);
- unsigned long int hwcaps2 = getauxval(AT_HWCAP2);
- if (hwcaps2 & HWCAP2_AES) {
- cpu_ext_data[OQS_CPU_EXT_ARM_AES] = 1;
- }
- if (hwcaps2 & HWCAP2_SHA2) {
- cpu_ext_data[OQS_CPU_EXT_ARM_SHA2] = 1;
- }
- if (hwcaps & HWCAP_NEON) {
- cpu_ext_data[OQS_CPU_EXT_ARM_NEON] = 1;
- }
-}
-#elif defined(OQS_DIST_PPC64LE_BUILD)
-static void set_available_cpu_extensions(void) {
- /* mark that this function has been called */
- cpu_ext_data[OQS_CPU_EXT_INIT] = 1;
-}
-#elif defined(OQS_DIST_S390X_BUILD)
-static void set_available_cpu_extensions(void) {
- /* mark that this function has been called */
- cpu_ext_data[OQS_CPU_EXT_INIT] = 1;
-}
-#elif defined(OQS_DIST_BUILD)
-static void set_available_cpu_extensions(void) {
-}
-#endif
-
-OQS_API int OQS_CPU_has_extension(OQS_CPU_EXT ext) {
-#if defined(OQS_DIST_BUILD)
- if (0 == cpu_ext_data[OQS_CPU_EXT_INIT]) {
- set_available_cpu_extensions();
- }
- if (0 < ext && ext < OQS_CPU_EXT_COUNT) {
- return (int)cpu_ext_data[ext];
- }
-#else
- (void)ext;
-#endif
- return 0;
-}
-
-OQS_API void OQS_init(void) {
-#if defined(OQS_DIST_BUILD)
- OQS_CPU_has_extension(OQS_CPU_EXT_INIT);
-#endif
- return;
-}
-
-OQS_API const char *OQS_version(void) {
- return OQS_VERSION_TEXT;
-}
-
-OQS_API int OQS_MEM_secure_bcmp(const void *a, const void *b, size_t len) {
- /* Assume CHAR_BIT = 8 */
- uint8_t r = 0;
-
- for (size_t i = 0; i < len; i++) {
- r |= ((const uint8_t *)a)[i] ^ ((const uint8_t *)b)[i];
- }
-
- // We have 0 <= r < 256, and unsigned int is at least 16 bits.
- return 1 & ((-(unsigned int)r) >> 8);
-}
-
-OQS_API void OQS_MEM_cleanse(void *ptr, size_t len) {
-#if defined(_WIN32)
- SecureZeroMemory(ptr, len);
-#elif defined(OQS_HAVE_EXPLICIT_BZERO)
- explicit_bzero(ptr, len);
-#elif defined(__STDC_LIB_EXT1__) || defined(OQS_HAVE_MEMSET_S)
- if (0U < len && memset_s(ptr, (rsize_t)len, 0, (rsize_t)len) != 0) {
- abort();
- }
-#else
- typedef void *(*memset_t)(void *, int, size_t);
- static volatile memset_t memset_func = memset;
- memset_func(ptr, 0, len);
-#endif
-}
-
-OQS_API void OQS_MEM_secure_free(void *ptr, size_t len) {
- if (ptr != NULL) {
- OQS_MEM_cleanse(ptr, len);
- free(ptr); // IGNORE free-check
- }
-}
-
-OQS_API void OQS_MEM_insecure_free(void *ptr) {
- free(ptr); // IGNORE free-check
-}
-
-void *OQS_MEM_aligned_alloc(size_t alignment, size_t size) {
-#if defined(OQS_HAVE_ALIGNED_ALLOC) // glibc and other implementations providing aligned_alloc
- return aligned_alloc(alignment, size);
-#else
- // Check alignment (power of 2, and >= sizeof(void*)) and size (multiple of alignment)
- if (alignment & (alignment - 1) || size & (alignment - 1) || alignment < sizeof(void *)) {
- errno = EINVAL;
- return NULL;
- }
-
-#if defined(OQS_HAVE_POSIX_MEMALIGN)
- void *ptr = NULL;
- const int err = posix_memalign(&ptr, alignment, size);
- if (err) {
- errno = err;
- ptr = NULL;
- }
- return ptr;
-#elif defined(OQS_HAVE_MEMALIGN)
- return memalign(alignment, size);
-#elif defined(__MINGW32__) || defined(__MINGW64__)
- return __mingw_aligned_malloc(size, alignment);
-#elif defined(_MSC_VER)
- return _aligned_malloc(size, alignment);
-#else
- if (!size) {
- return NULL;
- }
- // Overallocate to be able to align the pointer (alignment -1) and to store
- // the difference between the pointer returned to the user (ptr) and the
- // pointer returned by malloc (buffer). The difference is caped to 255 and
- // can be made larger if necessary, but this should be enough for all users
- // in liboqs.
- //
- // buffer ptr
- // ↓ ↓
- // ...........|...................
- // |
- // diff = ptr - buffer
- const size_t offset = alignment - 1 + sizeof(uint8_t);
- uint8_t *buffer = malloc(size + offset);
- if (!buffer) {
- return NULL;
- }
-
- // Align the pointer returned to the user.
- uint8_t *ptr = (uint8_t *)(((uintptr_t)(buffer) + offset) & ~(alignment - 1));
- ptrdiff_t diff = ptr - buffer;
- if (diff > UINT8_MAX) {
- // This should never happen in our code, but just to be safe
- free(buffer); // IGNORE free-check
- errno = EINVAL;
- return NULL;
- }
- // Store the difference one byte ahead the returned poitner so that free
- // can reconstruct buffer.
- ptr[-1] = diff;
- return ptr;
-#endif
-#endif
-}
-
-void OQS_MEM_aligned_free(void *ptr) {
-#if defined(OQS_HAVE_ALIGNED_ALLOC) || defined(OQS_HAVE_POSIX_MEMALIGN) || defined(OQS_HAVE_MEMALIGN)
- free(ptr); // IGNORE free-check
-#elif defined(__MINGW32__) || defined(__MINGW64__)
- __mingw_aligned_free(ptr);
-#elif defined(_MSC_VER)
- _aligned_free(ptr);
-#else
- if (ptr) {
- // Reconstruct the pointer returned from malloc using the difference
- // stored one byte ahead of ptr.
- uint8_t *u8ptr = ptr;
- free(u8ptr - u8ptr[-1]); // IGNORE free-check
- }
-#endif
-}