liboqs
Loading...
Searching...
No Matches
common.h
Go to the documentation of this file.
1
7
8#ifndef OQS_COMMON_H
9#define OQS_COMMON_H
10
11#include <limits.h>
12#include <stdint.h>
13#include <stdio.h>
14#include <stdlib.h>
15
16#include <oqs/oqsconfig.h>
17
18#if defined(__cplusplus)
19extern "C" {
20#endif
21
22#if defined(__GNUC__) || defined(__clang__)
28#define IGNORE_UNUSED_FUNC __attribute__((unused))
29#else
35#define IGNORE_UNUSED_FUNC
36#endif
37
38#if defined(OQS_DISABLE_MEM_BLACK_BOX)
39
40#warning "DANGER: OQS_DISABLE_MEM_BLACK_BOX is for internal testing only"
41#warning "disabling optimization barrier may introduce side channels"
47#define OQS_MEM_BLACK_BOX(v) (void)v
48
49#elif defined(__GNUC__) || defined(__clang__)
50
57#define OQS_MEM_BLACK_BOX(v) \
58 do { \
59 __asm__ volatile("" : "+r"(v) :); \
60 } while (0)
61
62#else
63
64#pragma message("WARNING: non-GNUC/Clang toolchain detected. liboqs cannot \
65 guarantee optimization barrier on unsupported platforms. \
66 Compiler may introduce non-constant-time behaviors. Please \
67 verify generated assembly and proceed with caution.")
74#define OQS_MEM_BLACK_BOX(v) (void)v
75#endif
76
81#define OQS_EXIT_IF_NULLPTR(x, loc) \
82 do { \
83 if ((x) == (void *)0) { \
84 fprintf(stderr, "Unexpected NULL returned from %s API. Exiting.\n", \
85 loc); \
86 exit(EXIT_FAILURE); \
87 } \
88 } while (0)
89
101#ifdef OQS_USE_OPENSSL
102#ifdef OPENSSL_NO_STDIO
103#define OQS_OPENSSL_GUARD(x) \
104 do { \
105 if (1 != (x)) { \
106 fprintf(stderr, "Error return value from OpenSSL API: %d. Exiting.\n", \
107 x); \
108 exit(EXIT_FAILURE); \
109 } \
110 } while (0)
111#else // OPENSSL_NO_STDIO
112#define OQS_OPENSSL_GUARD(x) \
113 do { \
114 if (1 != (x)) { \
115 fprintf(stderr, "Error return value from OpenSSL API: %d. Exiting.\n", \
116 x); \
117 OSSL_FUNC(ERR_print_errors_fp)(stderr); \
118 exit(EXIT_FAILURE); \
119 } \
120 } while (0)
121#endif // OPENSSL_NO_STDIO
122#endif // OQS_USE_OPENSSL
123
130#define SIZE_T_TO_INT_OR_EXIT(size_t_var_name, int_var_name) \
131 int int_var_name = 0; \
132 if (size_t_var_name <= INT_MAX) { \
133 int_var_name = (int)size_t_var_name; \
134 } else { \
135 exit(EXIT_FAILURE); \
136 }
137
146#if defined(_WIN32)
147#define OQS_API __declspec(dllexport)
148#else
149#define OQS_API __attribute__((visibility("default")))
150#endif
151
152#if defined(OQS_SYS_UEFI)
153#undef OQS_API
154#define OQS_API
155#endif
156
179
183typedef enum {
184 OQS_CPU_EXT_INIT, /* Must be first */
185 /* Start extension list */
186 OQS_CPU_EXT_ADX,
187 OQS_CPU_EXT_AES,
188 OQS_CPU_EXT_AVX,
189 OQS_CPU_EXT_AVX2,
190 OQS_CPU_EXT_AVX512,
191 OQS_CPU_EXT_BMI1,
192 OQS_CPU_EXT_BMI2,
193 OQS_CPU_EXT_PCLMULQDQ,
194 OQS_CPU_EXT_VPCLMULQDQ,
195 OQS_CPU_EXT_POPCNT,
196 OQS_CPU_EXT_SSE,
197 OQS_CPU_EXT_SSE2,
198 OQS_CPU_EXT_SSE3,
199 OQS_CPU_EXT_ARM_AES,
200 OQS_CPU_EXT_ARM_SHA2,
201 OQS_CPU_EXT_ARM_SHA3,
202 OQS_CPU_EXT_ARM_NEON,
203 /* End extension list */
204 OQS_CPU_EXT_COUNT, /* Must be last */
206
213
218OQS_API void OQS_init(void);
219
227
232
236OQS_API const char *OQS_version(void);
237
245
251OQS_API void *OQS_MEM_malloc(size_t size);
252
259OQS_API void *OQS_MEM_calloc(size_t num_elements, size_t element_size);
260
266OQS_API char *OQS_MEM_strdup(const char *str);
267
277OQS_API int OQS_MEM_secure_bcmp(const void *a, const void *b, size_t len);
278
289OQS_API void OQS_MEM_cleanse(void *ptr, size_t len);
290
303OQS_API void OQS_MEM_secure_free(void *ptr, size_t len);
304
315
325void *OQS_MEM_aligned_alloc(size_t alignment, size_t size);
326
330void OQS_MEM_aligned_free(void *ptr);
331
335void OQS_MEM_aligned_secure_free(void *ptr, size_t len);
336
337#if defined(__cplusplus)
338} // extern "C"
339#endif
340
341#endif // OQS_COMMON_H
OQS_API void OQS_MEM_cleanse(void *ptr, size_t len)
OQS_API const char * OQS_version(void)
OQS_CPU_EXT
Definition common.h:183
void * OQS_MEM_aligned_alloc(size_t alignment, size_t size)
OQS_API int OQS_CPU_has_extension(OQS_CPU_EXT ext)
OQS_API void OQS_MEM_secure_free(void *ptr, size_t len)
OQS_API int OQS_MEM_secure_bcmp(const void *a, const void *b, size_t len)
void OQS_MEM_aligned_free(void *ptr)
#define OQS_API
Definition common.h:149
OQS_STATUS
Definition common.h:171
@ OQS_EXTERNAL_LIB_ERROR_OPENSSL
Definition common.h:177
@ OQS_ERROR
Definition common.h:173
@ OQS_SUCCESS
Definition common.h:175
OQS_API void * OQS_MEM_malloc(size_t size)
Memory allocation and deallocation functions.
OQS_API void OQS_init(void)
OQS_API void * OQS_MEM_calloc(size_t num_elements, size_t element_size)
OQS_API void OQS_thread_stop(void)
OQS_API char * OQS_MEM_strdup(const char *str)
OQS_API void OQS_destroy(void)
OQS_API void OQS_MEM_insecure_free(void *ptr)
void OQS_MEM_aligned_secure_free(void *ptr, size_t len)