f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * ***** BEGIN LICENSE BLOCK *****
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * Version: MPL 1.1/GPL 2.0/LGPL 2.1
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * The contents of this file are subject to the Mozilla Public License Version
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * 1.1 (the "License"); you may not use this file except in compliance with
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * the License. You may obtain a copy of the License at
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * Software distributed under the License is distributed on an "AS IS" basis,
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * for the specific language governing rights and limitations under the
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * The Original Code is the elliptic curve math library.
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * The Initial Developer of the Original Code is
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * Sun Microsystems, Inc.
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * Portions created by the Initial Developer are Copyright (C) 2003
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * the Initial Developer. All Rights Reserved.
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * Contributor(s):
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * Douglas Stebila <douglas@stebila.ca>, Sun Microsystems Laboratories
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * Alternatively, the contents of this file may be used under the terms of
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * either the GNU General Public License Version 2 or later (the "GPL"), or
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * in which case the provisions of the GPL or the LGPL are applicable instead
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * of those above. If you wish to allow use of your version of this file only
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * under the terms of either the GPL or the LGPL, and not to allow others to
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * use your version of this file under the terms of the MPL, indicate your
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * decision by deleting the provisions above and replace them with the notice
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * and other provisions required by the GPL or the LGPL. If you do not delete
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * the provisions above, a recipient may use your version of this file under
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * the terms of any one of the MPL, the GPL or the LGPL.
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * ***** END LICENSE BLOCK ***** */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * Use is subject to license terms.
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * Sun elects to use this software under the MPL license.
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers#pragma ident "%Z%%M% %I% %E% SMI"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers/* Allocate memory for a new ECGroup object. */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers group = (ECGroup *) kmem_alloc(sizeof(ECGroup), kmflag);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers/* Construct a generic ECGroup for elliptic curves over prime fields. */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersECGroup_consGFp(const mp_int *irr, const mp_int *curvea,
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers const mp_int *geny, const mp_int *order, int cofactor)
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers/* Construct a generic ECGroup for elliptic curves over prime fields with
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * field arithmetic implemented in Montgomery coordinates. */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersECGroup_consGFp_mont(const mp_int *irr, const mp_int *curvea,
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers const mp_int *geny, const mp_int *order, int cofactor)
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers MP_CHECKOK(group->meth->field_enc(genx, &group->genx, group->meth));
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers MP_CHECKOK(group->meth->field_enc(geny, &group->geny, group->meth));
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers/* Construct a generic ECGroup for elliptic curves over binary polynomial
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * fields. */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersECGroup_consGF2m(const mp_int *irr, const unsigned int irr_arr[5],
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers/* Construct ECGroup from hex parameters and name, if any. Called by
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * ECGroup_fromHex and ECGroup_fromName. */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers /* initialize values */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers MP_CHECKOK(mp_read_radix(&curvea, params->curvea, 16));
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers MP_CHECKOK(mp_read_radix(&curveb, params->curveb, 16));
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers MP_CHECKOK(mp_read_radix(&genx, params->genx, 16));
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers MP_CHECKOK(mp_read_radix(&geny, params->geny, 16));
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers MP_CHECKOK(mp_read_radix(&order, params->order, 16));
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers /* determine number of bits */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers /* determine which optimizations (if any) to use */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers ECGroup_consGFp(&irr, &curvea, &curveb, &genx, &geny,
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers if (group == NULL) { res = MP_UNDEF; goto CLEANUP; }
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers ECGroup_consGFp(&irr, &curvea, &curveb, &genx, &geny,
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers if (group == NULL) { res = MP_UNDEF; goto CLEANUP; }
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers ECGroup_consGFp(&irr, &curvea, &curveb, &genx, &geny,
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers if (group == NULL) { res = MP_UNDEF; goto CLEANUP; }
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers ECGroup_consGFp(&irr, &curvea, &curveb, &genx, &geny,
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers if (group == NULL) { res = MP_UNDEF; goto CLEANUP; }
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers ECGroup_consGFp(&irr, &curvea, &curveb, &genx, &geny,
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers if (group == NULL) { res = MP_UNDEF; goto CLEANUP; }
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers ECGroup_consGFp(&irr, &curvea, &curveb, &genx, &geny,
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers if (group == NULL) { res = MP_UNDEF; goto CLEANUP; }
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers ECGroup_consGFp(&irr, &curvea, &curveb, &genx, &geny,
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers if (group == NULL) { res = MP_UNDEF; goto CLEANUP; }
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers /* use generic arithmetic */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers ECGroup_consGFp_mont(&irr, &curvea, &curveb, &genx, &geny,
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers if (group == NULL) { res = MP_UNDEF; goto CLEANUP; }
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers group = ECGroup_consGF2m(&irr, NULL, &curvea, &curveb, &genx, &geny, &order, params->cofactor);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers if (group == NULL) { res = MP_UNDEF; goto CLEANUP; }
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers /* set name, if any */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers/* Construct ECGroup from hexadecimal representations of parameters. */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersECGroup_fromHex(const ECCurveParams * params, int kmflag)
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers return ecgroup_fromNameAndHex(ECCurve_noName, params, kmflag);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers/* Construct ECGroup from named parameters. */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersECGroup_fromName(const ECCurveName name, int kmflag)
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers /* construct actual group */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers group = ecgroup_fromNameAndHex(name, params, kmflag);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers/* Validates an EC public key as described in Section 5.2.2 of X9.62. */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersmp_err ECPoint_validate(const ECGroup *group, const mp_int *px, const
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers /* 1: Verify that publicValue is not the point at infinity */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers /* 2: Verify that the coordinates of publicValue are elements
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * of the field.
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers /* 3: Verify that publicValue is on the curve. */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers /* 4: Verify that the order of the curve times the publicValue
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * is the point at infinity.
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers/* Free the memory allocated (if any) to an ECGroup object. */