2
0

ec_curve.c 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270
  1. /* crypto/ec/ec_curve.c */
  2. /*
  3. * Written by Nils Larsch for the OpenSSL project.
  4. */
  5. /* ====================================================================
  6. * Copyright (c) 1998-2004 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. "NIST/X9.62/SECG curve over a 192 bit prime field"
  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. "NIST/SECG 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. "NIST/SECG 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. "NIST/SECG 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. "X9.62 curve over a 192 bit prime field"
  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. "X9.62 curve over a 192 bit prime field"
  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. "X9.62 curve over a 239 bit prime field"
  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. "X9.62 curve over a 239 bit prime field"
  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. "X9.62 curve over a 239 bit prime field"
  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. "X9.62/SECG curve over a 256 bit prime field"
  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 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 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 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 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 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 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 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 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 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 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. "WTLS curve over a 112 bit prime field"
  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. "WTLS curve over a 160 bit prime field"
  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. "WTLS curvs over a 224 bit prime field"
  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 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 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 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 curve over a 131 bit binary field"
  462. };
  463. static const EC_CURVE_DATA _EC_NIST_CHAR2_163K = {
  464. NID_X9_62_characteristic_two_field,
  465. "0800000000000000000000000000000000000000C9",
  466. "1",
  467. "1",
  468. "02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8",
  469. "0289070FB05D38FF58321F2E800536D538CCDAA3D9",
  470. "04000000000000000000020108A2E0CC0D99F8A5EF", 2,
  471. NULL, 0,
  472. "NIST/SECG/WTLS 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 curve over a 163 bit binary field"
  495. };
  496. static const unsigned char _EC_NIST_CHAR2_163B_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_NIST_CHAR2_163B ={
  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_NIST_CHAR2_163B_SEED, 20,
  512. #else
  513. NULL, 0,
  514. #endif
  515. "NIST/SECG 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 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 curve over a 193 bit binary field"
  544. };
  545. static const EC_CURVE_DATA _EC_NIST_CHAR2_233K = {
  546. NID_X9_62_characteristic_two_field,
  547. "020000000000000000000000000000000000000004000000000000000001",
  548. "0",
  549. "1",
  550. "017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126",
  551. "01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3",
  552. "008000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF", 4,
  553. NULL, 0,
  554. "NIST/SECG/WTLS curve over a 233 bit binary field"
  555. };
  556. static const unsigned char _EC_NIST_CHAR2_233B_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_NIST_CHAR2_233B = {
  560. NID_X9_62_characteristic_two_field,
  561. "020000000000000000000000000000000000000004000000000000000001",
  562. "000000000000000000000000000000000000000000000000000000000001",
  563. "0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD",
  564. "00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B",
  565. "01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052",
  566. "01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7", 2,
  567. _EC_NIST_CHAR2_233B_SEED, 20,
  568. "NIST/SECG/WTLS 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 curve over a 239 bit binary field"
  580. };
  581. static const EC_CURVE_DATA _EC_NIST_CHAR2_283K = {
  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. "NIST/SECG curve over a 283 bit binary field"
  595. };
  596. static const unsigned char _EC_NIST_CHAR2_283B_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_NIST_CHAR2_283B = {
  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_NIST_CHAR2_283B_SEED, 20,
  614. "NIST/SECG curve over a 283 bit binary field"
  615. };
  616. static const EC_CURVE_DATA _EC_NIST_CHAR2_409K = {
  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. "NIST/SECG curve over a 409 bit binary field"
  630. };
  631. static const unsigned char _EC_NIST_CHAR2_409B_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_NIST_CHAR2_409B = {
  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_NIST_CHAR2_409B_SEED, 20,
  649. "NIST/SECG curve over a 409 bit binary field"
  650. };
  651. static const EC_CURVE_DATA _EC_NIST_CHAR2_571K = {
  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. "NIST/SECG curve over a 571 bit binary field"
  669. };
  670. static const unsigned char _EC_NIST_CHAR2_571B_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_NIST_CHAR2_571B = {
  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_NIST_CHAR2_571B_SEED, 20,
  694. "NIST/SECG 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. "X9.62 curve over a 163 bit binary field"
  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. "X9.62 curve over a 163 bit binary field"
  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. "X9.62 curve over a 163 bit binary field"
  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. "X9.62 curve over a 176 bit binary field"
  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. "X9.62 curve over a 191 bit binary field"
  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. "X9.62 curve over a 191 bit binary field"
  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. "X9.62 curve over a 191 bit binary field"
  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. "X9.62 curve over a 208 bit binary field"
  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. "X9.62 curve over a 239 bit binary field"
  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. "X9.62 curve over a 239 bit binary field"
  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. "X9.62 curve over a 239 bit binary field"
  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. "X9.62 curve over a 272 bit binary field"
  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. "X9.62 curve over a 304 bit binary field"
  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. "X9.62 curve over a 359 bit binary field"
  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. "X9.62 curve over a 368 bit binary field"
  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. "X9.62 curve over a 431 bit binary field"
  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. "WTLS curve over a 113 bit binary field"
  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. /* NIST/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_NIST_CHAR2_163K },
  1011. { NID_sect163r1, &_EC_SECG_CHAR2_163R1},
  1012. { NID_sect163r2, &_EC_NIST_CHAR2_163B },
  1013. { NID_sect193r1, &_EC_SECG_CHAR2_193R1},
  1014. { NID_sect193r2, &_EC_SECG_CHAR2_193R2},
  1015. { NID_sect233k1, &_EC_NIST_CHAR2_233K },
  1016. { NID_sect233r1, &_EC_NIST_CHAR2_233B },
  1017. { NID_sect239k1, &_EC_SECG_CHAR2_239K1},
  1018. { NID_sect283k1, &_EC_NIST_CHAR2_283K },
  1019. { NID_sect283r1, &_EC_NIST_CHAR2_283B },
  1020. { NID_sect409k1, &_EC_NIST_CHAR2_409K },
  1021. { NID_sect409r1, &_EC_NIST_CHAR2_409B },
  1022. { NID_sect571k1, &_EC_NIST_CHAR2_571K },
  1023. { NID_sect571r1, &_EC_NIST_CHAR2_571B },
  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. * [unlike SECG, spec has its own OIDs for curves from X9.62] */
  1043. { NID_wap_wsg_idm_ecid_wtls1, &_EC_WTLS_1},
  1044. { NID_wap_wsg_idm_ecid_wtls3, &_EC_NIST_CHAR2_163K},
  1045. { NID_wap_wsg_idm_ecid_wtls4, &_EC_SECG_CHAR2_113R1},
  1046. { NID_wap_wsg_idm_ecid_wtls5, &_EC_X9_62_CHAR2_163V1},
  1047. { NID_wap_wsg_idm_ecid_wtls6, &_EC_SECG_PRIME_112R1},
  1048. { NID_wap_wsg_idm_ecid_wtls7, &_EC_SECG_PRIME_160R2},
  1049. { NID_wap_wsg_idm_ecid_wtls8, &_EC_WTLS_8},
  1050. { NID_wap_wsg_idm_ecid_wtls9, &_EC_WTLS_9 },
  1051. { NID_wap_wsg_idm_ecid_wtls10, &_EC_NIST_CHAR2_233K},
  1052. { NID_wap_wsg_idm_ecid_wtls11, &_EC_NIST_CHAR2_233B},
  1053. { NID_wap_wsg_idm_ecid_wtls12, &_EC_WTLS_12},
  1054. /* IPSec curves */
  1055. { NID_ipsec3, &_EC_IPSEC_155_ID3},
  1056. { NID_ipsec4, &_EC_IPSEC_185_ID4},
  1057. };
  1058. static size_t curve_list_length = sizeof(curve_list)/sizeof(ec_list_element);
  1059. static EC_GROUP *ec_group_new_from_data(const EC_CURVE_DATA *data)
  1060. {
  1061. EC_GROUP *group=NULL;
  1062. EC_POINT *P=NULL;
  1063. BN_CTX *ctx=NULL;
  1064. BIGNUM *p=NULL, *a=NULL, *b=NULL, *x=NULL, *y=NULL, *order=NULL;
  1065. int ok=0;
  1066. if ((ctx = BN_CTX_new()) == NULL)
  1067. {
  1068. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_MALLOC_FAILURE);
  1069. goto err;
  1070. }
  1071. if ((p = BN_new()) == NULL || (a = BN_new()) == NULL ||
  1072. (b = BN_new()) == NULL || (x = BN_new()) == NULL ||
  1073. (y = BN_new()) == NULL || (order = BN_new()) == NULL)
  1074. {
  1075. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_MALLOC_FAILURE);
  1076. goto err;
  1077. }
  1078. if (!BN_hex2bn(&p, data->p) || !BN_hex2bn(&a, data->a)
  1079. || !BN_hex2bn(&b, data->b))
  1080. {
  1081. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB);
  1082. goto err;
  1083. }
  1084. if (data->field_type == NID_X9_62_prime_field)
  1085. {
  1086. if ((group = EC_GROUP_new_curve_GFp(p, a, b, ctx)) == NULL)
  1087. {
  1088. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
  1089. goto err;
  1090. }
  1091. }
  1092. else
  1093. { /* field_type == NID_X9_62_characteristic_two_field */
  1094. if ((group = EC_GROUP_new_curve_GF2m(p, a, b, ctx)) == NULL)
  1095. {
  1096. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
  1097. goto err;
  1098. }
  1099. }
  1100. if ((P = EC_POINT_new(group)) == NULL)
  1101. {
  1102. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
  1103. goto err;
  1104. }
  1105. if (!BN_hex2bn(&x, data->x) || !BN_hex2bn(&y, data->y))
  1106. {
  1107. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB);
  1108. goto err;
  1109. }
  1110. if (!EC_POINT_set_affine_coordinates_GF2m(group, P, x, y, ctx))
  1111. {
  1112. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
  1113. goto err;
  1114. }
  1115. if (!BN_hex2bn(&order, data->order) || !BN_set_word(x, data->cofactor))
  1116. {
  1117. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB);
  1118. goto err;
  1119. }
  1120. if (!EC_GROUP_set_generator(group, P, order, x))
  1121. {
  1122. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
  1123. goto err;
  1124. }
  1125. if (data->seed)
  1126. {
  1127. if (!EC_GROUP_set_seed(group, data->seed, data->seed_len))
  1128. {
  1129. ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
  1130. goto err;
  1131. }
  1132. }
  1133. ok=1;
  1134. err:
  1135. if (!ok)
  1136. {
  1137. EC_GROUP_free(group);
  1138. group = NULL;
  1139. }
  1140. if (P)
  1141. EC_POINT_free(P);
  1142. if (ctx)
  1143. BN_CTX_free(ctx);
  1144. if (p)
  1145. BN_free(p);
  1146. if (a)
  1147. BN_free(a);
  1148. if (b)
  1149. BN_free(b);
  1150. if (order)
  1151. BN_free(order);
  1152. if (x)
  1153. BN_free(x);
  1154. if (y)
  1155. BN_free(y);
  1156. return group;
  1157. }
  1158. EC_GROUP *EC_GROUP_new_by_curve_name(int nid)
  1159. {
  1160. size_t i;
  1161. EC_GROUP *ret = NULL;
  1162. if (nid <= 0)
  1163. return NULL;
  1164. for (i=0; i<curve_list_length; i++)
  1165. if (curve_list[i].nid == nid)
  1166. {
  1167. ret = ec_group_new_from_data(curve_list[i].data);
  1168. break;
  1169. }
  1170. if (ret == NULL)
  1171. {
  1172. ECerr(EC_F_EC_GROUP_NEW_BY_CURVE_NAME, EC_R_UNKNOWN_GROUP);
  1173. return NULL;
  1174. }
  1175. EC_GROUP_set_curve_name(ret, nid);
  1176. return ret;
  1177. }
  1178. size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems)
  1179. {
  1180. size_t i, min;
  1181. if (r == NULL || nitems == 0)
  1182. return curve_list_length;
  1183. min = nitems < curve_list_length ? nitems : curve_list_length;
  1184. for (i = 0; i < min; i++)
  1185. {
  1186. r[i].nid = curve_list[i].nid;
  1187. r[i].comment = curve_list[i].data->comment;
  1188. }
  1189. return curve_list_length;
  1190. }