wolf SSL / wolfSSL-TLS13-Beta

Fork of wolfSSL by wolf SSL

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ec.h Source File

ec.h

00001 /* ec.h for openssl */
00002 
00003 #ifndef WOLFSSL_EC_H_
00004 #define WOLFSSL_EC_H_
00005 
00006 #include <wolfssl/openssl/bn.h>
00007 #include <wolfssl/wolfcrypt/ecc.h>
00008 
00009 #ifdef __cplusplus
00010 extern "C" {
00011 #endif
00012 
00013 /* Map OpenSSL NID value */
00014 enum {
00015     POINT_CONVERSION_UNCOMPRESSED = 4,
00016 
00017 #ifdef HAVE_ECC
00018     /* Use ecc_curve_type enum values for NID */
00019     NID_X9_62_prime192v1 = ECC_SECP192R1,
00020     NID_X9_62_prime256v1 = ECC_SECP256R1,
00021     NID_secp112r1 = ECC_SECP112R1,
00022     NID_secp112r2 = ECC_SECP112R2,
00023     NID_secp128r1 = ECC_SECP128R1,
00024     NID_secp128r2 = ECC_SECP128R2,
00025     NID_secp160r1 = ECC_SECP160R1,
00026     NID_secp160r2 = ECC_SECP160R2,
00027     NID_secp224r1 = ECC_SECP224R1,
00028     NID_secp384r1 = ECC_SECP384R1,
00029     NID_secp521r1 = ECC_SECP521R1,
00030     NID_secp160k1 = ECC_SECP160K1,
00031     NID_secp192k1 = ECC_SECP192K1,
00032     NID_secp224k1 = ECC_SECP224K1,
00033     NID_secp256k1 = ECC_SECP256K1,
00034     NID_brainpoolP160r1 = ECC_BRAINPOOLP160R1,
00035     NID_brainpoolP192r1 = ECC_BRAINPOOLP192R1,
00036     NID_brainpoolP224r1 = ECC_BRAINPOOLP224R1,
00037     NID_brainpoolP256r1 = ECC_BRAINPOOLP256R1,
00038     NID_brainpoolP320r1 = ECC_BRAINPOOLP320R1,
00039     NID_brainpoolP384r1 = ECC_BRAINPOOLP384R1,
00040     NID_brainpoolP512r1 = ECC_BRAINPOOLP512R1,
00041 #endif
00042 
00043     OPENSSL_EC_NAMED_CURVE  = 0x001
00044 };
00045 
00046 #ifndef WOLFSSL_EC_TYPE_DEFINED /* guard on redeclaration */
00047 typedef struct WOLFSSL_EC_KEY         WOLFSSL_EC_KEY;
00048 typedef struct WOLFSSL_EC_POINT       WOLFSSL_EC_POINT;
00049 typedef struct WOLFSSL_EC_GROUP       WOLFSSL_EC_GROUP;
00050 #define WOLFSSL_EC_TYPE_DEFINED
00051 #endif
00052 
00053 typedef WOLFSSL_EC_KEY                EC_KEY;
00054 typedef WOLFSSL_EC_GROUP              EC_GROUP;
00055 typedef WOLFSSL_EC_POINT              EC_POINT;
00056 
00057 struct WOLFSSL_EC_POINT {
00058     WOLFSSL_BIGNUM *X;
00059     WOLFSSL_BIGNUM *Y;
00060     WOLFSSL_BIGNUM *Z;
00061 
00062     void*          internal;     /* our ECC point */
00063     char           inSet;        /* internal set from external ? */
00064     char           exSet;        /* external set from internal ? */
00065 };
00066 
00067 struct WOLFSSL_EC_GROUP {
00068     int curve_idx; /* index of curve, used by WolfSSL as reference */
00069     int curve_nid; /* NID of curve, used by OpenSSL/OpenSSH as reference */
00070     int curve_oid; /* OID of curve, used by OpenSSL/OpenSSH as reference */
00071 };
00072 
00073 struct WOLFSSL_EC_KEY {
00074     WOLFSSL_EC_GROUP *group;
00075     WOLFSSL_EC_POINT *pub_key;
00076     WOLFSSL_BIGNUM *priv_key;
00077 
00078     void*          internal;     /* our ECC Key */
00079     char           inSet;        /* internal set from external ? */
00080     char           exSet;        /* external set from internal ? */
00081 };
00082 
00083 WOLFSSL_API
00084 int wolfSSL_ECPoint_i2d(const WOLFSSL_EC_GROUP *curve,
00085                         const WOLFSSL_EC_POINT *p,
00086                         unsigned char *out, unsigned int *len);
00087 WOLFSSL_API
00088 int wolfSSL_ECPoint_d2i(unsigned char *in, unsigned int len,
00089                         const WOLFSSL_EC_GROUP *curve, WOLFSSL_EC_POINT *p);
00090 WOLFSSL_API
00091 int wolfSSL_EC_KEY_LoadDer(WOLFSSL_EC_KEY* key,
00092                            const unsigned char* der, int derSz);
00093 WOLFSSL_API
00094 void wolfSSL_EC_KEY_free(WOLFSSL_EC_KEY *key);
00095 WOLFSSL_API
00096 WOLFSSL_EC_POINT *wolfSSL_EC_KEY_get0_public_key(const WOLFSSL_EC_KEY *key);
00097 WOLFSSL_API
00098 const WOLFSSL_EC_GROUP *wolfSSL_EC_KEY_get0_group(const WOLFSSL_EC_KEY *key);
00099 WOLFSSL_API
00100 int wolfSSL_EC_KEY_set_private_key(WOLFSSL_EC_KEY *key,
00101                                    const WOLFSSL_BIGNUM *priv_key);
00102 WOLFSSL_API
00103 WOLFSSL_BIGNUM *wolfSSL_EC_KEY_get0_private_key(const WOLFSSL_EC_KEY *key);
00104 WOLFSSL_API
00105 WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new_by_curve_name(int nid);
00106 WOLFSSL_API
00107 WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new(void);
00108 WOLFSSL_API
00109 int wolfSSL_EC_KEY_set_group(WOLFSSL_EC_KEY *key, WOLFSSL_EC_GROUP *group);
00110 WOLFSSL_API
00111 int wolfSSL_EC_KEY_generate_key(WOLFSSL_EC_KEY *key);
00112 WOLFSSL_API
00113 void wolfSSL_EC_KEY_set_asn1_flag(WOLFSSL_EC_KEY *key, int asn1_flag);
00114 WOLFSSL_API
00115 int wolfSSL_EC_KEY_set_public_key(WOLFSSL_EC_KEY *key,
00116                                   const WOLFSSL_EC_POINT *pub);
00117 WOLFSSL_API
00118 void wolfSSL_EC_GROUP_set_asn1_flag(WOLFSSL_EC_GROUP *group, int flag);
00119 WOLFSSL_API
00120 WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_new_by_curve_name(int nid);
00121 WOLFSSL_API
00122 int wolfSSL_EC_GROUP_cmp(const WOLFSSL_EC_GROUP *a, const WOLFSSL_EC_GROUP *b,
00123                          WOLFSSL_BN_CTX *ctx);
00124 WOLFSSL_API
00125 int wolfSSL_EC_GROUP_get_curve_name(const WOLFSSL_EC_GROUP *group);
00126 WOLFSSL_API
00127 int wolfSSL_EC_GROUP_get_degree(const WOLFSSL_EC_GROUP *group);
00128 WOLFSSL_API
00129 int wolfSSL_EC_GROUP_get_order(const WOLFSSL_EC_GROUP *group,
00130                                WOLFSSL_BIGNUM *order, WOLFSSL_BN_CTX *ctx);
00131 WOLFSSL_API
00132 void wolfSSL_EC_GROUP_free(WOLFSSL_EC_GROUP *group);
00133 #if defined(DEBUG_WOLFSSL) && !defined(NO_FILESYSTEM)
00134 WOLFSSL_API
00135 void wolfssl_EC_POINT_dump(const char *msg, const WOLFSSL_EC_POINT *p);
00136 #endif
00137 WOLFSSL_API
00138 WOLFSSL_EC_POINT *wolfSSL_EC_POINT_new(const WOLFSSL_EC_GROUP *group);
00139 WOLFSSL_API
00140 int wolfSSL_EC_POINT_get_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group,
00141                                                 const WOLFSSL_EC_POINT *p,
00142                                                 WOLFSSL_BIGNUM *x,
00143                                                 WOLFSSL_BIGNUM *y,
00144                                                 WOLFSSL_BN_CTX *ctx);
00145 WOLFSSL_API
00146 int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r,
00147                          const WOLFSSL_BIGNUM *n,
00148                          const WOLFSSL_EC_POINT *q, const WOLFSSL_BIGNUM *m,
00149                          WOLFSSL_BN_CTX *ctx);
00150 WOLFSSL_API
00151 void wolfSSL_EC_POINT_clear_free(WOLFSSL_EC_POINT *point);
00152 WOLFSSL_API
00153 int wolfSSL_EC_POINT_cmp(const WOLFSSL_EC_GROUP *group,
00154                          const WOLFSSL_EC_POINT *a, const WOLFSSL_EC_POINT *b,
00155                          WOLFSSL_BN_CTX *ctx);
00156 WOLFSSL_API
00157 void wolfSSL_EC_POINT_free(WOLFSSL_EC_POINT *point);
00158 WOLFSSL_API
00159 int wolfSSL_EC_POINT_is_at_infinity(const WOLFSSL_EC_GROUP *group,
00160                                     const WOLFSSL_EC_POINT *a);
00161 
00162 #define EC_KEY_free wolfSSL_EC_KEY_free
00163 #define EC_KEY_get0_public_key wolfSSL_EC_KEY_get0_public_key
00164 #define EC_KEY_get0_group wolfSSL_EC_KEY_get0_group
00165 #define EC_KEY_set_private_key wolfSSL_EC_KEY_set_private_key
00166 #define EC_KEY_get0_private_key wolfSSL_EC_KEY_get0_private_key
00167 #define EC_KEY_new_by_curve_name wolfSSL_EC_KEY_new_by_curve_name
00168 #define EC_KEY_set_group wolfSSL_EC_KEY_set_group
00169 #define EC_KEY_generate_key wolfSSL_EC_KEY_generate_key
00170 #define EC_KEY_set_asn1_flag wolfSSL_EC_KEY_set_asn1_flag
00171 #define EC_KEY_set_public_key wolfSSL_EC_KEY_set_public_key
00172 #define EC_KEY_new wolfSSL_EC_KEY_new
00173 
00174 #define EC_GROUP_set_asn1_flag wolfSSL_EC_GROUP_set_asn1_flag
00175 #define EC_GROUP_new_by_curve_name wolfSSL_EC_GROUP_new_by_curve_name
00176 #define EC_GROUP_cmp wolfSSL_EC_GROUP_cmp
00177 #define EC_GROUP_get_curve_name wolfSSL_EC_GROUP_get_curve_name
00178 #define EC_GROUP_get_degree wolfSSL_EC_GROUP_get_degree
00179 #define EC_GROUP_get_order wolfSSL_EC_GROUP_get_order
00180 #define EC_GROUP_free wolfSSL_EC_GROUP_free
00181 
00182 #define EC_POINT_new wolfSSL_EC_POINT_new
00183 #define EC_POINT_get_affine_coordinates_GFp \
00184             wolfSSL_EC_POINT_get_affine_coordinates_GFp
00185 #define EC_POINT_mul wolfSSL_EC_POINT_mul
00186 #define EC_POINT_clear_free wolfSSL_EC_POINT_clear_free
00187 #define EC_POINT_cmp wolfSSL_EC_POINT_cmp
00188 #define EC_POINT_free wolfSSL_EC_POINT_free
00189 #define EC_POINT_is_at_infinity wolfSSL_EC_POINT_is_at_infinity
00190 
00191 #ifdef __cplusplus
00192 }  /* extern "C" */
00193 #endif
00194 
00195 #endif /* header */
00196