Line | Source | Count |
1 | | - |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | - |
7 | | - |
8 | | - |
9 | | - |
10 | | - |
11 | | - |
12 | | - |
13 | | - |
14 | | - |
15 | | - |
16 | | - |
17 | | - |
18 | | - |
19 | | - |
20 | | - |
21 | | - |
22 | | - |
23 | | - |
24 | | - |
25 | | - |
26 | | - |
27 | | - |
28 | | - |
29 | | - |
30 | | - |
31 | | - |
32 | | - |
33 | | - |
34 | | - |
35 | | - |
36 | | - |
37 | | - |
38 | | - |
39 | | - |
40 | | - |
41 | | - |
42 | | - |
43 | | - |
44 | | - |
45 | | - |
46 | | - |
47 | | - |
48 | | - |
49 | | - |
50 | | - |
51 | | - |
52 | | - |
53 | | - |
54 | | - |
55 | | - |
56 | | - |
57 | | - |
58 | | - |
59 | | - |
60 | | - |
61 | | - |
62 | | - |
63 | | - |
64 | | - |
65 | | - |
66 | | - |
67 | | - |
68 | | - |
69 | | - |
70 | #include <openssl/opensslconf.h> | - |
71 | | - |
72 | #include <openssl/err.h> | - |
73 | | - |
74 | #include "ec_lcl.h" | - |
75 | | - |
76 | #ifndef OPENSSL_NO_EC2M | - |
77 | | - |
78 | | - |
79 | | - |
80 | | - |
81 | | - |
82 | | - |
83 | | - |
84 | | - |
85 | | - |
86 | | - |
87 | | - |
88 | | - |
89 | | - |
90 | | - |
91 | | - |
92 | | - |
93 | int | - |
94 | ec_GF2m_simple_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point, | - |
95 | const BIGNUM *x_, int y_bit, BN_CTX *ctx) | - |
96 | { | - |
97 | BN_CTX *new_ctx = NULL; | - |
98 | BIGNUM *tmp, *x, *y, *z; | - |
99 | int ret = 0, z0; | - |
100 | | - |
101 | | - |
102 | ERR_clear_error(); | - |
103 | | - |
104 | if (ctx == NULL) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
105 | ctx = new_ctx = BN_CTX_new(); | - |
106 | if (ctx == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
107 | return 0; never executed: return 0; | 0 |
108 | } never executed: end of block | 0 |
109 | y_bit = (y_bit != 0) ? 1 : 0;TRUE | never evaluated | FALSE | never evaluated |
| 0 |
110 | | - |
111 | BN_CTX_start(ctx); | - |
112 | if ((tmp = BN_CTX_get(ctx)) == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
113 | goto err; never executed: goto err; | 0 |
114 | if ((x = BN_CTX_get(ctx)) == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
115 | goto err; never executed: goto err; | 0 |
116 | if ((y = BN_CTX_get(ctx)) == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
117 | goto err; never executed: goto err; | 0 |
118 | if ((z = BN_CTX_get(ctx)) == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
119 | goto err; never executed: goto err; | 0 |
120 | | - |
121 | if (!BN_GF2m_mod_arr(x, x_, group->poly))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
122 | goto err; never executed: goto err; | 0 |
123 | if (BN_is_zero(x)) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
124 | if (!BN_GF2m_mod_sqrt_arr(y, &group->b, group->poly, ctx))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
125 | goto err; never executed: goto err; | 0 |
126 | } else { never executed: end of block | 0 |
127 | if (!group->meth->field_sqr(group, tmp, x, ctx))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
128 | goto err; never executed: goto err; | 0 |
129 | if (!group->meth->field_div(group, tmp, &group->b, tmp, ctx))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
130 | goto err; never executed: goto err; | 0 |
131 | if (!BN_GF2m_add(tmp, &group->a, tmp))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
132 | goto err; never executed: goto err; | 0 |
133 | if (!BN_GF2m_add(tmp, x, tmp))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
134 | goto err; never executed: goto err; | 0 |
135 | if (!BN_GF2m_mod_solve_quad_arr(z, tmp, group->poly, ctx)) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
136 | unsigned long err = ERR_peek_last_error(); | - |
137 | | - |
138 | if (ERR_GET_LIB(err) == ERR_LIB_BN &&TRUE | never evaluated | FALSE | never evaluated |
| 0 |
139 | ERR_GET_REASON(err) == BN_R_NO_SOLUTION) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
140 | ERR_clear_error(); | - |
141 | ECerror(EC_R_INVALID_COMPRESSED_POINT); | - |
142 | } else never executed: end of block | 0 |
143 | ECerror(ERR_R_BN_LIB); never executed: ERR_put_error(16,(0xfff),(3),__FILE__,143); | 0 |
144 | goto err; never executed: goto err; | 0 |
145 | } | - |
146 | z0 = (BN_is_odd(z)) ? 1 : 0;TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
147 | if (!group->meth->field_mul(group, y, x, z, ctx))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
148 | goto err; never executed: goto err; | 0 |
149 | if (z0 != y_bit) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
150 | if (!BN_GF2m_add(y, y, x))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
151 | goto err; never executed: goto err; | 0 |
152 | } never executed: end of block | 0 |
153 | } never executed: end of block | 0 |
154 | | - |
155 | if (!EC_POINT_set_affine_coordinates_GF2m(group, point, x, y, ctx))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
156 | goto err; never executed: goto err; | 0 |
157 | | - |
158 | ret = 1; | - |
159 | | - |
160 | err: code before this statement never executed: err: | 0 |
161 | BN_CTX_end(ctx); | - |
162 | BN_CTX_free(new_ctx); | - |
163 | return ret; never executed: return ret; | 0 |
164 | } | - |
165 | | - |
166 | | - |
167 | | - |
168 | | - |
169 | | - |
170 | | - |
171 | size_t | - |
172 | ec_GF2m_simple_point2oct(const EC_GROUP *group, const EC_POINT *point, | - |
173 | point_conversion_form_t form, | - |
174 | unsigned char *buf, size_t len, BN_CTX * ctx) | - |
175 | { | - |
176 | size_t ret; | - |
177 | BN_CTX *new_ctx = NULL; | - |
178 | int used_ctx = 0; | - |
179 | BIGNUM *x, *y, *yxi; | - |
180 | size_t field_len, i, skip; | - |
181 | | - |
182 | if ((form != POINT_CONVERSION_COMPRESSED)TRUE | evaluated 1 time by 1 test | FALSE | never evaluated |
| 0-1 |
183 | && (form != POINT_CONVERSION_UNCOMPRESSED)TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
184 | && (form != POINT_CONVERSION_HYBRID)) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
185 | ECerror(EC_R_INVALID_FORM); | - |
186 | goto err; never executed: goto err; | 0 |
187 | } | - |
188 | if (EC_POINT_is_at_infinity(group, point) > 0) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
189 | | - |
190 | if (buf != NULL) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
191 | if (len < 1) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
192 | ECerror(EC_R_BUFFER_TOO_SMALL); | - |
193 | return 0; never executed: return 0; | 0 |
194 | } | - |
195 | buf[0] = 0; | - |
196 | } never executed: end of block | 0 |
197 | return 1; never executed: return 1; | 0 |
198 | } | - |
199 | | - |
200 | field_len = (EC_GROUP_get_degree(group) + 7) / 8; | - |
201 | ret = (form == POINT_CONVERSION_COMPRESSED) ? 1 + field_len :TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
202 | 1 + 2 * field_len; | - |
203 | | - |
204 | | - |
205 | if (buf != NULL) {TRUE | evaluated 1 time by 1 test | FALSE | never evaluated |
| 0-1 |
206 | if (len < ret) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
207 | ECerror(EC_R_BUFFER_TOO_SMALL); | - |
208 | goto err; never executed: goto err; | 0 |
209 | } | - |
210 | if (ctx == NULL) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
211 | ctx = new_ctx = BN_CTX_new(); | - |
212 | if (ctx == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
213 | return 0; never executed: return 0; | 0 |
214 | } never executed: end of block | 0 |
215 | BN_CTX_start(ctx); | - |
216 | used_ctx = 1; | - |
217 | if ((x = BN_CTX_get(ctx)) == NULL)TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
218 | goto err; never executed: goto err; | 0 |
219 | if ((y = BN_CTX_get(ctx)) == NULL)TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
220 | goto err; never executed: goto err; | 0 |
221 | if ((yxi = BN_CTX_get(ctx)) == NULL)TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
222 | goto err; never executed: goto err; | 0 |
223 | | - |
224 | if (!EC_POINT_get_affine_coordinates_GF2m(group, point, x, y, ctx))TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
225 | goto err; never executed: goto err; | 0 |
226 | | - |
227 | buf[0] = form; | - |
228 | if ((form != POINT_CONVERSION_UNCOMPRESSED) && !BN_is_zero(x)) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
TRUE | never evaluated | FALSE | never evaluated |
| 0-1 |
229 | if (!group->meth->field_div(group, yxi, y, x, ctx))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
230 | goto err; never executed: goto err; | 0 |
231 | if (BN_is_odd(yxi))TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
232 | buf[0]++; never executed: buf[0]++; | 0 |
233 | } never executed: end of block | 0 |
234 | i = 1; | - |
235 | | - |
236 | skip = field_len - BN_num_bytes(x); | - |
237 | if (skip > field_len) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
238 | ECerror(ERR_R_INTERNAL_ERROR); | - |
239 | goto err; never executed: goto err; | 0 |
240 | } | - |
241 | while (skip > 0) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
242 | buf[i++] = 0; | - |
243 | skip--; | - |
244 | } never executed: end of block | 0 |
245 | skip = BN_bn2bin(x, buf + i); | - |
246 | i += skip; | - |
247 | if (i != 1 + field_len) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
248 | ECerror(ERR_R_INTERNAL_ERROR); | - |
249 | goto err; never executed: goto err; | 0 |
250 | } | - |
251 | if (form == POINT_CONVERSION_UNCOMPRESSED ||TRUE | evaluated 1 time by 1 test | FALSE | never evaluated |
| 0-1 |
252 | form == POINT_CONVERSION_HYBRID) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
253 | skip = field_len - BN_num_bytes(y); | - |
254 | if (skip > field_len) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
255 | ECerror(ERR_R_INTERNAL_ERROR); | - |
256 | goto err; never executed: goto err; | 0 |
257 | } | - |
258 | while (skip > 0) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
259 | buf[i++] = 0; | - |
260 | skip--; | - |
261 | } never executed: end of block | 0 |
262 | skip = BN_bn2bin(y, buf + i); | - |
263 | i += skip; | - |
264 | }executed 1 time by 1 test: end of block | 1 |
265 | if (i != ret) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
266 | ECerror(ERR_R_INTERNAL_ERROR); | - |
267 | goto err; never executed: goto err; | 0 |
268 | } | - |
269 | }executed 1 time by 1 test: end of block | 1 |
270 | if (used_ctx)TRUE | evaluated 1 time by 1 test | FALSE | never evaluated |
| 0-1 |
271 | BN_CTX_end(ctx);executed 1 time by 1 test: BN_CTX_end(ctx); | 1 |
272 | BN_CTX_free(new_ctx); | - |
273 | return ret;executed 1 time by 1 test: return ret; | 1 |
274 | | - |
275 | err: | - |
276 | if (used_ctx)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
277 | BN_CTX_end(ctx); never executed: BN_CTX_end(ctx); | 0 |
278 | BN_CTX_free(new_ctx); | - |
279 | return 0; never executed: return 0; | 0 |
280 | } | - |
281 | | - |
282 | | - |
283 | | - |
284 | | - |
285 | | - |
286 | int | - |
287 | ec_GF2m_simple_oct2point(const EC_GROUP *group, EC_POINT *point, | - |
288 | const unsigned char *buf, size_t len, BN_CTX *ctx) | - |
289 | { | - |
290 | point_conversion_form_t form; | - |
291 | int y_bit; | - |
292 | BN_CTX *new_ctx = NULL; | - |
293 | BIGNUM *x, *y, *yxi; | - |
294 | size_t field_len, enc_len; | - |
295 | int ret = 0; | - |
296 | | - |
297 | if (len == 0) {TRUE | never evaluated | FALSE | evaluated 2 times by 1 test |
| 0-2 |
298 | ECerror(EC_R_BUFFER_TOO_SMALL); | - |
299 | return 0; never executed: return 0; | 0 |
300 | } | - |
301 | form = buf[0]; | - |
302 | y_bit = form & 1; | - |
303 | form = form & ~1U; | - |
304 | if ((form != 0) && (form != POINT_CONVERSION_COMPRESSED) &&TRUE | evaluated 1 time by 1 test | FALSE | evaluated 1 time by 1 test |
TRUE | evaluated 1 time by 1 test | FALSE | never evaluated |
| 0-1 |
305 | (form != POINT_CONVERSION_UNCOMPRESSED) &&TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
306 | (form != POINT_CONVERSION_HYBRID)) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
307 | ECerror(EC_R_INVALID_ENCODING); | - |
308 | return 0; never executed: return 0; | 0 |
309 | } | - |
310 | if ((form == 0 || form == POINT_CONVERSION_UNCOMPRESSED) && y_bit) {TRUE | evaluated 1 time by 1 test | FALSE | evaluated 1 time by 1 test |
TRUE | evaluated 1 time by 1 test | FALSE | never evaluated |
TRUE | never evaluated | FALSE | evaluated 2 times by 1 test |
| 0-2 |
311 | ECerror(EC_R_INVALID_ENCODING); | - |
312 | return 0; never executed: return 0; | 0 |
313 | } | - |
314 | if (form == 0) {TRUE | evaluated 1 time by 1 test | FALSE | evaluated 1 time by 1 test |
| 1 |
315 | if (len != 1) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
316 | ECerror(EC_R_INVALID_ENCODING); | - |
317 | return 0; never executed: return 0; | 0 |
318 | } | - |
319 | return EC_POINT_set_to_infinity(group, point);executed 1 time by 1 test: return EC_POINT_set_to_infinity(group, point); | 1 |
320 | } | - |
321 | field_len = (EC_GROUP_get_degree(group) + 7) / 8; | - |
322 | enc_len = (form == POINT_CONVERSION_COMPRESSED) ? 1 + field_len :TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
323 | 1 + 2 * field_len; | - |
324 | | - |
325 | if (len != enc_len) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
326 | ECerror(EC_R_INVALID_ENCODING); | - |
327 | return 0; never executed: return 0; | 0 |
328 | } | - |
329 | if (ctx == NULL) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
330 | ctx = new_ctx = BN_CTX_new(); | - |
331 | if (ctx == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
332 | return 0; never executed: return 0; | 0 |
333 | } never executed: end of block | 0 |
334 | BN_CTX_start(ctx); | - |
335 | if ((x = BN_CTX_get(ctx)) == NULL)TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
336 | goto err; never executed: goto err; | 0 |
337 | if ((y = BN_CTX_get(ctx)) == NULL)TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
338 | goto err; never executed: goto err; | 0 |
339 | if ((yxi = BN_CTX_get(ctx)) == NULL)TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
340 | goto err; never executed: goto err; | 0 |
341 | | - |
342 | if (!BN_bin2bn(buf + 1, field_len, x))TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
343 | goto err; never executed: goto err; | 0 |
344 | if (BN_ucmp(x, &group->field) >= 0) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
345 | ECerror(EC_R_INVALID_ENCODING); | - |
346 | goto err; never executed: goto err; | 0 |
347 | } | - |
348 | if (form == POINT_CONVERSION_COMPRESSED) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
349 | if (!EC_POINT_set_compressed_coordinates_GF2m(group, point, x, y_bit, ctx))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
350 | goto err; never executed: goto err; | 0 |
351 | } else { never executed: end of block | 0 |
352 | if (!BN_bin2bn(buf + 1 + field_len, field_len, y))TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
353 | goto err; never executed: goto err; | 0 |
354 | if (BN_ucmp(y, &group->field) >= 0) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
355 | ECerror(EC_R_INVALID_ENCODING); | - |
356 | goto err; never executed: goto err; | 0 |
357 | } | - |
358 | if (form == POINT_CONVERSION_HYBRID) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
359 | if (!group->meth->field_div(group, yxi, y, x, ctx))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
360 | goto err; never executed: goto err; | 0 |
361 | if (y_bit != BN_is_odd(yxi)) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
362 | ECerror(EC_R_INVALID_ENCODING); | - |
363 | goto err; never executed: goto err; | 0 |
364 | } | - |
365 | } never executed: end of block | 0 |
366 | if (!EC_POINT_set_affine_coordinates_GF2m(group, point, x, y, ctx))TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
367 | goto err; never executed: goto err; | 0 |
368 | }executed 1 time by 1 test: end of block | 1 |
369 | | - |
370 | | - |
371 | if (EC_POINT_is_on_curve(group, point, ctx) <= 0) {TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1 |
372 | ECerror(EC_R_POINT_IS_NOT_ON_CURVE); | - |
373 | goto err; never executed: goto err; | 0 |
374 | } | - |
375 | ret = 1; | - |
376 | | - |
377 | err:code before this statement executed 1 time by 1 test: err: | 1 |
378 | BN_CTX_end(ctx); | - |
379 | BN_CTX_free(new_ctx); | - |
380 | return ret;executed 1 time by 1 test: return ret; | 1 |
381 | } | - |
382 | #endif | - |
| | |