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