#ifndef OQS_COMMON_H
#define OQS_COMMON_H
#include <limits.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <oqs/oqsconfig.h>
#if defined(__cplusplus)
extern "C" {
#endif
#define OQS_EXIT_IF_NULLPTR(x, loc) \
do { \
if ( (x) == (void*)0 ) { \
fprintf(stderr, "Unexpected NULL returned from %s API. Exiting.\n", loc); \
exit(EXIT_FAILURE); \
} \
} while (0)
#define OQS_OPENSSL_GUARD(x) \
do { \
if( 1 != (x) ) { \
fprintf(stderr, "Error return value from OpenSSL API: %d. Exiting.\n", x); \
exit(EXIT_FAILURE); \
} \
} while (0)
#define SIZE_T_TO_INT_OR_EXIT(size_t_var_name, int_var_name) \
int int_var_name = 0; \
if (size_t_var_name <= INT_MAX) { \
int_var_name = (int)size_t_var_name; \
} else { \
exit(EXIT_FAILURE); \
}
#if defined(_WIN32)
#define OQS_API __declspec(dllexport)
#else
#define OQS_API __attribute__((visibility("default")))
#endif
#if defined(OQS_SYS_UEFI)
#undef OQS_API
#define OQS_API
#endif
typedef enum {
OQS_ERROR = -1,
OQS_SUCCESS = 0,
OQS_EXTERNAL_LIB_ERROR_OPENSSL = 50,
} OQS_STATUS;
typedef enum {
OQS_CPU_EXT_INIT,
OQS_CPU_EXT_ADX,
OQS_CPU_EXT_AES,
OQS_CPU_EXT_AVX,
OQS_CPU_EXT_AVX2,
OQS_CPU_EXT_AVX512,
OQS_CPU_EXT_BMI1,
OQS_CPU_EXT_BMI2,
OQS_CPU_EXT_PCLMULQDQ,
OQS_CPU_EXT_VPCLMULQDQ,
OQS_CPU_EXT_POPCNT,
OQS_CPU_EXT_SSE,
OQS_CPU_EXT_SSE2,
OQS_CPU_EXT_SSE3,
OQS_CPU_EXT_ARM_AES,
OQS_CPU_EXT_ARM_SHA2,
OQS_CPU_EXT_ARM_SHA3,
OQS_CPU_EXT_ARM_NEON,
OQS_CPU_EXT_COUNT,
} OQS_CPU_EXT;
OQS_API int OQS_CPU_has_extension(OQS_CPU_EXT ext);
OQS_API void OQS_init(void);
OQS_API void OQS_destroy(void);
OQS_API const char *OQS_version(void);
OQS_API int OQS_MEM_secure_bcmp(const void *a, const void *b, size_t len);
OQS_API void OQS_MEM_cleanse(void *ptr, size_t len);
OQS_API void OQS_MEM_secure_free(void *ptr, size_t len);
OQS_API void OQS_MEM_insecure_free(void *ptr);
void *OQS_MEM_aligned_alloc(size_t alignment, size_t size);
void OQS_MEM_aligned_free(void *ptr);
#if defined(__cplusplus)
} #endif
#endif