ring-native 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,711 @@
1
+ /* Copyright (C) 1995-1998 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-2001 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
+ #include <openssl/bn.h>
110
+
111
+ #include <openssl/err.h>
112
+
113
+ #include "internal.h"
114
+
115
+ static BIGNUM *euclid(BIGNUM *a, BIGNUM *b) {
116
+ BIGNUM *t;
117
+ int shifts = 0;
118
+
119
+ /* 0 <= b <= a */
120
+ while (!BN_is_zero(b)) {
121
+ /* 0 < b <= a */
122
+
123
+ if (BN_is_odd(a)) {
124
+ if (BN_is_odd(b)) {
125
+ if (!BN_sub(a, a, b)) {
126
+ goto err;
127
+ }
128
+ if (!BN_rshift1(a, a)) {
129
+ goto err;
130
+ }
131
+ if (BN_cmp(a, b) < 0) {
132
+ t = a;
133
+ a = b;
134
+ b = t;
135
+ }
136
+ } else {
137
+ /* a odd - b even */
138
+ if (!BN_rshift1(b, b)) {
139
+ goto err;
140
+ }
141
+ if (BN_cmp(a, b) < 0) {
142
+ t = a;
143
+ a = b;
144
+ b = t;
145
+ }
146
+ }
147
+ } else {
148
+ /* a is even */
149
+ if (BN_is_odd(b)) {
150
+ if (!BN_rshift1(a, a)) {
151
+ goto err;
152
+ }
153
+ if (BN_cmp(a, b) < 0) {
154
+ t = a;
155
+ a = b;
156
+ b = t;
157
+ }
158
+ } else {
159
+ /* a even - b even */
160
+ if (!BN_rshift1(a, a)) {
161
+ goto err;
162
+ }
163
+ if (!BN_rshift1(b, b)) {
164
+ goto err;
165
+ }
166
+ shifts++;
167
+ }
168
+ }
169
+ /* 0 <= b <= a */
170
+ }
171
+
172
+ if (shifts) {
173
+ if (!BN_lshift(a, a, shifts)) {
174
+ goto err;
175
+ }
176
+ }
177
+
178
+ return a;
179
+
180
+ err:
181
+ return NULL;
182
+ }
183
+
184
+ int BN_gcd(BIGNUM *r, const BIGNUM *in_a, const BIGNUM *in_b, BN_CTX *ctx) {
185
+ BIGNUM *a, *b, *t;
186
+ int ret = 0;
187
+
188
+ BN_CTX_start(ctx);
189
+ a = BN_CTX_get(ctx);
190
+ b = BN_CTX_get(ctx);
191
+
192
+ if (a == NULL || b == NULL) {
193
+ goto err;
194
+ }
195
+ if (BN_copy(a, in_a) == NULL) {
196
+ goto err;
197
+ }
198
+ if (BN_copy(b, in_b) == NULL) {
199
+ goto err;
200
+ }
201
+
202
+ a->neg = 0;
203
+ b->neg = 0;
204
+
205
+ if (BN_cmp(a, b) < 0) {
206
+ t = a;
207
+ a = b;
208
+ b = t;
209
+ }
210
+ t = euclid(a, b);
211
+ if (t == NULL) {
212
+ goto err;
213
+ }
214
+
215
+ if (BN_copy(r, t) == NULL) {
216
+ goto err;
217
+ }
218
+ ret = 1;
219
+
220
+ err:
221
+ BN_CTX_end(ctx);
222
+ return ret;
223
+ }
224
+
225
+ /* solves ax == 1 (mod n) */
226
+ static BIGNUM *BN_mod_inverse_no_branch(BIGNUM *out, int *out_no_inverse,
227
+ const BIGNUM *a, const BIGNUM *n,
228
+ BN_CTX *ctx);
229
+
230
+ BIGNUM *BN_mod_inverse_ex(BIGNUM *out, int *out_no_inverse, const BIGNUM *a,
231
+ const BIGNUM *n, BN_CTX *ctx) {
232
+ BIGNUM *A, *B, *X, *Y, *M, *D, *T, *R = NULL;
233
+ BIGNUM *ret = NULL;
234
+ int sign;
235
+
236
+ if ((a->flags & BN_FLG_CONSTTIME) != 0 ||
237
+ (n->flags & BN_FLG_CONSTTIME) != 0) {
238
+ return BN_mod_inverse_no_branch(out, out_no_inverse, a, n, ctx);
239
+ }
240
+
241
+ *out_no_inverse = 0;
242
+
243
+ BN_CTX_start(ctx);
244
+ A = BN_CTX_get(ctx);
245
+ B = BN_CTX_get(ctx);
246
+ X = BN_CTX_get(ctx);
247
+ D = BN_CTX_get(ctx);
248
+ M = BN_CTX_get(ctx);
249
+ Y = BN_CTX_get(ctx);
250
+ T = BN_CTX_get(ctx);
251
+ if (T == NULL) {
252
+ goto err;
253
+ }
254
+
255
+ if (out == NULL) {
256
+ R = BN_new();
257
+ } else {
258
+ R = out;
259
+ }
260
+ if (R == NULL) {
261
+ goto err;
262
+ }
263
+
264
+ BN_zero(Y);
265
+ if (!BN_one(X) || BN_copy(B, a) == NULL || BN_copy(A, n) == NULL) {
266
+ goto err;
267
+ }
268
+ A->neg = 0;
269
+ if (B->neg || (BN_ucmp(B, A) >= 0)) {
270
+ if (!BN_nnmod(B, B, A, ctx)) {
271
+ goto err;
272
+ }
273
+ }
274
+ sign = -1;
275
+ /* From B = a mod |n|, A = |n| it follows that
276
+ *
277
+ * 0 <= B < A,
278
+ * -sign*X*a == B (mod |n|),
279
+ * sign*Y*a == A (mod |n|).
280
+ */
281
+
282
+ if (BN_is_odd(n) && (BN_num_bits(n) <= (BN_BITS2 <= 32 ? 450 : 2048))) {
283
+ /* Binary inversion algorithm; requires odd modulus.
284
+ * This is faster than the general algorithm if the modulus
285
+ * is sufficiently small (about 400 .. 500 bits on 32-bit
286
+ * sytems, but much more on 64-bit systems) */
287
+ int shift;
288
+
289
+ while (!BN_is_zero(B)) {
290
+ /* 0 < B < |n|,
291
+ * 0 < A <= |n|,
292
+ * (1) -sign*X*a == B (mod |n|),
293
+ * (2) sign*Y*a == A (mod |n|) */
294
+
295
+ /* Now divide B by the maximum possible power of two in the integers,
296
+ * and divide X by the same value mod |n|.
297
+ * When we're done, (1) still holds. */
298
+ shift = 0;
299
+ while (!BN_is_bit_set(B, shift)) {
300
+ /* note that 0 < B */
301
+ shift++;
302
+
303
+ if (BN_is_odd(X)) {
304
+ if (!BN_uadd(X, X, n)) {
305
+ goto err;
306
+ }
307
+ }
308
+ /* now X is even, so we can easily divide it by two */
309
+ if (!BN_rshift1(X, X)) {
310
+ goto err;
311
+ }
312
+ }
313
+ if (shift > 0) {
314
+ if (!BN_rshift(B, B, shift)) {
315
+ goto err;
316
+ }
317
+ }
318
+
319
+ /* Same for A and Y. Afterwards, (2) still holds. */
320
+ shift = 0;
321
+ while (!BN_is_bit_set(A, shift)) {
322
+ /* note that 0 < A */
323
+ shift++;
324
+
325
+ if (BN_is_odd(Y)) {
326
+ if (!BN_uadd(Y, Y, n)) {
327
+ goto err;
328
+ }
329
+ }
330
+ /* now Y is even */
331
+ if (!BN_rshift1(Y, Y)) {
332
+ goto err;
333
+ }
334
+ }
335
+ if (shift > 0) {
336
+ if (!BN_rshift(A, A, shift)) {
337
+ goto err;
338
+ }
339
+ }
340
+
341
+ /* We still have (1) and (2).
342
+ * Both A and B are odd.
343
+ * The following computations ensure that
344
+ *
345
+ * 0 <= B < |n|,
346
+ * 0 < A < |n|,
347
+ * (1) -sign*X*a == B (mod |n|),
348
+ * (2) sign*Y*a == A (mod |n|),
349
+ *
350
+ * and that either A or B is even in the next iteration. */
351
+ if (BN_ucmp(B, A) >= 0) {
352
+ /* -sign*(X + Y)*a == B - A (mod |n|) */
353
+ if (!BN_uadd(X, X, Y)) {
354
+ goto err;
355
+ }
356
+ /* NB: we could use BN_mod_add_quick(X, X, Y, n), but that
357
+ * actually makes the algorithm slower */
358
+ if (!BN_usub(B, B, A)) {
359
+ goto err;
360
+ }
361
+ } else {
362
+ /* sign*(X + Y)*a == A - B (mod |n|) */
363
+ if (!BN_uadd(Y, Y, X)) {
364
+ goto err;
365
+ }
366
+ /* as above, BN_mod_add_quick(Y, Y, X, n) would slow things down */
367
+ if (!BN_usub(A, A, B)) {
368
+ goto err;
369
+ }
370
+ }
371
+ }
372
+ } else {
373
+ /* general inversion algorithm */
374
+
375
+ while (!BN_is_zero(B)) {
376
+ BIGNUM *tmp;
377
+
378
+ /*
379
+ * 0 < B < A,
380
+ * (*) -sign*X*a == B (mod |n|),
381
+ * sign*Y*a == A (mod |n|) */
382
+
383
+ /* (D, M) := (A/B, A%B) ... */
384
+ if (BN_num_bits(A) == BN_num_bits(B)) {
385
+ if (!BN_one(D)) {
386
+ goto err;
387
+ }
388
+ if (!BN_sub(M, A, B)) {
389
+ goto err;
390
+ }
391
+ } else if (BN_num_bits(A) == BN_num_bits(B) + 1) {
392
+ /* A/B is 1, 2, or 3 */
393
+ if (!BN_lshift1(T, B)) {
394
+ goto err;
395
+ }
396
+ if (BN_ucmp(A, T) < 0) {
397
+ /* A < 2*B, so D=1 */
398
+ if (!BN_one(D)) {
399
+ goto err;
400
+ }
401
+ if (!BN_sub(M, A, B)) {
402
+ goto err;
403
+ }
404
+ } else {
405
+ /* A >= 2*B, so D=2 or D=3 */
406
+ if (!BN_sub(M, A, T)) {
407
+ goto err;
408
+ }
409
+ if (!BN_add(D, T, B)) {
410
+ goto err; /* use D (:= 3*B) as temp */
411
+ }
412
+ if (BN_ucmp(A, D) < 0) {
413
+ /* A < 3*B, so D=2 */
414
+ if (!BN_set_word(D, 2)) {
415
+ goto err;
416
+ }
417
+ /* M (= A - 2*B) already has the correct value */
418
+ } else {
419
+ /* only D=3 remains */
420
+ if (!BN_set_word(D, 3)) {
421
+ goto err;
422
+ }
423
+ /* currently M = A - 2*B, but we need M = A - 3*B */
424
+ if (!BN_sub(M, M, B)) {
425
+ goto err;
426
+ }
427
+ }
428
+ }
429
+ } else {
430
+ if (!BN_div(D, M, A, B, ctx)) {
431
+ goto err;
432
+ }
433
+ }
434
+
435
+ /* Now
436
+ * A = D*B + M;
437
+ * thus we have
438
+ * (**) sign*Y*a == D*B + M (mod |n|). */
439
+
440
+ tmp = A; /* keep the BIGNUM object, the value does not matter */
441
+
442
+ /* (A, B) := (B, A mod B) ... */
443
+ A = B;
444
+ B = M;
445
+ /* ... so we have 0 <= B < A again */
446
+
447
+ /* Since the former M is now B and the former B is now A,
448
+ * (**) translates into
449
+ * sign*Y*a == D*A + B (mod |n|),
450
+ * i.e.
451
+ * sign*Y*a - D*A == B (mod |n|).
452
+ * Similarly, (*) translates into
453
+ * -sign*X*a == A (mod |n|).
454
+ *
455
+ * Thus,
456
+ * sign*Y*a + D*sign*X*a == B (mod |n|),
457
+ * i.e.
458
+ * sign*(Y + D*X)*a == B (mod |n|).
459
+ *
460
+ * So if we set (X, Y, sign) := (Y + D*X, X, -sign), we arrive back at
461
+ * -sign*X*a == B (mod |n|),
462
+ * sign*Y*a == A (mod |n|).
463
+ * Note that X and Y stay non-negative all the time. */
464
+
465
+ /* most of the time D is very small, so we can optimize tmp := D*X+Y */
466
+ if (BN_is_one(D)) {
467
+ if (!BN_add(tmp, X, Y)) {
468
+ goto err;
469
+ }
470
+ } else {
471
+ if (BN_is_word(D, 2)) {
472
+ if (!BN_lshift1(tmp, X)) {
473
+ goto err;
474
+ }
475
+ } else if (BN_is_word(D, 4)) {
476
+ if (!BN_lshift(tmp, X, 2)) {
477
+ goto err;
478
+ }
479
+ } else if (D->top == 1) {
480
+ if (!BN_copy(tmp, X)) {
481
+ goto err;
482
+ }
483
+ if (!BN_mul_word(tmp, D->d[0])) {
484
+ goto err;
485
+ }
486
+ } else {
487
+ if (!BN_mul(tmp, D, X, ctx)) {
488
+ goto err;
489
+ }
490
+ }
491
+ if (!BN_add(tmp, tmp, Y)) {
492
+ goto err;
493
+ }
494
+ }
495
+
496
+ M = Y; /* keep the BIGNUM object, the value does not matter */
497
+ Y = X;
498
+ X = tmp;
499
+ sign = -sign;
500
+ }
501
+ }
502
+
503
+ /* The while loop (Euclid's algorithm) ends when
504
+ * A == gcd(a,n);
505
+ * we have
506
+ * sign*Y*a == A (mod |n|),
507
+ * where Y is non-negative. */
508
+
509
+ if (sign < 0) {
510
+ if (!BN_sub(Y, n, Y)) {
511
+ goto err;
512
+ }
513
+ }
514
+ /* Now Y*a == A (mod |n|). */
515
+
516
+ if (BN_is_one(A)) {
517
+ /* Y*a == 1 (mod |n|) */
518
+ if (!Y->neg && BN_ucmp(Y, n) < 0) {
519
+ if (!BN_copy(R, Y)) {
520
+ goto err;
521
+ }
522
+ } else {
523
+ if (!BN_nnmod(R, Y, n, ctx)) {
524
+ goto err;
525
+ }
526
+ }
527
+ } else {
528
+ *out_no_inverse = 1;
529
+ OPENSSL_PUT_ERROR(BN, BN_R_NO_INVERSE);
530
+ goto err;
531
+ }
532
+ ret = R;
533
+
534
+ err:
535
+ if (ret == NULL && out == NULL) {
536
+ BN_free(R);
537
+ }
538
+ BN_CTX_end(ctx);
539
+ return ret;
540
+ }
541
+
542
+ BIGNUM *BN_mod_inverse(BIGNUM *out, const BIGNUM *a, const BIGNUM *n,
543
+ BN_CTX *ctx) {
544
+ int no_inverse;
545
+ return BN_mod_inverse_ex(out, &no_inverse, a, n, ctx);
546
+ }
547
+
548
+ /* BN_mod_inverse_no_branch is a special version of BN_mod_inverse.
549
+ * It does not contain branches that may leak sensitive information. */
550
+ static BIGNUM *BN_mod_inverse_no_branch(BIGNUM *out, int *out_no_inverse,
551
+ const BIGNUM *a, const BIGNUM *n,
552
+ BN_CTX *ctx) {
553
+ BIGNUM *A, *B, *X, *Y, *M, *D, *T, *R = NULL;
554
+ BIGNUM local_A, local_B;
555
+ BIGNUM *pA, *pB;
556
+ BIGNUM *ret = NULL;
557
+ int sign;
558
+
559
+ *out_no_inverse = 0;
560
+
561
+ BN_CTX_start(ctx);
562
+ A = BN_CTX_get(ctx);
563
+ B = BN_CTX_get(ctx);
564
+ X = BN_CTX_get(ctx);
565
+ D = BN_CTX_get(ctx);
566
+ M = BN_CTX_get(ctx);
567
+ Y = BN_CTX_get(ctx);
568
+ T = BN_CTX_get(ctx);
569
+ if (T == NULL) {
570
+ goto err;
571
+ }
572
+
573
+ if (out == NULL) {
574
+ R = BN_new();
575
+ } else {
576
+ R = out;
577
+ }
578
+ if (R == NULL) {
579
+ goto err;
580
+ }
581
+
582
+ BN_zero(Y);
583
+ if (!BN_one(X) || BN_copy(B, a) == NULL || BN_copy(A, n) == NULL) {
584
+ goto err;
585
+ }
586
+ A->neg = 0;
587
+
588
+ if (B->neg || (BN_ucmp(B, A) >= 0)) {
589
+ /* Turn BN_FLG_CONSTTIME flag on, so that when BN_div is invoked,
590
+ * BN_div_no_branch will be called eventually.
591
+ */
592
+ pB = &local_B;
593
+ BN_with_flags(pB, B, BN_FLG_CONSTTIME);
594
+ if (!BN_nnmod(B, pB, A, ctx)) {
595
+ goto err;
596
+ }
597
+ }
598
+ sign = -1;
599
+ /* From B = a mod |n|, A = |n| it follows that
600
+ *
601
+ * 0 <= B < A,
602
+ * -sign*X*a == B (mod |n|),
603
+ * sign*Y*a == A (mod |n|).
604
+ */
605
+
606
+ while (!BN_is_zero(B)) {
607
+ BIGNUM *tmp;
608
+
609
+ /*
610
+ * 0 < B < A,
611
+ * (*) -sign*X*a == B (mod |n|),
612
+ * sign*Y*a == A (mod |n|)
613
+ */
614
+
615
+ /* Turn BN_FLG_CONSTTIME flag on, so that when BN_div is invoked,
616
+ * BN_div_no_branch will be called eventually.
617
+ */
618
+ pA = &local_A;
619
+ BN_with_flags(pA, A, BN_FLG_CONSTTIME);
620
+
621
+ /* (D, M) := (A/B, A%B) ... */
622
+ if (!BN_div(D, M, pA, B, ctx)) {
623
+ goto err;
624
+ }
625
+
626
+ /* Now
627
+ * A = D*B + M;
628
+ * thus we have
629
+ * (**) sign*Y*a == D*B + M (mod |n|).
630
+ */
631
+
632
+ tmp = A; /* keep the BIGNUM object, the value does not matter */
633
+
634
+ /* (A, B) := (B, A mod B) ... */
635
+ A = B;
636
+ B = M;
637
+ /* ... so we have 0 <= B < A again */
638
+
639
+ /* Since the former M is now B and the former B is now A,
640
+ * (**) translates into
641
+ * sign*Y*a == D*A + B (mod |n|),
642
+ * i.e.
643
+ * sign*Y*a - D*A == B (mod |n|).
644
+ * Similarly, (*) translates into
645
+ * -sign*X*a == A (mod |n|).
646
+ *
647
+ * Thus,
648
+ * sign*Y*a + D*sign*X*a == B (mod |n|),
649
+ * i.e.
650
+ * sign*(Y + D*X)*a == B (mod |n|).
651
+ *
652
+ * So if we set (X, Y, sign) := (Y + D*X, X, -sign), we arrive back at
653
+ * -sign*X*a == B (mod |n|),
654
+ * sign*Y*a == A (mod |n|).
655
+ * Note that X and Y stay non-negative all the time.
656
+ */
657
+
658
+ if (!BN_mul(tmp, D, X, ctx)) {
659
+ goto err;
660
+ }
661
+ if (!BN_add(tmp, tmp, Y)) {
662
+ goto err;
663
+ }
664
+
665
+ M = Y; /* keep the BIGNUM object, the value does not matter */
666
+ Y = X;
667
+ X = tmp;
668
+ sign = -sign;
669
+ }
670
+
671
+ /*
672
+ * The while loop (Euclid's algorithm) ends when
673
+ * A == gcd(a,n);
674
+ * we have
675
+ * sign*Y*a == A (mod |n|),
676
+ * where Y is non-negative.
677
+ */
678
+
679
+ if (sign < 0) {
680
+ if (!BN_sub(Y, n, Y)) {
681
+ goto err;
682
+ }
683
+ }
684
+ /* Now Y*a == A (mod |n|). */
685
+
686
+ if (BN_is_one(A)) {
687
+ /* Y*a == 1 (mod |n|) */
688
+ if (!Y->neg && BN_ucmp(Y, n) < 0) {
689
+ if (!BN_copy(R, Y)) {
690
+ goto err;
691
+ }
692
+ } else {
693
+ if (!BN_nnmod(R, Y, n, ctx)) {
694
+ goto err;
695
+ }
696
+ }
697
+ } else {
698
+ *out_no_inverse = 1;
699
+ OPENSSL_PUT_ERROR(BN, BN_R_NO_INVERSE);
700
+ goto err;
701
+ }
702
+ ret = R;
703
+
704
+ err:
705
+ if (ret == NULL && out == NULL) {
706
+ BN_free(R);
707
+ }
708
+
709
+ BN_CTX_end(ctx);
710
+ return ret;
711
+ }