Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
wolfssl/openssl/ec.h@15:117db924cf7c, 2018-08-18 (annotated)
- Committer:
- wolfSSL
- Date:
- Sat Aug 18 22:20:43 2018 +0000
- Revision:
- 15:117db924cf7c
wolfSSL 3.15.3
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| wolfSSL | 15:117db924cf7c | 1 | /* ec.h |
| wolfSSL | 15:117db924cf7c | 2 | * |
| wolfSSL | 15:117db924cf7c | 3 | * Copyright (C) 2006-2017 wolfSSL Inc. |
| wolfSSL | 15:117db924cf7c | 4 | * |
| wolfSSL | 15:117db924cf7c | 5 | * This file is part of wolfSSL. |
| wolfSSL | 15:117db924cf7c | 6 | * |
| wolfSSL | 15:117db924cf7c | 7 | * wolfSSL is free software; you can redistribute it and/or modify |
| wolfSSL | 15:117db924cf7c | 8 | * it under the terms of the GNU General Public License as published by |
| wolfSSL | 15:117db924cf7c | 9 | * the Free Software Foundation; either version 2 of the License, or |
| wolfSSL | 15:117db924cf7c | 10 | * (at your option) any later version. |
| wolfSSL | 15:117db924cf7c | 11 | * |
| wolfSSL | 15:117db924cf7c | 12 | * wolfSSL is distributed in the hope that it will be useful, |
| wolfSSL | 15:117db924cf7c | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| wolfSSL | 15:117db924cf7c | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| wolfSSL | 15:117db924cf7c | 15 | * GNU General Public License for more details. |
| wolfSSL | 15:117db924cf7c | 16 | * |
| wolfSSL | 15:117db924cf7c | 17 | * You should have received a copy of the GNU General Public License |
| wolfSSL | 15:117db924cf7c | 18 | * along with this program; if not, write to the Free Software |
| wolfSSL | 15:117db924cf7c | 19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA |
| wolfSSL | 15:117db924cf7c | 20 | */ |
| wolfSSL | 15:117db924cf7c | 21 | |
| wolfSSL | 15:117db924cf7c | 22 | /* ec.h for openssl */ |
| wolfSSL | 15:117db924cf7c | 23 | |
| wolfSSL | 15:117db924cf7c | 24 | #ifndef WOLFSSL_EC_H_ |
| wolfSSL | 15:117db924cf7c | 25 | #define WOLFSSL_EC_H_ |
| wolfSSL | 15:117db924cf7c | 26 | |
| wolfSSL | 15:117db924cf7c | 27 | #include <wolfssl/openssl/bn.h> |
| wolfSSL | 15:117db924cf7c | 28 | #include <wolfssl/wolfcrypt/ecc.h> |
| wolfSSL | 15:117db924cf7c | 29 | |
| wolfSSL | 15:117db924cf7c | 30 | #ifdef __cplusplus |
| wolfSSL | 15:117db924cf7c | 31 | extern "C" { |
| wolfSSL | 15:117db924cf7c | 32 | #endif |
| wolfSSL | 15:117db924cf7c | 33 | |
| wolfSSL | 15:117db924cf7c | 34 | /* Map OpenSSL NID value */ |
| wolfSSL | 15:117db924cf7c | 35 | enum { |
| wolfSSL | 15:117db924cf7c | 36 | POINT_CONVERSION_UNCOMPRESSED = 4, |
| wolfSSL | 15:117db924cf7c | 37 | |
| wolfSSL | 15:117db924cf7c | 38 | #ifdef HAVE_ECC |
| wolfSSL | 15:117db924cf7c | 39 | /* Use ecc_curve_type enum values for NID */ |
| wolfSSL | 15:117db924cf7c | 40 | NID_X9_62_prime192v1 = ECC_SECP192R1, |
| wolfSSL | 15:117db924cf7c | 41 | NID_X9_62_prime256v1 = ECC_SECP256R1, |
| wolfSSL | 15:117db924cf7c | 42 | NID_secp112r1 = ECC_SECP112R1, |
| wolfSSL | 15:117db924cf7c | 43 | NID_secp112r2 = ECC_SECP112R2, |
| wolfSSL | 15:117db924cf7c | 44 | NID_secp128r1 = ECC_SECP128R1, |
| wolfSSL | 15:117db924cf7c | 45 | NID_secp128r2 = ECC_SECP128R2, |
| wolfSSL | 15:117db924cf7c | 46 | NID_secp160r1 = ECC_SECP160R1, |
| wolfSSL | 15:117db924cf7c | 47 | NID_secp160r2 = ECC_SECP160R2, |
| wolfSSL | 15:117db924cf7c | 48 | NID_secp224r1 = ECC_SECP224R1, |
| wolfSSL | 15:117db924cf7c | 49 | NID_secp384r1 = ECC_SECP384R1, |
| wolfSSL | 15:117db924cf7c | 50 | NID_secp521r1 = ECC_SECP521R1, |
| wolfSSL | 15:117db924cf7c | 51 | NID_secp160k1 = ECC_SECP160K1, |
| wolfSSL | 15:117db924cf7c | 52 | NID_secp192k1 = ECC_SECP192K1, |
| wolfSSL | 15:117db924cf7c | 53 | NID_secp224k1 = ECC_SECP224K1, |
| wolfSSL | 15:117db924cf7c | 54 | NID_secp256k1 = ECC_SECP256K1, |
| wolfSSL | 15:117db924cf7c | 55 | NID_brainpoolP160r1 = ECC_BRAINPOOLP160R1, |
| wolfSSL | 15:117db924cf7c | 56 | NID_brainpoolP192r1 = ECC_BRAINPOOLP192R1, |
| wolfSSL | 15:117db924cf7c | 57 | NID_brainpoolP224r1 = ECC_BRAINPOOLP224R1, |
| wolfSSL | 15:117db924cf7c | 58 | NID_brainpoolP256r1 = ECC_BRAINPOOLP256R1, |
| wolfSSL | 15:117db924cf7c | 59 | NID_brainpoolP320r1 = ECC_BRAINPOOLP320R1, |
| wolfSSL | 15:117db924cf7c | 60 | NID_brainpoolP384r1 = ECC_BRAINPOOLP384R1, |
| wolfSSL | 15:117db924cf7c | 61 | NID_brainpoolP512r1 = ECC_BRAINPOOLP512R1, |
| wolfSSL | 15:117db924cf7c | 62 | #endif |
| wolfSSL | 15:117db924cf7c | 63 | |
| wolfSSL | 15:117db924cf7c | 64 | OPENSSL_EC_NAMED_CURVE = 0x001 |
| wolfSSL | 15:117db924cf7c | 65 | }; |
| wolfSSL | 15:117db924cf7c | 66 | |
| wolfSSL | 15:117db924cf7c | 67 | #ifndef WOLFSSL_EC_TYPE_DEFINED /* guard on redeclaration */ |
| wolfSSL | 15:117db924cf7c | 68 | typedef struct WOLFSSL_EC_KEY WOLFSSL_EC_KEY; |
| wolfSSL | 15:117db924cf7c | 69 | typedef struct WOLFSSL_EC_POINT WOLFSSL_EC_POINT; |
| wolfSSL | 15:117db924cf7c | 70 | typedef struct WOLFSSL_EC_GROUP WOLFSSL_EC_GROUP; |
| wolfSSL | 15:117db924cf7c | 71 | #define WOLFSSL_EC_TYPE_DEFINED |
| wolfSSL | 15:117db924cf7c | 72 | #endif |
| wolfSSL | 15:117db924cf7c | 73 | |
| wolfSSL | 15:117db924cf7c | 74 | typedef WOLFSSL_EC_KEY EC_KEY; |
| wolfSSL | 15:117db924cf7c | 75 | typedef WOLFSSL_EC_GROUP EC_GROUP; |
| wolfSSL | 15:117db924cf7c | 76 | typedef WOLFSSL_EC_POINT EC_POINT; |
| wolfSSL | 15:117db924cf7c | 77 | |
| wolfSSL | 15:117db924cf7c | 78 | struct WOLFSSL_EC_POINT { |
| wolfSSL | 15:117db924cf7c | 79 | WOLFSSL_BIGNUM *X; |
| wolfSSL | 15:117db924cf7c | 80 | WOLFSSL_BIGNUM *Y; |
| wolfSSL | 15:117db924cf7c | 81 | WOLFSSL_BIGNUM *Z; |
| wolfSSL | 15:117db924cf7c | 82 | |
| wolfSSL | 15:117db924cf7c | 83 | void* internal; /* our ECC point */ |
| wolfSSL | 15:117db924cf7c | 84 | char inSet; /* internal set from external ? */ |
| wolfSSL | 15:117db924cf7c | 85 | char exSet; /* external set from internal ? */ |
| wolfSSL | 15:117db924cf7c | 86 | }; |
| wolfSSL | 15:117db924cf7c | 87 | |
| wolfSSL | 15:117db924cf7c | 88 | struct WOLFSSL_EC_GROUP { |
| wolfSSL | 15:117db924cf7c | 89 | int curve_idx; /* index of curve, used by WolfSSL as reference */ |
| wolfSSL | 15:117db924cf7c | 90 | int curve_nid; /* NID of curve, used by OpenSSL/OpenSSH as reference */ |
| wolfSSL | 15:117db924cf7c | 91 | int curve_oid; /* OID of curve, used by OpenSSL/OpenSSH as reference */ |
| wolfSSL | 15:117db924cf7c | 92 | }; |
| wolfSSL | 15:117db924cf7c | 93 | |
| wolfSSL | 15:117db924cf7c | 94 | struct WOLFSSL_EC_KEY { |
| wolfSSL | 15:117db924cf7c | 95 | WOLFSSL_EC_GROUP *group; |
| wolfSSL | 15:117db924cf7c | 96 | WOLFSSL_EC_POINT *pub_key; |
| wolfSSL | 15:117db924cf7c | 97 | WOLFSSL_BIGNUM *priv_key; |
| wolfSSL | 15:117db924cf7c | 98 | |
| wolfSSL | 15:117db924cf7c | 99 | void* internal; /* our ECC Key */ |
| wolfSSL | 15:117db924cf7c | 100 | char inSet; /* internal set from external ? */ |
| wolfSSL | 15:117db924cf7c | 101 | char exSet; /* external set from internal ? */ |
| wolfSSL | 15:117db924cf7c | 102 | }; |
| wolfSSL | 15:117db924cf7c | 103 | |
| wolfSSL | 15:117db924cf7c | 104 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 105 | int wolfSSL_ECPoint_i2d(const WOLFSSL_EC_GROUP *curve, |
| wolfSSL | 15:117db924cf7c | 106 | const WOLFSSL_EC_POINT *p, |
| wolfSSL | 15:117db924cf7c | 107 | unsigned char *out, unsigned int *len); |
| wolfSSL | 15:117db924cf7c | 108 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 109 | int wolfSSL_ECPoint_d2i(unsigned char *in, unsigned int len, |
| wolfSSL | 15:117db924cf7c | 110 | const WOLFSSL_EC_GROUP *curve, WOLFSSL_EC_POINT *p); |
| wolfSSL | 15:117db924cf7c | 111 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 112 | int wolfSSL_EC_KEY_LoadDer(WOLFSSL_EC_KEY* key, |
| wolfSSL | 15:117db924cf7c | 113 | const unsigned char* der, int derSz); |
| wolfSSL | 15:117db924cf7c | 114 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 115 | void wolfSSL_EC_KEY_free(WOLFSSL_EC_KEY *key); |
| wolfSSL | 15:117db924cf7c | 116 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 117 | WOLFSSL_EC_POINT *wolfSSL_EC_KEY_get0_public_key(const WOLFSSL_EC_KEY *key); |
| wolfSSL | 15:117db924cf7c | 118 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 119 | const WOLFSSL_EC_GROUP *wolfSSL_EC_KEY_get0_group(const WOLFSSL_EC_KEY *key); |
| wolfSSL | 15:117db924cf7c | 120 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 121 | int wolfSSL_EC_KEY_set_private_key(WOLFSSL_EC_KEY *key, |
| wolfSSL | 15:117db924cf7c | 122 | const WOLFSSL_BIGNUM *priv_key); |
| wolfSSL | 15:117db924cf7c | 123 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 124 | WOLFSSL_BIGNUM *wolfSSL_EC_KEY_get0_private_key(const WOLFSSL_EC_KEY *key); |
| wolfSSL | 15:117db924cf7c | 125 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 126 | WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new_by_curve_name(int nid); |
| wolfSSL | 15:117db924cf7c | 127 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 128 | WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new(void); |
| wolfSSL | 15:117db924cf7c | 129 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 130 | int wolfSSL_EC_KEY_set_group(WOLFSSL_EC_KEY *key, WOLFSSL_EC_GROUP *group); |
| wolfSSL | 15:117db924cf7c | 131 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 132 | int wolfSSL_EC_KEY_generate_key(WOLFSSL_EC_KEY *key); |
| wolfSSL | 15:117db924cf7c | 133 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 134 | void wolfSSL_EC_KEY_set_asn1_flag(WOLFSSL_EC_KEY *key, int asn1_flag); |
| wolfSSL | 15:117db924cf7c | 135 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 136 | int wolfSSL_EC_KEY_set_public_key(WOLFSSL_EC_KEY *key, |
| wolfSSL | 15:117db924cf7c | 137 | const WOLFSSL_EC_POINT *pub); |
| wolfSSL | 15:117db924cf7c | 138 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 139 | void wolfSSL_EC_GROUP_set_asn1_flag(WOLFSSL_EC_GROUP *group, int flag); |
| wolfSSL | 15:117db924cf7c | 140 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 141 | WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_new_by_curve_name(int nid); |
| wolfSSL | 15:117db924cf7c | 142 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 143 | int wolfSSL_EC_GROUP_cmp(const WOLFSSL_EC_GROUP *a, const WOLFSSL_EC_GROUP *b, |
| wolfSSL | 15:117db924cf7c | 144 | WOLFSSL_BN_CTX *ctx); |
| wolfSSL | 15:117db924cf7c | 145 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 146 | int wolfSSL_EC_GROUP_get_curve_name(const WOLFSSL_EC_GROUP *group); |
| wolfSSL | 15:117db924cf7c | 147 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 148 | int wolfSSL_EC_GROUP_get_degree(const WOLFSSL_EC_GROUP *group); |
| wolfSSL | 15:117db924cf7c | 149 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 150 | int wolfSSL_EC_GROUP_get_order(const WOLFSSL_EC_GROUP *group, |
| wolfSSL | 15:117db924cf7c | 151 | WOLFSSL_BIGNUM *order, WOLFSSL_BN_CTX *ctx); |
| wolfSSL | 15:117db924cf7c | 152 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 153 | void wolfSSL_EC_GROUP_free(WOLFSSL_EC_GROUP *group); |
| wolfSSL | 15:117db924cf7c | 154 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 155 | WOLFSSL_EC_POINT *wolfSSL_EC_POINT_new(const WOLFSSL_EC_GROUP *group); |
| wolfSSL | 15:117db924cf7c | 156 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 157 | int wolfSSL_EC_POINT_get_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group, |
| wolfSSL | 15:117db924cf7c | 158 | const WOLFSSL_EC_POINT *p, |
| wolfSSL | 15:117db924cf7c | 159 | WOLFSSL_BIGNUM *x, |
| wolfSSL | 15:117db924cf7c | 160 | WOLFSSL_BIGNUM *y, |
| wolfSSL | 15:117db924cf7c | 161 | WOLFSSL_BN_CTX *ctx); |
| wolfSSL | 15:117db924cf7c | 162 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 163 | int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r, |
| wolfSSL | 15:117db924cf7c | 164 | const WOLFSSL_BIGNUM *n, |
| wolfSSL | 15:117db924cf7c | 165 | const WOLFSSL_EC_POINT *q, const WOLFSSL_BIGNUM *m, |
| wolfSSL | 15:117db924cf7c | 166 | WOLFSSL_BN_CTX *ctx); |
| wolfSSL | 15:117db924cf7c | 167 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 168 | void wolfSSL_EC_POINT_clear_free(WOLFSSL_EC_POINT *point); |
| wolfSSL | 15:117db924cf7c | 169 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 170 | int wolfSSL_EC_POINT_cmp(const WOLFSSL_EC_GROUP *group, |
| wolfSSL | 15:117db924cf7c | 171 | const WOLFSSL_EC_POINT *a, const WOLFSSL_EC_POINT *b, |
| wolfSSL | 15:117db924cf7c | 172 | WOLFSSL_BN_CTX *ctx); |
| wolfSSL | 15:117db924cf7c | 173 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 174 | void wolfSSL_EC_POINT_free(WOLFSSL_EC_POINT *point); |
| wolfSSL | 15:117db924cf7c | 175 | WOLFSSL_API |
| wolfSSL | 15:117db924cf7c | 176 | int wolfSSL_EC_POINT_is_at_infinity(const WOLFSSL_EC_GROUP *group, |
| wolfSSL | 15:117db924cf7c | 177 | const WOLFSSL_EC_POINT *a); |
| wolfSSL | 15:117db924cf7c | 178 | |
| wolfSSL | 15:117db924cf7c | 179 | #define EC_KEY_free wolfSSL_EC_KEY_free |
| wolfSSL | 15:117db924cf7c | 180 | #define EC_KEY_get0_public_key wolfSSL_EC_KEY_get0_public_key |
| wolfSSL | 15:117db924cf7c | 181 | #define EC_KEY_get0_group wolfSSL_EC_KEY_get0_group |
| wolfSSL | 15:117db924cf7c | 182 | #define EC_KEY_set_private_key wolfSSL_EC_KEY_set_private_key |
| wolfSSL | 15:117db924cf7c | 183 | #define EC_KEY_get0_private_key wolfSSL_EC_KEY_get0_private_key |
| wolfSSL | 15:117db924cf7c | 184 | #define EC_KEY_new_by_curve_name wolfSSL_EC_KEY_new_by_curve_name |
| wolfSSL | 15:117db924cf7c | 185 | #define EC_KEY_set_group wolfSSL_EC_KEY_set_group |
| wolfSSL | 15:117db924cf7c | 186 | #define EC_KEY_generate_key wolfSSL_EC_KEY_generate_key |
| wolfSSL | 15:117db924cf7c | 187 | #define EC_KEY_set_asn1_flag wolfSSL_EC_KEY_set_asn1_flag |
| wolfSSL | 15:117db924cf7c | 188 | #define EC_KEY_set_public_key wolfSSL_EC_KEY_set_public_key |
| wolfSSL | 15:117db924cf7c | 189 | #define EC_KEY_new wolfSSL_EC_KEY_new |
| wolfSSL | 15:117db924cf7c | 190 | |
| wolfSSL | 15:117db924cf7c | 191 | #define EC_GROUP_set_asn1_flag wolfSSL_EC_GROUP_set_asn1_flag |
| wolfSSL | 15:117db924cf7c | 192 | #define EC_GROUP_new_by_curve_name wolfSSL_EC_GROUP_new_by_curve_name |
| wolfSSL | 15:117db924cf7c | 193 | #define EC_GROUP_cmp wolfSSL_EC_GROUP_cmp |
| wolfSSL | 15:117db924cf7c | 194 | #define EC_GROUP_get_curve_name wolfSSL_EC_GROUP_get_curve_name |
| wolfSSL | 15:117db924cf7c | 195 | #define EC_GROUP_get_degree wolfSSL_EC_GROUP_get_degree |
| wolfSSL | 15:117db924cf7c | 196 | #define EC_GROUP_get_order wolfSSL_EC_GROUP_get_order |
| wolfSSL | 15:117db924cf7c | 197 | #define EC_GROUP_free wolfSSL_EC_GROUP_free |
| wolfSSL | 15:117db924cf7c | 198 | |
| wolfSSL | 15:117db924cf7c | 199 | #define EC_POINT_new wolfSSL_EC_POINT_new |
| wolfSSL | 15:117db924cf7c | 200 | #define EC_POINT_get_affine_coordinates_GFp \ |
| wolfSSL | 15:117db924cf7c | 201 | wolfSSL_EC_POINT_get_affine_coordinates_GFp |
| wolfSSL | 15:117db924cf7c | 202 | #define EC_POINT_mul wolfSSL_EC_POINT_mul |
| wolfSSL | 15:117db924cf7c | 203 | #define EC_POINT_clear_free wolfSSL_EC_POINT_clear_free |
| wolfSSL | 15:117db924cf7c | 204 | #define EC_POINT_cmp wolfSSL_EC_POINT_cmp |
| wolfSSL | 15:117db924cf7c | 205 | #define EC_POINT_free wolfSSL_EC_POINT_free |
| wolfSSL | 15:117db924cf7c | 206 | #define EC_POINT_is_at_infinity wolfSSL_EC_POINT_is_at_infinity |
| wolfSSL | 15:117db924cf7c | 207 | |
| wolfSSL | 15:117db924cf7c | 208 | #define EC_POINT_dump wolfSSL_EC_POINT_dump |
| wolfSSL | 15:117db924cf7c | 209 | |
| wolfSSL | 15:117db924cf7c | 210 | #ifdef __cplusplus |
| wolfSSL | 15:117db924cf7c | 211 | } /* extern "C" */ |
| wolfSSL | 15:117db924cf7c | 212 | #endif |
| wolfSSL | 15:117db924cf7c | 213 | |
| wolfSSL | 15:117db924cf7c | 214 | #endif /* header */ |
| wolfSSL | 15:117db924cf7c | 215 |