1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/nss/lib/freebl/ecdecode.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,610 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +#ifndef NSS_DISABLE_ECC 1.9 + 1.10 +#ifdef FREEBL_NO_DEPEND 1.11 +#include "stubs.h" 1.12 +#endif 1.13 + 1.14 +#include "blapi.h" 1.15 +#include "secoid.h" 1.16 +#include "secitem.h" 1.17 +#include "secerr.h" 1.18 +#include "ec.h" 1.19 +#include "ecl-curve.h" 1.20 + 1.21 +#define CHECK_OK(func) if (func == NULL) goto cleanup 1.22 +#define CHECK_SEC_OK(func) if (SECSuccess != (rv = func)) goto cleanup 1.23 + 1.24 +/* 1.25 + * Initializes a SECItem from a hexadecimal string 1.26 + * 1.27 + * Warning: This function ignores leading 00's, so any leading 00's 1.28 + * in the hexadecimal string must be optional. 1.29 + */ 1.30 +static SECItem * 1.31 +hexString2SECItem(PLArenaPool *arena, SECItem *item, const char *str) 1.32 +{ 1.33 + int i = 0; 1.34 + int byteval = 0; 1.35 + int tmp = PORT_Strlen(str); 1.36 + 1.37 + if ((tmp % 2) != 0) return NULL; 1.38 + 1.39 + /* skip leading 00's unless the hex string is "00" */ 1.40 + while ((tmp > 2) && (str[0] == '0') && (str[1] == '0')) { 1.41 + str += 2; 1.42 + tmp -= 2; 1.43 + } 1.44 + 1.45 + item->data = (unsigned char *) PORT_ArenaAlloc(arena, tmp/2); 1.46 + if (item->data == NULL) return NULL; 1.47 + item->len = tmp/2; 1.48 + 1.49 + while (str[i]) { 1.50 + if ((str[i] >= '0') && (str[i] <= '9')) 1.51 + tmp = str[i] - '0'; 1.52 + else if ((str[i] >= 'a') && (str[i] <= 'f')) 1.53 + tmp = str[i] - 'a' + 10; 1.54 + else if ((str[i] >= 'A') && (str[i] <= 'F')) 1.55 + tmp = str[i] - 'A' + 10; 1.56 + else 1.57 + return NULL; 1.58 + 1.59 + byteval = byteval * 16 + tmp; 1.60 + if ((i % 2) != 0) { 1.61 + item->data[i/2] = byteval; 1.62 + byteval = 0; 1.63 + } 1.64 + i++; 1.65 + } 1.66 + 1.67 + return item; 1.68 +} 1.69 + 1.70 +/* Copy all of the fields from srcParams into dstParams 1.71 + */ 1.72 +SECStatus 1.73 +EC_CopyParams(PLArenaPool *arena, ECParams *dstParams, 1.74 + const ECParams *srcParams) 1.75 +{ 1.76 + SECStatus rv = SECFailure; 1.77 + 1.78 + dstParams->arena = arena; 1.79 + dstParams->type = srcParams->type; 1.80 + dstParams->fieldID.size = srcParams->fieldID.size; 1.81 + dstParams->fieldID.type = srcParams->fieldID.type; 1.82 + if (srcParams->fieldID.type == ec_field_GFp) { 1.83 + CHECK_SEC_OK(SECITEM_CopyItem(arena, &dstParams->fieldID.u.prime, 1.84 + &srcParams->fieldID.u.prime)); 1.85 + } else { 1.86 + CHECK_SEC_OK(SECITEM_CopyItem(arena, &dstParams->fieldID.u.poly, 1.87 + &srcParams->fieldID.u.poly)); 1.88 + } 1.89 + dstParams->fieldID.k1 = srcParams->fieldID.k1; 1.90 + dstParams->fieldID.k2 = srcParams->fieldID.k2; 1.91 + dstParams->fieldID.k3 = srcParams->fieldID.k3; 1.92 + CHECK_SEC_OK(SECITEM_CopyItem(arena, &dstParams->curve.a, 1.93 + &srcParams->curve.a)); 1.94 + CHECK_SEC_OK(SECITEM_CopyItem(arena, &dstParams->curve.b, 1.95 + &srcParams->curve.b)); 1.96 + CHECK_SEC_OK(SECITEM_CopyItem(arena, &dstParams->curve.seed, 1.97 + &srcParams->curve.seed)); 1.98 + CHECK_SEC_OK(SECITEM_CopyItem(arena, &dstParams->base, 1.99 + &srcParams->base)); 1.100 + CHECK_SEC_OK(SECITEM_CopyItem(arena, &dstParams->order, 1.101 + &srcParams->order)); 1.102 + CHECK_SEC_OK(SECITEM_CopyItem(arena, &dstParams->DEREncoding, 1.103 + &srcParams->DEREncoding)); 1.104 + dstParams->name = srcParams->name; 1.105 + CHECK_SEC_OK(SECITEM_CopyItem(arena, &dstParams->curveOID, 1.106 + &srcParams->curveOID)); 1.107 + dstParams->cofactor = srcParams->cofactor; 1.108 + 1.109 + return SECSuccess; 1.110 + 1.111 +cleanup: 1.112 + return SECFailure; 1.113 +} 1.114 + 1.115 +static SECStatus 1.116 +gf_populate_params(ECCurveName name, ECFieldType field_type, ECParams *params) 1.117 +{ 1.118 + SECStatus rv = SECFailure; 1.119 + const ECCurveParams *curveParams; 1.120 + /* 2 ['0'+'4'] + MAX_ECKEY_LEN * 2 [x,y] * 2 [hex string] + 1 ['\0'] */ 1.121 + char genenc[3 + 2 * 2 * MAX_ECKEY_LEN]; 1.122 + 1.123 + if ((name < ECCurve_noName) || (name > ECCurve_pastLastCurve)) goto cleanup; 1.124 + params->name = name; 1.125 + curveParams = ecCurve_map[params->name]; 1.126 + CHECK_OK(curveParams); 1.127 + params->fieldID.size = curveParams->size; 1.128 + params->fieldID.type = field_type; 1.129 + if (field_type == ec_field_GFp) { 1.130 + CHECK_OK(hexString2SECItem(params->arena, ¶ms->fieldID.u.prime, 1.131 + curveParams->irr)); 1.132 + } else { 1.133 + CHECK_OK(hexString2SECItem(params->arena, ¶ms->fieldID.u.poly, 1.134 + curveParams->irr)); 1.135 + } 1.136 + CHECK_OK(hexString2SECItem(params->arena, ¶ms->curve.a, 1.137 + curveParams->curvea)); 1.138 + CHECK_OK(hexString2SECItem(params->arena, ¶ms->curve.b, 1.139 + curveParams->curveb)); 1.140 + genenc[0] = '0'; 1.141 + genenc[1] = '4'; 1.142 + genenc[2] = '\0'; 1.143 + strcat(genenc, curveParams->genx); 1.144 + strcat(genenc, curveParams->geny); 1.145 + CHECK_OK(hexString2SECItem(params->arena, ¶ms->base, genenc)); 1.146 + CHECK_OK(hexString2SECItem(params->arena, ¶ms->order, 1.147 + curveParams->order)); 1.148 + params->cofactor = curveParams->cofactor; 1.149 + 1.150 + rv = SECSuccess; 1.151 + 1.152 +cleanup: 1.153 + return rv; 1.154 +} 1.155 + 1.156 +SECStatus 1.157 +EC_FillParams(PLArenaPool *arena, const SECItem *encodedParams, 1.158 + ECParams *params) 1.159 +{ 1.160 + SECStatus rv = SECFailure; 1.161 + SECOidTag tag; 1.162 + SECItem oid = { siBuffer, NULL, 0}; 1.163 + 1.164 +#if EC_DEBUG 1.165 + int i; 1.166 + 1.167 + printf("Encoded params in EC_DecodeParams: "); 1.168 + for (i = 0; i < encodedParams->len; i++) { 1.169 + printf("%02x:", encodedParams->data[i]); 1.170 + } 1.171 + printf("\n"); 1.172 +#endif 1.173 + 1.174 + if ((encodedParams->len != ANSI_X962_CURVE_OID_TOTAL_LEN) && 1.175 + (encodedParams->len != SECG_CURVE_OID_TOTAL_LEN)) { 1.176 + PORT_SetError(SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE); 1.177 + return SECFailure; 1.178 + }; 1.179 + 1.180 + oid.len = encodedParams->len - 2; 1.181 + oid.data = encodedParams->data + 2; 1.182 + if ((encodedParams->data[0] != SEC_ASN1_OBJECT_ID) || 1.183 + ((tag = SECOID_FindOIDTag(&oid)) == SEC_OID_UNKNOWN)) { 1.184 + PORT_SetError(SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE); 1.185 + return SECFailure; 1.186 + } 1.187 + 1.188 + params->arena = arena; 1.189 + params->cofactor = 0; 1.190 + params->type = ec_params_named; 1.191 + params->name = ECCurve_noName; 1.192 + 1.193 + /* For named curves, fill out curveOID */ 1.194 + params->curveOID.len = oid.len; 1.195 + params->curveOID.data = (unsigned char *) PORT_ArenaAlloc(arena, oid.len); 1.196 + if (params->curveOID.data == NULL) goto cleanup; 1.197 + memcpy(params->curveOID.data, oid.data, oid.len); 1.198 + 1.199 +#if EC_DEBUG 1.200 + printf("Curve: %s\n", SECOID_FindOIDTagDescription(tag)); 1.201 +#endif 1.202 + 1.203 + switch (tag) { 1.204 + 1.205 + /* Binary curves */ 1.206 + 1.207 + case SEC_OID_ANSIX962_EC_C2PNB163V1: 1.208 + /* Populate params for c2pnb163v1 */ 1.209 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_PNB163V1, ec_field_GF2m, 1.210 + params) ); 1.211 + break; 1.212 + 1.213 + case SEC_OID_ANSIX962_EC_C2PNB163V2: 1.214 + /* Populate params for c2pnb163v2 */ 1.215 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_PNB163V2, ec_field_GF2m, 1.216 + params) ); 1.217 + break; 1.218 + 1.219 + case SEC_OID_ANSIX962_EC_C2PNB163V3: 1.220 + /* Populate params for c2pnb163v3 */ 1.221 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_PNB163V3, ec_field_GF2m, 1.222 + params) ); 1.223 + break; 1.224 + 1.225 + case SEC_OID_ANSIX962_EC_C2PNB176V1: 1.226 + /* Populate params for c2pnb176v1 */ 1.227 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_PNB176V1, ec_field_GF2m, 1.228 + params) ); 1.229 + break; 1.230 + 1.231 + case SEC_OID_ANSIX962_EC_C2TNB191V1: 1.232 + /* Populate params for c2tnb191v1 */ 1.233 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_TNB191V1, ec_field_GF2m, 1.234 + params) ); 1.235 + break; 1.236 + 1.237 + case SEC_OID_ANSIX962_EC_C2TNB191V2: 1.238 + /* Populate params for c2tnb191v2 */ 1.239 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_TNB191V2, ec_field_GF2m, 1.240 + params) ); 1.241 + break; 1.242 + 1.243 + case SEC_OID_ANSIX962_EC_C2TNB191V3: 1.244 + /* Populate params for c2tnb191v3 */ 1.245 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_TNB191V3, ec_field_GF2m, 1.246 + params) ); 1.247 + break; 1.248 + 1.249 + case SEC_OID_ANSIX962_EC_C2PNB208W1: 1.250 + /* Populate params for c2pnb208w1 */ 1.251 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_PNB208W1, ec_field_GF2m, 1.252 + params) ); 1.253 + break; 1.254 + 1.255 + case SEC_OID_ANSIX962_EC_C2TNB239V1: 1.256 + /* Populate params for c2tnb239v1 */ 1.257 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_TNB239V1, ec_field_GF2m, 1.258 + params) ); 1.259 + break; 1.260 + 1.261 + case SEC_OID_ANSIX962_EC_C2TNB239V2: 1.262 + /* Populate params for c2tnb239v2 */ 1.263 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_TNB239V2, ec_field_GF2m, 1.264 + params) ); 1.265 + break; 1.266 + 1.267 + case SEC_OID_ANSIX962_EC_C2TNB239V3: 1.268 + /* Populate params for c2tnb239v3 */ 1.269 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_TNB239V3, ec_field_GF2m, 1.270 + params) ); 1.271 + break; 1.272 + 1.273 + case SEC_OID_ANSIX962_EC_C2PNB272W1: 1.274 + /* Populate params for c2pnb272w1 */ 1.275 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_PNB272W1, ec_field_GF2m, 1.276 + params) ); 1.277 + break; 1.278 + 1.279 + case SEC_OID_ANSIX962_EC_C2PNB304W1: 1.280 + /* Populate params for c2pnb304w1 */ 1.281 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_PNB304W1, ec_field_GF2m, 1.282 + params) ); 1.283 + break; 1.284 + 1.285 + case SEC_OID_ANSIX962_EC_C2TNB359V1: 1.286 + /* Populate params for c2tnb359v1 */ 1.287 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_TNB359V1, ec_field_GF2m, 1.288 + params) ); 1.289 + break; 1.290 + 1.291 + case SEC_OID_ANSIX962_EC_C2PNB368W1: 1.292 + /* Populate params for c2pnb368w1 */ 1.293 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_PNB368W1, ec_field_GF2m, 1.294 + params) ); 1.295 + break; 1.296 + 1.297 + case SEC_OID_ANSIX962_EC_C2TNB431R1: 1.298 + /* Populate params for c2tnb431r1 */ 1.299 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_TNB431R1, ec_field_GF2m, 1.300 + params) ); 1.301 + break; 1.302 + 1.303 + case SEC_OID_SECG_EC_SECT113R1: 1.304 + /* Populate params for sect113r1 */ 1.305 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_113R1, ec_field_GF2m, 1.306 + params) ); 1.307 + break; 1.308 + 1.309 + case SEC_OID_SECG_EC_SECT113R2: 1.310 + /* Populate params for sect113r2 */ 1.311 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_113R2, ec_field_GF2m, 1.312 + params) ); 1.313 + break; 1.314 + 1.315 + case SEC_OID_SECG_EC_SECT131R1: 1.316 + /* Populate params for sect131r1 */ 1.317 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_131R1, ec_field_GF2m, 1.318 + params) ); 1.319 + break; 1.320 + 1.321 + case SEC_OID_SECG_EC_SECT131R2: 1.322 + /* Populate params for sect131r2 */ 1.323 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_131R2, ec_field_GF2m, 1.324 + params) ); 1.325 + break; 1.326 + 1.327 + case SEC_OID_SECG_EC_SECT163K1: 1.328 + /* Populate params for sect163k1 1.329 + * (the NIST K-163 curve) 1.330 + */ 1.331 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_163K1, ec_field_GF2m, 1.332 + params) ); 1.333 + break; 1.334 + 1.335 + case SEC_OID_SECG_EC_SECT163R1: 1.336 + /* Populate params for sect163r1 */ 1.337 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_163R1, ec_field_GF2m, 1.338 + params) ); 1.339 + break; 1.340 + 1.341 + case SEC_OID_SECG_EC_SECT163R2: 1.342 + /* Populate params for sect163r2 1.343 + * (the NIST B-163 curve) 1.344 + */ 1.345 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_163R2, ec_field_GF2m, 1.346 + params) ); 1.347 + break; 1.348 + 1.349 + case SEC_OID_SECG_EC_SECT193R1: 1.350 + /* Populate params for sect193r1 */ 1.351 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_193R1, ec_field_GF2m, 1.352 + params) ); 1.353 + break; 1.354 + 1.355 + case SEC_OID_SECG_EC_SECT193R2: 1.356 + /* Populate params for sect193r2 */ 1.357 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_193R2, ec_field_GF2m, 1.358 + params) ); 1.359 + break; 1.360 + 1.361 + case SEC_OID_SECG_EC_SECT233K1: 1.362 + /* Populate params for sect233k1 1.363 + * (the NIST K-233 curve) 1.364 + */ 1.365 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_233K1, ec_field_GF2m, 1.366 + params) ); 1.367 + break; 1.368 + 1.369 + case SEC_OID_SECG_EC_SECT233R1: 1.370 + /* Populate params for sect233r1 1.371 + * (the NIST B-233 curve) 1.372 + */ 1.373 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_233R1, ec_field_GF2m, 1.374 + params) ); 1.375 + break; 1.376 + 1.377 + case SEC_OID_SECG_EC_SECT239K1: 1.378 + /* Populate params for sect239k1 */ 1.379 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_239K1, ec_field_GF2m, 1.380 + params) ); 1.381 + break; 1.382 + 1.383 + case SEC_OID_SECG_EC_SECT283K1: 1.384 + /* Populate params for sect283k1 1.385 + * (the NIST K-283 curve) 1.386 + */ 1.387 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_283K1, ec_field_GF2m, 1.388 + params) ); 1.389 + break; 1.390 + 1.391 + case SEC_OID_SECG_EC_SECT283R1: 1.392 + /* Populate params for sect283r1 1.393 + * (the NIST B-283 curve) 1.394 + */ 1.395 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_283R1, ec_field_GF2m, 1.396 + params) ); 1.397 + break; 1.398 + 1.399 + case SEC_OID_SECG_EC_SECT409K1: 1.400 + /* Populate params for sect409k1 1.401 + * (the NIST K-409 curve) 1.402 + */ 1.403 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_409K1, ec_field_GF2m, 1.404 + params) ); 1.405 + break; 1.406 + 1.407 + case SEC_OID_SECG_EC_SECT409R1: 1.408 + /* Populate params for sect409r1 1.409 + * (the NIST B-409 curve) 1.410 + */ 1.411 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_409R1, ec_field_GF2m, 1.412 + params) ); 1.413 + break; 1.414 + 1.415 + case SEC_OID_SECG_EC_SECT571K1: 1.416 + /* Populate params for sect571k1 1.417 + * (the NIST K-571 curve) 1.418 + */ 1.419 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_571K1, ec_field_GF2m, 1.420 + params) ); 1.421 + break; 1.422 + 1.423 + case SEC_OID_SECG_EC_SECT571R1: 1.424 + /* Populate params for sect571r1 1.425 + * (the NIST B-571 curve) 1.426 + */ 1.427 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_CHAR2_571R1, ec_field_GF2m, 1.428 + params) ); 1.429 + break; 1.430 + 1.431 + /* Prime curves */ 1.432 + 1.433 + case SEC_OID_ANSIX962_EC_PRIME192V1: 1.434 + /* Populate params for prime192v1 aka secp192r1 1.435 + * (the NIST P-192 curve) 1.436 + */ 1.437 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_PRIME_192V1, ec_field_GFp, 1.438 + params) ); 1.439 + break; 1.440 + 1.441 + case SEC_OID_ANSIX962_EC_PRIME192V2: 1.442 + /* Populate params for prime192v2 */ 1.443 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_PRIME_192V2, ec_field_GFp, 1.444 + params) ); 1.445 + break; 1.446 + 1.447 + case SEC_OID_ANSIX962_EC_PRIME192V3: 1.448 + /* Populate params for prime192v3 */ 1.449 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_PRIME_192V3, ec_field_GFp, 1.450 + params) ); 1.451 + break; 1.452 + 1.453 + case SEC_OID_ANSIX962_EC_PRIME239V1: 1.454 + /* Populate params for prime239v1 */ 1.455 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_PRIME_239V1, ec_field_GFp, 1.456 + params) ); 1.457 + break; 1.458 + 1.459 + case SEC_OID_ANSIX962_EC_PRIME239V2: 1.460 + /* Populate params for prime239v2 */ 1.461 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_PRIME_239V2, ec_field_GFp, 1.462 + params) ); 1.463 + break; 1.464 + 1.465 + case SEC_OID_ANSIX962_EC_PRIME239V3: 1.466 + /* Populate params for prime239v3 */ 1.467 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_PRIME_239V3, ec_field_GFp, 1.468 + params) ); 1.469 + break; 1.470 + 1.471 + case SEC_OID_ANSIX962_EC_PRIME256V1: 1.472 + /* Populate params for prime256v1 aka secp256r1 1.473 + * (the NIST P-256 curve) 1.474 + */ 1.475 + CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_PRIME_256V1, ec_field_GFp, 1.476 + params) ); 1.477 + break; 1.478 + 1.479 + case SEC_OID_SECG_EC_SECP112R1: 1.480 + /* Populate params for secp112r1 */ 1.481 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_PRIME_112R1, ec_field_GFp, 1.482 + params) ); 1.483 + break; 1.484 + 1.485 + case SEC_OID_SECG_EC_SECP112R2: 1.486 + /* Populate params for secp112r2 */ 1.487 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_PRIME_112R2, ec_field_GFp, 1.488 + params) ); 1.489 + break; 1.490 + 1.491 + case SEC_OID_SECG_EC_SECP128R1: 1.492 + /* Populate params for secp128r1 */ 1.493 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_PRIME_128R1, ec_field_GFp, 1.494 + params) ); 1.495 + break; 1.496 + 1.497 + case SEC_OID_SECG_EC_SECP128R2: 1.498 + /* Populate params for secp128r2 */ 1.499 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_PRIME_128R2, ec_field_GFp, 1.500 + params) ); 1.501 + break; 1.502 + 1.503 + case SEC_OID_SECG_EC_SECP160K1: 1.504 + /* Populate params for secp160k1 */ 1.505 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_PRIME_160K1, ec_field_GFp, 1.506 + params) ); 1.507 + break; 1.508 + 1.509 + case SEC_OID_SECG_EC_SECP160R1: 1.510 + /* Populate params for secp160r1 */ 1.511 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_PRIME_160R1, ec_field_GFp, 1.512 + params) ); 1.513 + break; 1.514 + 1.515 + case SEC_OID_SECG_EC_SECP160R2: 1.516 + /* Populate params for secp160r1 */ 1.517 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_PRIME_160R2, ec_field_GFp, 1.518 + params) ); 1.519 + break; 1.520 + 1.521 + case SEC_OID_SECG_EC_SECP192K1: 1.522 + /* Populate params for secp192k1 */ 1.523 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_PRIME_192K1, ec_field_GFp, 1.524 + params) ); 1.525 + break; 1.526 + 1.527 + case SEC_OID_SECG_EC_SECP224K1: 1.528 + /* Populate params for secp224k1 */ 1.529 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_PRIME_224K1, ec_field_GFp, 1.530 + params) ); 1.531 + break; 1.532 + 1.533 + case SEC_OID_SECG_EC_SECP224R1: 1.534 + /* Populate params for secp224r1 1.535 + * (the NIST P-224 curve) 1.536 + */ 1.537 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_PRIME_224R1, ec_field_GFp, 1.538 + params) ); 1.539 + break; 1.540 + 1.541 + case SEC_OID_SECG_EC_SECP256K1: 1.542 + /* Populate params for secp256k1 */ 1.543 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_PRIME_256K1, ec_field_GFp, 1.544 + params) ); 1.545 + break; 1.546 + 1.547 + case SEC_OID_SECG_EC_SECP384R1: 1.548 + /* Populate params for secp384r1 1.549 + * (the NIST P-384 curve) 1.550 + */ 1.551 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_PRIME_384R1, ec_field_GFp, 1.552 + params) ); 1.553 + break; 1.554 + 1.555 + case SEC_OID_SECG_EC_SECP521R1: 1.556 + /* Populate params for secp521r1 1.557 + * (the NIST P-521 curve) 1.558 + */ 1.559 + CHECK_SEC_OK( gf_populate_params(ECCurve_SECG_PRIME_521R1, ec_field_GFp, 1.560 + params) ); 1.561 + break; 1.562 + 1.563 + default: 1.564 + break; 1.565 + }; 1.566 + 1.567 +cleanup: 1.568 + if (!params->cofactor) { 1.569 + PORT_SetError(SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE); 1.570 +#if EC_DEBUG 1.571 + printf("Unrecognized curve, returning NULL params\n"); 1.572 +#endif 1.573 + } 1.574 + 1.575 + return rv; 1.576 +} 1.577 + 1.578 +SECStatus 1.579 +EC_DecodeParams(const SECItem *encodedParams, ECParams **ecparams) 1.580 +{ 1.581 + PLArenaPool *arena; 1.582 + ECParams *params; 1.583 + SECStatus rv = SECFailure; 1.584 + 1.585 + /* Initialize an arena for the ECParams structure */ 1.586 + if (!(arena = PORT_NewArena(NSS_FREEBL_DEFAULT_CHUNKSIZE))) 1.587 + return SECFailure; 1.588 + 1.589 + params = (ECParams *)PORT_ArenaZAlloc(arena, sizeof(ECParams)); 1.590 + if (!params) { 1.591 + PORT_FreeArena(arena, PR_TRUE); 1.592 + return SECFailure; 1.593 + } 1.594 + 1.595 + /* Copy the encoded params */ 1.596 + SECITEM_AllocItem(arena, &(params->DEREncoding), 1.597 + encodedParams->len); 1.598 + memcpy(params->DEREncoding.data, encodedParams->data, encodedParams->len); 1.599 + 1.600 + /* Fill out the rest of the ECParams structure based on 1.601 + * the encoded params 1.602 + */ 1.603 + rv = EC_FillParams(arena, encodedParams, params); 1.604 + if (rv == SECFailure) { 1.605 + PORT_FreeArena(arena, PR_TRUE); 1.606 + return SECFailure; 1.607 + } else { 1.608 + *ecparams = params;; 1.609 + return SECSuccess; 1.610 + } 1.611 +} 1.612 + 1.613 +#endif /* NSS_DISABLE_ECC */