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