ecdecode.c revision 1
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans/* BEGIN CSTYLED */
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * ***** BEGIN LICENSE BLOCK *****
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * Version: MPL 1.1/GPL 2.0/LGPL 2.1
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * The contents of this file are subject to the Mozilla Public License Version
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * 1.1 (the "License"); you may not use this file except in compliance with
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * the License. You may obtain a copy of the License at
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * Software distributed under the License is distributed on an "AS IS" basis,
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * for the specific language governing rights and limitations under the
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * The Original Code is the Elliptic Curve Cryptography library.
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * The Initial Developer of the Original Code is
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * Sun Microsystems, Inc.
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * Portions created by the Initial Developer are Copyright (C) 2003
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * the Initial Developer. All Rights Reserved.
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * Contributor(s):
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * Dr Vipul Gupta <vipul.gupta@sun.com> and
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * Douglas Stebila <douglas@stebila.ca>, Sun Microsystems Laboratories
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * Alternatively, the contents of this file may be used under the terms of
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * either the GNU General Public License Version 2 or later (the "GPL"), or
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * in which case the provisions of the GPL or the LGPL are applicable instead
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * of those above. If you wish to allow use of your version of this file only
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * under the terms of either the GPL or the LGPL, and not to allow others to
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * use your version of this file under the terms of the MPL, indicate your
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * decision by deleting the provisions above and replace them with the notice
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * and other provisions required by the GPL or the LGPL. If you do not delete
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * the provisions above, a recipient may use your version of this file under
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * the terms of any one of the MPL, the GPL or the LGPL.
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * ***** END LICENSE BLOCK ***** */
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * Sun elects to use this software under the MPL license.
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * Initializes a SECItem from a hexadecimal string
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * Warning: This function ignores leading 00's, so any leading 00's
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans * in the hexadecimal string must be optional.
20c1c3551cb3b3117591ae38463d16aada597c48Rod EvanshexString2SECItem(PRArenaPool *arena, SECItem *item, const char *str,
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans /* skip leading 00's unless the hex string is "00" */
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans while ((tmp > 2) && (str[0] == '0') && (str[1] == '0')) {
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans item->data = (unsigned char *) PORT_ArenaAlloc(arena, tmp/2, kmflag);
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans while (str[i]) {
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans if ((i % 2) != 0) {
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evansgf_populate_params(ECCurveName name, ECFieldType field_type, ECParams *params,
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans /* 2 ['0'+'4'] + MAX_ECKEY_LEN * 2 [x,y] * 2 [hex string] + 1 ['\0'] */
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans if ((name < ECCurve_noName) || (name > ECCurve_pastLastCurve)) goto cleanup;
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans CHECK_OK(hexString2SECItem(NULL, ¶ms->fieldID.u.prime,
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans CHECK_OK(hexString2SECItem(NULL, ¶ms->fieldID.u.poly,
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans CHECK_OK(hexString2SECItem(NULL, ¶ms->curve.a,
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans CHECK_OK(hexString2SECItem(NULL, ¶ms->curve.b,
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans CHECK_OK(hexString2SECItem(NULL, ¶ms->base, genenc, kmflag));
20c1c3551cb3b3117591ae38463d16aada597c48Rod EvansEC_FillParams(PRArenaPool *arena, const SECItem *encodedParams,
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans if ((encodedParams->len != ANSI_X962_CURVE_OID_TOTAL_LEN) &&
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans (encodedParams->len != SECG_CURVE_OID_TOTAL_LEN)) {
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans PORT_SetError(SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE);
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans if ((encodedParams->data[0] != SEC_ASN1_OBJECT_ID) ||
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans ((tag = SECOID_FindOIDTag(&oid)) == ECCurve_noName)) {
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans PORT_SetError(SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE);
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans /* For named curves, fill out curveOID */
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans params->curveOID.data = (unsigned char *) PORT_ArenaAlloc(NULL, oid.len,
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans printf("Curve: %s\n", SECOID_FindOIDTagDescription(tag));
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans /* Binary curves */
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans /* Populate params for c2pnb163v1 */
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_PNB163V1, ec_field_GF2m,
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans /* Populate params for c2pnb163v2 */
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_PNB163V2, ec_field_GF2m,
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans /* Populate params for c2pnb163v3 */
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_PNB163V3, ec_field_GF2m,
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans /* Populate params for c2pnb176v1 */
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_PNB176V1, ec_field_GF2m,
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans /* Populate params for c2tnb191v1 */
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_TNB191V1, ec_field_GF2m,
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans /* Populate params for c2tnb191v2 */
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans CHECK_SEC_OK( gf_populate_params(ECCurve_X9_62_CHAR2_TNB191V2, ec_field_GF2m,
20c1c3551cb3b3117591ae38463d16aada597c48Rod Evans /* Populate params for c2tnb191v3 */
case ECCurve_SECG_CHAR2_113R1:
case ECCurve_SECG_CHAR2_113R2:
case ECCurve_SECG_CHAR2_131R1:
case ECCurve_SECG_CHAR2_131R2:
case ECCurve_SECG_CHAR2_163K1:
case ECCurve_SECG_CHAR2_163R1:
case ECCurve_SECG_CHAR2_163R2:
case ECCurve_SECG_CHAR2_193R1:
case ECCurve_SECG_CHAR2_193R2:
case ECCurve_SECG_CHAR2_233K1:
case ECCurve_SECG_CHAR2_233R1:
case ECCurve_SECG_CHAR2_239K1:
case ECCurve_SECG_CHAR2_283K1:
case ECCurve_SECG_CHAR2_283R1:
case ECCurve_SECG_CHAR2_409K1:
case ECCurve_SECG_CHAR2_409R1:
case ECCurve_SECG_CHAR2_571K1:
case ECCurve_SECG_CHAR2_571R1:
case ECCurve_SECG_PRIME_112R1:
case ECCurve_SECG_PRIME_112R2:
case ECCurve_SECG_PRIME_128R1:
case ECCurve_SECG_PRIME_128R2:
case ECCurve_SECG_PRIME_160K1:
case ECCurve_SECG_PRIME_160R1:
case ECCurve_SECG_PRIME_160R2:
case ECCurve_SECG_PRIME_192K1:
case ECCurve_SECG_PRIME_224K1:
case ECCurve_SECG_PRIME_224R1:
case ECCurve_SECG_PRIME_256K1:
case ECCurve_SECG_PRIME_384R1:
case ECCurve_SECG_PRIME_521R1:
#if EC_DEBUG
return rv;
return SECFailure;
if (!params) {
return SECFailure;
kmflag);
return SECFailure;
return SECSuccess;
return SECSuccess;
return SECFailure;