summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/ec/ec2_oct.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/ec/ec2_oct.c')
-rw-r--r--src/lib/libcrypto/ec/ec2_oct.c59
1 files changed, 20 insertions, 39 deletions
diff --git a/src/lib/libcrypto/ec/ec2_oct.c b/src/lib/libcrypto/ec/ec2_oct.c
index d3fbc12749..6cb7259824 100644
--- a/src/lib/libcrypto/ec/ec2_oct.c
+++ b/src/lib/libcrypto/ec/ec2_oct.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec2_oct.c,v 1.19 2022/11/26 16:08:52 tb Exp $ */ 1/* $OpenBSD: ec2_oct.c,v 1.20 2023/04/11 18:58:20 jsing Exp $ */
2/* ==================================================================== 2/* ====================================================================
3 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. 3 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
4 * 4 *
@@ -94,21 +94,17 @@ int
94ec_GF2m_simple_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point, 94ec_GF2m_simple_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point,
95 const BIGNUM *x_, int y_bit, BN_CTX *ctx) 95 const BIGNUM *x_, int y_bit, BN_CTX *ctx)
96{ 96{
97 BN_CTX *new_ctx = NULL;
98 BIGNUM *tmp, *x, *y, *z; 97 BIGNUM *tmp, *x, *y, *z;
99 int ret = 0, z0; 98 int z0;
99 int ret = 0;
100 100
101 /* clear error queue */ 101 /* clear error queue */
102 ERR_clear_error(); 102 ERR_clear_error();
103 103
104 if (ctx == NULL) {
105 ctx = new_ctx = BN_CTX_new();
106 if (ctx == NULL)
107 return 0;
108 }
109 y_bit = (y_bit != 0) ? 1 : 0; 104 y_bit = (y_bit != 0) ? 1 : 0;
110 105
111 BN_CTX_start(ctx); 106 BN_CTX_start(ctx);
107
112 if ((tmp = BN_CTX_get(ctx)) == NULL) 108 if ((tmp = BN_CTX_get(ctx)) == NULL)
113 goto err; 109 goto err;
114 if ((x = BN_CTX_get(ctx)) == NULL) 110 if ((x = BN_CTX_get(ctx)) == NULL)
@@ -163,7 +159,7 @@ ec_GF2m_simple_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point
163 159
164 err: 160 err:
165 BN_CTX_end(ctx); 161 BN_CTX_end(ctx);
166 BN_CTX_free(new_ctx); 162
167 return ret; 163 return ret;
168} 164}
169 165
@@ -177,18 +173,17 @@ ec_GF2m_simple_point2oct(const EC_GROUP *group, const EC_POINT *point,
177 point_conversion_form_t form, 173 point_conversion_form_t form,
178 unsigned char *buf, size_t len, BN_CTX *ctx) 174 unsigned char *buf, size_t len, BN_CTX *ctx)
179{ 175{
180 size_t ret;
181 BN_CTX *new_ctx = NULL;
182 int used_ctx = 0;
183 BIGNUM *x, *y, *yxi; 176 BIGNUM *x, *y, *yxi;
184 size_t field_len, i, skip; 177 size_t field_len, i, skip;
178 size_t ret;
185 179
186 if ((form != POINT_CONVERSION_COMPRESSED) 180 if (form != POINT_CONVERSION_COMPRESSED &&
187 && (form != POINT_CONVERSION_UNCOMPRESSED) 181 form != POINT_CONVERSION_UNCOMPRESSED &&
188 && (form != POINT_CONVERSION_HYBRID)) { 182 form != POINT_CONVERSION_HYBRID) {
189 ECerror(EC_R_INVALID_FORM); 183 ECerror(EC_R_INVALID_FORM);
190 goto err; 184 return 0;
191 } 185 }
186
192 if (EC_POINT_is_at_infinity(group, point) > 0) { 187 if (EC_POINT_is_at_infinity(group, point) > 0) {
193 /* encodes to a single 0 octet */ 188 /* encodes to a single 0 octet */
194 if (buf != NULL) { 189 if (buf != NULL) {
@@ -200,6 +195,9 @@ ec_GF2m_simple_point2oct(const EC_GROUP *group, const EC_POINT *point,
200 } 195 }
201 return 1; 196 return 1;
202 } 197 }
198
199 BN_CTX_start(ctx);
200
203 /* ret := required output buffer length */ 201 /* ret := required output buffer length */
204 field_len = (EC_GROUP_get_degree(group) + 7) / 8; 202 field_len = (EC_GROUP_get_degree(group) + 7) / 8;
205 ret = (form == POINT_CONVERSION_COMPRESSED) ? 1 + field_len : 203 ret = (form == POINT_CONVERSION_COMPRESSED) ? 1 + field_len :
@@ -211,13 +209,7 @@ ec_GF2m_simple_point2oct(const EC_GROUP *group, const EC_POINT *point,
211 ECerror(EC_R_BUFFER_TOO_SMALL); 209 ECerror(EC_R_BUFFER_TOO_SMALL);
212 goto err; 210 goto err;
213 } 211 }
214 if (ctx == NULL) { 212
215 ctx = new_ctx = BN_CTX_new();
216 if (ctx == NULL)
217 return 0;
218 }
219 BN_CTX_start(ctx);
220 used_ctx = 1;
221 if ((x = BN_CTX_get(ctx)) == NULL) 213 if ((x = BN_CTX_get(ctx)) == NULL)
222 goto err; 214 goto err;
223 if ((y = BN_CTX_get(ctx)) == NULL) 215 if ((y = BN_CTX_get(ctx)) == NULL)
@@ -271,18 +263,12 @@ ec_GF2m_simple_point2oct(const EC_GROUP *group, const EC_POINT *point,
271 goto err; 263 goto err;
272 } 264 }
273 } 265 }
274 if (used_ctx)
275 BN_CTX_end(ctx);
276 BN_CTX_free(new_ctx);
277 return ret;
278 266
279 err: 267 err:
280 if (used_ctx) 268 BN_CTX_end(ctx);
281 BN_CTX_end(ctx);
282 BN_CTX_free(new_ctx);
283 return 0;
284}
285 269
270 return ret;
271}
286 272
287/* 273/*
288 * Converts an octet string representation to an EC_POINT. 274 * Converts an octet string representation to an EC_POINT.
@@ -294,7 +280,6 @@ ec_GF2m_simple_oct2point(const EC_GROUP *group, EC_POINT *point,
294{ 280{
295 point_conversion_form_t form; 281 point_conversion_form_t form;
296 int y_bit; 282 int y_bit;
297 BN_CTX *new_ctx = NULL;
298 BIGNUM *x, *y, *yxi; 283 BIGNUM *x, *y, *yxi;
299 size_t field_len, enc_len; 284 size_t field_len, enc_len;
300 int ret = 0; 285 int ret = 0;
@@ -349,12 +334,8 @@ ec_GF2m_simple_oct2point(const EC_GROUP *group, EC_POINT *point,
349 return 0; 334 return 0;
350 } 335 }
351 336
352 if (ctx == NULL) {
353 ctx = new_ctx = BN_CTX_new();
354 if (ctx == NULL)
355 return 0;
356 }
357 BN_CTX_start(ctx); 337 BN_CTX_start(ctx);
338
358 if ((x = BN_CTX_get(ctx)) == NULL) 339 if ((x = BN_CTX_get(ctx)) == NULL)
359 goto err; 340 goto err;
360 if ((y = BN_CTX_get(ctx)) == NULL) 341 if ((y = BN_CTX_get(ctx)) == NULL)
@@ -415,7 +396,7 @@ ec_GF2m_simple_oct2point(const EC_GROUP *group, EC_POINT *point,
415 396
416 err: 397 err:
417 BN_CTX_end(ctx); 398 BN_CTX_end(ctx);
418 BN_CTX_free(new_ctx); 399
419 return ret; 400 return ret;
420} 401}
421#endif 402#endif