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
44 extern "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
56 typedef unsigned char uint8_t;
57 typedef unsigned long ulong_t;
58 typedef 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
65 typedef unsigned long ulong_t;
66 typedef 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
72 typedef unsigned char uint8_t;
73 typedef unsigned long ulong_t;
74 #endif /* AIX */
75 
76 #ifdef _WIN32
77 typedef unsigned char uint8_t;
78 typedef unsigned long ulong_t;
79 typedef 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 
136 typedef 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 
152 typedef struct SECItemStr SECItem;
153 
154 struct SECItemStr {
155         SECItemType type;
156         unsigned char *data;
157         unsigned int len;
158 };
159 
160 typedef SECItem SECKEYECParams;
161 
162 typedef enum { ec_params_explicit,
163                ec_params_named
164 } ECParamsType;
165 
166 typedef enum { ec_field_GFp = 1,
167                ec_field_GF2m
168 } ECFieldType;
169 
170 struct 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 };
183 typedef struct ECFieldIDStr ECFieldID;
184 
185 struct 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 };
192 typedef struct ECCurveStr ECCurve;
193 
194 typedef void PRArenaPool;
195 
196 struct 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 };
208 typedef struct ECParamsStr ECParams;
209 
210 struct ECPublicKeyStr {
211     ECParams ecParams;
212     SECItem publicValue;   /* elliptic curve point encoded as
213                             * octet stream.
214                             */
215 };
216 typedef struct ECPublicKeyStr ECPublicKey;
217 
218 struct 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 };
224 typedef struct ECPrivateKeyStr ECPrivateKey;
225 
226 typedef 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 
248 extern int ecc_knzero_random_generator(uint8_t *, size_t);
249 extern ulong_t soft_nzero_random_generator(uint8_t *, ulong_t);
250 
251 extern SECStatus EC_DecodeParams(const SECItem *, ECParams **, int);
252 extern SECItem * SECITEM_AllocItem(PRArenaPool *, SECItem *, unsigned int, int);
253 extern SECStatus SECITEM_CopyItem(PRArenaPool *, SECItem *, const SECItem *,
254     int);
255 extern void SECITEM_FreeItem(SECItem *, boolean_t);
256 /* This function has been modified to accept an array of random bytes */
257 extern 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 */
260 extern SECStatus ECDSA_SignDigest(ECPrivateKey *, SECItem *, const SECItem *,
261     const unsigned char* random, int randomlen, int, int timing);
262 extern SECStatus ECDSA_VerifyDigest(ECPublicKey *, const SECItem *,
263     const SECItem *, int);
264 extern 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