types.h 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411
  1. /* types.h
  2. *
  3. * Copyright (C) 2006-2022 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. /*!
  22. \file wolfssl/wolfcrypt/types.h
  23. */
  24. /*
  25. DESCRIPTION
  26. This library defines the primitive data types and abstraction macros to
  27. decouple library dependencies with standard string, memory and so on.
  28. */
  29. #ifndef WOLF_CRYPT_TYPES_H
  30. #define WOLF_CRYPT_TYPES_H
  31. #include <wolfssl/wolfcrypt/settings.h>
  32. #include <wolfssl/wolfcrypt/wc_port.h>
  33. #ifdef __cplusplus
  34. extern "C" {
  35. #endif
  36. /*
  37. * This struct is used multiple time by other structs and
  38. * needs to be defined somewhere that all structs can import
  39. * (with minimal dependencies).
  40. */
  41. #ifdef HAVE_EX_DATA
  42. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  43. typedef void (*wolfSSL_ex_data_cleanup_routine_t)(void *data);
  44. #endif
  45. typedef struct WOLFSSL_CRYPTO_EX_DATA {
  46. void* ex_data[MAX_EX_DATA];
  47. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  48. wolfSSL_ex_data_cleanup_routine_t ex_data_cleanup_routines[MAX_EX_DATA];
  49. #endif
  50. } WOLFSSL_CRYPTO_EX_DATA;
  51. #endif
  52. #if defined(WORDS_BIGENDIAN)
  53. #define BIG_ENDIAN_ORDER
  54. #endif
  55. #ifndef BIG_ENDIAN_ORDER
  56. #define LITTLE_ENDIAN_ORDER
  57. #endif
  58. #ifndef WOLFSSL_TYPES
  59. #ifndef byte
  60. typedef unsigned char byte;
  61. typedef signed char sword8;
  62. typedef unsigned char word8;
  63. #endif
  64. #ifdef WC_16BIT_CPU
  65. typedef int sword16;
  66. typedef unsigned int word16;
  67. typedef long sword32;
  68. typedef unsigned long word32;
  69. #else
  70. typedef short sword16;
  71. typedef unsigned short word16;
  72. typedef int sword32;
  73. typedef unsigned int word32;
  74. #endif
  75. typedef byte word24[3];
  76. #endif
  77. /* constant pointer to a constant char */
  78. #ifdef WOLFSSL_NO_CONSTCHARCONST
  79. typedef const char* wcchar;
  80. #else
  81. typedef const char* const wcchar;
  82. #endif
  83. #ifndef HAVE_ANONYMOUS_INLINE_AGGREGATES
  84. /* if a version is available, pivot on the version, otherwise guess it's
  85. * allowed, subject to override.
  86. */
  87. #if !defined(__STDC__) \
  88. || (!defined(__STDC_VERSION__) && !defined(__cplusplus)) \
  89. || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201101L)) \
  90. || (defined(__cplusplus) && (__cplusplus >= 201103L))
  91. #define HAVE_ANONYMOUS_INLINE_AGGREGATES 1
  92. #else
  93. #define HAVE_ANONYMOUS_INLINE_AGGREGATES 0
  94. #endif
  95. #endif
  96. /* helpers for stringifying the expanded value of a macro argument rather
  97. * than its literal text:
  98. */
  99. #define _WC_STRINGIFY_L2(str) #str
  100. #define WC_STRINGIFY(str) _WC_STRINGIFY_L2(str)
  101. /* try to set SIZEOF_LONG or SIZEOF_LONG_LONG if user didn't */
  102. #if defined(_MSC_VER) || defined(HAVE_LIMITS_H)
  103. /* make sure both SIZEOF_LONG_LONG and SIZEOF_LONG are set,
  104. * otherwise causes issues with CTC_SETTINGS */
  105. #if !defined(SIZEOF_LONG_LONG) || !defined(SIZEOF_LONG)
  106. #include <limits.h>
  107. #if !defined(SIZEOF_LONG) && defined(ULONG_MAX) && \
  108. (ULONG_MAX == 0xffffffffUL)
  109. #define SIZEOF_LONG 4
  110. #endif
  111. #if !defined(SIZEOF_LONG_LONG) && defined(ULLONG_MAX) && \
  112. (ULLONG_MAX == 0xffffffffffffffffULL)
  113. #define SIZEOF_LONG_LONG 8
  114. #endif
  115. #endif
  116. #elif !defined(__BCPLUSPLUS__) && !defined(__EMSCRIPTEN__)
  117. #if !defined(SIZEOF_LONG_LONG) && !defined(SIZEOF_LONG)
  118. #if (defined(__alpha__) || defined(__ia64__) || \
  119. defined(_ARCH_PPC64) || defined(__mips64) || \
  120. defined(__x86_64__) || defined(__s390x__ ) || \
  121. ((defined(sun) || defined(__sun)) && \
  122. (defined(LP64) || defined(_LP64))))
  123. /* long should be 64bit */
  124. #define SIZEOF_LONG 8
  125. #elif defined(__i386__) || defined(__CORTEX_M3__)
  126. /* long long should be 64bit */
  127. #define SIZEOF_LONG_LONG 8
  128. #endif
  129. #endif
  130. #endif
  131. #if defined(_MSC_VER) || defined(__BCPLUSPLUS__)
  132. #define WORD64_AVAILABLE
  133. #define W64LIT(x) x##ui64
  134. typedef __int64 sword64;
  135. typedef unsigned __int64 word64;
  136. #elif defined(__EMSCRIPTEN__)
  137. #define WORD64_AVAILABLE
  138. #define W64LIT(x) x##ull
  139. typedef long long sword64;
  140. typedef unsigned long long word64;
  141. #elif defined(SIZEOF_LONG) && SIZEOF_LONG == 8
  142. #define WORD64_AVAILABLE
  143. #define W64LIT(x) x##LL
  144. typedef long sword64;
  145. typedef unsigned long word64;
  146. #elif defined(SIZEOF_LONG_LONG) && SIZEOF_LONG_LONG == 8
  147. #define WORD64_AVAILABLE
  148. #define W64LIT(x) x##LL
  149. typedef long long sword64;
  150. typedef unsigned long long word64;
  151. #elif defined(__SIZEOF_LONG_LONG__) && __SIZEOF_LONG_LONG__ == 8
  152. #define WORD64_AVAILABLE
  153. #define W64LIT(x) x##LL
  154. typedef long long sword64;
  155. typedef unsigned long long word64;
  156. #endif
  157. #if defined(WORD64_AVAILABLE) && !defined(WC_16BIT_CPU)
  158. /* These platforms have 64-bit CPU registers. */
  159. #if (defined(__alpha__) || defined(__ia64__) || defined(_ARCH_PPC64) || \
  160. defined(__mips64) || defined(__x86_64__) || defined(_M_X64)) || \
  161. defined(__aarch64__) || defined(__sparc64__) || defined(__s390x__ ) || \
  162. (defined(__riscv_xlen) && (__riscv_xlen == 64)) || defined(_M_ARM64)
  163. #define WC_64BIT_CPU
  164. #elif (defined(sun) || defined(__sun)) && \
  165. (defined(LP64) || defined(_LP64))
  166. /* LP64 with GNU GCC compiler is reserved for when long int is 64 bits
  167. * and int uses 32 bits. When using Solaris Studio sparc and __sparc are
  168. * available for 32 bit detection but __sparc64__ could be missed. This
  169. * uses LP64 for checking 64 bit CPU arch. */
  170. #define WC_64BIT_CPU
  171. #else
  172. #define WC_32BIT_CPU
  173. #endif
  174. #if defined(NO_64BIT)
  175. typedef word32 wolfssl_word;
  176. #undef WORD64_AVAILABLE
  177. #else
  178. #ifdef WC_64BIT_CPU
  179. typedef word64 wolfssl_word;
  180. #else
  181. typedef word32 wolfssl_word;
  182. #ifdef WORD64_AVAILABLE
  183. #define WOLFCRYPT_SLOW_WORD64
  184. #endif
  185. #endif
  186. #endif
  187. #elif defined(WC_16BIT_CPU)
  188. #undef WORD64_AVAILABLE
  189. typedef word16 wolfssl_word;
  190. #define MP_16BIT /* for mp_int, mp_word needs to be twice as big as \
  191. * mp_digit, no 64 bit type so make mp_digit 16 bit */
  192. #else
  193. #undef WORD64_AVAILABLE
  194. typedef word32 wolfssl_word;
  195. #define MP_16BIT /* for mp_int, mp_word needs to be twice as big as \
  196. * mp_digit, no 64 bit type so make mp_digit 16 bit */
  197. #endif
  198. typedef struct w64wrapper {
  199. #if defined(WORD64_AVAILABLE) && !defined(WOLFSSL_W64_WRAPPER_TEST)
  200. word64 n;
  201. #else
  202. word32 n[2];
  203. #endif /* WORD64_AVAILABLE && WOLFSSL_W64_WRAPPER_TEST */
  204. } w64wrapper;
  205. #ifdef WC_PTR_TYPE /* Allow user supplied type */
  206. typedef WC_PTR_TYPE wc_ptr_t;
  207. #elif defined(HAVE_UINTPTR_T)
  208. #include <stdint.h>
  209. typedef uintptr_t wc_ptr_t;
  210. #else /* fallback to architecture size_t for pointer size */
  211. #include <stddef.h> /* included for getting size_t type */
  212. typedef size_t wc_ptr_t;
  213. #endif
  214. enum {
  215. WOLFSSL_WORD_SIZE = sizeof(wolfssl_word),
  216. WOLFSSL_BIT_SIZE = 8,
  217. WOLFSSL_WORD_BITS = WOLFSSL_WORD_SIZE * WOLFSSL_BIT_SIZE
  218. };
  219. #define WOLFSSL_MAX_16BIT 0xffffU
  220. /* use inlining if compiler allows */
  221. #ifndef WC_INLINE
  222. #ifndef NO_INLINE
  223. #ifdef _MSC_VER
  224. #define WC_INLINE __inline
  225. #elif defined(__GNUC__)
  226. #ifdef WOLFSSL_VXWORKS
  227. #define WC_INLINE __inline__
  228. #else
  229. #define WC_INLINE inline
  230. #endif
  231. #elif defined(__IAR_SYSTEMS_ICC__)
  232. #define WC_INLINE inline
  233. #elif defined(THREADX)
  234. #define WC_INLINE _Inline
  235. #elif defined(__ghc__)
  236. #ifndef __cplusplus
  237. #define WC_INLINE __inline
  238. #else
  239. #define WC_INLINE inline
  240. #endif
  241. #elif defined(__CCRX__)
  242. #define WC_INLINE inline
  243. #elif defined(__DCC__)
  244. #ifndef __cplusplus
  245. #define WC_INLINE __inline__
  246. #else
  247. #define WC_INLINE inline
  248. #endif
  249. #else
  250. #define WC_INLINE
  251. #endif
  252. #else
  253. #ifdef __GNUC__
  254. #define WC_INLINE __attribute__((unused))
  255. #else
  256. #define WC_INLINE
  257. #endif
  258. #endif
  259. #endif
  260. #if defined(HAVE_FIPS) || defined(HAVE_SELFTEST)
  261. #define INLINE WC_INLINE
  262. #endif
  263. /* set up rotate style */
  264. #if (defined(_MSC_VER) || defined(__BCPLUSPLUS__)) && \
  265. !defined(WOLFSSL_SGX) && !defined(INTIME_RTOS)
  266. #define INTEL_INTRINSICS
  267. #define FAST_ROTATE
  268. #elif defined(__MWERKS__) && TARGET_CPU_PPC
  269. #define PPC_INTRINSICS
  270. #define FAST_ROTATE
  271. #elif defined(__CCRX__)
  272. #define FAST_ROTATE
  273. #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
  274. /* GCC does peephole optimizations which should result in using rotate
  275. instructions */
  276. #define FAST_ROTATE
  277. #endif
  278. /* set up thread local storage if available */
  279. #ifdef HAVE_THREAD_LS
  280. #if defined(_MSC_VER)
  281. #define THREAD_LS_T __declspec(thread)
  282. /* Thread local storage only in FreeRTOS v8.2.1 and higher */
  283. #elif defined(FREERTOS) || defined(FREERTOS_TCP) || \
  284. defined(WOLFSSL_ZEPHYR)
  285. #define THREAD_LS_T
  286. #else
  287. #define THREAD_LS_T __thread
  288. #endif
  289. #else
  290. #define THREAD_LS_T
  291. #endif
  292. #ifndef FALL_THROUGH
  293. /* GCC 7 has new switch() fall-through detection */
  294. #if defined(__GNUC__)
  295. #if defined(fallthrough)
  296. #define FALL_THROUGH fallthrough
  297. #elif ((__GNUC__ > 7) || ((__GNUC__ == 7) && (__GNUC_MINOR__ >= 1)))
  298. #define FALL_THROUGH ; __attribute__ ((fallthrough))
  299. #elif defined(__clang__) && defined(__clang_major__) && \
  300. (__clang_major__ >= 12)
  301. #define FALL_THROUGH ; __attribute__ ((fallthrough))
  302. #endif
  303. #endif
  304. #endif /* FALL_THROUGH */
  305. #if !defined(FALL_THROUGH) || defined(__XC32)
  306. /* use stub for fall through by default or for Microchip compiler */
  307. #undef FALL_THROUGH
  308. #define FALL_THROUGH
  309. #endif
  310. #ifndef WARN_UNUSED_RESULT
  311. #if defined(WOLFSSL_LINUXKM) && defined(__must_check)
  312. #define WARN_UNUSED_RESULT __must_check
  313. #elif defined(__GNUC__) && (__GNUC__ >= 4)
  314. #define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
  315. #else
  316. #define WARN_UNUSED_RESULT
  317. #endif
  318. #endif /* WARN_UNUSED_RESULT */
  319. #ifndef WC_MAYBE_UNUSED
  320. #if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__)
  321. #define WC_MAYBE_UNUSED __attribute__((unused))
  322. #else
  323. #define WC_MAYBE_UNUSED
  324. #endif
  325. #endif /* WC_MAYBE_UNUSED */
  326. /* Micrium will use Visual Studio for compilation but not the Win32 API */
  327. #if defined(_WIN32) && !defined(MICRIUM) && !defined(FREERTOS) && \
  328. !defined(FREERTOS_TCP) && !defined(EBSNET) && \
  329. !defined(WOLFSSL_UTASKER) && !defined(INTIME_RTOS)
  330. #define USE_WINDOWS_API
  331. #endif
  332. #define XSTR_SIZEOF(x) (sizeof(x) - 1) /* -1 to not count the null char */
  333. /* idea to add global alloc override by Moises Guimaraes */
  334. /* default to libc stuff */
  335. /* XREALLOC is used once in normal math lib, not in fast math lib */
  336. /* XFREE on some embedded systems doesn't like free(0) so test */
  337. #if defined(HAVE_IO_POOL)
  338. WOLFSSL_API void* XMALLOC(size_t n, void* heap, int type);
  339. WOLFSSL_API void* XREALLOC(void *p, size_t n, void* heap, int type);
  340. WOLFSSL_API void XFREE(void *p, void* heap, int type);
  341. #elif (defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_INTEL_QA)) || \
  342. defined(HAVE_INTEL_QA_SYNC)
  343. #ifndef HAVE_INTEL_QA_SYNC
  344. #include <wolfssl/wolfcrypt/port/intel/quickassist_mem.h>
  345. #undef USE_WOLFSSL_MEMORY
  346. #ifdef WOLFSSL_DEBUG_MEMORY
  347. #define XMALLOC(s, h, t) IntelQaMalloc((s), (h), (t), __func__, __LINE__)
  348. #define XFREE(p, h, t) IntelQaFree((p), (h), (t), __func__, __LINE__)
  349. #define XREALLOC(p, n, h, t) IntelQaRealloc((p), (n), (h), (t), __func__, __LINE__)
  350. #else
  351. #define XMALLOC(s, h, t) IntelQaMalloc((s), (h), (t))
  352. #define XFREE(p, h, t) IntelQaFree((p), (h), (t))
  353. #define XREALLOC(p, n, h, t) IntelQaRealloc((p), (n), (h), (t))
  354. #endif /* WOLFSSL_DEBUG_MEMORY */
  355. #else
  356. #include <wolfssl/wolfcrypt/port/intel/quickassist_sync.h>
  357. #undef USE_WOLFSSL_MEMORY
  358. #ifdef WOLFSSL_DEBUG_MEMORY
  359. #define XMALLOC(s, h, t) wc_CryptoCb_IntelQaMalloc((s), (h), (t), __func__, __LINE__)
  360. #define XFREE(p, h, t) wc_CryptoCb_IntelQaFree((p), (h), (t), __func__, __LINE__)
  361. #define XREALLOC(p, n, h, t) wc_CryptoCb_IntelQaRealloc((p), (n), (h), (t), __func__, __LINE__)
  362. #else
  363. #define XMALLOC(s, h, t) wc_CryptoCb_IntelQaMalloc((s), (h), (t))
  364. #define XFREE(p, h, t) wc_CryptoCb_IntelQaFree((p), (h), (t))
  365. #define XREALLOC(p, n, h, t) wc_CryptoCb_IntelQaRealloc((p), (n), (h), (t))
  366. #endif /* WOLFSSL_DEBUG_MEMORY */
  367. #endif
  368. #elif defined(XMALLOC_USER)
  369. /* prototypes for user heap override functions */
  370. #include <stddef.h> /* for size_t */
  371. extern void *XMALLOC(size_t n, void* heap, int type);
  372. extern void *XREALLOC(void *p, size_t n, void* heap, int type);
  373. extern void XFREE(void *p, void* heap, int type);
  374. #elif defined(WOLFSSL_MEMORY_LOG)
  375. #define XMALLOC(n, h, t) xmalloc(n, h, t, __func__, __FILE__, __LINE__)
  376. #define XREALLOC(p, n, h, t) xrealloc(p, n, h, t, __func__, __FILE__, __LINE__)
  377. #define XFREE(p, h, t) xfree(p, h, t, __func__, __FILE__, __LINE__)
  378. /* prototypes for user heap override functions */
  379. #include <stddef.h> /* for size_t */
  380. #include <stdlib.h>
  381. WOLFSSL_API void *xmalloc(size_t n, void* heap, int type,
  382. const char* func, const char* file, unsigned int line);
  383. WOLFSSL_API void *xrealloc(void *p, size_t n, void* heap, int type,
  384. const char* func, const char* file, unsigned int line);
  385. WOLFSSL_API void xfree(void *p, void* heap, int type, const char* func,
  386. const char* file, unsigned int line);
  387. #elif defined(XMALLOC_OVERRIDE)
  388. /* override the XMALLOC, XFREE and XREALLOC macros */
  389. #elif defined(WOLFSSL_TELIT_M2MB)
  390. /* Telit M2MB SDK requires use m2mb_os API's, not std malloc/free */
  391. /* Use of malloc/free will cause CPU reboot */
  392. #define XMALLOC(s, h, t) ((void)h, (void)t, m2mb_os_malloc((s)))
  393. #ifdef WOLFSSL_XFREE_NO_NULLNESS_CHECK
  394. #define XFREE(p, h, t) m2mb_os_free(xp)
  395. #else
  396. #define XFREE(p, h, t) {void* xp = (p); if (xp) m2mb_os_free(xp);}
  397. #endif
  398. #define XREALLOC(p, n, h, t) m2mb_os_realloc((p), (n))
  399. #elif defined(NO_WOLFSSL_MEMORY)
  400. #ifdef WOLFSSL_NO_MALLOC
  401. /* this platform does not support heap use */
  402. #ifdef WOLFSSL_MALLOC_CHECK
  403. #include <stdio.h>
  404. static inline void* malloc_check(size_t sz) {
  405. fprintf(stderr, "wolfSSL_malloc failed");
  406. return NULL;
  407. };
  408. #define XMALLOC(s, h, t) malloc_check((s))
  409. #define XFREE(p, h, t)
  410. #define XREALLOC(p, n, h, t) (NULL)
  411. #else
  412. #define XMALLOC(s, h, t) (NULL)
  413. #define XFREE(p, h, t)
  414. #define XREALLOC(p, n, h, t) (NULL)
  415. #endif
  416. #else
  417. /* just use plain C stdlib stuff if desired */
  418. #include <stdlib.h>
  419. #define XMALLOC(s, h, t) malloc((size_t)(s))
  420. #ifdef WOLFSSL_XFREE_NO_NULLNESS_CHECK
  421. #define XFREE(p, h, t) free(xp)
  422. #else
  423. #define XFREE(p, h, t) {void* xp = (p); if (xp) free(xp);}
  424. #endif
  425. #define XREALLOC(p, n, h, t) realloc((p), (size_t)(n))
  426. #endif
  427. #elif defined(WOLFSSL_LINUXKM)
  428. /* definitions are in linuxkm/linuxkm_wc_port.h */
  429. #elif !defined(MICRIUM_MALLOC) && !defined(EBSNET) \
  430. && !defined(WOLFSSL_SAFERTOS) && !defined(FREESCALE_MQX) \
  431. && !defined(FREESCALE_KSDK_MQX) && !defined(FREESCALE_FREE_RTOS) \
  432. && !defined(WOLFSSL_LEANPSK) && !defined(WOLFSSL_uITRON4)
  433. /* default C runtime, can install different routines at runtime via cbs */
  434. #ifndef WOLFSSL_MEMORY_H
  435. #include <wolfssl/wolfcrypt/memory.h>
  436. #endif
  437. #ifdef WOLFSSL_STATIC_MEMORY
  438. #ifdef WOLFSSL_DEBUG_MEMORY
  439. #define XMALLOC(s, h, t) wolfSSL_Malloc((s), (h), (t), __func__, __LINE__)
  440. #ifdef WOLFSSL_XFREE_NO_NULLNESS_CHECK
  441. #define XFREE(p, h, t) wolfSSL_Free(xp, h, t, __func__, __LINE__)
  442. #else
  443. #define XFREE(p, h, t) {void* xp = (p); if (xp) wolfSSL_Free(xp, h, t, __func__, __LINE__);}
  444. #endif
  445. #define XREALLOC(p, n, h, t) wolfSSL_Realloc((p), (n), (h), (t), __func__, __LINE__)
  446. #else
  447. #define XMALLOC(s, h, t) wolfSSL_Malloc((s), (h), (t))
  448. #ifdef WOLFSSL_XFREE_NO_NULLNESS_CHECK
  449. #define XFREE(p, h, t) wolfSSL_Free(xp, h, t)
  450. #else
  451. #define XFREE(p, h, t) {void* xp = (p); if (xp) wolfSSL_Free(xp, h, t);}
  452. #endif
  453. #define XREALLOC(p, n, h, t) wolfSSL_Realloc((p), (n), (h), (t))
  454. #endif /* WOLFSSL_DEBUG_MEMORY */
  455. #elif (!defined(FREERTOS) && !defined(FREERTOS_TCP)) || defined(WOLFSSL_TRACK_MEMORY)
  456. #ifdef WOLFSSL_DEBUG_MEMORY
  457. #define XMALLOC(s, h, t) ((void)(h), (void)(t), wolfSSL_Malloc((s), __func__, __LINE__))
  458. #ifdef WOLFSSL_XFREE_NO_NULLNESS_CHECK
  459. #define XFREE(p, h, t) wolfSSL_Free(xp, __func__, __LINE__)
  460. #else
  461. #define XFREE(p, h, t) {void* xp = (p); if (xp) wolfSSL_Free(xp, __func__, __LINE__);}
  462. #endif
  463. #define XREALLOC(p, n, h, t) wolfSSL_Realloc((p), (n), __func__, __LINE__)
  464. #else
  465. #define XMALLOC(s, h, t) ((void)(h), (void)(t), wolfSSL_Malloc((s)))
  466. #ifdef WOLFSSL_XFREE_NO_NULLNESS_CHECK
  467. #define XFREE(p, h, t) wolfSSL_Free(p)
  468. #else
  469. #define XFREE(p, h, t) {void* xp = (p); if (xp) wolfSSL_Free(xp);}
  470. #endif
  471. #define XREALLOC(p, n, h, t) wolfSSL_Realloc((p), (n))
  472. #endif /* WOLFSSL_DEBUG_MEMORY */
  473. #endif /* WOLFSSL_STATIC_MEMORY */
  474. #endif
  475. /* declare/free variable handling for async and smallstack */
  476. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_SMALL_STACK)
  477. #define WC_DECLARE_VAR_IS_HEAP_ALLOC
  478. #define WC_DECLARE_VAR(VAR_NAME, VAR_TYPE, VAR_SIZE, HEAP) \
  479. VAR_TYPE* VAR_NAME = (VAR_TYPE*)XMALLOC(sizeof(VAR_TYPE) * (VAR_SIZE), (HEAP), DYNAMIC_TYPE_WOLF_BIGINT)
  480. #define WC_DECLARE_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \
  481. VAR_TYPE* VAR_NAME[VAR_ITEMS]; \
  482. int idx##VAR_NAME, inner_idx_##VAR_NAME
  483. #define WC_INIT_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \
  484. for (idx##VAR_NAME=0; idx##VAR_NAME<(VAR_ITEMS); idx##VAR_NAME++) { \
  485. (VAR_NAME)[idx##VAR_NAME] = (VAR_TYPE*)XMALLOC(VAR_SIZE, (HEAP), DYNAMIC_TYPE_WOLF_BIGINT); \
  486. if ((VAR_NAME)[idx##VAR_NAME] == NULL) { \
  487. for (inner_idx_##VAR_NAME = 0; inner_idx_##VAR_NAME < idx##VAR_NAME; inner_idx_##VAR_NAME++) { \
  488. XFREE((VAR_NAME)[inner_idx_##VAR_NAME], (HEAP), DYNAMIC_TYPE_WOLF_BIGINT); \
  489. (VAR_NAME)[inner_idx_##VAR_NAME] = NULL; \
  490. } \
  491. for (inner_idx_##VAR_NAME = idx##VAR_NAME + 1; inner_idx_##VAR_NAME < (VAR_ITEMS); inner_idx_##VAR_NAME++) { \
  492. (VAR_NAME)[inner_idx_##VAR_NAME] = NULL; \
  493. } \
  494. break; \
  495. } \
  496. }
  497. #define WC_FREE_VAR(VAR_NAME, HEAP) \
  498. XFREE(VAR_NAME, (HEAP), DYNAMIC_TYPE_WOLF_BIGINT)
  499. #define WC_FREE_ARRAY(VAR_NAME, VAR_ITEMS, HEAP) \
  500. for (idx##VAR_NAME=0; idx##VAR_NAME<(VAR_ITEMS); idx##VAR_NAME++) { \
  501. XFREE((VAR_NAME)[idx##VAR_NAME], (HEAP), DYNAMIC_TYPE_WOLF_BIGINT); \
  502. }
  503. #define WC_DECLARE_ARRAY_DYNAMIC_DEC(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \
  504. WC_DECLARE_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP)
  505. #define WC_DECLARE_ARRAY_DYNAMIC_EXE(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \
  506. WC_INIT_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP)
  507. #define WC_FREE_ARRAY_DYNAMIC(VAR_NAME, VAR_ITEMS, HEAP) \
  508. WC_FREE_ARRAY(VAR_NAME, VAR_ITEMS, HEAP)
  509. #else
  510. #undef WC_DECLARE_VAR_IS_HEAP_ALLOC
  511. #define WC_DECLARE_VAR(VAR_NAME, VAR_TYPE, VAR_SIZE, HEAP) \
  512. VAR_TYPE VAR_NAME[VAR_SIZE]
  513. #define WC_DECLARE_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \
  514. VAR_TYPE VAR_NAME[VAR_ITEMS][VAR_SIZE]
  515. #define WC_INIT_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) do {} while(0)
  516. #define WC_FREE_VAR(VAR_NAME, HEAP) /* nothing to free, its stack */
  517. #define WC_FREE_ARRAY(VAR_NAME, VAR_ITEMS, HEAP) /* nothing to free, its stack */
  518. #define WC_DECLARE_ARRAY_DYNAMIC_DEC(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \
  519. VAR_TYPE* VAR_NAME[VAR_ITEMS]; \
  520. int idx##VAR_NAME, inner_idx_##VAR_NAME
  521. #define WC_DECLARE_ARRAY_DYNAMIC_EXE(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \
  522. for (idx##VAR_NAME=0; idx##VAR_NAME<(VAR_ITEMS); idx##VAR_NAME++) { \
  523. (VAR_NAME)[idx##VAR_NAME] = (VAR_TYPE*)XMALLOC(VAR_SIZE, (HEAP), DYNAMIC_TYPE_TMP_BUFFER); \
  524. if ((VAR_NAME)[idx##VAR_NAME] == NULL) { \
  525. for (inner_idx_##VAR_NAME = 0; inner_idx_##VAR_NAME < idx##VAR_NAME; inner_idx_##VAR_NAME++) { \
  526. XFREE((VAR_NAME)[inner_idx_##VAR_NAME], HEAP, DYNAMIC_TYPE_TMP_BUFFER); \
  527. (VAR_NAME)[inner_idx_##VAR_NAME] = NULL; \
  528. } \
  529. for (inner_idx_##VAR_NAME = idx##VAR_NAME + 1; inner_idx_##VAR_NAME < (VAR_ITEMS); inner_idx_##VAR_NAME++) { \
  530. (VAR_NAME)[inner_idx_##VAR_NAME] = NULL; \
  531. } \
  532. break; \
  533. } \
  534. }
  535. #define WC_FREE_ARRAY_DYNAMIC(VAR_NAME, VAR_ITEMS, HEAP) \
  536. for (idx##VAR_NAME=0; idx##VAR_NAME<(VAR_ITEMS); idx##VAR_NAME++) { \
  537. XFREE((VAR_NAME)[idx##VAR_NAME], (HEAP), DYNAMIC_TYPE_TMP_BUFFER); \
  538. }
  539. #endif
  540. #if defined(HAVE_FIPS) || defined(HAVE_SELFTEST)
  541. /* These are here for the FIPS code that can't be changed. New definitions don't need to be added here. */
  542. #define DECLARE_VAR WC_DECLARE_VAR
  543. #define DECLARE_ARRAY WC_DECLARE_ARRAY
  544. #define FREE_VAR WC_FREE_VAR
  545. #define FREE_ARRAY WC_FREE_ARRAY
  546. #define DECLARE_ARRAY_DYNAMIC_DEC WC_DECLARE_ARRAY_DYNAMIC_DEC
  547. #define DECLARE_ARRAY_DYNAMIC_EXE WC_DECLARE_ARRAY_DYNAMIC_EXE
  548. #define FREE_ARRAY_DYNAMIC WC_FREE_ARRAY_DYNAMIC
  549. #endif /* HAVE_FIPS */
  550. #if !defined(USE_WOLF_STRTOK) && \
  551. ((defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) || \
  552. defined(WOLFSSL_TIRTOS) || defined(WOLF_C99))
  553. #define USE_WOLF_STRTOK
  554. #endif
  555. #if !defined(USE_WOLF_STRSEP) && (defined(WOLF_C99))
  556. #define USE_WOLF_STRSEP
  557. #endif
  558. #if !defined(XSTRLCPY) && !defined(USE_WOLF_STRLCPY)
  559. #define USE_WOLF_STRLCPY
  560. #endif
  561. #if !defined(XSTRLCAT) && !defined(USE_WOLF_STRLCAT)
  562. #define USE_WOLF_STRLCAT
  563. #endif
  564. #ifndef STRING_USER
  565. #if defined(WOLFSSL_LINUXKM)
  566. #include <linux/string.h>
  567. #else
  568. #include <string.h>
  569. #endif
  570. #define XMEMCPY(d,s,l) memcpy((d),(s),(l))
  571. #define XMEMSET(b,c,l) memset((b),(c),(l))
  572. #define XMEMCMP(s1,s2,n) memcmp((s1),(s2),(n))
  573. #define XMEMMOVE(d,s,l) memmove((d),(s),(l))
  574. #define XSTRLEN(s1) strlen((s1))
  575. #define XSTRNCPY(s1,s2,n) strncpy((s1),(s2),(n))
  576. /* strstr, strncmp, strcmp, and strncat only used by wolfSSL proper,
  577. * not required for wolfCrypt only */
  578. #define XSTRSTR(s1,s2) strstr((s1),(s2))
  579. #define XSTRNSTR(s1,s2,n) mystrnstr((s1),(s2),(n))
  580. #define XSTRNCMP(s1,s2,n) strncmp((s1),(s2),(n))
  581. #define XSTRCMP(s1,s2) strcmp((s1),(s2))
  582. #define XSTRNCAT(s1,s2,n) strncat((s1),(s2),(n))
  583. #ifdef USE_WOLF_STRSEP
  584. #define XSTRSEP(s1,d) wc_strsep((s1),(d))
  585. #else
  586. #define XSTRSEP(s1,d) strsep((s1),(d))
  587. #endif
  588. #ifndef XSTRCASECMP
  589. #if defined(MICROCHIP_PIC32) && (__XC32_VERSION >= 1000)
  590. /* XC32 supports str[n]casecmp in version >= 1.0. */
  591. #define XSTRCASECMP(s1,s2) strcasecmp((s1),(s2))
  592. #elif defined(MICROCHIP_PIC32) || defined(WOLFSSL_TIRTOS) || \
  593. defined(WOLFSSL_ZEPHYR)
  594. /* XC32 version < 1.0 does not support strcasecmp, so use
  595. * case sensitive one.
  596. */
  597. #define XSTRCASECMP(s1,s2) strcmp((s1),(s2))
  598. #elif defined(USE_WINDOWS_API) || defined(FREERTOS_TCP_WINSIM)
  599. #define XSTRCASECMP(s1,s2) _stricmp((s1),(s2))
  600. #else
  601. #if defined(HAVE_STRINGS_H) && defined(WOLF_C99) && \
  602. !defined(WOLFSSL_SGX)
  603. #include <strings.h>
  604. #endif
  605. #if defined(WOLFSSL_DEOS)
  606. #define XSTRCASECMP(s1,s2) stricmp((s1),(s2))
  607. #elif defined(WOLFSSL_CMSIS_RTOSv2) || defined(WOLFSSL_AZSPHERE)
  608. #define XSTRCASECMP(s1,s2) strcmp((s1),(s2))
  609. #elif defined(WOLF_C89)
  610. #define XSTRCASECMP(s1,s2) strcmp((s1),(s2))
  611. #else
  612. #define XSTRCASECMP(s1,s2) strcasecmp((s1),(s2))
  613. #endif
  614. #endif
  615. #endif /* !XSTRCASECMP */
  616. #ifndef XSTRNCASECMP
  617. #if defined(MICROCHIP_PIC32) && (__XC32_VERSION >= 1000)
  618. /* XC32 supports str[n]casecmp in version >= 1.0. */
  619. #define XSTRNCASECMP(s1,s2,n) strncasecmp((s1),(s2),(n))
  620. #elif defined(MICROCHIP_PIC32) || defined(WOLFSSL_TIRTOS) || \
  621. defined(WOLFSSL_ZEPHYR)
  622. /* XC32 version < 1.0 does not support strncasecmp, so use case
  623. * sensitive one.
  624. */
  625. #define XSTRNCASECMP(s1,s2,n) strncmp((s1),(s2),(n))
  626. #elif defined(USE_WINDOWS_API) || defined(FREERTOS_TCP_WINSIM)
  627. #define XSTRNCASECMP(s1,s2,n) _strnicmp((s1),(s2),(n))
  628. #else
  629. #if defined(HAVE_STRINGS_H) && defined(WOLF_C99) && \
  630. !defined(WOLFSSL_SGX)
  631. #include <strings.h>
  632. #endif
  633. #if defined(WOLFSSL_DEOS)
  634. #define XSTRNCASECMP(s1,s2,n) strnicmp((s1),(s2),(n))
  635. #elif defined(WOLFSSL_CMSIS_RTOSv2) || defined(WOLFSSL_AZSPHERE)
  636. #define XSTRNCASECMP(s1,s2,n) strncmp((s1),(s2),(n))
  637. #elif defined(WOLF_C89)
  638. #define XSTRNCASECMP(s1,s2,n) strncmp((s1),(s2),(n))
  639. #else
  640. #define XSTRNCASECMP(s1,s2,n) strncasecmp((s1),(s2),(n))
  641. #endif
  642. #endif
  643. #endif /* !XSTRNCASECMP */
  644. /* snprintf is used in asn.c for GetTimeString, PKCS7 test, and when
  645. debugging is turned on */
  646. #ifndef USE_WINDOWS_API
  647. #ifndef XSNPRINTF
  648. #if defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) && \
  649. (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  650. defined(WOLFSSL_CERT_EXT) || defined(HAVE_PKCS7))
  651. /* case where stdio is not included else where but is needed
  652. for snprintf */
  653. #include <stdio.h>
  654. #endif
  655. #if defined(WOLFSSL_ESPIDF) && \
  656. (!defined(NO_ASN_TIME) && defined(HAVE_PKCS7))
  657. #include<stdarg.h>
  658. /* later gcc than 7.1 introduces -Wformat-truncation */
  659. /* In cases when truncation is expected the caller needs*/
  660. /* to check the return value from the function so that */
  661. /* compiler doesn't complain. */
  662. /* xtensa-esp32-elf v8.2.0 warns truncation at */
  663. /* GetAsnTimeString() */
  664. static WC_INLINE
  665. int _xsnprintf_(char *s, size_t n, const char *format, ...)
  666. {
  667. va_list ap;
  668. int ret;
  669. if ((int)n <= 0) return -1;
  670. va_start(ap, format);
  671. ret = XVSNPRINTF(s, n, format, ap);
  672. if (ret < 0)
  673. ret = -1;
  674. va_end(ap);
  675. return ret;
  676. }
  677. #define XSNPRINTF _xsnprintf_
  678. #elif defined(WOLF_C89)
  679. #define XSPRINTF sprintf
  680. #else
  681. #define XSNPRINTF snprintf
  682. #endif
  683. #endif
  684. #else
  685. #if defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__)
  686. #if defined(_MSC_VER) && (_MSC_VER >= 1900)
  687. /* Beginning with the UCRT in Visual Studio 2015 and
  688. Windows 10, snprintf is no longer identical to
  689. _snprintf. The snprintf function behavior is now
  690. C99 standard compliant. */
  691. #include <stdio.h>
  692. #define XSNPRINTF snprintf
  693. #else
  694. /* 4996 warning to use MS extensions e.g., _sprintf_s
  695. instead of _snprintf */
  696. #if !defined(__MINGW32__)
  697. #pragma warning(disable: 4996)
  698. #endif
  699. static WC_INLINE
  700. int xsnprintf(char *buffer, size_t bufsize,
  701. const char *format, ...) {
  702. va_list ap;
  703. int ret;
  704. if ((int)bufsize <= 0) return -1;
  705. va_start(ap, format);
  706. ret = XVSNPRINTF(buffer, bufsize, format, ap);
  707. if (ret >= (int)bufsize)
  708. ret = -1;
  709. va_end(ap);
  710. return ret;
  711. }
  712. #define XSNPRINTF xsnprintf
  713. #endif /* (_MSC_VER >= 1900) */
  714. #else
  715. #define XSNPRINTF snprintf
  716. #endif /* _MSC_VER */
  717. #endif /* USE_WINDOWS_API */
  718. #if defined(WOLFSSL_CERT_EXT) || defined(OPENSSL_EXTRA) || \
  719. defined(HAVE_ALPN) || defined(WOLFSSL_SNIFFER)
  720. /* use only Thread Safe version of strtok */
  721. #if defined(USE_WOLF_STRTOK)
  722. #define XSTRTOK(s1,d,ptr) wc_strtok((s1),(d),(ptr))
  723. #elif defined(USE_WINDOWS_API) || defined(INTIME_RTOS)
  724. #define XSTRTOK(s1,d,ptr) strtok_s((s1),(d),(ptr))
  725. #else
  726. #define XSTRTOK(s1,d,ptr) strtok_r((s1),(d),(ptr))
  727. #endif
  728. #endif
  729. #if defined(WOLFSSL_CERT_EXT) || defined(HAVE_OCSP) || \
  730. defined(HAVE_CRL_IO) || defined(HAVE_HTTP_CLIENT) || \
  731. !defined(NO_CRYPT_BENCHMARK)
  732. #ifndef XATOI /* if custom XATOI is not already defined */
  733. #include <stdlib.h>
  734. #define XATOI(s) atoi((s))
  735. #endif
  736. #endif
  737. #endif
  738. #ifdef USE_WOLF_STRTOK
  739. WOLFSSL_API char* wc_strtok(char *str, const char *delim, char **nextp);
  740. #endif
  741. #ifdef USE_WOLF_STRSEP
  742. WOLFSSL_API char* wc_strsep(char **stringp, const char *delim);
  743. #endif
  744. #ifdef USE_WOLF_STRLCPY
  745. WOLFSSL_API size_t wc_strlcpy(char *dst, const char *src, size_t dstSize);
  746. #define XSTRLCPY(s1,s2,n) wc_strlcpy((s1),(s2),(n))
  747. #endif
  748. #ifdef USE_WOLF_STRLCAT
  749. WOLFSSL_API size_t wc_strlcat(char *dst, const char *src, size_t dstSize);
  750. #define XSTRLCAT(s1,s2,n) wc_strlcat((s1),(s2),(n))
  751. #endif
  752. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  753. #ifndef XGETENV
  754. #include <stdlib.h>
  755. #define XGETENV getenv
  756. #endif
  757. #endif /* !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */
  758. #ifndef CTYPE_USER
  759. #ifndef WOLFSSL_LINUXKM
  760. #include <ctype.h>
  761. #endif
  762. #if defined(HAVE_ECC) || defined(HAVE_OCSP) || \
  763. defined(WOLFSSL_KEY_GEN) || !defined(NO_DSA) || \
  764. defined(OPENSSL_EXTRA)
  765. #define XTOUPPER(c) toupper((c))
  766. #endif
  767. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  768. #define XISALNUM(c) isalnum((c))
  769. #define XISASCII(c) isascii((c))
  770. #define XISSPACE(c) isspace((c))
  771. #endif
  772. /* needed by wolfSSL_check_domain_name() */
  773. #define XTOLOWER(c) tolower((c))
  774. #endif
  775. #ifndef OFFSETOF
  776. #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 4))
  777. #define OFFSETOF(type, field) __builtin_offsetof(type, field)
  778. #else
  779. #define OFFSETOF(type, field) ((size_t)&(((type *)0)->field))
  780. #endif
  781. #endif
  782. /* memory allocation types for user hints */
  783. enum {
  784. DYNAMIC_TYPE_CA = 1,
  785. DYNAMIC_TYPE_CERT = 2,
  786. DYNAMIC_TYPE_KEY = 3,
  787. DYNAMIC_TYPE_FILE = 4,
  788. DYNAMIC_TYPE_SUBJECT_CN = 5,
  789. DYNAMIC_TYPE_PUBLIC_KEY = 6,
  790. DYNAMIC_TYPE_SIGNER = 7,
  791. DYNAMIC_TYPE_NONE = 8,
  792. DYNAMIC_TYPE_BIGINT = 9,
  793. DYNAMIC_TYPE_RSA = 10,
  794. DYNAMIC_TYPE_METHOD = 11,
  795. DYNAMIC_TYPE_OUT_BUFFER = 12,
  796. DYNAMIC_TYPE_IN_BUFFER = 13,
  797. DYNAMIC_TYPE_INFO = 14,
  798. DYNAMIC_TYPE_DH = 15,
  799. DYNAMIC_TYPE_DOMAIN = 16,
  800. DYNAMIC_TYPE_SSL = 17,
  801. DYNAMIC_TYPE_CTX = 18,
  802. DYNAMIC_TYPE_WRITEV = 19,
  803. DYNAMIC_TYPE_OPENSSL = 20,
  804. DYNAMIC_TYPE_DSA = 21,
  805. DYNAMIC_TYPE_CRL = 22,
  806. DYNAMIC_TYPE_REVOKED = 23,
  807. DYNAMIC_TYPE_CRL_ENTRY = 24,
  808. DYNAMIC_TYPE_CERT_MANAGER = 25,
  809. DYNAMIC_TYPE_CRL_MONITOR = 26,
  810. DYNAMIC_TYPE_OCSP_STATUS = 27,
  811. DYNAMIC_TYPE_OCSP_ENTRY = 28,
  812. DYNAMIC_TYPE_ALTNAME = 29,
  813. DYNAMIC_TYPE_SUITES = 30,
  814. DYNAMIC_TYPE_CIPHER = 31,
  815. DYNAMIC_TYPE_RNG = 32,
  816. DYNAMIC_TYPE_ARRAYS = 33,
  817. DYNAMIC_TYPE_DTLS_POOL = 34,
  818. DYNAMIC_TYPE_SOCKADDR = 35,
  819. DYNAMIC_TYPE_LIBZ = 36,
  820. DYNAMIC_TYPE_ECC = 37,
  821. DYNAMIC_TYPE_TMP_BUFFER = 38,
  822. DYNAMIC_TYPE_DTLS_MSG = 39,
  823. DYNAMIC_TYPE_X509 = 40,
  824. DYNAMIC_TYPE_TLSX = 41,
  825. DYNAMIC_TYPE_OCSP = 42,
  826. DYNAMIC_TYPE_SIGNATURE = 43,
  827. DYNAMIC_TYPE_HASHES = 44,
  828. DYNAMIC_TYPE_SRP = 45,
  829. DYNAMIC_TYPE_COOKIE_PWD = 46,
  830. DYNAMIC_TYPE_USER_CRYPTO = 47,
  831. DYNAMIC_TYPE_OCSP_REQUEST = 48,
  832. DYNAMIC_TYPE_X509_EXT = 49,
  833. DYNAMIC_TYPE_X509_STORE = 50,
  834. DYNAMIC_TYPE_X509_CTX = 51,
  835. DYNAMIC_TYPE_URL = 52,
  836. DYNAMIC_TYPE_DTLS_FRAG = 53,
  837. DYNAMIC_TYPE_DTLS_BUFFER = 54,
  838. DYNAMIC_TYPE_SESSION_TICK = 55,
  839. DYNAMIC_TYPE_PKCS = 56,
  840. DYNAMIC_TYPE_MUTEX = 57,
  841. DYNAMIC_TYPE_PKCS7 = 58,
  842. DYNAMIC_TYPE_AES_BUFFER = 59,
  843. DYNAMIC_TYPE_WOLF_BIGINT = 60,
  844. DYNAMIC_TYPE_ASN1 = 61,
  845. DYNAMIC_TYPE_LOG = 62,
  846. DYNAMIC_TYPE_WRITEDUP = 63,
  847. DYNAMIC_TYPE_PRIVATE_KEY = 64,
  848. DYNAMIC_TYPE_HMAC = 65,
  849. DYNAMIC_TYPE_ASYNC = 66,
  850. DYNAMIC_TYPE_ASYNC_NUMA = 67,
  851. DYNAMIC_TYPE_ASYNC_NUMA64 = 68,
  852. DYNAMIC_TYPE_CURVE25519 = 69,
  853. DYNAMIC_TYPE_ED25519 = 70,
  854. DYNAMIC_TYPE_SECRET = 71,
  855. DYNAMIC_TYPE_DIGEST = 72,
  856. DYNAMIC_TYPE_RSA_BUFFER = 73,
  857. DYNAMIC_TYPE_DCERT = 74,
  858. DYNAMIC_TYPE_STRING = 75,
  859. DYNAMIC_TYPE_PEM = 76,
  860. DYNAMIC_TYPE_DER = 77,
  861. DYNAMIC_TYPE_CERT_EXT = 78,
  862. DYNAMIC_TYPE_ALPN = 79,
  863. DYNAMIC_TYPE_ENCRYPTEDINFO= 80,
  864. DYNAMIC_TYPE_DIRCTX = 81,
  865. DYNAMIC_TYPE_HASHCTX = 82,
  866. DYNAMIC_TYPE_SEED = 83,
  867. DYNAMIC_TYPE_SYMMETRIC_KEY= 84,
  868. DYNAMIC_TYPE_ECC_BUFFER = 85,
  869. DYNAMIC_TYPE_SALT = 87,
  870. DYNAMIC_TYPE_HASH_TMP = 88,
  871. DYNAMIC_TYPE_BLOB = 89,
  872. DYNAMIC_TYPE_NAME_ENTRY = 90,
  873. DYNAMIC_TYPE_CURVE448 = 91,
  874. DYNAMIC_TYPE_ED448 = 92,
  875. DYNAMIC_TYPE_AES = 93,
  876. DYNAMIC_TYPE_CMAC = 94,
  877. DYNAMIC_TYPE_FALCON = 95,
  878. DYNAMIC_TYPE_SESSION = 96,
  879. DYNAMIC_TYPE_DILITHIUM = 97,
  880. DYNAMIC_TYPE_SPHINCS = 98,
  881. DYNAMIC_TYPE_SNIFFER_SERVER = 1000,
  882. DYNAMIC_TYPE_SNIFFER_SESSION = 1001,
  883. DYNAMIC_TYPE_SNIFFER_PB = 1002,
  884. DYNAMIC_TYPE_SNIFFER_PB_BUFFER = 1003,
  885. DYNAMIC_TYPE_SNIFFER_TICKET_ID = 1004,
  886. DYNAMIC_TYPE_SNIFFER_NAMED_KEY = 1005,
  887. DYNAMIC_TYPE_SNIFFER_KEY = 1006,
  888. };
  889. /* max error buffer string size */
  890. #ifndef WOLFSSL_MAX_ERROR_SZ
  891. #define WOLFSSL_MAX_ERROR_SZ 80
  892. #endif
  893. /* stack protection */
  894. enum {
  895. MIN_STACK_BUFFER = 8
  896. };
  897. /* Algorithm Types */
  898. enum wc_AlgoType {
  899. WC_ALGO_TYPE_NONE = 0,
  900. WC_ALGO_TYPE_HASH = 1,
  901. WC_ALGO_TYPE_CIPHER = 2,
  902. WC_ALGO_TYPE_PK = 3,
  903. WC_ALGO_TYPE_RNG = 4,
  904. WC_ALGO_TYPE_SEED = 5,
  905. WC_ALGO_TYPE_HMAC = 6,
  906. WC_ALGO_TYPE_CMAC = 7,
  907. WC_ALGO_TYPE_MAX = WC_ALGO_TYPE_CMAC
  908. };
  909. /* hash types */
  910. enum wc_HashType {
  911. #if defined(HAVE_SELFTEST) || (defined(HAVE_FIPS) && \
  912. ((! defined(HAVE_FIPS_VERSION)) || \
  913. defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION <= 2)))
  914. /* In selftest build, WC_* types are not mapped to WC_HASH_TYPE types.
  915. * Values here are based on old selftest hmac.h enum, with additions.
  916. * These values are fixed for backwards FIPS compatibility */
  917. WC_HASH_TYPE_NONE = 15,
  918. WC_HASH_TYPE_MD2 = 16,
  919. WC_HASH_TYPE_MD4 = 17,
  920. WC_HASH_TYPE_MD5 = 0,
  921. WC_HASH_TYPE_SHA = 1, /* SHA-1 (not old SHA-0) */
  922. WC_HASH_TYPE_SHA224 = 8,
  923. WC_HASH_TYPE_SHA256 = 2,
  924. WC_HASH_TYPE_SHA384 = 5,
  925. WC_HASH_TYPE_SHA512 = 4,
  926. WC_HASH_TYPE_MD5_SHA = 18,
  927. WC_HASH_TYPE_SHA3_224 = 10,
  928. WC_HASH_TYPE_SHA3_256 = 11,
  929. WC_HASH_TYPE_SHA3_384 = 12,
  930. WC_HASH_TYPE_SHA3_512 = 13,
  931. WC_HASH_TYPE_BLAKE2B = 14,
  932. WC_HASH_TYPE_BLAKE2S = 19,
  933. WC_HASH_TYPE_MAX = WC_HASH_TYPE_BLAKE2S
  934. #ifndef WOLFSSL_NOSHA512_224
  935. #define WOLFSSL_NOSHA512_224
  936. #endif
  937. #ifndef WOLFSSL_NOSHA512_256
  938. #define WOLFSSL_NOSHA512_256
  939. #endif
  940. #ifndef WOLFSSL_NO_SHAKE256
  941. #define WOLFSSL_NO_SHAKE256
  942. #endif
  943. #else
  944. WC_HASH_TYPE_NONE = 0,
  945. WC_HASH_TYPE_MD2 = 1,
  946. WC_HASH_TYPE_MD4 = 2,
  947. WC_HASH_TYPE_MD5 = 3,
  948. WC_HASH_TYPE_SHA = 4, /* SHA-1 (not old SHA-0) */
  949. WC_HASH_TYPE_SHA224 = 5,
  950. WC_HASH_TYPE_SHA256 = 6,
  951. WC_HASH_TYPE_SHA384 = 7,
  952. WC_HASH_TYPE_SHA512 = 8,
  953. WC_HASH_TYPE_MD5_SHA = 9,
  954. WC_HASH_TYPE_SHA3_224 = 10,
  955. WC_HASH_TYPE_SHA3_256 = 11,
  956. WC_HASH_TYPE_SHA3_384 = 12,
  957. WC_HASH_TYPE_SHA3_512 = 13,
  958. WC_HASH_TYPE_BLAKE2B = 14,
  959. WC_HASH_TYPE_BLAKE2S = 15,
  960. #define _WC_HASH_TYPE_MAX WC_HASH_TYPE_BLAKE2S
  961. #ifndef WOLFSSL_NOSHA512_224
  962. WC_HASH_TYPE_SHA512_224 = 16,
  963. #undef _WC_HASH_TYPE_MAX
  964. #define _WC_HASH_TYPE_MAX WC_HASH_TYPE_SHA512_224
  965. #endif
  966. #ifndef WOLFSSL_NOSHA512_256
  967. WC_HASH_TYPE_SHA512_256 = 17,
  968. #undef _WC_HASH_TYPE_MAX
  969. #define _WC_HASH_TYPE_MAX WC_HASH_TYPE_SHA512_256
  970. #endif
  971. #ifndef WOLFSSL_NO_SHAKE128
  972. WC_HASH_TYPE_SHAKE128 = 18,
  973. #endif
  974. #ifndef WOLFSSL_NO_SHAKE256
  975. WC_HASH_TYPE_SHAKE256 = 19,
  976. #undef _WC_HASH_TYPE_MAX
  977. #define _WC_HASH_TYPE_MAX WC_HASH_TYPE_SHAKE256
  978. #endif
  979. WC_HASH_TYPE_MAX = _WC_HASH_TYPE_MAX
  980. #undef _WC_HASH_TYPE_MAX
  981. #endif /* HAVE_SELFTEST */
  982. };
  983. /* cipher types */
  984. enum wc_CipherType {
  985. WC_CIPHER_NONE = 0,
  986. WC_CIPHER_AES = 1,
  987. WC_CIPHER_AES_CBC = 2,
  988. WC_CIPHER_AES_GCM = 3,
  989. WC_CIPHER_AES_CTR = 4,
  990. WC_CIPHER_AES_XTS = 5,
  991. WC_CIPHER_AES_CFB = 6,
  992. WC_CIPHER_AES_CCM = 12,
  993. WC_CIPHER_AES_ECB = 13,
  994. WC_CIPHER_DES3 = 7,
  995. WC_CIPHER_DES = 8,
  996. WC_CIPHER_CHACHA = 9,
  997. WC_CIPHER_MAX = WC_CIPHER_AES_CCM
  998. };
  999. /* PK=public key (asymmetric) based algorithms */
  1000. enum wc_PkType {
  1001. WC_PK_TYPE_NONE = 0,
  1002. WC_PK_TYPE_RSA = 1,
  1003. WC_PK_TYPE_DH = 2,
  1004. WC_PK_TYPE_ECDH = 3,
  1005. WC_PK_TYPE_ECDSA_SIGN = 4,
  1006. WC_PK_TYPE_ECDSA_VERIFY = 5,
  1007. WC_PK_TYPE_ED25519_SIGN = 6,
  1008. WC_PK_TYPE_CURVE25519 = 7,
  1009. WC_PK_TYPE_RSA_KEYGEN = 8,
  1010. WC_PK_TYPE_EC_KEYGEN = 9,
  1011. WC_PK_TYPE_RSA_CHECK_PRIV_KEY = 10,
  1012. WC_PK_TYPE_EC_CHECK_PRIV_KEY = 11,
  1013. WC_PK_TYPE_ED448 = 12,
  1014. WC_PK_TYPE_CURVE448 = 13,
  1015. WC_PK_TYPE_ED25519_VERIFY = 14,
  1016. WC_PK_TYPE_ED25519_KEYGEN = 15,
  1017. WC_PK_TYPE_CURVE25519_KEYGEN = 16,
  1018. WC_PK_TYPE_MAX = WC_PK_TYPE_CURVE25519_KEYGEN
  1019. };
  1020. /* settings detection for compile vs runtime math incompatibilities */
  1021. enum {
  1022. #if !defined(USE_FAST_MATH) && !defined(SIZEOF_LONG) && !defined(SIZEOF_LONG_LONG)
  1023. CTC_SETTINGS = 0x0
  1024. #elif !defined(USE_FAST_MATH) && defined(SIZEOF_LONG) && (SIZEOF_LONG == 8)
  1025. CTC_SETTINGS = 0x1
  1026. #elif !defined(USE_FAST_MATH) && defined(SIZEOF_LONG_LONG) && (SIZEOF_LONG_LONG == 8)
  1027. CTC_SETTINGS = 0x2
  1028. #elif !defined(USE_FAST_MATH) && defined(SIZEOF_LONG_LONG) && (SIZEOF_LONG_LONG == 4)
  1029. CTC_SETTINGS = 0x4
  1030. #elif defined(USE_FAST_MATH) && !defined(SIZEOF_LONG) && !defined(SIZEOF_LONG_LONG)
  1031. CTC_SETTINGS = 0x8
  1032. #elif defined(USE_FAST_MATH) && defined(SIZEOF_LONG) && (SIZEOF_LONG == 8)
  1033. CTC_SETTINGS = 0x10
  1034. #elif defined(USE_FAST_MATH) && defined(SIZEOF_LONG_LONG) && (SIZEOF_LONG_LONG == 8)
  1035. CTC_SETTINGS = 0x20
  1036. #elif defined(USE_FAST_MATH) && defined(SIZEOF_LONG_LONG) && (SIZEOF_LONG_LONG == 4)
  1037. CTC_SETTINGS = 0x40
  1038. #else
  1039. #error "bad math long / long long settings"
  1040. #endif
  1041. };
  1042. WOLFSSL_API word32 CheckRunTimeSettings(void);
  1043. /* If user uses RSA, DH, DSA, or ECC math lib directly then fast math and long
  1044. types need to match at compile time and run time, CheckCtcSettings will
  1045. return 1 if a match otherwise 0 */
  1046. #define CheckCtcSettings() (CTC_SETTINGS == CheckRunTimeSettings())
  1047. /* invalid device id */
  1048. #define INVALID_DEVID (-2)
  1049. /* AESNI requires alignment and ARMASM gains some performance from it
  1050. * Xilinx RSA operations require alignment */
  1051. #if defined(WOLFSSL_AESNI) || defined(WOLFSSL_ARMASM) || \
  1052. defined(USE_INTEL_SPEEDUP) || defined(WOLFSSL_AFALG_XILINX)
  1053. #ifndef WOLFSSL_USE_ALIGN
  1054. #define WOLFSSL_USE_ALIGN
  1055. #endif
  1056. #endif /* WOLFSSL_AESNI || WOLFSSL_ARMASM || USE_INTEL_SPEEDUP || WOLFSSL_AFALG_XILINX */
  1057. #ifdef WOLFSSL_USE_ALIGN
  1058. #if !defined(ALIGN16)
  1059. #if defined(__IAR_SYSTEMS_ICC__) || defined(__GNUC__) || \
  1060. defined(__llvm__)
  1061. #define ALIGN16 __attribute__ ( (aligned (16)))
  1062. #elif defined(_MSC_VER)
  1063. /* disable align warning, we want alignment ! */
  1064. #pragma warning(disable: 4324)
  1065. #define ALIGN16 __declspec (align (16))
  1066. #else
  1067. #define ALIGN16
  1068. #endif
  1069. #endif /* !ALIGN16 */
  1070. #if !defined (ALIGN32)
  1071. #if defined(__IAR_SYSTEMS_ICC__) || defined(__GNUC__) || \
  1072. defined(__llvm__)
  1073. #define ALIGN32 __attribute__ ( (aligned (32)))
  1074. #elif defined(_MSC_VER)
  1075. /* disable align warning, we want alignment ! */
  1076. #pragma warning(disable: 4324)
  1077. #define ALIGN32 __declspec (align (32))
  1078. #else
  1079. #define ALIGN32
  1080. #endif
  1081. #endif /* !ALIGN32 */
  1082. #if !defined(ALIGN64)
  1083. #if defined(__IAR_SYSTEMS_ICC__) || defined(__GNUC__) || \
  1084. defined(__llvm__)
  1085. #define ALIGN64 __attribute__ ( (aligned (64)))
  1086. #elif defined(_MSC_VER)
  1087. /* disable align warning, we want alignment ! */
  1088. #pragma warning(disable: 4324)
  1089. #define ALIGN64 __declspec (align (64))
  1090. #else
  1091. #define ALIGN64
  1092. #endif
  1093. #endif /* !ALIGN64 */
  1094. #if defined(__IAR_SYSTEMS_ICC__) || defined(__GNUC__) || \
  1095. defined(__llvm__)
  1096. #define ALIGN128 __attribute__ ( (aligned (128)))
  1097. #elif defined(_MSC_VER)
  1098. /* disable align warning, we want alignment ! */
  1099. #pragma warning(disable: 4324)
  1100. #define ALIGN128 __declspec (align (128))
  1101. #else
  1102. #define ALIGN128
  1103. #endif
  1104. #if defined(__IAR_SYSTEMS_ICC__) || defined(__GNUC__) || \
  1105. defined(__llvm__)
  1106. #define ALIGN256 __attribute__ ( (aligned (256)))
  1107. #elif defined(_MSC_VER)
  1108. /* disable align warning, we want alignment ! */
  1109. #pragma warning(disable: 4324)
  1110. #define ALIGN256 __declspec (align (256))
  1111. #else
  1112. #define ALIGN256
  1113. #endif
  1114. #else
  1115. #ifndef ALIGN16
  1116. #define ALIGN16
  1117. #endif
  1118. #ifndef ALIGN32
  1119. #define ALIGN32
  1120. #endif
  1121. #ifndef ALIGN64
  1122. #define ALIGN64
  1123. #endif
  1124. #ifndef ALIGN128
  1125. #define ALIGN128
  1126. #endif
  1127. #ifndef ALIGN256
  1128. #define ALIGN256
  1129. #endif
  1130. #endif /* WOLFSSL_USE_ALIGN */
  1131. #if !defined(PEDANTIC_EXTENSION)
  1132. #if defined(__GNUC__)
  1133. #define PEDANTIC_EXTENSION __extension__
  1134. #else
  1135. #define PEDANTIC_EXTENSION
  1136. #endif
  1137. #endif /* !PEDANTIC_EXTENSION */
  1138. #ifndef TRUE
  1139. #define TRUE 1
  1140. #endif
  1141. #ifndef FALSE
  1142. #define FALSE 0
  1143. #endif
  1144. #if defined(HAVE_STACK_SIZE)
  1145. #define EXIT_TEST(ret) return (THREAD_RETURN)((size_t)(ret))
  1146. #else
  1147. #define EXIT_TEST(ret) return ret
  1148. #endif
  1149. #if (defined(__IAR_SYSTEMS_ICC__) && (__IAR_SYSTEMS_ICC__ > 8)) || \
  1150. defined(__GNUC__)
  1151. #define WOLFSSL_PACK __attribute__ ((packed))
  1152. #else
  1153. #define WOLFSSL_PACK
  1154. #endif
  1155. #ifndef __GNUC_PREREQ
  1156. #if defined(__GNUC__) && defined(__GNUC_MINOR__)
  1157. #define __GNUC_PREREQ(maj, min) \
  1158. ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
  1159. #else
  1160. #define __GNUC_PREREQ(maj, min) (0) /* not GNUC */
  1161. #endif
  1162. #endif
  1163. #if defined(__IAR_SYSTEMS_ICC__) || defined(__GNUC__)
  1164. #define WC_NORETURN __attribute__((noreturn))
  1165. #else
  1166. #define WC_NORETURN
  1167. #endif
  1168. #if defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY) || \
  1169. defined(WOLFSSL_DEBUG_MATH) || defined(DEBUG_WOLFSSL) || \
  1170. defined(WOLFSSL_PUBLIC_MP) || defined(OPENSSL_EXTRA) || \
  1171. (defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT))
  1172. #undef WC_MP_TO_RADIX
  1173. #define WC_MP_TO_RADIX
  1174. #endif
  1175. #if defined(__GNUC__) && __GNUC__ > 5
  1176. #define PRAGMA_GCC_DIAG_PUSH _Pragma("GCC diagnostic push")
  1177. #define PRAGMA_GCC(str) _Pragma(str)
  1178. #define PRAGMA_GCC_DIAG_POP _Pragma("GCC diagnostic pop")
  1179. #else
  1180. #define PRAGMA_GCC_DIAG_PUSH
  1181. #define PRAGMA_GCC(str)
  1182. #define PRAGMA_GCC_DIAG_POP
  1183. #endif
  1184. #ifdef __clang__
  1185. #define PRAGMA_CLANG_DIAG_PUSH _Pragma("clang diagnostic push")
  1186. #define PRAGMA_CLANG(str) _Pragma(str)
  1187. #define PRAGMA_CLANG_DIAG_POP _Pragma("clang diagnostic pop")
  1188. #else
  1189. #define PRAGMA_CLANG_DIAG_PUSH
  1190. #define PRAGMA_CLANG(str)
  1191. #define PRAGMA_CLANG_DIAG_POP
  1192. #endif
  1193. #ifdef DEBUG_VECTOR_REGISTER_ACCESS
  1194. WOLFSSL_API extern THREAD_LS_T int wc_svr_count;
  1195. WOLFSSL_API extern THREAD_LS_T const char *wc_svr_last_file;
  1196. WOLFSSL_API extern THREAD_LS_T int wc_svr_last_line;
  1197. #ifdef DEBUG_VECTOR_REGISTERS_ABORT_ON_FAIL
  1198. #define DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE abort();
  1199. #elif defined(DEBUG_VECTOR_REGISTERS_EXIT_ON_FAIL)
  1200. #define DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE exit(1);
  1201. #else
  1202. #define DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE
  1203. #endif
  1204. #define SAVE_VECTOR_REGISTERS(...) { \
  1205. ++wc_svr_count; \
  1206. if (wc_svr_count > 5) { \
  1207. fprintf(stderr, \
  1208. "%s @ L%d : incr : wc_svr_count %d (last op %s L%d)\n", \
  1209. __FILE__, \
  1210. __LINE__, \
  1211. wc_svr_count, \
  1212. wc_svr_last_file, \
  1213. wc_svr_last_line); \
  1214. DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \
  1215. } \
  1216. wc_svr_last_file = __FILE__; \
  1217. wc_svr_last_line = __LINE__; \
  1218. }
  1219. #define ASSERT_SAVED_VECTOR_REGISTERS(fail_clause) { \
  1220. if (wc_svr_count <= 0) { \
  1221. fprintf(stderr, \
  1222. "ASSERT_SAVED_VECTOR_REGISTERS : %s @ L%d : wc_svr_count %d (last op %s L%d)\n", \
  1223. __FILE__, \
  1224. __LINE__, \
  1225. wc_svr_count, \
  1226. wc_svr_last_file, \
  1227. wc_svr_last_line); \
  1228. DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \
  1229. { fail_clause } \
  1230. } \
  1231. }
  1232. #define ASSERT_RESTORED_VECTOR_REGISTERS(fail_clause) { \
  1233. if (wc_svr_count != 0) { \
  1234. fprintf(stderr, \
  1235. "ASSERT_RESTORED_VECTOR_REGISTERS : %s @ L%d : wc_svr_count %d (last op %s L%d)\n", \
  1236. __FILE__, \
  1237. __LINE__, \
  1238. wc_svr_count, \
  1239. wc_svr_last_file, \
  1240. wc_svr_last_line); \
  1241. DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \
  1242. { fail_clause } \
  1243. } \
  1244. }
  1245. #define RESTORE_VECTOR_REGISTERS(...) { \
  1246. --wc_svr_count; \
  1247. if ((wc_svr_count > 4) || (wc_svr_count < 0)) { \
  1248. fprintf(stderr, \
  1249. "%s @ L%d : decr : wc_svr_count %d (last op %s L%d)\n", \
  1250. __FILE__, \
  1251. __LINE__, \
  1252. wc_svr_count, \
  1253. wc_svr_last_file, \
  1254. wc_svr_last_line); \
  1255. DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \
  1256. } \
  1257. wc_svr_last_file = __FILE__; \
  1258. wc_svr_last_line = __LINE__; \
  1259. }
  1260. #else
  1261. #ifdef _MSC_VER
  1262. /* disable buggy MSC warning around while(0),
  1263. *"warning C4127: conditional expression is constant"
  1264. */
  1265. #pragma warning(disable: 4127)
  1266. #endif
  1267. #ifndef SAVE_VECTOR_REGISTERS
  1268. #define SAVE_VECTOR_REGISTERS(...) do{}while(0)
  1269. #endif
  1270. #ifndef ASSERT_SAVED_VECTOR_REGISTERS
  1271. #define ASSERT_SAVED_VECTOR_REGISTERS(...) do{}while(0)
  1272. #endif
  1273. #ifndef ASSERT_RESTORED_VECTOR_REGISTERS
  1274. #define ASSERT_RESTORED_VECTOR_REGISTERS(...) do{}while(0)
  1275. #endif
  1276. #ifndef RESTORE_VECTOR_REGISTERS
  1277. #define RESTORE_VECTOR_REGISTERS() do{}while(0)
  1278. #endif
  1279. #endif
  1280. #if FIPS_VERSION_GE(5,1)
  1281. #define WC_SPKRE_F(x,y) wolfCrypt_SetPrivateKeyReadEnable_fips((x),(y))
  1282. #define PRIVATE_KEY_LOCK() WC_SPKRE_F(0,WC_KEYTYPE_ALL)
  1283. #define PRIVATE_KEY_UNLOCK() WC_SPKRE_F(1,WC_KEYTYPE_ALL)
  1284. #else
  1285. #define PRIVATE_KEY_LOCK() do{}while(0)
  1286. #define PRIVATE_KEY_UNLOCK() do{}while(0)
  1287. #endif
  1288. #ifdef _MSC_VER
  1289. /* disable buggy MSC warning (incompatible with clang-tidy
  1290. * readability-avoid-const-params-in-decls)
  1291. * "warning C4028: formal parameter x different from declaration"
  1292. */
  1293. #pragma warning(disable: 4028)
  1294. #endif
  1295. #ifdef __cplusplus
  1296. } /* extern "C" */
  1297. #endif
  1298. #endif /* WOLF_CRYPT_TYPES_H */