xref: /onnv-gate/usr/src/common/openssl/crypto/ec/ec.h (revision 0:68f95e015346)
1*0Sstevel@tonic-gate /* crypto/ec/ec.h */
2*0Sstevel@tonic-gate /* ====================================================================
3*0Sstevel@tonic-gate  * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved.
4*0Sstevel@tonic-gate  *
5*0Sstevel@tonic-gate  * Redistribution and use in source and binary forms, with or without
6*0Sstevel@tonic-gate  * modification, are permitted provided that the following conditions
7*0Sstevel@tonic-gate  * are met:
8*0Sstevel@tonic-gate  *
9*0Sstevel@tonic-gate  * 1. Redistributions of source code must retain the above copyright
10*0Sstevel@tonic-gate  *    notice, this list of conditions and the following disclaimer.
11*0Sstevel@tonic-gate  *
12*0Sstevel@tonic-gate  * 2. Redistributions in binary form must reproduce the above copyright
13*0Sstevel@tonic-gate  *    notice, this list of conditions and the following disclaimer in
14*0Sstevel@tonic-gate  *    the documentation and/or other materials provided with the
15*0Sstevel@tonic-gate  *    distribution.
16*0Sstevel@tonic-gate  *
17*0Sstevel@tonic-gate  * 3. All advertising materials mentioning features or use of this
18*0Sstevel@tonic-gate  *    software must display the following acknowledgment:
19*0Sstevel@tonic-gate  *    "This product includes software developed by the OpenSSL Project
20*0Sstevel@tonic-gate  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21*0Sstevel@tonic-gate  *
22*0Sstevel@tonic-gate  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23*0Sstevel@tonic-gate  *    endorse or promote products derived from this software without
24*0Sstevel@tonic-gate  *    prior written permission. For written permission, please contact
25*0Sstevel@tonic-gate  *    openssl-core@openssl.org.
26*0Sstevel@tonic-gate  *
27*0Sstevel@tonic-gate  * 5. Products derived from this software may not be called "OpenSSL"
28*0Sstevel@tonic-gate  *    nor may "OpenSSL" appear in their names without prior written
29*0Sstevel@tonic-gate  *    permission of the OpenSSL Project.
30*0Sstevel@tonic-gate  *
31*0Sstevel@tonic-gate  * 6. Redistributions of any form whatsoever must retain the following
32*0Sstevel@tonic-gate  *    acknowledgment:
33*0Sstevel@tonic-gate  *    "This product includes software developed by the OpenSSL Project
34*0Sstevel@tonic-gate  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35*0Sstevel@tonic-gate  *
36*0Sstevel@tonic-gate  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37*0Sstevel@tonic-gate  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38*0Sstevel@tonic-gate  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39*0Sstevel@tonic-gate  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
40*0Sstevel@tonic-gate  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41*0Sstevel@tonic-gate  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42*0Sstevel@tonic-gate  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43*0Sstevel@tonic-gate  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44*0Sstevel@tonic-gate  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45*0Sstevel@tonic-gate  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46*0Sstevel@tonic-gate  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47*0Sstevel@tonic-gate  * OF THE POSSIBILITY OF SUCH DAMAGE.
48*0Sstevel@tonic-gate  * ====================================================================
49*0Sstevel@tonic-gate  *
50*0Sstevel@tonic-gate  * This product includes cryptographic software written by Eric Young
51*0Sstevel@tonic-gate  * (eay@cryptsoft.com).  This product includes software written by Tim
52*0Sstevel@tonic-gate  * Hudson (tjh@cryptsoft.com).
53*0Sstevel@tonic-gate  *
54*0Sstevel@tonic-gate  */
55*0Sstevel@tonic-gate 
56*0Sstevel@tonic-gate #ifndef HEADER_EC_H
57*0Sstevel@tonic-gate #define HEADER_EC_H
58*0Sstevel@tonic-gate 
59*0Sstevel@tonic-gate #ifdef OPENSSL_NO_EC
60*0Sstevel@tonic-gate #error EC is disabled.
61*0Sstevel@tonic-gate #endif
62*0Sstevel@tonic-gate 
63*0Sstevel@tonic-gate #include <openssl/bn.h>
64*0Sstevel@tonic-gate #include <openssl/symhacks.h>
65*0Sstevel@tonic-gate 
66*0Sstevel@tonic-gate #ifdef  __cplusplus
67*0Sstevel@tonic-gate extern "C" {
68*0Sstevel@tonic-gate #endif
69*0Sstevel@tonic-gate 
70*0Sstevel@tonic-gate 
71*0Sstevel@tonic-gate typedef enum {
72*0Sstevel@tonic-gate 	/* values as defined in X9.62 (ECDSA) and elsewhere */
73*0Sstevel@tonic-gate 	POINT_CONVERSION_COMPRESSED = 2,
74*0Sstevel@tonic-gate 	POINT_CONVERSION_UNCOMPRESSED = 4,
75*0Sstevel@tonic-gate 	POINT_CONVERSION_HYBRID = 6
76*0Sstevel@tonic-gate } point_conversion_form_t;
77*0Sstevel@tonic-gate 
78*0Sstevel@tonic-gate 
79*0Sstevel@tonic-gate typedef struct ec_method_st EC_METHOD;
80*0Sstevel@tonic-gate 
81*0Sstevel@tonic-gate typedef struct ec_group_st
82*0Sstevel@tonic-gate 	/*
83*0Sstevel@tonic-gate 	 EC_METHOD *meth;
84*0Sstevel@tonic-gate 	 -- field definition
85*0Sstevel@tonic-gate 	 -- curve coefficients
86*0Sstevel@tonic-gate 	 -- optional generator with associated information (order, cofactor)
87*0Sstevel@tonic-gate 	 -- optional extra data (TODO: precomputed table for fast computation of multiples of generator)
88*0Sstevel@tonic-gate 	*/
89*0Sstevel@tonic-gate 	EC_GROUP;
90*0Sstevel@tonic-gate 
91*0Sstevel@tonic-gate typedef struct ec_point_st EC_POINT;
92*0Sstevel@tonic-gate 
93*0Sstevel@tonic-gate 
94*0Sstevel@tonic-gate /* EC_METHODs for curves over GF(p).
95*0Sstevel@tonic-gate  * EC_GFp_simple_method provides the basis for the optimized methods.
96*0Sstevel@tonic-gate  */
97*0Sstevel@tonic-gate const EC_METHOD *EC_GFp_simple_method(void);
98*0Sstevel@tonic-gate const EC_METHOD *EC_GFp_mont_method(void);
99*0Sstevel@tonic-gate #if 0
100*0Sstevel@tonic-gate const EC_METHOD *EC_GFp_recp_method(void); /* TODO */
101*0Sstevel@tonic-gate const EC_METHOD *EC_GFp_nist_method(void); /* TODO */
102*0Sstevel@tonic-gate #endif
103*0Sstevel@tonic-gate 
104*0Sstevel@tonic-gate 
105*0Sstevel@tonic-gate EC_GROUP *EC_GROUP_new(const EC_METHOD *);
106*0Sstevel@tonic-gate void EC_GROUP_free(EC_GROUP *);
107*0Sstevel@tonic-gate void EC_GROUP_clear_free(EC_GROUP *);
108*0Sstevel@tonic-gate int EC_GROUP_copy(EC_GROUP *, const EC_GROUP *);
109*0Sstevel@tonic-gate 
110*0Sstevel@tonic-gate const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *);
111*0Sstevel@tonic-gate 
112*0Sstevel@tonic-gate 
113*0Sstevel@tonic-gate /* We don't have types for field specifications and field elements in general.
114*0Sstevel@tonic-gate  * Otherwise we could declare
115*0Sstevel@tonic-gate  *     int EC_GROUP_set_curve(EC_GROUP *, .....);
116*0Sstevel@tonic-gate  */
117*0Sstevel@tonic-gate int EC_GROUP_set_curve_GFp(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
118*0Sstevel@tonic-gate int EC_GROUP_get_curve_GFp(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *);
119*0Sstevel@tonic-gate 
120*0Sstevel@tonic-gate /* EC_GROUP_new_GFp() calls EC_GROUP_new() and EC_GROUP_set_GFp()
121*0Sstevel@tonic-gate  * after choosing an appropriate EC_METHOD */
122*0Sstevel@tonic-gate EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
123*0Sstevel@tonic-gate 
124*0Sstevel@tonic-gate int EC_GROUP_set_generator(EC_GROUP *, const EC_POINT *generator, const BIGNUM *order, const BIGNUM *cofactor);
125*0Sstevel@tonic-gate EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *);
126*0Sstevel@tonic-gate int EC_GROUP_get_order(const EC_GROUP *, BIGNUM *order, BN_CTX *);
127*0Sstevel@tonic-gate int EC_GROUP_get_cofactor(const EC_GROUP *, BIGNUM *cofactor, BN_CTX *);
128*0Sstevel@tonic-gate 
129*0Sstevel@tonic-gate EC_POINT *EC_POINT_new(const EC_GROUP *);
130*0Sstevel@tonic-gate void EC_POINT_free(EC_POINT *);
131*0Sstevel@tonic-gate void EC_POINT_clear_free(EC_POINT *);
132*0Sstevel@tonic-gate int EC_POINT_copy(EC_POINT *, const EC_POINT *);
133*0Sstevel@tonic-gate 
134*0Sstevel@tonic-gate const EC_METHOD *EC_POINT_method_of(const EC_POINT *);
135*0Sstevel@tonic-gate 
136*0Sstevel@tonic-gate int EC_POINT_set_to_infinity(const EC_GROUP *, EC_POINT *);
137*0Sstevel@tonic-gate int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *, EC_POINT *,
138*0Sstevel@tonic-gate 	const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *);
139*0Sstevel@tonic-gate int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *, const EC_POINT *,
140*0Sstevel@tonic-gate 	BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *);
141*0Sstevel@tonic-gate int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *, EC_POINT *,
142*0Sstevel@tonic-gate 	const BIGNUM *x, const BIGNUM *y, BN_CTX *);
143*0Sstevel@tonic-gate int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *, const EC_POINT *,
144*0Sstevel@tonic-gate 	BIGNUM *x, BIGNUM *y, BN_CTX *);
145*0Sstevel@tonic-gate int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *, EC_POINT *,
146*0Sstevel@tonic-gate 	const BIGNUM *x, int y_bit, BN_CTX *);
147*0Sstevel@tonic-gate 
148*0Sstevel@tonic-gate size_t EC_POINT_point2oct(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form,
149*0Sstevel@tonic-gate         unsigned char *buf, size_t len, BN_CTX *);
150*0Sstevel@tonic-gate int EC_POINT_oct2point(const EC_GROUP *, EC_POINT *,
151*0Sstevel@tonic-gate         const unsigned char *buf, size_t len, BN_CTX *);
152*0Sstevel@tonic-gate 
153*0Sstevel@tonic-gate int EC_POINT_add(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *);
154*0Sstevel@tonic-gate int EC_POINT_dbl(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, BN_CTX *);
155*0Sstevel@tonic-gate int EC_POINT_invert(const EC_GROUP *, EC_POINT *, BN_CTX *);
156*0Sstevel@tonic-gate 
157*0Sstevel@tonic-gate int EC_POINT_is_at_infinity(const EC_GROUP *, const EC_POINT *);
158*0Sstevel@tonic-gate int EC_POINT_is_on_curve(const EC_GROUP *, const EC_POINT *, BN_CTX *);
159*0Sstevel@tonic-gate int EC_POINT_cmp(const EC_GROUP *, const EC_POINT *a, const EC_POINT *b, BN_CTX *);
160*0Sstevel@tonic-gate 
161*0Sstevel@tonic-gate int EC_POINT_make_affine(const EC_GROUP *, EC_POINT *, BN_CTX *);
162*0Sstevel@tonic-gate int EC_POINTs_make_affine(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *);
163*0Sstevel@tonic-gate 
164*0Sstevel@tonic-gate 
165*0Sstevel@tonic-gate int EC_POINTs_mul(const EC_GROUP *, EC_POINT *r, const BIGNUM *, size_t num, const EC_POINT *[], const BIGNUM *[], BN_CTX *);
166*0Sstevel@tonic-gate int EC_POINT_mul(const EC_GROUP *, EC_POINT *r, const BIGNUM *, const EC_POINT *, const BIGNUM *, BN_CTX *);
167*0Sstevel@tonic-gate int EC_GROUP_precompute_mult(EC_GROUP *, BN_CTX *);
168*0Sstevel@tonic-gate 
169*0Sstevel@tonic-gate 
170*0Sstevel@tonic-gate 
171*0Sstevel@tonic-gate /* BEGIN ERROR CODES */
172*0Sstevel@tonic-gate /* The following lines are auto generated by the script mkerr.pl. Any changes
173*0Sstevel@tonic-gate  * made after this point may be overwritten when the script is next run.
174*0Sstevel@tonic-gate  */
175*0Sstevel@tonic-gate void ERR_load_EC_strings(void);
176*0Sstevel@tonic-gate 
177*0Sstevel@tonic-gate /* Error codes for the EC functions. */
178*0Sstevel@tonic-gate 
179*0Sstevel@tonic-gate /* Function codes. */
180*0Sstevel@tonic-gate #define EC_F_COMPUTE_WNAF				 143
181*0Sstevel@tonic-gate #define EC_F_EC_GFP_MONT_FIELD_DECODE			 133
182*0Sstevel@tonic-gate #define EC_F_EC_GFP_MONT_FIELD_ENCODE			 134
183*0Sstevel@tonic-gate #define EC_F_EC_GFP_MONT_FIELD_MUL			 131
184*0Sstevel@tonic-gate #define EC_F_EC_GFP_MONT_FIELD_SQR			 132
185*0Sstevel@tonic-gate #define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP		 100
186*0Sstevel@tonic-gate #define EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR		 101
187*0Sstevel@tonic-gate #define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE			 102
188*0Sstevel@tonic-gate #define EC_F_EC_GFP_SIMPLE_OCT2POINT			 103
189*0Sstevel@tonic-gate #define EC_F_EC_GFP_SIMPLE_POINT2OCT			 104
190*0Sstevel@tonic-gate #define EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE		 137
191*0Sstevel@tonic-gate #define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP 105
192*0Sstevel@tonic-gate #define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP 128
193*0Sstevel@tonic-gate #define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP 129
194*0Sstevel@tonic-gate #define EC_F_EC_GROUP_COPY				 106
195*0Sstevel@tonic-gate #define EC_F_EC_GROUP_GET0_GENERATOR			 139
196*0Sstevel@tonic-gate #define EC_F_EC_GROUP_GET_COFACTOR			 140
197*0Sstevel@tonic-gate #define EC_F_EC_GROUP_GET_CURVE_GFP			 130
198*0Sstevel@tonic-gate #define EC_F_EC_GROUP_GET_ORDER				 141
199*0Sstevel@tonic-gate #define EC_F_EC_GROUP_NEW				 108
200*0Sstevel@tonic-gate #define EC_F_EC_GROUP_PRECOMPUTE_MULT			 142
201*0Sstevel@tonic-gate #define EC_F_EC_GROUP_SET_CURVE_GFP			 109
202*0Sstevel@tonic-gate #define EC_F_EC_GROUP_SET_EXTRA_DATA			 110
203*0Sstevel@tonic-gate #define EC_F_EC_GROUP_SET_GENERATOR			 111
204*0Sstevel@tonic-gate #define EC_F_EC_POINTS_MAKE_AFFINE			 136
205*0Sstevel@tonic-gate #define EC_F_EC_POINTS_MUL				 138
206*0Sstevel@tonic-gate #define EC_F_EC_POINT_ADD				 112
207*0Sstevel@tonic-gate #define EC_F_EC_POINT_CMP				 113
208*0Sstevel@tonic-gate #define EC_F_EC_POINT_COPY				 114
209*0Sstevel@tonic-gate #define EC_F_EC_POINT_DBL				 115
210*0Sstevel@tonic-gate #define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP	 116
211*0Sstevel@tonic-gate #define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP	 117
212*0Sstevel@tonic-gate #define EC_F_EC_POINT_IS_AT_INFINITY			 118
213*0Sstevel@tonic-gate #define EC_F_EC_POINT_IS_ON_CURVE			 119
214*0Sstevel@tonic-gate #define EC_F_EC_POINT_MAKE_AFFINE			 120
215*0Sstevel@tonic-gate #define EC_F_EC_POINT_NEW				 121
216*0Sstevel@tonic-gate #define EC_F_EC_POINT_OCT2POINT				 122
217*0Sstevel@tonic-gate #define EC_F_EC_POINT_POINT2OCT				 123
218*0Sstevel@tonic-gate #define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP	 124
219*0Sstevel@tonic-gate #define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP	 125
220*0Sstevel@tonic-gate #define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP	 126
221*0Sstevel@tonic-gate #define EC_F_EC_POINT_SET_TO_INFINITY			 127
222*0Sstevel@tonic-gate #define EC_F_GFP_MONT_GROUP_SET_CURVE_GFP		 135
223*0Sstevel@tonic-gate 
224*0Sstevel@tonic-gate /* Reason codes. */
225*0Sstevel@tonic-gate #define EC_R_BUFFER_TOO_SMALL				 100
226*0Sstevel@tonic-gate #define EC_R_INCOMPATIBLE_OBJECTS			 101
227*0Sstevel@tonic-gate #define EC_R_INVALID_ARGUMENT				 112
228*0Sstevel@tonic-gate #define EC_R_INVALID_COMPRESSED_POINT			 110
229*0Sstevel@tonic-gate #define EC_R_INVALID_COMPRESSION_BIT			 109
230*0Sstevel@tonic-gate #define EC_R_INVALID_ENCODING				 102
231*0Sstevel@tonic-gate #define EC_R_INVALID_FIELD				 103
232*0Sstevel@tonic-gate #define EC_R_INVALID_FORM				 104
233*0Sstevel@tonic-gate #define EC_R_NOT_INITIALIZED				 111
234*0Sstevel@tonic-gate #define EC_R_POINT_AT_INFINITY				 106
235*0Sstevel@tonic-gate #define EC_R_POINT_IS_NOT_ON_CURVE			 107
236*0Sstevel@tonic-gate #define EC_R_SLOT_FULL					 108
237*0Sstevel@tonic-gate #define EC_R_UNDEFINED_GENERATOR			 113
238*0Sstevel@tonic-gate #define EC_R_UNKNOWN_ORDER				 114
239*0Sstevel@tonic-gate 
240*0Sstevel@tonic-gate #ifdef  __cplusplus
241*0Sstevel@tonic-gate }
242*0Sstevel@tonic-gate #endif
243*0Sstevel@tonic-gate #endif
244