Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of MiniTLS-GPL by
crypto_ecc.c
00001 /* 00002 MiniTLS - A super trimmed down TLS/SSL Library for embedded devices 00003 Author: Donatien Garnier 00004 Copyright (C) 2013-2014 AppNearMe Ltd 00005 00006 This program is free software; you can redistribute it and/or 00007 modify it under the terms of the GNU General Public License 00008 as published by the Free Software Foundation; either version 2 00009 of the License, or (at your option) any later version. 00010 00011 This program is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU General Public License 00017 along with this program; if not, write to the Free Software 00018 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00019 *//** 00020 * \file crypto_ecc.c 00021 * \copyright Copyright (c) AppNearMe Ltd 2013 00022 * \author Donatien Garnier 00023 */ 00024 00025 #define __DEBUG__ 0//4 00026 #ifndef __MODULE__ 00027 #define __MODULE__ "crypto_ecc.c" 00028 #endif 00029 00030 #include "core/fwk.h" 00031 #include "crypto_ecc.h" 00032 #include "inc/minitls_errors.h" 00033 #include "inc/minitls_config.h" 00034 00035 #include "crypto_math.h" 00036 #include "ltc/ltc.h" 00037 00038 static minitls_err_t crypto_ecc_dsa_check_get_asn1_rs(void* r, void* s, const uint8_t* signature, size_t signature_size); 00039 00040 static const crypto_ecc_curve_t crypto_ecc_curves[]; 00041 00042 minitls_err_t crypto_ecc_curve_get(const crypto_ecc_curve_t** curve, crypto_ecc_curve_type_t type) 00043 { 00044 /* 00045 GNUTLS supports: 00046 SECP192R1 = ECC-192 in libtomcrypt 00047 SECP224R1 = ECC-224 in libtomcrypt 00048 SECP256R1 = ECC-256 in libtomcrypt 00049 SECP384R1 = ECC-384 in libtomcrypt 00050 SECP521R1 = ECC-521 in libtomcrypt 00051 00052 So let's support the same ones! 00053 */ 00054 00055 int i = 0; 00056 while(true) 00057 { 00058 const crypto_ecc_curve_t* current_curve = &crypto_ecc_curves[i]; 00059 if(current_curve->size == 0) 00060 { 00061 return MINITLS_ERR_NOT_IMPLEMENTED; 00062 } 00063 if(current_curve->type == type) 00064 { 00065 *curve = current_curve; 00066 break; 00067 } 00068 } 00069 return MINITLS_OK; 00070 } 00071 00072 minitls_err_t crypto_ecc_ansi_x963_import(crypto_ecc_public_key_t* key, const crypto_ecc_curve_t* curve, const uint8_t* x963, size_t size) 00073 { 00074 int err; 00075 00076 /* must be odd */ 00077 if ((size & 1) == 0) { 00078 return MINITLS_ERR_PARAMETERS; 00079 } 00080 00081 /* init key */ 00082 if (mp_init_multi(&key->pubkey.x, &key->pubkey.y, &key->pubkey.z, NULL) != MINITLS_OK) { 00083 return MINITLS_ERR_MEMORY; 00084 } 00085 00086 /* check for 4, 6 or 7 */ 00087 if (x963[0] != 4 && x963[0] != 6 && x963[0] != 7) { 00088 err = MINITLS_ERR_PARAMETERS; 00089 goto error; 00090 } 00091 00092 /* read data */ 00093 mp_read_unsigned_bin(&key->pubkey.x, (unsigned char *)x963+1, (size-1)>>1); 00094 00095 mp_read_unsigned_bin(&key->pubkey.y, (unsigned char *)x963+1+((size-1)>>1), (size-1)>>1); 00096 00097 mp_set(&key->pubkey.z, 1); 00098 00099 if (((size-1)>>1) != (unsigned long) curve->size) { 00100 err = MINITLS_ERR_PARAMETERS; 00101 goto error; 00102 } 00103 00104 key->curve = curve; 00105 00106 /* we're done */ 00107 return MINITLS_OK; 00108 error: 00109 mp_clear_multi(&key->pubkey.x, &key->pubkey.y, &key->pubkey.z, NULL); 00110 return err; 00111 } 00112 00113 minitls_err_t crypto_ecc_ansi_x963_export(const crypto_ecc_public_key_t* key, uint8_t* x963, size_t max_size, size_t* size) 00114 { 00115 00116 unsigned char buf[ECC_BUF_SIZE]; 00117 unsigned long numlen; 00118 00119 numlen = crypto_ecc_get_key_size_for_curve(key->curve); 00120 00121 if (max_size < (1 + 2*numlen)) { 00122 *size = 1 + 2*numlen; 00123 return MINITLS_ERR_BUFFER_TOO_SMALL; 00124 } 00125 00126 /* store byte 0x04 */ 00127 x963[0] = 0x04; 00128 00129 /* pad and store x */ 00130 zeromem(buf, sizeof(buf)); 00131 mp_to_unsigned_bin(&key->pubkey.x, buf + (numlen - mp_unsigned_bin_size(&key->pubkey.x))); 00132 memcpy(x963+1, buf, numlen); 00133 00134 /* pad and store y */ 00135 zeromem(buf, sizeof(buf)); 00136 mp_to_unsigned_bin(&key->pubkey.y, buf + (numlen - mp_unsigned_bin_size(&key->pubkey.y))); 00137 memcpy(x963+1+numlen, buf, numlen); 00138 00139 *size = 1 + 2*numlen; 00140 return MINITLS_OK; 00141 } 00142 00143 minitls_err_t crypto_ecc_generate_key(crypto_ecc_private_key_t* key, const crypto_ecc_curve_t* curve, crypto_prng_t* prng) 00144 { 00145 ecc_point base; 00146 fp_int prime, order; 00147 int ret; 00148 00149 size_t keysize = crypto_ecc_get_key_size_for_curve(curve); 00150 00151 DBG("Generating key of size %d", keysize); 00152 00153 uint8_t buf[keysize]; 00154 00155 /* make up random string */ 00156 DBG("Getting data from PRNG"); 00157 crypto_prng_get(prng, buf, keysize); 00158 #if 0 00159 if( crypto_prng_get(prng, buf, keysize) != MINITLS_OK ) { 00160 ret = MINITLS_ERR_PRNG; 00161 goto errbuf; 00162 } 00163 #endif 00164 00165 DBG("Initializing numbers"); 00166 /* setup the key variables */ 00167 if ((ret = mp_init_multi(&key->pub.pubkey.x, &key->pub.pubkey.y, &key->pub.pubkey.z, &key->privkey, &prime, &order, NULL)) != MINITLS_OK) { 00168 goto errbuf; 00169 } 00170 if ((ret = mp_init_multi(&base.x, &base.y, &base.z, NULL)) != MINITLS_OK) { 00171 ret = MINITLS_ERR_MEMORY; 00172 goto errkey; 00173 } 00174 00175 DBG("Reading the key specs"); 00176 /* read in the specs for this key */ 00177 if ((ret = mp_read_radix(&prime, (char *)curve->prime, 16)) != MINITLS_OK) { goto errkey; } 00178 if ((ret = mp_read_radix(&order, (char *)curve->order, 16)) != MINITLS_OK) { goto errkey; } 00179 if ((ret = mp_read_radix(&base.x, (char *)curve->Gx, 16)) != MINITLS_OK) { goto errkey; } 00180 if ((ret = mp_read_radix(&base.y, (char *)curve->Gy, 16)) != MINITLS_OK) { goto errkey; } 00181 /*if ((ret = */mp_set(&base.z, 1); /*) != MINITLS_OK) { goto errkey; }*/ 00182 /*if ((ret =*/ mp_read_unsigned_bin(&key->privkey, (unsigned char *)buf, keysize);/*) != MINITLS_OK) { goto errkey; }*/ 00183 00184 /* the key should be smaller than the order of base point */ 00185 if (mp_cmp(&key->privkey, &order) != MP_LT) { 00186 if((ret = mp_mod(&key->privkey, &order, &key->privkey)) != MINITLS_OK) { goto errkey; } 00187 } 00188 00189 DBG("Compute public key"); 00190 /* make the public key */ 00191 if ((ret = ltc_ecc_mulmod(&key->privkey, &base, &key->pub.pubkey, &prime, 1)) != MINITLS_OK) { goto errkey; } 00192 00193 //Save curve 00194 key->pub.curve = curve; 00195 00196 DBG("Done"); 00197 /* free up ram */ 00198 ret = MINITLS_OK; 00199 goto cleanup; 00200 errkey: 00201 mp_clear_multi(&key->pub.pubkey.x, &key->pub.pubkey.y, &key->pub.pubkey.z, &key->privkey, NULL); 00202 cleanup: 00203 mp_clear_multi(&base.x, &base.y, &base.z, &prime, &order, NULL); 00204 errbuf: 00205 #ifdef MINITLS_CLEAN_STACK 00206 zeromem(buf, &key->pub.curve->size); 00207 #endif 00208 00209 return ret; 00210 } 00211 00212 size_t crypto_ecc_get_key_size_for_curve(const crypto_ecc_curve_t* curve) 00213 { 00214 switch(curve->type) 00215 { 00216 case secp192r1: 00217 return 192 / 8; 00218 case secp224r1: 00219 return 224 / 8; 00220 case secp256r1: 00221 return 256 / 8; 00222 case secp384r1: 00223 return 384 / 8; 00224 case secp521r1: 00225 return 512 / 8; 00226 default: 00227 break; 00228 } 00229 00230 return 0; 00231 } 00232 00233 const crypto_ecc_public_key_t* crypto_ecc_get_public_key(const crypto_ecc_private_key_t* private_key) 00234 { 00235 return &private_key->pub; 00236 } 00237 00238 minitls_err_t crypto_ecc_dsa_check(const crypto_ecc_public_key_t* key, const uint8_t* hash, size_t hash_size, const uint8_t* signature, size_t signature_size) 00239 { 00240 crypto_ecc_point_t mG, mQ; 00241 fp_int r, s, v, w, u1, u2, e, p, m; 00242 fp_digit mp; 00243 int err; 00244 00245 bool valid = false; 00246 00247 /* default to invalid signature */ 00248 valid = false; 00249 00250 00251 /* allocate ints */ 00252 if ((err = mp_init_multi(&r, &s, &v, &w, &u1, &u2, &p, &e, &m, NULL)) != MINITLS_OK) { 00253 return MINITLS_ERR_MEMORY; 00254 } 00255 00256 /* allocate points */ 00257 err = mp_init_multi(&mG.x, &mG.y, &mG.z, &mQ.x, &mQ.y, &mQ.z, NULL); 00258 if (err) { 00259 mp_clear_multi(&r, &s, &v, &w, &u1, &u2, &p, &e, &m, NULL); 00260 return MINITLS_ERR_MEMORY; 00261 } 00262 00263 #if 0 00264 /* parse header */ 00265 //TODO 00266 if ((err = der_decode_sequence_multi(signature, signature_size, 00267 LTC_ASN1_INTEGER, 1UL, &r, 00268 LTC_ASN1_INTEGER, 1UL, &s, 00269 LTC_ASN1_EOL, 0UL, NULL)) != MINITLS_OK) { 00270 goto error; 00271 } 00272 #endif 00273 00274 //Decode ASN.1 sequence: [INTEGER:&r, INTEGER:&s] 00275 if( (err = crypto_ecc_dsa_check_get_asn1_rs(&r, &s, signature, signature_size) ) != MINITLS_OK ) 00276 { 00277 goto error; 00278 } 00279 00280 /* get the order */ 00281 if ((err = mp_read_radix(&p, (char *)key->curve->order, 16)) != MINITLS_OK) { goto error; } 00282 00283 /* get the modulus */ 00284 if ((err = mp_read_radix(&m, (char *)key->curve->prime, 16)) != MINITLS_OK) { goto error; } 00285 00286 /* check for zero */ 00287 if (mp_iszero(&r) || mp_iszero(&s) || mp_cmp(&r, &p) != MP_LT || mp_cmp(&s, &p) != MP_LT) { 00288 err = MINITLS_ERR_PARAMETERS; 00289 goto error; 00290 } 00291 00292 /* read hash */ 00293 /*if ((err =*/ mp_read_unsigned_bin(&e, (unsigned char *)hash, (int)hash_size);/*) != MINITLS_OK) { goto error; }*/ 00294 00295 /* &w = &s^-1 mod n */ 00296 if ((err = mp_invmod(&s, &p, &w)) != MINITLS_OK) { goto error; } 00297 00298 /* &u1 = ew */ 00299 if ((err = mp_mulmod(&e, &w, &p, &u1)) != MINITLS_OK) { goto error; } 00300 00301 /* &u2 = rw */ 00302 if ((err = mp_mulmod(&r, &w, &p, &u2)) != MINITLS_OK) { goto error; } 00303 00304 /* find mG and mQ */ 00305 if ((err = mp_read_radix(&mG.x, (char *)key->curve->Gx, 16)) != MINITLS_OK) { goto error; } 00306 if ((err = mp_read_radix(&mG.y, (char *)key->curve->Gy, 16)) != MINITLS_OK) { goto error; } 00307 /*if ((err = */mp_set(&mG.z, 1);/*) != MINITLS_OK) { goto error; }*/ 00308 00309 /*if ((err = */mp_copy(&key->pubkey.x, &mQ.x);/*) != MINITLS_OK) { goto error; }*/ 00310 /*if ((err = */mp_copy(&key->pubkey.y, &mQ.y);/*) != MINITLS_OK) { goto error; }*/ 00311 /*if ((err = */mp_copy(&key->pubkey.z, &mQ.z);/*) != MINITLS_OK) { goto error; }*/ 00312 00313 /* compute &u1*mG + &u2*mQ = mG */ 00314 #ifndef LTC_ECC_SHAMIR 00315 // if (ltc_mp.ecc_mul2add == NULL) { 00316 #endif 00317 if ((err = ltc_ecc_mulmod(&u1, &mG, &mG, &m, 0)) != MINITLS_OK) { goto error; } 00318 if ((err = ltc_ecc_mulmod(&u2, &mQ, &mQ, &m, 0)) != MINITLS_OK) { goto error; } 00319 00320 /* find the montgomery mp */ 00321 if ((err = mp_montgomery_setup(&m, &mp)) != MINITLS_OK) { goto error; } 00322 00323 /* add them */ 00324 if ((err = ltc_ecc_projective_add_point(&mQ, &mG, &mG, &m, &mp)) != MINITLS_OK) { goto error; } 00325 00326 /* reduce */ 00327 if ((err = ltc_ecc_map(&mG, &m, &mp)) != MINITLS_OK) { goto error; } 00328 #ifdef LTC_ECC_SHAMIR 00329 /* use Shamir'&s trick to compute &u1*mG + &u2*mQ using half of the doubles */ 00330 if ((err = ltc_ecc_mul2add(&mG, &u1, &mQ, &u2, &mG, &m)) != MINITLS_OK) { goto error; } 00331 #endif 00332 00333 /* &v = X_x1 mod n */ 00334 if ((err = mp_mod(&mG.x, &p, &v)) != MINITLS_OK) { goto error; } 00335 00336 /* does &v == &r */ 00337 if (mp_cmp(&v, &r) == MP_EQ) { 00338 valid = true; 00339 } 00340 00341 error: 00342 mp_clear_multi(&mG.x, &mG.y, &mG.z, &mQ.x, &mQ.y, &mQ.z, &r, &s, &v, &w, &u1, &u2, &p, &e, &m, NULL); 00343 mp_montgomery_free(&mp); 00344 if(err == MINITLS_OK) 00345 { 00346 if(valid) 00347 { 00348 return MINITLS_OK; 00349 } 00350 else 00351 { 00352 return MINITLS_ERR_WRONG_ECDSA; 00353 } 00354 } 00355 else 00356 { 00357 return err; 00358 } 00359 } 00360 00361 minitls_err_t crypto_ecc_dh_generate_shared_secret(const crypto_ecc_private_key_t* private_key, const crypto_ecc_public_key_t* public_key, uint8_t* secret, size_t max_secret_size, size_t* secret_size) 00362 { 00363 unsigned long x; 00364 ecc_point result; 00365 fp_int prime; 00366 int err; 00367 00368 //Check that keys match the same curve 00369 if (private_key->pub.curve->type != public_key->curve->type) { 00370 return MINITLS_ERR_WRONG_CURVE; 00371 } 00372 00373 /* make new point */ 00374 if (mp_init_multi(&result.x, &result.y, &result.z, NULL) != MINITLS_OK) { 00375 return MINITLS_ERR_MEMORY; 00376 } 00377 00378 /*if ((err = */mp_init(&prime);/*) != MINITLS_OK) { 00379 mp_clear_multi(&result->x, &result->y, &result->z, NULL); 00380 return err; 00381 }*/ 00382 00383 if ((err = mp_read_radix(&prime, (char *)private_key->pub.curve->prime, 16)) != MINITLS_OK) { goto done; } 00384 if ((err = ltc_ecc_mulmod(&private_key->privkey, &public_key->pubkey, &result, &prime, 1)) != MINITLS_OK) { goto done; } 00385 00386 x = (unsigned long)mp_unsigned_bin_size(&prime); 00387 if (max_secret_size < x) { 00388 *secret_size = x; 00389 err = MINITLS_ERR_BUFFER_TOO_SMALL; 00390 goto done; 00391 } 00392 zeromem(secret, x); 00393 /*if ((err =*/ mp_to_unsigned_bin(&result.x, secret + (x - mp_unsigned_bin_size(&result.x)));/*) != MINITLS_OK) { goto done; }*/ 00394 00395 err = MINITLS_OK; 00396 *secret_size = x; 00397 done: 00398 mp_clear(&prime); 00399 mp_clear_multi(&result.x, &result.y, &result.z, NULL); 00400 return err; 00401 } 00402 00403 //Decode (&r,&s) integers from ASN.1 Signature 00404 #define ENSURE_SIZE(actual_size, min_size) do{ if( (actual_size) < (min_size) ) { return MINITLS_ERR_PARAMETERS; } }while(0) 00405 minitls_err_t crypto_ecc_dsa_check_get_asn1_rs(void* r, void* s, const uint8_t* signature, size_t signature_size) 00406 { 00407 const uint8_t* p = signature; 00408 size_t sz = signature_size; 00409 00410 ENSURE_SIZE(sz, 1); 00411 00412 if( (p[0] != 0x30) && (p[0] != 0x31) ) //Sequence, SET types 00413 { 00414 return MINITLS_ERR_PARAMETERS; 00415 } 00416 00417 p++; 00418 sz--; 00419 00420 ENSURE_SIZE(sz, 1); 00421 00422 size_t seq_size; 00423 //Get sequence length 00424 if(*p < 0x80) 00425 { 00426 seq_size = p[0]; 00427 p++; 00428 sz--; 00429 } 00430 else if(*p == 0x81) 00431 { 00432 ENSURE_SIZE(sz, 2); 00433 seq_size = p[1]; 00434 p+=2; 00435 sz-=2; 00436 } 00437 else if(*p == 0x82) 00438 { 00439 ENSURE_SIZE(sz, 3); 00440 seq_size = (p[1] << 8) | p[2]; 00441 p+=3; 00442 sz-=3; 00443 } 00444 else if(*p == 0x83) 00445 { 00446 ENSURE_SIZE(sz, 4); 00447 seq_size = (p[1] << 16) | (p[2] << 8) | p[3]; 00448 p+=4; 00449 sz-=4; 00450 } 00451 else if(*p == 0x84) 00452 { 00453 ENSURE_SIZE(sz, 5); 00454 seq_size = (p[1] << 24) |(p[2] << 16) | (p[3] << 8) | p[4]; 00455 p+=5; 00456 sz-=5; 00457 } 00458 else 00459 { 00460 return MINITLS_ERR_PARAMETERS; 00461 } 00462 00463 //Check that sequence size == remaining bytes size 00464 if( seq_size != sz ) 00465 { 00466 return MINITLS_ERR_PARAMETERS; 00467 } 00468 00469 //Read integers 00470 for(int i = 0; i < 2; i++) 00471 { 00472 ENSURE_SIZE(sz, 1); 00473 00474 if( p[0] != 2 ) //Integer type 00475 { 00476 return MINITLS_ERR_PARAMETERS; 00477 } 00478 00479 p++; 00480 sz--; 00481 00482 ENSURE_SIZE(sz, 1); 00483 00484 size_t integer_size; 00485 //Get sequence length 00486 if(*p < 0x80) 00487 { 00488 integer_size = p[0]; 00489 p++; 00490 sz--; 00491 } 00492 else if(*p == 0x81) 00493 { 00494 ENSURE_SIZE(sz, 2); 00495 integer_size = p[1]; 00496 p+=2; 00497 sz-=2; 00498 } 00499 else if(*p == 0x82) 00500 { 00501 ENSURE_SIZE(sz, 3); 00502 integer_size = (p[1] << 8) | p[2]; 00503 p+=3; 00504 sz-=3; 00505 } 00506 else if(*p == 0x83) 00507 { 00508 ENSURE_SIZE(sz, 4); 00509 integer_size = (p[1] << 16) | (p[2] << 8) | p[3]; 00510 p+=4; 00511 sz-=4; 00512 } 00513 else if(*p == 0x84) 00514 { 00515 ENSURE_SIZE(sz, 5); 00516 integer_size = (p[1] << 24) |(p[2] << 16) | (p[3] << 8) | p[4]; 00517 p+=5; 00518 sz-=5; 00519 } 00520 else 00521 { 00522 return MINITLS_ERR_PARAMETERS; 00523 } 00524 00525 //Check that we have enough bytes remaining 00526 ENSURE_SIZE(sz, integer_size); 00527 00528 //Read integer 00529 void* integer = (i==0)?r:s; 00530 00531 /*int err;*/ 00532 /*if ((err = */mp_read_unsigned_bin(integer, (unsigned char *)p, integer_size);/*) != MINITLS_OK) { 00533 return err; 00534 }*/ 00535 00536 p+=integer_size; 00537 sz-=integer_size; 00538 } 00539 00540 if(sz > 0) 00541 { 00542 //Unread parameters left in sequence 00543 return MINITLS_ERR_PARAMETERS; 00544 } 00545 00546 return MINITLS_OK; 00547 } 00548 00549 //List of curves -- storing in strings is not optimal, TODO will have to be addressed at some point 00550 static const crypto_ecc_curve_t crypto_ecc_curves[] = { 00551 #if CRYPTO_ECC160 00552 { 00553 20, 00554 secp160r1, 00555 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF", 00556 "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45", 00557 "0100000000000000000001F4C8F927AED3CA752257", 00558 "4A96B5688EF573284664698968C38BB913CBFC82", 00559 "23A628553168947D59DCC912042351377AC5FB32", 00560 }, 00561 #endif 00562 #if CRYPTO_ECC192 00563 { 00564 24, 00565 secp192r1, 00566 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", 00567 "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", 00568 "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", 00569 "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", 00570 "7192B95FFC8DA78631011ED6B24CDD573F977A11E794811", 00571 }, 00572 #endif 00573 #if CRYPTO_ECC224 00574 { 00575 28, 00576 secp224r1, 00577 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", 00578 "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", 00579 "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", 00580 "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", 00581 "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34", 00582 }, 00583 #endif 00584 #if CRYPTO_ECC256 00585 { 00586 32, 00587 secp256r1, 00588 "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", 00589 "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", 00590 "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", 00591 "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", 00592 "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", 00593 }, 00594 #endif 00595 #if CRYPTO_ECC384 00596 { 00597 48, 00598 secp384r1, 00599 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", 00600 "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", 00601 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", 00602 "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", 00603 "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F", 00604 }, 00605 #endif 00606 #if CRYPTO_ECC521 00607 { 00608 66, 00609 secp521r1, 00610 "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 00611 "51953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", 00612 "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", 00613 "C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", 00614 "11839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650", 00615 }, 00616 #endif 00617 {0,}, 00618 };
Generated on Tue Jul 12 2022 19:20:10 by
1.7.2
