Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

873 Zeilen
28 KiB

  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. #include <openssl/ec.h>
  68. #include <openssl/bn.h>
  69. #include <openssl/err.h>
  70. #include <openssl/mem.h>
  71. #include <openssl/obj.h>
  72. #include "internal.h"
  73. /* curve_data contains data about a built-in elliptic curve. */
  74. struct curve_data {
  75. /* comment is a human-readable string describing the curve. */
  76. const char *comment;
  77. /* param_len is the number of bytes needed to store a field element. */
  78. uint8_t param_len;
  79. /* cofactor is the cofactor of the group (i.e. the number of elements in the
  80. * group divided by the size of the main subgroup. */
  81. uint8_t cofactor; /* promoted to BN_ULONG */
  82. /* data points to an array of 6*|param_len| bytes which hold the field
  83. * elements of the following (in big-endian order): prime, a, b, generator x,
  84. * generator y, order. */
  85. const uint8_t data[];
  86. };
  87. static const struct curve_data P224 = {
  88. "NIST P-224",
  89. 28,
  90. 1,
  91. {/* p */
  92. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  93. 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  94. 0x00, 0x00, 0x00, 0x01,
  95. /* a */
  96. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  97. 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  98. 0xFF, 0xFF, 0xFF, 0xFE,
  99. /* b */
  100. 0xB4, 0x05, 0x0A, 0x85, 0x0C, 0x04, 0xB3, 0xAB, 0xF5, 0x41, 0x32, 0x56,
  101. 0x50, 0x44, 0xB0, 0xB7, 0xD7, 0xBF, 0xD8, 0xBA, 0x27, 0x0B, 0x39, 0x43,
  102. 0x23, 0x55, 0xFF, 0xB4,
  103. /* x */
  104. 0xB7, 0x0E, 0x0C, 0xBD, 0x6B, 0xB4, 0xBF, 0x7F, 0x32, 0x13, 0x90, 0xB9,
  105. 0x4A, 0x03, 0xC1, 0xD3, 0x56, 0xC2, 0x11, 0x22, 0x34, 0x32, 0x80, 0xD6,
  106. 0x11, 0x5C, 0x1D, 0x21,
  107. /* y */
  108. 0xbd, 0x37, 0x63, 0x88, 0xb5, 0xf7, 0x23, 0xfb, 0x4c, 0x22, 0xdf, 0xe6,
  109. 0xcd, 0x43, 0x75, 0xa0, 0x5a, 0x07, 0x47, 0x64, 0x44, 0xd5, 0x81, 0x99,
  110. 0x85, 0x00, 0x7e, 0x34,
  111. /* order */
  112. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  113. 0xFF, 0xFF, 0x16, 0xA2, 0xE0, 0xB8, 0xF0, 0x3E, 0x13, 0xDD, 0x29, 0x45,
  114. 0x5C, 0x5C, 0x2A, 0x3D,
  115. }};
  116. static const struct curve_data P256 = {
  117. "NIST P-256",
  118. 32,
  119. 1,
  120. {/* p */
  121. 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
  122. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
  123. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  124. /* a */
  125. 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
  126. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
  127. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
  128. /* b */
  129. 0x5A, 0xC6, 0x35, 0xD8, 0xAA, 0x3A, 0x93, 0xE7, 0xB3, 0xEB, 0xBD, 0x55,
  130. 0x76, 0x98, 0x86, 0xBC, 0x65, 0x1D, 0x06, 0xB0, 0xCC, 0x53, 0xB0, 0xF6,
  131. 0x3B, 0xCE, 0x3C, 0x3E, 0x27, 0xD2, 0x60, 0x4B,
  132. /* x */
  133. 0x6B, 0x17, 0xD1, 0xF2, 0xE1, 0x2C, 0x42, 0x47, 0xF8, 0xBC, 0xE6, 0xE5,
  134. 0x63, 0xA4, 0x40, 0xF2, 0x77, 0x03, 0x7D, 0x81, 0x2D, 0xEB, 0x33, 0xA0,
  135. 0xF4, 0xA1, 0x39, 0x45, 0xD8, 0x98, 0xC2, 0x96,
  136. /* y */
  137. 0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b, 0x8e, 0xe7, 0xeb, 0x4a,
  138. 0x7c, 0x0f, 0x9e, 0x16, 0x2b, 0xce, 0x33, 0x57, 0x6b, 0x31, 0x5e, 0xce,
  139. 0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5,
  140. /* order */
  141. 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
  142. 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84,
  143. 0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51}};
  144. static const struct curve_data P384 = {
  145. "NIST P-384",
  146. 48,
  147. 1,
  148. {/* p */
  149. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  150. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  151. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
  152. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
  153. /* a */
  154. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  155. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  156. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
  157. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC,
  158. /* b */
  159. 0xB3, 0x31, 0x2F, 0xA7, 0xE2, 0x3E, 0xE7, 0xE4, 0x98, 0x8E, 0x05, 0x6B,
  160. 0xE3, 0xF8, 0x2D, 0x19, 0x18, 0x1D, 0x9C, 0x6E, 0xFE, 0x81, 0x41, 0x12,
  161. 0x03, 0x14, 0x08, 0x8F, 0x50, 0x13, 0x87, 0x5A, 0xC6, 0x56, 0x39, 0x8D,
  162. 0x8A, 0x2E, 0xD1, 0x9D, 0x2A, 0x85, 0xC8, 0xED, 0xD3, 0xEC, 0x2A, 0xEF,
  163. /* x */
  164. 0xAA, 0x87, 0xCA, 0x22, 0xBE, 0x8B, 0x05, 0x37, 0x8E, 0xB1, 0xC7, 0x1E,
  165. 0xF3, 0x20, 0xAD, 0x74, 0x6E, 0x1D, 0x3B, 0x62, 0x8B, 0xA7, 0x9B, 0x98,
  166. 0x59, 0xF7, 0x41, 0xE0, 0x82, 0x54, 0x2A, 0x38, 0x55, 0x02, 0xF2, 0x5D,
  167. 0xBF, 0x55, 0x29, 0x6C, 0x3A, 0x54, 0x5E, 0x38, 0x72, 0x76, 0x0A, 0xB7,
  168. /* y */
  169. 0x36, 0x17, 0xde, 0x4a, 0x96, 0x26, 0x2c, 0x6f, 0x5d, 0x9e, 0x98, 0xbf,
  170. 0x92, 0x92, 0xdc, 0x29, 0xf8, 0xf4, 0x1d, 0xbd, 0x28, 0x9a, 0x14, 0x7c,
  171. 0xe9, 0xda, 0x31, 0x13, 0xb5, 0xf0, 0xb8, 0xc0, 0x0a, 0x60, 0xb1, 0xce,
  172. 0x1d, 0x7e, 0x81, 0x9d, 0x7a, 0x43, 0x1d, 0x7c, 0x90, 0xea, 0x0e, 0x5f,
  173. /* order */
  174. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  175. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  176. 0xC7, 0x63, 0x4D, 0x81, 0xF4, 0x37, 0x2D, 0xDF, 0x58, 0x1A, 0x0D, 0xB2,
  177. 0x48, 0xB0, 0xA7, 0x7A, 0xEC, 0xEC, 0x19, 0x6A, 0xCC, 0xC5, 0x29, 0x73}};
  178. static const struct curve_data P521 = {
  179. "NIST P-521",
  180. 66,
  181. 1,
  182. {/* p */
  183. 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  184. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  185. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  186. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  187. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  188. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  189. /* a */
  190. 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  191. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  192. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  193. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  194. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  195. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
  196. /* b */
  197. 0x00, 0x51, 0x95, 0x3E, 0xB9, 0x61, 0x8E, 0x1C, 0x9A, 0x1F, 0x92, 0x9A,
  198. 0x21, 0xA0, 0xB6, 0x85, 0x40, 0xEE, 0xA2, 0xDA, 0x72, 0x5B, 0x99, 0xB3,
  199. 0x15, 0xF3, 0xB8, 0xB4, 0x89, 0x91, 0x8E, 0xF1, 0x09, 0xE1, 0x56, 0x19,
  200. 0x39, 0x51, 0xEC, 0x7E, 0x93, 0x7B, 0x16, 0x52, 0xC0, 0xBD, 0x3B, 0xB1,
  201. 0xBF, 0x07, 0x35, 0x73, 0xDF, 0x88, 0x3D, 0x2C, 0x34, 0xF1, 0xEF, 0x45,
  202. 0x1F, 0xD4, 0x6B, 0x50, 0x3F, 0x00,
  203. /* x */
  204. 0x00, 0xC6, 0x85, 0x8E, 0x06, 0xB7, 0x04, 0x04, 0xE9, 0xCD, 0x9E, 0x3E,
  205. 0xCB, 0x66, 0x23, 0x95, 0xB4, 0x42, 0x9C, 0x64, 0x81, 0x39, 0x05, 0x3F,
  206. 0xB5, 0x21, 0xF8, 0x28, 0xAF, 0x60, 0x6B, 0x4D, 0x3D, 0xBA, 0xA1, 0x4B,
  207. 0x5E, 0x77, 0xEF, 0xE7, 0x59, 0x28, 0xFE, 0x1D, 0xC1, 0x27, 0xA2, 0xFF,
  208. 0xA8, 0xDE, 0x33, 0x48, 0xB3, 0xC1, 0x85, 0x6A, 0x42, 0x9B, 0xF9, 0x7E,
  209. 0x7E, 0x31, 0xC2, 0xE5, 0xBD, 0x66,
  210. /* y */
  211. 0x01, 0x18, 0x39, 0x29, 0x6a, 0x78, 0x9a, 0x3b, 0xc0, 0x04, 0x5c, 0x8a,
  212. 0x5f, 0xb4, 0x2c, 0x7d, 0x1b, 0xd9, 0x98, 0xf5, 0x44, 0x49, 0x57, 0x9b,
  213. 0x44, 0x68, 0x17, 0xaf, 0xbd, 0x17, 0x27, 0x3e, 0x66, 0x2c, 0x97, 0xee,
  214. 0x72, 0x99, 0x5e, 0xf4, 0x26, 0x40, 0xc5, 0x50, 0xb9, 0x01, 0x3f, 0xad,
  215. 0x07, 0x61, 0x35, 0x3c, 0x70, 0x86, 0xa2, 0x72, 0xc2, 0x40, 0x88, 0xbe,
  216. 0x94, 0x76, 0x9f, 0xd1, 0x66, 0x50,
  217. /* order */
  218. 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  219. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  220. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x51, 0x86,
  221. 0x87, 0x83, 0xBF, 0x2F, 0x96, 0x6B, 0x7F, 0xCC, 0x01, 0x48, 0xF7, 0x09,
  222. 0xA5, 0xD0, 0x3B, 0xB5, 0xC9, 0xB8, 0x89, 0x9C, 0x47, 0xAE, 0xBB, 0x6F,
  223. 0xB7, 0x1E, 0x91, 0x38, 0x64, 0x09}};
  224. struct built_in_curve {
  225. int nid;
  226. const struct curve_data *data;
  227. const EC_METHOD *(*method)(void);
  228. };
  229. static const struct built_in_curve built_in_curves[] = {
  230. {NID_secp224r1, &P224, 0},
  231. {NID_X9_62_prime256v1, &P256, 0},
  232. {NID_secp384r1, &P384, 0},
  233. {NID_secp521r1, &P521, 0},
  234. {NID_undef, 0, 0},
  235. };
  236. EC_GROUP *ec_group_new(const EC_METHOD *meth) {
  237. EC_GROUP *ret;
  238. if (meth == NULL) {
  239. OPENSSL_PUT_ERROR(EC, ec_group_new, EC_R_SLOT_FULL);
  240. return NULL;
  241. }
  242. if (meth->group_init == 0) {
  243. OPENSSL_PUT_ERROR(EC, ec_group_new, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  244. return NULL;
  245. }
  246. ret = OPENSSL_malloc(sizeof(EC_GROUP));
  247. if (ret == NULL) {
  248. OPENSSL_PUT_ERROR(EC, ec_group_new, ERR_R_MALLOC_FAILURE);
  249. return NULL;
  250. }
  251. memset(ret, 0, sizeof(EC_GROUP));
  252. ret->meth = meth;
  253. BN_init(&ret->order);
  254. BN_init(&ret->cofactor);
  255. ret->asn1_form = POINT_CONVERSION_UNCOMPRESSED;
  256. if (!meth->group_init(ret)) {
  257. OPENSSL_free(ret);
  258. return NULL;
  259. }
  260. return ret;
  261. }
  262. static EC_GROUP *ec_group_new_curve_GFp(const BIGNUM *p, const BIGNUM *a,
  263. const BIGNUM *b, BN_CTX *ctx) {
  264. const EC_METHOD *meth = EC_GFp_mont_method();
  265. EC_GROUP *ret;
  266. ret = ec_group_new(meth);
  267. if (ret == NULL) {
  268. return NULL;
  269. }
  270. if (ret->meth->group_set_curve == 0) {
  271. OPENSSL_PUT_ERROR(EC, ec_group_new_curve_GFp,
  272. ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  273. return 0;
  274. }
  275. if (!ret->meth->group_set_curve(ret, p, a, b, ctx)) {
  276. EC_GROUP_free(ret);
  277. return NULL;
  278. }
  279. return ret;
  280. }
  281. static EC_GROUP *ec_group_new_from_data(const struct built_in_curve *curve) {
  282. EC_GROUP *group = NULL;
  283. EC_POINT *P = NULL;
  284. BN_CTX *ctx = NULL;
  285. BIGNUM *p = NULL, *a = NULL, *b = NULL, *x = NULL, *y = NULL, *order = NULL;
  286. int ok = 0;
  287. unsigned param_len;
  288. const EC_METHOD *meth;
  289. const struct curve_data *data;
  290. const uint8_t *params;
  291. if ((ctx = BN_CTX_new()) == NULL) {
  292. OPENSSL_PUT_ERROR(EC, ec_group_new_from_data, ERR_R_MALLOC_FAILURE);
  293. goto err;
  294. }
  295. data = curve->data;
  296. param_len = data->param_len;
  297. params = data->data;
  298. if (!(p = BN_bin2bn(params + 0 * param_len, param_len, NULL)) ||
  299. !(a = BN_bin2bn(params + 1 * param_len, param_len, NULL)) ||
  300. !(b = BN_bin2bn(params + 2 * param_len, param_len, NULL))) {
  301. OPENSSL_PUT_ERROR(EC, ec_group_new_from_data, ERR_R_BN_LIB);
  302. goto err;
  303. }
  304. if (curve->method != 0) {
  305. meth = curve->method();
  306. if (((group = ec_group_new(meth)) == NULL) ||
  307. (!(group->meth->group_set_curve(group, p, a, b, ctx)))) {
  308. OPENSSL_PUT_ERROR(EC, ec_group_new_from_data, ERR_R_EC_LIB);
  309. goto err;
  310. }
  311. } else {
  312. if ((group = ec_group_new_curve_GFp(p, a, b, ctx)) == NULL) {
  313. OPENSSL_PUT_ERROR(EC, ec_group_new_from_data, ERR_R_EC_LIB);
  314. goto err;
  315. }
  316. }
  317. if ((P = EC_POINT_new(group)) == NULL) {
  318. OPENSSL_PUT_ERROR(EC, ec_group_new_from_data, ERR_R_EC_LIB);
  319. goto err;
  320. }
  321. if (!(x = BN_bin2bn(params + 3 * param_len, param_len, NULL)) ||
  322. !(y = BN_bin2bn(params + 4 * param_len, param_len, NULL))) {
  323. OPENSSL_PUT_ERROR(EC, ec_group_new_from_data, ERR_R_BN_LIB);
  324. goto err;
  325. }
  326. if (!EC_POINT_set_affine_coordinates_GFp(group, P, x, y, ctx)) {
  327. OPENSSL_PUT_ERROR(EC, ec_group_new_from_data, ERR_R_EC_LIB);
  328. goto err;
  329. }
  330. if (!(order = BN_bin2bn(params + 5 * param_len, param_len, NULL)) ||
  331. !BN_set_word(x, (BN_ULONG)data->cofactor)) {
  332. OPENSSL_PUT_ERROR(EC, ec_group_new_from_data, ERR_R_BN_LIB);
  333. goto err;
  334. }
  335. group->generator = P;
  336. P = NULL;
  337. if (!BN_copy(&group->order, order) ||
  338. !BN_set_word(&group->cofactor, (BN_ULONG)data->cofactor)) {
  339. OPENSSL_PUT_ERROR(EC, ec_group_new_from_data, ERR_R_BN_LIB);
  340. goto err;
  341. }
  342. ok = 1;
  343. err:
  344. if (!ok) {
  345. EC_GROUP_free(group);
  346. group = NULL;
  347. }
  348. if (P)
  349. EC_POINT_free(P);
  350. if (ctx)
  351. BN_CTX_free(ctx);
  352. if (p)
  353. BN_free(p);
  354. if (a)
  355. BN_free(a);
  356. if (b)
  357. BN_free(b);
  358. if (order)
  359. BN_free(order);
  360. if (x)
  361. BN_free(x);
  362. if (y)
  363. BN_free(y);
  364. return group;
  365. }
  366. EC_GROUP *EC_GROUP_new_by_curve_name(int nid) {
  367. unsigned i;
  368. const struct built_in_curve *curve;
  369. EC_GROUP *ret = NULL;
  370. for (i = 0; built_in_curves[i].nid != NID_undef; i++) {
  371. curve = &built_in_curves[i];
  372. if (curve->nid == nid) {
  373. ret = ec_group_new_from_data(curve);
  374. break;
  375. }
  376. }
  377. if (ret == NULL) {
  378. OPENSSL_PUT_ERROR(EC, EC_GROUP_new_by_curve_name, EC_R_UNKNOWN_GROUP);
  379. return NULL;
  380. }
  381. ret->curve_name = nid;
  382. return ret;
  383. }
  384. void EC_GROUP_free(EC_GROUP *group) {
  385. if (!group) {
  386. return;
  387. }
  388. if (group->meth->group_finish != 0) {
  389. group->meth->group_finish(group);
  390. }
  391. ec_pre_comp_free(group->pre_comp);
  392. if (group->generator != NULL) {
  393. EC_POINT_free(group->generator);
  394. }
  395. BN_free(&group->order);
  396. BN_free(&group->cofactor);
  397. OPENSSL_free(group);
  398. }
  399. int EC_GROUP_copy(EC_GROUP *dest, const EC_GROUP *src) {
  400. if (dest->meth->group_copy == 0) {
  401. OPENSSL_PUT_ERROR(EC, EC_GROUP_copy, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  402. return 0;
  403. }
  404. if (dest->meth != src->meth) {
  405. OPENSSL_PUT_ERROR(EC, EC_GROUP_copy, EC_R_INCOMPATIBLE_OBJECTS);
  406. return 0;
  407. }
  408. if (dest == src) {
  409. return 1;
  410. }
  411. ec_pre_comp_free(dest->pre_comp);
  412. dest->pre_comp = ec_pre_comp_dup(src->pre_comp);
  413. if (src->generator != NULL) {
  414. if (dest->generator == NULL) {
  415. dest->generator = EC_POINT_new(dest);
  416. if (dest->generator == NULL) {
  417. return 0;
  418. }
  419. }
  420. if (!EC_POINT_copy(dest->generator, src->generator)) {
  421. return 0;
  422. }
  423. } else {
  424. /* src->generator == NULL */
  425. if (dest->generator != NULL) {
  426. EC_POINT_clear_free(dest->generator);
  427. dest->generator = NULL;
  428. }
  429. }
  430. if (!BN_copy(&dest->order, &src->order) ||
  431. !BN_copy(&dest->cofactor, &src->cofactor)) {
  432. return 0;
  433. }
  434. dest->curve_name = src->curve_name;
  435. dest->asn1_form = src->asn1_form;
  436. return dest->meth->group_copy(dest, src);
  437. }
  438. EC_GROUP *EC_GROUP_dup(const EC_GROUP *a) {
  439. EC_GROUP *t = NULL;
  440. int ok = 0;
  441. if (a == NULL) {
  442. return NULL;
  443. }
  444. t = ec_group_new(a->meth);
  445. if (t == NULL) {
  446. return NULL;
  447. }
  448. if (!EC_GROUP_copy(t, a)) {
  449. goto err;
  450. }
  451. ok = 1;
  452. err:
  453. if (!ok) {
  454. if (t) {
  455. EC_GROUP_free(t);
  456. }
  457. return NULL;
  458. } else {
  459. return t;
  460. }
  461. }
  462. int EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b) {
  463. if (a->curve_name == NID_undef || b->curve_name == NID_undef) {
  464. return 0;
  465. }
  466. return a->curve_name == b->curve_name;
  467. }
  468. const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group) {
  469. return group->generator;
  470. }
  471. int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx) {
  472. if (!BN_copy(order, &group->order)) {
  473. return 0;
  474. }
  475. return !BN_is_zero(order);
  476. }
  477. int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor,
  478. BN_CTX *ctx) {
  479. if (!BN_copy(cofactor, &group->cofactor)) {
  480. return 0;
  481. }
  482. return !BN_is_zero(&group->cofactor);
  483. }
  484. int EC_GROUP_get_curve_name(const EC_GROUP *group) { return group->curve_name; }
  485. int EC_GROUP_get_degree(const EC_GROUP *group) {
  486. if (group->meth->group_get_degree == 0) {
  487. OPENSSL_PUT_ERROR(EC, EC_GROUP_get_degree,
  488. ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  489. return 0;
  490. }
  491. return group->meth->group_get_degree(group);
  492. }
  493. void EC_GROUP_set_point_conversion_form(EC_GROUP *group,
  494. point_conversion_form_t form) {
  495. group->asn1_form = form;
  496. }
  497. int EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx) {
  498. if (group->meth->mul == 0) {
  499. /* use default */
  500. return ec_wNAF_precompute_mult(group, ctx);
  501. }
  502. if (group->meth->precompute_mult != 0) {
  503. return group->meth->precompute_mult(group, ctx);
  504. }
  505. return 1; /* nothing to do, so report success */
  506. }
  507. int EC_GROUP_have_precompute_mult(const EC_GROUP *group) {
  508. if (group->meth->mul == 0) {
  509. /* use default */
  510. return ec_wNAF_have_precompute_mult(group);
  511. }
  512. if (group->meth->have_precompute_mult != 0) {
  513. return group->meth->have_precompute_mult(group);
  514. }
  515. return 0; /* cannot tell whether precomputation has been performed */
  516. }
  517. EC_POINT *EC_POINT_new(const EC_GROUP *group) {
  518. EC_POINT *ret;
  519. if (group == NULL) {
  520. OPENSSL_PUT_ERROR(EC, EC_POINT_new, ERR_R_PASSED_NULL_PARAMETER);
  521. return NULL;
  522. }
  523. if (group->meth->point_init == 0) {
  524. OPENSSL_PUT_ERROR(EC, EC_POINT_new, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  525. return NULL;
  526. }
  527. ret = OPENSSL_malloc(sizeof *ret);
  528. if (ret == NULL) {
  529. OPENSSL_PUT_ERROR(EC, EC_POINT_new, ERR_R_MALLOC_FAILURE);
  530. return NULL;
  531. }
  532. ret->meth = group->meth;
  533. if (!ret->meth->point_init(ret)) {
  534. OPENSSL_free(ret);
  535. return NULL;
  536. }
  537. return ret;
  538. }
  539. void EC_POINT_free(EC_POINT *point) {
  540. if (!point) {
  541. return;
  542. }
  543. if (point->meth->point_finish != 0) {
  544. point->meth->point_finish(point);
  545. }
  546. OPENSSL_free(point);
  547. }
  548. void EC_POINT_clear_free(EC_POINT *point) {
  549. if (!point) {
  550. return;
  551. }
  552. if (point->meth->point_clear_finish != 0) {
  553. point->meth->point_clear_finish(point);
  554. } else if (point->meth->point_finish != 0) {
  555. point->meth->point_finish(point);
  556. }
  557. OPENSSL_cleanse(point, sizeof *point);
  558. OPENSSL_free(point);
  559. }
  560. int EC_POINT_copy(EC_POINT *dest, const EC_POINT *src) {
  561. if (dest->meth->point_copy == 0) {
  562. OPENSSL_PUT_ERROR(EC, EC_POINT_copy, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  563. return 0;
  564. }
  565. if (dest->meth != src->meth) {
  566. OPENSSL_PUT_ERROR(EC, EC_POINT_copy, EC_R_INCOMPATIBLE_OBJECTS);
  567. return 0;
  568. }
  569. if (dest == src) {
  570. return 1;
  571. }
  572. return dest->meth->point_copy(dest, src);
  573. }
  574. EC_POINT *EC_POINT_dup(const EC_POINT *a, const EC_GROUP *group) {
  575. EC_POINT *t;
  576. int r;
  577. if (a == NULL) {
  578. return NULL;
  579. }
  580. t = EC_POINT_new(group);
  581. if (t == NULL) {
  582. OPENSSL_PUT_ERROR(EC, EC_POINT_dup, ERR_R_MALLOC_FAILURE);
  583. return NULL;
  584. }
  585. r = EC_POINT_copy(t, a);
  586. if (!r) {
  587. EC_POINT_free(t);
  588. return NULL;
  589. } else {
  590. return t;
  591. }
  592. }
  593. int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point) {
  594. if (group->meth->point_set_to_infinity == 0) {
  595. OPENSSL_PUT_ERROR(EC, EC_POINT_set_to_infinity,
  596. ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  597. return 0;
  598. }
  599. if (group->meth != point->meth) {
  600. OPENSSL_PUT_ERROR(EC, EC_POINT_set_to_infinity, EC_R_INCOMPATIBLE_OBJECTS);
  601. return 0;
  602. }
  603. return group->meth->point_set_to_infinity(group, point);
  604. }
  605. int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *point) {
  606. if (group->meth->is_at_infinity == 0) {
  607. OPENSSL_PUT_ERROR(EC, EC_POINT_is_at_infinity,
  608. ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  609. return 0;
  610. }
  611. if (group->meth != point->meth) {
  612. OPENSSL_PUT_ERROR(EC, EC_POINT_is_at_infinity, EC_R_INCOMPATIBLE_OBJECTS);
  613. return 0;
  614. }
  615. return group->meth->is_at_infinity(group, point);
  616. }
  617. int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point,
  618. BN_CTX *ctx) {
  619. if (group->meth->is_on_curve == 0) {
  620. OPENSSL_PUT_ERROR(EC, EC_POINT_is_on_curve,
  621. ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  622. return 0;
  623. }
  624. if (group->meth != point->meth) {
  625. OPENSSL_PUT_ERROR(EC, EC_POINT_is_on_curve, EC_R_INCOMPATIBLE_OBJECTS);
  626. return 0;
  627. }
  628. return group->meth->is_on_curve(group, point, ctx);
  629. }
  630. int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b,
  631. BN_CTX *ctx) {
  632. if (group->meth->point_cmp == 0) {
  633. OPENSSL_PUT_ERROR(EC, EC_POINT_cmp, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  634. return -1;
  635. }
  636. if ((group->meth != a->meth) || (a->meth != b->meth)) {
  637. OPENSSL_PUT_ERROR(EC, EC_POINT_cmp, EC_R_INCOMPATIBLE_OBJECTS);
  638. return -1;
  639. }
  640. return group->meth->point_cmp(group, a, b, ctx);
  641. }
  642. int EC_POINT_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx) {
  643. if (group->meth->make_affine == 0) {
  644. OPENSSL_PUT_ERROR(EC, EC_POINT_make_affine,
  645. ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  646. return 0;
  647. }
  648. if (group->meth != point->meth) {
  649. OPENSSL_PUT_ERROR(EC, EC_POINT_make_affine, EC_R_INCOMPATIBLE_OBJECTS);
  650. return 0;
  651. }
  652. return group->meth->make_affine(group, point, ctx);
  653. }
  654. int EC_POINTs_make_affine(const EC_GROUP *group, size_t num, EC_POINT *points[],
  655. BN_CTX *ctx) {
  656. size_t i;
  657. if (group->meth->points_make_affine == 0) {
  658. OPENSSL_PUT_ERROR(EC, EC_POINTs_make_affine,
  659. ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  660. return 0;
  661. }
  662. for (i = 0; i < num; i++) {
  663. if (group->meth != points[i]->meth) {
  664. OPENSSL_PUT_ERROR(EC, EC_POINTs_make_affine, EC_R_INCOMPATIBLE_OBJECTS);
  665. return 0;
  666. }
  667. }
  668. return group->meth->points_make_affine(group, num, points, ctx);
  669. }
  670. int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group,
  671. const EC_POINT *point, BIGNUM *x,
  672. BIGNUM *y, BN_CTX *ctx) {
  673. if (group->meth->point_get_affine_coordinates == 0) {
  674. OPENSSL_PUT_ERROR(EC, EC_POINT_get_affine_coordinates_GFp,
  675. ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  676. return 0;
  677. }
  678. if (group->meth != point->meth) {
  679. OPENSSL_PUT_ERROR(EC, EC_POINT_get_affine_coordinates_GFp,
  680. EC_R_INCOMPATIBLE_OBJECTS);
  681. return 0;
  682. }
  683. return group->meth->point_get_affine_coordinates(group, point, x, y, ctx);
  684. }
  685. int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, EC_POINT *point,
  686. const BIGNUM *x, const BIGNUM *y,
  687. BN_CTX *ctx) {
  688. if (group->meth->point_set_affine_coordinates == 0) {
  689. OPENSSL_PUT_ERROR(EC, EC_POINT_set_affine_coordinates_GFp,
  690. ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  691. return 0;
  692. }
  693. if (group->meth != point->meth) {
  694. OPENSSL_PUT_ERROR(EC, EC_POINT_set_affine_coordinates_GFp,
  695. EC_R_INCOMPATIBLE_OBJECTS);
  696. return 0;
  697. }
  698. return group->meth->point_set_affine_coordinates(group, point, x, y, ctx);
  699. }
  700. int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
  701. const EC_POINT *b, BN_CTX *ctx) {
  702. if (group->meth->add == 0) {
  703. OPENSSL_PUT_ERROR(EC, EC_POINT_add, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  704. return 0;
  705. }
  706. if ((group->meth != r->meth) || (r->meth != a->meth) ||
  707. (a->meth != b->meth)) {
  708. OPENSSL_PUT_ERROR(EC, EC_POINT_add, EC_R_INCOMPATIBLE_OBJECTS);
  709. return 0;
  710. }
  711. return group->meth->add(group, r, a, b, ctx);
  712. }
  713. int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
  714. BN_CTX *ctx) {
  715. if (group->meth->dbl == 0) {
  716. OPENSSL_PUT_ERROR(EC, EC_POINT_dbl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  717. return 0;
  718. }
  719. if ((group->meth != r->meth) || (r->meth != a->meth)) {
  720. OPENSSL_PUT_ERROR(EC, EC_POINT_dbl, EC_R_INCOMPATIBLE_OBJECTS);
  721. return 0;
  722. }
  723. return group->meth->dbl(group, r, a, ctx);
  724. }
  725. int EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx) {
  726. if (group->meth->dbl == 0) {
  727. OPENSSL_PUT_ERROR(EC, EC_POINT_invert, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  728. return 0;
  729. }
  730. if (group->meth != a->meth) {
  731. OPENSSL_PUT_ERROR(EC, EC_POINT_invert, EC_R_INCOMPATIBLE_OBJECTS);
  732. return 0;
  733. }
  734. return group->meth->invert(group, a, ctx);
  735. }
  736. int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar,
  737. const EC_POINT *point, const BIGNUM *p_scalar, BN_CTX *ctx) {
  738. /* just a convenient interface to EC_POINTs_mul() */
  739. const EC_POINT *points[1];
  740. const BIGNUM *scalars[1];
  741. points[0] = point;
  742. scalars[0] = p_scalar;
  743. return EC_POINTs_mul(group, r, g_scalar, (point != NULL && p_scalar != NULL),
  744. points, scalars, ctx);
  745. }
  746. int EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
  747. size_t num, const EC_POINT *points[], const BIGNUM *scalars[],
  748. BN_CTX *ctx) {
  749. if (group->meth->mul == 0) {
  750. /* use default. Warning, not constant-time. */
  751. return ec_wNAF_mul(group, r, scalar, num, points, scalars, ctx);
  752. }
  753. return group->meth->mul(group, r, scalar, num, points, scalars, ctx);
  754. }
  755. int ec_point_set_Jprojective_coordinates_GFp(const EC_GROUP *group, EC_POINT *point,
  756. const BIGNUM *x, const BIGNUM *y,
  757. const BIGNUM *z, BN_CTX *ctx) {
  758. if (group->meth->point_set_Jprojective_coordinates_GFp == 0) {
  759. OPENSSL_PUT_ERROR(EC, ec_point_set_Jprojective_coordinates_GFp,
  760. ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
  761. return 0;
  762. }
  763. if (group->meth != point->meth) {
  764. OPENSSL_PUT_ERROR(EC, ec_point_set_Jprojective_coordinates_GFp,
  765. EC_R_INCOMPATIBLE_OBJECTS);
  766. return 0;
  767. }
  768. return group->meth->point_set_Jprojective_coordinates_GFp(group, point, x, y,
  769. z, ctx);
  770. }