| /* TODO */ |
| /* crypto/ec/ec_lcl.h */ |
| /* ==================================================================== |
| * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * |
| * 3. All advertising materials mentioning features or use of this |
| * software must display the following acknowledgment: |
| * "This product includes software developed by the OpenSSL Project |
| * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" |
| * |
| * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to |
| * endorse or promote products derived from this software without |
| * prior written permission. For written permission, please contact |
| * openssl-core@openssl.org. |
| * |
| * 5. Products derived from this software may not be called "OpenSSL" |
| * nor may "OpenSSL" appear in their names without prior written |
| * permission of the OpenSSL Project. |
| * |
| * 6. Redistributions of any form whatsoever must retain the following |
| * acknowledgment: |
| * "This product includes software developed by the OpenSSL Project |
| * for use in the OpenSSL Toolkit (http://www.openssl.org/)" |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY |
| * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR |
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
| * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
| * OF THE POSSIBILITY OF SUCH DAMAGE. |
| * ==================================================================== |
| * |
| * This product includes cryptographic software written by Eric Young |
| * (eay@cryptsoft.com). This product includes software written by Tim |
| * Hudson (tjh@cryptsoft.com). |
| * |
| */ |
| |
| |
| #include <stdlib.h> |
| |
| #include <openssl/ec.h> |
| |
| |
| /* Structure details are not part of the exported interface, |
| * so all this may change in future versions. */ |
| |
| struct ec_method_st { |
| /* used by EC_GROUP_new, EC_GROUP_set_curve_GFp, EC_GROUP_free, EC_GROUP_copy: */ |
| int (*group_init)(EC_GROUP *); |
| /* int (*group_set)(EC_GROUP *, .....); */ |
| int (*group_set_curve_GFp)(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *); |
| void (*group_finish)(EC_GROUP *); |
| void (*group_clear_finish)(EC_GROUP *); |
| int (*group_copy)(EC_GROUP *, const EC_GROUP *); |
| |
| /* used by EC_GROUP_set_generator: */ |
| int (*group_set_generator)(EC_GROUP *, const EC_POINT *generator, |
| const BIGNUM *order, const BIGNUM *cofactor); |
| |
| /* TODO: 'set' functions for EC_GROUPs */ |
| |
| |
| /* used by EC_POINT_new, EC_POINT_free, EC_POINT_copy: */ |
| int (*point_init)(EC_POINT *); |
| void (*point_finish)(EC_POINT *); |
| void (*point_clear_finish)(EC_POINT *); |
| int (*point_copy)(EC_POINT *, const EC_POINT *); |
| |
| /* TODO: 'set' and 'get' functions for EC_POINTs */ |
| |
| /* used by EC_POINT_point2oct, EC_POINT_oct2point: */ |
| size_t (*point2oct)(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form, |
| unsigned char *buf, size_t len, BN_CTX *); |
| int (*oct2point)(const EC_GROUP *, EC_POINT *, |
| const unsigned char *buf, size_t len, BN_CTX *); |
| |
| /* used by EC_POINT_add, EC_POINT_dbl: */ |
| int (*add)(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *); |
| int (*dbl)(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, BN_CTX *); |
| |
| /* used by EC_POINT_is_at_infinity, EC_POINT_is_on_curve, EC_POINT_make_affine */ |
| int (*is_at_infinity)(const EC_GROUP *, const EC_POINT *); |
| int (*is_on_curve)(const EC_GROUP *, const EC_POINT *, BN_CTX *); |
| int (*make_affine)(const EC_GROUP *, const EC_POINT *, BN_CTX *); |
| |
| |
| /* internal functions */ |
| |
| /* 'field_mult' and 'field_sqr' can be used by 'add' and 'dbl' so that |
| * the same implementations of point operations can be used with different |
| * optimized implementations of expensive field operations: */ |
| int (*field_mult)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *); |
| int (*field_sqr)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); |
| |
| int (*field_encode)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); /* e.g. to Montgomery */ |
| int (*field_decode)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); /* e.g. from Montgomery */ |
| } /* EC_METHOD */; |
| |
| |
| struct ec_group_st { |
| const EC_METHOD *meth; |
| |
| /* All members except 'meth' are handled by the method functions, |
| * even if they appear generic */ |
| |
| BIGNUM field; /* Field specification. |
| * For curves over GF(p), this is the modulus. */ |
| void *field_data; /* method-specific (e.g., Montgomery structure) */ |
| |
| BIGNUM a, b; /* Curve coefficients. |
| * (Here the assumption is that BIGNUMs can be used |
| * or abused for all kinds of fields, not just GF(p).) |
| * For characteristic > 3, the curve is defined |
| * by a Weierstrass equation of the form |
| * Y^2 = X^3 + a*X + b. |
| */ |
| int a_is_minus3; /* enable optimized point arithmetics for special case */ |
| |
| EC_POINT *generator; /* optional */ |
| BIGNUM order, cofactor; |
| |
| /* optional Lim/Lee precomputation table */ |
| } /* EC_GROUP */; |
| |
| |
| struct ec_point_st { |
| const EC_METHOD *meth; |
| |
| /* All members except 'meth' are handled by the method functions, |
| * even if they appear generic */ |
| |
| BIGNUM X; |
| BIGNUM Y; |
| BIGNUM Z; /* Jacobian projective coordinates: |
| * (X, Y, Z) represents (X/Z^2, Y/Z^3) if Z != 0 */ |
| int Z_is_one; /* enable optimized point arithmetics for special case */ |
| } /* EC_POINT */; |