1/*
2 * Copyright (c) 2007, 2017, 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 Netscape security libraries.
27 *
28 * The Initial Developer of the Original Code is
29 * Netscape Communications Corporation.
30 * Portions created by the Initial Developer are Copyright (C) 1994-2000
31 * the Initial Developer. All Rights Reserved.
32 *
33 * Contributor(s):
34 * Dr Vipul Gupta <vipul.gupta@sun.com> and
35 * Douglas Stebila <douglas@stebila.ca>, Sun Microsystems Laboratories
36 *
37 * Last Modified Date from the Original Code: May 2017
38 *********************************************************************** */
39
40#ifndef _ECC_IMPL_H
41#define _ECC_IMPL_H
42
43#ifdef __cplusplus
44extern "C" {
45#endif
46
47#include <sys/types.h>
48#include "ecl-exp.h"
49
50/*
51 * Multi-platform definitions
52 */
53#ifdef __linux__
54#define B_FALSE FALSE
55#define B_TRUE TRUE
56typedef unsigned char uint8_t;
57typedef unsigned long ulong_t;
58typedef enum { B_FALSE, B_TRUE } boolean_t;
59#endif /* __linux__ */
60
61#ifdef _ALLBSD_SOURCE
62#include <stdint.h>
63#define B_FALSE FALSE
64#define B_TRUE TRUE
65typedef unsigned long ulong_t;
66typedef enum boolean { B_FALSE, B_TRUE } boolean_t;
67#endif /* _ALLBSD_SOURCE */
68
69#ifdef AIX
70#define B_FALSE FALSE
71#define B_TRUE TRUE
72typedef unsigned char uint8_t;
73typedef unsigned long ulong_t;
74#endif /* AIX */
75
76#ifdef _WIN32
77typedef unsigned char uint8_t;
78typedef unsigned long ulong_t;
79typedef enum boolean { B_FALSE, B_TRUE } boolean_t;
80#define strdup _strdup /* Replace POSIX name with ISO C++ name */
81#endif /* _WIN32 */
82
83#ifndef _KERNEL
84#include <stdlib.h>
85#endif /* _KERNEL */
86
87#define EC_MAX_DIGEST_LEN 1024 /* max digest that can be signed */
88#define EC_MAX_POINT_LEN 145 /* max len of DER encoded Q */
89#define EC_MAX_VALUE_LEN 72 /* max len of ANSI X9.62 private value d */
90#define EC_MAX_SIG_LEN 144 /* max signature len for supported curves */
91#define EC_MIN_KEY_LEN 112 /* min key length in bits */
92#define EC_MAX_KEY_LEN 571 /* max key length in bits */
93#define EC_MAX_OID_LEN 10 /* max length of OID buffer */
94
95/*
96 * Various structures and definitions from NSS are here.
97 */
98
99#ifdef _KERNEL
100#define PORT_ArenaAlloc(a, n, f) kmem_alloc((n), (f))
101#define PORT_ArenaZAlloc(a, n, f) kmem_zalloc((n), (f))
102#define PORT_ArenaGrow(a, b, c, d) NULL
103#define PORT_ZAlloc(n, f) kmem_zalloc((n), (f))
104#define PORT_Alloc(n, f) kmem_alloc((n), (f))
105#else
106#define PORT_ArenaAlloc(a, n, f) malloc((n))
107#define PORT_ArenaZAlloc(a, n, f) calloc(1, (n))
108#define PORT_ArenaGrow(a, b, c, d) NULL
109#define PORT_ZAlloc(n, f) calloc(1, (n))
110#define PORT_Alloc(n, f) malloc((n))
111#endif
112
113#define PORT_NewArena(b) (char *)12345
114#define PORT_ArenaMark(a) NULL
115#define PORT_ArenaUnmark(a, b)
116#define PORT_ArenaRelease(a, m)
117#define PORT_FreeArena(a, b)
118#define PORT_Strlen(s) strlen((s))
119#define PORT_SetError(e)
120
121#define PRBool boolean_t
122#define PR_TRUE B_TRUE
123#define PR_FALSE B_FALSE
124
125#ifdef _KERNEL
126#define PORT_Assert ASSERT
127#define PORT_Memcpy(t, f, l) bcopy((f), (t), (l))
128#else
129#define PORT_Assert assert
130#define PORT_Memcpy(t, f, l) memcpy((t), (f), (l))
131#endif
132
133#define CHECK_OK(func) if (func == NULL) goto cleanup
134#define CHECK_SEC_OK(func) if (SECSuccess != (rv = func)) goto cleanup
135
136typedef enum {
137 siBuffer = 0,
138 siClearDataBuffer = 1,
139 siCipherDataBuffer = 2,
140 siDERCertBuffer = 3,
141 siEncodedCertBuffer = 4,
142 siDERNameBuffer = 5,
143 siEncodedNameBuffer = 6,
144 siAsciiNameString = 7,
145 siAsciiString = 8,
146 siDEROID = 9,
147 siUnsignedInteger = 10,
148 siUTCTime = 11,
149 siGeneralizedTime = 12
150} SECItemType;
151
152typedef struct SECItemStr SECItem;
153
154struct SECItemStr {
155 SECItemType type;
156 unsigned char *data;
157 unsigned int len;
158};
159
160typedef SECItem SECKEYECParams;
161
162typedef enum { ec_params_explicit,
163 ec_params_named
164} ECParamsType;
165
166typedef enum { ec_field_GFp = 1,
167 ec_field_GF2m
168} ECFieldType;
169
170struct ECFieldIDStr {
171 int size; /* field size in bits */
172 ECFieldType type;
173 union {
174 SECItem prime; /* prime p for (GFp) */
175 SECItem poly; /* irreducible binary polynomial for (GF2m) */
176 } u;
177 int k1; /* first coefficient of pentanomial or
178 * the only coefficient of trinomial
179 */
180 int k2; /* two remaining coefficients of pentanomial */
181 int k3;
182};
183typedef struct ECFieldIDStr ECFieldID;
184
185struct ECCurveStr {
186 SECItem a; /* contains octet stream encoding of
187 * field element (X9.62 section 4.3.3)
188 */
189 SECItem b;
190 SECItem seed;
191};
192typedef struct ECCurveStr ECCurve;
193
194typedef void PRArenaPool;
195
196struct ECParamsStr {
197 PRArenaPool * arena;
198 ECParamsType type;
199 ECFieldID fieldID;
200 ECCurve curve;
201 SECItem base;
202 SECItem order;
203 int cofactor;
204 SECItem DEREncoding;
205 ECCurveName name;
206 SECItem curveOID;
207};
208typedef struct ECParamsStr ECParams;
209
210struct ECPublicKeyStr {
211 ECParams ecParams;
212 SECItem publicValue; /* elliptic curve point encoded as
213 * octet stream.
214 */
215};
216typedef struct ECPublicKeyStr ECPublicKey;
217
218struct ECPrivateKeyStr {
219 ECParams ecParams;
220 SECItem publicValue; /* encoded ec point */
221 SECItem privateValue; /* private big integer */
222 SECItem version; /* As per SEC 1, Appendix C, Section C.4 */
223};
224typedef struct ECPrivateKeyStr ECPrivateKey;
225
226typedef enum _SECStatus {
227 SECBufferTooSmall = -3,
228 SECWouldBlock = -2,
229 SECFailure = -1,
230 SECSuccess = 0
231} SECStatus;
232
233#ifdef _KERNEL
234#define RNG_GenerateGlobalRandomBytes(p,l) ecc_knzero_random_generator((p), (l))
235#else
236/*
237 This function is no longer required because the random bytes are now
238 supplied by the caller. Force a failure.
239*/
240#define RNG_GenerateGlobalRandomBytes(p,l) SECFailure
241#endif
242#define CHECK_MPI_OK(func) if (MP_OKAY > (err = func)) goto cleanup
243#define MP_TO_SEC_ERROR(err)
244
245#define SECITEM_TO_MPINT(it, mp) \
246 CHECK_MPI_OK(mp_read_unsigned_octets((mp), (it).data, (it).len))
247
248extern int ecc_knzero_random_generator(uint8_t *, size_t);
249extern ulong_t soft_nzero_random_generator(uint8_t *, ulong_t);
250
251extern SECStatus EC_DecodeParams(const SECItem *, ECParams **, int);
252extern SECItem * SECITEM_AllocItem(PRArenaPool *, SECItem *, unsigned int, int);
253extern SECStatus SECITEM_CopyItem(PRArenaPool *, SECItem *, const SECItem *,
254 int);
255extern void SECITEM_FreeItem(SECItem *, boolean_t);
256/* This function has been modified to accept an array of random bytes */
257extern SECStatus EC_NewKey(ECParams *ecParams, ECPrivateKey **privKey,
258 const unsigned char* random, int randomlen, int);
259/* This function has been modified to accept an array of random bytes */
260extern SECStatus ECDSA_SignDigest(ECPrivateKey *, SECItem *, const SECItem *,
261 const unsigned char* random, int randomlen, int, int timing);
262extern SECStatus ECDSA_VerifyDigest(ECPublicKey *, const SECItem *,
263 const SECItem *, int);
264extern SECStatus ECDH_Derive(SECItem *, ECParams *, SECItem *, boolean_t,
265 SECItem *, int);
266
267#ifdef __cplusplus
268}
269#endif
270
271#endif /* _ECC_IMPL_H */
272