ec_curve.c 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269
  1. /* crypto/ec/ec_curve.c */
  2. /*
  3. * Written by Nils Larsch for the OpenSSL project.
  4. */
  5. /* ====================================================================
  6. * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved.
  7. *
  8. * Redistribution and use in source and binary forms, with or without
  9. * modification, are permitted provided that the following conditions
  10. * are met:
  11. *
  12. * 1. Redistributions of source code must retain the above copyright
  13. * notice, this list of conditions and the following disclaimer.
  14. *
  15. * 2. Redistributions in binary form must reproduce the above copyright
  16. * notice, this list of conditions and the following disclaimer in
  17. * the documentation and/or other materials provided with the
  18. * distribution.
  19. *
  20. * 3. All advertising materials mentioning features or use of this
  21. * software must display the following acknowledgment:
  22. * "This product includes software developed by the OpenSSL Project
  23. * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
  24. *
  25. * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  26. * endorse or promote products derived from this software without
  27. * prior written permission. For written permission, please contact
  28. * openssl-core@openssl.org.
  29. *
  30. * 5. Products derived from this software may not be called "OpenSSL"
  31. * nor may "OpenSSL" appear in their names without prior written
  32. * permission of the OpenSSL Project.
  33. *
  34. * 6. Redistributions of any form whatsoever must retain the following
  35. * acknowledgment:
  36. * "This product includes software developed by the OpenSSL Project
  37. * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
  38. *
  39. * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  40. * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  41. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  42. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
  43. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  44. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  45. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  46. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  47. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  48. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  49. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  50. * OF THE POSSIBILITY OF SUCH DAMAGE.
  51. * ====================================================================
  52. *
  53. * This product includes cryptographic software written by Eric Young
  54. * (eay@cryptsoft.com). This product includes software written by Tim
  55. * Hudson (tjh@cryptsoft.com).
  56. *
  57. */
  58. /* ====================================================================
  59. * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
  60. *
  61. * Portions of the attached software ("Contribution") are developed by
  62. * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
  63. *
  64. * The Contribution is licensed pursuant to the OpenSSL open source
  65. * license provided above.
  66. *
  67. * The elliptic curve binary polynomial software is originally written by
  68. * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories.
  69. *
  70. */
  71. #include "ec_lcl.h"
  72. #include <openssl/err.h>
  73. #include <openssl/obj_mac.h>
  74. typedef struct ec_curve_data_st {
  75. int field_type; /* either NID_X9_62_prime_field or
  76. * NID_X9_62_characteristic_two_field */
  77. const char *p; /* either a prime number or a polynomial */
  78. const char *a;
  79. const char *b;
  80. const char *x; /* the x coordinate of the generator */
  81. const char *y; /* the y coordinate of the generator */
  82. const char *order; /* the order of the group generated by the
  83. * generator */
  84. const BN_ULONG cofactor;/* the cofactor */
  85. const unsigned char *seed;/* the seed (optional) */
  86. size_t seed_len;
  87. const char *comment; /* a short description of the curve */
  88. } EC_CURVE_DATA;
  89. /* the nist prime curves */
  90. static const unsigned char _EC_NIST_PRIME_192_SEED[] = {
  91. 0x30,0x45,0xAE,0x6F,0xC8,0x42,0x2F,0x64,0xED,0x57,
  92. 0x95,0x28,0xD3,0x81,0x20,0xEA,0xE1,0x21,0x96,0xD5};
  93. static const EC_CURVE_DATA _EC_NIST_PRIME_192 = {
  94. NID_X9_62_prime_field,
  95. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
  96. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
  97. "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1",
  98. "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012",
  99. "07192b95ffc8da78631011ed6b24cdd573f977a11e794811",
  100. "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831",1,
  101. _EC_NIST_PRIME_192_SEED, 20,
  102. "192 bit prime curve from X9.62 and SECG"
  103. };
  104. static const unsigned char _EC_NIST_PRIME_224_SEED[] = {
  105. 0xBD,0x71,0x34,0x47,0x99,0xD5,0xC7,0xFC,0xDC,0x45,
  106. 0xB5,0x9F,0xA3,0xB9,0xAB,0x8F,0x6A,0x94,0x8B,0xC5};
  107. static const EC_CURVE_DATA _EC_NIST_PRIME_224 = {
  108. NID_X9_62_prime_field,
  109. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
  110. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE",
  111. "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4",
  112. "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21",
  113. "bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34",
  114. "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",1,
  115. _EC_NIST_PRIME_224_SEED, 20,
  116. "SECG/NIST recommended curve over a 224 bit prime field"
  117. };
  118. static const unsigned char _EC_NIST_PRIME_384_SEED[] = {
  119. 0xA3,0x35,0x92,0x6A,0xA3,0x19,0xA2,0x7A,0x1D,0x00,
  120. 0x89,0x6A,0x67,0x73,0xA4,0x82,0x7A,0xCD,0xAC,0x73};
  121. static const EC_CURVE_DATA _EC_NIST_PRIME_384 = {
  122. NID_X9_62_prime_field,
  123. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFF"
  124. "FFF0000000000000000FFFFFFFF",
  125. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFF"
  126. "FFF0000000000000000FFFFFFFC",
  127. "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC6563"
  128. "98D8A2ED19D2A85C8EDD3EC2AEF",
  129. "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F"
  130. "25DBF55296C3A545E3872760AB7",
  131. "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b"
  132. "1ce1d7e819d7a431d7c90ea0e5f",
  133. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0"
  134. "DB248B0A77AECEC196ACCC52973",1,
  135. _EC_NIST_PRIME_384_SEED, 20,
  136. "SECG/NIST recommended curve over a 384 bit prime field"
  137. };
  138. static const unsigned char _EC_NIST_PRIME_521_SEED[] = {
  139. 0xD0,0x9E,0x88,0x00,0x29,0x1C,0xB8,0x53,0x96,0xCC,
  140. 0x67,0x17,0x39,0x32,0x84,0xAA,0xA0,0xDA,0x64,0xBA};
  141. static const EC_CURVE_DATA _EC_NIST_PRIME_521 = {
  142. NID_X9_62_prime_field,
  143. "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
  144. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
  145. "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
  146. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",
  147. "051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156"
  148. "193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00",
  149. "C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14"
  150. "B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66",
  151. "011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c9"
  152. "7ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",
  153. "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51"
  154. "868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",1,
  155. _EC_NIST_PRIME_521_SEED, 20,
  156. "SECG/NIST recommended curve over a 521 bit prime field"
  157. };
  158. /* the x9.62 prime curves (minus the nist prime curves) */
  159. static const unsigned char _EC_X9_62_PRIME_192V2_SEED[] = {
  160. 0x31,0xA9,0x2E,0xE2,0x02,0x9F,0xD1,0x0D,0x90,0x1B,
  161. 0x11,0x3E,0x99,0x07,0x10,0xF0,0xD2,0x1A,0xC6,0xB6};
  162. static const EC_CURVE_DATA _EC_X9_62_PRIME_192V2 = {
  163. NID_X9_62_prime_field,
  164. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
  165. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
  166. "CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953",
  167. "EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A",
  168. "6574d11d69b6ec7a672bb82a083df2f2b0847de970b2de15",
  169. "FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31",1,
  170. _EC_X9_62_PRIME_192V2_SEED, 20,
  171. "192 bit prime curve from X9.62"
  172. };
  173. static const unsigned char _EC_X9_62_PRIME_192V3_SEED[] = {
  174. 0xC4,0x69,0x68,0x44,0x35,0xDE,0xB3,0x78,0xC4,0xB6,
  175. 0x5C,0xA9,0x59,0x1E,0x2A,0x57,0x63,0x05,0x9A,0x2E};
  176. static const EC_CURVE_DATA _EC_X9_62_PRIME_192V3 = {
  177. NID_X9_62_prime_field,
  178. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
  179. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
  180. "22123DC2395A05CAA7423DAECCC94760A7D462256BD56916",
  181. "7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896",
  182. "38a90f22637337334b49dcb66a6dc8f9978aca7648a943b0",
  183. "FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13",1,
  184. _EC_X9_62_PRIME_192V3_SEED, 20,
  185. "192 bit prime curve from X9.62"
  186. };
  187. static const unsigned char _EC_X9_62_PRIME_239V1_SEED[] = {
  188. 0xE4,0x3B,0xB4,0x60,0xF0,0xB8,0x0C,0xC0,0xC0,0xB0,
  189. 0x75,0x79,0x8E,0x94,0x80,0x60,0xF8,0x32,0x1B,0x7D};
  190. static const EC_CURVE_DATA _EC_X9_62_PRIME_239V1 = {
  191. NID_X9_62_prime_field,
  192. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
  193. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
  194. "6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A",
  195. "0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF",
  196. "7debe8e4e90a5dae6e4054ca530ba04654b36818ce226b39fccb7b02f1ae",
  197. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B",1,
  198. _EC_X9_62_PRIME_239V1_SEED, 20,
  199. "239 bit prime curve from X9.62"
  200. };
  201. static const unsigned char _EC_X9_62_PRIME_239V2_SEED[] = {
  202. 0xE8,0xB4,0x01,0x16,0x04,0x09,0x53,0x03,0xCA,0x3B,
  203. 0x80,0x99,0x98,0x2B,0xE0,0x9F,0xCB,0x9A,0xE6,0x16};
  204. static const EC_CURVE_DATA _EC_X9_62_PRIME_239V2 = {
  205. NID_X9_62_prime_field,
  206. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
  207. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
  208. "617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C",
  209. "38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7",
  210. "5b0125e4dbea0ec7206da0fc01d9b081329fb555de6ef460237dff8be4ba",
  211. "7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063",1,
  212. _EC_X9_62_PRIME_239V2_SEED, 20,
  213. "239 bit prime curve from X9.62"
  214. };
  215. static const unsigned char _EC_X9_62_PRIME_239V3_SEED[] = {
  216. 0x7D,0x73,0x74,0x16,0x8F,0xFE,0x34,0x71,0xB6,0x0A,
  217. 0x85,0x76,0x86,0xA1,0x94,0x75,0xD3,0xBF,0xA2,0xFF};
  218. static const EC_CURVE_DATA _EC_X9_62_PRIME_239V3 = {
  219. NID_X9_62_prime_field,
  220. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
  221. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
  222. "255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E",
  223. "6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A",
  224. "1607e6898f390c06bc1d552bad226f3b6fcfe48b6e818499af18e3ed6cf3",
  225. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551",1,
  226. _EC_X9_62_PRIME_239V3_SEED, 20,
  227. "239 bit prime curve from X9.62"
  228. };
  229. static const unsigned char _EC_X9_62_PRIME_256V1_SEED[] = {
  230. 0xC4,0x9D,0x36,0x08,0x86,0xE7,0x04,0x93,0x6A,0x66,
  231. 0x78,0xE1,0x13,0x9D,0x26,0xB7,0x81,0x9F,0x7E,0x90};
  232. static const EC_CURVE_DATA _EC_X9_62_PRIME_256V1 = {
  233. NID_X9_62_prime_field,
  234. "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
  235. "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC",
  236. "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B",
  237. "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296",
  238. "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",
  239. "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",1,
  240. _EC_X9_62_PRIME_256V1_SEED, 20,
  241. "256 bit prime curve from X9.62 and SECG"
  242. };
  243. /* the secg prime curves (minus the nist and x9.62 prime curves) */
  244. static const unsigned char _EC_SECG_PRIME_112R1_SEED[] = {
  245. 0x00,0xF5,0x0B,0x02,0x8E,0x4D,0x69,0x6E,0x67,0x68,
  246. 0x75,0x61,0x51,0x75,0x29,0x04,0x72,0x78,0x3F,0xB1};
  247. static const EC_CURVE_DATA _EC_SECG_PRIME_112R1 = {
  248. NID_X9_62_prime_field,
  249. "DB7C2ABF62E35E668076BEAD208B",
  250. "DB7C2ABF62E35E668076BEAD2088",
  251. "659EF8BA043916EEDE8911702B22",
  252. "09487239995A5EE76B55F9C2F098",
  253. "a89ce5af8724c0a23e0e0ff77500",
  254. "DB7C2ABF62E35E7628DFAC6561C5",1,
  255. _EC_SECG_PRIME_112R1_SEED, 20,
  256. "SECG/WTLS recommended curve over a 112 bit prime field"
  257. };
  258. static const unsigned char _EC_SECG_PRIME_112R2_SEED[] = {
  259. 0x00,0x27,0x57,0xA1,0x11,0x4D,0x69,0x6E,0x67,0x68,
  260. 0x75,0x61,0x51,0x75,0x53,0x16,0xC0,0x5E,0x0B,0xD4};
  261. static const EC_CURVE_DATA _EC_SECG_PRIME_112R2 = {
  262. NID_X9_62_prime_field,
  263. "DB7C2ABF62E35E668076BEAD208B",
  264. "6127C24C05F38A0AAAF65C0EF02C",
  265. "51DEF1815DB5ED74FCC34C85D709",
  266. "4BA30AB5E892B4E1649DD0928643",
  267. "adcd46f5882e3747def36e956e97",
  268. "36DF0AAFD8B8D7597CA10520D04B",4,
  269. _EC_SECG_PRIME_112R2_SEED, 20,
  270. "SECG recommended curve over a 112 bit prime field"
  271. };
  272. static const unsigned char _EC_SECG_PRIME_128R1_SEED[] = {
  273. 0x00,0x0E,0x0D,0x4D,0x69,0x6E,0x67,0x68,0x75,0x61,
  274. 0x51,0x75,0x0C,0xC0,0x3A,0x44,0x73,0xD0,0x36,0x79};
  275. static const EC_CURVE_DATA _EC_SECG_PRIME_128R1 = {
  276. NID_X9_62_prime_field,
  277. "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",
  278. "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC",
  279. "E87579C11079F43DD824993C2CEE5ED3",
  280. "161FF7528B899B2D0C28607CA52C5B86",
  281. "cf5ac8395bafeb13c02da292dded7a83",
  282. "FFFFFFFE0000000075A30D1B9038A115",1,
  283. _EC_SECG_PRIME_128R1_SEED, 20,
  284. "SECG recommended curve over a 128 bit prime field"
  285. };
  286. static const unsigned char _EC_SECG_PRIME_128R2_SEED[] = {
  287. 0x00,0x4D,0x69,0x6E,0x67,0x68,0x75,0x61,0x51,0x75,
  288. 0x12,0xD8,0xF0,0x34,0x31,0xFC,0xE6,0x3B,0x88,0xF4};
  289. static const EC_CURVE_DATA _EC_SECG_PRIME_128R2 = {
  290. NID_X9_62_prime_field,
  291. "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",
  292. "D6031998D1B3BBFEBF59CC9BBFF9AEE1",
  293. "5EEEFCA380D02919DC2C6558BB6D8A5D",
  294. "7B6AA5D85E572983E6FB32A7CDEBC140",
  295. "27b6916a894d3aee7106fe805fc34b44",
  296. "3FFFFFFF7FFFFFFFBE0024720613B5A3",4,
  297. _EC_SECG_PRIME_128R2_SEED, 20,
  298. "SECG recommended curve over a 128 bit prime field"
  299. };
  300. static const EC_CURVE_DATA _EC_SECG_PRIME_160K1 = {
  301. NID_X9_62_prime_field,
  302. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",
  303. "0",
  304. "7",
  305. "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB",
  306. "938cf935318fdced6bc28286531733c3f03c4fee",
  307. "0100000000000000000001B8FA16DFAB9ACA16B6B3",1,
  308. NULL, 0,
  309. "SECG recommended curve over a 160 bit prime field"
  310. };
  311. static const unsigned char _EC_SECG_PRIME_160R1_SEED[] = {
  312. 0x10,0x53,0xCD,0xE4,0x2C,0x14,0xD6,0x96,0xE6,0x76,
  313. 0x87,0x56,0x15,0x17,0x53,0x3B,0xF3,0xF8,0x33,0x45};
  314. static const EC_CURVE_DATA _EC_SECG_PRIME_160R1 = {
  315. NID_X9_62_prime_field,
  316. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF",
  317. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC",
  318. "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45",
  319. "4A96B5688EF573284664698968C38BB913CBFC82",
  320. "23a628553168947d59dcc912042351377ac5fb32",
  321. "0100000000000000000001F4C8F927AED3CA752257",1,
  322. _EC_SECG_PRIME_160R1_SEED, 20,
  323. "SECG recommended curve over a 160 bit prime field"
  324. };
  325. static const unsigned char _EC_SECG_PRIME_160R2_SEED[] = {
  326. 0xB9,0x9B,0x99,0xB0,0x99,0xB3,0x23,0xE0,0x27,0x09,
  327. 0xA4,0xD6,0x96,0xE6,0x76,0x87,0x56,0x15,0x17,0x51};
  328. static const EC_CURVE_DATA _EC_SECG_PRIME_160R2 = {
  329. NID_X9_62_prime_field,
  330. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",
  331. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70",
  332. "B4E134D3FB59EB8BAB57274904664D5AF50388BA",
  333. "52DCB034293A117E1F4FF11B30F7199D3144CE6D",
  334. "feaffef2e331f296e071fa0df9982cfea7d43f2e",
  335. "0100000000000000000000351EE786A818F3A1A16B",1,
  336. _EC_SECG_PRIME_160R2_SEED, 20,
  337. "SECG/WTLS recommended curve over a 160 bit prime field"
  338. };
  339. static const EC_CURVE_DATA _EC_SECG_PRIME_192K1 = {
  340. NID_X9_62_prime_field,
  341. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37",
  342. "0",
  343. "3",
  344. "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D",
  345. "9b2f2f6d9c5628a7844163d015be86344082aa88d95e2f9d",
  346. "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D",1,
  347. NULL, 20,
  348. "SECG recommended curve over a 192 bit prime field"
  349. };
  350. static const EC_CURVE_DATA _EC_SECG_PRIME_224K1 = {
  351. NID_X9_62_prime_field,
  352. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D",
  353. "0",
  354. "5",
  355. "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C",
  356. "7e089fed7fba344282cafbd6f7e319f7c0b0bd59e2ca4bdb556d61a5",
  357. "010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7",1,
  358. NULL, 20,
  359. "SECG recommended curve over a 224 bit prime field"
  360. };
  361. static const EC_CURVE_DATA _EC_SECG_PRIME_256K1 = {
  362. NID_X9_62_prime_field,
  363. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F",
  364. "0",
  365. "7",
  366. "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798",
  367. "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
  368. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",1,
  369. NULL, 20,
  370. "SECG recommended curve over a 256 bit prime field"
  371. };
  372. /* some wap/wtls curves */
  373. static const EC_CURVE_DATA _EC_WTLS_8 = {
  374. NID_X9_62_prime_field,
  375. "FFFFFFFFFFFFFFFFFFFFFFFFFDE7",
  376. "0",
  377. "3",
  378. "1",
  379. "2",
  380. "0100000000000001ECEA551AD837E9",1,
  381. NULL, 20,
  382. "112 bit prime curve from the WTLS standard"
  383. };
  384. static const EC_CURVE_DATA _EC_WTLS_9 = {
  385. NID_X9_62_prime_field,
  386. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC808F",
  387. "0",
  388. "3",
  389. "1",
  390. "2",
  391. "0100000000000000000001CDC98AE0E2DE574ABF33",1,
  392. NULL, 20,
  393. "160 bit prime curve from the WTLS standard"
  394. };
  395. static const EC_CURVE_DATA _EC_WTLS_12 = {
  396. NID_X9_62_prime_field,
  397. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
  398. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE",
  399. "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4",
  400. "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21",
  401. "bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34",
  402. "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", 1,
  403. NULL, 0,
  404. "224 bit prime curve from the WTLS standard"
  405. };
  406. /* characteristic two curves */
  407. static const unsigned char _EC_SECG_CHAR2_113R1_SEED[] = {
  408. 0x10,0xE7,0x23,0xAB,0x14,0xD6,0x96,0xE6,0x76,0x87,
  409. 0x56,0x15,0x17,0x56,0xFE,0xBF,0x8F,0xCB,0x49,0xA9};
  410. static const EC_CURVE_DATA _EC_SECG_CHAR2_113R1 = {
  411. NID_X9_62_characteristic_two_field,
  412. "020000000000000000000000000201",
  413. "003088250CA6E7C7FE649CE85820F7",
  414. "00E8BEE4D3E2260744188BE0E9C723",
  415. "009D73616F35F4AB1407D73562C10F",
  416. "00A52830277958EE84D1315ED31886",
  417. "0100000000000000D9CCEC8A39E56F", 2,
  418. _EC_SECG_CHAR2_113R1_SEED, 20,
  419. "SECG recommended curve over a 113 bit binary field"
  420. };
  421. static const unsigned char _EC_SECG_CHAR2_113R2_SEED[] = {
  422. 0x10,0xC0,0xFB,0x15,0x76,0x08,0x60,0xDE,0xF1,0xEE,
  423. 0xF4,0xD6,0x96,0xE6,0x76,0x87,0x56,0x15,0x17,0x5D};
  424. static const EC_CURVE_DATA _EC_SECG_CHAR2_113R2 = {
  425. NID_X9_62_characteristic_two_field,
  426. "020000000000000000000000000201",
  427. "00689918DBEC7E5A0DD6DFC0AA55C7",
  428. "0095E9A9EC9B297BD4BF36E059184F",
  429. "01A57A6A7B26CA5EF52FCDB8164797",
  430. "00B3ADC94ED1FE674C06E695BABA1D",
  431. "010000000000000108789B2496AF93", 2,
  432. _EC_SECG_CHAR2_113R2_SEED, 20,
  433. "SECG recommended curve over a 113 bit binary field"
  434. };
  435. static const unsigned char _EC_SECG_CHAR2_131R1_SEED[] = {
  436. 0x4D,0x69,0x6E,0x67,0x68,0x75,0x61,0x51,0x75,0x98,
  437. 0x5B,0xD3,0xAD,0xBA,0xDA,0x21,0xB4,0x3A,0x97,0xE2};
  438. static const EC_CURVE_DATA _EC_SECG_CHAR2_131R1 = {
  439. NID_X9_62_characteristic_two_field,
  440. "080000000000000000000000000000010D",
  441. "07A11B09A76B562144418FF3FF8C2570B8",
  442. "0217C05610884B63B9C6C7291678F9D341",
  443. "0081BAF91FDF9833C40F9C181343638399",
  444. "078C6E7EA38C001F73C8134B1B4EF9E150",
  445. "0400000000000000023123953A9464B54D", 2,
  446. _EC_SECG_CHAR2_131R1_SEED, 20,
  447. "SECG/WTLS recommended curve over a 131 bit binary field"
  448. };
  449. static const unsigned char _EC_SECG_CHAR2_131R2_SEED[] = {
  450. 0x98,0x5B,0xD3,0xAD,0xBA,0xD4,0xD6,0x96,0xE6,0x76,
  451. 0x87,0x56,0x15,0x17,0x5A,0x21,0xB4,0x3A,0x97,0xE3};
  452. static const EC_CURVE_DATA _EC_SECG_CHAR2_131R2 = {
  453. NID_X9_62_characteristic_two_field,
  454. "080000000000000000000000000000010D",
  455. "03E5A88919D7CAFCBF415F07C2176573B2",
  456. "04B8266A46C55657AC734CE38F018F2192",
  457. "0356DCD8F2F95031AD652D23951BB366A8",
  458. "0648F06D867940A5366D9E265DE9EB240F",
  459. "0400000000000000016954A233049BA98F", 2,
  460. _EC_SECG_CHAR2_131R2_SEED, 20,
  461. "SECG recommended curve over a 131 bit binary field"
  462. };
  463. static const EC_CURVE_DATA _EC_SECG_CHAR2_163K1 = {
  464. NID_X9_62_characteristic_two_field,
  465. "0800000000000000000000000000000000000000C9",
  466. "1",
  467. "1",
  468. "02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8",
  469. "0289070FB05D38FF58321F2E800536D538CCDAA3D9",
  470. "04000000000000000000020108A2E0CC0D99F8A5EF", 2,
  471. NULL, 0,
  472. "\n\tSECG/NIST/WTLS recommended curve over a 163 bit binary field"
  473. };
  474. static const unsigned char _EC_SECG_CHAR2_163R1_SEED[] = {
  475. 0x24,0xB7,0xB1,0x37,0xC8,0xA1,0x4D,0x69,0x6E,0x67,
  476. 0x68,0x75,0x61,0x51,0x75,0x6F,0xD0,0xDA,0x2E,0x5C};
  477. static const EC_CURVE_DATA _EC_SECG_CHAR2_163R1 = {
  478. NID_X9_62_characteristic_two_field,
  479. "0800000000000000000000000000000000000000C9",
  480. "07B6882CAAEFA84F9554FF8428BD88E246D2782AE2",
  481. "0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9",
  482. "0369979697AB43897789566789567F787A7876A654",
  483. "00435EDB42EFAFB2989D51FEFCE3C80988F41FF883",
  484. "03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B", 2,
  485. /* The algorithm used to derive the curve parameters from
  486. * the seed used here is slightly different than the
  487. * algorithm described in X9.62 .
  488. */
  489. #if 0
  490. _EC_SECG_CHAR2_163R1_SEED, 20,
  491. #else
  492. NULL, 0,
  493. #endif
  494. "SECG recommended curve over a 163 bit binary field"
  495. };
  496. static const unsigned char _EC_SECG_CHAR2_163R2_SEED[] = {
  497. 0x85,0xE2,0x5B,0xFE,0x5C,0x86,0x22,0x6C,0xDB,0x12,
  498. 0x01,0x6F,0x75,0x53,0xF9,0xD0,0xE6,0x93,0xA2,0x68};
  499. static const EC_CURVE_DATA _EC_SECG_CHAR2_163R2 ={
  500. NID_X9_62_characteristic_two_field,
  501. "0800000000000000000000000000000000000000C9",
  502. "1",
  503. "020A601907B8C953CA1481EB10512F78744A3205FD",
  504. "03F0EBA16286A2D57EA0991168D4994637E8343E36",
  505. "00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1",
  506. "040000000000000000000292FE77E70C12A4234C33", 2,
  507. /* The seed here was used to created the curve parameters in normal
  508. * basis representation (and not the polynomial representation used here)
  509. */
  510. #if 0
  511. _EC_SECG_CHAR2_163R2_SEED, 20,
  512. #else
  513. NULL, 0,
  514. #endif
  515. "SECG/NIST recommended curve over a 163 bit binary field"
  516. };
  517. static const unsigned char _EC_SECG_CHAR2_193R1_SEED[] = {
  518. 0x10,0x3F,0xAE,0xC7,0x4D,0x69,0x6E,0x67,0x68,0x75,
  519. 0x61,0x51,0x75,0x77,0x7F,0xC5,0xB1,0x91,0xEF,0x30};
  520. static const EC_CURVE_DATA _EC_SECG_CHAR2_193R1 = {
  521. NID_X9_62_characteristic_two_field,
  522. "02000000000000000000000000000000000000000000008001",
  523. "0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01",
  524. "00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814",
  525. "01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1",
  526. "0025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05",
  527. "01000000000000000000000000C7F34A778F443ACC920EBA49", 2,
  528. _EC_SECG_CHAR2_193R1_SEED, 20,
  529. "SECG recommended curve over a 193 bit binary field"
  530. };
  531. static const unsigned char _EC_SECG_CHAR2_193R2_SEED[] = {
  532. 0x10,0xB7,0xB4,0xD6,0x96,0xE6,0x76,0x87,0x56,0x15,
  533. 0x17,0x51,0x37,0xC8,0xA1,0x6F,0xD0,0xDA,0x22,0x11};
  534. static const EC_CURVE_DATA _EC_SECG_CHAR2_193R2 = {
  535. NID_X9_62_characteristic_two_field,
  536. "02000000000000000000000000000000000000000000008001",
  537. "0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B",
  538. "00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE",
  539. "00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F",
  540. "01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C",
  541. "010000000000000000000000015AAB561B005413CCD4EE99D5", 2,
  542. _EC_SECG_CHAR2_193R2_SEED, 20,
  543. "SECG recommended curve over a 193 bit binary field"
  544. };
  545. static const EC_CURVE_DATA _EC_SECG_CHAR2_233K1 = {
  546. NID_X9_62_characteristic_two_field,
  547. "020000000000000000000000000000000000000004000000000000000001",
  548. "0",
  549. "1",
  550. "017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126",
  551. "01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3",
  552. "008000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF", 4,
  553. NULL, 0,
  554. "\n\tSECG/NIST/WTLS recommended curve over a 233 bit binary field"
  555. };
  556. static const unsigned char _EC_SECG_CHAR2_233R1_SEED[] = {
  557. 0x74,0xD5,0x9F,0xF0,0x7F,0x6B,0x41,0x3D,0x0E,0xA1,
  558. 0x4B,0x34,0x4B,0x20,0xA2,0xDB,0x04,0x9B,0x50,0xC3};
  559. static const EC_CURVE_DATA _EC_SECG_CHAR2_233R1 = {
  560. NID_X9_62_characteristic_two_field,
  561. "020000000000000000000000000000000000000004000000000000000001",
  562. "000000000000000000000000000000000000000000000000000000000001",
  563. "0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD",
  564. "00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B",
  565. "01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052",
  566. "01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7", 2,
  567. _EC_SECG_CHAR2_233R1_SEED, 20,
  568. "\n\tSECG/NIST/WTLS recommended curve over a 233 bit binary field"
  569. };
  570. static const EC_CURVE_DATA _EC_SECG_CHAR2_239K1 = {
  571. NID_X9_62_characteristic_two_field,
  572. "800000000000000000004000000000000000000000000000000000000001",
  573. "0",
  574. "1",
  575. "29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC",
  576. "76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA",
  577. "2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5", 4,
  578. NULL, 0,
  579. "SECG recommended curve over a 239 bit binary field"
  580. };
  581. static const EC_CURVE_DATA _EC_SECG_CHAR2_283K1 = {
  582. NID_X9_62_characteristic_two_field,
  583. "080000000000000000000000000000000000000000000000000000000000000000001"
  584. "0A1",
  585. "0",
  586. "1",
  587. "0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492"
  588. "836",
  589. "01CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2"
  590. "259",
  591. "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163"
  592. "C61", 4,
  593. NULL, 20,
  594. "SECG/NIST recommended curve over a 283 bit binary field"
  595. };
  596. static const unsigned char _EC_SECG_CHAR2_283R1_SEED[] = {
  597. 0x77,0xE2,0xB0,0x73,0x70,0xEB,0x0F,0x83,0x2A,0x6D,
  598. 0xD5,0xB6,0x2D,0xFC,0x88,0xCD,0x06,0xBB,0x84,0xBE};
  599. static const EC_CURVE_DATA _EC_SECG_CHAR2_283R1 = {
  600. NID_X9_62_characteristic_two_field,
  601. "080000000000000000000000000000000000000000000000000000000000000000001"
  602. "0A1",
  603. "000000000000000000000000000000000000000000000000000000000000000000000"
  604. "001",
  605. "027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A"
  606. "2F5",
  607. "05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12"
  608. "053",
  609. "03676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE811"
  610. "2F4",
  611. "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB"
  612. "307", 2,
  613. _EC_SECG_CHAR2_283R1_SEED, 20,
  614. "SECG/NIST recommended curve over a 283 bit binary field"
  615. };
  616. static const EC_CURVE_DATA _EC_SECG_CHAR2_409K1 = {
  617. NID_X9_62_characteristic_two_field,
  618. "020000000000000000000000000000000000000000000000000000000000000000000"
  619. "00000000000008000000000000000000001",
  620. "0",
  621. "1",
  622. "0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C4601"
  623. "89EB5AAAA62EE222EB1B35540CFE9023746",
  624. "01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6"
  625. "C42E9C55215AA9CA27A5863EC48D8E0286B",
  626. "007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400"
  627. "EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF", 4,
  628. NULL, 0,
  629. "SECG/NIST recommended curve over a 409 bit binary field"
  630. };
  631. static const unsigned char _EC_SECG_CHAR2_409R1_SEED[] = {
  632. 0x40,0x99,0xB5,0xA4,0x57,0xF9,0xD6,0x9F,0x79,0x21,
  633. 0x3D,0x09,0x4C,0x4B,0xCD,0x4D,0x42,0x62,0x21,0x0B};
  634. static const EC_CURVE_DATA _EC_SECG_CHAR2_409R1 = {
  635. NID_X9_62_characteristic_two_field,
  636. "020000000000000000000000000000000000000000000000000000000000000000000"
  637. "00000000000008000000000000000000001",
  638. "000000000000000000000000000000000000000000000000000000000000000000000"
  639. "00000000000000000000000000000000001",
  640. "0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A19"
  641. "7B272822F6CD57A55AA4F50AE317B13545F",
  642. "015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255"
  643. "A868A1180515603AEAB60794E54BB7996A7",
  644. "0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514"
  645. "F1FDF4B4F40D2181B3681C364BA0273C706",
  646. "010000000000000000000000000000000000000000000000000001E2AAD6A612F3330"
  647. "7BE5FA47C3C9E052F838164CD37D9A21173", 2,
  648. _EC_SECG_CHAR2_409R1_SEED, 20,
  649. "SECG/NIST recommended curve over a 409 bit binary field"
  650. };
  651. static const EC_CURVE_DATA _EC_SECG_CHAR2_571K1 = {
  652. NID_X9_62_characteristic_two_field,
  653. "800000000000000000000000000000000000000000000000000000000000000000000"
  654. "000000000000000000000000000000000000000000000000000000000000000000000"
  655. "00425",
  656. "0",
  657. "1",
  658. "026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA443709"
  659. "58493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A0"
  660. "1C8972",
  661. "0349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D497"
  662. "9C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143E"
  663. "F1C7A3",
  664. "020000000000000000000000000000000000000000000000000000000000000000000"
  665. "000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F63"
  666. "7C1001", 4,
  667. NULL, 0,
  668. "SECG/NIST recommended curve over a 571 bit binary field"
  669. };
  670. static const unsigned char _EC_SECG_CHAR2_571R1_SEED[] = {
  671. 0x2A,0xA0,0x58,0xF7,0x3A,0x0E,0x33,0xAB,0x48,0x6B,
  672. 0x0F,0x61,0x04,0x10,0xC5,0x3A,0x7F,0x13,0x23,0x10};
  673. static const EC_CURVE_DATA _EC_SECG_CHAR2_571R1 = {
  674. NID_X9_62_characteristic_two_field,
  675. "800000000000000000000000000000000000000000000000000000000000000000000"
  676. "000000000000000000000000000000000000000000000000000000000000000000000"
  677. "00425",
  678. "000000000000000000000000000000000000000000000000000000000000000000000"
  679. "000000000000000000000000000000000000000000000000000000000000000000000"
  680. "000001",
  681. "02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFA"
  682. "BBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F29"
  683. "55727A",
  684. "0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53"
  685. "950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8E"
  686. "EC2D19",
  687. "037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423"
  688. "E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B"
  689. "8AC15B",
  690. "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
  691. "FFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2F"
  692. "E84E47", 2,
  693. _EC_SECG_CHAR2_571R1_SEED, 20,
  694. "SECG/NIST recommended curve over a 571 bit binary field"
  695. };
  696. static const unsigned char _EC_X9_62_CHAR2_163V1_SEED[] = {
  697. 0xD2,0xC0,0xFB,0x15,0x76,0x08,0x60,0xDE,0xF1,0xEE,
  698. 0xF4,0xD6,0x96,0xE6,0x76,0x87,0x56,0x15,0x17,0x54};
  699. static const EC_CURVE_DATA _EC_X9_62_CHAR2_163V1 = {
  700. NID_X9_62_characteristic_two_field,
  701. "080000000000000000000000000000000000000107",
  702. "072546B5435234A422E0789675F432C89435DE5242",
  703. "00C9517D06D5240D3CFF38C74B20B6CD4D6F9DD4D9",
  704. "07AF69989546103D79329FCC3D74880F33BBE803CB",
  705. "01EC23211B5966ADEA1D3F87F7EA5848AEF0B7CA9F",
  706. "0400000000000000000001E60FC8821CC74DAEAFC1", 2,
  707. _EC_X9_62_CHAR2_163V1_SEED, 20,
  708. "163 bit binary curve from X9.62"
  709. };
  710. static const unsigned char _EC_X9_62_CHAR2_163V2_SEED[] = {
  711. 0x53,0x81,0x4C,0x05,0x0D,0x44,0xD6,0x96,0xE6,0x76,
  712. 0x87,0x56,0x15,0x17,0x58,0x0C,0xA4,0xE2,0x9F,0xFD};
  713. static const EC_CURVE_DATA _EC_X9_62_CHAR2_163V2 = {
  714. NID_X9_62_characteristic_two_field,
  715. "080000000000000000000000000000000000000107",
  716. "0108B39E77C4B108BED981ED0E890E117C511CF072",
  717. "0667ACEB38AF4E488C407433FFAE4F1C811638DF20",
  718. "0024266E4EB5106D0A964D92C4860E2671DB9B6CC5",
  719. "079F684DDF6684C5CD258B3890021B2386DFD19FC5",
  720. "03FFFFFFFFFFFFFFFFFFFDF64DE1151ADBB78F10A7", 2,
  721. _EC_X9_62_CHAR2_163V2_SEED, 20,
  722. "163 bit binary curve from X9.62"
  723. };
  724. static const unsigned char _EC_X9_62_CHAR2_163V3_SEED[] = {
  725. 0x50,0xCB,0xF1,0xD9,0x5C,0xA9,0x4D,0x69,0x6E,0x67,
  726. 0x68,0x75,0x61,0x51,0x75,0xF1,0x6A,0x36,0xA3,0xB8};
  727. static const EC_CURVE_DATA _EC_X9_62_CHAR2_163V3 = {
  728. NID_X9_62_characteristic_two_field,
  729. "080000000000000000000000000000000000000107",
  730. "07A526C63D3E25A256A007699F5447E32AE456B50E",
  731. "03F7061798EB99E238FD6F1BF95B48FEEB4854252B",
  732. "02F9F87B7C574D0BDECF8A22E6524775F98CDEBDCB",
  733. "05B935590C155E17EA48EB3FF3718B893DF59A05D0",
  734. "03FFFFFFFFFFFFFFFFFFFE1AEE140F110AFF961309", 2,
  735. _EC_X9_62_CHAR2_163V3_SEED, 20,
  736. "163 bit binary curve from X9.62"
  737. };
  738. static const EC_CURVE_DATA _EC_X9_62_CHAR2_176V1 = {
  739. NID_X9_62_characteristic_two_field,
  740. "0100000000000000000000000000000000080000000007",
  741. "E4E6DB2995065C407D9D39B8D0967B96704BA8E9C90B",
  742. "5DDA470ABE6414DE8EC133AE28E9BBD7FCEC0AE0FFF2",
  743. "8D16C2866798B600F9F08BB4A8E860F3298CE04A5798",
  744. "6FA4539C2DADDDD6BAB5167D61B436E1D92BB16A562C",
  745. "00010092537397ECA4F6145799D62B0A19CE06FE26AD", 0xFF6E,
  746. NULL, 0,
  747. "176 bit binary curve from X9.62"
  748. };
  749. static const unsigned char _EC_X9_62_CHAR2_191V1_SEED[] = {
  750. 0x4E,0x13,0xCA,0x54,0x27,0x44,0xD6,0x96,0xE6,0x76,
  751. 0x87,0x56,0x15,0x17,0x55,0x2F,0x27,0x9A,0x8C,0x84};
  752. static const EC_CURVE_DATA _EC_X9_62_CHAR2_191V1 = {
  753. NID_X9_62_characteristic_two_field,
  754. "800000000000000000000000000000000000000000000201",
  755. "2866537B676752636A68F56554E12640276B649EF7526267",
  756. "2E45EF571F00786F67B0081B9495A3D95462F5DE0AA185EC",
  757. "36B3DAF8A23206F9C4F299D7B21A9C369137F2C84AE1AA0D",
  758. "765BE73433B3F95E332932E70EA245CA2418EA0EF98018FB",
  759. "40000000000000000000000004A20E90C39067C893BBB9A5", 2,
  760. _EC_X9_62_CHAR2_191V1_SEED, 20,
  761. "191 bit binary curve from X9.62"
  762. };
  763. static const unsigned char _EC_X9_62_CHAR2_191V2_SEED[] = {
  764. 0x08,0x71,0xEF,0x2F,0xEF,0x24,0xD6,0x96,0xE6,0x76,
  765. 0x87,0x56,0x15,0x17,0x58,0xBE,0xE0,0xD9,0x5C,0x15};
  766. static const EC_CURVE_DATA _EC_X9_62_CHAR2_191V2 = {
  767. NID_X9_62_characteristic_two_field,
  768. "800000000000000000000000000000000000000000000201",
  769. "401028774D7777C7B7666D1366EA432071274F89FF01E718",
  770. "0620048D28BCBD03B6249C99182B7C8CD19700C362C46A01",
  771. "3809B2B7CC1B28CC5A87926AAD83FD28789E81E2C9E3BF10",
  772. "17434386626D14F3DBF01760D9213A3E1CF37AEC437D668A",
  773. "20000000000000000000000050508CB89F652824E06B8173", 4,
  774. _EC_X9_62_CHAR2_191V2_SEED, 20,
  775. "191 bit binary curve from X9.62"
  776. };
  777. static const unsigned char _EC_X9_62_CHAR2_191V3_SEED[] = {
  778. 0xE0,0x53,0x51,0x2D,0xC6,0x84,0xD6,0x96,0xE6,0x76,
  779. 0x87,0x56,0x15,0x17,0x50,0x67,0xAE,0x78,0x6D,0x1F};
  780. static const EC_CURVE_DATA _EC_X9_62_CHAR2_191V3 = {
  781. NID_X9_62_characteristic_two_field,
  782. "800000000000000000000000000000000000000000000201",
  783. "6C01074756099122221056911C77D77E77A777E7E7E77FCB",
  784. "71FE1AF926CF847989EFEF8DB459F66394D90F32AD3F15E8",
  785. "375D4CE24FDE434489DE8746E71786015009E66E38A926DD",
  786. "545A39176196575D985999366E6AD34CE0A77CD7127B06BE",
  787. "155555555555555555555555610C0B196812BFB6288A3EA3", 6,
  788. _EC_X9_62_CHAR2_191V3_SEED, 20,
  789. "191 bit binary curve from X9.62"
  790. };
  791. static const EC_CURVE_DATA _EC_X9_62_CHAR2_208W1 = {
  792. NID_X9_62_characteristic_two_field,
  793. "010000000000000000000000000000000800000000000000000007",
  794. "0000000000000000000000000000000000000000000000000000",
  795. "C8619ED45A62E6212E1160349E2BFA844439FAFC2A3FD1638F9E",
  796. "89FDFBE4ABE193DF9559ECF07AC0CE78554E2784EB8C1ED1A57A",
  797. "0F55B51A06E78E9AC38A035FF520D8B01781BEB1A6BB08617DE3",
  798. "000101BAF95C9723C57B6C21DA2EFF2D5ED588BDD5717E212F9D", 0xFE48,
  799. NULL, 0,
  800. "208 bit binary curve from X9.62"
  801. };
  802. static const unsigned char _EC_X9_62_CHAR2_239V1_SEED[] = {
  803. 0xD3,0x4B,0x9A,0x4D,0x69,0x6E,0x67,0x68,0x75,0x61,
  804. 0x51,0x75,0xCA,0x71,0xB9,0x20,0xBF,0xEF,0xB0,0x5D};
  805. static const EC_CURVE_DATA _EC_X9_62_CHAR2_239V1 = {
  806. NID_X9_62_characteristic_two_field,
  807. "800000000000000000000000000000000000000000000000001000000001",
  808. "32010857077C5431123A46B808906756F543423E8D27877578125778AC76",
  809. "790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C16",
  810. "57927098FA932E7C0A96D3FD5B706EF7E5F5C156E16B7E7C86038552E91D",
  811. "61D8EE5077C33FECF6F1A16B268DE469C3C7744EA9A971649FC7A9616305",
  812. "2000000000000000000000000000000F4D42FFE1492A4993F1CAD666E447", 4,
  813. _EC_X9_62_CHAR2_239V1_SEED, 20,
  814. "239 bit binary curve from X9.62"
  815. };
  816. static const unsigned char _EC_X9_62_CHAR2_239V2_SEED[] = {
  817. 0x2A,0xA6,0x98,0x2F,0xDF,0xA4,0xD6,0x96,0xE6,0x76,
  818. 0x87,0x56,0x15,0x17,0x5D,0x26,0x67,0x27,0x27,0x7D};
  819. static const EC_CURVE_DATA _EC_X9_62_CHAR2_239V2 = {
  820. NID_X9_62_characteristic_two_field,
  821. "800000000000000000000000000000000000000000000000001000000001",
  822. "4230017757A767FAE42398569B746325D45313AF0766266479B75654E65F",
  823. "5037EA654196CFF0CD82B2C14A2FCF2E3FF8775285B545722F03EACDB74B",
  824. "28F9D04E900069C8DC47A08534FE76D2B900B7D7EF31F5709F200C4CA205",
  825. "5667334C45AFF3B5A03BAD9DD75E2C71A99362567D5453F7FA6E227EC833",
  826. "1555555555555555555555555555553C6F2885259C31E3FCDF154624522D", 6,
  827. _EC_X9_62_CHAR2_239V2_SEED, 20,
  828. "239 bit binary curve from X9.62"
  829. };
  830. static const unsigned char _EC_X9_62_CHAR2_239V3_SEED[] = {
  831. 0x9E,0x07,0x6F,0x4D,0x69,0x6E,0x67,0x68,0x75,0x61,
  832. 0x51,0x75,0xE1,0x1E,0x9F,0xDD,0x77,0xF9,0x20,0x41};
  833. static const EC_CURVE_DATA _EC_X9_62_CHAR2_239V3 = {
  834. NID_X9_62_characteristic_two_field,
  835. "800000000000000000000000000000000000000000000000001000000001",
  836. "01238774666A67766D6676F778E676B66999176666E687666D8766C66A9F",
  837. "6A941977BA9F6A435199ACFC51067ED587F519C5ECB541B8E44111DE1D40",
  838. "70F6E9D04D289C4E89913CE3530BFDE903977D42B146D539BF1BDE4E9C92",
  839. "2E5A0EAF6E5E1305B9004DCE5C0ED7FE59A35608F33837C816D80B79F461",
  840. "0CCCCCCCCCCCCCCCCCCCCCCCCCCCCCAC4912D2D9DF903EF9888B8A0E4CFF", 0xA,
  841. _EC_X9_62_CHAR2_239V3_SEED, 20,
  842. "239 bit binary curve from X9.62"
  843. };
  844. static const EC_CURVE_DATA _EC_X9_62_CHAR2_272W1 = {
  845. NID_X9_62_characteristic_two_field,
  846. "010000000000000000000000000000000000000000000000000000010000000000000"
  847. "B",
  848. "91A091F03B5FBA4AB2CCF49C4EDD220FB028712D42BE752B2C40094DBACDB586FB20",
  849. "7167EFC92BB2E3CE7C8AAAFF34E12A9C557003D7C73A6FAF003F99F6CC8482E540F7",
  850. "6108BABB2CEEBCF787058A056CBE0CFE622D7723A289E08A07AE13EF0D10D171DD8D",
  851. "10C7695716851EEF6BA7F6872E6142FBD241B830FF5EFCACECCAB05E02005DDE9D23",
  852. "000100FAF51354E0E39E4892DF6E319C72C8161603FA45AA7B998A167B8F1E629521",
  853. 0xFF06,
  854. NULL, 0,
  855. "272 bit binary curve from X9.62"
  856. };
  857. static const EC_CURVE_DATA _EC_X9_62_CHAR2_304W1 = {
  858. NID_X9_62_characteristic_two_field,
  859. "010000000000000000000000000000000000000000000000000000000000000000000"
  860. "000000807",
  861. "FD0D693149A118F651E6DCE6802085377E5F882D1B510B44160074C1288078365A039"
  862. "6C8E681",
  863. "BDDB97E555A50A908E43B01C798EA5DAA6788F1EA2794EFCF57166B8C14039601E558"
  864. "27340BE",
  865. "197B07845E9BE2D96ADB0F5F3C7F2CFFBD7A3EB8B6FEC35C7FD67F26DDF6285A644F7"
  866. "40A2614",
  867. "E19FBEB76E0DA171517ECF401B50289BF014103288527A9B416A105E80260B549FDC1"
  868. "B92C03B",
  869. "000101D556572AABAC800101D556572AABAC8001022D5C91DD173F8FB561DA6899164"
  870. "443051D", 0xFE2E,
  871. NULL, 0,
  872. "304 bit binary curve from X9.62"
  873. };
  874. static const unsigned char _EC_X9_62_CHAR2_359V1_SEED[] = {
  875. 0x2B,0x35,0x49,0x20,0xB7,0x24,0xD6,0x96,0xE6,0x76,
  876. 0x87,0x56,0x15,0x17,0x58,0x5B,0xA1,0x33,0x2D,0xC6};
  877. static const EC_CURVE_DATA _EC_X9_62_CHAR2_359V1 = {
  878. NID_X9_62_characteristic_two_field,
  879. "800000000000000000000000000000000000000000000000000000000000000000000"
  880. "000100000000000000001",
  881. "5667676A654B20754F356EA92017D946567C46675556F19556A04616B567D223A5E05"
  882. "656FB549016A96656A557",
  883. "2472E2D0197C49363F1FE7F5B6DB075D52B6947D135D8CA445805D39BC34562608968"
  884. "7742B6329E70680231988",
  885. "3C258EF3047767E7EDE0F1FDAA79DAEE3841366A132E163ACED4ED2401DF9C6BDCDE9"
  886. "8E8E707C07A2239B1B097",
  887. "53D7E08529547048121E9C95F3791DD804963948F34FAE7BF44EA82365DC7868FE57E"
  888. "4AE2DE211305A407104BD",
  889. "01AF286BCA1AF286BCA1AF286BCA1AF286BCA1AF286BC9FB8F6B85C556892C20A7EB9"
  890. "64FE7719E74F490758D3B", 0x4C,
  891. _EC_X9_62_CHAR2_359V1_SEED, 20,
  892. "359 bit binary curve from X9.62"
  893. };
  894. static const EC_CURVE_DATA _EC_X9_62_CHAR2_368W1 = {
  895. NID_X9_62_characteristic_two_field,
  896. "010000000000000000000000000000000000000000000000000000000000000000000"
  897. "0002000000000000000000007",
  898. "E0D2EE25095206F5E2A4F9ED229F1F256E79A0E2B455970D8D0D865BD94778C576D62"
  899. "F0AB7519CCD2A1A906AE30D",
  900. "FC1217D4320A90452C760A58EDCD30C8DD069B3C34453837A34ED50CB54917E1C2112"
  901. "D84D164F444F8F74786046A",
  902. "1085E2755381DCCCE3C1557AFA10C2F0C0C2825646C5B34A394CBCFA8BC16B22E7E78"
  903. "9E927BE216F02E1FB136A5F",
  904. "7B3EB1BDDCBA62D5D8B2059B525797FC73822C59059C623A45FF3843CEE8F87CD1855"
  905. "ADAA81E2A0750B80FDA2310",
  906. "00010090512DA9AF72B08349D98A5DD4C7B0532ECA51CE03E2D10F3B7AC579BD87E90"
  907. "9AE40A6F131E9CFCE5BD967", 0xFF70,
  908. NULL, 0,
  909. "368 bit binary curve from X9.62"
  910. };
  911. static const EC_CURVE_DATA _EC_X9_62_CHAR2_431R1 = {
  912. NID_X9_62_characteristic_two_field,
  913. "800000000000000000000000000000000000000000000000000000000000000000000"
  914. "000000001000000000000000000000000000001",
  915. "1A827EF00DD6FC0E234CAF046C6A5D8A85395B236CC4AD2CF32A0CADBDC9DDF620B0E"
  916. "B9906D0957F6C6FEACD615468DF104DE296CD8F",
  917. "10D9B4A3D9047D8B154359ABFB1B7F5485B04CEB868237DDC9DEDA982A679A5A919B6"
  918. "26D4E50A8DD731B107A9962381FB5D807BF2618",
  919. "120FC05D3C67A99DE161D2F4092622FECA701BE4F50F4758714E8A87BBF2A658EF8C2"
  920. "1E7C5EFE965361F6C2999C0C247B0DBD70CE6B7",
  921. "20D0AF8903A96F8D5FA2C255745D3C451B302C9346D9B7E485E7BCE41F6B591F3E8F6"
  922. "ADDCBB0BC4C2F947A7DE1A89B625D6A598B3760",
  923. "0340340340340340340340340340340340340340340340340340340323C313FAB5058"
  924. "9703B5EC68D3587FEC60D161CC149C1AD4A91", 0x2760,
  925. NULL, 0,
  926. "431 bit binary curve from X9.62"
  927. };
  928. static const EC_CURVE_DATA _EC_WTLS_1 = {
  929. NID_X9_62_characteristic_two_field,
  930. "020000000000000000000000000201",
  931. "1",
  932. "1",
  933. "01667979A40BA497E5D5C270780617",
  934. "00F44B4AF1ECC2630E08785CEBCC15",
  935. "00FFFFFFFFFFFFFFFDBF91AF6DEA73", 2,
  936. NULL, 0,
  937. "113 bit binary curve from the WTLS standard"
  938. };
  939. /* IPSec curves */
  940. /* NOTE: The of curves over a extension field of non prime degree
  941. * is not recommended (Weil-descent).
  942. * As the group order is not a prime this curve is not suitable
  943. * for ECDSA.
  944. */
  945. static const EC_CURVE_DATA _EC_IPSEC_155_ID3 = {
  946. NID_X9_62_characteristic_two_field,
  947. "0800000000000000000000004000000000000001",
  948. "0",
  949. "07338f",
  950. "7b",
  951. "1c8",
  952. "2AAAAAAAAAAAAAAAAAAC7F3C7881BD0868FA86C",3,
  953. NULL, 0,
  954. "\n\tIPSec/IKE/Oakley curve #3 over a 155 bit binary field.\n"
  955. "\tNot suitable for ECDSA.\n\tQuestionable extension field!"
  956. };
  957. /* NOTE: The of curves over a extension field of non prime degree
  958. * is not recommended (Weil-descent).
  959. * As the group order is not a prime this curve is not suitable
  960. * for ECDSA.
  961. */
  962. static const EC_CURVE_DATA _EC_IPSEC_185_ID4 = {
  963. NID_X9_62_characteristic_two_field,
  964. "020000000000000000000000000000200000000000000001",
  965. "0",
  966. "1ee9",
  967. "18",
  968. "0d",
  969. "FFFFFFFFFFFFFFFFFFFFFFEDF97C44DB9F2420BAFCA75E",2,
  970. NULL, 0,
  971. "\n\tIPSec/IKE/Oakley curve #4 over a 185 bit binary field.\n"
  972. "\tNot suitable for ECDSA.\n\tQuestionable extension field!"
  973. };
  974. typedef struct _ec_list_element_st {
  975. int nid;
  976. const EC_CURVE_DATA *data;
  977. } ec_list_element;
  978. static const ec_list_element curve_list[] = {
  979. /* prime field curves */
  980. /* secg curves */
  981. { NID_secp112r1, &_EC_SECG_PRIME_112R1},
  982. { NID_secp112r2, &_EC_SECG_PRIME_112R2},
  983. { NID_secp128r1, &_EC_SECG_PRIME_128R1},
  984. { NID_secp128r2, &_EC_SECG_PRIME_128R2},
  985. { NID_secp160k1, &_EC_SECG_PRIME_160K1},
  986. { NID_secp160r1, &_EC_SECG_PRIME_160R1},
  987. { NID_secp160r2, &_EC_SECG_PRIME_160R2},
  988. /* SECG secp192r1 is the same as X9.62 prime192v1 and hence omitted */
  989. { NID_secp192k1, &_EC_SECG_PRIME_192K1},
  990. { NID_secp224k1, &_EC_SECG_PRIME_224K1},
  991. { NID_secp224r1, &_EC_NIST_PRIME_224},
  992. { NID_secp256k1, &_EC_SECG_PRIME_256K1},
  993. /* SECG secp256r1 is the same as X9.62 prime256v1 and hence omitted */
  994. { NID_secp384r1, &_EC_NIST_PRIME_384},
  995. { NID_secp521r1, &_EC_NIST_PRIME_521},
  996. /* X9.62 curves */
  997. { NID_X9_62_prime192v1, &_EC_NIST_PRIME_192},
  998. { NID_X9_62_prime192v2, &_EC_X9_62_PRIME_192V2},
  999. { NID_X9_62_prime192v3, &_EC_X9_62_PRIME_192V3},
  1000. { NID_X9_62_prime239v1, &_EC_X9_62_PRIME_239V1},
  1001. { NID_X9_62_prime239v2, &_EC_X9_62_PRIME_239V2},
  1002. { NID_X9_62_prime239v3, &_EC_X9_62_PRIME_239V3},
  1003. { NID_X9_62_prime256v1, &_EC_X9_62_PRIME_256V1},
  1004. /* characteristic two field curves */
  1005. /* secg curves */
  1006. { NID_sect113r1, &_EC_SECG_CHAR2_113R1},
  1007. { NID_sect113r2, &_EC_SECG_CHAR2_113R2},
  1008. { NID_sect131r1, &_EC_SECG_CHAR2_131R1},
  1009. { NID_sect131r2, &_EC_SECG_CHAR2_131R2},
  1010. { NID_sect163k1, &_EC_SECG_CHAR2_163K1},
  1011. { NID_sect163r1, &_EC_SECG_CHAR2_163R1},
  1012. { NID_sect163r2, &_EC_SECG_CHAR2_163R2},
  1013. { NID_sect193r1, &_EC_SECG_CHAR2_193R1},
  1014. { NID_sect193r2, &_EC_SECG_CHAR2_193R2},
  1015. { NID_sect233k1, &_EC_SECG_CHAR2_233K1},
  1016. { NID_sect233r1, &_EC_SECG_CHAR2_233R1},
  1017. { NID_sect239k1, &_EC_SECG_CHAR2_239K1},
  1018. { NID_sect283k1, &_EC_SECG_CHAR2_283K1},
  1019. { NID_sect283r1, &_EC_SECG_CHAR2_283R1},
  1020. { NID_sect409k1, &_EC_SECG_CHAR2_409K1},
  1021. { NID_sect409r1, &_EC_SECG_CHAR2_409R1},
  1022. { NID_sect571k1, &_EC_SECG_CHAR2_571K1},
  1023. { NID_sect571r1, &_EC_SECG_CHAR2_571R1},
  1024. /* X9.62 curves */
  1025. { NID_X9_62_c2pnb163v1, &_EC_X9_62_CHAR2_163V1},
  1026. { NID_X9_62_c2pnb163v2, &_EC_X9_62_CHAR2_163V2},
  1027. { NID_X9_62_c2pnb163v3, &_EC_X9_62_CHAR2_163V3},
  1028. { NID_X9_62_c2pnb176v1, &_EC_X9_62_CHAR2_176V1},
  1029. { NID_X9_62_c2tnb191v1, &_EC_X9_62_CHAR2_191V1},
  1030. { NID_X9_62_c2tnb191v2, &_EC_X9_62_CHAR2_191V2},
  1031. { NID_X9_62_c2tnb191v3, &_EC_X9_62_CHAR2_191V3},
  1032. { NID_X9_62_c2pnb208w1, &_EC_X9_62_CHAR2_208W1},
  1033. { NID_X9_62_c2tnb239v1, &_EC_X9_62_CHAR2_239V1},
  1034. { NID_X9_62_c2tnb239v2, &_EC_X9_62_CHAR2_239V2},
  1035. { NID_X9_62_c2tnb239v3, &_EC_X9_62_CHAR2_239V3},
  1036. { NID_X9_62_c2pnb272w1, &_EC_X9_62_CHAR2_272W1},
  1037. { NID_X9_62_c2pnb304w1, &_EC_X9_62_CHAR2_304W1},
  1038. { NID_X9_62_c2tnb359v1, &_EC_X9_62_CHAR2_359V1},
  1039. { NID_X9_62_c2pnb368w1, &_EC_X9_62_CHAR2_368W1},
  1040. { NID_X9_62_c2tnb431r1, &_EC_X9_62_CHAR2_431R1},
  1041. /* the WAP/WTLS curves */
  1042. { NID_wap_wsg_idm_ecid_wtls1, &_EC_WTLS_1},
  1043. { NID_wap_wsg_idm_ecid_wtls3, &_EC_SECG_CHAR2_163K1},
  1044. { NID_wap_wsg_idm_ecid_wtls4, &_EC_SECG_CHAR2_113R1},
  1045. { NID_wap_wsg_idm_ecid_wtls5, &_EC_X9_62_CHAR2_163V1},
  1046. { NID_wap_wsg_idm_ecid_wtls6, &_EC_SECG_PRIME_112R1},
  1047. { NID_wap_wsg_idm_ecid_wtls7, &_EC_SECG_PRIME_160R2},
  1048. { NID_wap_wsg_idm_ecid_wtls8, &_EC_WTLS_8},
  1049. { NID_wap_wsg_idm_ecid_wtls9, &_EC_WTLS_9 },
  1050. { NID_wap_wsg_idm_ecid_wtls10, &_EC_SECG_CHAR2_233K1},
  1051. { NID_wap_wsg_idm_ecid_wtls11, &_EC_SECG_CHAR2_233R1},
  1052. { NID_wap_wsg_idm_ecid_wtls12, &_EC_WTLS_12},
  1053. /* IPSec curves */
  1054. { NID_ipsec3, &_EC_IPSEC_155_ID3},
  1055. { NID_ipsec4, &_EC_IPSEC_185_ID4},
  1056. };
  1057. static size_t curve_list_length = sizeof(curve_list)/sizeof(ec_list_element);
  1058. static EC_GROUP *ec_group_new_from_data(const EC_CURVE_DATA *data)
  1059. {
  1060. EC_GROUP *group=NULL;
  1061. EC_POINT *P=NULL;
  1062. BN_CTX *ctx=NULL;
  1063. BIGNUM *p=NULL, *a=NULL, *b=NULL, *x=NULL, *y=NULL, *order=NULL;
  1064. int ok=0;
  1065. if ((ctx = BN_CTX_new()) == NULL)
  1066. {
  1067. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_MALLOC_FAILURE);
  1068. goto err;
  1069. }
  1070. if ((p = BN_new()) == NULL || (a = BN_new()) == NULL ||
  1071. (b = BN_new()) == NULL || (x = BN_new()) == NULL ||
  1072. (y = BN_new()) == NULL || (order = BN_new()) == NULL)
  1073. {
  1074. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_MALLOC_FAILURE);
  1075. goto err;
  1076. }
  1077. if (!BN_hex2bn(&p, data->p) || !BN_hex2bn(&a, data->a)
  1078. || !BN_hex2bn(&b, data->b))
  1079. {
  1080. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB);
  1081. goto err;
  1082. }
  1083. if (data->field_type == NID_X9_62_prime_field)
  1084. {
  1085. if ((group = EC_GROUP_new_curve_GFp(p, a, b, ctx)) == NULL)
  1086. {
  1087. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
  1088. goto err;
  1089. }
  1090. }
  1091. else
  1092. { /* field_type == NID_X9_62_characteristic_two_field */
  1093. if ((group = EC_GROUP_new_curve_GF2m(p, a, b, ctx)) == NULL)
  1094. {
  1095. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
  1096. goto err;
  1097. }
  1098. }
  1099. if ((P = EC_POINT_new(group)) == NULL)
  1100. {
  1101. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
  1102. goto err;
  1103. }
  1104. if (!BN_hex2bn(&x, data->x) || !BN_hex2bn(&y, data->y))
  1105. {
  1106. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB);
  1107. goto err;
  1108. }
  1109. if (!EC_POINT_set_affine_coordinates_GF2m(group, P, x, y, ctx))
  1110. {
  1111. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
  1112. goto err;
  1113. }
  1114. if (!BN_hex2bn(&order, data->order) || !BN_set_word(x, data->cofactor))
  1115. {
  1116. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB);
  1117. goto err;
  1118. }
  1119. if (!EC_GROUP_set_generator(group, P, order, x))
  1120. {
  1121. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
  1122. goto err;
  1123. }
  1124. if (data->seed)
  1125. {
  1126. if (!EC_GROUP_set_seed(group, data->seed, data->seed_len))
  1127. {
  1128. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
  1129. goto err;
  1130. }
  1131. }
  1132. ok=1;
  1133. err:
  1134. if (!ok)
  1135. {
  1136. EC_GROUP_free(group);
  1137. group = NULL;
  1138. }
  1139. if (P)
  1140. EC_POINT_free(P);
  1141. if (ctx)
  1142. BN_CTX_free(ctx);
  1143. if (p)
  1144. BN_free(p);
  1145. if (a)
  1146. BN_free(a);
  1147. if (b)
  1148. BN_free(b);
  1149. if (order)
  1150. BN_free(order);
  1151. if (x)
  1152. BN_free(x);
  1153. if (y)
  1154. BN_free(y);
  1155. return group;
  1156. }
  1157. EC_GROUP *EC_GROUP_new_by_nid(int nid)
  1158. {
  1159. size_t i;
  1160. EC_GROUP *ret = NULL;
  1161. if (nid <= 0)
  1162. return NULL;
  1163. for (i=0; i<curve_list_length; i++)
  1164. if (curve_list[i].nid == nid)
  1165. {
  1166. ret = ec_group_new_from_data(curve_list[i].data);
  1167. break;
  1168. }
  1169. if (ret == NULL)
  1170. {
  1171. ECerr(EC_F_EC_GROUP_NEW_BY_NID, EC_R_UNKNOWN_GROUP);
  1172. return NULL;
  1173. }
  1174. EC_GROUP_set_nid(ret, nid);
  1175. return ret;
  1176. }
  1177. size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems)
  1178. {
  1179. size_t i, min;
  1180. if (r == NULL || nitems == 0)
  1181. return curve_list_length;
  1182. min = nitems < curve_list_length ? nitems : curve_list_length;
  1183. for (i = 0; i < min; i++)
  1184. {
  1185. r[i].nid = curve_list[i].nid;
  1186. r[i].comment = curve_list[i].data->comment;
  1187. }
  1188. return curve_list_length;
  1189. }