xref: /openbsd-src/lib/libcrypto/ec/ec_curve.c (revision 116d34ffbe7bd5d93f2123429eb2bc59adff239f)
1*116d34ffStb /* $OpenBSD: ec_curve.c,v 1.53 2024/12/24 18:33:24 tb Exp $ */
25650a0e1Sdjm /*
35650a0e1Sdjm  * Written by Nils Larsch for the OpenSSL project.
45650a0e1Sdjm  */
55650a0e1Sdjm /* ====================================================================
6ec07fdf1Sdjm  * Copyright (c) 1998-2010 The OpenSSL Project.  All rights reserved.
75650a0e1Sdjm  *
85650a0e1Sdjm  * Redistribution and use in source and binary forms, with or without
95650a0e1Sdjm  * modification, are permitted provided that the following conditions
105650a0e1Sdjm  * are met:
115650a0e1Sdjm  *
125650a0e1Sdjm  * 1. Redistributions of source code must retain the above copyright
135650a0e1Sdjm  *    notice, this list of conditions and the following disclaimer.
145650a0e1Sdjm  *
155650a0e1Sdjm  * 2. Redistributions in binary form must reproduce the above copyright
165650a0e1Sdjm  *    notice, this list of conditions and the following disclaimer in
175650a0e1Sdjm  *    the documentation and/or other materials provided with the
185650a0e1Sdjm  *    distribution.
195650a0e1Sdjm  *
205650a0e1Sdjm  * 3. All advertising materials mentioning features or use of this
215650a0e1Sdjm  *    software must display the following acknowledgment:
225650a0e1Sdjm  *    "This product includes software developed by the OpenSSL Project
235650a0e1Sdjm  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
245650a0e1Sdjm  *
255650a0e1Sdjm  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
265650a0e1Sdjm  *    endorse or promote products derived from this software without
275650a0e1Sdjm  *    prior written permission. For written permission, please contact
285650a0e1Sdjm  *    openssl-core@openssl.org.
295650a0e1Sdjm  *
305650a0e1Sdjm  * 5. Products derived from this software may not be called "OpenSSL"
315650a0e1Sdjm  *    nor may "OpenSSL" appear in their names without prior written
325650a0e1Sdjm  *    permission of the OpenSSL Project.
335650a0e1Sdjm  *
345650a0e1Sdjm  * 6. Redistributions of any form whatsoever must retain the following
355650a0e1Sdjm  *    acknowledgment:
365650a0e1Sdjm  *    "This product includes software developed by the OpenSSL Project
375650a0e1Sdjm  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
385650a0e1Sdjm  *
395650a0e1Sdjm  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
405650a0e1Sdjm  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
415650a0e1Sdjm  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
425650a0e1Sdjm  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
435650a0e1Sdjm  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
445650a0e1Sdjm  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
455650a0e1Sdjm  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
465650a0e1Sdjm  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
475650a0e1Sdjm  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
485650a0e1Sdjm  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
495650a0e1Sdjm  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
505650a0e1Sdjm  * OF THE POSSIBILITY OF SUCH DAMAGE.
515650a0e1Sdjm  * ====================================================================
525650a0e1Sdjm  *
535650a0e1Sdjm  * This product includes cryptographic software written by Eric Young
545650a0e1Sdjm  * (eay@cryptsoft.com).  This product includes software written by Tim
555650a0e1Sdjm  * Hudson (tjh@cryptsoft.com).
565650a0e1Sdjm  *
575650a0e1Sdjm  */
585650a0e1Sdjm /* ====================================================================
595650a0e1Sdjm  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
605650a0e1Sdjm  *
615650a0e1Sdjm  * Portions of the attached software ("Contribution") are developed by
625650a0e1Sdjm  * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
635650a0e1Sdjm  *
645650a0e1Sdjm  * The Contribution is licensed pursuant to the OpenSSL open source
655650a0e1Sdjm  * license provided above.
665650a0e1Sdjm  *
675650a0e1Sdjm  * The elliptic curve binary polynomial software is originally written by
685650a0e1Sdjm  * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories.
695650a0e1Sdjm  *
705650a0e1Sdjm  */
715650a0e1Sdjm 
729a0568b2Stb #include <limits.h>
73ba32a306Stb #include <stdint.h>
74ba32a306Stb #include <stdlib.h>
75bdb7dc21Sjsing #include <string.h>
76bdb7dc21Sjsing 
778cf4d6a6Sjsing #include <openssl/opensslconf.h>
788cf4d6a6Sjsing 
79ba32a306Stb #include <openssl/bn.h>
80ba32a306Stb #include <openssl/ec.h>
815650a0e1Sdjm #include <openssl/err.h>
829e45fc42Stb #include <openssl/objects.h>
839e45fc42Stb 
84c9675a23Stb #include "ec_local.h"
855650a0e1Sdjm 
86f67ac449Stedu static const struct {
8759919d1cStb 	uint8_t seed[20];
8859919d1cStb 	uint8_t p[28];
8959919d1cStb 	uint8_t a[28];
9059919d1cStb 	uint8_t b[28];
9159919d1cStb 	uint8_t x[28];
9259919d1cStb 	uint8_t y[28];
9359919d1cStb 	uint8_t order[28];
9459919d1cStb } _EC_NIST_PRIME_224 = {
9559919d1cStb 	.seed = {
96ecf6283eStb 		0xbd, 0x71, 0x34, 0x47, 0x99, 0xd5, 0xc7, 0xfc, 0xdc, 0x45,
97ecf6283eStb 		0xb5, 0x9f, 0xa3, 0xb9, 0xab, 0x8f, 0x6a, 0x94, 0x8b, 0xc5,
9859919d1cStb 	},
9959919d1cStb 	.p = {
100ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
101ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
102f1535dc8Sdjm 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
10359919d1cStb 	},
10459919d1cStb 	.a = {
105ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
106ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
107ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
10859919d1cStb 	},
10959919d1cStb 	.b = {
110ecf6283eStb 		0xb4, 0x05, 0x0a, 0x85, 0x0c, 0x04, 0xb3, 0xab, 0xf5, 0x41,
111ecf6283eStb 		0x32, 0x56, 0x50, 0x44, 0xb0, 0xb7, 0xd7, 0xbf, 0xd8, 0xba,
112ecf6283eStb 		0x27, 0x0b, 0x39, 0x43, 0x23, 0x55, 0xff, 0xb4,
11359919d1cStb 	},
11459919d1cStb 	.x = {
115ecf6283eStb 		0xb7, 0x0e, 0x0c, 0xbd, 0x6b, 0xb4, 0xbf, 0x7f, 0x32, 0x13,
116ecf6283eStb 		0x90, 0xb9, 0x4a, 0x03, 0xc1, 0xd3, 0x56, 0xc2, 0x11, 0x22,
117ecf6283eStb 		0x34, 0x32, 0x80, 0xd6, 0x11, 0x5c, 0x1d, 0x21,
11859919d1cStb 	},
11959919d1cStb 	.y = {
12001938560Stb 		0xbd, 0x37, 0x63, 0x88, 0xb5, 0xf7, 0x23, 0xfb, 0x4c, 0x22,
121f1535dc8Sdjm 		0xdf, 0xe6, 0xcd, 0x43, 0x75, 0xa0, 0x5a, 0x07, 0x47, 0x64,
122f1535dc8Sdjm 		0x44, 0xd5, 0x81, 0x99, 0x85, 0x00, 0x7e, 0x34,
12359919d1cStb 	},
12459919d1cStb 	.order = {
125ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
126ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0x16, 0xa2, 0xe0, 0xb8, 0xf0, 0x3e,
127ecf6283eStb 		0x13, 0xdd, 0x29, 0x45, 0x5c, 0x5c, 0x2a, 0x3d,
12859919d1cStb 	},
1295650a0e1Sdjm };
1305650a0e1Sdjm 
131f67ac449Stedu static const struct {
13259919d1cStb 	uint8_t seed[20];
13359919d1cStb 	uint8_t p[48];
13459919d1cStb 	uint8_t a[48];
13559919d1cStb 	uint8_t b[48];
13659919d1cStb 	uint8_t x[48];
13759919d1cStb 	uint8_t y[48];
13859919d1cStb 	uint8_t order[48];
13959919d1cStb } _EC_NIST_PRIME_384 = {
14059919d1cStb 	.seed = {
141ecf6283eStb 		0xa3, 0x35, 0x92, 0x6a, 0xa3, 0x19, 0xa2, 0x7a, 0x1d, 0x00,
142ecf6283eStb 		0x89, 0x6a, 0x67, 0x73, 0xa4, 0x82, 0x7a, 0xcd, 0xac, 0x73,
14359919d1cStb 	},
14459919d1cStb 	.p = {
145ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
146ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
147ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
148ecf6283eStb 		0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
149ecf6283eStb 		0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
15059919d1cStb 	},
15159919d1cStb 	.a = {
152ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
153ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
154ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
155ecf6283eStb 		0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
156ecf6283eStb 		0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc,
15759919d1cStb 	},
15859919d1cStb 	.b = {
159ecf6283eStb 		0xb3, 0x31, 0x2f, 0xa7, 0xe2, 0x3e, 0xe7, 0xe4, 0x98, 0x8e,
160ecf6283eStb 		0x05, 0x6b, 0xe3, 0xf8, 0x2d, 0x19, 0x18, 0x1d, 0x9c, 0x6e,
161ecf6283eStb 		0xfe, 0x81, 0x41, 0x12, 0x03, 0x14, 0x08, 0x8f, 0x50, 0x13,
162ecf6283eStb 		0x87, 0x5a, 0xc6, 0x56, 0x39, 0x8d, 0x8a, 0x2e, 0xd1, 0x9d,
163ecf6283eStb 		0x2a, 0x85, 0xc8, 0xed, 0xd3, 0xec, 0x2a, 0xef,
16459919d1cStb 	},
16559919d1cStb 	.x = {
166ecf6283eStb 		0xaa, 0x87, 0xca, 0x22, 0xbe, 0x8b, 0x05, 0x37, 0x8e, 0xb1,
167ecf6283eStb 		0xc7, 0x1e, 0xf3, 0x20, 0xad, 0x74, 0x6e, 0x1d, 0x3b, 0x62,
168ecf6283eStb 		0x8b, 0xa7, 0x9b, 0x98, 0x59, 0xf7, 0x41, 0xe0, 0x82, 0x54,
169ecf6283eStb 		0x2a, 0x38, 0x55, 0x02, 0xf2, 0x5d, 0xbf, 0x55, 0x29, 0x6c,
170ecf6283eStb 		0x3a, 0x54, 0x5e, 0x38, 0x72, 0x76, 0x0a, 0xb7,
17159919d1cStb 	},
17259919d1cStb 	.y = {
17301938560Stb 		0x36, 0x17, 0xde, 0x4a, 0x96, 0x26, 0x2c, 0x6f, 0x5d, 0x9e,
174f1535dc8Sdjm 		0x98, 0xbf, 0x92, 0x92, 0xdc, 0x29, 0xf8, 0xf4, 0x1d, 0xbd,
175f1535dc8Sdjm 		0x28, 0x9a, 0x14, 0x7c, 0xe9, 0xda, 0x31, 0x13, 0xb5, 0xf0,
176f1535dc8Sdjm 		0xb8, 0xc0, 0x0a, 0x60, 0xb1, 0xce, 0x1d, 0x7e, 0x81, 0x9d,
177f1535dc8Sdjm 		0x7a, 0x43, 0x1d, 0x7c, 0x90, 0xea, 0x0e, 0x5f,
17859919d1cStb 	},
17959919d1cStb 	.order = {
180ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
181ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
182ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xc7, 0x63, 0x4d, 0x81, 0xf4, 0x37,
183ecf6283eStb 		0x2d, 0xdf, 0x58, 0x1a, 0x0d, 0xb2, 0x48, 0xb0, 0xa7, 0x7a,
184ecf6283eStb 		0xec, 0xec, 0x19, 0x6a, 0xcc, 0xc5, 0x29, 0x73,
18559919d1cStb 	},
1865650a0e1Sdjm };
1875650a0e1Sdjm 
188f67ac449Stedu static const struct {
18959919d1cStb 	uint8_t seed[20];
19059919d1cStb 	uint8_t p[66];
19159919d1cStb 	uint8_t a[66];
19259919d1cStb 	uint8_t b[66];
19359919d1cStb 	uint8_t x[66];
19459919d1cStb 	uint8_t y[66];
19559919d1cStb 	uint8_t order[66];
19659919d1cStb } _EC_NIST_PRIME_521 = {
19759919d1cStb 	.seed = {
198ecf6283eStb 		0xd0, 0x9e, 0x88, 0x00, 0x29, 0x1c, 0xb8, 0x53, 0x96, 0xcc,
199ecf6283eStb 		0x67, 0x17, 0x39, 0x32, 0x84, 0xaa, 0xa0, 0xda, 0x64, 0xba,
20059919d1cStb 	},
20159919d1cStb 	.p = {
202ecf6283eStb 		0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
203ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
204ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
205ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
206ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
207ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
208ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
20959919d1cStb 	},
21059919d1cStb 	.a = {
211ecf6283eStb 		0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
212ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
213ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
214ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
215ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
216ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
217ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
21859919d1cStb 	},
21959919d1cStb 	.b = {
220ecf6283eStb 		0x00, 0x51, 0x95, 0x3e, 0xb9, 0x61, 0x8e, 0x1c, 0x9a, 0x1f,
221ecf6283eStb 		0x92, 0x9a, 0x21, 0xa0, 0xb6, 0x85, 0x40, 0xee, 0xa2, 0xda,
222ecf6283eStb 		0x72, 0x5b, 0x99, 0xb3, 0x15, 0xf3, 0xb8, 0xb4, 0x89, 0x91,
223ecf6283eStb 		0x8e, 0xf1, 0x09, 0xe1, 0x56, 0x19, 0x39, 0x51, 0xec, 0x7e,
224ecf6283eStb 		0x93, 0x7b, 0x16, 0x52, 0xc0, 0xbd, 0x3b, 0xb1, 0xbf, 0x07,
225ecf6283eStb 		0x35, 0x73, 0xdf, 0x88, 0x3d, 0x2c, 0x34, 0xf1, 0xef, 0x45,
226ecf6283eStb 		0x1f, 0xd4, 0x6b, 0x50, 0x3f, 0x00,
22759919d1cStb 	},
22859919d1cStb 	.x = {
229ecf6283eStb 		0x00, 0xc6, 0x85, 0x8e, 0x06, 0xb7, 0x04, 0x04, 0xe9, 0xcd,
230ecf6283eStb 		0x9e, 0x3e, 0xcb, 0x66, 0x23, 0x95, 0xb4, 0x42, 0x9c, 0x64,
231ecf6283eStb 		0x81, 0x39, 0x05, 0x3f, 0xb5, 0x21, 0xf8, 0x28, 0xaf, 0x60,
232ecf6283eStb 		0x6b, 0x4d, 0x3d, 0xba, 0xa1, 0x4b, 0x5e, 0x77, 0xef, 0xe7,
233ecf6283eStb 		0x59, 0x28, 0xfe, 0x1d, 0xc1, 0x27, 0xa2, 0xff, 0xa8, 0xde,
234ecf6283eStb 		0x33, 0x48, 0xb3, 0xc1, 0x85, 0x6a, 0x42, 0x9b, 0xf9, 0x7e,
235ecf6283eStb 		0x7e, 0x31, 0xc2, 0xe5, 0xbd, 0x66,
23659919d1cStb 	},
23759919d1cStb 	.y = {
23801938560Stb 		0x01, 0x18, 0x39, 0x29, 0x6a, 0x78, 0x9a, 0x3b, 0xc0, 0x04,
239f1535dc8Sdjm 		0x5c, 0x8a, 0x5f, 0xb4, 0x2c, 0x7d, 0x1b, 0xd9, 0x98, 0xf5,
240f1535dc8Sdjm 		0x44, 0x49, 0x57, 0x9b, 0x44, 0x68, 0x17, 0xaf, 0xbd, 0x17,
241f1535dc8Sdjm 		0x27, 0x3e, 0x66, 0x2c, 0x97, 0xee, 0x72, 0x99, 0x5e, 0xf4,
242f1535dc8Sdjm 		0x26, 0x40, 0xc5, 0x50, 0xb9, 0x01, 0x3f, 0xad, 0x07, 0x61,
243f1535dc8Sdjm 		0x35, 0x3c, 0x70, 0x86, 0xa2, 0x72, 0xc2, 0x40, 0x88, 0xbe,
244f1535dc8Sdjm 		0x94, 0x76, 0x9f, 0xd1, 0x66, 0x50,
24559919d1cStb 	},
24659919d1cStb 	.order = {
247ecf6283eStb 		0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
248ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
249ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
250ecf6283eStb 		0xff, 0xff, 0xff, 0xfa, 0x51, 0x86, 0x87, 0x83, 0xbf, 0x2f,
251ecf6283eStb 		0x96, 0x6b, 0x7f, 0xcc, 0x01, 0x48, 0xf7, 0x09, 0xa5, 0xd0,
252ecf6283eStb 		0x3b, 0xb5, 0xc9, 0xb8, 0x89, 0x9c, 0x47, 0xae, 0xbb, 0x6f,
253ecf6283eStb 		0xb7, 0x1e, 0x91, 0x38, 0x64, 0x09,
25459919d1cStb 	},
2555650a0e1Sdjm };
256f1535dc8Sdjm 
257f67ac449Stedu static const struct {
25859919d1cStb 	uint8_t seed[20];
25959919d1cStb 	uint8_t p[30];
26059919d1cStb 	uint8_t a[30];
26159919d1cStb 	uint8_t b[30];
26259919d1cStb 	uint8_t x[30];
26359919d1cStb 	uint8_t y[30];
26459919d1cStb 	uint8_t order[30];
26559919d1cStb } _EC_X9_62_PRIME_239V1 = {
26659919d1cStb 	.seed = {
267ecf6283eStb 		0xe4, 0x3b, 0xb4, 0x60, 0xf0, 0xb8, 0x0c, 0xc0, 0xc0, 0xb0,
268ecf6283eStb 		0x75, 0x79, 0x8e, 0x94, 0x80, 0x60, 0xf8, 0x32, 0x1b, 0x7d,
26959919d1cStb 	},
27059919d1cStb 	.p = {
271ecf6283eStb 		0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
272ecf6283eStb 		0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
273ecf6283eStb 		0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
27459919d1cStb 	},
27559919d1cStb 	.a = {
276ecf6283eStb 		0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
277ecf6283eStb 		0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
278ecf6283eStb 		0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc,
27959919d1cStb 	},
28059919d1cStb 	.b = {
281ecf6283eStb 		0x6b, 0x01, 0x6c, 0x3b, 0xdc, 0xf1, 0x89, 0x41, 0xd0, 0xd6,
282ecf6283eStb 		0x54, 0x92, 0x14, 0x75, 0xca, 0x71, 0xa9, 0xdb, 0x2f, 0xb2,
283ecf6283eStb 		0x7d, 0x1d, 0x37, 0x79, 0x61, 0x85, 0xc2, 0x94, 0x2c, 0x0a,
28459919d1cStb 	},
28559919d1cStb 	.x = {
286ecf6283eStb 		0x0f, 0xfa, 0x96, 0x3c, 0xdc, 0xa8, 0x81, 0x6c, 0xcc, 0x33,
287ecf6283eStb 		0xb8, 0x64, 0x2b, 0xed, 0xf9, 0x05, 0xc3, 0xd3, 0x58, 0x57,
288ecf6283eStb 		0x3d, 0x3f, 0x27, 0xfb, 0xbd, 0x3b, 0x3c, 0xb9, 0xaa, 0xaf,
28959919d1cStb 	},
29059919d1cStb 	.y = {
29101938560Stb 		0x7d, 0xeb, 0xe8, 0xe4, 0xe9, 0x0a, 0x5d, 0xae, 0x6e, 0x40,
292f1535dc8Sdjm 		0x54, 0xca, 0x53, 0x0b, 0xa0, 0x46, 0x54, 0xb3, 0x68, 0x18,
293f1535dc8Sdjm 		0xce, 0x22, 0x6b, 0x39, 0xfc, 0xcb, 0x7b, 0x02, 0xf1, 0xae,
29459919d1cStb 	},
29559919d1cStb 	.order = {
296ecf6283eStb 		0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
297ecf6283eStb 		0xff, 0xff, 0x7f, 0xff, 0xff, 0x9e, 0x5e, 0x9a, 0x9f, 0x5d,
298ecf6283eStb 		0x90, 0x71, 0xfb, 0xd1, 0x52, 0x26, 0x88, 0x90, 0x9d, 0x0b,
29959919d1cStb 	},
3005650a0e1Sdjm };
3015650a0e1Sdjm 
302f67ac449Stedu static const struct {
30359919d1cStb 	uint8_t seed[20];
30459919d1cStb 	uint8_t p[30];
30559919d1cStb 	uint8_t a[30];
30659919d1cStb 	uint8_t b[30];
30759919d1cStb 	uint8_t x[30];
30859919d1cStb 	uint8_t y[30];
30959919d1cStb 	uint8_t order[30];
31059919d1cStb } _EC_X9_62_PRIME_239V2 = {
31159919d1cStb 	.seed = {
312ecf6283eStb 		0xe8, 0xb4, 0x01, 0x16, 0x04, 0x09, 0x53, 0x03, 0xca, 0x3b,
313ecf6283eStb 		0x80, 0x99, 0x98, 0x2b, 0xe0, 0x9f, 0xcb, 0x9a, 0xe6, 0x16,
31459919d1cStb 	},
31559919d1cStb 	.p = {
316ecf6283eStb 		0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
317ecf6283eStb 		0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
318ecf6283eStb 		0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
31959919d1cStb 	},
32059919d1cStb 	.a = {
321ecf6283eStb 		0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
322ecf6283eStb 		0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
323ecf6283eStb 		0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc,
32459919d1cStb 	},
32559919d1cStb 	.b = {
326ecf6283eStb 		0x61, 0x7f, 0xab, 0x68, 0x32, 0x57, 0x6c, 0xbb, 0xfe, 0xd5,
327ecf6283eStb 		0x0d, 0x99, 0xf0, 0x24, 0x9c, 0x3f, 0xee, 0x58, 0xb9, 0x4b,
328ecf6283eStb 		0xa0, 0x03, 0x8c, 0x7a, 0xe8, 0x4c, 0x8c, 0x83, 0x2f, 0x2c,
32959919d1cStb 	},
33059919d1cStb 	.x = {
331ecf6283eStb 		0x38, 0xaf, 0x09, 0xd9, 0x87, 0x27, 0x70, 0x51, 0x20, 0xc9,
332ecf6283eStb 		0x21, 0xbb, 0x5e, 0x9e, 0x26, 0x29, 0x6a, 0x3c, 0xdc, 0xf2,
333ecf6283eStb 		0xf3, 0x57, 0x57, 0xa0, 0xea, 0xfd, 0x87, 0xb8, 0x30, 0xe7,
33459919d1cStb 	},
33559919d1cStb 	.y = {
33601938560Stb 		0x5b, 0x01, 0x25, 0xe4, 0xdb, 0xea, 0x0e, 0xc7, 0x20, 0x6d,
337f1535dc8Sdjm 		0xa0, 0xfc, 0x01, 0xd9, 0xb0, 0x81, 0x32, 0x9f, 0xb5, 0x55,
338f1535dc8Sdjm 		0xde, 0x6e, 0xf4, 0x60, 0x23, 0x7d, 0xff, 0x8b, 0xe4, 0xba,
33959919d1cStb 	},
34059919d1cStb 	.order = {
341ecf6283eStb 		0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
342ecf6283eStb 		0xff, 0xff, 0x80, 0x00, 0x00, 0xcf, 0xa7, 0xe8, 0x59, 0x43,
343ecf6283eStb 		0x77, 0xd4, 0x14, 0xc0, 0x38, 0x21, 0xbc, 0x58, 0x20, 0x63,
34459919d1cStb 	},
3455650a0e1Sdjm };
3465650a0e1Sdjm 
347f67ac449Stedu static const struct {
34859919d1cStb 	uint8_t seed[20];
34959919d1cStb 	uint8_t p[30];
35059919d1cStb 	uint8_t a[30];
35159919d1cStb 	uint8_t b[30];
35259919d1cStb 	uint8_t x[30];
35359919d1cStb 	uint8_t y[30];
35459919d1cStb 	uint8_t order[30];
35559919d1cStb } _EC_X9_62_PRIME_239V3 = {
35659919d1cStb 	.seed = {
357ecf6283eStb 		0x7d, 0x73, 0x74, 0x16, 0x8f, 0xfe, 0x34, 0x71, 0xb6, 0x0a,
358ecf6283eStb 		0x85, 0x76, 0x86, 0xa1, 0x94, 0x75, 0xd3, 0xbf, 0xa2, 0xff,
35959919d1cStb 	},
36059919d1cStb 	.p = {
361ecf6283eStb 		0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
362ecf6283eStb 		0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
363ecf6283eStb 		0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
36459919d1cStb 	},
36559919d1cStb 	.a = {
366ecf6283eStb 		0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
367ecf6283eStb 		0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
368ecf6283eStb 		0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc,
36959919d1cStb 	},
37059919d1cStb 	.b = {
371ecf6283eStb 		0x25, 0x57, 0x05, 0xfa, 0x2a, 0x30, 0x66, 0x54, 0xb1, 0xf4,
372ecf6283eStb 		0xcb, 0x03, 0xd6, 0xa7, 0x50, 0xa3, 0x0c, 0x25, 0x01, 0x02,
373ecf6283eStb 		0xd4, 0x98, 0x87, 0x17, 0xd9, 0xba, 0x15, 0xab, 0x6d, 0x3e,
37459919d1cStb 	},
37559919d1cStb 	.x = {
376ecf6283eStb 		0x67, 0x68, 0xae, 0x8e, 0x18, 0xbb, 0x92, 0xcf, 0xcf, 0x00,
377ecf6283eStb 		0x5c, 0x94, 0x9a, 0xa2, 0xc6, 0xd9, 0x48, 0x53, 0xd0, 0xe6,
378ecf6283eStb 		0x60, 0xbb, 0xf8, 0x54, 0xb1, 0xc9, 0x50, 0x5f, 0xe9, 0x5a,
37959919d1cStb 	},
38059919d1cStb 	.y = {
38101938560Stb 		0x16, 0x07, 0xe6, 0x89, 0x8f, 0x39, 0x0c, 0x06, 0xbc, 0x1d,
382f1535dc8Sdjm 		0x55, 0x2b, 0xad, 0x22, 0x6f, 0x3b, 0x6f, 0xcf, 0xe4, 0x8b,
383f1535dc8Sdjm 		0x6e, 0x81, 0x84, 0x99, 0xaf, 0x18, 0xe3, 0xed, 0x6c, 0xf3,
38459919d1cStb 	},
38559919d1cStb 	.order = {
386ecf6283eStb 		0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
387ecf6283eStb 		0xff, 0xff, 0x7f, 0xff, 0xff, 0x97, 0x5d, 0xeb, 0x41, 0xb3,
388ecf6283eStb 		0xa6, 0x05, 0x7c, 0x3c, 0x43, 0x21, 0x46, 0x52, 0x65, 0x51,
38959919d1cStb 	},
3905650a0e1Sdjm };
3915650a0e1Sdjm 
392f67ac449Stedu static const struct {
39359919d1cStb 	uint8_t seed[20];
39459919d1cStb 	uint8_t p[32];
39559919d1cStb 	uint8_t a[32];
39659919d1cStb 	uint8_t b[32];
39759919d1cStb 	uint8_t x[32];
39859919d1cStb 	uint8_t y[32];
39959919d1cStb 	uint8_t order[32];
40059919d1cStb } _EC_X9_62_PRIME_256V1 = {
40159919d1cStb 	.seed = {
402ecf6283eStb 		0xc4, 0x9d, 0x36, 0x08, 0x86, 0xe7, 0x04, 0x93, 0x6a, 0x66,
403ecf6283eStb 		0x78, 0xe1, 0x13, 0x9d, 0x26, 0xb7, 0x81, 0x9f, 0x7e, 0x90,
40459919d1cStb 	},
40559919d1cStb 	.p = {
406ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
407f1535dc8Sdjm 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
408ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
409ecf6283eStb 		0xff, 0xff,
41059919d1cStb 	},
41159919d1cStb 	.a = {
412ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
413f1535dc8Sdjm 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
414ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
415ecf6283eStb 		0xff, 0xfc,
41659919d1cStb 	},
41759919d1cStb 	.b = {
418ecf6283eStb 		0x5a, 0xc6, 0x35, 0xd8, 0xaa, 0x3a, 0x93, 0xe7, 0xb3, 0xeb,
419ecf6283eStb 		0xbd, 0x55, 0x76, 0x98, 0x86, 0xbc, 0x65, 0x1d, 0x06, 0xb0,
420ecf6283eStb 		0xcc, 0x53, 0xb0, 0xf6, 0x3b, 0xce, 0x3c, 0x3e, 0x27, 0xd2,
421ecf6283eStb 		0x60, 0x4b,
42259919d1cStb 	},
42359919d1cStb 	.x = {
424ecf6283eStb 		0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47, 0xf8, 0xbc,
425ecf6283eStb 		0xe6, 0xe5, 0x63, 0xa4, 0x40, 0xf2, 0x77, 0x03, 0x7d, 0x81,
426ecf6283eStb 		0x2d, 0xeb, 0x33, 0xa0, 0xf4, 0xa1, 0x39, 0x45, 0xd8, 0x98,
427ecf6283eStb 		0xc2, 0x96,
42859919d1cStb 	},
42959919d1cStb 	.y = {
43001938560Stb 		0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b, 0x8e, 0xe7,
431f1535dc8Sdjm 		0xeb, 0x4a, 0x7c, 0x0f, 0x9e, 0x16, 0x2b, 0xce, 0x33, 0x57,
432f1535dc8Sdjm 		0x6b, 0x31, 0x5e, 0xce, 0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf,
433f1535dc8Sdjm 		0x51, 0xf5,
43459919d1cStb 	},
43559919d1cStb 	.order = {
436ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
437ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0xe6, 0xfa, 0xad,
438ecf6283eStb 		0xa7, 0x17, 0x9e, 0x84, 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63,
43959919d1cStb 		0x25, 0x51,
44059919d1cStb 	},
4415650a0e1Sdjm };
442f1535dc8Sdjm 
443f67ac449Stedu static const struct {
44459919d1cStb 	uint8_t p[29];
44559919d1cStb 	uint8_t a[29];
44659919d1cStb 	uint8_t b[29];
44759919d1cStb 	uint8_t x[29];
44859919d1cStb 	uint8_t y[29];
44959919d1cStb 	uint8_t order[29];
45059919d1cStb } _EC_SECG_PRIME_224K1 = {
45159919d1cStb 	.p = {
452ecf6283eStb 		0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
453ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
454ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xe5, 0x6d,
45559919d1cStb 	},
45659919d1cStb 	.a = {
45701938560Stb 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
458f1535dc8Sdjm 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
459f1535dc8Sdjm 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
46059919d1cStb 	},
46159919d1cStb 	.b = {
46201938560Stb 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
463f1535dc8Sdjm 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
464f1535dc8Sdjm 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
46559919d1cStb 	},
46659919d1cStb 	.x = {
467ecf6283eStb 		0x00, 0xa1, 0x45, 0x5b, 0x33, 0x4d, 0xf0, 0x99, 0xdf, 0x30,
468ecf6283eStb 		0xfc, 0x28, 0xa1, 0x69, 0xa4, 0x67, 0xe9, 0xe4, 0x70, 0x75,
469ecf6283eStb 		0xa9, 0x0f, 0x7e, 0x65, 0x0e, 0xb6, 0xb7, 0xa4, 0x5c,
47059919d1cStb 	},
47159919d1cStb 	.y = {
47201938560Stb 		0x00, 0x7e, 0x08, 0x9f, 0xed, 0x7f, 0xba, 0x34, 0x42, 0x82,
473f1535dc8Sdjm 		0xca, 0xfb, 0xd6, 0xf7, 0xe3, 0x19, 0xf7, 0xc0, 0xb0, 0xbd,
474f1535dc8Sdjm 		0x59, 0xe2, 0xca, 0x4b, 0xdb, 0x55, 0x6d, 0x61, 0xa5,
47559919d1cStb 	},
47659919d1cStb 	.order = {
47701938560Stb 		0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
478ecf6283eStb 		0x00, 0x00, 0x00, 0x00, 0x01, 0xdc, 0xe8, 0xd2, 0xec, 0x61,
479ecf6283eStb 		0x84, 0xca, 0xf0, 0xa9, 0x71, 0x76, 0x9f, 0xb1, 0xf7,
48059919d1cStb 	},
4815650a0e1Sdjm };
4825650a0e1Sdjm 
483f67ac449Stedu static const struct {
48459919d1cStb 	uint8_t p[32];
48559919d1cStb 	uint8_t a[32];
48659919d1cStb 	uint8_t b[32];
48759919d1cStb 	uint8_t x[32];
48859919d1cStb 	uint8_t y[32];
48959919d1cStb 	uint8_t order[32];
49059919d1cStb } _EC_SECG_PRIME_256K1 = {
49159919d1cStb 	.p = {
492ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
493ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
494ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
495ecf6283eStb 		0xfc, 0x2f,
49659919d1cStb 	},
49759919d1cStb 	.a = {
49801938560Stb 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
499f1535dc8Sdjm 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
500f1535dc8Sdjm 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
501f1535dc8Sdjm 		0x00, 0x00,
50259919d1cStb 	},
50359919d1cStb 	.b = {
50401938560Stb 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
505f1535dc8Sdjm 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
506f1535dc8Sdjm 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
507f1535dc8Sdjm 		0x00, 0x07,
50859919d1cStb 	},
50959919d1cStb 	.x = {
510ecf6283eStb 		0x79, 0xbe, 0x66, 0x7e, 0xf9, 0xdc, 0xbb, 0xac, 0x55, 0xa0,
511ecf6283eStb 		0x62, 0x95, 0xce, 0x87, 0x0b, 0x07, 0x02, 0x9b, 0xfc, 0xdb,
512ecf6283eStb 		0x2d, 0xce, 0x28, 0xd9, 0x59, 0xf2, 0x81, 0x5b, 0x16, 0xf8,
513f1535dc8Sdjm 		0x17, 0x98,
51459919d1cStb 	},
51559919d1cStb 	.y = {
51601938560Stb 		0x48, 0x3a, 0xda, 0x77, 0x26, 0xa3, 0xc4, 0x65, 0x5d, 0xa4,
517f1535dc8Sdjm 		0xfb, 0xfc, 0x0e, 0x11, 0x08, 0xa8, 0xfd, 0x17, 0xb4, 0x48,
518f1535dc8Sdjm 		0xa6, 0x85, 0x54, 0x19, 0x9c, 0x47, 0xd0, 0x8f, 0xfb, 0x10,
519f1535dc8Sdjm 		0xd4, 0xb8,
52059919d1cStb 	},
52159919d1cStb 	.order = {
522ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
523ecf6283eStb 		0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xba, 0xae, 0xdc, 0xe6,
524ecf6283eStb 		0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36,
52559919d1cStb 		0x41, 0x41,
52659919d1cStb 	},
5275650a0e1Sdjm };
5285650a0e1Sdjm 
529f67ac449Stedu static const struct {
53059919d1cStb 	uint8_t p[28];
53159919d1cStb 	uint8_t a[28];
53259919d1cStb 	uint8_t b[28];
53359919d1cStb 	uint8_t x[28];
53459919d1cStb 	uint8_t y[28];
53559919d1cStb 	uint8_t order[28];
53659919d1cStb } _EC_brainpoolP224r1 = {
53759919d1cStb 	.p = {
538ecf6283eStb 		0xd7, 0xc1, 0x34, 0xaa, 0x26, 0x43, 0x66, 0x86, 0x2a, 0x18,
539ecf6283eStb 		0x30, 0x25, 0x75, 0xd1, 0xd7, 0x87, 0xb0, 0x9f, 0x07, 0x57,
540ecf6283eStb 		0x97, 0xda, 0x89, 0xf5, 0x7e, 0xc8, 0xc0, 0xff,
54159919d1cStb 	},
54259919d1cStb 	.a = {
543ecf6283eStb 		0x68, 0xa5, 0xe6, 0x2c, 0xa9, 0xce, 0x6c, 0x1c, 0x29, 0x98,
544ecf6283eStb 		0x03, 0xa6, 0xc1, 0x53, 0x0b, 0x51, 0x4e, 0x18, 0x2a, 0xd8,
545ecf6283eStb 		0xb0, 0x04, 0x2a, 0x59, 0xca, 0xd2, 0x9f, 0x43,
54659919d1cStb 	},
54759919d1cStb 	.b = {
548ecf6283eStb 		0x25, 0x80, 0xf6, 0x3c, 0xcf, 0xe4, 0x41, 0x38, 0x87, 0x07,
549ecf6283eStb 		0x13, 0xb1, 0xa9, 0x23, 0x69, 0xe3, 0x3e, 0x21, 0x35, 0xd2,
550ecf6283eStb 		0x66, 0xdb, 0xb3, 0x72, 0x38, 0x6c, 0x40, 0x0b,
55159919d1cStb 	},
55259919d1cStb 	.x = {
553ecf6283eStb 		0x0d, 0x90, 0x29, 0xad, 0x2c, 0x7e, 0x5c, 0xf4, 0x34, 0x08,
554ecf6283eStb 		0x23, 0xb2, 0xa8, 0x7d, 0xc6, 0x8c, 0x9e, 0x4c, 0xe3, 0x17,
555ecf6283eStb 		0x4c, 0x1e, 0x6e, 0xfd, 0xee, 0x12, 0xc0, 0x7d,
55659919d1cStb 	},
55759919d1cStb 	.y = {
558ecf6283eStb 		0x58, 0xaa, 0x56, 0xf7, 0x72, 0xc0, 0x72, 0x6f, 0x24, 0xc6,
559ecf6283eStb 		0xb8, 0x9e, 0x4e, 0xcd, 0xac, 0x24, 0x35, 0x4b, 0x9e, 0x99,
560ecf6283eStb 		0xca, 0xa3, 0xf6, 0xd3, 0x76, 0x14, 0x02, 0xcd,
56159919d1cStb 	},
56259919d1cStb 	.order = {
563ecf6283eStb 		0xd7, 0xc1, 0x34, 0xaa, 0x26, 0x43, 0x66, 0x86, 0x2a, 0x18,
564ecf6283eStb 		0x30, 0x25, 0x75, 0xd0, 0xfb, 0x98, 0xd1, 0x16, 0xbc, 0x4b,
565ecf6283eStb 		0x6d, 0xde, 0xbc, 0xa3, 0xa5, 0xa7, 0x93, 0x9f,
56659919d1cStb 	},
5679caf19c3Smiod };
5689caf19c3Smiod 
569f67ac449Stedu static const struct {
57059919d1cStb 	uint8_t p[28];
57159919d1cStb 	uint8_t a[28];
57259919d1cStb 	uint8_t b[28];
57359919d1cStb 	uint8_t x[28];
57459919d1cStb 	uint8_t y[28];
57559919d1cStb 	uint8_t order[28];
57659919d1cStb } _EC_brainpoolP224t1 = {
57759919d1cStb 	.p = {
578ecf6283eStb 		0xd7, 0xc1, 0x34, 0xaa, 0x26, 0x43, 0x66, 0x86, 0x2a, 0x18,
579ecf6283eStb 		0x30, 0x25, 0x75, 0xd1, 0xd7, 0x87, 0xb0, 0x9f, 0x07, 0x57,
580ecf6283eStb 		0x97, 0xda, 0x89, 0xf5, 0x7e, 0xc8, 0xc0, 0xff,
58159919d1cStb 	},
58259919d1cStb 	.a = {
583ecf6283eStb 		0xd7, 0xc1, 0x34, 0xaa, 0x26, 0x43, 0x66, 0x86, 0x2a, 0x18,
584ecf6283eStb 		0x30, 0x25, 0x75, 0xd1, 0xd7, 0x87, 0xb0, 0x9f, 0x07, 0x57,
585ecf6283eStb 		0x97, 0xda, 0x89, 0xf5, 0x7e, 0xc8, 0xc0, 0xfc,
58659919d1cStb 	},
58759919d1cStb 	.b = {
588ecf6283eStb 		0x4b, 0x33, 0x7d, 0x93, 0x41, 0x04, 0xcd, 0x7b, 0xef, 0x27,
589ecf6283eStb 		0x1b, 0xf6, 0x0c, 0xed, 0x1e, 0xd2, 0x0d, 0xa1, 0x4c, 0x08,
590ecf6283eStb 		0xb3, 0xbb, 0x64, 0xf1, 0x8a, 0x60, 0x88, 0x8d,
59159919d1cStb 	},
59259919d1cStb 	.x = {
593ecf6283eStb 		0x6a, 0xb1, 0xe3, 0x44, 0xce, 0x25, 0xff, 0x38, 0x96, 0x42,
594ecf6283eStb 		0x4e, 0x7f, 0xfe, 0x14, 0x76, 0x2e, 0xcb, 0x49, 0xf8, 0x92,
595ecf6283eStb 		0x8a, 0xc0, 0xc7, 0x60, 0x29, 0xb4, 0xd5, 0x80,
59659919d1cStb 	},
59759919d1cStb 	.y = {
598ecf6283eStb 		0x03, 0x74, 0xe9, 0xf5, 0x14, 0x3e, 0x56, 0x8c, 0xd2, 0x3f,
599ecf6283eStb 		0x3f, 0x4d, 0x7c, 0x0d, 0x4b, 0x1e, 0x41, 0xc8, 0xcc, 0x0d,
600ecf6283eStb 		0x1c, 0x6a, 0xbd, 0x5f, 0x1a, 0x46, 0xdb, 0x4c,
60159919d1cStb 	},
60259919d1cStb 	.order = {
603ecf6283eStb 		0xd7, 0xc1, 0x34, 0xaa, 0x26, 0x43, 0x66, 0x86, 0x2a, 0x18,
604ecf6283eStb 		0x30, 0x25, 0x75, 0xd0, 0xfb, 0x98, 0xd1, 0x16, 0xbc, 0x4b,
605ecf6283eStb 		0x6d, 0xde, 0xbc, 0xa3, 0xa5, 0xa7, 0x93, 0x9f,
60659919d1cStb 	},
6079caf19c3Smiod };
6089caf19c3Smiod 
609f67ac449Stedu static const struct {
61059919d1cStb 	uint8_t p[32];
61159919d1cStb 	uint8_t a[32];
61259919d1cStb 	uint8_t b[32];
61359919d1cStb 	uint8_t x[32];
61459919d1cStb 	uint8_t y[32];
61559919d1cStb 	uint8_t order[32];
61659919d1cStb } _EC_brainpoolP256r1 = {
61759919d1cStb 	.p = {
618ecf6283eStb 		0xa9, 0xfb, 0x57, 0xdb, 0xa1, 0xee, 0xa9, 0xbc, 0x3e, 0x66,
619ecf6283eStb 		0x0a, 0x90, 0x9d, 0x83, 0x8d, 0x72, 0x6e, 0x3b, 0xf6, 0x23,
620ecf6283eStb 		0xd5, 0x26, 0x20, 0x28, 0x20, 0x13, 0x48, 0x1d, 0x1f, 0x6e,
6219caf19c3Smiod 		0x53, 0x77,
62259919d1cStb 	},
62359919d1cStb 	.a = {
624ecf6283eStb 		0x7d, 0x5a, 0x09, 0x75, 0xfc, 0x2c, 0x30, 0x57, 0xee, 0xf6,
625ecf6283eStb 		0x75, 0x30, 0x41, 0x7a, 0xff, 0xe7, 0xfb, 0x80, 0x55, 0xc1,
626ecf6283eStb 		0x26, 0xdc, 0x5c, 0x6c, 0xe9, 0x4a, 0x4b, 0x44, 0xf3, 0x30,
627ecf6283eStb 		0xb5, 0xd9,
62859919d1cStb 	},
62959919d1cStb 	.b = {
630ecf6283eStb 		0x26, 0xdc, 0x5c, 0x6c, 0xe9, 0x4a, 0x4b, 0x44, 0xf3, 0x30,
631ecf6283eStb 		0xb5, 0xd9, 0xbb, 0xd7, 0x7c, 0xbf, 0x95, 0x84, 0x16, 0x29,
632ecf6283eStb 		0x5c, 0xf7, 0xe1, 0xce, 0x6b, 0xcc, 0xdc, 0x18, 0xff, 0x8c,
633ecf6283eStb 		0x07, 0xb6,
63459919d1cStb 	},
63559919d1cStb 	.x = {
636ecf6283eStb 		0x8b, 0xd2, 0xae, 0xb9, 0xcb, 0x7e, 0x57, 0xcb, 0x2c, 0x4b,
637ecf6283eStb 		0x48, 0x2f, 0xfc, 0x81, 0xb7, 0xaf, 0xb9, 0xde, 0x27, 0xe1,
638ecf6283eStb 		0xe3, 0xbd, 0x23, 0xc2, 0x3a, 0x44, 0x53, 0xbd, 0x9a, 0xce,
6399caf19c3Smiod 		0x32, 0x62,
64059919d1cStb 	},
64159919d1cStb 	.y = {
642ecf6283eStb 		0x54, 0x7e, 0xf8, 0x35, 0xc3, 0xda, 0xc4, 0xfd, 0x97, 0xf8,
643ecf6283eStb 		0x46, 0x1a, 0x14, 0x61, 0x1d, 0xc9, 0xc2, 0x77, 0x45, 0x13,
644ecf6283eStb 		0x2d, 0xed, 0x8e, 0x54, 0x5c, 0x1d, 0x54, 0xc7, 0x2f, 0x04,
6459caf19c3Smiod 		0x69, 0x97,
64659919d1cStb 	},
64759919d1cStb 	.order = {
648ecf6283eStb 		0xa9, 0xfb, 0x57, 0xdb, 0xa1, 0xee, 0xa9, 0xbc, 0x3e, 0x66,
649ecf6283eStb 		0x0a, 0x90, 0x9d, 0x83, 0x8d, 0x71, 0x8c, 0x39, 0x7a, 0xa3,
650ecf6283eStb 		0xb5, 0x61, 0xa6, 0xf7, 0x90, 0x1e, 0x0e, 0x82, 0x97, 0x48,
651ecf6283eStb 		0x56, 0xa7,
65259919d1cStb 	},
6539caf19c3Smiod };
6549caf19c3Smiod 
655f67ac449Stedu static const struct {
65659919d1cStb 	uint8_t p[32];
65759919d1cStb 	uint8_t a[32];
65859919d1cStb 	uint8_t b[32];
65959919d1cStb 	uint8_t x[32];
66059919d1cStb 	uint8_t y[32];
66159919d1cStb 	uint8_t order[32];
66259919d1cStb } _EC_brainpoolP256t1 = {
66359919d1cStb 	.p = {
664ecf6283eStb 		0xa9, 0xfb, 0x57, 0xdb, 0xa1, 0xee, 0xa9, 0xbc, 0x3e, 0x66,
665ecf6283eStb 		0x0a, 0x90, 0x9d, 0x83, 0x8d, 0x72, 0x6e, 0x3b, 0xf6, 0x23,
666ecf6283eStb 		0xd5, 0x26, 0x20, 0x28, 0x20, 0x13, 0x48, 0x1d, 0x1f, 0x6e,
6679caf19c3Smiod 		0x53, 0x77,
66859919d1cStb 	},
66959919d1cStb 	.a = {
670ecf6283eStb 		0xa9, 0xfb, 0x57, 0xdb, 0xa1, 0xee, 0xa9, 0xbc, 0x3e, 0x66,
671ecf6283eStb 		0x0a, 0x90, 0x9d, 0x83, 0x8d, 0x72, 0x6e, 0x3b, 0xf6, 0x23,
672ecf6283eStb 		0xd5, 0x26, 0x20, 0x28, 0x20, 0x13, 0x48, 0x1d, 0x1f, 0x6e,
6739caf19c3Smiod 		0x53, 0x74,
67459919d1cStb 	},
67559919d1cStb 	.b = {
676ecf6283eStb 		0x66, 0x2c, 0x61, 0xc4, 0x30, 0xd8, 0x4e, 0xa4, 0xfe, 0x66,
677ecf6283eStb 		0xa7, 0x73, 0x3d, 0x0b, 0x76, 0xb7, 0xbf, 0x93, 0xeb, 0xc4,
678ecf6283eStb 		0xaf, 0x2f, 0x49, 0x25, 0x6a, 0xe5, 0x81, 0x01, 0xfe, 0xe9,
679ecf6283eStb 		0x2b, 0x04,
68059919d1cStb 	},
68159919d1cStb 	.x = {
682ecf6283eStb 		0xa3, 0xe8, 0xeb, 0x3c, 0xc1, 0xcf, 0xe7, 0xb7, 0x73, 0x22,
683ecf6283eStb 		0x13, 0xb2, 0x3a, 0x65, 0x61, 0x49, 0xaf, 0xa1, 0x42, 0xc4,
684ecf6283eStb 		0x7a, 0xaf, 0xbc, 0x2b, 0x79, 0xa1, 0x91, 0x56, 0x2e, 0x13,
685ecf6283eStb 		0x05, 0xf4,
68659919d1cStb 	},
68759919d1cStb 	.y = {
688ecf6283eStb 		0x2d, 0x99, 0x6c, 0x82, 0x34, 0x39, 0xc5, 0x6d, 0x7f, 0x7b,
689ecf6283eStb 		0x22, 0xe1, 0x46, 0x44, 0x41, 0x7e, 0x69, 0xbc, 0xb6, 0xde,
690ecf6283eStb 		0x39, 0xd0, 0x27, 0x00, 0x1d, 0xab, 0xe8, 0xf3, 0x5b, 0x25,
691ecf6283eStb 		0xc9, 0xbe,
69259919d1cStb 	},
69359919d1cStb 	.order = {
694ecf6283eStb 		0xa9, 0xfb, 0x57, 0xdb, 0xa1, 0xee, 0xa9, 0xbc, 0x3e, 0x66,
695ecf6283eStb 		0x0a, 0x90, 0x9d, 0x83, 0x8d, 0x71, 0x8c, 0x39, 0x7a, 0xa3,
696ecf6283eStb 		0xb5, 0x61, 0xa6, 0xf7, 0x90, 0x1e, 0x0e, 0x82, 0x97, 0x48,
697ecf6283eStb 		0x56, 0xa7,
69859919d1cStb 	},
6999caf19c3Smiod };
7009caf19c3Smiod 
701f67ac449Stedu static const struct {
70259919d1cStb 	uint8_t p[40];
70359919d1cStb 	uint8_t a[40];
70459919d1cStb 	uint8_t b[40];
70559919d1cStb 	uint8_t x[40];
70659919d1cStb 	uint8_t y[40];
70759919d1cStb 	uint8_t order[40];
70859919d1cStb } _EC_brainpoolP320r1 = {
70959919d1cStb 	.p = {
710ecf6283eStb 		0xd3, 0x5e, 0x47, 0x20, 0x36, 0xbc, 0x4f, 0xb7, 0xe1, 0x3c,
711ecf6283eStb 		0x78, 0x5e, 0xd2, 0x01, 0xe0, 0x65, 0xf9, 0x8f, 0xcf, 0xa6,
712ecf6283eStb 		0xf6, 0xf4, 0x0d, 0xef, 0x4f, 0x92, 0xb9, 0xec, 0x78, 0x93,
713ecf6283eStb 		0xec, 0x28, 0xfc, 0xd4, 0x12, 0xb1, 0xf1, 0xb3, 0x2e, 0x27,
71459919d1cStb 	},
71559919d1cStb 	.a = {
716ecf6283eStb 		0x3e, 0xe3, 0x0b, 0x56, 0x8f, 0xba, 0xb0, 0xf8, 0x83, 0xcc,
717ecf6283eStb 		0xeb, 0xd4, 0x6d, 0x3f, 0x3b, 0xb8, 0xa2, 0xa7, 0x35, 0x13,
718ecf6283eStb 		0xf5, 0xeb, 0x79, 0xda, 0x66, 0x19, 0x0e, 0xb0, 0x85, 0xff,
719ecf6283eStb 		0xa9, 0xf4, 0x92, 0xf3, 0x75, 0xa9, 0x7d, 0x86, 0x0e, 0xb4,
72059919d1cStb 	},
72159919d1cStb 	.b = {
722ecf6283eStb 		0x52, 0x08, 0x83, 0x94, 0x9d, 0xfd, 0xbc, 0x42, 0xd3, 0xad,
723ecf6283eStb 		0x19, 0x86, 0x40, 0x68, 0x8a, 0x6f, 0xe1, 0x3f, 0x41, 0x34,
724ecf6283eStb 		0x95, 0x54, 0xb4, 0x9a, 0xcc, 0x31, 0xdc, 0xcd, 0x88, 0x45,
725ecf6283eStb 		0x39, 0x81, 0x6f, 0x5e, 0xb4, 0xac, 0x8f, 0xb1, 0xf1, 0xa6,
72659919d1cStb 	},
72759919d1cStb 	.x = {
728ecf6283eStb 		0x43, 0xbd, 0x7e, 0x9a, 0xfb, 0x53, 0xd8, 0xb8, 0x52, 0x89,
729ecf6283eStb 		0xbc, 0xc4, 0x8e, 0xe5, 0xbf, 0xe6, 0xf2, 0x01, 0x37, 0xd1,
730ecf6283eStb 		0x0a, 0x08, 0x7e, 0xb6, 0xe7, 0x87, 0x1e, 0x2a, 0x10, 0xa5,
731ecf6283eStb 		0x99, 0xc7, 0x10, 0xaf, 0x8d, 0x0d, 0x39, 0xe2, 0x06, 0x11,
73259919d1cStb 	},
73359919d1cStb 	.y = {
734ecf6283eStb 		0x14, 0xfd, 0xd0, 0x55, 0x45, 0xec, 0x1c, 0xc8, 0xab, 0x40,
735ecf6283eStb 		0x93, 0x24, 0x7f, 0x77, 0x27, 0x5e, 0x07, 0x43, 0xff, 0xed,
736ecf6283eStb 		0x11, 0x71, 0x82, 0xea, 0xa9, 0xc7, 0x78, 0x77, 0xaa, 0xac,
737ecf6283eStb 		0x6a, 0xc7, 0xd3, 0x52, 0x45, 0xd1, 0x69, 0x2e, 0x8e, 0xe1,
73859919d1cStb 	},
73959919d1cStb 	.order = {
740ecf6283eStb 		0xd3, 0x5e, 0x47, 0x20, 0x36, 0xbc, 0x4f, 0xb7, 0xe1, 0x3c,
741ecf6283eStb 		0x78, 0x5e, 0xd2, 0x01, 0xe0, 0x65, 0xf9, 0x8f, 0xcf, 0xa5,
742ecf6283eStb 		0xb6, 0x8f, 0x12, 0xa3, 0x2d, 0x48, 0x2e, 0xc7, 0xee, 0x86,
743ecf6283eStb 		0x58, 0xe9, 0x86, 0x91, 0x55, 0x5b, 0x44, 0xc5, 0x93, 0x11,
74459919d1cStb 	},
7459caf19c3Smiod };
7469caf19c3Smiod 
747f67ac449Stedu static const struct {
74859919d1cStb 	uint8_t p[40];
74959919d1cStb 	uint8_t a[40];
75059919d1cStb 	uint8_t b[40];
75159919d1cStb 	uint8_t x[40];
75259919d1cStb 	uint8_t y[40];
75359919d1cStb 	uint8_t order[40];
75459919d1cStb } _EC_brainpoolP320t1 = {
75559919d1cStb 	.p = {
756ecf6283eStb 		0xd3, 0x5e, 0x47, 0x20, 0x36, 0xbc, 0x4f, 0xb7, 0xe1, 0x3c,
757ecf6283eStb 		0x78, 0x5e, 0xd2, 0x01, 0xe0, 0x65, 0xf9, 0x8f, 0xcf, 0xa6,
758ecf6283eStb 		0xf6, 0xf4, 0x0d, 0xef, 0x4f, 0x92, 0xb9, 0xec, 0x78, 0x93,
759ecf6283eStb 		0xec, 0x28, 0xfc, 0xd4, 0x12, 0xb1, 0xf1, 0xb3, 0x2e, 0x27,
76059919d1cStb 	},
76159919d1cStb 	.a = {
762ecf6283eStb 		0xd3, 0x5e, 0x47, 0x20, 0x36, 0xbc, 0x4f, 0xb7, 0xe1, 0x3c,
763ecf6283eStb 		0x78, 0x5e, 0xd2, 0x01, 0xe0, 0x65, 0xf9, 0x8f, 0xcf, 0xa6,
764ecf6283eStb 		0xf6, 0xf4, 0x0d, 0xef, 0x4f, 0x92, 0xb9, 0xec, 0x78, 0x93,
765ecf6283eStb 		0xec, 0x28, 0xfc, 0xd4, 0x12, 0xb1, 0xf1, 0xb3, 0x2e, 0x24,
76659919d1cStb 	},
76759919d1cStb 	.b = {
768ecf6283eStb 		0xa7, 0xf5, 0x61, 0xe0, 0x38, 0xeb, 0x1e, 0xd5, 0x60, 0xb3,
769ecf6283eStb 		0xd1, 0x47, 0xdb, 0x78, 0x20, 0x13, 0x06, 0x4c, 0x19, 0xf2,
770ecf6283eStb 		0x7e, 0xd2, 0x7c, 0x67, 0x80, 0xaa, 0xf7, 0x7f, 0xb8, 0xa5,
771ecf6283eStb 		0x47, 0xce, 0xb5, 0xb4, 0xfe, 0xf4, 0x22, 0x34, 0x03, 0x53,
77259919d1cStb 	},
77359919d1cStb 	.x = {
774ecf6283eStb 		0x92, 0x5b, 0xe9, 0xfb, 0x01, 0xaf, 0xc6, 0xfb, 0x4d, 0x3e,
775ecf6283eStb 		0x7d, 0x49, 0x90, 0x01, 0x0f, 0x81, 0x34, 0x08, 0xab, 0x10,
776ecf6283eStb 		0x6c, 0x4f, 0x09, 0xcb, 0x7e, 0xe0, 0x78, 0x68, 0xcc, 0x13,
777ecf6283eStb 		0x6f, 0xff, 0x33, 0x57, 0xf6, 0x24, 0xa2, 0x1b, 0xed, 0x52,
77859919d1cStb 	},
77959919d1cStb 	.y = {
780ecf6283eStb 		0x63, 0xba, 0x3a, 0x7a, 0x27, 0x48, 0x3e, 0xbf, 0x66, 0x71,
781ecf6283eStb 		0xdb, 0xef, 0x7a, 0xbb, 0x30, 0xeb, 0xee, 0x08, 0x4e, 0x58,
782ecf6283eStb 		0xa0, 0xb0, 0x77, 0xad, 0x42, 0xa5, 0xa0, 0x98, 0x9d, 0x1e,
783ecf6283eStb 		0xe7, 0x1b, 0x1b, 0x9b, 0xc0, 0x45, 0x5f, 0xb0, 0xd2, 0xc3,
78459919d1cStb 	},
78559919d1cStb 	.order = {
786ecf6283eStb 		0xd3, 0x5e, 0x47, 0x20, 0x36, 0xbc, 0x4f, 0xb7, 0xe1, 0x3c,
787ecf6283eStb 		0x78, 0x5e, 0xd2, 0x01, 0xe0, 0x65, 0xf9, 0x8f, 0xcf, 0xa5,
788ecf6283eStb 		0xb6, 0x8f, 0x12, 0xa3, 0x2d, 0x48, 0x2e, 0xc7, 0xee, 0x86,
789ecf6283eStb 		0x58, 0xe9, 0x86, 0x91, 0x55, 0x5b, 0x44, 0xc5, 0x93, 0x11,
79059919d1cStb 	},
7919caf19c3Smiod };
7929caf19c3Smiod 
793f67ac449Stedu static const struct {
79459919d1cStb 	uint8_t p[48];
79559919d1cStb 	uint8_t a[48];
79659919d1cStb 	uint8_t b[48];
79759919d1cStb 	uint8_t x[48];
79859919d1cStb 	uint8_t y[48];
79959919d1cStb 	uint8_t order[48];
80059919d1cStb } _EC_brainpoolP384r1 = {
80159919d1cStb 	.p = {
802ecf6283eStb 		0x8c, 0xb9, 0x1e, 0x82, 0xa3, 0x38, 0x6d, 0x28, 0x0f, 0x5d,
803ecf6283eStb 		0x6f, 0x7e, 0x50, 0xe6, 0x41, 0xdf, 0x15, 0x2f, 0x71, 0x09,
804ecf6283eStb 		0xed, 0x54, 0x56, 0xb4, 0x12, 0xb1, 0xda, 0x19, 0x7f, 0xb7,
805ecf6283eStb 		0x11, 0x23, 0xac, 0xd3, 0xa7, 0x29, 0x90, 0x1d, 0x1a, 0x71,
806ecf6283eStb 		0x87, 0x47, 0x00, 0x13, 0x31, 0x07, 0xec, 0x53,
80759919d1cStb 	},
80859919d1cStb 	.a = {
809ecf6283eStb 		0x7b, 0xc3, 0x82, 0xc6, 0x3d, 0x8c, 0x15, 0x0c, 0x3c, 0x72,
810ecf6283eStb 		0x08, 0x0a, 0xce, 0x05, 0xaf, 0xa0, 0xc2, 0xbe, 0xa2, 0x8e,
811ecf6283eStb 		0x4f, 0xb2, 0x27, 0x87, 0x13, 0x91, 0x65, 0xef, 0xba, 0x91,
812ecf6283eStb 		0xf9, 0x0f, 0x8a, 0xa5, 0x81, 0x4a, 0x50, 0x3a, 0xd4, 0xeb,
813ecf6283eStb 		0x04, 0xa8, 0xc7, 0xdd, 0x22, 0xce, 0x28, 0x26,
81459919d1cStb 	},
81559919d1cStb 	.b = {
816ecf6283eStb 		0x04, 0xa8, 0xc7, 0xdd, 0x22, 0xce, 0x28, 0x26, 0x8b, 0x39,
817ecf6283eStb 		0xb5, 0x54, 0x16, 0xf0, 0x44, 0x7c, 0x2f, 0xb7, 0x7d, 0xe1,
818ecf6283eStb 		0x07, 0xdc, 0xd2, 0xa6, 0x2e, 0x88, 0x0e, 0xa5, 0x3e, 0xeb,
819ecf6283eStb 		0x62, 0xd5, 0x7c, 0xb4, 0x39, 0x02, 0x95, 0xdb, 0xc9, 0x94,
820ecf6283eStb 		0x3a, 0xb7, 0x86, 0x96, 0xfa, 0x50, 0x4c, 0x11,
82159919d1cStb 	},
82259919d1cStb 	.x = {
823ecf6283eStb 		0x1d, 0x1c, 0x64, 0xf0, 0x68, 0xcf, 0x45, 0xff, 0xa2, 0xa6,
824ecf6283eStb 		0x3a, 0x81, 0xb7, 0xc1, 0x3f, 0x6b, 0x88, 0x47, 0xa3, 0xe7,
825ecf6283eStb 		0x7e, 0xf1, 0x4f, 0xe3, 0xdb, 0x7f, 0xca, 0xfe, 0x0c, 0xbd,
826ecf6283eStb 		0x10, 0xe8, 0xe8, 0x26, 0xe0, 0x34, 0x36, 0xd6, 0x46, 0xaa,
827ecf6283eStb 		0xef, 0x87, 0xb2, 0xe2, 0x47, 0xd4, 0xaf, 0x1e,
82859919d1cStb 	},
82959919d1cStb 	.y = {
830ecf6283eStb 		0x8a, 0xbe, 0x1d, 0x75, 0x20, 0xf9, 0xc2, 0xa4, 0x5c, 0xb1,
831ecf6283eStb 		0xeb, 0x8e, 0x95, 0xcf, 0xd5, 0x52, 0x62, 0xb7, 0x0b, 0x29,
832ecf6283eStb 		0xfe, 0xec, 0x58, 0x64, 0xe1, 0x9c, 0x05, 0x4f, 0xf9, 0x91,
833ecf6283eStb 		0x29, 0x28, 0x0e, 0x46, 0x46, 0x21, 0x77, 0x91, 0x81, 0x11,
834ecf6283eStb 		0x42, 0x82, 0x03, 0x41, 0x26, 0x3c, 0x53, 0x15,
83559919d1cStb 	},
83659919d1cStb 	.order = {
837ecf6283eStb 		0x8c, 0xb9, 0x1e, 0x82, 0xa3, 0x38, 0x6d, 0x28, 0x0f, 0x5d,
838ecf6283eStb 		0x6f, 0x7e, 0x50, 0xe6, 0x41, 0xdf, 0x15, 0x2f, 0x71, 0x09,
839ecf6283eStb 		0xed, 0x54, 0x56, 0xb3, 0x1f, 0x16, 0x6e, 0x6c, 0xac, 0x04,
840ecf6283eStb 		0x25, 0xa7, 0xcf, 0x3a, 0xb6, 0xaf, 0x6b, 0x7f, 0xc3, 0x10,
841ecf6283eStb 		0x3b, 0x88, 0x32, 0x02, 0xe9, 0x04, 0x65, 0x65,
84259919d1cStb 	},
8439caf19c3Smiod };
8449caf19c3Smiod 
845f67ac449Stedu static const struct {
84659919d1cStb 	uint8_t p[48];
84759919d1cStb 	uint8_t a[48];
84859919d1cStb 	uint8_t b[48];
84959919d1cStb 	uint8_t x[48];
85059919d1cStb 	uint8_t y[48];
85159919d1cStb 	uint8_t order[48];
85259919d1cStb } _EC_brainpoolP384t1 = {
85359919d1cStb 	.p = {
854ecf6283eStb 		0x8c, 0xb9, 0x1e, 0x82, 0xa3, 0x38, 0x6d, 0x28, 0x0f, 0x5d,
855ecf6283eStb 		0x6f, 0x7e, 0x50, 0xe6, 0x41, 0xdf, 0x15, 0x2f, 0x71, 0x09,
856ecf6283eStb 		0xed, 0x54, 0x56, 0xb4, 0x12, 0xb1, 0xda, 0x19, 0x7f, 0xb7,
857ecf6283eStb 		0x11, 0x23, 0xac, 0xd3, 0xa7, 0x29, 0x90, 0x1d, 0x1a, 0x71,
858ecf6283eStb 		0x87, 0x47, 0x00, 0x13, 0x31, 0x07, 0xec, 0x53,
85959919d1cStb 	},
86059919d1cStb 	.a = {
861ecf6283eStb 		0x8c, 0xb9, 0x1e, 0x82, 0xa3, 0x38, 0x6d, 0x28, 0x0f, 0x5d,
862ecf6283eStb 		0x6f, 0x7e, 0x50, 0xe6, 0x41, 0xdf, 0x15, 0x2f, 0x71, 0x09,
863ecf6283eStb 		0xed, 0x54, 0x56, 0xb4, 0x12, 0xb1, 0xda, 0x19, 0x7f, 0xb7,
864ecf6283eStb 		0x11, 0x23, 0xac, 0xd3, 0xa7, 0x29, 0x90, 0x1d, 0x1a, 0x71,
865ecf6283eStb 		0x87, 0x47, 0x00, 0x13, 0x31, 0x07, 0xec, 0x50,
86659919d1cStb 	},
86759919d1cStb 	.b = {
868ecf6283eStb 		0x7f, 0x51, 0x9e, 0xad, 0xa7, 0xbd, 0xa8, 0x1b, 0xd8, 0x26,
869ecf6283eStb 		0xdb, 0xa6, 0x47, 0x91, 0x0f, 0x8c, 0x4b, 0x93, 0x46, 0xed,
870ecf6283eStb 		0x8c, 0xcd, 0xc6, 0x4e, 0x4b, 0x1a, 0xbd, 0x11, 0x75, 0x6d,
871ecf6283eStb 		0xce, 0x1d, 0x20, 0x74, 0xaa, 0x26, 0x3b, 0x88, 0x80, 0x5c,
872ecf6283eStb 		0xed, 0x70, 0x35, 0x5a, 0x33, 0xb4, 0x71, 0xee,
87359919d1cStb 	},
87459919d1cStb 	.x = {
875ecf6283eStb 		0x18, 0xde, 0x98, 0xb0, 0x2d, 0xb9, 0xa3, 0x06, 0xf2, 0xaf,
876ecf6283eStb 		0xcd, 0x72, 0x35, 0xf7, 0x2a, 0x81, 0x9b, 0x80, 0xab, 0x12,
877ecf6283eStb 		0xeb, 0xd6, 0x53, 0x17, 0x24, 0x76, 0xfe, 0xcd, 0x46, 0x2a,
878ecf6283eStb 		0xab, 0xff, 0xc4, 0xff, 0x19, 0x1b, 0x94, 0x6a, 0x5f, 0x54,
879ecf6283eStb 		0xd8, 0xd0, 0xaa, 0x2f, 0x41, 0x88, 0x08, 0xcc,
88059919d1cStb 	},
88159919d1cStb 	.y = {
882ecf6283eStb 		0x25, 0xab, 0x05, 0x69, 0x62, 0xd3, 0x06, 0x51, 0xa1, 0x14,
883ecf6283eStb 		0xaf, 0xd2, 0x75, 0x5a, 0xd3, 0x36, 0x74, 0x7f, 0x93, 0x47,
884ecf6283eStb 		0x5b, 0x7a, 0x1f, 0xca, 0x3b, 0x88, 0xf2, 0xb6, 0xa2, 0x08,
885ecf6283eStb 		0xcc, 0xfe, 0x46, 0x94, 0x08, 0x58, 0x4d, 0xc2, 0xb2, 0x91,
886ecf6283eStb 		0x26, 0x75, 0xbf, 0x5b, 0x9e, 0x58, 0x29, 0x28,
88759919d1cStb 	},
88859919d1cStb 	.order = {
889ecf6283eStb 		0x8c, 0xb9, 0x1e, 0x82, 0xa3, 0x38, 0x6d, 0x28, 0x0f, 0x5d,
890ecf6283eStb 		0x6f, 0x7e, 0x50, 0xe6, 0x41, 0xdf, 0x15, 0x2f, 0x71, 0x09,
891ecf6283eStb 		0xed, 0x54, 0x56, 0xb3, 0x1f, 0x16, 0x6e, 0x6c, 0xac, 0x04,
892ecf6283eStb 		0x25, 0xa7, 0xcf, 0x3a, 0xb6, 0xaf, 0x6b, 0x7f, 0xc3, 0x10,
893ecf6283eStb 		0x3b, 0x88, 0x32, 0x02, 0xe9, 0x04, 0x65, 0x65,
89459919d1cStb 	},
8959caf19c3Smiod };
8969caf19c3Smiod 
897f67ac449Stedu static const struct {
89859919d1cStb 	uint8_t p[64];
89959919d1cStb 	uint8_t a[64];
90059919d1cStb 	uint8_t b[64];
90159919d1cStb 	uint8_t x[64];
90259919d1cStb 	uint8_t y[64];
90359919d1cStb 	uint8_t order[64];
90459919d1cStb } _EC_brainpoolP512r1 = {
90559919d1cStb 	.p = {
906ecf6283eStb 		0xaa, 0xdd, 0x9d, 0xb8, 0xdb, 0xe9, 0xc4, 0x8b, 0x3f, 0xd4,
907ecf6283eStb 		0xe6, 0xae, 0x33, 0xc9, 0xfc, 0x07, 0xcb, 0x30, 0x8d, 0xb3,
908ecf6283eStb 		0xb3, 0xc9, 0xd2, 0x0e, 0xd6, 0x63, 0x9c, 0xca, 0x70, 0x33,
909ecf6283eStb 		0x08, 0x71, 0x7d, 0x4d, 0x9b, 0x00, 0x9b, 0xc6, 0x68, 0x42,
910ecf6283eStb 		0xae, 0xcd, 0xa1, 0x2a, 0xe6, 0xa3, 0x80, 0xe6, 0x28, 0x81,
911ecf6283eStb 		0xff, 0x2f, 0x2d, 0x82, 0xc6, 0x85, 0x28, 0xaa, 0x60, 0x56,
912ecf6283eStb 		0x58, 0x3a, 0x48, 0xf3,
91359919d1cStb 	},
91459919d1cStb 	.a = {
915ecf6283eStb 		0x78, 0x30, 0xa3, 0x31, 0x8b, 0x60, 0x3b, 0x89, 0xe2, 0x32,
916ecf6283eStb 		0x71, 0x45, 0xac, 0x23, 0x4c, 0xc5, 0x94, 0xcb, 0xdd, 0x8d,
917ecf6283eStb 		0x3d, 0xf9, 0x16, 0x10, 0xa8, 0x34, 0x41, 0xca, 0xea, 0x98,
918ecf6283eStb 		0x63, 0xbc, 0x2d, 0xed, 0x5d, 0x5a, 0xa8, 0x25, 0x3a, 0xa1,
919ecf6283eStb 		0x0a, 0x2e, 0xf1, 0xc9, 0x8b, 0x9a, 0xc8, 0xb5, 0x7f, 0x11,
920ecf6283eStb 		0x17, 0xa7, 0x2b, 0xf2, 0xc7, 0xb9, 0xe7, 0xc1, 0xac, 0x4d,
921ecf6283eStb 		0x77, 0xfc, 0x94, 0xca,
92259919d1cStb 	},
92359919d1cStb 	.b = {
924ecf6283eStb 		0x3d, 0xf9, 0x16, 0x10, 0xa8, 0x34, 0x41, 0xca, 0xea, 0x98,
925ecf6283eStb 		0x63, 0xbc, 0x2d, 0xed, 0x5d, 0x5a, 0xa8, 0x25, 0x3a, 0xa1,
926ecf6283eStb 		0x0a, 0x2e, 0xf1, 0xc9, 0x8b, 0x9a, 0xc8, 0xb5, 0x7f, 0x11,
927ecf6283eStb 		0x17, 0xa7, 0x2b, 0xf2, 0xc7, 0xb9, 0xe7, 0xc1, 0xac, 0x4d,
928ecf6283eStb 		0x77, 0xfc, 0x94, 0xca, 0xdc, 0x08, 0x3e, 0x67, 0x98, 0x40,
929ecf6283eStb 		0x50, 0xb7, 0x5e, 0xba, 0xe5, 0xdd, 0x28, 0x09, 0xbd, 0x63,
930ecf6283eStb 		0x80, 0x16, 0xf7, 0x23,
93159919d1cStb 	},
93259919d1cStb 	.x = {
933ecf6283eStb 		0x81, 0xae, 0xe4, 0xbd, 0xd8, 0x2e, 0xd9, 0x64, 0x5a, 0x21,
934ecf6283eStb 		0x32, 0x2e, 0x9c, 0x4c, 0x6a, 0x93, 0x85, 0xed, 0x9f, 0x70,
935ecf6283eStb 		0xb5, 0xd9, 0x16, 0xc1, 0xb4, 0x3b, 0x62, 0xee, 0xf4, 0xd0,
936ecf6283eStb 		0x09, 0x8e, 0xff, 0x3b, 0x1f, 0x78, 0xe2, 0xd0, 0xd4, 0x8d,
937ecf6283eStb 		0x50, 0xd1, 0x68, 0x7b, 0x93, 0xb9, 0x7d, 0x5f, 0x7c, 0x6d,
938ecf6283eStb 		0x50, 0x47, 0x40, 0x6a, 0x5e, 0x68, 0x8b, 0x35, 0x22, 0x09,
939ecf6283eStb 		0xbc, 0xb9, 0xf8, 0x22,
94059919d1cStb 	},
94159919d1cStb 	.y = {
942ecf6283eStb 		0x7d, 0xde, 0x38, 0x5d, 0x56, 0x63, 0x32, 0xec, 0xc0, 0xea,
943ecf6283eStb 		0xbf, 0xa9, 0xcf, 0x78, 0x22, 0xfd, 0xf2, 0x09, 0xf7, 0x00,
944ecf6283eStb 		0x24, 0xa5, 0x7b, 0x1a, 0xa0, 0x00, 0xc5, 0x5b, 0x88, 0x1f,
945ecf6283eStb 		0x81, 0x11, 0xb2, 0xdc, 0xde, 0x49, 0x4a, 0x5f, 0x48, 0x5e,
946ecf6283eStb 		0x5b, 0xca, 0x4b, 0xd8, 0x8a, 0x27, 0x63, 0xae, 0xd1, 0xca,
947ecf6283eStb 		0x2b, 0x2f, 0xa8, 0xf0, 0x54, 0x06, 0x78, 0xcd, 0x1e, 0x0f,
948ecf6283eStb 		0x3a, 0xd8, 0x08, 0x92,
94959919d1cStb 	},
95059919d1cStb 	.order = {
951ecf6283eStb 		0xaa, 0xdd, 0x9d, 0xb8, 0xdb, 0xe9, 0xc4, 0x8b, 0x3f, 0xd4,
952ecf6283eStb 		0xe6, 0xae, 0x33, 0xc9, 0xfc, 0x07, 0xcb, 0x30, 0x8d, 0xb3,
953ecf6283eStb 		0xb3, 0xc9, 0xd2, 0x0e, 0xd6, 0x63, 0x9c, 0xca, 0x70, 0x33,
954ecf6283eStb 		0x08, 0x70, 0x55, 0x3e, 0x5c, 0x41, 0x4c, 0xa9, 0x26, 0x19,
955ecf6283eStb 		0x41, 0x86, 0x61, 0x19, 0x7f, 0xac, 0x10, 0x47, 0x1d, 0xb1,
956ecf6283eStb 		0xd3, 0x81, 0x08, 0x5d, 0xda, 0xdd, 0xb5, 0x87, 0x96, 0x82,
957ecf6283eStb 		0x9c, 0xa9, 0x00, 0x69,
95859919d1cStb 	},
9599caf19c3Smiod };
9609caf19c3Smiod 
961f67ac449Stedu static const struct {
96259919d1cStb 	uint8_t p[64];
96359919d1cStb 	uint8_t a[64];
96459919d1cStb 	uint8_t b[64];
96559919d1cStb 	uint8_t x[64];
96659919d1cStb 	uint8_t y[64];
96759919d1cStb 	uint8_t order[64];
96859919d1cStb } _EC_brainpoolP512t1 = {
96959919d1cStb 	.p = {
970ecf6283eStb 		0xaa, 0xdd, 0x9d, 0xb8, 0xdb, 0xe9, 0xc4, 0x8b, 0x3f, 0xd4,
971ecf6283eStb 		0xe6, 0xae, 0x33, 0xc9, 0xfc, 0x07, 0xcb, 0x30, 0x8d, 0xb3,
972ecf6283eStb 		0xb3, 0xc9, 0xd2, 0x0e, 0xd6, 0x63, 0x9c, 0xca, 0x70, 0x33,
973ecf6283eStb 		0x08, 0x71, 0x7d, 0x4d, 0x9b, 0x00, 0x9b, 0xc6, 0x68, 0x42,
974ecf6283eStb 		0xae, 0xcd, 0xa1, 0x2a, 0xe6, 0xa3, 0x80, 0xe6, 0x28, 0x81,
975ecf6283eStb 		0xff, 0x2f, 0x2d, 0x82, 0xc6, 0x85, 0x28, 0xaa, 0x60, 0x56,
976ecf6283eStb 		0x58, 0x3a, 0x48, 0xf3,
97759919d1cStb 	},
97859919d1cStb 	.a = {
979ecf6283eStb 		0xaa, 0xdd, 0x9d, 0xb8, 0xdb, 0xe9, 0xc4, 0x8b, 0x3f, 0xd4,
980ecf6283eStb 		0xe6, 0xae, 0x33, 0xc9, 0xfc, 0x07, 0xcb, 0x30, 0x8d, 0xb3,
981ecf6283eStb 		0xb3, 0xc9, 0xd2, 0x0e, 0xd6, 0x63, 0x9c, 0xca, 0x70, 0x33,
982ecf6283eStb 		0x08, 0x71, 0x7d, 0x4d, 0x9b, 0x00, 0x9b, 0xc6, 0x68, 0x42,
983ecf6283eStb 		0xae, 0xcd, 0xa1, 0x2a, 0xe6, 0xa3, 0x80, 0xe6, 0x28, 0x81,
984ecf6283eStb 		0xff, 0x2f, 0x2d, 0x82, 0xc6, 0x85, 0x28, 0xaa, 0x60, 0x56,
985ecf6283eStb 		0x58, 0x3a, 0x48, 0xf0,
98659919d1cStb 	},
98759919d1cStb 	.b = {
988ecf6283eStb 		0x7c, 0xbb, 0xbc, 0xf9, 0x44, 0x1c, 0xfa, 0xb7, 0x6e, 0x18,
989ecf6283eStb 		0x90, 0xe4, 0x68, 0x84, 0xea, 0xe3, 0x21, 0xf7, 0x0c, 0x0b,
990ecf6283eStb 		0xcb, 0x49, 0x81, 0x52, 0x78, 0x97, 0x50, 0x4b, 0xec, 0x3e,
991ecf6283eStb 		0x36, 0xa6, 0x2b, 0xcd, 0xfa, 0x23, 0x04, 0x97, 0x65, 0x40,
992ecf6283eStb 		0xf6, 0x45, 0x00, 0x85, 0xf2, 0xda, 0xe1, 0x45, 0xc2, 0x25,
993ecf6283eStb 		0x53, 0xb4, 0x65, 0x76, 0x36, 0x89, 0x18, 0x0e, 0xa2, 0x57,
994ecf6283eStb 		0x18, 0x67, 0x42, 0x3e,
99559919d1cStb 	},
99659919d1cStb 	.x = {
997ecf6283eStb 		0x64, 0x0e, 0xce, 0x5c, 0x12, 0x78, 0x87, 0x17, 0xb9, 0xc1,
998ecf6283eStb 		0xba, 0x06, 0xcb, 0xc2, 0xa6, 0xfe, 0xba, 0x85, 0x84, 0x24,
999ecf6283eStb 		0x58, 0xc5, 0x6d, 0xde, 0x9d, 0xb1, 0x75, 0x8d, 0x39, 0xc0,
1000ecf6283eStb 		0x31, 0x3d, 0x82, 0xba, 0x51, 0x73, 0x5c, 0xdb, 0x3e, 0xa4,
1001ecf6283eStb 		0x99, 0xaa, 0x77, 0xa7, 0xd6, 0x94, 0x3a, 0x64, 0xf7, 0xa3,
1002ecf6283eStb 		0xf2, 0x5f, 0xe2, 0x6f, 0x06, 0xb5, 0x1b, 0xaa, 0x26, 0x96,
1003ecf6283eStb 		0xfa, 0x90, 0x35, 0xda,
100459919d1cStb 	},
100559919d1cStb 	.y = {
1006ecf6283eStb 		0x5b, 0x53, 0x4b, 0xd5, 0x95, 0xf5, 0xaf, 0x0f, 0xa2, 0xc8,
1007ecf6283eStb 		0x92, 0x37, 0x6c, 0x84, 0xac, 0xe1, 0xbb, 0x4e, 0x30, 0x19,
1008ecf6283eStb 		0xb7, 0x16, 0x34, 0xc0, 0x11, 0x31, 0x15, 0x9c, 0xae, 0x03,
1009ecf6283eStb 		0xce, 0xe9, 0xd9, 0x93, 0x21, 0x84, 0xbe, 0xef, 0x21, 0x6b,
1010ecf6283eStb 		0xd7, 0x1d, 0xf2, 0xda, 0xdf, 0x86, 0xa6, 0x27, 0x30, 0x6e,
1011ecf6283eStb 		0xcf, 0xf9, 0x6d, 0xbb, 0x8b, 0xac, 0xe1, 0x98, 0xb6, 0x1e,
1012ecf6283eStb 		0x00, 0xf8, 0xb3, 0x32,
101359919d1cStb 	},
101459919d1cStb 	.order = {
1015ecf6283eStb 		0xaa, 0xdd, 0x9d, 0xb8, 0xdb, 0xe9, 0xc4, 0x8b, 0x3f, 0xd4,
1016ecf6283eStb 		0xe6, 0xae, 0x33, 0xc9, 0xfc, 0x07, 0xcb, 0x30, 0x8d, 0xb3,
1017ecf6283eStb 		0xb3, 0xc9, 0xd2, 0x0e, 0xd6, 0x63, 0x9c, 0xca, 0x70, 0x33,
1018ecf6283eStb 		0x08, 0x70, 0x55, 0x3e, 0x5c, 0x41, 0x4c, 0xa9, 0x26, 0x19,
1019ecf6283eStb 		0x41, 0x86, 0x61, 0x19, 0x7f, 0xac, 0x10, 0x47, 0x1d, 0xb1,
1020ecf6283eStb 		0xd3, 0x81, 0x08, 0x5d, 0xda, 0xdd, 0xb5, 0x87, 0x96, 0x82,
1021ecf6283eStb 		0x9c, 0xa9, 0x00, 0x69,
102259919d1cStb 	},
10239caf19c3Smiod };
10249caf19c3Smiod 
1025f67ac449Stedu static const struct {
102659919d1cStb 	uint8_t p[32];
102759919d1cStb 	uint8_t a[32];
102859919d1cStb 	uint8_t b[32];
102959919d1cStb 	uint8_t x[32];
103059919d1cStb 	uint8_t y[32];
103159919d1cStb 	uint8_t order[32];
103259919d1cStb } _EC_FRP256v1 = {
103359919d1cStb 	.p = {
1034ecf6283eStb 		0xf1, 0xfd, 0x17, 0x8c, 0x0b, 0x3a, 0xd5, 0x8f, 0x10, 0x12,
1035ecf6283eStb 		0x6d, 0xe8, 0xce, 0x42, 0x43, 0x5b, 0x39, 0x61, 0xad, 0xbc,
1036ecf6283eStb 		0xab, 0xc8, 0xca, 0x6d, 0xe8, 0xfc, 0xf3, 0x53, 0xd8, 0x6e,
1037ecf6283eStb 		0x9c, 0x03,
103859919d1cStb 	},
103959919d1cStb 	.a = {
1040ecf6283eStb 		0xf1, 0xfd, 0x17, 0x8c, 0x0b, 0x3a, 0xd5, 0x8f, 0x10, 0x12,
1041ecf6283eStb 		0x6d, 0xe8, 0xce, 0x42, 0x43, 0x5b, 0x39, 0x61, 0xad, 0xbc,
1042ecf6283eStb 		0xab, 0xc8, 0xca, 0x6d, 0xe8, 0xfc, 0xf3, 0x53, 0xd8, 0x6e,
1043ecf6283eStb 		0x9c, 0x00,
104459919d1cStb 	},
104559919d1cStb 	.b = {
1046ecf6283eStb 		0xee, 0x35, 0x3f, 0xca, 0x54, 0x28, 0xa9, 0x30, 0x0d, 0x4a,
1047ecf6283eStb 		0xba, 0x75, 0x4a, 0x44, 0xc0, 0x0f, 0xdf, 0xec, 0x0c, 0x9a,
1048ecf6283eStb 		0xe4, 0xb1, 0xa1, 0x80, 0x30, 0x75, 0xed, 0x96, 0x7b, 0x7b,
1049ecf6283eStb 		0xb7, 0x3f,
105059919d1cStb 	},
105159919d1cStb 	.x = {
1052ecf6283eStb 		0xb6, 0xb3, 0xd4, 0xc3, 0x56, 0xc1, 0x39, 0xeb, 0x31, 0x18,
1053ecf6283eStb 		0x3d, 0x47, 0x49, 0xd4, 0x23, 0x95, 0x8c, 0x27, 0xd2, 0xdc,
1054ecf6283eStb 		0xaf, 0x98, 0xb7, 0x01, 0x64, 0xc9, 0x7a, 0x2d, 0xd9, 0x8f,
1055ecf6283eStb 		0x5c, 0xff,
105659919d1cStb 	},
105759919d1cStb 	.y = {
1058ecf6283eStb 		0x61, 0x42, 0xe0, 0xf7, 0xc8, 0xb2, 0x04, 0x91, 0x1f, 0x92,
1059ecf6283eStb 		0x71, 0xf0, 0xf3, 0xec, 0xef, 0x8c, 0x27, 0x01, 0xc3, 0x07,
1060ecf6283eStb 		0xe8, 0xe4, 0xc9, 0xe1, 0x83, 0x11, 0x5a, 0x15, 0x54, 0x06,
1061ecf6283eStb 		0x2c, 0xfb,
106259919d1cStb 	},
106359919d1cStb 	.order = {
1064ecf6283eStb 		0xf1, 0xfd, 0x17, 0x8c, 0x0b, 0x3a, 0xd5, 0x8f, 0x10, 0x12,
1065ecf6283eStb 		0x6d, 0xe8, 0xce, 0x42, 0x43, 0x5b, 0x53, 0xdc, 0x67, 0xe1,
1066ecf6283eStb 		0x40, 0xd2, 0xbf, 0x94, 0x1f, 0xfd, 0xd4, 0x59, 0xc6, 0xd6,
1067ecf6283eStb 		0x55, 0xe1,
106859919d1cStb 	},
1069f9a1f7bbSmiod };
1070f9a1f7bbSmiod 
1071b9274495Stb static const struct ec_curve {
1072f1535dc8Sdjm 	const char *comment;
107359919d1cStb 	int nid;
107459919d1cStb 	int seed_len;
107559919d1cStb 	int param_len;
107659919d1cStb 	unsigned int cofactor;
107759919d1cStb 	const uint8_t *seed;
107859919d1cStb 	const uint8_t *p;
107959919d1cStb 	const uint8_t *a;
108059919d1cStb 	const uint8_t *b;
108159919d1cStb 	const uint8_t *x;
108259919d1cStb 	const uint8_t *y;
108359919d1cStb 	const uint8_t *order;
1084b9274495Stb } ec_curve_list[] = {
10855650a0e1Sdjm 	/* secg curves */
1086978dd0cbStb 	{
1087978dd0cbStb 		.comment = "SECG curve over a 224 bit prime field",
108859919d1cStb 		.nid = NID_secp224k1,
108959919d1cStb 		.param_len = sizeof(_EC_SECG_PRIME_224K1.p),
109059919d1cStb 		.p = _EC_SECG_PRIME_224K1.p,
109159919d1cStb 		.a = _EC_SECG_PRIME_224K1.a,
109259919d1cStb 		.b = _EC_SECG_PRIME_224K1.b,
109359919d1cStb 		.x = _EC_SECG_PRIME_224K1.x,
109459919d1cStb 		.y = _EC_SECG_PRIME_224K1.y,
109559919d1cStb 		.order = _EC_SECG_PRIME_224K1.order,
109659919d1cStb 		.cofactor = 1,
1097978dd0cbStb 	},
1098978dd0cbStb 	{
1099978dd0cbStb 		.comment = "NIST/SECG curve over a 224 bit prime field",
110059919d1cStb 		.nid = NID_secp224r1,
110159919d1cStb 		.seed_len = sizeof(_EC_NIST_PRIME_224.seed),
110259919d1cStb 		.param_len = sizeof(_EC_NIST_PRIME_224.p),
110359919d1cStb 		.seed = _EC_NIST_PRIME_224.seed,
110459919d1cStb 		.p = _EC_NIST_PRIME_224.p,
110559919d1cStb 		.a = _EC_NIST_PRIME_224.a,
110659919d1cStb 		.b = _EC_NIST_PRIME_224.b,
110759919d1cStb 		.x = _EC_NIST_PRIME_224.x,
110859919d1cStb 		.y = _EC_NIST_PRIME_224.y,
110959919d1cStb 		.order = _EC_NIST_PRIME_224.order,
111059919d1cStb 		.cofactor = 1,
1111978dd0cbStb 	},
1112978dd0cbStb 	{
1113978dd0cbStb 		.comment = "SECG curve over a 256 bit prime field",
111459919d1cStb 		.nid = NID_secp256k1,
111559919d1cStb 		.param_len = sizeof(_EC_SECG_PRIME_256K1.p),
111659919d1cStb 		.p = _EC_SECG_PRIME_256K1.p,
111759919d1cStb 		.a = _EC_SECG_PRIME_256K1.a,
111859919d1cStb 		.b = _EC_SECG_PRIME_256K1.b,
111959919d1cStb 		.x = _EC_SECG_PRIME_256K1.x,
112059919d1cStb 		.y = _EC_SECG_PRIME_256K1.y,
112159919d1cStb 		.order = _EC_SECG_PRIME_256K1.order,
112259919d1cStb 		.cofactor = 1,
1123978dd0cbStb 	},
11245650a0e1Sdjm 	/* SECG secp256r1 is the same as X9.62 prime256v1 and hence omitted */
1125978dd0cbStb 	{
1126978dd0cbStb 		.comment = "NIST/SECG curve over a 384 bit prime field",
112759919d1cStb 		.nid = NID_secp384r1,
112859919d1cStb 		.seed_len = sizeof(_EC_NIST_PRIME_384.seed),
112959919d1cStb 		.param_len = sizeof(_EC_NIST_PRIME_384.p),
113059919d1cStb 		.seed = _EC_NIST_PRIME_384.seed,
113159919d1cStb 		.p = _EC_NIST_PRIME_384.p,
113259919d1cStb 		.a = _EC_NIST_PRIME_384.a,
113359919d1cStb 		.b = _EC_NIST_PRIME_384.b,
113459919d1cStb 		.x = _EC_NIST_PRIME_384.x,
113559919d1cStb 		.y = _EC_NIST_PRIME_384.y,
113659919d1cStb 		.order = _EC_NIST_PRIME_384.order,
113759919d1cStb 		.cofactor = 1,
1138978dd0cbStb 	},
1139978dd0cbStb 	{
1140978dd0cbStb 		.comment = "NIST/SECG curve over a 521 bit prime field",
114159919d1cStb 		.nid = NID_secp521r1,
114259919d1cStb 		.seed_len = sizeof(_EC_NIST_PRIME_521.seed),
114359919d1cStb 		.param_len = sizeof(_EC_NIST_PRIME_521.p),
114459919d1cStb 		.seed = _EC_NIST_PRIME_521.seed,
114559919d1cStb 		.p = _EC_NIST_PRIME_521.p,
114659919d1cStb 		.a = _EC_NIST_PRIME_521.a,
114759919d1cStb 		.b = _EC_NIST_PRIME_521.b,
114859919d1cStb 		.x = _EC_NIST_PRIME_521.x,
114959919d1cStb 		.y = _EC_NIST_PRIME_521.y,
115059919d1cStb 		.order = _EC_NIST_PRIME_521.order,
115159919d1cStb 		.cofactor = 1,
1152978dd0cbStb 	},
11535650a0e1Sdjm 	/* X9.62 curves */
1154978dd0cbStb 	{
115559919d1cStb 		.comment = "X9.62 curve over a 239 bit prime field",
1156978dd0cbStb 		.nid = NID_X9_62_prime239v1,
115759919d1cStb 		.seed_len = sizeof(_EC_X9_62_PRIME_239V1.seed),
115859919d1cStb 		.param_len = sizeof(_EC_X9_62_PRIME_239V1.p),
115959919d1cStb 		.seed = _EC_X9_62_PRIME_239V1.seed,
116059919d1cStb 		.p = _EC_X9_62_PRIME_239V1.p,
116159919d1cStb 		.a = _EC_X9_62_PRIME_239V1.a,
116259919d1cStb 		.b = _EC_X9_62_PRIME_239V1.b,
116359919d1cStb 		.x = _EC_X9_62_PRIME_239V1.x,
116459919d1cStb 		.y = _EC_X9_62_PRIME_239V1.y,
116559919d1cStb 		.order = _EC_X9_62_PRIME_239V1.order,
116659919d1cStb 		.cofactor = 1,
1167978dd0cbStb 	},
1168978dd0cbStb 	{
116959919d1cStb 		.comment = "X9.62 curve over a 239 bit prime field",
1170978dd0cbStb 		.nid = NID_X9_62_prime239v2,
117159919d1cStb 		.seed_len = sizeof(_EC_X9_62_PRIME_239V2.seed),
117259919d1cStb 		.param_len = sizeof(_EC_X9_62_PRIME_239V2.p),
117359919d1cStb 		.seed = _EC_X9_62_PRIME_239V2.seed,
117459919d1cStb 		.p = _EC_X9_62_PRIME_239V2.p,
117559919d1cStb 		.a = _EC_X9_62_PRIME_239V2.a,
117659919d1cStb 		.b = _EC_X9_62_PRIME_239V2.b,
117759919d1cStb 		.x = _EC_X9_62_PRIME_239V2.x,
117859919d1cStb 		.y = _EC_X9_62_PRIME_239V2.y,
117959919d1cStb 		.order = _EC_X9_62_PRIME_239V2.order,
118059919d1cStb 		.cofactor = 1,
1181978dd0cbStb 	},
1182978dd0cbStb 	{
118359919d1cStb 		.comment = "X9.62 curve over a 239 bit prime field",
1184978dd0cbStb 		.nid = NID_X9_62_prime239v3,
118559919d1cStb 		.seed_len = sizeof(_EC_X9_62_PRIME_239V3.seed),
118659919d1cStb 		.param_len = sizeof(_EC_X9_62_PRIME_239V3.p),
118759919d1cStb 		.seed = _EC_X9_62_PRIME_239V3.seed,
118859919d1cStb 		.p = _EC_X9_62_PRIME_239V3.p,
118959919d1cStb 		.a = _EC_X9_62_PRIME_239V3.a,
119059919d1cStb 		.b = _EC_X9_62_PRIME_239V3.b,
119159919d1cStb 		.x = _EC_X9_62_PRIME_239V3.x,
119259919d1cStb 		.y = _EC_X9_62_PRIME_239V3.y,
119359919d1cStb 		.order = _EC_X9_62_PRIME_239V3.order,
119459919d1cStb 		.cofactor = 1,
1195978dd0cbStb 	},
1196978dd0cbStb 	{
1197978dd0cbStb 		.comment = "X9.62/SECG curve over a 256 bit prime field",
119859919d1cStb 		.nid = NID_X9_62_prime256v1,
119959919d1cStb 		.seed_len = sizeof(_EC_X9_62_PRIME_256V1.seed),
120059919d1cStb 		.param_len = sizeof(_EC_X9_62_PRIME_256V1.p),
120159919d1cStb 		.seed = _EC_X9_62_PRIME_256V1.seed,
120259919d1cStb 		.p = _EC_X9_62_PRIME_256V1.p,
120359919d1cStb 		.a = _EC_X9_62_PRIME_256V1.a,
120459919d1cStb 		.b = _EC_X9_62_PRIME_256V1.b,
120559919d1cStb 		.x = _EC_X9_62_PRIME_256V1.x,
120659919d1cStb 		.y = _EC_X9_62_PRIME_256V1.y,
120759919d1cStb 		.order = _EC_X9_62_PRIME_256V1.order,
120859919d1cStb 		.cofactor = 1,
1209978dd0cbStb 	},
12109caf19c3Smiod 	/* RFC 5639 curves */
1211978dd0cbStb 	{
121259919d1cStb 		.comment = "RFC 5639 curve over a 224 bit prime field",
1213978dd0cbStb 		.nid = NID_brainpoolP224r1,
121459919d1cStb 		.param_len = sizeof(_EC_brainpoolP224r1.p),
121559919d1cStb 		.p = _EC_brainpoolP224r1.p,
121659919d1cStb 		.a = _EC_brainpoolP224r1.a,
121759919d1cStb 		.b = _EC_brainpoolP224r1.b,
121859919d1cStb 		.x = _EC_brainpoolP224r1.x,
121959919d1cStb 		.y = _EC_brainpoolP224r1.y,
122059919d1cStb 		.order = _EC_brainpoolP224r1.order,
122159919d1cStb 		.cofactor = 1,
1222978dd0cbStb 	},
1223978dd0cbStb 	{
122459919d1cStb 		.comment = "RFC 5639 curve over a 224 bit prime field",
1225978dd0cbStb 		.nid = NID_brainpoolP224t1,
122659919d1cStb 		.param_len = sizeof(_EC_brainpoolP224t1.p),
122759919d1cStb 		.p = _EC_brainpoolP224t1.p,
122859919d1cStb 		.a = _EC_brainpoolP224t1.a,
122959919d1cStb 		.b = _EC_brainpoolP224t1.b,
123059919d1cStb 		.x = _EC_brainpoolP224t1.x,
123159919d1cStb 		.y = _EC_brainpoolP224t1.y,
123259919d1cStb 		.order = _EC_brainpoolP224t1.order,
123359919d1cStb 		.cofactor = 1,
1234978dd0cbStb 	},
1235978dd0cbStb 	{
123659919d1cStb 		.comment = "RFC 5639 curve over a 256 bit prime field",
1237978dd0cbStb 		.nid = NID_brainpoolP256r1,
123859919d1cStb 		.param_len = sizeof(_EC_brainpoolP256r1.p),
123959919d1cStb 		.p = _EC_brainpoolP256r1.p,
124059919d1cStb 		.a = _EC_brainpoolP256r1.a,
124159919d1cStb 		.b = _EC_brainpoolP256r1.b,
124259919d1cStb 		.x = _EC_brainpoolP256r1.x,
124359919d1cStb 		.y = _EC_brainpoolP256r1.y,
124459919d1cStb 		.order = _EC_brainpoolP256r1.order,
124559919d1cStb 		.cofactor = 1,
1246978dd0cbStb 	},
1247978dd0cbStb 	{
124859919d1cStb 		.comment = "RFC 5639 curve over a 256 bit prime field",
1249978dd0cbStb 		.nid = NID_brainpoolP256t1,
125059919d1cStb 		.param_len = sizeof(_EC_brainpoolP256t1.p),
125159919d1cStb 		.p = _EC_brainpoolP256t1.p,
125259919d1cStb 		.a = _EC_brainpoolP256t1.a,
125359919d1cStb 		.b = _EC_brainpoolP256t1.b,
125459919d1cStb 		.x = _EC_brainpoolP256t1.x,
125559919d1cStb 		.y = _EC_brainpoolP256t1.y,
125659919d1cStb 		.order = _EC_brainpoolP256t1.order,
125759919d1cStb 		.cofactor = 1,
1258978dd0cbStb 	},
1259978dd0cbStb 	{
126059919d1cStb 		.comment = "RFC 5639 curve over a 320 bit prime field",
1261978dd0cbStb 		.nid = NID_brainpoolP320r1,
126259919d1cStb 		.param_len = sizeof(_EC_brainpoolP320r1.p),
126359919d1cStb 		.p = _EC_brainpoolP320r1.p,
126459919d1cStb 		.a = _EC_brainpoolP320r1.a,
126559919d1cStb 		.b = _EC_brainpoolP320r1.b,
126659919d1cStb 		.x = _EC_brainpoolP320r1.x,
126759919d1cStb 		.y = _EC_brainpoolP320r1.y,
126859919d1cStb 		.order = _EC_brainpoolP320r1.order,
126959919d1cStb 		.cofactor = 1,
1270978dd0cbStb 	},
1271978dd0cbStb 	{
127259919d1cStb 		.comment = "RFC 5639 curve over a 320 bit prime field",
1273978dd0cbStb 		.nid = NID_brainpoolP320t1,
127459919d1cStb 		.param_len = sizeof(_EC_brainpoolP320t1.p),
127559919d1cStb 		.p = _EC_brainpoolP320t1.p,
127659919d1cStb 		.a = _EC_brainpoolP320t1.a,
127759919d1cStb 		.b = _EC_brainpoolP320t1.b,
127859919d1cStb 		.x = _EC_brainpoolP320t1.x,
127959919d1cStb 		.y = _EC_brainpoolP320t1.y,
128059919d1cStb 		.order = _EC_brainpoolP320t1.order,
128159919d1cStb 		.cofactor = 1,
1282978dd0cbStb 	},
1283978dd0cbStb 	{
128459919d1cStb 		.comment = "RFC 5639 curve over a 384 bit prime field",
1285978dd0cbStb 		.nid = NID_brainpoolP384r1,
128659919d1cStb 		.param_len = sizeof(_EC_brainpoolP384r1.p),
128759919d1cStb 		.p = _EC_brainpoolP384r1.p,
128859919d1cStb 		.a = _EC_brainpoolP384r1.a,
128959919d1cStb 		.b = _EC_brainpoolP384r1.b,
129059919d1cStb 		.x = _EC_brainpoolP384r1.x,
129159919d1cStb 		.y = _EC_brainpoolP384r1.y,
129259919d1cStb 		.order = _EC_brainpoolP384r1.order,
129359919d1cStb 		.cofactor = 1,
1294978dd0cbStb 	},
1295978dd0cbStb 	{
129659919d1cStb 		.comment = "RFC 5639 curve over a 384 bit prime field",
1297978dd0cbStb 		.nid = NID_brainpoolP384t1,
129859919d1cStb 		.param_len = sizeof(_EC_brainpoolP384t1.p),
129959919d1cStb 		.p = _EC_brainpoolP384t1.p,
130059919d1cStb 		.a = _EC_brainpoolP384t1.a,
130159919d1cStb 		.b = _EC_brainpoolP384t1.b,
130259919d1cStb 		.x = _EC_brainpoolP384t1.x,
130359919d1cStb 		.y = _EC_brainpoolP384t1.y,
130459919d1cStb 		.order = _EC_brainpoolP384t1.order,
130559919d1cStb 		.cofactor = 1,
1306978dd0cbStb 	},
1307978dd0cbStb 	{
130859919d1cStb 		.comment = "RFC 5639 curve over a 512 bit prime field",
1309978dd0cbStb 		.nid = NID_brainpoolP512r1,
131059919d1cStb 		.param_len = sizeof(_EC_brainpoolP512r1.p),
131159919d1cStb 		.p = _EC_brainpoolP512r1.p,
131259919d1cStb 		.a = _EC_brainpoolP512r1.a,
131359919d1cStb 		.b = _EC_brainpoolP512r1.b,
131459919d1cStb 		.x = _EC_brainpoolP512r1.x,
131559919d1cStb 		.y = _EC_brainpoolP512r1.y,
131659919d1cStb 		.order = _EC_brainpoolP512r1.order,
131759919d1cStb 		.cofactor = 1,
1318978dd0cbStb 	},
1319978dd0cbStb 	{
1320978dd0cbStb 		.comment = "RFC 5639 curve over a 512 bit prime field",
132159919d1cStb 		.nid = NID_brainpoolP512t1,
132259919d1cStb 		.param_len = sizeof(_EC_brainpoolP512t1.p),
132359919d1cStb 		.p = _EC_brainpoolP512t1.p,
132459919d1cStb 		.a = _EC_brainpoolP512t1.a,
132559919d1cStb 		.b = _EC_brainpoolP512t1.b,
132659919d1cStb 		.x = _EC_brainpoolP512t1.x,
132759919d1cStb 		.y = _EC_brainpoolP512t1.y,
132859919d1cStb 		.order = _EC_brainpoolP512t1.order,
132959919d1cStb 		.cofactor = 1,
1330978dd0cbStb 	},
1331f9a1f7bbSmiod 	/* ANSSI */
1332978dd0cbStb 	{
1333978dd0cbStb 		.comment = "FRP256v1",
133459919d1cStb 		.nid = NID_FRP256v1,
133559919d1cStb 		.param_len = sizeof(_EC_FRP256v1.p),
133659919d1cStb 		.p = _EC_FRP256v1.p,
133759919d1cStb 		.a = _EC_FRP256v1.a,
133859919d1cStb 		.b = _EC_FRP256v1.b,
133959919d1cStb 		.x = _EC_FRP256v1.x,
134059919d1cStb 		.y = _EC_FRP256v1.y,
134159919d1cStb 		.order = _EC_FRP256v1.order,
134259919d1cStb 		.cofactor = 1,
1343978dd0cbStb 	},
13445650a0e1Sdjm };
13455650a0e1Sdjm 
1346b9274495Stb #define EC_CURVE_LIST_LENGTH (sizeof(ec_curve_list) / sizeof(ec_curve_list[0]))
13475650a0e1Sdjm 
1348f67ac449Stedu static EC_GROUP *
1349b9274495Stb ec_group_new_from_data(const struct ec_curve *curve)
13505650a0e1Sdjm {
1351b1c4c349Stb 	EC_GROUP *group = NULL, *ret = NULL;
13525b63a848Stb 	EC_POINT *generator = NULL;
13535650a0e1Sdjm 	BN_CTX *ctx = NULL;
1354e3e151efStb 	BIGNUM *p, *a, *b, *x, *y, *order, *cofactor;
13555650a0e1Sdjm 
1356f67ac449Stedu 	if ((ctx = BN_CTX_new()) == NULL) {
13575067ae9fSbeck 		ECerror(ERR_R_MALLOC_FAILURE);
13585650a0e1Sdjm 		goto err;
13595650a0e1Sdjm 	}
1360e3e151efStb 	BN_CTX_start(ctx);
1361e3e151efStb 
1362e3e151efStb 	if ((p = BN_CTX_get(ctx)) == NULL) {
1363e3e151efStb 		ECerror(ERR_R_BN_LIB);
1364e3e151efStb 		goto err;
1365e3e151efStb 	}
1366e3e151efStb 	if ((a = BN_CTX_get(ctx)) == NULL) {
1367e3e151efStb 		ECerror(ERR_R_BN_LIB);
1368e3e151efStb 		goto err;
1369e3e151efStb 	}
1370e3e151efStb 	if ((b = BN_CTX_get(ctx)) == NULL) {
1371e3e151efStb 		ECerror(ERR_R_BN_LIB);
1372e3e151efStb 		goto err;
1373e3e151efStb 	}
1374e3e151efStb 	if ((x = BN_CTX_get(ctx)) == NULL) {
1375e3e151efStb 		ECerror(ERR_R_BN_LIB);
1376e3e151efStb 		goto err;
1377e3e151efStb 	}
1378e3e151efStb 	if ((y = BN_CTX_get(ctx)) == NULL) {
1379e3e151efStb 		ECerror(ERR_R_BN_LIB);
1380e3e151efStb 		goto err;
1381e3e151efStb 	}
1382e3e151efStb 	if ((order = BN_CTX_get(ctx)) == NULL) {
1383e3e151efStb 		ECerror(ERR_R_BN_LIB);
1384e3e151efStb 		goto err;
1385e3e151efStb 	}
1386e3e151efStb 	if ((cofactor = BN_CTX_get(ctx)) == NULL) {
1387e3e151efStb 		ECerror(ERR_R_BN_LIB);
1388e3e151efStb 		goto err;
1389e3e151efStb 	}
1390e3e151efStb 
139159919d1cStb 	if (BN_bin2bn(curve->p, curve->param_len, p) == NULL) {
1392e3e151efStb 		ECerror(ERR_R_BN_LIB);
1393e3e151efStb 		goto err;
1394e3e151efStb 	}
139559919d1cStb 	if (BN_bin2bn(curve->a, curve->param_len, a) == NULL) {
1396e3e151efStb 		ECerror(ERR_R_BN_LIB);
1397e3e151efStb 		goto err;
1398e3e151efStb 	}
139959919d1cStb 	if (BN_bin2bn(curve->b, curve->param_len, b) == NULL) {
14005067ae9fSbeck 		ECerror(ERR_R_BN_LIB);
14015650a0e1Sdjm 		goto err;
14025650a0e1Sdjm 	}
1403f67ac449Stedu 	if ((group = EC_GROUP_new_curve_GFp(p, a, b, ctx)) == NULL) {
14045067ae9fSbeck 		ECerror(ERR_R_EC_LIB);
14055650a0e1Sdjm 		goto err;
14065650a0e1Sdjm 	}
1407b1c4c349Stb 	EC_GROUP_set_curve_name(group, curve->nid);
14085650a0e1Sdjm 
14095b63a848Stb 	if ((generator = EC_POINT_new(group)) == NULL) {
14105067ae9fSbeck 		ECerror(ERR_R_EC_LIB);
14115650a0e1Sdjm 		goto err;
14125650a0e1Sdjm 	}
141359919d1cStb 	if (BN_bin2bn(curve->x, curve->param_len, x) == NULL) {
1414e3e151efStb 		ECerror(ERR_R_BN_LIB);
1415e3e151efStb 		goto err;
1416e3e151efStb 	}
141759919d1cStb 	if (BN_bin2bn(curve->y, curve->param_len, y) == NULL) {
14185067ae9fSbeck 		ECerror(ERR_R_BN_LIB);
14195650a0e1Sdjm 		goto err;
14205650a0e1Sdjm 	}
14215b63a848Stb 	if (!EC_POINT_set_affine_coordinates(group, generator, x, y, ctx)) {
14225067ae9fSbeck 		ECerror(ERR_R_EC_LIB);
14235650a0e1Sdjm 		goto err;
14245650a0e1Sdjm 	}
142559919d1cStb 	if (BN_bin2bn(curve->order, curve->param_len, order) == NULL) {
142659919d1cStb 		ECerror(ERR_R_EC_LIB);
14275650a0e1Sdjm 		goto err;
14285650a0e1Sdjm 	}
142959919d1cStb 	if (!BN_set_word(cofactor, curve->cofactor)) {
1430e3e151efStb 		ECerror(ERR_R_BN_LIB);
1431e3e151efStb 		goto err;
1432e3e151efStb 	}
14335b63a848Stb 	if (!EC_GROUP_set_generator(group, generator, order, cofactor)) {
14345067ae9fSbeck 		ECerror(ERR_R_EC_LIB);
14355650a0e1Sdjm 		goto err;
14365650a0e1Sdjm 	}
1437b1c4c349Stb 
143859919d1cStb 	if (curve->seed != NULL) {
143959919d1cStb 		if (!EC_GROUP_set_seed(group, curve->seed, curve->seed_len)) {
14405067ae9fSbeck 			ECerror(ERR_R_EC_LIB);
14415650a0e1Sdjm 			goto err;
14425650a0e1Sdjm 		}
14435650a0e1Sdjm 	}
1444b1c4c349Stb 
1445b1c4c349Stb 	ret = group;
14465650a0e1Sdjm 	group = NULL;
1447b1c4c349Stb 
1448b1c4c349Stb  err:
1449b1c4c349Stb 	EC_GROUP_free(group);
14505b63a848Stb 	EC_POINT_free(generator);
1451e3e151efStb 	BN_CTX_end(ctx);
14525650a0e1Sdjm 	BN_CTX_free(ctx);
1453e3e151efStb 
1454b1c4c349Stb 	return ret;
14555650a0e1Sdjm }
14565650a0e1Sdjm 
1457f67ac449Stedu EC_GROUP *
1458f67ac449Stedu EC_GROUP_new_by_curve_name(int nid)
14595650a0e1Sdjm {
14605650a0e1Sdjm 	size_t i;
14615650a0e1Sdjm 
14625650a0e1Sdjm 	if (nid <= 0)
14635650a0e1Sdjm 		return NULL;
14645650a0e1Sdjm 
1465b9274495Stb 	for (i = 0; i < EC_CURVE_LIST_LENGTH; i++) {
1466b9274495Stb 		if (ec_curve_list[i].nid == nid)
1467b9274495Stb 			return ec_group_new_from_data(&ec_curve_list[i]);
14685650a0e1Sdjm 	}
1469b1c4c349Stb 
14705067ae9fSbeck 	ECerror(EC_R_UNKNOWN_GROUP);
14715650a0e1Sdjm 	return NULL;
14725650a0e1Sdjm }
1473ea2baf45Sbeck LCRYPTO_ALIAS(EC_GROUP_new_by_curve_name);
14745650a0e1Sdjm 
14759a0568b2Stb static void
1476b9274495Stb ec_curve_free(struct ec_curve *curve)
14779a0568b2Stb {
14789a0568b2Stb 	if (curve == NULL)
14799a0568b2Stb 		return;
14809a0568b2Stb 
14819a0568b2Stb 	/* PERM UGLY CASTS */
14829a0568b2Stb 	free((uint8_t *)curve->seed);
14839a0568b2Stb 	free((uint8_t *)curve->p);
14849a0568b2Stb 	free((uint8_t *)curve->a);
14859a0568b2Stb 	free((uint8_t *)curve->b);
14869a0568b2Stb 	free((uint8_t *)curve->x);
14879a0568b2Stb 	free((uint8_t *)curve->y);
14889a0568b2Stb 	free((uint8_t *)curve->order);
14899a0568b2Stb 
14909a0568b2Stb 	free(curve);
14919a0568b2Stb }
14929a0568b2Stb 
14939a0568b2Stb static int
1494b9274495Stb ec_curve_encode_parameter(const BIGNUM *bn, int param_len,
14959a0568b2Stb     const uint8_t **out_param)
14969a0568b2Stb {
14979a0568b2Stb 	uint8_t *buf = NULL;
14989a0568b2Stb 	int ret = 0;
14999a0568b2Stb 
15009a0568b2Stb 	if (out_param == NULL || *out_param != NULL)
15019a0568b2Stb 		goto err;
15029a0568b2Stb 
15039a0568b2Stb 	if ((buf = calloc(1, param_len)) == NULL)
15049a0568b2Stb 		goto err;
15059a0568b2Stb 	if (BN_bn2binpad(bn, buf, param_len) != param_len)
15069a0568b2Stb 		goto err;
15079a0568b2Stb 
15089a0568b2Stb 	*out_param = buf;
15099a0568b2Stb 	buf = NULL;
15109a0568b2Stb 
15119a0568b2Stb 	ret = 1;
15129a0568b2Stb 
15139a0568b2Stb  err:
15149a0568b2Stb 	free(buf);
15159a0568b2Stb 
15169a0568b2Stb 	return ret;
15179a0568b2Stb }
15189a0568b2Stb 
1519b9274495Stb static struct ec_curve *
1520b9274495Stb ec_curve_from_group(const EC_GROUP *group)
15219a0568b2Stb {
1522b9274495Stb 	struct ec_curve *curve = NULL;
15239a0568b2Stb 	BN_CTX *ctx;
15249a0568b2Stb 	BIGNUM *p, *a, *b, *x, *y;
15259a0568b2Stb 	const EC_POINT *generator = NULL;
15269a0568b2Stb 	const BIGNUM *order, *cofactor;
15279a0568b2Stb 	size_t seed_len;
15289a0568b2Stb 
15299a0568b2Stb 	if ((ctx = BN_CTX_new()) == NULL)
15309a0568b2Stb 		goto err;
15319a0568b2Stb 	BN_CTX_start(ctx);
15329a0568b2Stb 
15339a0568b2Stb 	if ((p = BN_CTX_get(ctx)) == NULL)
15349a0568b2Stb 		goto err;
15359a0568b2Stb 	if ((a = BN_CTX_get(ctx)) == NULL)
15369a0568b2Stb 		goto err;
15379a0568b2Stb 	if ((b = BN_CTX_get(ctx)) == NULL)
15389a0568b2Stb 		goto err;
15399a0568b2Stb 	if ((x = BN_CTX_get(ctx)) == NULL)
15409a0568b2Stb 		goto err;
15419a0568b2Stb 	if ((y = BN_CTX_get(ctx)) == NULL)
15429a0568b2Stb 		goto err;
15439a0568b2Stb 
15449a0568b2Stb 	if (!EC_GROUP_get_curve(group, p, a, b, ctx))
15459a0568b2Stb 		goto err;
15469a0568b2Stb 	if ((generator = EC_GROUP_get0_generator(group)) == NULL)
15479a0568b2Stb 		goto err;
15489a0568b2Stb 	if (!EC_POINT_get_affine_coordinates(group, generator, x, y, ctx))
15499a0568b2Stb 		goto err;
15509a0568b2Stb 	if ((order = EC_GROUP_get0_order(group)) == NULL)
15519a0568b2Stb 		goto err;
15529a0568b2Stb 
15539a0568b2Stb 	if ((curve = calloc(1, sizeof(*curve))) == NULL)
15549a0568b2Stb 		goto err;
15559a0568b2Stb 
15569a0568b2Stb 	curve->param_len = BN_num_bytes(p);
15579a0568b2Stb 	if (BN_num_bytes(order) > curve->param_len)
15589a0568b2Stb 		curve->param_len = BN_num_bytes(order);
15599a0568b2Stb 
1560b9274495Stb 	if (!ec_curve_encode_parameter(p, curve->param_len, &curve->p))
15619a0568b2Stb 		goto err;
1562b9274495Stb 	if (!ec_curve_encode_parameter(a, curve->param_len, &curve->a))
15639a0568b2Stb 		goto err;
1564b9274495Stb 	if (!ec_curve_encode_parameter(b, curve->param_len, &curve->b))
15659a0568b2Stb 		goto err;
1566b9274495Stb 	if (!ec_curve_encode_parameter(x, curve->param_len, &curve->x))
15679a0568b2Stb 		goto err;
1568b9274495Stb 	if (!ec_curve_encode_parameter(y, curve->param_len, &curve->y))
15699a0568b2Stb 		goto err;
1570b9274495Stb 	if (!ec_curve_encode_parameter(order, curve->param_len, &curve->order))
15719a0568b2Stb 		goto err;
15729a0568b2Stb 
15739a0568b2Stb 	if ((cofactor = EC_GROUP_get0_cofactor(group)) != NULL) {
15749a0568b2Stb 		BN_ULONG cofactor_word;
15759a0568b2Stb 
15769a0568b2Stb 		if ((cofactor_word = BN_get_word(cofactor)) == BN_MASK2)
15779a0568b2Stb 			goto err;
15789a0568b2Stb 		if (cofactor_word > INT_MAX)
15799a0568b2Stb 			goto err;
15809a0568b2Stb 
15819a0568b2Stb 		curve->cofactor = cofactor_word;
15829a0568b2Stb 	}
15839a0568b2Stb 
15849a0568b2Stb 	if ((seed_len = EC_GROUP_get_seed_len(group)) > 0) {
15859a0568b2Stb 		uint8_t *seed;
15869a0568b2Stb 
15879a0568b2Stb 		if (seed_len > INT_MAX)
15889a0568b2Stb 			goto err;
15899a0568b2Stb 		if ((seed = calloc(1, seed_len)) == NULL)
15909a0568b2Stb 			goto err;
15919a0568b2Stb 		memcpy(seed, EC_GROUP_get0_seed(group), seed_len);
15929a0568b2Stb 
15939a0568b2Stb 		curve->seed = seed;
15949a0568b2Stb 		curve->seed_len = seed_len;
15959a0568b2Stb 	}
15969a0568b2Stb 
15979a0568b2Stb 	BN_CTX_end(ctx);
15989a0568b2Stb 	BN_CTX_free(ctx);
15999a0568b2Stb 
16009a0568b2Stb 	return curve;
16019a0568b2Stb 
16029a0568b2Stb  err:
16039a0568b2Stb 	BN_CTX_end(ctx);
16049a0568b2Stb 	BN_CTX_free(ctx);
16059a0568b2Stb 
1606b9274495Stb 	ec_curve_free(curve);
16079a0568b2Stb 
16089a0568b2Stb 	return NULL;
16099a0568b2Stb }
16109a0568b2Stb 
16119a0568b2Stb static int
1612b9274495Stb ec_curve_cmp(const struct ec_curve *a, const struct ec_curve *b)
16139a0568b2Stb {
16149a0568b2Stb 	int cmp;
16159a0568b2Stb 
16169a0568b2Stb 	/* Treat nid as optional. The OID isn't part of EC parameters. */
16179a0568b2Stb 	if (a->nid != NID_undef && b->nid != NID_undef) {
16189a0568b2Stb 		if (a->nid < b->nid)
16199a0568b2Stb 			return -1;
16209a0568b2Stb 		if (a->nid > b->nid)
16219a0568b2Stb 			return 1;
16229a0568b2Stb 	}
16239a0568b2Stb 
16249a0568b2Stb 	if (a->cofactor < b->cofactor)
16259a0568b2Stb 		return -1;
16269a0568b2Stb 	if (a->cofactor > b->cofactor)
16279a0568b2Stb 		return 1;
16289a0568b2Stb 	if (a->param_len < b->param_len)
16299a0568b2Stb 		return -1;
16309a0568b2Stb 	if (a->param_len > b->param_len)
16319a0568b2Stb 		return 1;
16329a0568b2Stb 
16339a0568b2Stb 	if ((cmp = memcmp(a->p, b->p, a->param_len)) != 0)
16349a0568b2Stb 		return cmp;
16359a0568b2Stb 	if ((cmp = memcmp(a->a, b->a, a->param_len)) != 0)
16369a0568b2Stb 		return cmp;
16379a0568b2Stb 	if ((cmp = memcmp(a->b, b->b, a->param_len)) != 0)
16389a0568b2Stb 		return cmp;
16399a0568b2Stb 	if ((cmp = memcmp(a->x, b->x, a->param_len)) != 0)
16409a0568b2Stb 		return cmp;
16419a0568b2Stb 	if ((cmp = memcmp(a->y, b->y, a->param_len)) != 0)
16429a0568b2Stb 		return cmp;
16439a0568b2Stb 	if ((cmp = memcmp(a->order, b->order, a->param_len)) != 0)
16449a0568b2Stb 		return cmp;
16459a0568b2Stb 
16469a0568b2Stb 	/* Seed is optional, not used for computation. Must match if present. */
16479a0568b2Stb 	if (a->seed_len != 0 && b->seed_len != 0) {
16489a0568b2Stb 		if (a->seed_len < b->seed_len)
16499a0568b2Stb 			return -1;
16509a0568b2Stb 		if (a->seed_len > b->seed_len)
16519a0568b2Stb 			return 1;
16529a0568b2Stb 		if (a->seed != NULL && b->seed != NULL) {
16539a0568b2Stb 			if ((cmp = memcmp(a->seed, b->seed, a->seed_len)) != 0)
16549a0568b2Stb 				return cmp;
16559a0568b2Stb 		}
16569a0568b2Stb 	}
16579a0568b2Stb 
16589a0568b2Stb 	return 0;
16599a0568b2Stb }
16609a0568b2Stb 
16619a0568b2Stb static int
1662b9274495Stb ec_group_nid_from_curve(const struct ec_curve *curve)
16639a0568b2Stb {
16649a0568b2Stb 	size_t i;
16659a0568b2Stb 
1666b9274495Stb 	for (i = 0; i < EC_CURVE_LIST_LENGTH; i++) {
1667b9274495Stb 		if (ec_curve_cmp(curve, &ec_curve_list[i]) == 0)
1668b9274495Stb 			return ec_curve_list[i].nid;
16699a0568b2Stb 	}
16709a0568b2Stb 
16719a0568b2Stb 	return NID_undef;
16729a0568b2Stb }
16739a0568b2Stb 
16749a0568b2Stb int
1675c9c3f1d6Stb ec_group_is_builtin_curve(const EC_GROUP *group, int *out_nid)
16769a0568b2Stb {
1677b9274495Stb 	struct ec_curve *curve;
16789a0568b2Stb 	int ret = 0;
1679c9c3f1d6Stb 	int nid;
1680c9c3f1d6Stb 
1681c9c3f1d6Stb 	*out_nid = NID_undef;
16829a0568b2Stb 
1683b9274495Stb 	if ((curve = ec_curve_from_group(group)) == NULL)
16849a0568b2Stb 		goto err;
1685c9c3f1d6Stb 	if ((nid = ec_group_nid_from_curve(curve)) == NID_undef)
16869a0568b2Stb 		goto err;
16879a0568b2Stb 
1688c9c3f1d6Stb 	*out_nid = nid;
1689c9c3f1d6Stb 
16909a0568b2Stb 	ret = 1;
16919a0568b2Stb 
16929a0568b2Stb  err:
1693b9274495Stb 	ec_curve_free(curve);
16949a0568b2Stb 
16959a0568b2Stb 	return ret;
16969a0568b2Stb }
16979a0568b2Stb 
1698f67ac449Stedu size_t
1699776ac9a9Stb EC_get_builtin_curves(EC_builtin_curve *curves, size_t nitems)
17005650a0e1Sdjm {
1701b0e7acedStb 	size_t i;
17025650a0e1Sdjm 
1703776ac9a9Stb 	if (curves == NULL || nitems == 0)
1704b9274495Stb 		return EC_CURVE_LIST_LENGTH;
17055650a0e1Sdjm 
1706b0e7acedStb 	if (nitems > EC_CURVE_LIST_LENGTH)
1707b0e7acedStb 		nitems = EC_CURVE_LIST_LENGTH;
17085650a0e1Sdjm 
1709b0e7acedStb 	for (i = 0; i < nitems; i++) {
1710776ac9a9Stb 		curves[i].nid = ec_curve_list[i].nid;
1711776ac9a9Stb 		curves[i].comment = ec_curve_list[i].comment;
17125650a0e1Sdjm 	}
17135650a0e1Sdjm 
1714b9274495Stb 	return EC_CURVE_LIST_LENGTH;
17155650a0e1Sdjm }
1716ea2baf45Sbeck LCRYPTO_ALIAS(EC_get_builtin_curves);
1717bdb7dc21Sjsing 
1718034a9b39Stb static const struct {
1719034a9b39Stb 	const char *name;
1720034a9b39Stb 	int nid;
1721034a9b39Stb } nist_curves[] = {
1722bdb7dc21Sjsing 	{ "B-163", NID_sect163r2 },
1723bdb7dc21Sjsing 	{ "B-233", NID_sect233r1 },
1724bdb7dc21Sjsing 	{ "B-283", NID_sect283r1 },
1725bdb7dc21Sjsing 	{ "B-409", NID_sect409r1 },
1726bdb7dc21Sjsing 	{ "B-571", NID_sect571r1 },
1727bdb7dc21Sjsing 	{ "K-163", NID_sect163k1 },
1728bdb7dc21Sjsing 	{ "K-233", NID_sect233k1 },
1729bdb7dc21Sjsing 	{ "K-283", NID_sect283k1 },
1730bdb7dc21Sjsing 	{ "K-409", NID_sect409k1 },
1731bdb7dc21Sjsing 	{ "K-571", NID_sect571k1 },
1732bdb7dc21Sjsing 	{ "P-192", NID_X9_62_prime192v1 },
1733bdb7dc21Sjsing 	{ "P-224", NID_secp224r1 },
1734bdb7dc21Sjsing 	{ "P-256", NID_X9_62_prime256v1 },
1735bdb7dc21Sjsing 	{ "P-384", NID_secp384r1 },
1736bdb7dc21Sjsing 	{ "P-521", NID_secp521r1 }
1737bdb7dc21Sjsing };
1738bdb7dc21Sjsing 
1739bdb7dc21Sjsing const char *
1740bdb7dc21Sjsing EC_curve_nid2nist(int nid)
1741bdb7dc21Sjsing {
1742bdb7dc21Sjsing 	size_t i;
1743bdb7dc21Sjsing 
1744034a9b39Stb 	for (i = 0; i < sizeof(nist_curves) / sizeof(nist_curves[0]); i++) {
1745bdb7dc21Sjsing 		if (nist_curves[i].nid == nid)
1746034a9b39Stb 			return nist_curves[i].name;
1747bdb7dc21Sjsing 	}
1748034a9b39Stb 
1749034a9b39Stb 	return NULL;
1750bdb7dc21Sjsing }
1751ea2baf45Sbeck LCRYPTO_ALIAS(EC_curve_nid2nist);
1752bdb7dc21Sjsing 
1753bdb7dc21Sjsing int
1754bdb7dc21Sjsing EC_curve_nist2nid(const char *name)
1755bdb7dc21Sjsing {
1756bdb7dc21Sjsing 	size_t i;
1757bdb7dc21Sjsing 
1758034a9b39Stb 	for (i = 0; i < sizeof(nist_curves) / sizeof(nist_curves[0]); i++) {
1759034a9b39Stb 		if (strcmp(nist_curves[i].name, name) == 0)
1760034a9b39Stb 			return nist_curves[i].nid;
1761bdb7dc21Sjsing 	}
1762034a9b39Stb 
1763034a9b39Stb 	return NID_undef;
1764bdb7dc21Sjsing }
1765ea2baf45Sbeck LCRYPTO_ALIAS(EC_curve_nist2nid);
1766