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,114 @@
1
+ /* Originally written by Bodo Moeller and Nils Larsch for the OpenSSL project.
2
+ * ====================================================================
3
+ * Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions
7
+ * are met:
8
+ *
9
+ * 1. Redistributions of source code must retain the above copyright
10
+ * notice, this list of conditions and the following disclaimer.
11
+ *
12
+ * 2. Redistributions in binary form must reproduce the above copyright
13
+ * notice, this list of conditions and the following disclaimer in
14
+ * the documentation and/or other materials provided with the
15
+ * distribution.
16
+ *
17
+ * 3. All advertising materials mentioning features or use of this
18
+ * software must display the following acknowledgment:
19
+ * "This product includes software developed by the OpenSSL Project
20
+ * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21
+ *
22
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23
+ * endorse or promote products derived from this software without
24
+ * prior written permission. For written permission, please contact
25
+ * openssl-core@openssl.org.
26
+ *
27
+ * 5. Products derived from this software may not be called "OpenSSL"
28
+ * nor may "OpenSSL" appear in their names without prior written
29
+ * permission of the OpenSSL Project.
30
+ *
31
+ * 6. Redistributions of any form whatsoever must retain the following
32
+ * acknowledgment:
33
+ * "This product includes software developed by the OpenSSL Project
34
+ * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35
+ *
36
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
40
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
48
+ * ====================================================================
49
+ *
50
+ * This product includes cryptographic software written by Eric Young
51
+ * (eay@cryptsoft.com). This product includes software written by Tim
52
+ * Hudson (tjh@cryptsoft.com).
53
+ *
54
+ */
55
+ /* ====================================================================
56
+ * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
57
+ *
58
+ * Portions of the attached software ("Contribution") are developed by
59
+ * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
60
+ *
61
+ * The Contribution is licensed pursuant to the OpenSSL open source
62
+ * license provided above.
63
+ *
64
+ * The elliptic curve binary polynomial software is originally written by
65
+ * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems
66
+ * Laboratories. */
67
+
68
+ #include <openssl/ec.h>
69
+
70
+ #include <openssl/bn.h>
71
+ #include <openssl/err.h>
72
+ #include <openssl/mem.h>
73
+
74
+ #include "internal.h"
75
+
76
+
77
+ const EC_METHOD EC_GFp_mont_method = {
78
+ ec_GFp_simple_point_get_affine_coordinates,
79
+ ec_wNAF_mul_private /* XXX: Not constant time. */,
80
+ ec_wNAF_mul_public,
81
+ ec_GFp_mont_field_mul,
82
+ ec_GFp_mont_field_sqr,
83
+ ec_GFp_mont_field_encode,
84
+ ec_GFp_mont_field_decode,
85
+ ec_GFp_mont_field_set_to_one
86
+ };
87
+
88
+ int ec_GFp_mont_field_mul(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a,
89
+ const BIGNUM *b, BN_CTX *ctx) {
90
+ return BN_mod_mul_montgomery(r, a, b, &group->mont, ctx);
91
+ }
92
+
93
+ int ec_GFp_mont_field_sqr(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a,
94
+ BN_CTX *ctx) {
95
+ return BN_mod_mul_montgomery(r, a, a, &group->mont, ctx);
96
+ }
97
+
98
+ int ec_GFp_mont_field_encode(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a,
99
+ BN_CTX *ctx) {
100
+ return BN_to_montgomery(r, a, &group->mont, ctx);
101
+ }
102
+
103
+ int ec_GFp_mont_field_decode(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a,
104
+ BN_CTX *ctx) {
105
+ return BN_from_montgomery(r, a, &group->mont, ctx);
106
+ }
107
+
108
+ int ec_GFp_mont_field_set_to_one(const EC_GROUP *group, BIGNUM *r,
109
+ BN_CTX *ctx) {
110
+ if (BN_copy(r, &group->one) == NULL) {
111
+ return 0;
112
+ }
113
+ return 1;
114
+ }
@@ -0,0 +1,25 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3
+ <PropertyGroup Label="Globals">
4
+ <ProjectGuid>{6216DD4F-2055-4D4E-9672-AF9154AC7B7B}</ProjectGuid>
5
+ <TargetName>example_mul</TargetName>
6
+ </PropertyGroup>
7
+ <ImportGroup Label="PropertySheets">
8
+ <Import Project="..\..\mk\WindowsTest.props" />
9
+ </ImportGroup>
10
+ <PropertyGroup Label="Configuration">
11
+ <OutDir>$(OutRootDir)test\ring\crypto\ec\</OutDir>
12
+ </PropertyGroup>
13
+ <ItemGroup>
14
+ <ClCompile Include="example_mul.c" />
15
+ </ItemGroup>
16
+ <ItemGroup>
17
+ <ProjectReference Include="..\libring.Windows.vcxproj">
18
+ <Project>{f4c0a1b6-5e09-41c8-8242-3e1f6762fb18}</Project>
19
+ </ProjectReference>
20
+ <ProjectReference Include="..\test\test.Windows.vcxproj">
21
+ <Project>{1dace503-6498-492d-b1ff-f9ee18624443}</Project>
22
+ </ProjectReference>
23
+ </ItemGroup>
24
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
25
+ </Project>
@@ -0,0 +1,243 @@
1
+ /* Originally written by Bodo Moeller for the OpenSSL project.
2
+ * ====================================================================
3
+ * Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions
7
+ * are met:
8
+ *
9
+ * 1. Redistributions of source code must retain the above copyright
10
+ * notice, this list of conditions and the following disclaimer.
11
+ *
12
+ * 2. Redistributions in binary form must reproduce the above copyright
13
+ * notice, this list of conditions and the following disclaimer in
14
+ * the documentation and/or other materials provided with the
15
+ * distribution.
16
+ *
17
+ * 3. All advertising materials mentioning features or use of this
18
+ * software must display the following acknowledgment:
19
+ * "This product includes software developed by the OpenSSL Project
20
+ * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21
+ *
22
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23
+ * endorse or promote products derived from this software without
24
+ * prior written permission. For written permission, please contact
25
+ * openssl-core@openssl.org.
26
+ *
27
+ * 5. Products derived from this software may not be called "OpenSSL"
28
+ * nor may "OpenSSL" appear in their names without prior written
29
+ * permission of the OpenSSL Project.
30
+ *
31
+ * 6. Redistributions of any form whatsoever must retain the following
32
+ * acknowledgment:
33
+ * "This product includes software developed by the OpenSSL Project
34
+ * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35
+ *
36
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
40
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
48
+ * ====================================================================
49
+ *
50
+ * This product includes cryptographic software written by Eric Young
51
+ * (eay@cryptsoft.com). This product includes software written by Tim
52
+ * Hudson (tjh@cryptsoft.com).
53
+ *
54
+ */
55
+ /* ====================================================================
56
+ * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
57
+ *
58
+ * Portions of the attached software ("Contribution") are developed by
59
+ * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
60
+ *
61
+ * The Contribution is licensed pursuant to the OpenSSL open source
62
+ * license provided above.
63
+ *
64
+ * The elliptic curve binary polynomial software is originally written by
65
+ * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems
66
+ * Laboratories. */
67
+
68
+ #ifndef OPENSSL_HEADER_EC_INTERNAL_H
69
+ #define OPENSSL_HEADER_EC_INTERNAL_H
70
+
71
+ #include <openssl/base.h>
72
+
73
+ #include <openssl/bn.h>
74
+ #include <openssl/thread.h>
75
+
76
+ #if defined(__cplusplus)
77
+ extern "C" {
78
+ #endif
79
+
80
+
81
+ typedef struct ec_method_st {
82
+ /* used by EC_POINT_get_affine_coordinates_GFp: */
83
+ int (*point_get_affine_coordinates)(const EC_GROUP *, const EC_POINT *,
84
+ BIGNUM *x, BIGNUM *y, BN_CTX *);
85
+
86
+ /* Point multiplication for the case where any secret scalars are involved.
87
+ *
88
+ * Computes |r = g_scalar*generator + p_scalar*p| if |g_scalar| and |p_scalar|
89
+ * are both non-null. Computes |r = g_scalar*generator| if |p_scalar| is null.
90
+ * Computes |r = p_scalar*p| if g_scalar is null. At least one of |g_scalar|
91
+ * and |p_scalar| must be non-null, and |p| must be non-null if |p_scalar| is
92
+ * non-null. The scalars must be in the range [0, group->order-1]. */
93
+ int (*mul_private)(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar,
94
+ const EC_POINT *p, const BIGNUM *p_scalar, BN_CTX *ctx);
95
+
96
+ /* Point multiplication for the case where no private scalars are involved.
97
+ *
98
+ * Computes |r = g_scalar*generator + p_scalar*p| if |g_scalar| and |p_scalar|
99
+ * are both non-null. Computes |r = g_scalar*generator| if |p_scalar| is null.
100
+ * Computes |r = p_scalar*p| if g_scalar is null. At least one of |g_scalar|
101
+ * and |p_scalar| must be non-null, and |p| must be non-null if |p_scalar| is
102
+ * non-null. The scalars must be in the range [0, group->order-1]. */
103
+ int (*mul_public)(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar,
104
+ const EC_POINT *p, const BIGNUM *p_scalar, BN_CTX *ctx);
105
+
106
+ /* internal functions */
107
+
108
+ /* 'field_mul' and 'field_sqr' can be used by 'add' and 'dbl' so that the
109
+ * same implementations of point operations can be used with different
110
+ * optimized implementations of expensive field operations: */
111
+ int (*field_mul)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a,
112
+ const BIGNUM *b, BN_CTX *);
113
+ int (*field_sqr)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *);
114
+
115
+ int (*field_encode)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a,
116
+ BN_CTX *); /* e.g. to Montgomery */
117
+ int (*field_decode)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a,
118
+ BN_CTX *); /* e.g. from Montgomery */
119
+ int (*field_set_to_one)(const EC_GROUP *, BIGNUM *r, BN_CTX *);
120
+ } EC_METHOD;
121
+
122
+ extern const EC_METHOD EC_GFp_mont_method;
123
+
124
+ struct ec_point_st {
125
+ const EC_METHOD *meth;
126
+
127
+ /* All members except 'meth' are handled by the method functions,
128
+ * even if they appear generic. */
129
+
130
+ BIGNUM X;
131
+ BIGNUM Y;
132
+ BIGNUM Z; /* Jacobian projective coordinates:
133
+ * (X, Y, Z) represents (X/Z^2, Y/Z^3) if Z != 0 */
134
+ } /* EC_POINT */;
135
+
136
+ struct ec_group_st {
137
+ const EC_METHOD *meth;
138
+
139
+ const EC_POINT generator;
140
+ const BIGNUM order;
141
+ const BN_MONT_CTX order_mont;
142
+ const BIGNUM order_minus_2;
143
+
144
+ int curve_name; /* optional NID for named curve */
145
+
146
+ /* The following members are handled by the method functions,
147
+ * even if they appear generic */
148
+
149
+ BIGNUM field; /* For curves over GF(p), this is the modulus. */
150
+
151
+ BIGNUM a, b; /* Curve coefficients. */
152
+
153
+ BN_MONT_CTX mont; /* Montgomery structure. */
154
+ BIGNUM one; /* The value one */
155
+ } /* EC_GROUP */;
156
+
157
+ EC_GROUP *ec_group_new(const EC_METHOD *meth);
158
+
159
+ int ec_wNAF_mul_private(const EC_GROUP *group, EC_POINT *r,
160
+ const BIGNUM *g_scalar, const EC_POINT *p,
161
+ const BIGNUM *p_scalar, BN_CTX *ctx);
162
+ int ec_wNAF_mul_public(const EC_GROUP *group, EC_POINT *r,
163
+ const BIGNUM *g_scalar, const EC_POINT *p,
164
+ const BIGNUM *p_scalar, BN_CTX *ctx);
165
+
166
+ /* method functions in simple.c */
167
+ unsigned ec_GFp_simple_group_get_degree(const EC_GROUP *);
168
+ int ec_GFp_simple_point_init(EC_POINT *);
169
+ void ec_GFp_simple_point_finish(EC_POINT *);
170
+ void ec_GFp_simple_point_clear_finish(EC_POINT *);
171
+ int ec_GFp_simple_point_copy(EC_POINT *, const EC_POINT *);
172
+ int ec_GFp_simple_point_set_to_infinity(const EC_GROUP *, EC_POINT *);
173
+ int ec_GFp_simple_set_Jprojective_coordinates_GFp(const EC_GROUP *, EC_POINT *,
174
+ const BIGNUM *x,
175
+ const BIGNUM *y,
176
+ const BIGNUM *z, BN_CTX *);
177
+ int ec_GFp_simple_point_set_affine_coordinates(const EC_GROUP *, EC_POINT *,
178
+ const BIGNUM *x, const BIGNUM *y,
179
+ BN_CTX *);
180
+ int ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP *,
181
+ const EC_POINT *, BIGNUM *x,
182
+ BIGNUM *y, BN_CTX *);
183
+ int ec_GFp_simple_add(const EC_GROUP *, EC_POINT *r, const EC_POINT *a,
184
+ const EC_POINT *b, BN_CTX *);
185
+ int ec_GFp_simple_dbl(const EC_GROUP *, EC_POINT *r, const EC_POINT *a,
186
+ BN_CTX *);
187
+ int ec_GFp_simple_invert(const EC_GROUP *, EC_POINT *, BN_CTX *);
188
+ int ec_GFp_simple_is_at_infinity(const EC_GROUP *, const EC_POINT *);
189
+ int ec_GFp_simple_is_on_curve(const EC_GROUP *, const EC_POINT *, BN_CTX *);
190
+ int ec_GFp_simple_cmp(const EC_GROUP *, const EC_POINT *a, const EC_POINT *b,
191
+ BN_CTX *);
192
+ int ec_GFp_simple_points_make_affine(const EC_GROUP *, size_t num,
193
+ EC_POINT * [], BN_CTX *);
194
+ int ec_GFp_simple_field_mul(const EC_GROUP *, BIGNUM *r, const BIGNUM *a,
195
+ const BIGNUM *b, BN_CTX *);
196
+ int ec_GFp_simple_field_sqr(const EC_GROUP *, BIGNUM *r, const BIGNUM *a,
197
+ BN_CTX *);
198
+
199
+ /* method functions in montgomery.c */
200
+ int ec_GFp_mont_field_mul(const EC_GROUP *, BIGNUM *r, const BIGNUM *a,
201
+ const BIGNUM *b, BN_CTX *);
202
+ int ec_GFp_mont_field_sqr(const EC_GROUP *, BIGNUM *r, const BIGNUM *a,
203
+ BN_CTX *);
204
+ int ec_GFp_mont_field_encode(const EC_GROUP *, BIGNUM *r, const BIGNUM *a,
205
+ BN_CTX *);
206
+ int ec_GFp_mont_field_decode(const EC_GROUP *, BIGNUM *r, const BIGNUM *a,
207
+ BN_CTX *);
208
+ int ec_GFp_mont_field_set_to_one(const EC_GROUP *, BIGNUM *r, BN_CTX *);
209
+
210
+ int ec_point_set_Jprojective_coordinates_GFp(const EC_GROUP *group,
211
+ EC_POINT *point, const BIGNUM *x,
212
+ const BIGNUM *y, const BIGNUM *z,
213
+ BN_CTX *ctx);
214
+
215
+ void ec_GFp_nistp_points_make_affine_internal(
216
+ size_t num, void *point_array, size_t felem_size, void *tmp_felems,
217
+ void (*felem_one)(void *out), int (*felem_is_zero)(const void *in),
218
+ void (*felem_assign)(void *out, const void *in),
219
+ void (*felem_square)(void *out, const void *in),
220
+ void (*felem_mul)(void *out, const void *in1, const void *in2),
221
+ void (*felem_inv)(void *out, const void *in),
222
+ void (*felem_contract)(void *out, const void *in));
223
+
224
+ void ec_GFp_nistp_recode_scalar_bits(uint8_t *sign, uint8_t *digit, uint8_t in);
225
+
226
+ extern const EC_METHOD EC_GFp_nistp256_method;
227
+ extern const EC_METHOD EC_GFp_nistz256_method;
228
+
229
+ struct ec_key_st {
230
+ const EC_GROUP *group;
231
+
232
+ EC_POINT *pub_key;
233
+ BIGNUM *priv_key;
234
+
235
+ CRYPTO_refcount_t references;
236
+ } /* EC_KEY */;
237
+
238
+
239
+ #if defined(__cplusplus)
240
+ } /* extern C */
241
+ #endif
242
+
243
+ #endif /* OPENSSL_HEADER_EC_INTERNAL_H */
@@ -0,0 +1,253 @@
1
+ /* Originally written by Bodo Moeller for the OpenSSL project.
2
+ * ====================================================================
3
+ * Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions
7
+ * are met:
8
+ *
9
+ * 1. Redistributions of source code must retain the above copyright
10
+ * notice, this list of conditions and the following disclaimer.
11
+ *
12
+ * 2. Redistributions in binary form must reproduce the above copyright
13
+ * notice, this list of conditions and the following disclaimer in
14
+ * the documentation and/or other materials provided with the
15
+ * distribution.
16
+ *
17
+ * 3. All advertising materials mentioning features or use of this
18
+ * software must display the following acknowledgment:
19
+ * "This product includes software developed by the OpenSSL Project
20
+ * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21
+ *
22
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23
+ * endorse or promote products derived from this software without
24
+ * prior written permission. For written permission, please contact
25
+ * openssl-core@openssl.org.
26
+ *
27
+ * 5. Products derived from this software may not be called "OpenSSL"
28
+ * nor may "OpenSSL" appear in their names without prior written
29
+ * permission of the OpenSSL Project.
30
+ *
31
+ * 6. Redistributions of any form whatsoever must retain the following
32
+ * acknowledgment:
33
+ * "This product includes software developed by the OpenSSL Project
34
+ * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35
+ *
36
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
40
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
48
+ * ====================================================================
49
+ *
50
+ * This product includes cryptographic software written by Eric Young
51
+ * (eay@cryptsoft.com). This product includes software written by Tim
52
+ * Hudson (tjh@cryptsoft.com).
53
+ *
54
+ */
55
+ /* ====================================================================
56
+ * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
57
+ *
58
+ * Portions of the attached software ("Contribution") are developed by
59
+ * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
60
+ *
61
+ * The Contribution is licensed pursuant to the OpenSSL open source
62
+ * license provided above.
63
+ *
64
+ * The elliptic curve binary polynomial software is originally written by
65
+ * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems
66
+ * Laboratories. */
67
+
68
+ #include <openssl/ec.h>
69
+
70
+ #include <openssl/bn.h>
71
+ #include <openssl/err.h>
72
+
73
+ #include "internal.h"
74
+
75
+
76
+ static size_t ec_GFp_simple_point2oct(const EC_GROUP *group,
77
+ const EC_POINT *point,
78
+ point_conversion_form_t form,
79
+ uint8_t *buf, size_t len, BN_CTX *ctx) {
80
+ size_t ret;
81
+ BN_CTX *new_ctx = NULL;
82
+ int used_ctx = 0;
83
+ BIGNUM *x, *y;
84
+ size_t field_len, i;
85
+
86
+ if (form != POINT_CONVERSION_UNCOMPRESSED) {
87
+ OPENSSL_PUT_ERROR(EC, EC_R_INVALID_FORM);
88
+ goto err;
89
+ }
90
+
91
+ if (EC_POINT_is_at_infinity(group, point)) {
92
+ OPENSSL_PUT_ERROR(EC, EC_R_POINT_AT_INFINITY);
93
+ goto err;
94
+ }
95
+
96
+ /* ret := required output buffer length */
97
+ field_len = BN_num_bytes(&group->field);
98
+ ret = 1 + 2 * field_len;
99
+
100
+ /* if 'buf' is NULL, just return required length */
101
+ if (buf != NULL) {
102
+ if (len < ret) {
103
+ OPENSSL_PUT_ERROR(EC, EC_R_BUFFER_TOO_SMALL);
104
+ goto err;
105
+ }
106
+
107
+ if (ctx == NULL) {
108
+ ctx = new_ctx = BN_CTX_new();
109
+ if (ctx == NULL) {
110
+ goto err;
111
+ }
112
+ }
113
+
114
+ BN_CTX_start(ctx);
115
+ used_ctx = 1;
116
+ x = BN_CTX_get(ctx);
117
+ y = BN_CTX_get(ctx);
118
+ if (y == NULL) {
119
+ goto err;
120
+ }
121
+
122
+ if (!EC_POINT_get_affine_coordinates_GFp(group, point, x, y, ctx)) {
123
+ goto err;
124
+ }
125
+
126
+ buf[0] = form;
127
+ i = 1;
128
+
129
+ if (!BN_bn2bin_padded(buf + i, field_len, x)) {
130
+ OPENSSL_PUT_ERROR(EC, ERR_R_INTERNAL_ERROR);
131
+ goto err;
132
+ }
133
+ i += field_len;
134
+
135
+ if (form == POINT_CONVERSION_UNCOMPRESSED) {
136
+ if (!BN_bn2bin_padded(buf + i, field_len, y)) {
137
+ OPENSSL_PUT_ERROR(EC, ERR_R_INTERNAL_ERROR);
138
+ goto err;
139
+ }
140
+ i += field_len;
141
+ }
142
+
143
+ if (i != ret) {
144
+ OPENSSL_PUT_ERROR(EC, ERR_R_INTERNAL_ERROR);
145
+ goto err;
146
+ }
147
+ }
148
+
149
+ if (used_ctx) {
150
+ BN_CTX_end(ctx);
151
+ }
152
+ BN_CTX_free(new_ctx);
153
+ return ret;
154
+
155
+ err:
156
+ if (used_ctx) {
157
+ BN_CTX_end(ctx);
158
+ }
159
+ BN_CTX_free(new_ctx);
160
+ return 0;
161
+ }
162
+
163
+
164
+ static int ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point,
165
+ const uint8_t *buf, size_t len,
166
+ BN_CTX *ctx) {
167
+ if (group->meth != point->meth) {
168
+ OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS);
169
+ return 0;
170
+ }
171
+
172
+ BN_CTX *new_ctx = NULL;
173
+ BIGNUM *x, *y;
174
+ size_t field_len, enc_len;
175
+ int ret = 0;
176
+
177
+ if (len == 0) {
178
+ OPENSSL_PUT_ERROR(EC, EC_R_BUFFER_TOO_SMALL);
179
+ return 0;
180
+ }
181
+ if (buf[0] != POINT_CONVERSION_UNCOMPRESSED) {
182
+ OPENSSL_PUT_ERROR(EC, EC_R_INVALID_ENCODING);
183
+ return 0;
184
+ }
185
+
186
+ field_len = BN_num_bytes(&group->field);
187
+ enc_len = 1 + 2 * field_len;
188
+
189
+ if (len != enc_len) {
190
+ OPENSSL_PUT_ERROR(EC, EC_R_INVALID_ENCODING);
191
+ return 0;
192
+ }
193
+
194
+ if (ctx == NULL) {
195
+ ctx = new_ctx = BN_CTX_new();
196
+ if (ctx == NULL) {
197
+ return 0;
198
+ }
199
+ }
200
+
201
+ BN_CTX_start(ctx);
202
+ x = BN_CTX_get(ctx);
203
+ y = BN_CTX_get(ctx);
204
+ if (x == NULL || y == NULL) {
205
+ goto err;
206
+ }
207
+
208
+ if (!BN_bin2bn(buf + 1, field_len, x)) {
209
+ goto err;
210
+ }
211
+ if (BN_ucmp(x, &group->field) >= 0) {
212
+ OPENSSL_PUT_ERROR(EC, EC_R_INVALID_ENCODING);
213
+ goto err;
214
+ }
215
+
216
+ if (!BN_bin2bn(buf + 1 + field_len, field_len, y)) {
217
+ goto err;
218
+ }
219
+ if (BN_ucmp(y, &group->field) >= 0) {
220
+ OPENSSL_PUT_ERROR(EC, EC_R_INVALID_ENCODING);
221
+ goto err;
222
+ }
223
+
224
+ if (!ec_GFp_simple_point_set_affine_coordinates(group, point, x, y, ctx)) {
225
+ goto err;
226
+ }
227
+
228
+ ret = 1;
229
+
230
+ err:
231
+ BN_CTX_end(ctx);
232
+ BN_CTX_free(new_ctx);
233
+ return ret;
234
+ }
235
+
236
+ int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *point,
237
+ const uint8_t *buf, size_t len, BN_CTX *ctx) {
238
+ if (group->meth != point->meth) {
239
+ OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS);
240
+ return 0;
241
+ }
242
+ return ec_GFp_simple_oct2point(group, point, buf, len, ctx);
243
+ }
244
+
245
+ size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point,
246
+ point_conversion_form_t form, uint8_t *buf,
247
+ size_t len, BN_CTX *ctx) {
248
+ if (group->meth != point->meth) {
249
+ OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS);
250
+ return 0;
251
+ }
252
+ return ec_GFp_simple_point2oct(group, point, form, buf, len, ctx);
253
+ }