ring-native 0.0.0 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (267) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGES.md +7 -0
  4. data/Makefile +5 -0
  5. data/README.md +12 -5
  6. data/Rakefile +4 -0
  7. data/ext/ring/extconf.rb +4 -5
  8. data/lib/ring/native.rb +3 -1
  9. data/lib/ring/native/version.rb +5 -1
  10. data/ring-native.gemspec +6 -6
  11. data/vendor/ring-ffi/Cargo.lock +26 -0
  12. data/vendor/ring-ffi/Cargo.toml +45 -0
  13. data/vendor/ring-ffi/LICENSE +16 -0
  14. data/vendor/ring-ffi/README.md +59 -0
  15. data/vendor/ring-ffi/src/lib.rs +79 -0
  16. metadata +10 -255
  17. data/vendor/ring/BUILDING.md +0 -40
  18. data/vendor/ring/Cargo.toml +0 -43
  19. data/vendor/ring/LICENSE +0 -185
  20. data/vendor/ring/Makefile +0 -35
  21. data/vendor/ring/PORTING.md +0 -163
  22. data/vendor/ring/README.md +0 -113
  23. data/vendor/ring/STYLE.md +0 -197
  24. data/vendor/ring/appveyor.yml +0 -27
  25. data/vendor/ring/build.rs +0 -108
  26. data/vendor/ring/crypto/aes/aes.c +0 -1142
  27. data/vendor/ring/crypto/aes/aes_test.Windows.vcxproj +0 -25
  28. data/vendor/ring/crypto/aes/aes_test.cc +0 -93
  29. data/vendor/ring/crypto/aes/asm/aes-586.pl +0 -2368
  30. data/vendor/ring/crypto/aes/asm/aes-armv4.pl +0 -1249
  31. data/vendor/ring/crypto/aes/asm/aes-x86_64.pl +0 -2246
  32. data/vendor/ring/crypto/aes/asm/aesni-x86.pl +0 -1318
  33. data/vendor/ring/crypto/aes/asm/aesni-x86_64.pl +0 -2084
  34. data/vendor/ring/crypto/aes/asm/aesv8-armx.pl +0 -675
  35. data/vendor/ring/crypto/aes/asm/bsaes-armv7.pl +0 -1364
  36. data/vendor/ring/crypto/aes/asm/bsaes-x86_64.pl +0 -1565
  37. data/vendor/ring/crypto/aes/asm/vpaes-x86.pl +0 -841
  38. data/vendor/ring/crypto/aes/asm/vpaes-x86_64.pl +0 -1116
  39. data/vendor/ring/crypto/aes/internal.h +0 -87
  40. data/vendor/ring/crypto/aes/mode_wrappers.c +0 -61
  41. data/vendor/ring/crypto/bn/add.c +0 -394
  42. data/vendor/ring/crypto/bn/asm/armv4-mont.pl +0 -694
  43. data/vendor/ring/crypto/bn/asm/armv8-mont.pl +0 -1503
  44. data/vendor/ring/crypto/bn/asm/bn-586.pl +0 -774
  45. data/vendor/ring/crypto/bn/asm/co-586.pl +0 -287
  46. data/vendor/ring/crypto/bn/asm/rsaz-avx2.pl +0 -1882
  47. data/vendor/ring/crypto/bn/asm/x86-mont.pl +0 -592
  48. data/vendor/ring/crypto/bn/asm/x86_64-gcc.c +0 -599
  49. data/vendor/ring/crypto/bn/asm/x86_64-mont.pl +0 -1393
  50. data/vendor/ring/crypto/bn/asm/x86_64-mont5.pl +0 -3507
  51. data/vendor/ring/crypto/bn/bn.c +0 -352
  52. data/vendor/ring/crypto/bn/bn_asn1.c +0 -74
  53. data/vendor/ring/crypto/bn/bn_test.Windows.vcxproj +0 -25
  54. data/vendor/ring/crypto/bn/bn_test.cc +0 -1696
  55. data/vendor/ring/crypto/bn/cmp.c +0 -200
  56. data/vendor/ring/crypto/bn/convert.c +0 -433
  57. data/vendor/ring/crypto/bn/ctx.c +0 -311
  58. data/vendor/ring/crypto/bn/div.c +0 -594
  59. data/vendor/ring/crypto/bn/exponentiation.c +0 -1335
  60. data/vendor/ring/crypto/bn/gcd.c +0 -711
  61. data/vendor/ring/crypto/bn/generic.c +0 -1019
  62. data/vendor/ring/crypto/bn/internal.h +0 -316
  63. data/vendor/ring/crypto/bn/montgomery.c +0 -516
  64. data/vendor/ring/crypto/bn/mul.c +0 -888
  65. data/vendor/ring/crypto/bn/prime.c +0 -829
  66. data/vendor/ring/crypto/bn/random.c +0 -334
  67. data/vendor/ring/crypto/bn/rsaz_exp.c +0 -262
  68. data/vendor/ring/crypto/bn/rsaz_exp.h +0 -53
  69. data/vendor/ring/crypto/bn/shift.c +0 -276
  70. data/vendor/ring/crypto/bytestring/bytestring_test.Windows.vcxproj +0 -25
  71. data/vendor/ring/crypto/bytestring/bytestring_test.cc +0 -421
  72. data/vendor/ring/crypto/bytestring/cbb.c +0 -399
  73. data/vendor/ring/crypto/bytestring/cbs.c +0 -227
  74. data/vendor/ring/crypto/bytestring/internal.h +0 -46
  75. data/vendor/ring/crypto/chacha/chacha_generic.c +0 -140
  76. data/vendor/ring/crypto/chacha/chacha_vec.c +0 -323
  77. data/vendor/ring/crypto/chacha/chacha_vec_arm.S +0 -1447
  78. data/vendor/ring/crypto/chacha/chacha_vec_arm_generate.go +0 -153
  79. data/vendor/ring/crypto/cipher/cipher_test.Windows.vcxproj +0 -25
  80. data/vendor/ring/crypto/cipher/e_aes.c +0 -390
  81. data/vendor/ring/crypto/cipher/e_chacha20poly1305.c +0 -208
  82. data/vendor/ring/crypto/cipher/internal.h +0 -173
  83. data/vendor/ring/crypto/cipher/test/aes_128_gcm_tests.txt +0 -543
  84. data/vendor/ring/crypto/cipher/test/aes_128_key_wrap_tests.txt +0 -9
  85. data/vendor/ring/crypto/cipher/test/aes_256_gcm_tests.txt +0 -475
  86. data/vendor/ring/crypto/cipher/test/aes_256_key_wrap_tests.txt +0 -23
  87. data/vendor/ring/crypto/cipher/test/chacha20_poly1305_old_tests.txt +0 -422
  88. data/vendor/ring/crypto/cipher/test/chacha20_poly1305_tests.txt +0 -484
  89. data/vendor/ring/crypto/cipher/test/cipher_test.txt +0 -100
  90. data/vendor/ring/crypto/constant_time_test.Windows.vcxproj +0 -25
  91. data/vendor/ring/crypto/constant_time_test.c +0 -304
  92. data/vendor/ring/crypto/cpu-arm-asm.S +0 -32
  93. data/vendor/ring/crypto/cpu-arm.c +0 -199
  94. data/vendor/ring/crypto/cpu-intel.c +0 -261
  95. data/vendor/ring/crypto/crypto.c +0 -151
  96. data/vendor/ring/crypto/curve25519/asm/x25519-arm.S +0 -2118
  97. data/vendor/ring/crypto/curve25519/curve25519.c +0 -4888
  98. data/vendor/ring/crypto/curve25519/x25519_test.cc +0 -128
  99. data/vendor/ring/crypto/digest/md32_common.h +0 -181
  100. data/vendor/ring/crypto/ec/asm/p256-x86_64-asm.pl +0 -2725
  101. data/vendor/ring/crypto/ec/ec.c +0 -193
  102. data/vendor/ring/crypto/ec/ec_curves.c +0 -61
  103. data/vendor/ring/crypto/ec/ec_key.c +0 -228
  104. data/vendor/ring/crypto/ec/ec_montgomery.c +0 -114
  105. data/vendor/ring/crypto/ec/example_mul.Windows.vcxproj +0 -25
  106. data/vendor/ring/crypto/ec/internal.h +0 -243
  107. data/vendor/ring/crypto/ec/oct.c +0 -253
  108. data/vendor/ring/crypto/ec/p256-64.c +0 -1794
  109. data/vendor/ring/crypto/ec/p256-x86_64-table.h +0 -9548
  110. data/vendor/ring/crypto/ec/p256-x86_64.c +0 -509
  111. data/vendor/ring/crypto/ec/simple.c +0 -1007
  112. data/vendor/ring/crypto/ec/util-64.c +0 -183
  113. data/vendor/ring/crypto/ec/wnaf.c +0 -508
  114. data/vendor/ring/crypto/ecdh/ecdh.c +0 -155
  115. data/vendor/ring/crypto/ecdsa/ecdsa.c +0 -304
  116. data/vendor/ring/crypto/ecdsa/ecdsa_asn1.c +0 -193
  117. data/vendor/ring/crypto/ecdsa/ecdsa_test.Windows.vcxproj +0 -25
  118. data/vendor/ring/crypto/ecdsa/ecdsa_test.cc +0 -327
  119. data/vendor/ring/crypto/header_removed.h +0 -17
  120. data/vendor/ring/crypto/internal.h +0 -495
  121. data/vendor/ring/crypto/libring.Windows.vcxproj +0 -101
  122. data/vendor/ring/crypto/mem.c +0 -98
  123. data/vendor/ring/crypto/modes/asm/aesni-gcm-x86_64.pl +0 -1045
  124. data/vendor/ring/crypto/modes/asm/ghash-armv4.pl +0 -517
  125. data/vendor/ring/crypto/modes/asm/ghash-x86.pl +0 -1393
  126. data/vendor/ring/crypto/modes/asm/ghash-x86_64.pl +0 -1741
  127. data/vendor/ring/crypto/modes/asm/ghashv8-armx.pl +0 -422
  128. data/vendor/ring/crypto/modes/ctr.c +0 -226
  129. data/vendor/ring/crypto/modes/gcm.c +0 -1206
  130. data/vendor/ring/crypto/modes/gcm_test.Windows.vcxproj +0 -25
  131. data/vendor/ring/crypto/modes/gcm_test.c +0 -348
  132. data/vendor/ring/crypto/modes/internal.h +0 -299
  133. data/vendor/ring/crypto/perlasm/arm-xlate.pl +0 -170
  134. data/vendor/ring/crypto/perlasm/readme +0 -100
  135. data/vendor/ring/crypto/perlasm/x86_64-xlate.pl +0 -1164
  136. data/vendor/ring/crypto/perlasm/x86asm.pl +0 -292
  137. data/vendor/ring/crypto/perlasm/x86gas.pl +0 -263
  138. data/vendor/ring/crypto/perlasm/x86masm.pl +0 -200
  139. data/vendor/ring/crypto/perlasm/x86nasm.pl +0 -187
  140. data/vendor/ring/crypto/poly1305/poly1305.c +0 -331
  141. data/vendor/ring/crypto/poly1305/poly1305_arm.c +0 -301
  142. data/vendor/ring/crypto/poly1305/poly1305_arm_asm.S +0 -2015
  143. data/vendor/ring/crypto/poly1305/poly1305_test.Windows.vcxproj +0 -25
  144. data/vendor/ring/crypto/poly1305/poly1305_test.cc +0 -80
  145. data/vendor/ring/crypto/poly1305/poly1305_test.txt +0 -52
  146. data/vendor/ring/crypto/poly1305/poly1305_vec.c +0 -892
  147. data/vendor/ring/crypto/rand/asm/rdrand-x86_64.pl +0 -75
  148. data/vendor/ring/crypto/rand/internal.h +0 -32
  149. data/vendor/ring/crypto/rand/rand.c +0 -189
  150. data/vendor/ring/crypto/rand/urandom.c +0 -219
  151. data/vendor/ring/crypto/rand/windows.c +0 -56
  152. data/vendor/ring/crypto/refcount_c11.c +0 -66
  153. data/vendor/ring/crypto/refcount_lock.c +0 -53
  154. data/vendor/ring/crypto/refcount_test.Windows.vcxproj +0 -25
  155. data/vendor/ring/crypto/refcount_test.c +0 -58
  156. data/vendor/ring/crypto/rsa/blinding.c +0 -462
  157. data/vendor/ring/crypto/rsa/internal.h +0 -108
  158. data/vendor/ring/crypto/rsa/padding.c +0 -300
  159. data/vendor/ring/crypto/rsa/rsa.c +0 -450
  160. data/vendor/ring/crypto/rsa/rsa_asn1.c +0 -261
  161. data/vendor/ring/crypto/rsa/rsa_impl.c +0 -944
  162. data/vendor/ring/crypto/rsa/rsa_test.Windows.vcxproj +0 -25
  163. data/vendor/ring/crypto/rsa/rsa_test.cc +0 -437
  164. data/vendor/ring/crypto/sha/asm/sha-armv8.pl +0 -436
  165. data/vendor/ring/crypto/sha/asm/sha-x86_64.pl +0 -2390
  166. data/vendor/ring/crypto/sha/asm/sha256-586.pl +0 -1275
  167. data/vendor/ring/crypto/sha/asm/sha256-armv4.pl +0 -735
  168. data/vendor/ring/crypto/sha/asm/sha256-armv8.pl +0 -14
  169. data/vendor/ring/crypto/sha/asm/sha256-x86_64.pl +0 -14
  170. data/vendor/ring/crypto/sha/asm/sha512-586.pl +0 -911
  171. data/vendor/ring/crypto/sha/asm/sha512-armv4.pl +0 -666
  172. data/vendor/ring/crypto/sha/asm/sha512-armv8.pl +0 -14
  173. data/vendor/ring/crypto/sha/asm/sha512-x86_64.pl +0 -14
  174. data/vendor/ring/crypto/sha/sha1.c +0 -271
  175. data/vendor/ring/crypto/sha/sha256.c +0 -204
  176. data/vendor/ring/crypto/sha/sha512.c +0 -355
  177. data/vendor/ring/crypto/test/file_test.cc +0 -326
  178. data/vendor/ring/crypto/test/file_test.h +0 -181
  179. data/vendor/ring/crypto/test/malloc.cc +0 -150
  180. data/vendor/ring/crypto/test/scoped_types.h +0 -95
  181. data/vendor/ring/crypto/test/test.Windows.vcxproj +0 -35
  182. data/vendor/ring/crypto/test/test_util.cc +0 -46
  183. data/vendor/ring/crypto/test/test_util.h +0 -41
  184. data/vendor/ring/crypto/thread_none.c +0 -55
  185. data/vendor/ring/crypto/thread_pthread.c +0 -165
  186. data/vendor/ring/crypto/thread_test.Windows.vcxproj +0 -25
  187. data/vendor/ring/crypto/thread_test.c +0 -200
  188. data/vendor/ring/crypto/thread_win.c +0 -282
  189. data/vendor/ring/examples/checkdigest.rs +0 -103
  190. data/vendor/ring/include/openssl/aes.h +0 -121
  191. data/vendor/ring/include/openssl/arm_arch.h +0 -129
  192. data/vendor/ring/include/openssl/base.h +0 -156
  193. data/vendor/ring/include/openssl/bn.h +0 -794
  194. data/vendor/ring/include/openssl/buffer.h +0 -18
  195. data/vendor/ring/include/openssl/bytestring.h +0 -235
  196. data/vendor/ring/include/openssl/chacha.h +0 -37
  197. data/vendor/ring/include/openssl/cmac.h +0 -76
  198. data/vendor/ring/include/openssl/cpu.h +0 -184
  199. data/vendor/ring/include/openssl/crypto.h +0 -43
  200. data/vendor/ring/include/openssl/curve25519.h +0 -88
  201. data/vendor/ring/include/openssl/ec.h +0 -225
  202. data/vendor/ring/include/openssl/ec_key.h +0 -129
  203. data/vendor/ring/include/openssl/ecdh.h +0 -110
  204. data/vendor/ring/include/openssl/ecdsa.h +0 -156
  205. data/vendor/ring/include/openssl/err.h +0 -201
  206. data/vendor/ring/include/openssl/mem.h +0 -101
  207. data/vendor/ring/include/openssl/obj_mac.h +0 -71
  208. data/vendor/ring/include/openssl/opensslfeatures.h +0 -68
  209. data/vendor/ring/include/openssl/opensslv.h +0 -18
  210. data/vendor/ring/include/openssl/ossl_typ.h +0 -18
  211. data/vendor/ring/include/openssl/poly1305.h +0 -51
  212. data/vendor/ring/include/openssl/rand.h +0 -70
  213. data/vendor/ring/include/openssl/rsa.h +0 -399
  214. data/vendor/ring/include/openssl/thread.h +0 -133
  215. data/vendor/ring/include/openssl/type_check.h +0 -71
  216. data/vendor/ring/mk/Common.props +0 -63
  217. data/vendor/ring/mk/Windows.props +0 -42
  218. data/vendor/ring/mk/WindowsTest.props +0 -18
  219. data/vendor/ring/mk/appveyor.bat +0 -62
  220. data/vendor/ring/mk/bottom_of_makefile.mk +0 -54
  221. data/vendor/ring/mk/ring.mk +0 -266
  222. data/vendor/ring/mk/top_of_makefile.mk +0 -214
  223. data/vendor/ring/mk/travis.sh +0 -40
  224. data/vendor/ring/mk/update-travis-yml.py +0 -229
  225. data/vendor/ring/ring.sln +0 -153
  226. data/vendor/ring/src/aead.rs +0 -682
  227. data/vendor/ring/src/agreement.rs +0 -248
  228. data/vendor/ring/src/c.rs +0 -129
  229. data/vendor/ring/src/constant_time.rs +0 -37
  230. data/vendor/ring/src/der.rs +0 -96
  231. data/vendor/ring/src/digest.rs +0 -690
  232. data/vendor/ring/src/digest_tests.txt +0 -57
  233. data/vendor/ring/src/ecc.rs +0 -28
  234. data/vendor/ring/src/ecc_build.rs +0 -279
  235. data/vendor/ring/src/ecc_curves.rs +0 -117
  236. data/vendor/ring/src/ed25519_tests.txt +0 -2579
  237. data/vendor/ring/src/exe_tests.rs +0 -46
  238. data/vendor/ring/src/ffi.rs +0 -29
  239. data/vendor/ring/src/file_test.rs +0 -187
  240. data/vendor/ring/src/hkdf.rs +0 -153
  241. data/vendor/ring/src/hkdf_tests.txt +0 -59
  242. data/vendor/ring/src/hmac.rs +0 -414
  243. data/vendor/ring/src/hmac_tests.txt +0 -97
  244. data/vendor/ring/src/input.rs +0 -312
  245. data/vendor/ring/src/lib.rs +0 -41
  246. data/vendor/ring/src/pbkdf2.rs +0 -265
  247. data/vendor/ring/src/pbkdf2_tests.txt +0 -113
  248. data/vendor/ring/src/polyfill.rs +0 -57
  249. data/vendor/ring/src/rand.rs +0 -28
  250. data/vendor/ring/src/signature.rs +0 -314
  251. data/vendor/ring/third-party/NIST/README.md +0 -9
  252. data/vendor/ring/third-party/NIST/SHAVS/SHA1LongMsg.rsp +0 -263
  253. data/vendor/ring/third-party/NIST/SHAVS/SHA1Monte.rsp +0 -309
  254. data/vendor/ring/third-party/NIST/SHAVS/SHA1ShortMsg.rsp +0 -267
  255. data/vendor/ring/third-party/NIST/SHAVS/SHA224LongMsg.rsp +0 -263
  256. data/vendor/ring/third-party/NIST/SHAVS/SHA224Monte.rsp +0 -309
  257. data/vendor/ring/third-party/NIST/SHAVS/SHA224ShortMsg.rsp +0 -267
  258. data/vendor/ring/third-party/NIST/SHAVS/SHA256LongMsg.rsp +0 -263
  259. data/vendor/ring/third-party/NIST/SHAVS/SHA256Monte.rsp +0 -309
  260. data/vendor/ring/third-party/NIST/SHAVS/SHA256ShortMsg.rsp +0 -267
  261. data/vendor/ring/third-party/NIST/SHAVS/SHA384LongMsg.rsp +0 -519
  262. data/vendor/ring/third-party/NIST/SHAVS/SHA384Monte.rsp +0 -309
  263. data/vendor/ring/third-party/NIST/SHAVS/SHA384ShortMsg.rsp +0 -523
  264. data/vendor/ring/third-party/NIST/SHAVS/SHA512LongMsg.rsp +0 -519
  265. data/vendor/ring/third-party/NIST/SHAVS/SHA512Monte.rsp +0 -309
  266. data/vendor/ring/third-party/NIST/SHAVS/SHA512ShortMsg.rsp +0 -523
  267. data/vendor/ring/third-party/NIST/sha256sums.txt +0 -1
@@ -1,193 +0,0 @@
1
- /* ====================================================================
2
- * Copyright (c) 1998-2005 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
- #include <openssl/ecdsa.h>
54
-
55
- #include <limits.h>
56
- #include <string.h>
57
-
58
- #include <openssl/bn.h>
59
- #include <openssl/bytestring.h>
60
- #include <openssl/err.h>
61
- #include <openssl/ec_key.h>
62
- #include <openssl/mem.h>
63
-
64
- #include "../ec/internal.h"
65
-
66
-
67
- size_t ECDSA_size(const EC_KEY *key) {
68
- if (key == NULL) {
69
- return 0;
70
- }
71
-
72
- const EC_GROUP *group = EC_KEY_get0_group(key);
73
- if (group == NULL) {
74
- return 0;
75
- }
76
-
77
- size_t group_order_size = BN_num_bytes(&group->order);
78
-
79
- return ECDSA_SIG_max_len(group_order_size);
80
- }
81
-
82
- ECDSA_SIG *ECDSA_SIG_new(void) {
83
- ECDSA_SIG *sig = OPENSSL_malloc(sizeof(ECDSA_SIG));
84
- if (sig == NULL) {
85
- return NULL;
86
- }
87
- sig->r = BN_new();
88
- sig->s = BN_new();
89
- if (sig->r == NULL || sig->s == NULL) {
90
- ECDSA_SIG_free(sig);
91
- return NULL;
92
- }
93
- return sig;
94
- }
95
-
96
- void ECDSA_SIG_free(ECDSA_SIG *sig) {
97
- if (sig == NULL) {
98
- return;
99
- }
100
-
101
- BN_free(sig->r);
102
- BN_free(sig->s);
103
- OPENSSL_free(sig);
104
- }
105
-
106
- ECDSA_SIG *ECDSA_SIG_parse(CBS *cbs) {
107
- ECDSA_SIG *ret = ECDSA_SIG_new();
108
- if (ret == NULL) {
109
- return NULL;
110
- }
111
- CBS child;
112
- if (!CBS_get_asn1(cbs, &child, CBS_ASN1_SEQUENCE) ||
113
- !BN_cbs2unsigned(&child, ret->r) ||
114
- !BN_cbs2unsigned(&child, ret->s) ||
115
- CBS_len(&child) != 0) {
116
- OPENSSL_PUT_ERROR(ECDSA, ECDSA_R_BAD_SIGNATURE);
117
- ECDSA_SIG_free(ret);
118
- return NULL;
119
- }
120
- return ret;
121
- }
122
-
123
- ECDSA_SIG *ECDSA_SIG_from_bytes(const uint8_t *in, size_t in_len) {
124
- CBS cbs;
125
- CBS_init(&cbs, in, in_len);
126
- ECDSA_SIG *ret = ECDSA_SIG_parse(&cbs);
127
- if (ret == NULL || CBS_len(&cbs) != 0) {
128
- OPENSSL_PUT_ERROR(ECDSA, ECDSA_R_BAD_SIGNATURE);
129
- ECDSA_SIG_free(ret);
130
- return NULL;
131
- }
132
- return ret;
133
- }
134
-
135
- int ECDSA_SIG_marshal(CBB *cbb, const ECDSA_SIG *sig) {
136
- CBB child;
137
- if (!CBB_add_asn1(cbb, &child, CBS_ASN1_SEQUENCE) ||
138
- !BN_bn2cbb(&child, sig->r) ||
139
- !BN_bn2cbb(&child, sig->s) ||
140
- !CBB_flush(cbb)) {
141
- OPENSSL_PUT_ERROR(ECDSA, ECDSA_R_ENCODE_ERROR);
142
- return 0;
143
- }
144
- return 1;
145
- }
146
-
147
- int ECDSA_SIG_to_bytes(uint8_t **out_bytes, size_t *out_len,
148
- const ECDSA_SIG *sig) {
149
- CBB cbb;
150
- CBB_zero(&cbb);
151
- if (!CBB_init(&cbb, 0) ||
152
- !ECDSA_SIG_marshal(&cbb, sig) ||
153
- !CBB_finish(&cbb, out_bytes, out_len)) {
154
- OPENSSL_PUT_ERROR(ECDSA, ECDSA_R_ENCODE_ERROR);
155
- CBB_cleanup(&cbb);
156
- return 0;
157
- }
158
- return 1;
159
- }
160
-
161
- /* der_len_len returns the number of bytes needed to represent a length of |len|
162
- * in DER. */
163
- static size_t der_len_len(size_t len) {
164
- if (len < 0x80) {
165
- return 1;
166
- }
167
- size_t ret = 1;
168
- while (len > 0) {
169
- ret++;
170
- len >>= 8;
171
- }
172
- return ret;
173
- }
174
-
175
- size_t ECDSA_SIG_max_len(size_t order_len) {
176
- /* Compute the maximum length of an |order_len| byte integer. Defensively
177
- * assume that the leading 0x00 is included. */
178
- size_t integer_len = 1 /* tag */ + der_len_len(order_len + 1) + 1 + order_len;
179
- if (integer_len < order_len) {
180
- return 0;
181
- }
182
- /* An ECDSA signature is two INTEGERs. */
183
- size_t value_len = 2 * integer_len;
184
- if (value_len < integer_len) {
185
- return 0;
186
- }
187
- /* Add the header. */
188
- size_t ret = 1 /* tag */ + der_len_len(value_len) + value_len;
189
- if (ret < value_len) {
190
- return 0;
191
- }
192
- return ret;
193
- }
@@ -1,25 +0,0 @@
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>{8ECBC55D-D42D-40AA-9ACF-EDE67739EE20}</ProjectGuid>
5
- <TargetName>ecdsa_test</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\ecdsa\</OutDir>
12
- </PropertyGroup>
13
- <ItemGroup>
14
- <ClCompile Include="ecdsa_test.cc" />
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>
@@ -1,327 +0,0 @@
1
- /* ====================================================================
2
- * Copyright (c) 1998-2005 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
- #include <openssl/ecdsa.h>
54
-
55
- #include <vector>
56
-
57
- #include <openssl/bn.h>
58
- #include <openssl/crypto.h>
59
- #include <openssl/ec.h>
60
- #include <openssl/err.h>
61
- #include <openssl/mem.h>
62
- #include <openssl/obj_mac.h>
63
- #include <openssl/rand.h>
64
-
65
- #include "../test/scoped_types.h"
66
-
67
- static bool point2oct(ScopedOpenSSLBytes *out, size_t *out_len,
68
- const EC_GROUP *group, const EC_POINT *point) {
69
- size_t der_len = EC_POINT_point2oct(group, point,
70
- POINT_CONVERSION_UNCOMPRESSED, NULL, 0,
71
- NULL);
72
- if (der_len <= 0) {
73
- return false;
74
- }
75
- out->reset((uint8_t *)OPENSSL_malloc(der_len));
76
- if (!out) {
77
- return false;
78
- }
79
- der_len = EC_POINT_point2oct(group, point, POINT_CONVERSION_UNCOMPRESSED,
80
- out->get(), der_len, NULL);
81
- if (der_len <= 0) {
82
- return false;
83
- }
84
- *out_len = der_len;
85
- return true;
86
- }
87
-
88
- // VerifyECDSASig returns true on success, false on failure.
89
- static bool VerifyECDSASig(int digest_nid, const uint8_t *digest,
90
- size_t digest_len, const ECDSA_SIG *ecdsa_sig,
91
- const EC_GROUP *group, const EC_POINT *pub_key,
92
- int expected_result) {
93
- int actual_result;
94
-
95
- uint8_t *sig_der;
96
- size_t sig_der_len;
97
- if (!ECDSA_SIG_to_bytes(&sig_der, &sig_der_len, ecdsa_sig)) {
98
- return false;
99
- }
100
- ScopedOpenSSLBytes delete_sig_der(sig_der);
101
- ScopedOpenSSLBytes key_der(nullptr);
102
- size_t key_der_len;
103
- if (!point2oct(&key_der, &key_der_len, group, pub_key)) {
104
- return false;
105
- }
106
- actual_result = ECDSA_verify_signed_digest(group, digest_nid, digest,
107
- digest_len, sig_der, sig_der_len,
108
- key_der.get(), key_der_len);
109
- return expected_result == actual_result;
110
- }
111
-
112
- // TestTamperedSig verifies that signature verification fails when a valid
113
- // signature is tampered with. |ecdsa_sig| must be a valid signature, which will
114
- // be modified. TestTamperedSig returns true on success, false on failure.
115
- static bool TestTamperedSig(FILE *out, int digest_nid, const uint8_t *digest,
116
- size_t digest_len, ECDSA_SIG *ecdsa_sig,
117
- const EC_GROUP *group, const EC_POINT *pub_key,
118
- const BIGNUM *order) {
119
- // Modify a single byte of the signature: to ensure we don't
120
- // garble the ASN1 structure, we read the raw signature and
121
- // modify a byte in one of the bignums directly.
122
-
123
- // Store the two BIGNUMs in raw_buf.
124
- size_t r_len = BN_num_bytes(ecdsa_sig->r);
125
- size_t s_len = BN_num_bytes(ecdsa_sig->s);
126
- size_t bn_len = BN_num_bytes(order);
127
- if (r_len > bn_len || s_len > bn_len) {
128
- return false;
129
- }
130
- size_t buf_len = 2 * bn_len;
131
- std::vector<uint8_t> raw_buf(buf_len);
132
- // Pad the bignums with leading zeroes.
133
- if (!BN_bn2bin_padded(raw_buf.data(), bn_len, ecdsa_sig->r) ||
134
- !BN_bn2bin_padded(raw_buf.data() + bn_len, bn_len, ecdsa_sig->s)) {
135
- return false;
136
- }
137
-
138
- // Modify a single byte in the buffer.
139
- size_t offset = raw_buf[10] % buf_len;
140
- uint8_t dirt = raw_buf[11] ? raw_buf[11] : 1;
141
- raw_buf[offset] ^= dirt;
142
- // Now read the BIGNUMs back in from raw_buf.
143
- if (BN_bin2bn(raw_buf.data(), bn_len, ecdsa_sig->r) == NULL ||
144
- BN_bin2bn(raw_buf.data() + bn_len, bn_len, ecdsa_sig->s) == NULL ||
145
- !VerifyECDSASig(digest_nid, digest, digest_len, ecdsa_sig, group,
146
- pub_key, 0)) {
147
- return false;
148
- }
149
-
150
- // Sanity check: Undo the modification and verify signature.
151
- raw_buf[offset] ^= dirt;
152
- if (BN_bin2bn(raw_buf.data(), bn_len, ecdsa_sig->r) == NULL ||
153
- BN_bin2bn(raw_buf.data() + bn_len, bn_len, ecdsa_sig->s) == NULL ||
154
- !VerifyECDSASig(digest_nid, digest, digest_len, ecdsa_sig, group,
155
- pub_key, 1)) {
156
- return false;
157
- }
158
-
159
- return true;
160
- }
161
-
162
- static bool TestBuiltin(FILE *out) {
163
- // Fill digest values with some random data.
164
- uint8_t digest[20], wrong_digest[20];
165
- if (!RAND_bytes(digest, 20) || !RAND_bytes(wrong_digest, 20)) {
166
- fprintf(out, "ERROR: unable to get random data\n");
167
- return false;
168
- }
169
-
170
- static const struct {
171
- EC_GROUP_fn ec_group_fn;
172
- const char *name;
173
- } kCurves[] = {
174
- { EC_GROUP_P224, "secp224r1" },
175
- { EC_GROUP_P256, "secp256r1" },
176
- { EC_GROUP_P384, "secp384r1" },
177
- { EC_GROUP_P521, "secp521r1" },
178
- { NID_undef, NULL }
179
- };
180
-
181
- // Create and verify ECDSA signatures with every available curve.
182
-
183
- for (size_t n = 0; kCurves[n].ec_group_fn != NULL; n++) {
184
- const EC_GROUP *group = kCurves[n].ec_group_fn();
185
- const BIGNUM *order = EC_GROUP_get0_order(group);
186
-
187
- // Create a new ECDSA key.
188
- ScopedEC_KEY eckey(EC_KEY_generate_key_ex(group));
189
- if (!eckey) {
190
- fprintf(out, "EC_KEY_generate_key_ex failed for %s\n", kCurves[n].name);
191
- return false;
192
- }
193
-
194
- if (EC_KEY_get0_group(eckey.get()) != group) {
195
- fprintf(out, "EC_KEY_get0_group failed for %s\n", kCurves[n].name);
196
- return false;
197
- }
198
-
199
- // Create a second key.
200
- ScopedEC_KEY wrong_eckey(EC_KEY_generate_key_ex(group));
201
- if (!wrong_eckey) {
202
- fprintf(out, "EC_KEY_generate_key_ex failed for %s\n", kCurves[n].name);
203
- return false;
204
- }
205
-
206
- // Check the key.
207
- if (!EC_KEY_check_key(eckey.get())) {
208
- fprintf(out, "EC_KEY_check_key failed for %s\n", kCurves[n].name);
209
- return false;
210
- }
211
-
212
- ScopedOpenSSLBytes eckey_der(nullptr);
213
- size_t eckey_der_len;
214
- if (!point2oct(&eckey_der, &eckey_der_len, group,
215
- EC_KEY_get0_public_key(eckey.get()))) {
216
- fprintf(out, "Point-to-Oct (right key) failed for %s\n", kCurves[n].name);
217
- return false;
218
- }
219
-
220
- ScopedOpenSSLBytes wrong_eckey_der(nullptr);
221
- size_t wrong_eckey_der_len;
222
- if (!point2oct(&wrong_eckey_der, &wrong_eckey_der_len, group,
223
- EC_KEY_get0_public_key(wrong_eckey.get()))) {
224
- fprintf(out, "Point-to-Oct (wrong key) failed for %s\n", kCurves[n].name);
225
- return false;
226
- }
227
-
228
-
229
- // Test ASN.1-encoded signatures.
230
- // Create a signature.
231
- unsigned sig_len = ECDSA_size(eckey.get());
232
- std::vector<uint8_t> signature(sig_len);
233
- if (!ECDSA_sign(0, digest, 20, signature.data(), &sig_len, eckey.get())) {
234
- fprintf(out, "ECDSA_sign failed for %s\n", kCurves[n].name);
235
- return false;
236
- }
237
- signature.resize(sig_len);
238
- // Verify the signature.
239
- if (!ECDSA_verify_signed_digest(group, NID_sha1, digest, 20,
240
- signature.data(), signature.size(),
241
- eckey_der.get(), eckey_der_len)) {
242
- fprintf(out, "ECDSA_verify_signed_digest (right key) failed for %s\n",
243
- kCurves[n].name);
244
- return false;
245
- }
246
- // Verify the signature with the wrong key.
247
- if (ECDSA_verify_signed_digest(group, NID_sha1, digest, 20,
248
- signature.data(), signature.size(),
249
- wrong_eckey_der.get(), wrong_eckey_der_len)) {
250
- fprintf(out, "ECDSA_verify_signed_digest (wrong key) failed for %s\n",
251
- kCurves[n].name);
252
- return false;
253
- }
254
- // Verify the signature using the wrong digest.
255
- if (ECDSA_verify_signed_digest(group, NID_sha1, wrong_digest, 20,
256
- signature.data(), signature.size(),
257
- eckey_der.get(), eckey_der_len)) {
258
- fprintf(out, "ECDSA_verify_signed_digest (wrong digest) failed for %s\n",
259
- kCurves[n].name);
260
- return false;
261
- }
262
- // Verify a truncated signature.
263
- if (ECDSA_verify_signed_digest(group, NID_sha1, digest, 20,
264
- signature.data(), signature.size() - 1,
265
- eckey_der.get(), eckey_der_len)) {
266
- fprintf(out, "ECDSA_verify_signed_digest (truncated sig) failed for %s\n",
267
- kCurves[n].name);
268
- return false;
269
- }
270
- // Verify a tampered signature.
271
- ScopedECDSA_SIG ecdsa_sig(ECDSA_SIG_from_bytes(signature.data(),
272
- signature.size()));
273
- if (!ecdsa_sig ||
274
- !TestTamperedSig(out, NID_sha1, digest, 20, ecdsa_sig.get(), group,
275
- EC_KEY_get0_public_key(eckey.get()), order)) {
276
- fprintf(out, "TestTamperedSig failed for %s\n", kCurves[n].name);
277
- return false;
278
- }
279
- }
280
-
281
- return true;
282
- }
283
-
284
- static bool TestECDSA_SIG_max_len(size_t order_len) {
285
- /* Create the largest possible |ECDSA_SIG| of the given constraints. */
286
- ScopedECDSA_SIG sig(ECDSA_SIG_new());
287
- if (!sig) {
288
- return false;
289
- }
290
- std::vector<uint8_t> bytes(order_len, 0xff);
291
- if (!BN_bin2bn(bytes.data(), bytes.size(), sig->r) ||
292
- !BN_bin2bn(bytes.data(), bytes.size(), sig->s)) {
293
- return false;
294
- }
295
- /* Serialize it. */
296
- uint8_t *der;
297
- size_t der_len;
298
- if (!ECDSA_SIG_to_bytes(&der, &der_len, sig.get())) {
299
- return false;
300
- }
301
- ScopedOpenSSLBytes delete_der(der);
302
-
303
- size_t max_len = ECDSA_SIG_max_len(order_len);
304
- if (max_len != der_len) {
305
- fprintf(stderr, "ECDSA_SIG_max_len(%u) returned %u, wanted %u\n",
306
- static_cast<unsigned>(order_len), static_cast<unsigned>(max_len),
307
- static_cast<unsigned>(der_len));
308
- return false;
309
- }
310
- return true;
311
- }
312
-
313
- int main(void) {
314
- CRYPTO_library_init();
315
-
316
- if (!TestBuiltin(stdout) ||
317
- !TestECDSA_SIG_max_len(224/8) ||
318
- !TestECDSA_SIG_max_len(256/8) ||
319
- !TestECDSA_SIG_max_len(384/8) ||
320
- !TestECDSA_SIG_max_len(512/8) ||
321
- !TestECDSA_SIG_max_len(10000)) {
322
- printf("\nECDSA test failed\n");
323
- return 1;
324
- }
325
-
326
- return 0;
327
- }