diff options
| author | jsing <> | 2023-04-11 18:58:20 +0000 |
|---|---|---|
| committer | jsing <> | 2023-04-11 18:58:20 +0000 |
| commit | 28c1968b342ae3ee2e863c4a47a59d90c3d7da9c (patch) | |
| tree | 566c48c290ac86140f8df6c959b74661e1d596a7 /src/lib/libcrypto/ec/ecp_oct.c | |
| parent | d64e2f3567e88a542a225f4ab620c2851bd7f9e7 (diff) | |
| download | openbsd-28c1968b342ae3ee2e863c4a47a59d90c3d7da9c.tar.gz openbsd-28c1968b342ae3ee2e863c4a47a59d90c3d7da9c.tar.bz2 openbsd-28c1968b342ae3ee2e863c4a47a59d90c3d7da9c.zip | |
Handle BN_CTX at the EC API boundary.
The EC API allows callers to optionally pass in a BN_CTX, which means that
any code needing a BN_CTX has to check if one was provided, allocate one if
not, then free it again. Rather than doing this dance throughout the EC
code, handle the BN_CTX existance at the EC API boundary. This means that
lower level implementation code can simply assume that the BN_CTX is
available.
ok tb@
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/ec/ecp_oct.c | 62 |
1 files changed, 21 insertions, 41 deletions
diff --git a/src/lib/libcrypto/ec/ecp_oct.c b/src/lib/libcrypto/ec/ecp_oct.c index f2f1929e84..8cdf544bf1 100644 --- a/src/lib/libcrypto/ec/ecp_oct.c +++ b/src/lib/libcrypto/ec/ecp_oct.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ecp_oct.c,v 1.19 2022/11/26 16:08:52 tb Exp $ */ | 1 | /* $OpenBSD: ecp_oct.c,v 1.20 2023/04/11 18:58:20 jsing Exp $ */ |
| 2 | /* Includes code written by Lenka Fibikova <fibikova@exp-math.uni-essen.de> | 2 | /* Includes code written by Lenka Fibikova <fibikova@exp-math.uni-essen.de> |
| 3 | * for the OpenSSL project. | 3 | * for the OpenSSL project. |
| 4 | * Includes code written by Bodo Moeller for the OpenSSL project. | 4 | * Includes code written by Bodo Moeller for the OpenSSL project. |
| @@ -70,21 +70,16 @@ int | |||
| 70 | ec_GFp_simple_set_compressed_coordinates(const EC_GROUP *group, | 70 | ec_GFp_simple_set_compressed_coordinates(const EC_GROUP *group, |
| 71 | EC_POINT *point, const BIGNUM *x_, int y_bit, BN_CTX *ctx) | 71 | EC_POINT *point, const BIGNUM *x_, int y_bit, BN_CTX *ctx) |
| 72 | { | 72 | { |
| 73 | BN_CTX *new_ctx = NULL; | ||
| 74 | BIGNUM *tmp1, *tmp2, *x, *y; | 73 | BIGNUM *tmp1, *tmp2, *x, *y; |
| 75 | int ret = 0; | 74 | int ret = 0; |
| 76 | 75 | ||
| 77 | /* clear error queue */ | 76 | /* clear error queue */ |
| 78 | ERR_clear_error(); | 77 | ERR_clear_error(); |
| 79 | 78 | ||
| 80 | if (ctx == NULL) { | ||
| 81 | ctx = new_ctx = BN_CTX_new(); | ||
| 82 | if (ctx == NULL) | ||
| 83 | return 0; | ||
| 84 | } | ||
| 85 | y_bit = (y_bit != 0); | 79 | y_bit = (y_bit != 0); |
| 86 | 80 | ||
| 87 | BN_CTX_start(ctx); | 81 | BN_CTX_start(ctx); |
| 82 | |||
| 88 | if ((tmp1 = BN_CTX_get(ctx)) == NULL) | 83 | if ((tmp1 = BN_CTX_get(ctx)) == NULL) |
| 89 | goto err; | 84 | goto err; |
| 90 | if ((tmp2 = BN_CTX_get(ctx)) == NULL) | 85 | if ((tmp2 = BN_CTX_get(ctx)) == NULL) |
| @@ -179,27 +174,25 @@ ec_GFp_simple_set_compressed_coordinates(const EC_GROUP *group, | |||
| 179 | 174 | ||
| 180 | err: | 175 | err: |
| 181 | BN_CTX_end(ctx); | 176 | BN_CTX_end(ctx); |
| 182 | BN_CTX_free(new_ctx); | 177 | |
| 183 | return ret; | 178 | return ret; |
| 184 | } | 179 | } |
| 185 | 180 | ||
| 186 | |||
| 187 | size_t | 181 | size_t |
| 188 | ec_GFp_simple_point2oct(const EC_GROUP *group, const EC_POINT *point, point_conversion_form_t form, | 182 | ec_GFp_simple_point2oct(const EC_GROUP *group, const EC_POINT *point, |
| 189 | unsigned char *buf, size_t len, BN_CTX *ctx) | 183 | point_conversion_form_t form, unsigned char *buf, size_t len, BN_CTX *ctx) |
| 190 | { | 184 | { |
| 191 | size_t ret; | ||
| 192 | BN_CTX *new_ctx = NULL; | ||
| 193 | int used_ctx = 0; | ||
| 194 | BIGNUM *x, *y; | 185 | BIGNUM *x, *y; |
| 195 | size_t field_len, i, skip; | 186 | size_t field_len, i, skip; |
| 187 | size_t ret = 0; | ||
| 196 | 188 | ||
| 197 | if ((form != POINT_CONVERSION_COMPRESSED) | 189 | if (form != POINT_CONVERSION_COMPRESSED && |
| 198 | && (form != POINT_CONVERSION_UNCOMPRESSED) | 190 | form != POINT_CONVERSION_UNCOMPRESSED && |
| 199 | && (form != POINT_CONVERSION_HYBRID)) { | 191 | form != POINT_CONVERSION_HYBRID) { |
| 200 | ECerror(EC_R_INVALID_FORM); | 192 | ECerror(EC_R_INVALID_FORM); |
| 201 | goto err; | 193 | return 0; |
| 202 | } | 194 | } |
| 195 | |||
| 203 | if (EC_POINT_is_at_infinity(group, point) > 0) { | 196 | if (EC_POINT_is_at_infinity(group, point) > 0) { |
| 204 | /* encodes to a single 0 octet */ | 197 | /* encodes to a single 0 octet */ |
| 205 | if (buf != NULL) { | 198 | if (buf != NULL) { |
| @@ -211,23 +204,20 @@ ec_GFp_simple_point2oct(const EC_GROUP *group, const EC_POINT *point, point_conv | |||
| 211 | } | 204 | } |
| 212 | return 1; | 205 | return 1; |
| 213 | } | 206 | } |
| 207 | |||
| 214 | /* ret := required output buffer length */ | 208 | /* ret := required output buffer length */ |
| 215 | field_len = BN_num_bytes(&group->field); | 209 | field_len = BN_num_bytes(&group->field); |
| 216 | ret = (form == POINT_CONVERSION_COMPRESSED) ? 1 + field_len : 1 + 2 * field_len; | 210 | ret = (form == POINT_CONVERSION_COMPRESSED) ? 1 + field_len : 1 + 2 * field_len; |
| 217 | 211 | ||
| 212 | BN_CTX_start(ctx); | ||
| 213 | |||
| 218 | /* if 'buf' is NULL, just return required length */ | 214 | /* if 'buf' is NULL, just return required length */ |
| 219 | if (buf != NULL) { | 215 | if (buf != NULL) { |
| 220 | if (len < ret) { | 216 | if (len < ret) { |
| 221 | ECerror(EC_R_BUFFER_TOO_SMALL); | 217 | ECerror(EC_R_BUFFER_TOO_SMALL); |
| 222 | goto err; | 218 | goto err; |
| 223 | } | 219 | } |
| 224 | if (ctx == NULL) { | 220 | |
| 225 | ctx = new_ctx = BN_CTX_new(); | ||
| 226 | if (ctx == NULL) | ||
| 227 | return 0; | ||
| 228 | } | ||
| 229 | BN_CTX_start(ctx); | ||
| 230 | used_ctx = 1; | ||
| 231 | if ((x = BN_CTX_get(ctx)) == NULL) | 221 | if ((x = BN_CTX_get(ctx)) == NULL) |
| 232 | goto err; | 222 | goto err; |
| 233 | if ((y = BN_CTX_get(ctx)) == NULL) | 223 | if ((y = BN_CTX_get(ctx)) == NULL) |
| @@ -276,18 +266,12 @@ ec_GFp_simple_point2oct(const EC_GROUP *group, const EC_POINT *point, point_conv | |||
| 276 | goto err; | 266 | goto err; |
| 277 | } | 267 | } |
| 278 | } | 268 | } |
| 279 | if (used_ctx) | ||
| 280 | BN_CTX_end(ctx); | ||
| 281 | BN_CTX_free(new_ctx); | ||
| 282 | return ret; | ||
| 283 | 269 | ||
| 284 | err: | 270 | err: |
| 285 | if (used_ctx) | 271 | BN_CTX_end(ctx); |
| 286 | BN_CTX_end(ctx); | ||
| 287 | BN_CTX_free(new_ctx); | ||
| 288 | return 0; | ||
| 289 | } | ||
| 290 | 272 | ||
| 273 | return ret; | ||
| 274 | } | ||
| 291 | 275 | ||
| 292 | int | 276 | int |
| 293 | ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point, | 277 | ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point, |
| @@ -295,7 +279,6 @@ ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point, | |||
| 295 | { | 279 | { |
| 296 | point_conversion_form_t form; | 280 | point_conversion_form_t form; |
| 297 | int y_bit; | 281 | int y_bit; |
| 298 | BN_CTX *new_ctx = NULL; | ||
| 299 | BIGNUM *x, *y; | 282 | BIGNUM *x, *y; |
| 300 | size_t field_len, enc_len; | 283 | size_t field_len, enc_len; |
| 301 | int ret = 0; | 284 | int ret = 0; |
| @@ -331,12 +314,9 @@ ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point, | |||
| 331 | ECerror(EC_R_INVALID_ENCODING); | 314 | ECerror(EC_R_INVALID_ENCODING); |
| 332 | return 0; | 315 | return 0; |
| 333 | } | 316 | } |
| 334 | if (ctx == NULL) { | 317 | |
| 335 | ctx = new_ctx = BN_CTX_new(); | ||
| 336 | if (ctx == NULL) | ||
| 337 | return 0; | ||
| 338 | } | ||
| 339 | BN_CTX_start(ctx); | 318 | BN_CTX_start(ctx); |
| 319 | |||
| 340 | if ((x = BN_CTX_get(ctx)) == NULL) | 320 | if ((x = BN_CTX_get(ctx)) == NULL) |
| 341 | goto err; | 321 | goto err; |
| 342 | if ((y = BN_CTX_get(ctx)) == NULL) | 322 | if ((y = BN_CTX_get(ctx)) == NULL) |
| @@ -380,6 +360,6 @@ ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point, | |||
| 380 | 360 | ||
| 381 | err: | 361 | err: |
| 382 | BN_CTX_end(ctx); | 362 | BN_CTX_end(ctx); |
| 383 | BN_CTX_free(new_ctx); | 363 | |
| 384 | return ret; | 364 | return ret; |
| 385 | } | 365 | } |
