Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/ec/ec_key.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /* $OpenBSD: ec_key.c,v 1.17 2018/07/15 16:27:39 tb Exp $ */ | - | ||||||||||||||||||||||||
2 | /* | - | ||||||||||||||||||||||||
3 | * Written by Nils Larsch for the OpenSSL project. | - | ||||||||||||||||||||||||
4 | */ | - | ||||||||||||||||||||||||
5 | /* ==================================================================== | - | ||||||||||||||||||||||||
6 | * Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved. | - | ||||||||||||||||||||||||
7 | * | - | ||||||||||||||||||||||||
8 | * Redistribution and use in source and binary forms, with or without | - | ||||||||||||||||||||||||
9 | * modification, are permitted provided that the following conditions | - | ||||||||||||||||||||||||
10 | * are met: | - | ||||||||||||||||||||||||
11 | * | - | ||||||||||||||||||||||||
12 | * 1. Redistributions of source code must retain the above copyright | - | ||||||||||||||||||||||||
13 | * notice, this list of conditions and the following disclaimer. | - | ||||||||||||||||||||||||
14 | * | - | ||||||||||||||||||||||||
15 | * 2. Redistributions in binary form must reproduce the above copyright | - | ||||||||||||||||||||||||
16 | * notice, this list of conditions and the following disclaimer in | - | ||||||||||||||||||||||||
17 | * the documentation and/or other materials provided with the | - | ||||||||||||||||||||||||
18 | * distribution. | - | ||||||||||||||||||||||||
19 | * | - | ||||||||||||||||||||||||
20 | * 3. All advertising materials mentioning features or use of this | - | ||||||||||||||||||||||||
21 | * software must display the following acknowledgment: | - | ||||||||||||||||||||||||
22 | * "This product includes software developed by the OpenSSL Project | - | ||||||||||||||||||||||||
23 | * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" | - | ||||||||||||||||||||||||
24 | * | - | ||||||||||||||||||||||||
25 | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | - | ||||||||||||||||||||||||
26 | * endorse or promote products derived from this software without | - | ||||||||||||||||||||||||
27 | * prior written permission. For written permission, please contact | - | ||||||||||||||||||||||||
28 | * openssl-core@openssl.org. | - | ||||||||||||||||||||||||
29 | * | - | ||||||||||||||||||||||||
30 | * 5. Products derived from this software may not be called "OpenSSL" | - | ||||||||||||||||||||||||
31 | * nor may "OpenSSL" appear in their names without prior written | - | ||||||||||||||||||||||||
32 | * permission of the OpenSSL Project. | - | ||||||||||||||||||||||||
33 | * | - | ||||||||||||||||||||||||
34 | * 6. Redistributions of any form whatsoever must retain the following | - | ||||||||||||||||||||||||
35 | * acknowledgment: | - | ||||||||||||||||||||||||
36 | * "This product includes software developed by the OpenSSL Project | - | ||||||||||||||||||||||||
37 | * for use in the OpenSSL Toolkit (http://www.openssl.org/)" | - | ||||||||||||||||||||||||
38 | * | - | ||||||||||||||||||||||||
39 | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | - | ||||||||||||||||||||||||
40 | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | - | ||||||||||||||||||||||||
41 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | - | ||||||||||||||||||||||||
42 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | - | ||||||||||||||||||||||||
43 | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | - | ||||||||||||||||||||||||
44 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | - | ||||||||||||||||||||||||
45 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | - | ||||||||||||||||||||||||
46 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | - | ||||||||||||||||||||||||
47 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | - | ||||||||||||||||||||||||
48 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | - | ||||||||||||||||||||||||
49 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | - | ||||||||||||||||||||||||
50 | * OF THE POSSIBILITY OF SUCH DAMAGE. | - | ||||||||||||||||||||||||
51 | * ==================================================================== | - | ||||||||||||||||||||||||
52 | * | - | ||||||||||||||||||||||||
53 | * This product includes cryptographic software written by Eric Young | - | ||||||||||||||||||||||||
54 | * (eay@cryptsoft.com). This product includes software written by Tim | - | ||||||||||||||||||||||||
55 | * Hudson (tjh@cryptsoft.com). | - | ||||||||||||||||||||||||
56 | * | - | ||||||||||||||||||||||||
57 | */ | - | ||||||||||||||||||||||||
58 | /* ==================================================================== | - | ||||||||||||||||||||||||
59 | * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. | - | ||||||||||||||||||||||||
60 | * Portions originally developed by SUN MICROSYSTEMS, INC., and | - | ||||||||||||||||||||||||
61 | * contributed to the OpenSSL project. | - | ||||||||||||||||||||||||
62 | */ | - | ||||||||||||||||||||||||
63 | - | |||||||||||||||||||||||||
64 | #include <string.h> | - | ||||||||||||||||||||||||
65 | - | |||||||||||||||||||||||||
66 | #include <openssl/opensslconf.h> | - | ||||||||||||||||||||||||
67 | - | |||||||||||||||||||||||||
68 | #include "ec_lcl.h" | - | ||||||||||||||||||||||||
69 | #include <openssl/err.h> | - | ||||||||||||||||||||||||
70 | - | |||||||||||||||||||||||||
71 | EC_KEY * | - | ||||||||||||||||||||||||
72 | EC_KEY_new(void) | - | ||||||||||||||||||||||||
73 | { | - | ||||||||||||||||||||||||
74 | EC_KEY *ret; | - | ||||||||||||||||||||||||
75 | - | |||||||||||||||||||||||||
76 | ret = malloc(sizeof(EC_KEY)); | - | ||||||||||||||||||||||||
77 | if (ret == NULL) {
| 0-319 | ||||||||||||||||||||||||
78 | ECerror(ERR_R_MALLOC_FAILURE); | - | ||||||||||||||||||||||||
79 | return (NULL); never executed: return ( ((void *)0) ); | 0 | ||||||||||||||||||||||||
80 | } | - | ||||||||||||||||||||||||
81 | ret->version = 1; | - | ||||||||||||||||||||||||
82 | ret->flags = 0; | - | ||||||||||||||||||||||||
83 | ret->group = NULL; | - | ||||||||||||||||||||||||
84 | ret->pub_key = NULL; | - | ||||||||||||||||||||||||
85 | ret->priv_key = NULL; | - | ||||||||||||||||||||||||
86 | ret->enc_flag = 0; | - | ||||||||||||||||||||||||
87 | ret->conv_form = POINT_CONVERSION_UNCOMPRESSED; | - | ||||||||||||||||||||||||
88 | ret->references = 1; | - | ||||||||||||||||||||||||
89 | ret->method_data = NULL; | - | ||||||||||||||||||||||||
90 | return (ret); executed 319 times by 3 tests: return (ret); Executed by:
| 319 | ||||||||||||||||||||||||
91 | } | - | ||||||||||||||||||||||||
92 | - | |||||||||||||||||||||||||
93 | EC_KEY * | - | ||||||||||||||||||||||||
94 | EC_KEY_new_by_curve_name(int nid) | - | ||||||||||||||||||||||||
95 | { | - | ||||||||||||||||||||||||
96 | EC_KEY *ret = EC_KEY_new(); | - | ||||||||||||||||||||||||
97 | if (ret == NULL)
| 0-108 | ||||||||||||||||||||||||
98 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
99 | ret->group = EC_GROUP_new_by_curve_name(nid); | - | ||||||||||||||||||||||||
100 | if (ret->group == NULL) {
| 0-108 | ||||||||||||||||||||||||
101 | EC_KEY_free(ret); | - | ||||||||||||||||||||||||
102 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
103 | } | - | ||||||||||||||||||||||||
104 | return ret; executed 108 times by 2 tests: return ret; Executed by:
| 108 | ||||||||||||||||||||||||
105 | } | - | ||||||||||||||||||||||||
106 | - | |||||||||||||||||||||||||
107 | void | - | ||||||||||||||||||||||||
108 | EC_KEY_free(EC_KEY * r) | - | ||||||||||||||||||||||||
109 | { | - | ||||||||||||||||||||||||
110 | int i; | - | ||||||||||||||||||||||||
111 | - | |||||||||||||||||||||||||
112 | if (r == NULL)
| 319-1454 | ||||||||||||||||||||||||
113 | return; executed 1454 times by 15 tests: return; Executed by:
| 1454 | ||||||||||||||||||||||||
114 | - | |||||||||||||||||||||||||
115 | i = CRYPTO_add(&r->references, -1, CRYPTO_LOCK_EC); | - | ||||||||||||||||||||||||
116 | if (i > 0)
| 0-319 | ||||||||||||||||||||||||
117 | return; never executed: return; | 0 | ||||||||||||||||||||||||
118 | - | |||||||||||||||||||||||||
119 | EC_GROUP_free(r->group); | - | ||||||||||||||||||||||||
120 | EC_POINT_free(r->pub_key); | - | ||||||||||||||||||||||||
121 | BN_clear_free(r->priv_key); | - | ||||||||||||||||||||||||
122 | - | |||||||||||||||||||||||||
123 | EC_EX_DATA_free_all_data(&r->method_data); | - | ||||||||||||||||||||||||
124 | - | |||||||||||||||||||||||||
125 | freezero(r, sizeof(EC_KEY)); | - | ||||||||||||||||||||||||
126 | } executed 319 times by 3 tests: end of block Executed by:
| 319 | ||||||||||||||||||||||||
127 | - | |||||||||||||||||||||||||
128 | EC_KEY * | - | ||||||||||||||||||||||||
129 | EC_KEY_copy(EC_KEY * dest, const EC_KEY * src) | - | ||||||||||||||||||||||||
130 | { | - | ||||||||||||||||||||||||
131 | EC_EXTRA_DATA *d; | - | ||||||||||||||||||||||||
132 | - | |||||||||||||||||||||||||
133 | if (dest == NULL || src == NULL) {
| 0 | ||||||||||||||||||||||||
134 | ECerror(ERR_R_PASSED_NULL_PARAMETER); | - | ||||||||||||||||||||||||
135 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
136 | } | - | ||||||||||||||||||||||||
137 | /* copy the parameters */ | - | ||||||||||||||||||||||||
138 | if (src->group) {
| 0 | ||||||||||||||||||||||||
139 | const EC_METHOD *meth = EC_GROUP_method_of(src->group); | - | ||||||||||||||||||||||||
140 | /* clear the old group */ | - | ||||||||||||||||||||||||
141 | EC_GROUP_free(dest->group); | - | ||||||||||||||||||||||||
142 | dest->group = EC_GROUP_new(meth); | - | ||||||||||||||||||||||||
143 | if (dest->group == NULL)
| 0 | ||||||||||||||||||||||||
144 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
145 | if (!EC_GROUP_copy(dest->group, src->group))
| 0 | ||||||||||||||||||||||||
146 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
147 | } never executed: end of block | 0 | ||||||||||||||||||||||||
148 | /* copy the public key */ | - | ||||||||||||||||||||||||
149 | if (src->pub_key && src->group) {
| 0 | ||||||||||||||||||||||||
150 | EC_POINT_free(dest->pub_key); | - | ||||||||||||||||||||||||
151 | dest->pub_key = EC_POINT_new(src->group); | - | ||||||||||||||||||||||||
152 | if (dest->pub_key == NULL)
| 0 | ||||||||||||||||||||||||
153 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
154 | if (!EC_POINT_copy(dest->pub_key, src->pub_key))
| 0 | ||||||||||||||||||||||||
155 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
156 | } never executed: end of block | 0 | ||||||||||||||||||||||||
157 | /* copy the private key */ | - | ||||||||||||||||||||||||
158 | if (src->priv_key) {
| 0 | ||||||||||||||||||||||||
159 | if (dest->priv_key == NULL) {
| 0 | ||||||||||||||||||||||||
160 | dest->priv_key = BN_new(); | - | ||||||||||||||||||||||||
161 | if (dest->priv_key == NULL)
| 0 | ||||||||||||||||||||||||
162 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
163 | } never executed: end of block | 0 | ||||||||||||||||||||||||
164 | if (!BN_copy(dest->priv_key, src->priv_key))
| 0 | ||||||||||||||||||||||||
165 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
166 | } never executed: end of block | 0 | ||||||||||||||||||||||||
167 | /* copy method/extra data */ | - | ||||||||||||||||||||||||
168 | EC_EX_DATA_free_all_data(&dest->method_data); | - | ||||||||||||||||||||||||
169 | - | |||||||||||||||||||||||||
170 | for (d = src->method_data; d != NULL; d = d->next) {
| 0 | ||||||||||||||||||||||||
171 | void *t = d->dup_func(d->data); | - | ||||||||||||||||||||||||
172 | - | |||||||||||||||||||||||||
173 | if (t == NULL)
| 0 | ||||||||||||||||||||||||
174 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
175 | if (!EC_EX_DATA_set_data(&dest->method_data, t, d->dup_func,
| 0 | ||||||||||||||||||||||||
176 | d->free_func, d->clear_free_func))
| 0 | ||||||||||||||||||||||||
177 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
178 | } never executed: end of block | 0 | ||||||||||||||||||||||||
179 | - | |||||||||||||||||||||||||
180 | /* copy the rest */ | - | ||||||||||||||||||||||||
181 | dest->enc_flag = src->enc_flag; | - | ||||||||||||||||||||||||
182 | dest->conv_form = src->conv_form; | - | ||||||||||||||||||||||||
183 | dest->version = src->version; | - | ||||||||||||||||||||||||
184 | dest->flags = src->flags; | - | ||||||||||||||||||||||||
185 | - | |||||||||||||||||||||||||
186 | return dest; never executed: return dest; | 0 | ||||||||||||||||||||||||
187 | } | - | ||||||||||||||||||||||||
188 | - | |||||||||||||||||||||||||
189 | EC_KEY * | - | ||||||||||||||||||||||||
190 | EC_KEY_dup(const EC_KEY * ec_key) | - | ||||||||||||||||||||||||
191 | { | - | ||||||||||||||||||||||||
192 | EC_KEY *ret = EC_KEY_new(); | - | ||||||||||||||||||||||||
193 | if (ret == NULL)
| 0 | ||||||||||||||||||||||||
194 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
195 | if (EC_KEY_copy(ret, ec_key) == NULL) {
| 0 | ||||||||||||||||||||||||
196 | EC_KEY_free(ret); | - | ||||||||||||||||||||||||
197 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
198 | } | - | ||||||||||||||||||||||||
199 | return ret; never executed: return ret; | 0 | ||||||||||||||||||||||||
200 | } | - | ||||||||||||||||||||||||
201 | - | |||||||||||||||||||||||||
202 | int | - | ||||||||||||||||||||||||
203 | EC_KEY_up_ref(EC_KEY * r) | - | ||||||||||||||||||||||||
204 | { | - | ||||||||||||||||||||||||
205 | int i = CRYPTO_add(&r->references, 1, CRYPTO_LOCK_EC); | - | ||||||||||||||||||||||||
206 | return ((i > 1) ? 1 : 0); never executed: return ((i > 1) ? 1 : 0);
| 0 | ||||||||||||||||||||||||
207 | } | - | ||||||||||||||||||||||||
208 | - | |||||||||||||||||||||||||
209 | int | - | ||||||||||||||||||||||||
210 | EC_KEY_generate_key(EC_KEY * eckey) | - | ||||||||||||||||||||||||
211 | { | - | ||||||||||||||||||||||||
212 | int ok = 0; | - | ||||||||||||||||||||||||
213 | BN_CTX *ctx = NULL; | - | ||||||||||||||||||||||||
214 | BIGNUM *priv_key = NULL, *order = NULL; | - | ||||||||||||||||||||||||
215 | EC_POINT *pub_key = NULL; | - | ||||||||||||||||||||||||
216 | - | |||||||||||||||||||||||||
217 | if (!eckey || !eckey->group) {
| 0-228 | ||||||||||||||||||||||||
218 | ECerror(ERR_R_PASSED_NULL_PARAMETER); | - | ||||||||||||||||||||||||
219 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
220 | } | - | ||||||||||||||||||||||||
221 | if ((order = BN_new()) == NULL)
| 0-228 | ||||||||||||||||||||||||
222 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
223 | if ((ctx = BN_CTX_new()) == NULL)
| 0-228 | ||||||||||||||||||||||||
224 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
225 | - | |||||||||||||||||||||||||
226 | if (eckey->priv_key == NULL) {
| 0-228 | ||||||||||||||||||||||||
227 | priv_key = BN_new(); | - | ||||||||||||||||||||||||
228 | if (priv_key == NULL)
| 0-228 | ||||||||||||||||||||||||
229 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
230 | } else executed 228 times by 3 tests: end of block Executed by:
| 228 | ||||||||||||||||||||||||
231 | priv_key = eckey->priv_key; never executed: priv_key = eckey->priv_key; | 0 | ||||||||||||||||||||||||
232 | - | |||||||||||||||||||||||||
233 | if (!EC_GROUP_get_order(eckey->group, order, ctx))
| 0-228 | ||||||||||||||||||||||||
234 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
235 | - | |||||||||||||||||||||||||
236 | do | - | ||||||||||||||||||||||||
237 | if (!BN_rand_range(priv_key, order))
| 0-228 | ||||||||||||||||||||||||
238 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
239 | while (BN_is_zero(priv_key));
| 0-228 | ||||||||||||||||||||||||
240 | - | |||||||||||||||||||||||||
241 | if (eckey->pub_key == NULL) {
| 0-228 | ||||||||||||||||||||||||
242 | pub_key = EC_POINT_new(eckey->group); | - | ||||||||||||||||||||||||
243 | if (pub_key == NULL)
| 0-228 | ||||||||||||||||||||||||
244 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
245 | } else executed 228 times by 3 tests: end of block Executed by:
| 228 | ||||||||||||||||||||||||
246 | pub_key = eckey->pub_key; never executed: pub_key = eckey->pub_key; | 0 | ||||||||||||||||||||||||
247 | - | |||||||||||||||||||||||||
248 | if (!EC_POINT_mul(eckey->group, pub_key, priv_key, NULL, NULL, ctx))
| 0-228 | ||||||||||||||||||||||||
249 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
250 | - | |||||||||||||||||||||||||
251 | eckey->priv_key = priv_key; | - | ||||||||||||||||||||||||
252 | eckey->pub_key = pub_key; | - | ||||||||||||||||||||||||
253 | - | |||||||||||||||||||||||||
254 | ok = 1; | - | ||||||||||||||||||||||||
255 | - | |||||||||||||||||||||||||
256 | err: code before this statement executed 228 times by 3 tests: err: Executed by:
| 228 | ||||||||||||||||||||||||
257 | BN_free(order); | - | ||||||||||||||||||||||||
258 | if (pub_key != NULL && eckey->pub_key == NULL)
| 0-228 | ||||||||||||||||||||||||
259 | EC_POINT_free(pub_key); never executed: EC_POINT_free(pub_key); | 0 | ||||||||||||||||||||||||
260 | if (priv_key != NULL && eckey->priv_key == NULL)
| 0-228 | ||||||||||||||||||||||||
261 | BN_free(priv_key); never executed: BN_free(priv_key); | 0 | ||||||||||||||||||||||||
262 | BN_CTX_free(ctx); | - | ||||||||||||||||||||||||
263 | return (ok); executed 228 times by 3 tests: return (ok); Executed by:
| 228 | ||||||||||||||||||||||||
264 | } | - | ||||||||||||||||||||||||
265 | - | |||||||||||||||||||||||||
266 | int | - | ||||||||||||||||||||||||
267 | EC_KEY_check_key(const EC_KEY * eckey) | - | ||||||||||||||||||||||||
268 | { | - | ||||||||||||||||||||||||
269 | int ok = 0; | - | ||||||||||||||||||||||||
270 | BN_CTX *ctx = NULL; | - | ||||||||||||||||||||||||
271 | const BIGNUM *order = NULL; | - | ||||||||||||||||||||||||
272 | EC_POINT *point = NULL; | - | ||||||||||||||||||||||||
273 | - | |||||||||||||||||||||||||
274 | if (!eckey || !eckey->group || !eckey->pub_key) {
| 0-76 | ||||||||||||||||||||||||
275 | ECerror(ERR_R_PASSED_NULL_PARAMETER); | - | ||||||||||||||||||||||||
276 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
277 | } | - | ||||||||||||||||||||||||
278 | if (EC_POINT_is_at_infinity(eckey->group, eckey->pub_key) > 0) {
| 0-76 | ||||||||||||||||||||||||
279 | ECerror(EC_R_POINT_AT_INFINITY); | - | ||||||||||||||||||||||||
280 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
281 | } | - | ||||||||||||||||||||||||
282 | if ((ctx = BN_CTX_new()) == NULL)
| 0-76 | ||||||||||||||||||||||||
283 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
284 | if ((point = EC_POINT_new(eckey->group)) == NULL)
| 0-76 | ||||||||||||||||||||||||
285 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
286 | - | |||||||||||||||||||||||||
287 | /* testing whether the pub_key is on the elliptic curve */ | - | ||||||||||||||||||||||||
288 | if (EC_POINT_is_on_curve(eckey->group, eckey->pub_key, ctx) <= 0) {
| 0-76 | ||||||||||||||||||||||||
289 | ECerror(EC_R_POINT_IS_NOT_ON_CURVE); | - | ||||||||||||||||||||||||
290 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
291 | } | - | ||||||||||||||||||||||||
292 | /* testing whether pub_key * order is the point at infinity */ | - | ||||||||||||||||||||||||
293 | order = &eckey->group->order; | - | ||||||||||||||||||||||||
294 | if (BN_is_zero(order)) {
| 0-76 | ||||||||||||||||||||||||
295 | ECerror(EC_R_INVALID_GROUP_ORDER); | - | ||||||||||||||||||||||||
296 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
297 | } | - | ||||||||||||||||||||||||
298 | if (!EC_POINT_mul(eckey->group, point, NULL, eckey->pub_key, order, ctx)) {
| 0-76 | ||||||||||||||||||||||||
299 | ECerror(ERR_R_EC_LIB); | - | ||||||||||||||||||||||||
300 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
301 | } | - | ||||||||||||||||||||||||
302 | if (EC_POINT_is_at_infinity(eckey->group, point) <= 0) {
| 0-76 | ||||||||||||||||||||||||
303 | ECerror(EC_R_WRONG_ORDER); | - | ||||||||||||||||||||||||
304 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
305 | } | - | ||||||||||||||||||||||||
306 | /* | - | ||||||||||||||||||||||||
307 | * in case the priv_key is present : check if generator * priv_key == | - | ||||||||||||||||||||||||
308 | * pub_key | - | ||||||||||||||||||||||||
309 | */ | - | ||||||||||||||||||||||||
310 | if (eckey->priv_key) {
| 0-76 | ||||||||||||||||||||||||
311 | if (BN_cmp(eckey->priv_key, order) >= 0) {
| 0-76 | ||||||||||||||||||||||||
312 | ECerror(EC_R_WRONG_ORDER); | - | ||||||||||||||||||||||||
313 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
314 | } | - | ||||||||||||||||||||||||
315 | if (!EC_POINT_mul(eckey->group, point, eckey->priv_key,
| 0-76 | ||||||||||||||||||||||||
316 | NULL, NULL, ctx)) {
| 0-76 | ||||||||||||||||||||||||
317 | ECerror(ERR_R_EC_LIB); | - | ||||||||||||||||||||||||
318 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
319 | } | - | ||||||||||||||||||||||||
320 | if (EC_POINT_cmp(eckey->group, point, eckey->pub_key,
| 0-76 | ||||||||||||||||||||||||
321 | ctx) != 0) {
| 0-76 | ||||||||||||||||||||||||
322 | ECerror(EC_R_INVALID_PRIVATE_KEY); | - | ||||||||||||||||||||||||
323 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
324 | } | - | ||||||||||||||||||||||||
325 | } executed 76 times by 1 test: end of block Executed by:
| 76 | ||||||||||||||||||||||||
326 | ok = 1; | - | ||||||||||||||||||||||||
327 | err: code before this statement executed 76 times by 1 test: err: Executed by:
| 76 | ||||||||||||||||||||||||
328 | BN_CTX_free(ctx); | - | ||||||||||||||||||||||||
329 | EC_POINT_free(point); | - | ||||||||||||||||||||||||
330 | return (ok); executed 76 times by 1 test: return (ok); Executed by:
| 76 | ||||||||||||||||||||||||
331 | } | - | ||||||||||||||||||||||||
332 | - | |||||||||||||||||||||||||
333 | int | - | ||||||||||||||||||||||||
334 | EC_KEY_set_public_key_affine_coordinates(EC_KEY * key, BIGNUM * x, BIGNUM * y) | - | ||||||||||||||||||||||||
335 | { | - | ||||||||||||||||||||||||
336 | BN_CTX *ctx = NULL; | - | ||||||||||||||||||||||||
337 | BIGNUM *tx, *ty; | - | ||||||||||||||||||||||||
338 | EC_POINT *point = NULL; | - | ||||||||||||||||||||||||
339 | int ok = 0, tmp_nid, is_char_two = 0; | - | ||||||||||||||||||||||||
340 | - | |||||||||||||||||||||||||
341 | if (!key || !key->group || !x || !y) {
| 0 | ||||||||||||||||||||||||
342 | ECerror(ERR_R_PASSED_NULL_PARAMETER); | - | ||||||||||||||||||||||||
343 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
344 | } | - | ||||||||||||||||||||||||
345 | ctx = BN_CTX_new(); | - | ||||||||||||||||||||||||
346 | if (!ctx)
| 0 | ||||||||||||||||||||||||
347 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
348 | - | |||||||||||||||||||||||||
349 | point = EC_POINT_new(key->group); | - | ||||||||||||||||||||||||
350 | - | |||||||||||||||||||||||||
351 | if (!point)
| 0 | ||||||||||||||||||||||||
352 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
353 | - | |||||||||||||||||||||||||
354 | tmp_nid = EC_METHOD_get_field_type(EC_GROUP_method_of(key->group)); | - | ||||||||||||||||||||||||
355 | - | |||||||||||||||||||||||||
356 | if (tmp_nid == NID_X9_62_characteristic_two_field)
| 0 | ||||||||||||||||||||||||
357 | is_char_two = 1; never executed: is_char_two = 1; | 0 | ||||||||||||||||||||||||
358 | - | |||||||||||||||||||||||||
359 | if ((tx = BN_CTX_get(ctx)) == NULL)
| 0 | ||||||||||||||||||||||||
360 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
361 | if ((ty = BN_CTX_get(ctx)) == NULL)
| 0 | ||||||||||||||||||||||||
362 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
363 | - | |||||||||||||||||||||||||
364 | #ifndef OPENSSL_NO_EC2M | - | ||||||||||||||||||||||||
365 | if (is_char_two) {
| 0 | ||||||||||||||||||||||||
366 | if (!EC_POINT_set_affine_coordinates_GF2m(key->group, point,
| 0 | ||||||||||||||||||||||||
367 | x, y, ctx))
| 0 | ||||||||||||||||||||||||
368 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
369 | if (!EC_POINT_get_affine_coordinates_GF2m(key->group, point,
| 0 | ||||||||||||||||||||||||
370 | tx, ty, ctx))
| 0 | ||||||||||||||||||||||||
371 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
372 | } else never executed: end of block | 0 | ||||||||||||||||||||||||
373 | #endif | - | ||||||||||||||||||||||||
374 | { | - | ||||||||||||||||||||||||
375 | if (!EC_POINT_set_affine_coordinates_GFp(key->group, point,
| 0 | ||||||||||||||||||||||||
376 | x, y, ctx))
| 0 | ||||||||||||||||||||||||
377 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
378 | if (!EC_POINT_get_affine_coordinates_GFp(key->group, point,
| 0 | ||||||||||||||||||||||||
379 | tx, ty, ctx))
| 0 | ||||||||||||||||||||||||
380 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
381 | } never executed: end of block | 0 | ||||||||||||||||||||||||
382 | /* | - | ||||||||||||||||||||||||
383 | * Check if retrieved coordinates match originals: if not values are | - | ||||||||||||||||||||||||
384 | * out of range. | - | ||||||||||||||||||||||||
385 | */ | - | ||||||||||||||||||||||||
386 | if (BN_cmp(x, tx) || BN_cmp(y, ty)) {
| 0 | ||||||||||||||||||||||||
387 | ECerror(EC_R_COORDINATES_OUT_OF_RANGE); | - | ||||||||||||||||||||||||
388 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
389 | } | - | ||||||||||||||||||||||||
390 | if (!EC_KEY_set_public_key(key, point))
| 0 | ||||||||||||||||||||||||
391 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
392 | - | |||||||||||||||||||||||||
393 | if (EC_KEY_check_key(key) == 0)
| 0 | ||||||||||||||||||||||||
394 | goto err; never executed: goto err; | 0 | ||||||||||||||||||||||||
395 | - | |||||||||||||||||||||||||
396 | ok = 1; | - | ||||||||||||||||||||||||
397 | - | |||||||||||||||||||||||||
398 | err: code before this statement never executed: err: | 0 | ||||||||||||||||||||||||
399 | BN_CTX_free(ctx); | - | ||||||||||||||||||||||||
400 | EC_POINT_free(point); | - | ||||||||||||||||||||||||
401 | return ok; never executed: return ok; | 0 | ||||||||||||||||||||||||
402 | - | |||||||||||||||||||||||||
403 | } | - | ||||||||||||||||||||||||
404 | - | |||||||||||||||||||||||||
405 | const EC_GROUP * | - | ||||||||||||||||||||||||
406 | EC_KEY_get0_group(const EC_KEY * key) | - | ||||||||||||||||||||||||
407 | { | - | ||||||||||||||||||||||||
408 | return key->group; executed 1072 times by 3 tests: return key->group; Executed by:
| 1072 | ||||||||||||||||||||||||
409 | } | - | ||||||||||||||||||||||||
410 | - | |||||||||||||||||||||||||
411 | int | - | ||||||||||||||||||||||||
412 | EC_KEY_set_group(EC_KEY * key, const EC_GROUP * group) | - | ||||||||||||||||||||||||
413 | { | - | ||||||||||||||||||||||||
414 | EC_GROUP_free(key->group); | - | ||||||||||||||||||||||||
415 | key->group = EC_GROUP_dup(group); | - | ||||||||||||||||||||||||
416 | return (key->group == NULL) ? 0 : 1; executed 211 times by 2 tests: return (key->group == ((void *)0) ) ? 0 : 1; Executed by:
| 0-211 | ||||||||||||||||||||||||
417 | } | - | ||||||||||||||||||||||||
418 | - | |||||||||||||||||||||||||
419 | const BIGNUM * | - | ||||||||||||||||||||||||
420 | EC_KEY_get0_private_key(const EC_KEY * key) | - | ||||||||||||||||||||||||
421 | { | - | ||||||||||||||||||||||||
422 | return key->priv_key; executed 181 times by 3 tests: return key->priv_key; Executed by:
| 181 | ||||||||||||||||||||||||
423 | } | - | ||||||||||||||||||||||||
424 | - | |||||||||||||||||||||||||
425 | int | - | ||||||||||||||||||||||||
426 | EC_KEY_set_private_key(EC_KEY * key, const BIGNUM * priv_key) | - | ||||||||||||||||||||||||
427 | { | - | ||||||||||||||||||||||||
428 | BN_clear_free(key->priv_key); | - | ||||||||||||||||||||||||
429 | key->priv_key = BN_dup(priv_key); | - | ||||||||||||||||||||||||
430 | return (key->priv_key == NULL) ? 0 : 1; executed 6 times by 1 test: return (key->priv_key == ((void *)0) ) ? 0 : 1; Executed by:
| 0-6 | ||||||||||||||||||||||||
431 | } | - | ||||||||||||||||||||||||
432 | - | |||||||||||||||||||||||||
433 | const EC_POINT * | - | ||||||||||||||||||||||||
434 | EC_KEY_get0_public_key(const EC_KEY * key) | - | ||||||||||||||||||||||||
435 | { | - | ||||||||||||||||||||||||
436 | return key->pub_key; executed 538 times by 3 tests: return key->pub_key; Executed by:
| 538 | ||||||||||||||||||||||||
437 | } | - | ||||||||||||||||||||||||
438 | - | |||||||||||||||||||||||||
439 | int | - | ||||||||||||||||||||||||
440 | EC_KEY_set_public_key(EC_KEY * key, const EC_POINT * pub_key) | - | ||||||||||||||||||||||||
441 | { | - | ||||||||||||||||||||||||
442 | EC_POINT_free(key->pub_key); | - | ||||||||||||||||||||||||
443 | key->pub_key = EC_POINT_dup(pub_key, key->group); | - | ||||||||||||||||||||||||
444 | return (key->pub_key == NULL) ? 0 : 1; executed 29 times by 2 tests: return (key->pub_key == ((void *)0) ) ? 0 : 1; Executed by:
| 0-29 | ||||||||||||||||||||||||
445 | } | - | ||||||||||||||||||||||||
446 | - | |||||||||||||||||||||||||
447 | unsigned int | - | ||||||||||||||||||||||||
448 | EC_KEY_get_enc_flags(const EC_KEY * key) | - | ||||||||||||||||||||||||
449 | { | - | ||||||||||||||||||||||||
450 | return key->enc_flag; never executed: return key->enc_flag; | 0 | ||||||||||||||||||||||||
451 | } | - | ||||||||||||||||||||||||
452 | - | |||||||||||||||||||||||||
453 | void | - | ||||||||||||||||||||||||
454 | EC_KEY_set_enc_flags(EC_KEY * key, unsigned int flags) | - | ||||||||||||||||||||||||
455 | { | - | ||||||||||||||||||||||||
456 | key->enc_flag = flags; | - | ||||||||||||||||||||||||
457 | } never executed: end of block | 0 | ||||||||||||||||||||||||
458 | - | |||||||||||||||||||||||||
459 | point_conversion_form_t | - | ||||||||||||||||||||||||
460 | EC_KEY_get_conv_form(const EC_KEY * key) | - | ||||||||||||||||||||||||
461 | { | - | ||||||||||||||||||||||||
462 | return key->conv_form; never executed: return key->conv_form; | 0 | ||||||||||||||||||||||||
463 | } | - | ||||||||||||||||||||||||
464 | - | |||||||||||||||||||||||||
465 | void | - | ||||||||||||||||||||||||
466 | EC_KEY_set_conv_form(EC_KEY * key, point_conversion_form_t cform) | - | ||||||||||||||||||||||||
467 | { | - | ||||||||||||||||||||||||
468 | key->conv_form = cform; | - | ||||||||||||||||||||||||
469 | if (key->group != NULL)
| 0 | ||||||||||||||||||||||||
470 | EC_GROUP_set_point_conversion_form(key->group, cform); never executed: EC_GROUP_set_point_conversion_form(key->group, cform); | 0 | ||||||||||||||||||||||||
471 | } never executed: end of block | 0 | ||||||||||||||||||||||||
472 | - | |||||||||||||||||||||||||
473 | void * | - | ||||||||||||||||||||||||
474 | EC_KEY_get_key_method_data(EC_KEY *key, | - | ||||||||||||||||||||||||
475 | void *(*dup_func) (void *), | - | ||||||||||||||||||||||||
476 | void (*free_func) (void *), | - | ||||||||||||||||||||||||
477 | void (*clear_free_func) (void *)) | - | ||||||||||||||||||||||||
478 | { | - | ||||||||||||||||||||||||
479 | void *ret; | - | ||||||||||||||||||||||||
480 | - | |||||||||||||||||||||||||
481 | CRYPTO_r_lock(CRYPTO_LOCK_EC); | - | ||||||||||||||||||||||||
482 | ret = EC_EX_DATA_get_data(key->method_data, dup_func, free_func, clear_free_func); | - | ||||||||||||||||||||||||
483 | CRYPTO_r_unlock(CRYPTO_LOCK_EC); | - | ||||||||||||||||||||||||
484 | - | |||||||||||||||||||||||||
485 | return ret; executed 690 times by 3 tests: return ret; Executed by:
| 690 | ||||||||||||||||||||||||
486 | } | - | ||||||||||||||||||||||||
487 | - | |||||||||||||||||||||||||
488 | void * | - | ||||||||||||||||||||||||
489 | EC_KEY_insert_key_method_data(EC_KEY * key, void *data, | - | ||||||||||||||||||||||||
490 | void *(*dup_func) (void *), | - | ||||||||||||||||||||||||
491 | void (*free_func) (void *), | - | ||||||||||||||||||||||||
492 | void (*clear_free_func) (void *)) | - | ||||||||||||||||||||||||
493 | { | - | ||||||||||||||||||||||||
494 | EC_EXTRA_DATA *ex_data; | - | ||||||||||||||||||||||||
495 | - | |||||||||||||||||||||||||
496 | CRYPTO_w_lock(CRYPTO_LOCK_EC); | - | ||||||||||||||||||||||||
497 | ex_data = EC_EX_DATA_get_data(key->method_data, dup_func, free_func, clear_free_func); | - | ||||||||||||||||||||||||
498 | if (ex_data == NULL)
| 0-234 | ||||||||||||||||||||||||
499 | EC_EX_DATA_set_data(&key->method_data, data, dup_func, free_func, clear_free_func); executed 234 times by 3 tests: EC_EX_DATA_set_data(&key->method_data, data, dup_func, free_func, clear_free_func); Executed by:
| 234 | ||||||||||||||||||||||||
500 | CRYPTO_w_unlock(CRYPTO_LOCK_EC); | - | ||||||||||||||||||||||||
501 | - | |||||||||||||||||||||||||
502 | return ex_data; executed 234 times by 3 tests: return ex_data; Executed by:
| 234 | ||||||||||||||||||||||||
503 | } | - | ||||||||||||||||||||||||
504 | - | |||||||||||||||||||||||||
505 | void | - | ||||||||||||||||||||||||
506 | EC_KEY_set_asn1_flag(EC_KEY * key, int flag) | - | ||||||||||||||||||||||||
507 | { | - | ||||||||||||||||||||||||
508 | if (key->group != NULL)
| 0 | ||||||||||||||||||||||||
509 | EC_GROUP_set_asn1_flag(key->group, flag); never executed: EC_GROUP_set_asn1_flag(key->group, flag); | 0 | ||||||||||||||||||||||||
510 | } never executed: end of block | 0 | ||||||||||||||||||||||||
511 | - | |||||||||||||||||||||||||
512 | int | - | ||||||||||||||||||||||||
513 | EC_KEY_precompute_mult(EC_KEY * key, BN_CTX * ctx) | - | ||||||||||||||||||||||||
514 | { | - | ||||||||||||||||||||||||
515 | if (key->group == NULL)
| 0 | ||||||||||||||||||||||||
516 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
517 | return EC_GROUP_precompute_mult(key->group, ctx); never executed: return EC_GROUP_precompute_mult(key->group, ctx); | 0 | ||||||||||||||||||||||||
518 | } | - | ||||||||||||||||||||||||
519 | - | |||||||||||||||||||||||||
520 | int | - | ||||||||||||||||||||||||
521 | EC_KEY_get_flags(const EC_KEY * key) | - | ||||||||||||||||||||||||
522 | { | - | ||||||||||||||||||||||||
523 | return key->flags; never executed: return key->flags; | 0 | ||||||||||||||||||||||||
524 | } | - | ||||||||||||||||||||||||
525 | - | |||||||||||||||||||||||||
526 | void | - | ||||||||||||||||||||||||
527 | EC_KEY_set_flags(EC_KEY * key, int flags) | - | ||||||||||||||||||||||||
528 | { | - | ||||||||||||||||||||||||
529 | key->flags |= flags; | - | ||||||||||||||||||||||||
530 | } never executed: end of block | 0 | ||||||||||||||||||||||||
531 | - | |||||||||||||||||||||||||
532 | void | - | ||||||||||||||||||||||||
533 | EC_KEY_clear_flags(EC_KEY * key, int flags) | - | ||||||||||||||||||||||||
534 | { | - | ||||||||||||||||||||||||
535 | key->flags &= ~flags; | - | ||||||||||||||||||||||||
536 | } never executed: end of block | 0 | ||||||||||||||||||||||||
Source code | Switch to Preprocessed file |