sp_int.h 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038
  1. /* sp_int.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. DESCRIPTION
  23. This library provides single precision (SP) integer math functions.
  24. */
  25. #ifndef WOLF_CRYPT_SP_INT_H
  26. #define WOLF_CRYPT_SP_INT_H
  27. #ifndef WOLFSSL_LINUXKM
  28. #include <limits.h>
  29. #endif
  30. #include <wolfssl/wolfcrypt/settings.h>
  31. #include <wolfssl/wolfcrypt/hash.h>
  32. #ifdef __cplusplus
  33. extern "C" {
  34. #endif
  35. #if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && \
  36. !defined(WOLFSSL_SP_INT_NEGATIVE)
  37. #define WOLFSSL_SP_INT_NEGATIVE
  38. #endif
  39. /* Find smallest type for smallest bits. */
  40. #if UCHAR_MAX == 255
  41. #define SP_UCHAR_BITS 8
  42. typedef unsigned char sp_uint8;
  43. typedef char sp_int8;
  44. #elif UCHAR_MAX == 127
  45. #define SP_UCHAR_BITS 7
  46. typedef unsigned char sp_uint7;
  47. typedef char sp_int7;
  48. #else
  49. #error "Size of unsigned short not detected"
  50. #endif
  51. #if USHRT_MAX == 65535
  52. #define SP_USHORT_BITS 16
  53. typedef unsigned short sp_uint16;
  54. typedef short sp_int16;
  55. #elif USHRT_MAX == 255
  56. #define SP_USHORT_BITS 8
  57. #if USHRT_MAX > UCHAR_MAX
  58. typedef unsigned short sp_uint8;
  59. typedef short sp_int8;
  60. #endif
  61. #else
  62. #error "Size of unsigned short not detected"
  63. #endif
  64. #if UINT_MAX == 4294967295UL
  65. #define SP_UINT_BITS 32
  66. typedef unsigned int sp_uint32;
  67. typedef int sp_int32;
  68. #elif UINT_MAX == 65535
  69. #define SP_UINT_BITS 16
  70. #if UINT_MAX > USHRT_MAX
  71. typedef unsigned int sp_uint16;
  72. typedef int sp_int16;
  73. #endif
  74. #elif UINT_MAX == 255
  75. #define SP_UINT_BITS 8
  76. #if UINT_MAX > USHRT_MAX
  77. typedef unsigned int sp_uint8;
  78. typedef int sp_int8;
  79. #endif
  80. #else
  81. #error "Size of unsigned int not detected"
  82. #endif
  83. #if ULONG_MAX == 18446744073709551615ULL && \
  84. 4294967295UL != 18446744073709551615ULL /* verify pre-processor supports
  85. * 64-bit ULL types */
  86. #define SP_ULONG_BITS 64
  87. typedef unsigned long sp_uint64;
  88. typedef long sp_int64;
  89. #elif ULONG_MAX == 4294967295UL
  90. #define SP_ULONG_BITS 32
  91. #if ULONG_MAX > UINT_MAX
  92. typedef unsigned long sp_uint32;
  93. typedef long sp_int32;
  94. #endif
  95. #elif ULONG_MAX == 65535
  96. #define SP_ULONG_BITS 16
  97. #if ULONG_MAX > UINT_MAX
  98. typedef unsigned long sp_uint16;
  99. typedef long sp_int16;
  100. #endif
  101. #else
  102. #error "Size of unsigned long not detected"
  103. #endif
  104. #ifdef ULLONG_MAX
  105. #if ULLONG_MAX == 18446744073709551615ULL
  106. #define SP_ULLONG_BITS 64
  107. #if SP_ULLONG_BITS > SP_ULONG_BITS
  108. typedef unsigned long long sp_uint64;
  109. typedef long long sp_int64;
  110. #endif
  111. #elif ULLONG_MAX == 4294967295UL
  112. #define SP_ULLONG_BITS 32
  113. #if SP_ULLONG_BITS > SP_ULONG_BITS
  114. typedef unsigned long long sp_uint32;
  115. typedef long long sp_int32;
  116. #endif
  117. #elif ULLONG_MAX == 65535
  118. #define SP_ULLONG_BITS 16
  119. #if SP_ULLONG_BITS > SP_ULONG_BITS
  120. typedef unsigned long long sp_uint16;
  121. typedef long long sp_int16;
  122. #endif
  123. #else
  124. #error "Size of unsigned long long not detected"
  125. #endif
  126. #else
  127. #define SP_ULLONG_BITS 0
  128. #endif
  129. #ifdef WOLFSSL_SP_DIV_32
  130. #define WOLFSSL_SP_DIV_WORD_HALF
  131. #endif
  132. /* Make sure WOLFSSL_SP_ASM build option defined when requested */
  133. #if !defined(WOLFSSL_SP_ASM) && ( \
  134. defined(WOLFSSL_SP_X86_64_ASM) || defined(WOLFSSL_SP_ARM32_ASM) || \
  135. defined(WOLFSSL_SP_ARM64_ASM) || defined(WOLFSSL_SP_ARM_THUMB_ASM) || \
  136. defined(WOLFSSL_SP_ARM_CORTEX_M_ASM))
  137. #define WOLFSSL_SP_ASM
  138. #endif
  139. /* Determine the number of bits to use in each word. */
  140. #ifdef SP_WORD_SIZE
  141. #elif defined(WOLFSSL_DSP_BUILD)
  142. #define SP_WORD_SIZE 32
  143. #elif defined(WOLFSSL_SP_X86_64) && !defined(WOLFSSL_SP_X86_64_ASM) && \
  144. !defined(HAVE___UINT128_T)
  145. #define SP_WORD_SIZE 32
  146. #elif defined(WOLFSSL_SP_X86_64_ASM) || defined(WOLFSSL_SP_X86_64)
  147. #if SP_ULONG_BITS == 64 || SP_ULLONG_BITS == 64
  148. #define SP_WORD_SIZE 64
  149. #define HAVE_INTEL_AVX1
  150. #ifndef NO_AVX2_SUPPORT
  151. #define HAVE_INTEL_AVX2
  152. #endif
  153. #elif SP_ULONG_BITS == 32
  154. #define SP_WORD_SIZE 32
  155. #undef WOLFSSL_SP_ASM
  156. #elif SP_ULONG_BITS == 16
  157. #define SP_WORD_SIZE 16
  158. #undef WOLFSSL_SP_ASM
  159. #endif
  160. #elif defined(WOLFSSL_SP_X86)
  161. #define SP_WORD_SIZE 32
  162. #elif defined(WOLFSSL_SP_ARM64_ASM) || defined(WOLFSSL_SP_ARM64)
  163. #define SP_WORD_SIZE 64
  164. #elif defined(WOLFSSL_SP_ARM32_ASM) || defined(WOLFSSL_SP_ARM32)
  165. #define SP_WORD_SIZE 32
  166. #elif defined(WOLFSSL_SP_ARM_THUMB_ASM) || defined(WOLFSSL_SP_ARM_THUMB)
  167. #define SP_WORD_SIZE 32
  168. #elif defined(WOLFSSL_SP_PPC)
  169. #define SP_WORD_SIZE 32
  170. #elif defined(WOLFSSL_SP_PPC64)
  171. #define SP_WORD_SIZE 64
  172. #elif defined(WOLFSSL_SP_MIPS)
  173. #define SP_WORD_SIZE 32
  174. #elif defined(WOLFSSL_SP_MIPS64)
  175. #define SP_WORD_SIZE 64
  176. #elif defined(WOLFSSL_SP_RISCV32)
  177. #define SP_WORD_SIZE 32
  178. #elif defined(WOLFSSL_SP_RISCV64)
  179. #define SP_WORD_SIZE 64
  180. #elif defined(WOLFSSL_SP_S390X)
  181. #define SP_WORD_SIZE 64
  182. #endif
  183. /* If no predefined or assembly required size then use maximum available
  184. * with compiler.
  185. */
  186. #ifndef SP_WORD_SIZE
  187. #if defined(NO_64BIT) || !defined(HAVE___UINT128_T)
  188. #define SP_WORD_SIZE 32
  189. #else
  190. #define SP_WORD_SIZE 64
  191. #endif
  192. #endif
  193. /* Number of bytes in each word. */
  194. #define SP_WORD_SIZEOF (SP_WORD_SIZE / 8)
  195. /* Define the types used. */
  196. #ifdef HAVE___UINT128_T
  197. #ifdef __SIZEOF_INT128__
  198. typedef __uint128_t sp_uint128;
  199. typedef __int128_t sp_int128;
  200. #else
  201. typedef unsigned long sp_uint128 __attribute__ ((mode(TI)));
  202. typedef long sp_int128 __attribute__ ((mode(TI)));
  203. #endif
  204. #ifndef WOLFSSL_UINT128_T_DEFINED
  205. #ifdef __SIZEOF_INT128__
  206. typedef __uint128_t uint128_t;
  207. typedef __int128_t int128_t;
  208. #else
  209. typedef unsigned long uint128_t __attribute__ ((mode(TI)));
  210. typedef long int128_t __attribute__ ((mode(TI)));
  211. #endif
  212. #define WOLFSSL_UINT128_T_DEFINED
  213. #endif
  214. #endif
  215. #if SP_WORD_SIZE == 8
  216. typedef sp_uint8 sp_int_digit;
  217. typedef sp_int8 sp_sint_digit;
  218. typedef sp_uint16 sp_int_word;
  219. typedef sp_int16 sp_int_sword;
  220. #define SP_MASK 0xffU
  221. #elif SP_WORD_SIZE == 16
  222. typedef sp_uint16 sp_int_digit;
  223. typedef sp_int16 sp_sint_digit;
  224. typedef sp_uint32 sp_int_word;
  225. typedef sp_int32 sp_int_sword;
  226. #define SP_MASK 0xffffU
  227. #elif SP_WORD_SIZE == 32
  228. typedef sp_uint32 sp_int_digit;
  229. typedef sp_int32 sp_sint_digit;
  230. typedef sp_uint64 sp_int_word;
  231. typedef sp_int64 sp_int_sword;
  232. #define SP_MASK 0xffffffffU
  233. #elif SP_WORD_SIZE == 64
  234. typedef sp_uint64 sp_int_digit;
  235. typedef sp_int64 sp_sint_digit;
  236. #if (defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)) && \
  237. !defined(_WIN64) && defined(WOLFSSL_UINT128_T_DEFINED)
  238. typedef sp_uint128 sp_int_word;
  239. typedef sp_int128 sp_int_sword;
  240. #endif
  241. #define SP_MASK 0xffffffffffffffffUL
  242. #else
  243. #error Word size not defined
  244. #endif
  245. /* Define an SP digit. */
  246. #ifndef WOLFSSL_SP_ASM
  247. /* SP C code uses n/m bits and therefore needs a signed type. */
  248. #if SP_WORD_SIZE == 8
  249. typedef sp_int8 sp_digit;
  250. #elif SP_WORD_SIZE == 16
  251. typedef sp_int16 sp_digit;
  252. #elif SP_WORD_SIZE == 32
  253. typedef sp_int32 sp_digit;
  254. #elif SP_WORD_SIZE == 64
  255. typedef sp_int64 sp_digit;
  256. #endif
  257. #else
  258. /* SP ASM code uses full size and needs an unsigned type. */
  259. #if SP_WORD_SIZE == 8
  260. typedef sp_uint8 sp_digit;
  261. #elif SP_WORD_SIZE == 16
  262. typedef sp_uint16 sp_digit;
  263. #elif SP_WORD_SIZE == 32
  264. typedef sp_uint32 sp_digit;
  265. #elif SP_WORD_SIZE == 64
  266. typedef sp_uint64 sp_digit;
  267. #endif
  268. #endif
  269. /** Number of bits in a half a word. */
  270. #define SP_HALF_SIZE (SP_WORD_SIZE / 2)
  271. /** Maximum value that can be held in a half a word. */
  272. #define SP_HALF_MAX (((sp_digit)1 << SP_HALF_SIZE) - 1)
  273. /** Maximum value that can be held in a word. */
  274. #define SP_DIGIT_MAX SP_MASK
  275. /* Number of bits to shift to divide by word size. */
  276. #if SP_WORD_SIZE == 8
  277. #define SP_WORD_SHIFT 3
  278. #elif SP_WORD_SIZE == 16
  279. #define SP_WORD_SHIFT 4
  280. #elif SP_WORD_SIZE == 32
  281. #define SP_WORD_SHIFT 5
  282. #elif SP_WORD_SIZE == 64
  283. #define SP_WORD_SHIFT 6
  284. #endif
  285. /* Mask of word size. */
  286. #define SP_WORD_MASK (SP_WORD_SIZE - 1)
  287. /* For debugging only - format string for different digit sizes. */
  288. #if SP_WORD_SIZE == 64
  289. #if SP_ULONG_BITS == 64
  290. #define SP_PRINT_FMT "%016lx"
  291. #else
  292. #define SP_PRINT_FMT "%016llx"
  293. #endif
  294. #elif SP_WORD_SIZE == 32
  295. #if SP_UINT_BITS == 32
  296. #define SP_PRINT_FMT "%08x"
  297. #else
  298. #define SP_PRINT_FMT "%08lx"
  299. #endif
  300. #elif SP_WORD_SIZE == 16
  301. #define SP_PRINT_FMT "%04x"
  302. #elif SP_WORD_SIZE == 8
  303. #define SP_PRINT_FMT "%02x"
  304. #endif
  305. #if defined(WOLFSSL_HAVE_SP_ECC) && defined(WOLFSSL_SP_NONBLOCK)
  306. /* Non-blocking ECC operation context. */
  307. typedef struct sp_ecc_ctx {
  308. #ifdef WOLFSSL_SP_521
  309. byte data[66*80]; /* stack data */
  310. #elif defined(WOLFSSL_SP_384)
  311. byte data[48*80]; /* stack data */
  312. #else
  313. byte data[32*80]; /* stack data */
  314. #endif
  315. } sp_ecc_ctx_t;
  316. #endif
  317. #if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
  318. #include <wolfssl/wolfcrypt/random.h>
  319. #ifndef SP_INT_BITS
  320. #ifdef SP_INT_DIGITS
  321. #define SP_INT_BITS (((SP_INT_DIGITS - 1) * SP_WORD_SIZE) / 2)
  322. #else
  323. /* Calculate number of bits to have in an sp_int based on features
  324. * compiled in.
  325. */
  326. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  327. /* MySQL wants to be able to use 8192-bit numbers. */
  328. #define SP_INT_BITS 8192
  329. #elif !defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_HAVE_SP_DH) && \
  330. !defined(WOLFSSL_HAVE_SP_ECC)
  331. /* Not using SP - must be SP math all. */
  332. #if !defined(NO_RSA) || !defined(NO_DH) || !defined(NO_DSA)
  333. /* Support max size FFHDE parameters compiled in. */
  334. #if !defined(NO_DH) && defined(HAVE_FFDHE_8192)
  335. #define SP_INT_BITS 8192
  336. #elif !defined(NO_DH) && defined(HAVE_FFDHE_6144)
  337. #define SP_INT_BITS 6144
  338. #elif !defined(NO_DH) && defined(HAVE_FFDHE_4096)
  339. #define SP_INT_BITS 4096
  340. #else
  341. /* Default to max 3072 for general RSA and DH. */
  342. #define SP_INT_BITS 3072
  343. #endif
  344. #elif defined(WOLFCRYPT_HAVE_SAKKE)
  345. #define SP_INT_BITS 1024
  346. #elif defined(HAVE_ECC)
  347. /* P521 is the largest supported ECC algorithm curve. */
  348. #define SP_INT_BITS 521
  349. #elif !defined(NO_PWDBASED) && defined(HAVE_PKCS12)
  350. /* wc_PKCS12_PBKDF_ex() */
  351. #define SP_INT_BITS WC_MAX_DIGEST_SIZE * 8
  352. #else
  353. #define SP_INT_BITS 128
  354. #endif
  355. #elif !defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_HAVE_SP_DH)
  356. /* Not use SP_RSA or DH but are using SP ECC. */
  357. #if defined(WOLFCRYPT_HAVE_SAKKE)
  358. #define SP_INT_BITS 1024
  359. #elif defined(WOLFSSL_SP_521) || defined(WOLFSSL_SP_MATH_ALL)
  360. /* P521 is the largest supported ECC algorithm curve. */
  361. #define SP_INT_BITS 521
  362. #elif defined(WOLFSSL_SP_384)
  363. /* No generic support - largest curve P384. */
  364. #define SP_INT_BITS 384
  365. #else
  366. /* No generic support - largest curve P256. */
  367. #define SP_INT_BITS 256
  368. #endif
  369. /* SP RSA and DH supported so base on max size of RSA/DH in SP. */
  370. #elif defined(WOLFSSL_SP_4096)
  371. #define SP_INT_BITS 4096
  372. #elif !defined(WOLFSSL_SP_NO_3072) || defined(WOLFSSL_SP_MATH_ALL)
  373. #define SP_INT_BITS 3072
  374. #else
  375. #define SP_INT_BITS 2048
  376. #endif
  377. #endif
  378. #endif
  379. #ifndef SP_INT_DIGITS
  380. /* Calculate number of digits to have in an sp_int based on maximum size of
  381. * numbers in bits that will be used.
  382. * Double the size to hold multiplication result.
  383. * Add one to accommodate extra digit used by sp_mul(), sp_mulmod(),
  384. * sp_sqr(), and sp_sqrmod().
  385. */
  386. #define SP_INT_DIGITS \
  387. (((SP_INT_BITS * 2 + SP_WORD_SIZE - 1) / SP_WORD_SIZE) + 1)
  388. #endif
  389. #ifndef SP_INT_MAX_BITS
  390. /* Convert number digits to number of bits. */
  391. #define SP_INT_MAX_BITS (SP_INT_DIGITS * SP_WORD_SIZE)
  392. #endif
  393. #if SP_WORD_SIZE < 32
  394. /* Maximum number of digits in a number to mul or sqr. */
  395. #define SP_MUL_SQR_DIGITS (SP_INT_MAX_BITS / 2 / SP_WORD_SIZE)
  396. /* Maximum value of partial in mul/sqr. */
  397. #define SP_MUL_SQR_MAX_PARTIAL \
  398. (SP_MUL_SQR_DIGITS * ((1 << SP_WORD_SIZE) - 1))
  399. /* Maximim value in an sp_int_word. */
  400. #define SP_INT_WORD_MAX ((1 << (SP_WORD_SIZE * 2)) - 1)
  401. #if SP_MUL_SQR_MAX_PARTIAL > SP_INT_WORD_MAX
  402. /* The sum of the partials in the multiplication/square can exceed the
  403. * size of a word. This will overflow the word and loose data.
  404. * Use an implementation that handles carry after every add and uses an
  405. * extra temporary word for overflowing high word.
  406. */
  407. #define SP_WORD_OVERFLOW
  408. #endif
  409. #endif
  410. #ifndef NO_FILESYSTEM
  411. /* Output is formatted to be used with script that checks calculations. */
  412. /* Print out a number in big endian. */
  413. #ifndef WOLFSSL_SP_INT_NEGATIVE
  414. /* Print out a positive multi-precision number.
  415. *
  416. * @param [in] a SP integer to print.
  417. * @param [in] s String that describes the use of the number.
  418. */
  419. #define sp_print(a, s) \
  420. do { \
  421. int ii; \
  422. fprintf(stderr, "%s=0x0", s); \
  423. for (ii = (a)->used-1; ii >= 0; ii--) { \
  424. fprintf(stderr, SP_PRINT_FMT, (a)->dp[ii]); \
  425. } \
  426. fprintf(stderr, "\n"); \
  427. } \
  428. while (0)
  429. #else
  430. /* Print out a multi-precision number.
  431. *
  432. * @param [in] a SP integer to print.
  433. * @param [in] s String that describes the use of the number.
  434. */
  435. #define sp_print(a, s) \
  436. do { \
  437. int ii; \
  438. fprintf(stderr, "%s=0x", s); \
  439. if ((a)->sign == MP_NEG) { \
  440. fprintf(stderr, "-"); \
  441. } \
  442. fprintf(stderr, "0"); \
  443. for (ii = (a)->used-1; ii >= 0; ii--) { \
  444. fprintf(stderr, SP_PRINT_FMT, (a)->dp[ii]); \
  445. } \
  446. fprintf(stderr, "\n"); \
  447. } \
  448. while (0)
  449. #endif
  450. /* Print out a single multi-precision digit.
  451. *
  452. * @param [in] a SP integer digit to print.
  453. * @param [in] s String that describes the use of the number.
  454. */
  455. #define sp_print_digit(a, s) \
  456. do { \
  457. fprintf(stderr, "%s=0x0", s); \
  458. fprintf(stderr, SP_PRINT_FMT, a); \
  459. fprintf(stderr, "\n"); \
  460. } \
  461. while (0)
  462. /* Print out an integer.
  463. *
  464. * @param [in] a Number to print.
  465. * @param [in] s String that describes the use of the number.
  466. */
  467. #define sp_print_int(a, s) \
  468. do { \
  469. fprintf(stderr, "%s=0x0%x\n", s, a); \
  470. } \
  471. while (0)
  472. #else
  473. /* No filesystem, no output
  474. * TODO: Use logging API?
  475. */
  476. #define sp_print(a, s)
  477. #define sp_print_digit(a, s)
  478. #define sp_print_int(a, s)
  479. #endif /* !NO_FILESYSTEM */
  480. /* Returns whether multi-precision number is odd
  481. *
  482. * Assumes a is not NULL.
  483. *
  484. * @param [in] a SP integer to check.
  485. * @return 1 when odd.
  486. * @return 0 when even.
  487. */
  488. #define sp_isodd(a) (((a)->used != 0) && ((a)->dp[0] & 1))
  489. /* Returns whether multi-precision number is even
  490. *
  491. * Assumes a is not NULL.
  492. *
  493. * @param [in] a SP integer to check.
  494. * @return 1 when even.
  495. * @return 0 when odd.
  496. */
  497. #define sp_iseven(a) (((a)->used != 0) && (((a)->dp[0] & 1) == 0))
  498. /* Returns whether multi-precision number has the value zero.
  499. *
  500. * Assumes a is not NULL.
  501. *
  502. * @param [in] a SP integer to check.
  503. * @return 1 when zero.
  504. * @return 0 when not zero.
  505. */
  506. #define sp_iszero(a) ((a)->used == 0)
  507. #ifndef WOLFSSL_SP_INT_NEGATIVE
  508. /* Returns whether multi-precision number has the value one.
  509. *
  510. * Assumes a is not NULL.
  511. *
  512. * @param [in] a SP integer to check.
  513. * @return 1 when one.
  514. * @return 0 when not one.
  515. */
  516. #define sp_isone(a) (((a)->used == 1) && ((a)->dp[0] == 1))
  517. #else
  518. /* Returns whether multi-precision number has the value of positive one.
  519. *
  520. * Assumes a is not NULL.
  521. *
  522. * @param [in] a SP integer to check.
  523. * @return 1 when one.
  524. * @return 0 when not one.
  525. */
  526. #define sp_isone(a) \
  527. (((a)->used == 1) && ((a)->dp[0] == 1) && ((a)->sign == MP_ZPOS))
  528. #endif
  529. #ifndef WOLFSSL_SP_INT_NEGATIVE
  530. /* Returns whether multi-precision number has the value 'd'.
  531. *
  532. * Assumes a is not NULL.
  533. *
  534. * @param [in] a SP integer to check.
  535. * @param [in] d SP integer digit.
  536. * @return 1 when one.
  537. * @return 0 when not one.
  538. */
  539. #define sp_isword(a, d) \
  540. ((((d) == 0) && sp_iszero(a)) || (((a)->used == 1) && ((a)->dp[0] == (d))))
  541. #else
  542. /* Returns whether multi-precision number has the value 'd'.
  543. *
  544. * Assumes a is not NULL.
  545. *
  546. * @param [in] a SP integer to check.
  547. * @param [in] d SP integer digit.
  548. * @return 1 when one.
  549. * @return 0 when not one.
  550. */
  551. #define sp_isword(a, d) \
  552. ((((d) == 0) && sp_iszero(a)) || \
  553. (((a)->used == 1) && ((a)->dp[0] == (d)) && ((a)->sign == MP_ZPOS)))
  554. #endif
  555. #ifndef WOLFSSL_SP_INT_NEGATIVE
  556. /* Calculate the absolute value of the multi-precision number.
  557. *
  558. * Negative support not compiled in so just copies.
  559. *
  560. * @param [in] a SP integer to calculate absolute value of.
  561. * @param [out] r SP integer to hold result.
  562. *
  563. * @return MP_OKAY on success.
  564. * @return MP_VAL when a or r is NULL.
  565. */
  566. #define sp_abs(a, b) sp_copy(a, b)
  567. /* Returns whether multi-precision number is negative.
  568. *
  569. * Negative support not compiled in so always returns 0 (false).
  570. *
  571. * @param [in] a SP integer to check.
  572. * @param [in] d SP integer digit.
  573. * @return 0 indicating not negative always.
  574. */
  575. #define sp_isneg(a) (0)
  576. #else
  577. /* Returns whether multi-precision number is negative.
  578. *
  579. * Assumes a is not NULL.
  580. *
  581. * @param [in] a SP integer to check.
  582. * @param [in] d SP integer digit.
  583. * @return 1 when negative.
  584. * @return 0 when not negative.
  585. */
  586. #define sp_isneg(a) ((a)->sign == MP_NEG)
  587. #endif
  588. /* Updates the used count to exclude leading zeros.
  589. *
  590. * Assumes a is not NULL.
  591. *
  592. * @param [in] a SP integer to update.
  593. */
  594. #define sp_clamp(a) \
  595. do { \
  596. int ii; \
  597. for (ii = (a)->used - 1; ii >= 0 && (a)->dp[ii] == 0; ii--) { \
  598. } \
  599. (a)->used = ii + 1; \
  600. } while (0)
  601. /* Check the compiled and linked math implementation are the same.
  602. * Use the number of bits in a digit as indication of how code was compiled.
  603. *
  604. * @return 1 when the number of bits are the same.
  605. * @return 0 when the number of bits are different.
  606. */
  607. #define CheckFastMathSettings() (SP_WORD_SIZE == CheckRunTimeFastMath())
  608. /* The number of bytes to a sp_int with 'cnt' digits.
  609. * Must have at least one digit.
  610. */
  611. #define MP_INT_SIZEOF(cnt) \
  612. (sizeof(sp_int) - (SP_INT_DIGITS - (((cnt) == 0) ? 1 : (cnt))) * \
  613. sizeof(sp_int_digit))
  614. /* The address of the next sp_int after one with 'cnt' digits. */
  615. #define MP_INT_NEXT(t, cnt) \
  616. (sp_int*)(((byte*)(t)) + MP_INT_SIZEOF(cnt))
  617. /**
  618. * A result of NO.
  619. * e.g. Is prime? NO.
  620. */
  621. #define MP_NO 0
  622. /**
  623. * A result of YES.
  624. * e.g. Is prime? YES.
  625. */
  626. #define MP_YES 1
  627. #ifdef WOLFSSL_SP_INT_NEGATIVE
  628. /** Number is 0/positive. */
  629. #define MP_ZPOS 0
  630. /** Number is negative. */
  631. #define MP_NEG 1
  632. #endif
  633. /** Radix is base 10 or decimal. */
  634. #define MP_RADIX_DEC 10
  635. /** Radix is base 16 or hexadecimal. */
  636. #define MP_RADIX_HEX 16
  637. /** Result of comparison is that the first number is greater than second. */
  638. #define MP_GT 1
  639. /** Result of comparison is they are equal. */
  640. #define MP_EQ 0
  641. /** Result of comparison is that the first number is less than second. */
  642. #define MP_LT (-1)
  643. /* ERROR VALUES */
  644. /** Error value on success. */
  645. #define MP_OKAY 0
  646. /** Error value when dynamic memory allocation fails. */
  647. #define MP_MEM (-2)
  648. /** Error value when value passed is not able to be used. */
  649. #define MP_VAL (-3)
  650. /** Error value when non-blocking operation is returning after partial
  651. * completion.
  652. */
  653. #define FP_WOULDBLOCK (-4)
  654. /* Unused error. Defined for backward compatability. */
  655. #define MP_NOT_INF (-5)
  656. /* Unused error. Defined for backward compatability. */
  657. #define MP_RANGE MP_NOT_INF
  658. #ifdef USE_FAST_MATH
  659. /* For old FIPS, need FP_MEM defined for old implementation. */
  660. #define FP_MEM (-2)
  661. #endif
  662. /* Number of bits in each word/digit. */
  663. #define DIGIT_BIT SP_WORD_SIZE
  664. /* Mask of all used bits in word/digit. */
  665. #define MP_MASK SP_MASK
  666. #ifdef HAVE_WOLF_BIGINT
  667. /* Raw big integer as a big-endian byte array.
  668. *
  669. * Useful for when using hardware - canonical format.
  670. */
  671. typedef struct WC_BIGINT {
  672. /* Dynamically allocated buffer that is big-endian byte array. */
  673. byte* buf;
  674. /* Length of buffer in bytes. */
  675. word32 len;
  676. /* Hint for heap used to allocate buffer. */
  677. void* heap;
  678. } WC_BIGINT;
  679. /* Ensure WC_BIGINT defined once. */
  680. #define WOLF_BIGINT_DEFINED
  681. #endif
  682. /**
  683. * SP integer.
  684. *
  685. * dp at end so user can allocate a smaller amount and set size.
  686. */
  687. typedef struct sp_int {
  688. /** Number of words that contain data. */
  689. int used;
  690. /** Maximum number of words in data. */
  691. int size;
  692. #ifdef WOLFSSL_SP_INT_NEGATIVE
  693. /** Indicates whether number is 0/positive or negative. */
  694. int sign;
  695. #endif
  696. #ifdef HAVE_WOLF_BIGINT
  697. /** Unsigned binary (big endian) representation of number. */
  698. struct WC_BIGINT raw;
  699. #endif
  700. /** Data of number. */
  701. sp_int_digit dp[SP_INT_DIGITS];
  702. } sp_int;
  703. /* Multi-precision integer type is SP integer type. */
  704. typedef sp_int mp_int;
  705. /* Multi-precision integer digit type is SP integer digit type.
  706. * Type is unsigned.
  707. */
  708. typedef sp_int_digit mp_digit;
  709. /* Include the maths operations that are not implementation specific. */
  710. #include <wolfssl/wolfcrypt/wolfmath.h>
  711. /*
  712. * Function prototypes.
  713. */
  714. MP_API int sp_init(sp_int* a);
  715. MP_API int sp_init_size(sp_int* a, int size);
  716. MP_API int sp_init_multi(sp_int* n1, sp_int* n2, sp_int* n3, sp_int* n4,
  717. sp_int* n5, sp_int* n6);
  718. MP_API void sp_free(sp_int* a);
  719. MP_API int sp_grow(sp_int* a, int l);
  720. MP_API void sp_zero(sp_int* a);
  721. MP_API void sp_clear(sp_int* a);
  722. MP_API void sp_forcezero(sp_int* a);
  723. MP_API int sp_init_copy (sp_int* r, sp_int* a);
  724. MP_API int sp_copy(const sp_int* a, sp_int* r);
  725. MP_API int sp_exch(sp_int* a, sp_int* b);
  726. MP_API int sp_cond_swap_ct(mp_int * a, mp_int * b, int c, int m);
  727. #ifdef WOLFSSL_SP_INT_NEGATIVE
  728. MP_API int sp_abs(sp_int* a, sp_int* b);
  729. #endif
  730. #ifdef WOLFSSL_SP_MATH_ALL
  731. MP_API int sp_cmp_mag(sp_int* a, sp_int* b);
  732. #endif
  733. MP_API int sp_cmp(sp_int* a, sp_int* b);
  734. MP_API int sp_is_bit_set(sp_int* a, unsigned int b);
  735. MP_API int sp_count_bits(const sp_int* a);
  736. #if defined(HAVE_ECC) && defined(HAVE_COMP_KEY)
  737. MP_API int sp_cnt_lsb(sp_int* a);
  738. #endif
  739. MP_API int sp_leading_bit(sp_int* a);
  740. MP_API int sp_set_bit(sp_int* a, int i);
  741. MP_API int sp_2expt(sp_int* a, int e);
  742. MP_API int sp_set(sp_int* a, sp_int_digit d);
  743. MP_API int sp_set_int(sp_int* a, unsigned long n);
  744. MP_API int sp_cmp_d(sp_int* a, sp_int_digit d);
  745. MP_API int sp_add_d(sp_int* a, sp_int_digit d, sp_int* r);
  746. MP_API int sp_sub_d(sp_int* a, sp_int_digit d, sp_int* r);
  747. MP_API int sp_mul_d(sp_int* a, sp_int_digit d, sp_int* r);
  748. #if (defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \
  749. defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY) || \
  750. defined(WC_MP_TO_RADIX)
  751. MP_API int sp_div_d(sp_int* a, sp_int_digit d, sp_int* r, sp_int_digit* rem);
  752. #endif
  753. #if defined(WOLFSSL_SP_MATH_ALL) || (defined(HAVE_ECC) && \
  754. defined(HAVE_COMP_KEY)) || defined(OPENSSL_EXTRA)
  755. MP_API int sp_mod_d(sp_int* a, sp_int_digit d, sp_int_digit* r);
  756. #endif
  757. #if defined(WOLFSSL_SP_MATH_ALL) && defined(HAVE_ECC)
  758. MP_API int sp_div_2_mod_ct (sp_int* a, sp_int* b, sp_int* c);
  759. MP_API int sp_div_2(sp_int* a, sp_int* r);
  760. #endif
  761. MP_API int sp_add(sp_int* a, sp_int* b, sp_int* r);
  762. MP_API int sp_sub(sp_int* a, sp_int* b, sp_int* r);
  763. #if (defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \
  764. (!defined(WOLFSSL_SP_MATH) && defined(WOLFSSL_CUSTOM_CURVES)) || \
  765. defined(WOLFCRYPT_HAVE_ECCSI) || defined(WOLFCRYPT_HAVE_SAKKE)
  766. MP_API int sp_addmod(sp_int* a, sp_int* b, sp_int* m, sp_int* r);
  767. #endif
  768. #if defined(WOLFSSL_SP_MATH_ALL) && (!defined(WOLFSSL_RSA_VERIFY_ONLY) || \
  769. defined(HAVE_ECC))
  770. MP_API int sp_submod(sp_int* a, sp_int* b, sp_int* m, sp_int* r);
  771. #endif
  772. #if defined(WOLFSSL_SP_MATH_ALL) && defined(HAVE_ECC)
  773. MP_API int sp_submod_ct (sp_int* a, sp_int* b, sp_int* c, sp_int* d);
  774. MP_API int sp_addmod_ct (sp_int* a, sp_int* b, sp_int* c, sp_int* d);
  775. #endif
  776. MP_API int sp_lshd(sp_int* a, int s);
  777. MP_API void sp_rshd(sp_int* a, int c);
  778. MP_API void sp_rshb(sp_int* a, int n, sp_int* r);
  779. #ifdef WOLFSSL_SP_MATH_ALL
  780. MP_API int sp_div(sp_int* a, sp_int* d, sp_int* r, sp_int* rem);
  781. #endif
  782. MP_API int sp_mod(sp_int* a, sp_int* m, sp_int* r);
  783. MP_API int sp_mul(sp_int* a, sp_int* b, sp_int* r);
  784. MP_API int sp_mulmod(sp_int* a, sp_int* b, sp_int* m, sp_int* r);
  785. MP_API int sp_invmod(sp_int* a, sp_int* m, sp_int* r);
  786. #if defined(WOLFSSL_SP_MATH_ALL) && defined(HAVE_ECC)
  787. MP_API int sp_invmod_mont_ct(sp_int* a, sp_int* m, sp_int* r, sp_int_digit mp);
  788. #endif
  789. MP_API int sp_exptmod_ex(sp_int* b, sp_int* e, int digits, sp_int* m,
  790. sp_int* r);
  791. MP_API int sp_exptmod(sp_int* b, sp_int* e, sp_int* m, sp_int* r);
  792. #if defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_HAVE_SP_DH)
  793. MP_API int sp_exptmod_nct(sp_int* b, sp_int* e, sp_int* m, sp_int* r);
  794. #endif
  795. #ifdef WOLFSSL_SP_MATH_ALL
  796. MP_API int sp_div_2d(sp_int* a, int e, sp_int* r, sp_int* rem);
  797. MP_API int sp_mod_2d(sp_int* a, int e, sp_int* r);
  798. MP_API int sp_mul_2d(sp_int* a, int e, sp_int* r);
  799. #endif
  800. MP_API int sp_sqr(sp_int* a, sp_int* r);
  801. MP_API int sp_sqrmod(sp_int* a, sp_int* m, sp_int* r);
  802. MP_API int sp_mont_red(sp_int* a, sp_int* m, sp_int_digit mp);
  803. MP_API int sp_mont_setup(sp_int* m, sp_int_digit* rho);
  804. MP_API int sp_mont_norm(sp_int* norm, sp_int* m);
  805. MP_API int sp_unsigned_bin_size(const sp_int* a);
  806. MP_API int sp_read_unsigned_bin(sp_int* a, const byte* in, word32 inSz);
  807. MP_API int sp_to_unsigned_bin(sp_int* a, byte* out);
  808. MP_API int sp_to_unsigned_bin_len(sp_int* a, byte* out, int outSz);
  809. #ifdef WOLFSSL_SP_MATH_ALL
  810. MP_API int sp_to_unsigned_bin_at_pos(int o, sp_int* a, unsigned char* out);
  811. #endif
  812. MP_API int sp_read_radix(sp_int* a, const char* in, int radix);
  813. MP_API int sp_tohex(sp_int* a, char* str);
  814. MP_API int sp_todecimal(mp_int* a, char* str);
  815. #if defined(WOLFSSL_SP_MATH_ALL) || defined(WC_MP_TO_RADIX)
  816. MP_API int sp_toradix(mp_int* a, char* str, int radix);
  817. MP_API int sp_radix_size(mp_int* a, int radix, int* size);
  818. #endif
  819. MP_API int sp_rand_prime(sp_int* r, int len, WC_RNG* rng, void* heap);
  820. MP_API int sp_prime_is_prime(mp_int* a, int t, int* result);
  821. MP_API int sp_prime_is_prime_ex(mp_int* a, int t, int* result, WC_RNG* rng);
  822. #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN)
  823. MP_API int sp_gcd(sp_int* a, sp_int* b, sp_int* r);
  824. #endif
  825. #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \
  826. (!defined(WC_RSA_BLINDING) || defined(HAVE_FIPS) || defined(HAVE_SELFTEST))
  827. MP_API int sp_lcm(sp_int* a, sp_int* b, sp_int* r);
  828. #endif
  829. WOLFSSL_API word32 CheckRunTimeFastMath(void);
  830. #ifdef WOLFSSL_CHECK_MEM_ZERO
  831. WOLFSSL_LOCAL void sp_memzero_add(const char* name, mp_int* mp);
  832. WOLFSSL_LOCAL void sp_memzero_check(mp_int* mp);
  833. #endif
  834. /* Map mp functions to SP math versions. */
  835. /* Different name or signature. */
  836. #define mp_mul_2(a, r) sp_mul_2d(a, 1, r)
  837. #define mp_div_3(a, r, rem) sp_div_d(a, 3, r, rem)
  838. #define mp_rshb(A,x) sp_rshb(A,x,A)
  839. #define mp_is_bit_set(a,b) sp_is_bit_set(a,(unsigned int)(b))
  840. #define mp_montgomery_reduce sp_mont_red
  841. #define mp_montgomery_setup sp_mont_setup
  842. #define mp_montgomery_calc_normalization sp_mont_norm
  843. /* Macros mappings. */
  844. #define mp_isodd sp_isodd
  845. #define mp_iseven sp_iseven
  846. #define mp_iszero sp_iszero
  847. #define mp_isone sp_isone
  848. #define mp_isword sp_isword
  849. #define mp_abs sp_abs
  850. #define mp_isneg sp_isneg
  851. #define mp_clamp sp_clamp
  852. /* One to one mappings. */
  853. #define mp_init sp_init
  854. #define mp_init_size sp_init_size
  855. #define mp_init_multi sp_init_multi
  856. #define mp_free sp_free
  857. #define mp_grow sp_grow
  858. #define mp_zero sp_zero
  859. #define mp_clear sp_clear
  860. #define mp_forcezero sp_forcezero
  861. #define mp_copy sp_copy
  862. #define mp_init_copy sp_init_copy
  863. #define mp_exch sp_exch
  864. #define mp_cond_swap_ct sp_cond_swap_ct
  865. #define mp_cmp_mag sp_cmp_mag
  866. #define mp_cmp sp_cmp
  867. #define mp_count_bits sp_count_bits
  868. #define mp_cnt_lsb sp_cnt_lsb
  869. #define mp_leading_bit sp_leading_bit
  870. #define mp_set_bit sp_set_bit
  871. #define mp_2expt sp_2expt
  872. #define mp_set sp_set
  873. #define mp_set_int sp_set_int
  874. #define mp_cmp_d sp_cmp_d
  875. #define mp_add_d sp_add_d
  876. #define mp_sub_d sp_sub_d
  877. #define mp_mul_d sp_mul_d
  878. #define mp_div_d sp_div_d
  879. #define mp_mod_d sp_mod_d
  880. #define mp_div_2_mod_ct sp_div_2_mod_ct
  881. #define mp_div_2 sp_div_2
  882. #define mp_add sp_add
  883. #define mp_sub sp_sub
  884. #define mp_addmod sp_addmod
  885. #define mp_submod sp_submod
  886. #define mp_addmod_ct sp_addmod_ct
  887. #define mp_submod_ct sp_submod_ct
  888. #define mp_lshd sp_lshd
  889. #define mp_rshd sp_rshd
  890. #define mp_div sp_div
  891. #define mp_mod sp_mod
  892. #define mp_mul sp_mul
  893. #define mp_mulmod sp_mulmod
  894. #define mp_invmod sp_invmod
  895. #define mp_invmod_mont_ct sp_invmod_mont_ct
  896. #define mp_exptmod_ex sp_exptmod_ex
  897. #define mp_exptmod sp_exptmod
  898. #define mp_exptmod_nct sp_exptmod_nct
  899. #define mp_div_2d sp_div_2d
  900. #define mp_mod_2d sp_mod_2d
  901. #define mp_mul_2d sp_mul_2d
  902. #define mp_sqr sp_sqr
  903. #define mp_sqrmod sp_sqrmod
  904. #define mp_unsigned_bin_size sp_unsigned_bin_size
  905. #define mp_read_unsigned_bin sp_read_unsigned_bin
  906. #define mp_to_unsigned_bin sp_to_unsigned_bin
  907. #define mp_to_unsigned_bin_len sp_to_unsigned_bin_len
  908. #define mp_to_unsigned_bin_at_pos sp_to_unsigned_bin_at_pos
  909. #define mp_read_radix sp_read_radix
  910. #define mp_tohex sp_tohex
  911. #define mp_todecimal sp_todecimal
  912. #define mp_toradix sp_toradix
  913. #define mp_radix_size sp_radix_size
  914. #define mp_rand_prime sp_rand_prime
  915. #define mp_prime_is_prime sp_prime_is_prime
  916. #define mp_prime_is_prime_ex sp_prime_is_prime_ex
  917. #define mp_gcd sp_gcd
  918. #define mp_lcm sp_lcm
  919. #define mp_memzero_add sp_memzero_add
  920. #define mp_memzero_check sp_memzero_check
  921. #ifdef WOLFSSL_DEBUG_MATH
  922. #define mp_dump(d, a, v) sp_print(a, d)
  923. #endif
  924. #endif /* WOLFSSL_SP_MATH || WOLFSSL_SP_MATH_ALL */
  925. #ifdef __cplusplus
  926. } /* extern "C" */
  927. #endif
  928. #endif /* WOLF_CRYPT_SP_H */