types.h 61 KB

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