ring-native 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/Gemfile +3 -0
  4. data/README.md +22 -0
  5. data/Rakefile +1 -0
  6. data/ext/ring/extconf.rb +29 -0
  7. data/lib/ring/native.rb +8 -0
  8. data/lib/ring/native/version.rb +5 -0
  9. data/ring-native.gemspec +25 -0
  10. data/vendor/ring/BUILDING.md +40 -0
  11. data/vendor/ring/Cargo.toml +43 -0
  12. data/vendor/ring/LICENSE +185 -0
  13. data/vendor/ring/Makefile +35 -0
  14. data/vendor/ring/PORTING.md +163 -0
  15. data/vendor/ring/README.md +113 -0
  16. data/vendor/ring/STYLE.md +197 -0
  17. data/vendor/ring/appveyor.yml +27 -0
  18. data/vendor/ring/build.rs +108 -0
  19. data/vendor/ring/crypto/aes/aes.c +1142 -0
  20. data/vendor/ring/crypto/aes/aes_test.Windows.vcxproj +25 -0
  21. data/vendor/ring/crypto/aes/aes_test.cc +93 -0
  22. data/vendor/ring/crypto/aes/asm/aes-586.pl +2368 -0
  23. data/vendor/ring/crypto/aes/asm/aes-armv4.pl +1249 -0
  24. data/vendor/ring/crypto/aes/asm/aes-x86_64.pl +2246 -0
  25. data/vendor/ring/crypto/aes/asm/aesni-x86.pl +1318 -0
  26. data/vendor/ring/crypto/aes/asm/aesni-x86_64.pl +2084 -0
  27. data/vendor/ring/crypto/aes/asm/aesv8-armx.pl +675 -0
  28. data/vendor/ring/crypto/aes/asm/bsaes-armv7.pl +1364 -0
  29. data/vendor/ring/crypto/aes/asm/bsaes-x86_64.pl +1565 -0
  30. data/vendor/ring/crypto/aes/asm/vpaes-x86.pl +841 -0
  31. data/vendor/ring/crypto/aes/asm/vpaes-x86_64.pl +1116 -0
  32. data/vendor/ring/crypto/aes/internal.h +87 -0
  33. data/vendor/ring/crypto/aes/mode_wrappers.c +61 -0
  34. data/vendor/ring/crypto/bn/add.c +394 -0
  35. data/vendor/ring/crypto/bn/asm/armv4-mont.pl +694 -0
  36. data/vendor/ring/crypto/bn/asm/armv8-mont.pl +1503 -0
  37. data/vendor/ring/crypto/bn/asm/bn-586.pl +774 -0
  38. data/vendor/ring/crypto/bn/asm/co-586.pl +287 -0
  39. data/vendor/ring/crypto/bn/asm/rsaz-avx2.pl +1882 -0
  40. data/vendor/ring/crypto/bn/asm/x86-mont.pl +592 -0
  41. data/vendor/ring/crypto/bn/asm/x86_64-gcc.c +599 -0
  42. data/vendor/ring/crypto/bn/asm/x86_64-mont.pl +1393 -0
  43. data/vendor/ring/crypto/bn/asm/x86_64-mont5.pl +3507 -0
  44. data/vendor/ring/crypto/bn/bn.c +352 -0
  45. data/vendor/ring/crypto/bn/bn_asn1.c +74 -0
  46. data/vendor/ring/crypto/bn/bn_test.Windows.vcxproj +25 -0
  47. data/vendor/ring/crypto/bn/bn_test.cc +1696 -0
  48. data/vendor/ring/crypto/bn/cmp.c +200 -0
  49. data/vendor/ring/crypto/bn/convert.c +433 -0
  50. data/vendor/ring/crypto/bn/ctx.c +311 -0
  51. data/vendor/ring/crypto/bn/div.c +594 -0
  52. data/vendor/ring/crypto/bn/exponentiation.c +1335 -0
  53. data/vendor/ring/crypto/bn/gcd.c +711 -0
  54. data/vendor/ring/crypto/bn/generic.c +1019 -0
  55. data/vendor/ring/crypto/bn/internal.h +316 -0
  56. data/vendor/ring/crypto/bn/montgomery.c +516 -0
  57. data/vendor/ring/crypto/bn/mul.c +888 -0
  58. data/vendor/ring/crypto/bn/prime.c +829 -0
  59. data/vendor/ring/crypto/bn/random.c +334 -0
  60. data/vendor/ring/crypto/bn/rsaz_exp.c +262 -0
  61. data/vendor/ring/crypto/bn/rsaz_exp.h +53 -0
  62. data/vendor/ring/crypto/bn/shift.c +276 -0
  63. data/vendor/ring/crypto/bytestring/bytestring_test.Windows.vcxproj +25 -0
  64. data/vendor/ring/crypto/bytestring/bytestring_test.cc +421 -0
  65. data/vendor/ring/crypto/bytestring/cbb.c +399 -0
  66. data/vendor/ring/crypto/bytestring/cbs.c +227 -0
  67. data/vendor/ring/crypto/bytestring/internal.h +46 -0
  68. data/vendor/ring/crypto/chacha/chacha_generic.c +140 -0
  69. data/vendor/ring/crypto/chacha/chacha_vec.c +323 -0
  70. data/vendor/ring/crypto/chacha/chacha_vec_arm.S +1447 -0
  71. data/vendor/ring/crypto/chacha/chacha_vec_arm_generate.go +153 -0
  72. data/vendor/ring/crypto/cipher/cipher_test.Windows.vcxproj +25 -0
  73. data/vendor/ring/crypto/cipher/e_aes.c +390 -0
  74. data/vendor/ring/crypto/cipher/e_chacha20poly1305.c +208 -0
  75. data/vendor/ring/crypto/cipher/internal.h +173 -0
  76. data/vendor/ring/crypto/cipher/test/aes_128_gcm_tests.txt +543 -0
  77. data/vendor/ring/crypto/cipher/test/aes_128_key_wrap_tests.txt +9 -0
  78. data/vendor/ring/crypto/cipher/test/aes_256_gcm_tests.txt +475 -0
  79. data/vendor/ring/crypto/cipher/test/aes_256_key_wrap_tests.txt +23 -0
  80. data/vendor/ring/crypto/cipher/test/chacha20_poly1305_old_tests.txt +422 -0
  81. data/vendor/ring/crypto/cipher/test/chacha20_poly1305_tests.txt +484 -0
  82. data/vendor/ring/crypto/cipher/test/cipher_test.txt +100 -0
  83. data/vendor/ring/crypto/constant_time_test.Windows.vcxproj +25 -0
  84. data/vendor/ring/crypto/constant_time_test.c +304 -0
  85. data/vendor/ring/crypto/cpu-arm-asm.S +32 -0
  86. data/vendor/ring/crypto/cpu-arm.c +199 -0
  87. data/vendor/ring/crypto/cpu-intel.c +261 -0
  88. data/vendor/ring/crypto/crypto.c +151 -0
  89. data/vendor/ring/crypto/curve25519/asm/x25519-arm.S +2118 -0
  90. data/vendor/ring/crypto/curve25519/curve25519.c +4888 -0
  91. data/vendor/ring/crypto/curve25519/x25519_test.cc +128 -0
  92. data/vendor/ring/crypto/digest/md32_common.h +181 -0
  93. data/vendor/ring/crypto/ec/asm/p256-x86_64-asm.pl +2725 -0
  94. data/vendor/ring/crypto/ec/ec.c +193 -0
  95. data/vendor/ring/crypto/ec/ec_curves.c +61 -0
  96. data/vendor/ring/crypto/ec/ec_key.c +228 -0
  97. data/vendor/ring/crypto/ec/ec_montgomery.c +114 -0
  98. data/vendor/ring/crypto/ec/example_mul.Windows.vcxproj +25 -0
  99. data/vendor/ring/crypto/ec/internal.h +243 -0
  100. data/vendor/ring/crypto/ec/oct.c +253 -0
  101. data/vendor/ring/crypto/ec/p256-64.c +1794 -0
  102. data/vendor/ring/crypto/ec/p256-x86_64-table.h +9548 -0
  103. data/vendor/ring/crypto/ec/p256-x86_64.c +509 -0
  104. data/vendor/ring/crypto/ec/simple.c +1007 -0
  105. data/vendor/ring/crypto/ec/util-64.c +183 -0
  106. data/vendor/ring/crypto/ec/wnaf.c +508 -0
  107. data/vendor/ring/crypto/ecdh/ecdh.c +155 -0
  108. data/vendor/ring/crypto/ecdsa/ecdsa.c +304 -0
  109. data/vendor/ring/crypto/ecdsa/ecdsa_asn1.c +193 -0
  110. data/vendor/ring/crypto/ecdsa/ecdsa_test.Windows.vcxproj +25 -0
  111. data/vendor/ring/crypto/ecdsa/ecdsa_test.cc +327 -0
  112. data/vendor/ring/crypto/header_removed.h +17 -0
  113. data/vendor/ring/crypto/internal.h +495 -0
  114. data/vendor/ring/crypto/libring.Windows.vcxproj +101 -0
  115. data/vendor/ring/crypto/mem.c +98 -0
  116. data/vendor/ring/crypto/modes/asm/aesni-gcm-x86_64.pl +1045 -0
  117. data/vendor/ring/crypto/modes/asm/ghash-armv4.pl +517 -0
  118. data/vendor/ring/crypto/modes/asm/ghash-x86.pl +1393 -0
  119. data/vendor/ring/crypto/modes/asm/ghash-x86_64.pl +1741 -0
  120. data/vendor/ring/crypto/modes/asm/ghashv8-armx.pl +422 -0
  121. data/vendor/ring/crypto/modes/ctr.c +226 -0
  122. data/vendor/ring/crypto/modes/gcm.c +1206 -0
  123. data/vendor/ring/crypto/modes/gcm_test.Windows.vcxproj +25 -0
  124. data/vendor/ring/crypto/modes/gcm_test.c +348 -0
  125. data/vendor/ring/crypto/modes/internal.h +299 -0
  126. data/vendor/ring/crypto/perlasm/arm-xlate.pl +170 -0
  127. data/vendor/ring/crypto/perlasm/readme +100 -0
  128. data/vendor/ring/crypto/perlasm/x86_64-xlate.pl +1164 -0
  129. data/vendor/ring/crypto/perlasm/x86asm.pl +292 -0
  130. data/vendor/ring/crypto/perlasm/x86gas.pl +263 -0
  131. data/vendor/ring/crypto/perlasm/x86masm.pl +200 -0
  132. data/vendor/ring/crypto/perlasm/x86nasm.pl +187 -0
  133. data/vendor/ring/crypto/poly1305/poly1305.c +331 -0
  134. data/vendor/ring/crypto/poly1305/poly1305_arm.c +301 -0
  135. data/vendor/ring/crypto/poly1305/poly1305_arm_asm.S +2015 -0
  136. data/vendor/ring/crypto/poly1305/poly1305_test.Windows.vcxproj +25 -0
  137. data/vendor/ring/crypto/poly1305/poly1305_test.cc +80 -0
  138. data/vendor/ring/crypto/poly1305/poly1305_test.txt +52 -0
  139. data/vendor/ring/crypto/poly1305/poly1305_vec.c +892 -0
  140. data/vendor/ring/crypto/rand/asm/rdrand-x86_64.pl +75 -0
  141. data/vendor/ring/crypto/rand/internal.h +32 -0
  142. data/vendor/ring/crypto/rand/rand.c +189 -0
  143. data/vendor/ring/crypto/rand/urandom.c +219 -0
  144. data/vendor/ring/crypto/rand/windows.c +56 -0
  145. data/vendor/ring/crypto/refcount_c11.c +66 -0
  146. data/vendor/ring/crypto/refcount_lock.c +53 -0
  147. data/vendor/ring/crypto/refcount_test.Windows.vcxproj +25 -0
  148. data/vendor/ring/crypto/refcount_test.c +58 -0
  149. data/vendor/ring/crypto/rsa/blinding.c +462 -0
  150. data/vendor/ring/crypto/rsa/internal.h +108 -0
  151. data/vendor/ring/crypto/rsa/padding.c +300 -0
  152. data/vendor/ring/crypto/rsa/rsa.c +450 -0
  153. data/vendor/ring/crypto/rsa/rsa_asn1.c +261 -0
  154. data/vendor/ring/crypto/rsa/rsa_impl.c +944 -0
  155. data/vendor/ring/crypto/rsa/rsa_test.Windows.vcxproj +25 -0
  156. data/vendor/ring/crypto/rsa/rsa_test.cc +437 -0
  157. data/vendor/ring/crypto/sha/asm/sha-armv8.pl +436 -0
  158. data/vendor/ring/crypto/sha/asm/sha-x86_64.pl +2390 -0
  159. data/vendor/ring/crypto/sha/asm/sha256-586.pl +1275 -0
  160. data/vendor/ring/crypto/sha/asm/sha256-armv4.pl +735 -0
  161. data/vendor/ring/crypto/sha/asm/sha256-armv8.pl +14 -0
  162. data/vendor/ring/crypto/sha/asm/sha256-x86_64.pl +14 -0
  163. data/vendor/ring/crypto/sha/asm/sha512-586.pl +911 -0
  164. data/vendor/ring/crypto/sha/asm/sha512-armv4.pl +666 -0
  165. data/vendor/ring/crypto/sha/asm/sha512-armv8.pl +14 -0
  166. data/vendor/ring/crypto/sha/asm/sha512-x86_64.pl +14 -0
  167. data/vendor/ring/crypto/sha/sha1.c +271 -0
  168. data/vendor/ring/crypto/sha/sha256.c +204 -0
  169. data/vendor/ring/crypto/sha/sha512.c +355 -0
  170. data/vendor/ring/crypto/test/file_test.cc +326 -0
  171. data/vendor/ring/crypto/test/file_test.h +181 -0
  172. data/vendor/ring/crypto/test/malloc.cc +150 -0
  173. data/vendor/ring/crypto/test/scoped_types.h +95 -0
  174. data/vendor/ring/crypto/test/test.Windows.vcxproj +35 -0
  175. data/vendor/ring/crypto/test/test_util.cc +46 -0
  176. data/vendor/ring/crypto/test/test_util.h +41 -0
  177. data/vendor/ring/crypto/thread_none.c +55 -0
  178. data/vendor/ring/crypto/thread_pthread.c +165 -0
  179. data/vendor/ring/crypto/thread_test.Windows.vcxproj +25 -0
  180. data/vendor/ring/crypto/thread_test.c +200 -0
  181. data/vendor/ring/crypto/thread_win.c +282 -0
  182. data/vendor/ring/examples/checkdigest.rs +103 -0
  183. data/vendor/ring/include/openssl/aes.h +121 -0
  184. data/vendor/ring/include/openssl/arm_arch.h +129 -0
  185. data/vendor/ring/include/openssl/base.h +156 -0
  186. data/vendor/ring/include/openssl/bn.h +794 -0
  187. data/vendor/ring/include/openssl/buffer.h +18 -0
  188. data/vendor/ring/include/openssl/bytestring.h +235 -0
  189. data/vendor/ring/include/openssl/chacha.h +37 -0
  190. data/vendor/ring/include/openssl/cmac.h +76 -0
  191. data/vendor/ring/include/openssl/cpu.h +184 -0
  192. data/vendor/ring/include/openssl/crypto.h +43 -0
  193. data/vendor/ring/include/openssl/curve25519.h +88 -0
  194. data/vendor/ring/include/openssl/ec.h +225 -0
  195. data/vendor/ring/include/openssl/ec_key.h +129 -0
  196. data/vendor/ring/include/openssl/ecdh.h +110 -0
  197. data/vendor/ring/include/openssl/ecdsa.h +156 -0
  198. data/vendor/ring/include/openssl/err.h +201 -0
  199. data/vendor/ring/include/openssl/mem.h +101 -0
  200. data/vendor/ring/include/openssl/obj_mac.h +71 -0
  201. data/vendor/ring/include/openssl/opensslfeatures.h +68 -0
  202. data/vendor/ring/include/openssl/opensslv.h +18 -0
  203. data/vendor/ring/include/openssl/ossl_typ.h +18 -0
  204. data/vendor/ring/include/openssl/poly1305.h +51 -0
  205. data/vendor/ring/include/openssl/rand.h +70 -0
  206. data/vendor/ring/include/openssl/rsa.h +399 -0
  207. data/vendor/ring/include/openssl/thread.h +133 -0
  208. data/vendor/ring/include/openssl/type_check.h +71 -0
  209. data/vendor/ring/mk/Common.props +63 -0
  210. data/vendor/ring/mk/Windows.props +42 -0
  211. data/vendor/ring/mk/WindowsTest.props +18 -0
  212. data/vendor/ring/mk/appveyor.bat +62 -0
  213. data/vendor/ring/mk/bottom_of_makefile.mk +54 -0
  214. data/vendor/ring/mk/ring.mk +266 -0
  215. data/vendor/ring/mk/top_of_makefile.mk +214 -0
  216. data/vendor/ring/mk/travis.sh +40 -0
  217. data/vendor/ring/mk/update-travis-yml.py +229 -0
  218. data/vendor/ring/ring.sln +153 -0
  219. data/vendor/ring/src/aead.rs +682 -0
  220. data/vendor/ring/src/agreement.rs +248 -0
  221. data/vendor/ring/src/c.rs +129 -0
  222. data/vendor/ring/src/constant_time.rs +37 -0
  223. data/vendor/ring/src/der.rs +96 -0
  224. data/vendor/ring/src/digest.rs +690 -0
  225. data/vendor/ring/src/digest_tests.txt +57 -0
  226. data/vendor/ring/src/ecc.rs +28 -0
  227. data/vendor/ring/src/ecc_build.rs +279 -0
  228. data/vendor/ring/src/ecc_curves.rs +117 -0
  229. data/vendor/ring/src/ed25519_tests.txt +2579 -0
  230. data/vendor/ring/src/exe_tests.rs +46 -0
  231. data/vendor/ring/src/ffi.rs +29 -0
  232. data/vendor/ring/src/file_test.rs +187 -0
  233. data/vendor/ring/src/hkdf.rs +153 -0
  234. data/vendor/ring/src/hkdf_tests.txt +59 -0
  235. data/vendor/ring/src/hmac.rs +414 -0
  236. data/vendor/ring/src/hmac_tests.txt +97 -0
  237. data/vendor/ring/src/input.rs +312 -0
  238. data/vendor/ring/src/lib.rs +41 -0
  239. data/vendor/ring/src/pbkdf2.rs +265 -0
  240. data/vendor/ring/src/pbkdf2_tests.txt +113 -0
  241. data/vendor/ring/src/polyfill.rs +57 -0
  242. data/vendor/ring/src/rand.rs +28 -0
  243. data/vendor/ring/src/signature.rs +314 -0
  244. data/vendor/ring/third-party/NIST/README.md +9 -0
  245. data/vendor/ring/third-party/NIST/SHAVS/SHA1LongMsg.rsp +263 -0
  246. data/vendor/ring/third-party/NIST/SHAVS/SHA1Monte.rsp +309 -0
  247. data/vendor/ring/third-party/NIST/SHAVS/SHA1ShortMsg.rsp +267 -0
  248. data/vendor/ring/third-party/NIST/SHAVS/SHA224LongMsg.rsp +263 -0
  249. data/vendor/ring/third-party/NIST/SHAVS/SHA224Monte.rsp +309 -0
  250. data/vendor/ring/third-party/NIST/SHAVS/SHA224ShortMsg.rsp +267 -0
  251. data/vendor/ring/third-party/NIST/SHAVS/SHA256LongMsg.rsp +263 -0
  252. data/vendor/ring/third-party/NIST/SHAVS/SHA256Monte.rsp +309 -0
  253. data/vendor/ring/third-party/NIST/SHAVS/SHA256ShortMsg.rsp +267 -0
  254. data/vendor/ring/third-party/NIST/SHAVS/SHA384LongMsg.rsp +519 -0
  255. data/vendor/ring/third-party/NIST/SHAVS/SHA384Monte.rsp +309 -0
  256. data/vendor/ring/third-party/NIST/SHAVS/SHA384ShortMsg.rsp +523 -0
  257. data/vendor/ring/third-party/NIST/SHAVS/SHA512LongMsg.rsp +519 -0
  258. data/vendor/ring/third-party/NIST/SHAVS/SHA512Monte.rsp +309 -0
  259. data/vendor/ring/third-party/NIST/SHAVS/SHA512ShortMsg.rsp +523 -0
  260. data/vendor/ring/third-party/NIST/sha256sums.txt +1 -0
  261. metadata +333 -0
@@ -0,0 +1,129 @@
1
+ /* ====================================================================
2
+ * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved.
3
+ *
4
+ * Redistribution and use in source and binary forms, with or without
5
+ * modification, are permitted provided that the following conditions
6
+ * are met:
7
+ *
8
+ * 1. Redistributions of source code must retain the above copyright
9
+ * notice, this list of conditions and the following disclaimer.
10
+ *
11
+ * 2. Redistributions in binary form must reproduce the above copyright
12
+ * notice, this list of conditions and the following disclaimer in
13
+ * the documentation and/or other materials provided with the
14
+ * distribution.
15
+ *
16
+ * 3. All advertising materials mentioning features or use of this
17
+ * software must display the following acknowledgment:
18
+ * "This product includes software developed by the OpenSSL Project
19
+ * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
20
+ *
21
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
22
+ * endorse or promote products derived from this software without
23
+ * prior written permission. For written permission, please contact
24
+ * openssl-core@openssl.org.
25
+ *
26
+ * 5. Products derived from this software may not be called "OpenSSL"
27
+ * nor may "OpenSSL" appear in their names without prior written
28
+ * permission of the OpenSSL Project.
29
+ *
30
+ * 6. Redistributions of any form whatsoever must retain the following
31
+ * acknowledgment:
32
+ * "This product includes software developed by the OpenSSL Project
33
+ * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
34
+ *
35
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
36
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
39
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
47
+ * ====================================================================
48
+ *
49
+ * This product includes cryptographic software written by Eric Young
50
+ * (eay@cryptsoft.com). This product includes software written by Tim
51
+ * Hudson (tjh@cryptsoft.com). */
52
+
53
+ #ifndef OPENSSL_HEADER_ARM_ARCH_H
54
+ #define OPENSSL_HEADER_ARM_ARCH_H
55
+
56
+ #if !defined(__ARM_ARCH__)
57
+ # if defined(__CC_ARM)
58
+ # define __ARM_ARCH__ __TARGET_ARCH_ARM
59
+ # if defined(__BIG_ENDIAN)
60
+ # define __ARMEB__
61
+ # else
62
+ # define __ARMEL__
63
+ # endif
64
+ # elif defined(__GNUC__)
65
+ # if defined(__aarch64__)
66
+ # define __ARM_ARCH__ 8
67
+ # if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
68
+ # define __ARMEB__
69
+ # else
70
+ # define __ARMEL__
71
+ # endif
72
+ /* Why doesn't gcc define __ARM_ARCH__? Instead it defines
73
+ * bunch of below macros. See all_architectires[] table in
74
+ * gcc/config/arm/arm.c. On a side note it defines
75
+ * __ARMEL__/__ARMEB__ for little-/big-endian. */
76
+ # elif defined(__ARM_ARCH)
77
+ # define __ARM_ARCH__ __ARM_ARCH
78
+ # elif defined(__ARM_ARCH_8A__)
79
+ # define __ARM_ARCH__ 8
80
+ # elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \
81
+ defined(__ARM_ARCH_7R__)|| defined(__ARM_ARCH_7M__) || \
82
+ defined(__ARM_ARCH_7EM__)
83
+ # define __ARM_ARCH__ 7
84
+ # elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || \
85
+ defined(__ARM_ARCH_6K__)|| defined(__ARM_ARCH_6M__) || \
86
+ defined(__ARM_ARCH_6Z__)|| defined(__ARM_ARCH_6ZK__) || \
87
+ defined(__ARM_ARCH_6T2__)
88
+ # define __ARM_ARCH__ 6
89
+ # elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || \
90
+ defined(__ARM_ARCH_5E__)|| defined(__ARM_ARCH_5TE__) || \
91
+ defined(__ARM_ARCH_5TEJ__)
92
+ # define __ARM_ARCH__ 5
93
+ # elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__)
94
+ # define __ARM_ARCH__ 4
95
+ # else
96
+ # error "unsupported ARM architecture"
97
+ # endif
98
+ # endif
99
+ #endif
100
+
101
+ /* Even when building for 32-bit ARM, support for aarch64 crypto instructions
102
+ * will be included. */
103
+ #if !defined(__ARM_MAX_ARCH__)
104
+ #define __ARM_MAX_ARCH__ 8
105
+ #endif
106
+
107
+ /* ARMV7_NEON is true when a NEON unit is present in the current CPU. */
108
+ #define ARMV7_NEON (1 << 0)
109
+
110
+ /* ARMV7_NEON_FUNCTIONAL is true when the NEON unit doesn't contain subtle bugs.
111
+ * The Poly1305 NEON code is known to trigger bugs in the NEON units of some
112
+ * phones. If this bit isn't set then the Poly1305 NEON code won't be used.
113
+ * See https://code.google.com/p/chromium/issues/detail?id=341598. */
114
+ #define ARMV7_NEON_FUNCTIONAL (1 << 10)
115
+
116
+ /* ARMV8_AES indicates support for hardware AES instructions. */
117
+ #define ARMV8_AES (1 << 2)
118
+
119
+ /* ARMV8_SHA1 indicates support for hardware SHA-1 instructions. */
120
+ #define ARMV8_SHA1 (1 << 3)
121
+
122
+ /* ARMV8_SHA256 indicates support for hardware SHA-256 instructions. */
123
+ #define ARMV8_SHA256 (1 << 4)
124
+
125
+ /* ARMV8_PMULL indicates support for carryless multiplication. */
126
+ #define ARMV8_PMULL (1 << 5)
127
+
128
+
129
+ #endif /* OPENSSL_HEADER_ARM_ARCH_H */
@@ -0,0 +1,156 @@
1
+ /* ====================================================================
2
+ * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved.
3
+ *
4
+ * Redistribution and use in source and binary forms, with or without
5
+ * modification, are permitted provided that the following conditions
6
+ * are met:
7
+ *
8
+ * 1. Redistributions of source code must retain the above copyright
9
+ * notice, this list of conditions and the following disclaimer.
10
+ *
11
+ * 2. Redistributions in binary form must reproduce the above copyright
12
+ * notice, this list of conditions and the following disclaimer in
13
+ * the documentation and/or other materials provided with the
14
+ * distribution.
15
+ *
16
+ * 3. All advertising materials mentioning features or use of this
17
+ * software must display the following acknowledgment:
18
+ * "This product includes software developed by the OpenSSL Project
19
+ * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
20
+ *
21
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
22
+ * endorse or promote products derived from this software without
23
+ * prior written permission. For written permission, please contact
24
+ * openssl-core@openssl.org.
25
+ *
26
+ * 5. Products derived from this software may not be called "OpenSSL"
27
+ * nor may "OpenSSL" appear in their names without prior written
28
+ * permission of the OpenSSL Project.
29
+ *
30
+ * 6. Redistributions of any form whatsoever must retain the following
31
+ * acknowledgment:
32
+ * "This product includes software developed by the OpenSSL Project
33
+ * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
34
+ *
35
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
36
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
39
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
47
+ * ====================================================================
48
+ *
49
+ * This product includes cryptographic software written by Eric Young
50
+ * (eay@cryptsoft.com). This product includes software written by Tim
51
+ * Hudson (tjh@cryptsoft.com). */
52
+
53
+ #ifndef OPENSSL_HEADER_BASE_H
54
+ #define OPENSSL_HEADER_BASE_H
55
+
56
+
57
+ /* This file should be the first included by all BoringSSL headers. */
58
+
59
+ #include <stddef.h>
60
+ #include <stdint.h>
61
+ #include <sys/types.h>
62
+
63
+ #include <openssl/opensslfeatures.h>
64
+
65
+ #if defined(__cplusplus)
66
+ extern "C" {
67
+ #endif
68
+
69
+
70
+ #if defined(__x86_64) || defined(_M_AMD64) || defined(_M_X64)
71
+ #define OPENSSL_64_BIT
72
+ #define OPENSSL_X86_64
73
+ #elif defined(__x86) || defined(__i386) || defined(__i386__) || defined(_M_IX86)
74
+ #define OPENSSL_32_BIT
75
+ #define OPENSSL_X86
76
+ #elif defined(__aarch64__)
77
+ #define OPENSSL_64_BIT
78
+ #define OPENSSL_AARCH64
79
+ #elif defined(__arm) || defined(__arm__) || defined(_M_ARM)
80
+ #define OPENSSL_32_BIT
81
+ #define OPENSSL_ARM
82
+ #elif defined(__PPC64__) || defined(__powerpc64__)
83
+ #define OPENSSL_64_BIT
84
+ #elif defined(__mips__) && !defined(__LP64__)
85
+ #define OPENSSL_32_BIT
86
+ #define OPENSSL_MIPS
87
+ #elif defined(__mips__) && defined(__LP64__)
88
+ #define OPENSSL_64_BIT
89
+ #define OPENSSL_MIPS64
90
+ #elif defined(__pnacl__)
91
+ #define OPENSSL_32_BIT
92
+ #define OPENSSL_PNACL
93
+ #else
94
+ #error "Unknown target CPU"
95
+ #endif
96
+
97
+ #if defined(__APPLE__)
98
+ #define OPENSSL_APPLE
99
+ #endif
100
+
101
+ #if defined(_WIN32)
102
+ #define OPENSSL_WINDOWS
103
+ #endif
104
+
105
+ #if defined(TRUSTY)
106
+ #define OPENSSL_TRUSTY
107
+ #define OPENSSL_NO_THREADS
108
+ #endif
109
+
110
+ #define OPENSSL_IS_BORINGSSL
111
+ #define OPENSSL_IS_RING
112
+ #define OPENSSL_VERSION_NUMBER 0x10002000
113
+
114
+ #if defined(BORINGSSL_SHARED_LIBRARY)
115
+
116
+ #if defined(OPENSSL_WINDOWS)
117
+
118
+ #if defined(BORINGSSL_IMPLEMENTATION)
119
+ #define OPENSSL_EXPORT __declspec(dllexport)
120
+ #else
121
+ #define OPENSSL_EXPORT __declspec(dllimport)
122
+ #endif
123
+
124
+ #else /* defined(OPENSSL_WINDOWS) */
125
+
126
+ #if defined(BORINGSSL_IMPLEMENTATION)
127
+ #define OPENSSL_EXPORT __attribute__((visibility("default")))
128
+ #else
129
+ #define OPENSSL_EXPORT
130
+ #endif
131
+
132
+ #endif /* defined(OPENSSL_WINDOWS) */
133
+
134
+ #else /* defined(BORINGSSL_SHARED_LIBRARY) */
135
+
136
+ #define OPENSSL_EXPORT
137
+
138
+ #endif /* defined(BORINGSSL_SHARED_LIBRARY) */
139
+
140
+ typedef struct bignum_ctx BN_CTX;
141
+ typedef struct bignum_st BIGNUM;
142
+ typedef struct bn_gencb_st BN_GENCB;
143
+ typedef struct bn_mont_ctx_st BN_MONT_CTX;
144
+ typedef struct cbb_st CBB;
145
+ typedef struct cbs_st CBS;
146
+ typedef struct ec_key_st EC_KEY;
147
+ typedef struct ecdsa_sig_st ECDSA_SIG;
148
+ typedef struct engine_st ENGINE;
149
+ typedef struct rsa_st RSA;
150
+
151
+
152
+ #if defined(__cplusplus)
153
+ } /* extern C */
154
+ #endif
155
+
156
+ #endif /* OPENSSL_HEADER_BASE_H */
@@ -0,0 +1,794 @@
1
+ /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
2
+ * All rights reserved.
3
+ *
4
+ * This package is an SSL implementation written
5
+ * by Eric Young (eay@cryptsoft.com).
6
+ * The implementation was written so as to conform with Netscapes SSL.
7
+ *
8
+ * This library is free for commercial and non-commercial use as long as
9
+ * the following conditions are aheared to. The following conditions
10
+ * apply to all code found in this distribution, be it the RC4, RSA,
11
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
12
+ * included with this distribution is covered by the same copyright terms
13
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14
+ *
15
+ * Copyright remains Eric Young's, and as such any Copyright notices in
16
+ * the code are not to be removed.
17
+ * If this package is used in a product, Eric Young should be given attribution
18
+ * as the author of the parts of the library used.
19
+ * This can be in the form of a textual message at program startup or
20
+ * in documentation (online or textual) provided with the package.
21
+ *
22
+ * Redistribution and use in source and binary forms, with or without
23
+ * modification, are permitted provided that the following conditions
24
+ * are met:
25
+ * 1. Redistributions of source code must retain the copyright
26
+ * notice, this list of conditions and the following disclaimer.
27
+ * 2. Redistributions in binary form must reproduce the above copyright
28
+ * notice, this list of conditions and the following disclaimer in the
29
+ * documentation and/or other materials provided with the distribution.
30
+ * 3. All advertising materials mentioning features or use of this software
31
+ * must display the following acknowledgement:
32
+ * "This product includes cryptographic software written by
33
+ * Eric Young (eay@cryptsoft.com)"
34
+ * The word 'cryptographic' can be left out if the rouines from the library
35
+ * being used are not cryptographic related :-).
36
+ * 4. If you include any Windows specific code (or a derivative thereof) from
37
+ * the apps directory (application code) you must include an acknowledgement:
38
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39
+ *
40
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50
+ * SUCH DAMAGE.
51
+ *
52
+ * The licence and distribution terms for any publically available version or
53
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
54
+ * copied and put under another distribution licence
55
+ * [including the GNU Public Licence.]
56
+ */
57
+ /* ====================================================================
58
+ * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved.
59
+ *
60
+ * Redistribution and use in source and binary forms, with or without
61
+ * modification, are permitted provided that the following conditions
62
+ * are met:
63
+ *
64
+ * 1. Redistributions of source code must retain the above copyright
65
+ * notice, this list of conditions and the following disclaimer.
66
+ *
67
+ * 2. Redistributions in binary form must reproduce the above copyright
68
+ * notice, this list of conditions and the following disclaimer in
69
+ * the documentation and/or other materials provided with the
70
+ * distribution.
71
+ *
72
+ * 3. All advertising materials mentioning features or use of this
73
+ * software must display the following acknowledgment:
74
+ * "This product includes software developed by the OpenSSL Project
75
+ * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
76
+ *
77
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
78
+ * endorse or promote products derived from this software without
79
+ * prior written permission. For written permission, please contact
80
+ * openssl-core@openssl.org.
81
+ *
82
+ * 5. Products derived from this software may not be called "OpenSSL"
83
+ * nor may "OpenSSL" appear in their names without prior written
84
+ * permission of the OpenSSL Project.
85
+ *
86
+ * 6. Redistributions of any form whatsoever must retain the following
87
+ * acknowledgment:
88
+ * "This product includes software developed by the OpenSSL Project
89
+ * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
90
+ *
91
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
92
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
93
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
94
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
95
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
96
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
97
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
98
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
99
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
100
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
101
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
102
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
103
+ * ====================================================================
104
+ *
105
+ * This product includes cryptographic software written by Eric Young
106
+ * (eay@cryptsoft.com). This product includes software written by Tim
107
+ * Hudson (tjh@cryptsoft.com).
108
+ *
109
+ */
110
+ /* ====================================================================
111
+ * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
112
+ *
113
+ * Portions of the attached software ("Contribution") are developed by
114
+ * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
115
+ *
116
+ * The Contribution is licensed pursuant to the Eric Young open source
117
+ * license provided above.
118
+ *
119
+ * The binary polynomial arithmetic software is originally written by
120
+ * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems
121
+ * Laboratories. */
122
+
123
+ #ifndef OPENSSL_HEADER_BN_H
124
+ #define OPENSSL_HEADER_BN_H
125
+
126
+ #include <openssl/base.h>
127
+ #include <openssl/thread.h>
128
+
129
+ #include <inttypes.h> /* for PRIu64 and friends */
130
+ #include <stdio.h> /* for FILE* */
131
+
132
+ #if defined(__cplusplus)
133
+ extern "C" {
134
+ #endif
135
+
136
+
137
+ /* BN provides support for working with arbitary sized integers. For example,
138
+ * although the largest integer supported by the compiler might be 64 bits, BN
139
+ * will allow you to work with numbers until you run out of memory. */
140
+
141
+
142
+ /* BN_ULONG is the native word size when working with big integers.
143
+ *
144
+ * Note: on some platforms, inttypes.h does not define print format macros in
145
+ * C++ unless |__STDC_FORMAT_MACROS| defined. As this is a public header, bn.h
146
+ * does not define |__STDC_FORMAT_MACROS| itself. C++ source files which use the
147
+ * FMT macros must define it externally. */
148
+ #if defined(OPENSSL_64_BIT)
149
+ #define BN_ULONG uint64_t
150
+ #define BN_BITS2 64
151
+ #define BN_DEC_FMT1 "%" PRIu64
152
+ #define BN_DEC_FMT2 "%019" PRIu64
153
+ #define BN_HEX_FMT1 "%" PRIx64
154
+ #elif defined(OPENSSL_32_BIT)
155
+ #define BN_ULONG uint32_t
156
+ #define BN_BITS2 32
157
+ #define BN_DEC_FMT1 "%" PRIu32
158
+ #define BN_DEC_FMT2 "%09" PRIu32
159
+ #define BN_HEX_FMT1 "%" PRIx32
160
+ #else
161
+ #error "Must define either OPENSSL_32_BIT or OPENSSL_64_BIT"
162
+ #endif
163
+
164
+
165
+ /* Allocation and freeing. */
166
+
167
+ /* BN_new creates a new, allocated BIGNUM and initialises it. */
168
+ OPENSSL_EXPORT BIGNUM *BN_new(void);
169
+
170
+ /* BN_init initialises a stack allocated |BIGNUM|. */
171
+ OPENSSL_EXPORT void BN_init(BIGNUM *bn);
172
+
173
+ /* BN_free frees the data referenced by |bn| and, if |bn| was originally
174
+ * allocated on the heap, frees |bn| also. */
175
+ OPENSSL_EXPORT void BN_free(BIGNUM *bn);
176
+
177
+ /* BN_clear_free erases and frees the data referenced by |bn| and, if |bn| was
178
+ * originally allocated on the heap, frees |bn| also. */
179
+ OPENSSL_EXPORT void BN_clear_free(BIGNUM *bn);
180
+
181
+ /* BN_dup allocates a new BIGNUM and sets it equal to |src|. It returns the
182
+ * allocated BIGNUM on success or NULL otherwise. */
183
+ OPENSSL_EXPORT BIGNUM *BN_dup(const BIGNUM *src);
184
+
185
+ /* BN_copy sets |dest| equal to |src| and returns |dest| or NULL on allocation
186
+ * failure. */
187
+ OPENSSL_EXPORT BIGNUM *BN_copy(BIGNUM *dest, const BIGNUM *src);
188
+
189
+ /* BN_clear sets |bn| to zero and erases the old data. */
190
+ OPENSSL_EXPORT void BN_clear(BIGNUM *bn);
191
+
192
+ /* BN_value_one returns a static BIGNUM with value 1. */
193
+ OPENSSL_EXPORT const BIGNUM *BN_value_one(void);
194
+
195
+ /* BN_with_flags initialises a stack allocated |BIGNUM| with pointers to the
196
+ * contents of |in| but with |flags| ORed into the flags field.
197
+ *
198
+ * Note: the two BIGNUMs share state and so |out| should /not/ be passed to
199
+ * |BN_free|. */
200
+ OPENSSL_EXPORT void BN_with_flags(BIGNUM *out, const BIGNUM *in, int flags);
201
+
202
+
203
+ /* Basic functions. */
204
+
205
+ /* BN_num_bits returns the minimum number of bits needed to represent the
206
+ * absolute value of |bn|. */
207
+ OPENSSL_EXPORT unsigned BN_num_bits(const BIGNUM *bn);
208
+
209
+ /* BN_num_bytes returns the minimum number of bytes needed to represent the
210
+ * absolute value of |bn|. */
211
+ OPENSSL_EXPORT unsigned BN_num_bytes(const BIGNUM *bn);
212
+
213
+ /* BN_zero sets |bn| to zero. */
214
+ OPENSSL_EXPORT void BN_zero(BIGNUM *bn);
215
+
216
+ /* BN_one sets |bn| to one. It returns one on success or zero on allocation
217
+ * failure. */
218
+ OPENSSL_EXPORT int BN_one(BIGNUM *bn);
219
+
220
+ /* BN_set_word sets |bn| to |value|. It returns one on success or zero on
221
+ * allocation failure. */
222
+ OPENSSL_EXPORT int BN_set_word(BIGNUM *bn, BN_ULONG value);
223
+
224
+ /* BN_set_negative sets the sign of |bn|. */
225
+ OPENSSL_EXPORT void BN_set_negative(BIGNUM *bn, int sign);
226
+
227
+ /* BN_is_negative returns one if |bn| is negative and zero otherwise. */
228
+ OPENSSL_EXPORT int BN_is_negative(const BIGNUM *bn);
229
+
230
+ /* BN_get_flags returns |bn->flags| & |flags|. */
231
+ OPENSSL_EXPORT int BN_get_flags(const BIGNUM *bn, int flags);
232
+
233
+ /* BN_set_flags sets |flags| on |bn|. */
234
+ OPENSSL_EXPORT void BN_set_flags(BIGNUM *bn, int flags);
235
+
236
+
237
+ /* Conversion functions. */
238
+
239
+ /* BN_bin2bn sets |*ret| to the value of |len| bytes from |in|, interpreted as
240
+ * a big-endian number, and returns |ret|. If |ret| is NULL then a fresh
241
+ * |BIGNUM| is allocated and returned. It returns NULL on allocation
242
+ * failure. */
243
+ OPENSSL_EXPORT BIGNUM *BN_bin2bn(const uint8_t *in, size_t len, BIGNUM *ret);
244
+
245
+ /* BN_bn2bin serialises the absolute value of |in| to |out| as a big-endian
246
+ * integer, which must have |BN_num_bytes| of space available. It returns the
247
+ * number of bytes written. */
248
+ OPENSSL_EXPORT size_t BN_bn2bin(const BIGNUM *in, uint8_t *out);
249
+
250
+ /* BN_bn2bin_padded serialises the absolute value of |in| to |out| as a
251
+ * big-endian integer. The integer is padded with leading zeros up to size
252
+ * |len|. If |len| is smaller than |BN_num_bytes|, the function fails and
253
+ * returns 0. Otherwise, it returns 1. */
254
+ OPENSSL_EXPORT int BN_bn2bin_padded(uint8_t *out, size_t len, const BIGNUM *in);
255
+
256
+ /* BN_bn2hex returns an allocated string that contains a NUL-terminated, hex
257
+ * representation of |bn|. If |bn| is negative, the first char in the resulting
258
+ * string will be '-'. Returns NULL on allocation failure. */
259
+ OPENSSL_EXPORT char *BN_bn2hex(const BIGNUM *bn);
260
+
261
+ /* BN_hex2bn parses the leading hex number from |in|, which may be proceeded by
262
+ * a '-' to indicate a negative number and may contain trailing, non-hex data.
263
+ * If |outp| is not NULL, it constructs a BIGNUM equal to the hex number and
264
+ * stores it in |*outp|. If |*outp| is NULL then it allocates a new BIGNUM and
265
+ * updates |*outp|. It returns the number of bytes of |in| processed or zero on
266
+ * error. */
267
+ OPENSSL_EXPORT int BN_hex2bn(BIGNUM **outp, const char *in);
268
+
269
+ /* BN_dec2bn parses the leading decimal number from |in|, which may be
270
+ * proceeded by a '-' to indicate a negative number and may contain trailing,
271
+ * non-decimal data. If |outp| is not NULL, it constructs a BIGNUM equal to the
272
+ * decimal number and stores it in |*outp|. If |*outp| is NULL then it
273
+ * allocates a new BIGNUM and updates |*outp|. It returns the number of bytes
274
+ * of |in| processed or zero on error. */
275
+ OPENSSL_EXPORT int BN_dec2bn(BIGNUM **outp, const char *in);
276
+
277
+ /* BN_asc2bn acts like |BN_dec2bn| or |BN_hex2bn| depending on whether |in|
278
+ * begins with "0X" or "0x" (indicating hex) or not (indicating decimal). A
279
+ * leading '-' is still permitted and comes before the optional 0X/0x. It
280
+ * returns one on success or zero on error. */
281
+ OPENSSL_EXPORT int BN_asc2bn(BIGNUM **outp, const char *in);
282
+
283
+ /* BN_print_fp writes a hex encoding of |a| to |fp|. It returns one on success
284
+ * and zero on error. */
285
+ OPENSSL_EXPORT int BN_print_fp(FILE *fp, const BIGNUM *a);
286
+
287
+ /* BN_get_word returns the absolute value of |bn| as a single word. If |bn| is
288
+ * too large to be represented as a single word, the maximum possible value
289
+ * will be returned. */
290
+ OPENSSL_EXPORT BN_ULONG BN_get_word(const BIGNUM *bn);
291
+
292
+
293
+ /* ASN.1 functions. */
294
+
295
+ /* BN_cbs2unsigned parses a non-negative DER INTEGER from |cbs| writes the
296
+ * result to |ret|. It returns one on success and zero on failure. */
297
+ OPENSSL_EXPORT int BN_cbs2unsigned(CBS *cbs, BIGNUM *ret);
298
+
299
+ /* BN_bn2cbb marshals |bn| as a non-negative DER INTEGER and appends the result
300
+ * to |cbb|. It returns one on success and zero on failure. */
301
+ OPENSSL_EXPORT int BN_bn2cbb(CBB *cbb, const BIGNUM *bn);
302
+
303
+
304
+ /* Internal functions.
305
+ *
306
+ * These functions are useful for code that is doing low-level manipulations of
307
+ * BIGNUM values. However, be sure that no other function in this file does
308
+ * what you want before turning to these. */
309
+
310
+ /* bn_correct_top decrements |bn->top| until |bn->d[top-1]| is non-zero or
311
+ * until |top| is zero. */
312
+ OPENSSL_EXPORT void bn_correct_top(BIGNUM *bn);
313
+
314
+ /* bn_wexpand ensures that |bn| has at least |words| works of space without
315
+ * altering its value. It returns one on success or zero on allocation
316
+ * failure. */
317
+ OPENSSL_EXPORT BIGNUM *bn_wexpand(BIGNUM *bn, size_t words);
318
+
319
+
320
+ /* BIGNUM pools.
321
+ *
322
+ * Certain BIGNUM operations need to use many temporary variables and
323
+ * allocating and freeing them can be quite slow. Thus such opertions typically
324
+ * take a |BN_CTX| parameter, which contains a pool of |BIGNUMs|. The |ctx|
325
+ * argument to a public function may be NULL, in which case a local |BN_CTX|
326
+ * will be created just for the lifetime of that call.
327
+ *
328
+ * A function must call |BN_CTX_start| first. Then, |BN_CTX_get| may be called
329
+ * repeatedly to obtain temporary |BIGNUM|s. All |BN_CTX_get| calls must be made
330
+ * before calling any other functions that use the |ctx| as an argument.
331
+ *
332
+ * Finally, |BN_CTX_end| must be called before returning from the function.
333
+ * When |BN_CTX_end| is called, the |BIGNUM| pointers obtained from
334
+ * |BN_CTX_get| become invalid. */
335
+
336
+ /* BN_CTX_new returns a new, empty BN_CTX or NULL on allocation failure. */
337
+ OPENSSL_EXPORT BN_CTX *BN_CTX_new(void);
338
+
339
+ /* BN_CTX_free frees all BIGNUMs contained in |ctx| and then frees |ctx|
340
+ * itself. */
341
+ OPENSSL_EXPORT void BN_CTX_free(BN_CTX *ctx);
342
+
343
+ /* BN_CTX_start "pushes" a new entry onto the |ctx| stack and allows future
344
+ * calls to |BN_CTX_get|. */
345
+ OPENSSL_EXPORT void BN_CTX_start(BN_CTX *ctx);
346
+
347
+ /* BN_CTX_get returns a new |BIGNUM|, or NULL on allocation failure. Once
348
+ * |BN_CTX_get| has returned NULL, all future calls will also return NULL until
349
+ * |BN_CTX_end| is called. */
350
+ OPENSSL_EXPORT BIGNUM *BN_CTX_get(BN_CTX *ctx);
351
+
352
+ /* BN_CTX_end invalidates all |BIGNUM|s returned from |BN_CTX_get| since the
353
+ * matching |BN_CTX_start| call. */
354
+ OPENSSL_EXPORT void BN_CTX_end(BN_CTX *ctx);
355
+
356
+
357
+ /* Simple arithmetic */
358
+
359
+ /* BN_add sets |r| = |a| + |b|, where |r| may be the same pointer as either |a|
360
+ * or |b|. It returns one on success and zero on allocation failure. */
361
+ OPENSSL_EXPORT int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
362
+
363
+ /* BN_uadd sets |r| = |a| + |b|, where |a| and |b| are non-negative and |r| may
364
+ * be the same pointer as either |a| or |b|. It returns one on success and zero
365
+ * on allocation failure. */
366
+ OPENSSL_EXPORT int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
367
+
368
+ /* BN_add_word adds |w| to |a|. It returns one on success and zero otherwise. */
369
+ OPENSSL_EXPORT int BN_add_word(BIGNUM *a, BN_ULONG w);
370
+
371
+ /* BN_sub sets |r| = |a| - |b|, where |r| must be a distinct pointer from |a|
372
+ * and |b|. It returns one on success and zero on allocation failure. */
373
+ OPENSSL_EXPORT int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
374
+
375
+ /* BN_usub sets |r| = |a| - |b|, where |a| and |b| are non-negative integers,
376
+ * |b| < |a| and |r| must be a distinct pointer from |a| and |b|. It returns
377
+ * one on success and zero on allocation failure. */
378
+ OPENSSL_EXPORT int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
379
+
380
+ /* BN_sub_word subtracts |w| from |a|. It returns one on success and zero on
381
+ * allocation failure. */
382
+ OPENSSL_EXPORT int BN_sub_word(BIGNUM *a, BN_ULONG w);
383
+
384
+ /* BN_mul sets |r| = |a| * |b|, where |r| may be the same pointer as |a| or
385
+ * |b|. Returns one on success and zero otherwise. */
386
+ OPENSSL_EXPORT int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
387
+ BN_CTX *ctx);
388
+
389
+ /* BN_mul_word sets |bn| = |bn| * |w|. It returns one on success or zero on
390
+ * allocation failure. */
391
+ OPENSSL_EXPORT int BN_mul_word(BIGNUM *bn, BN_ULONG w);
392
+
393
+ /* BN_sqr sets |r| = |a|^2 (i.e. squares), where |r| may be the same pointer as
394
+ * |a|. Returns one on success and zero otherwise. This is more efficient than
395
+ * BN_mul(r, a, a, ctx). */
396
+ OPENSSL_EXPORT int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx);
397
+
398
+ /* BN_div divides |numerator| by |divisor| and places the result in |quotient|
399
+ * and the remainder in |rem|. Either of |quotient| or |rem| may be NULL, in
400
+ * which case the respective value is not returned. The result is rounded
401
+ * towards zero; thus if |numerator| is negative, the remainder will be zero or
402
+ * negative. It returns one on success or zero on error. */
403
+ OPENSSL_EXPORT int BN_div(BIGNUM *quotient, BIGNUM *rem,
404
+ const BIGNUM *numerator, const BIGNUM *divisor,
405
+ BN_CTX *ctx);
406
+
407
+ /* BN_div_word sets |numerator| = |numerator|/|divisor| and returns the
408
+ * remainder or (BN_ULONG)-1 on error. */
409
+ OPENSSL_EXPORT BN_ULONG BN_div_word(BIGNUM *numerator, BN_ULONG divisor);
410
+
411
+
412
+ /* Comparison functions */
413
+
414
+ /* BN_cmp returns a value less than, equal to or greater than zero if |a| is
415
+ * less than, equal to or greater than |b|, respectively. */
416
+ OPENSSL_EXPORT int BN_cmp(const BIGNUM *a, const BIGNUM *b);
417
+
418
+ /* BN_ucmp returns a value less than, equal to or greater than zero if the
419
+ * absolute value of |a| is less than, equal to or greater than the absolute
420
+ * value of |b|, respectively. */
421
+ OPENSSL_EXPORT int BN_ucmp(const BIGNUM *a, const BIGNUM *b);
422
+
423
+ /* BN_abs_is_word returns one if the absolute value of |bn| equals |w| and zero
424
+ * otherwise. */
425
+ OPENSSL_EXPORT int BN_abs_is_word(const BIGNUM *bn, BN_ULONG w);
426
+
427
+ /* BN_is_zero returns one if |bn| is zero and zero otherwise. */
428
+ OPENSSL_EXPORT int BN_is_zero(const BIGNUM *bn);
429
+
430
+ /* BN_is_one returns one if |bn| equals one and zero otherwise. */
431
+ OPENSSL_EXPORT int BN_is_one(const BIGNUM *bn);
432
+
433
+ /* BN_is_word returns one if |bn| is exactly |w| and zero otherwise. */
434
+ OPENSSL_EXPORT int BN_is_word(const BIGNUM *bn, BN_ULONG w);
435
+
436
+ /* BN_is_odd returns one if |bn| is odd and zero otherwise. */
437
+ OPENSSL_EXPORT int BN_is_odd(const BIGNUM *bn);
438
+
439
+
440
+ /* Bitwise operations. */
441
+
442
+ /* BN_lshift sets |r| equal to |a| << n. The |a| and |r| arguments may be the
443
+ * same |BIGNUM|. It returns one on success and zero on allocation failure. */
444
+ OPENSSL_EXPORT int BN_lshift(BIGNUM *r, const BIGNUM *a, int n);
445
+
446
+ /* BN_lshift1 sets |r| equal to |a| << 1, where |r| and |a| may be the same
447
+ * pointer. It returns one on success and zero on allocation failure. */
448
+ OPENSSL_EXPORT int BN_lshift1(BIGNUM *r, const BIGNUM *a);
449
+
450
+ /* BN_rshift sets |r| equal to |a| >> n, where |r| and |a| may be the same
451
+ * pointer. It returns one on success and zero on allocation failure. */
452
+ OPENSSL_EXPORT int BN_rshift(BIGNUM *r, const BIGNUM *a, int n);
453
+
454
+ /* BN_rshift1 sets |r| equal to |a| >> 1, where |r| and |a| may be the same
455
+ * pointer. It returns one on success and zero on allocation failure. */
456
+ OPENSSL_EXPORT int BN_rshift1(BIGNUM *r, const BIGNUM *a);
457
+
458
+ /* BN_set_bit sets the |n|th, least-significant bit in |a|. For example, if |a|
459
+ * is 2 then setting bit zero will make it 3. It returns one on success or zero
460
+ * on allocation failure. */
461
+ OPENSSL_EXPORT int BN_set_bit(BIGNUM *a, int n);
462
+
463
+ /* BN_clear_bit clears the |n|th, least-significant bit in |a|. For example, if
464
+ * |a| is 3, clearing bit zero will make it two. It returns one on success or
465
+ * zero on allocation failure. */
466
+ OPENSSL_EXPORT int BN_clear_bit(BIGNUM *a, int n);
467
+
468
+ /* BN_is_bit_set returns the value of the |n|th, least-significant bit in |a|,
469
+ * or zero if the bit doesn't exist. */
470
+ OPENSSL_EXPORT int BN_is_bit_set(const BIGNUM *a, int n);
471
+
472
+
473
+ /* Modulo arithmetic. */
474
+
475
+ /* BN_mod_word returns |a| mod |w|. */
476
+ OPENSSL_EXPORT BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w);
477
+
478
+ /* BN_mod is a helper macro that calls |BN_div| and discards the quotient. */
479
+ #define BN_mod(rem, numerator, divisor, ctx) \
480
+ BN_div(NULL, (rem), (numerator), (divisor), (ctx))
481
+
482
+ /* BN_nnmod is a non-negative modulo function. It acts like |BN_mod|, but 0 <=
483
+ * |rem| < |divisor| is always true. It returns one on success and zero on
484
+ * error. */
485
+ OPENSSL_EXPORT int BN_nnmod(BIGNUM *rem, const BIGNUM *numerator,
486
+ const BIGNUM *divisor, BN_CTX *ctx);
487
+
488
+ /* BN_mod_add sets |r| = |a| + |b| mod |m|. It returns one on success and zero
489
+ * on error. */
490
+ OPENSSL_EXPORT int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
491
+ const BIGNUM *m, BN_CTX *ctx);
492
+
493
+ /* BN_mod_add_quick acts like |BN_mod_add| but requires that |a| and |b| be
494
+ * non-negative and less than |m|. */
495
+ OPENSSL_EXPORT int BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
496
+ const BIGNUM *m);
497
+
498
+ /* BN_mod_sub sets |r| = |a| - |b| mod |m|. It returns one on success and zero
499
+ * on error. */
500
+ OPENSSL_EXPORT int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
501
+ const BIGNUM *m, BN_CTX *ctx);
502
+
503
+ /* BN_mod_sub_quick acts like |BN_mod_sub| but requires that |a| and |b| be
504
+ * non-negative and less than |m|. */
505
+ OPENSSL_EXPORT int BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
506
+ const BIGNUM *m);
507
+
508
+ /* BN_mod_mul sets |r| = |a|*|b| mod |m|. It returns one on success and zero
509
+ * on error. */
510
+ OPENSSL_EXPORT int BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
511
+ const BIGNUM *m, BN_CTX *ctx);
512
+
513
+ /* BN_mod_sqr sets |r| = |a|^2 mod |m|. It returns one on success and zero
514
+ * on error. */
515
+ OPENSSL_EXPORT int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m,
516
+ BN_CTX *ctx);
517
+
518
+ /* BN_mod_lshift_quick acts like |BN_mod_lshift| but requires that |a| be
519
+ * non-negative and less than |m|. */
520
+ OPENSSL_EXPORT int BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n,
521
+ const BIGNUM *m);
522
+
523
+ /* BN_mod_lshift1_quick acts like |BN_mod_lshift1| but requires that |a| be
524
+ * non-negative and less than |m|. */
525
+ OPENSSL_EXPORT int BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a,
526
+ const BIGNUM *m);
527
+
528
+
529
+ /* Random and prime number generation. */
530
+
531
+ /* BN_rand sets |rnd| to a random number of length |bits|. If |top| is zero, the
532
+ * most-significant bit, if any, will be set. If |top| is one, the two most
533
+ * significant bits, if any, will be set.
534
+ *
535
+ * If |top| is -1 then no extra action will be taken and |BN_num_bits(rnd)| may
536
+ * not equal |bits| if the most significant bits randomly ended up as zeros.
537
+ *
538
+ * If |bottom| is non-zero, the least-significant bit, if any, will be set. The
539
+ * function returns one on success or zero otherwise. */
540
+ OPENSSL_EXPORT int BN_rand(BIGNUM *rnd, int bits, int top, int bottom);
541
+
542
+ /* BN_pseudo_rand is an alias for |BN_rand|. */
543
+ OPENSSL_EXPORT int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom);
544
+
545
+ /* BN_rand_range sets |rnd| to a random value [0..range). It returns one on
546
+ * success and zero otherwise. */
547
+ OPENSSL_EXPORT int BN_rand_range(BIGNUM *rnd, const BIGNUM *range);
548
+
549
+ /* BN_pseudo_rand_range is an alias for BN_rand_range. */
550
+ OPENSSL_EXPORT int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range);
551
+
552
+ /* BN_generate_dsa_nonce generates a random number 0 <= out < range. Unlike
553
+ * BN_rand_range, it also includes the contents of |priv| and |message| in the
554
+ * generation so that an RNG failure isn't fatal as long as |priv| remains
555
+ * secret. This is intended for use in DSA and ECDSA where an RNG weakness
556
+ * leads directly to private key exposure unless this function is used.
557
+ * It returns one on success and zero on error. */
558
+ OPENSSL_EXPORT int BN_generate_dsa_nonce(BIGNUM *out, const BIGNUM *range,
559
+ const BIGNUM *priv,
560
+ const uint8_t *message,
561
+ size_t message_len, BN_CTX *ctx);
562
+
563
+ /* BN_GENCB holds a callback function that is used by generation functions that
564
+ * can take a very long time to complete. Use |BN_GENCB_set| to initialise a
565
+ * |BN_GENCB| structure.
566
+ *
567
+ * The callback receives the address of that |BN_GENCB| structure as its last
568
+ * argument and the user is free to put an arbitary pointer in |arg|. The other
569
+ * arguments are set as follows:
570
+ * event=BN_GENCB_GENERATED, n=i: after generating the i'th possible prime
571
+ * number.
572
+ * event=BN_GENCB_PRIME_TEST, n=-1: when finished trial division primality
573
+ * checks.
574
+ * event=BN_GENCB_PRIME_TEST, n=i: when the i'th primality test has finished.
575
+ *
576
+ * The callback can return zero to abort the generation progress or one to
577
+ * allow it to continue.
578
+ *
579
+ * When other code needs to call a BN generation function it will often take a
580
+ * BN_GENCB argument and may call the function with other argument values. */
581
+ #define BN_GENCB_GENERATED 0
582
+ #define BN_GENCB_PRIME_TEST 1
583
+
584
+ struct bn_gencb_st {
585
+ void *arg; /* callback-specific data */
586
+ int (*callback)(int event, int n, struct bn_gencb_st *);
587
+ };
588
+
589
+ /* BN_GENCB_set configures |callback| to call |f| and sets |callout->arg| to
590
+ * |arg|. */
591
+ OPENSSL_EXPORT void BN_GENCB_set(BN_GENCB *callback,
592
+ int (*f)(int event, int n,
593
+ struct bn_gencb_st *),
594
+ void *arg);
595
+
596
+ /* BN_GENCB_call calls |callback|, if not NULL, and returns the return value of
597
+ * the callback, or 1 if |callback| is NULL. */
598
+ OPENSSL_EXPORT int BN_GENCB_call(BN_GENCB *callback, int event, int n);
599
+
600
+ /* BN_generate_prime_ex sets |ret| to a prime number of |bits| length. If safe
601
+ * is non-zero then the prime will be such that (ret-1)/2 is also a prime.
602
+ * (This is needed for Diffie-Hellman groups to ensure that the only subgroups
603
+ * are of size 2 and (p-1)/2.).
604
+ *
605
+ * If |add| is not NULL, the prime will fulfill the condition |ret| % |add| ==
606
+ * |rem| in order to suit a given generator. (If |rem| is NULL then |ret| %
607
+ * |add| == 1.)
608
+ *
609
+ * If |cb| is not NULL, it will be called during processing to give an
610
+ * indication of progress. See the comments for |BN_GENCB|. It returns one on
611
+ * success and zero otherwise. */
612
+ OPENSSL_EXPORT int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe,
613
+ const BIGNUM *add, const BIGNUM *rem,
614
+ BN_GENCB *cb);
615
+
616
+ /* BN_prime_checks is magic value that can be used as the |checks| argument to
617
+ * the primality testing functions in order to automatically select a number of
618
+ * Miller-Rabin checks that gives a false positive rate of ~2^{-80}. */
619
+ #define BN_prime_checks 0
620
+
621
+ /* BN_is_prime_fasttest_ex returns one if |candidate| is probably a prime
622
+ * number by the Miller-Rabin test, zero if it's certainly not and -1 on error.
623
+ *
624
+ * If |do_trial_division| is non-zero then |candidate| will be tested against a
625
+ * list of small primes before Miller-Rabin tests. The probability of this
626
+ * function returning one when |candidate| is composite is 2^{2*checks}. If
627
+ * |checks| is |BN_prime_checks| then a value that results in approximately
628
+ * 2^{-80} false positive probability is used. If |cb| is not NULL then it is
629
+ * called during the checking process. See the comment above |BN_GENCB|.
630
+ *
631
+ * WARNING: deprecated. Use |BN_primality_test|. */
632
+ OPENSSL_EXPORT int BN_is_prime_fasttest_ex(const BIGNUM *candidate, int checks,
633
+ BN_CTX *ctx, int do_trial_division,
634
+ BN_GENCB *cb);
635
+
636
+ /* BN_is_prime_ex acts the same as |BN_is_prime_fasttest_ex| with
637
+ * |do_trial_division| set to zero.
638
+ *
639
+ * WARNING: deprecated: Use |BN_primality_test|. */
640
+ OPENSSL_EXPORT int BN_is_prime_ex(const BIGNUM *candidate, int checks,
641
+ BN_CTX *ctx, BN_GENCB *cb);
642
+
643
+
644
+ /* Number theory functions */
645
+
646
+ /* BN_gcd sets |r| = gcd(|a|, |b|). It returns one on success and zero
647
+ * otherwise. */
648
+ OPENSSL_EXPORT int BN_gcd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
649
+ BN_CTX *ctx);
650
+
651
+ /* BN_mod_inverse sets |out| equal to |a|^-1, mod |n|. If either of |a| or |n|
652
+ * have |BN_FLG_CONSTTIME| set then the operation is performed in constant
653
+ * time. If |out| is NULL, a fresh BIGNUM is allocated. It returns the result
654
+ * or NULL on error. */
655
+ OPENSSL_EXPORT BIGNUM *BN_mod_inverse(BIGNUM *out, const BIGNUM *a,
656
+ const BIGNUM *n, BN_CTX *ctx);
657
+
658
+ /* BN_mod_inverse_ex acts like |BN_mod_inverse| except that, when it returns
659
+ * zero, it will set |*out_no_inverse| to one if the failure was caused because
660
+ * |a| has no inverse mod |n|. Otherwise it will set |*out_no_inverse| to
661
+ * zero. */
662
+ OPENSSL_EXPORT BIGNUM *BN_mod_inverse_ex(BIGNUM *out, int *out_no_inverse,
663
+ const BIGNUM *a, const BIGNUM *n,
664
+ BN_CTX *ctx);
665
+
666
+
667
+ /* Montgomery arithmetic. */
668
+
669
+ /* BN_MONT_CTX contains the precomputed values needed to work in a specific
670
+ * Montgomery domain. */
671
+
672
+ /* BN_MONT_CTX_new returns a fresh BN_MONT_CTX or NULL on allocation failure. */
673
+ OPENSSL_EXPORT BN_MONT_CTX *BN_MONT_CTX_new(void);
674
+
675
+ /* BN_MONT_CTX_free frees memory associated with |mont|. */
676
+ OPENSSL_EXPORT void BN_MONT_CTX_free(BN_MONT_CTX *mont);
677
+
678
+ /* BN_MONT_CTX_set sets up a Montgomery context given the modulus, |mod|. It
679
+ * returns one on success and zero on error. */
680
+ OPENSSL_EXPORT int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod,
681
+ BN_CTX *ctx);
682
+
683
+ /* BN_MONT_CTX_set_locked takes |lock| and checks whether |*pmont| is NULL. If
684
+ * so, it creates a new |BN_MONT_CTX| and sets the modulus for it to |mod|. It
685
+ * then stores it as |*pmont| and returns it, or NULL on error.
686
+ *
687
+ * If |*pmont| is already non-NULL then the existing value is returned. */
688
+ BN_MONT_CTX *BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, CRYPTO_MUTEX *lock,
689
+ const BIGNUM *mod, BN_CTX *bn_ctx);
690
+
691
+ /* BN_to_montgomery sets |ret| equal to |a| in the Montgomery domain. It
692
+ * returns one on success and zero on error. */
693
+ OPENSSL_EXPORT int BN_to_montgomery(BIGNUM *ret, const BIGNUM *a,
694
+ const BN_MONT_CTX *mont, BN_CTX *ctx);
695
+
696
+ /* BN_from_montgomery sets |ret| equal to |a| * R^-1, i.e. translates values
697
+ * out of the Montgomery domain. It returns one on success or zero on error. */
698
+ OPENSSL_EXPORT int BN_from_montgomery(BIGNUM *ret, const BIGNUM *a,
699
+ const BN_MONT_CTX *mont, BN_CTX *ctx);
700
+
701
+ /* BN_mod_mul_montgomery set |r| equal to |a| * |b|, in the Montgomery domain.
702
+ * Both |a| and |b| must already be in the Montgomery domain (by
703
+ * |BN_to_montgomery|). It returns one on success or zero on error. */
704
+ OPENSSL_EXPORT int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a,
705
+ const BIGNUM *b,
706
+ const BN_MONT_CTX *mont, BN_CTX *ctx);
707
+
708
+
709
+ /* Exponentiation. */
710
+
711
+ /* BN_exp sets |r| equal to |a|^{|p|}. It does so with a square-and-multiply
712
+ * algorithm that leaks side-channel information. It returns one on success or
713
+ * zero otherwise. */
714
+ OPENSSL_EXPORT int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
715
+ BN_CTX *ctx);
716
+
717
+ /* BN_mod_exp sets |r| equal to |a|^{|p|} mod |m|. It does so with the best
718
+ * algorithm for the values provided and can run in constant time if
719
+ * |BN_FLG_CONSTTIME| is set for |p|. It returns one on success or zero
720
+ * otherwise. */
721
+ OPENSSL_EXPORT int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
722
+ const BIGNUM *m, BN_CTX *ctx);
723
+
724
+ OPENSSL_EXPORT int BN_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
725
+ const BIGNUM *m, BN_CTX *ctx,
726
+ const BN_MONT_CTX *mont);
727
+
728
+ OPENSSL_EXPORT int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a,
729
+ const BIGNUM *p, const BIGNUM *m,
730
+ BN_CTX *ctx,
731
+ const BN_MONT_CTX *mont);
732
+
733
+ OPENSSL_EXPORT int BN_mod_exp_mont_word(BIGNUM *r, BN_ULONG a, const BIGNUM *p,
734
+ const BIGNUM *m, BN_CTX *ctx,
735
+ const BN_MONT_CTX *mont);
736
+
737
+
738
+ /* Private functions */
739
+
740
+ struct bignum_st {
741
+ BN_ULONG *d; /* Pointer to an array of 'BN_BITS2' bit chunks in little-endian
742
+ order. */
743
+ int top; /* Index of last used element in |d|, plus one. */
744
+ int dmax; /* Size of |d|, in words. */
745
+ int neg; /* one if the number is negative */
746
+ int flags; /* bitmask of BN_FLG_* values */
747
+ };
748
+
749
+ struct bn_mont_ctx_st {
750
+ BIGNUM RR; /* used to convert to montgomery form */
751
+ BIGNUM N; /* The modulus */
752
+
753
+ /* Least significant word(s) of the "magic" Montgomery constant. When
754
+ * |BN_MONT_CTX_N0_LIMBS == 1|, n0[1] is probably unused, however it is safer
755
+ * to always use two elements just in case any code from another OpenSSL
756
+ * variant that assumes |n0| has two elements is imported. */
757
+ BN_ULONG n0[2];
758
+ };
759
+
760
+ OPENSSL_EXPORT unsigned BN_num_bits_word(BN_ULONG l);
761
+
762
+ #define BN_FLG_MALLOCED 0x01
763
+ #define BN_FLG_STATIC_DATA 0x02
764
+ /* avoid leaking exponent information through timing, BN_mod_exp_mont() will
765
+ * call BN_mod_exp_mont_consttime, BN_div() will call BN_div_no_branch,
766
+ * BN_mod_inverse() will call BN_mod_inverse_no_branch. */
767
+ #define BN_FLG_CONSTTIME 0x04
768
+
769
+
770
+ #if defined(__cplusplus)
771
+ } /* extern C */
772
+ #endif
773
+
774
+ #define BN_R_ARG2_LT_ARG3 100
775
+ #define BN_R_BAD_RECIPROCAL 101
776
+ #define BN_R_BIGNUM_TOO_LONG 102
777
+ #define BN_R_BITS_TOO_SMALL 103
778
+ #define BN_R_CALLED_WITH_EVEN_MODULUS 104
779
+ #define BN_R_DIV_BY_ZERO 105
780
+ #define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA 106
781
+ #define BN_R_INPUT_NOT_REDUCED 107
782
+ #define BN_R_INVALID_RANGE 108
783
+ #define BN_R_NEGATIVE_NUMBER 109
784
+ #define BN_R_NOT_A_SQUARE 110
785
+ #define BN_R_NOT_INITIALIZED 111
786
+ #define BN_R_NO_INVERSE 112
787
+ #define BN_R_PRIVATE_KEY_TOO_LARGE 113
788
+ #define BN_R_P_IS_NOT_PRIME 114
789
+ #define BN_R_TOO_MANY_ITERATIONS 115
790
+ #define BN_R_TOO_MANY_TEMPORARY_VARIABLES 116
791
+ #define BN_R_BAD_ENCODING 117
792
+ #define BN_R_ENCODE_ERROR 118
793
+
794
+ #endif /* OPENSSL_HEADER_BN_H */