1/* 2 * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. 3 * Use is subject to license terms. 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public License 16 * along with this library; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24/* ********************************************************************* 25 * 26 * The Original Code is the elliptic curve math library. 27 * 28 * The Initial Developer of the Original Code is 29 * Sun Microsystems, Inc. 30 * Portions created by the Initial Developer are Copyright (C) 2003 31 * the Initial Developer. All Rights Reserved. 32 * 33 * Contributor(s): 34 * Douglas Stebila <douglas@stebila.ca>, Sun Microsystems Laboratories 35 * 36 *********************************************************************** */ 37 38#include "ecl.h" 39#include "ecl-curve.h" 40#include "ecl-priv.h" 41#ifndef _KERNEL 42#include <stdlib.h> 43#include <string.h> 44#endif 45 46#define CHECK(func) if ((func) == NULL) { res = 0; goto CLEANUP; } 47 48/* Duplicates an ECCurveParams */ 49ECCurveParams * 50ECCurveParams_dup(const ECCurveParams * params, int kmflag) 51{ 52 int res = 1; 53 ECCurveParams *ret = NULL; 54 55#ifdef _KERNEL 56 ret = (ECCurveParams *) kmem_zalloc(sizeof(ECCurveParams), kmflag); 57#else 58 CHECK(ret = (ECCurveParams *) calloc(1, sizeof(ECCurveParams))); 59#endif 60 if (params->text != NULL) { 61#ifdef _KERNEL 62 ret->text = kmem_alloc(strlen(params->text) + 1, kmflag); 63 bcopy(params->text, ret->text, strlen(params->text) + 1); 64#else 65 CHECK(ret->text = strdup(params->text)); 66#endif 67 } 68 ret->field = params->field; 69 ret->size = params->size; 70 if (params->irr != NULL) { 71#ifdef _KERNEL 72 ret->irr = kmem_alloc(strlen(params->irr) + 1, kmflag); 73 bcopy(params->irr, ret->irr, strlen(params->irr) + 1); 74#else 75 CHECK(ret->irr = strdup(params->irr)); 76#endif 77 } 78 if (params->curvea != NULL) { 79#ifdef _KERNEL 80 ret->curvea = kmem_alloc(strlen(params->curvea) + 1, kmflag); 81 bcopy(params->curvea, ret->curvea, strlen(params->curvea) + 1); 82#else 83 CHECK(ret->curvea = strdup(params->curvea)); 84#endif 85 } 86 if (params->curveb != NULL) { 87#ifdef _KERNEL 88 ret->curveb = kmem_alloc(strlen(params->curveb) + 1, kmflag); 89 bcopy(params->curveb, ret->curveb, strlen(params->curveb) + 1); 90#else 91 CHECK(ret->curveb = strdup(params->curveb)); 92#endif 93 } 94 if (params->genx != NULL) { 95#ifdef _KERNEL 96 ret->genx = kmem_alloc(strlen(params->genx) + 1, kmflag); 97 bcopy(params->genx, ret->genx, strlen(params->genx) + 1); 98#else 99 CHECK(ret->genx = strdup(params->genx)); 100#endif 101 } 102 if (params->geny != NULL) { 103#ifdef _KERNEL 104 ret->geny = kmem_alloc(strlen(params->geny) + 1, kmflag); 105 bcopy(params->geny, ret->geny, strlen(params->geny) + 1); 106#else 107 CHECK(ret->geny = strdup(params->geny)); 108#endif 109 } 110 if (params->order != NULL) { 111#ifdef _KERNEL 112 ret->order = kmem_alloc(strlen(params->order) + 1, kmflag); 113 bcopy(params->order, ret->order, strlen(params->order) + 1); 114#else 115 CHECK(ret->order = strdup(params->order)); 116#endif 117 } 118 ret->cofactor = params->cofactor; 119 120 CLEANUP: 121 if (res != 1) { 122 EC_FreeCurveParams(ret); 123 return NULL; 124 } 125 return ret; 126} 127 128#undef CHECK 129 130/* Construct ECCurveParams from an ECCurveName */ 131ECCurveParams * 132EC_GetNamedCurveParams(const ECCurveName name, int kmflag) 133{ 134 if ((name <= ECCurve_noName) || (ECCurve_pastLastCurve <= name) || 135 (ecCurve_map[name] == NULL)) { 136 return NULL; 137 } else { 138 return ECCurveParams_dup(ecCurve_map[name], kmflag); 139 } 140} 141 142/* Free the memory allocated (if any) to an ECCurveParams object. */ 143void 144EC_FreeCurveParams(ECCurveParams * params) 145{ 146 if (params == NULL) 147 return; 148 if (params->text != NULL) 149#ifdef _KERNEL 150 kmem_free(params->text, strlen(params->text) + 1); 151#else 152 free(params->text); 153#endif 154 if (params->irr != NULL) 155#ifdef _KERNEL 156 kmem_free(params->irr, strlen(params->irr) + 1); 157#else 158 free(params->irr); 159#endif 160 if (params->curvea != NULL) 161#ifdef _KERNEL 162 kmem_free(params->curvea, strlen(params->curvea) + 1); 163#else 164 free(params->curvea); 165#endif 166 if (params->curveb != NULL) 167#ifdef _KERNEL 168 kmem_free(params->curveb, strlen(params->curveb) + 1); 169#else 170 free(params->curveb); 171#endif 172 if (params->genx != NULL) 173#ifdef _KERNEL 174 kmem_free(params->genx, strlen(params->genx) + 1); 175#else 176 free(params->genx); 177#endif 178 if (params->geny != NULL) 179#ifdef _KERNEL 180 kmem_free(params->geny, strlen(params->geny) + 1); 181#else 182 free(params->geny); 183#endif 184 if (params->order != NULL) 185#ifdef _KERNEL 186 kmem_free(params->order, strlen(params->order) + 1); 187#else 188 free(params->order); 189#endif 190#ifdef _KERNEL 191 kmem_free(params, sizeof(ECCurveParams)); 192#else 193 free(params); 194#endif 195} 196