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/ec_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/ec_oct.c | 70 |
1 files changed, 56 insertions, 14 deletions
diff --git a/src/lib/libcrypto/ec/ec_oct.c b/src/lib/libcrypto/ec/ec_oct.c index ef17ec59a5..b1c9e6a634 100644 --- a/src/lib/libcrypto/ec/ec_oct.c +++ b/src/lib/libcrypto/ec/ec_oct.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ec_oct.c,v 1.10 2023/03/08 04:50:27 jsing Exp $ */ | 1 | /* $OpenBSD: ec_oct.c,v 1.11 2023/04/11 18:58:20 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Originally written by Bodo Moeller for the OpenSSL project. | 3 | * Originally written by Bodo Moeller for the OpenSSL project. |
| 4 | */ | 4 | */ |
| @@ -72,18 +72,32 @@ | |||
| 72 | 72 | ||
| 73 | int | 73 | int |
| 74 | EC_POINT_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point, | 74 | EC_POINT_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point, |
| 75 | const BIGNUM *x, int y_bit, BN_CTX *ctx) | 75 | const BIGNUM *x, int y_bit, BN_CTX *ctx_in) |
| 76 | { | 76 | { |
| 77 | BN_CTX *ctx; | ||
| 78 | int ret = 0; | ||
| 79 | |||
| 80 | if ((ctx = ctx_in) == NULL) | ||
| 81 | ctx = BN_CTX_new(); | ||
| 82 | if (ctx == NULL) | ||
| 83 | goto err; | ||
| 84 | |||
| 77 | if (group->meth->point_set_compressed_coordinates == NULL) { | 85 | if (group->meth->point_set_compressed_coordinates == NULL) { |
| 78 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 86 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
| 79 | return 0; | 87 | goto err; |
| 80 | } | 88 | } |
| 81 | if (group->meth != point->meth) { | 89 | if (group->meth != point->meth) { |
| 82 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 90 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
| 83 | return 0; | 91 | goto err; |
| 84 | } | 92 | } |
| 85 | return group->meth->point_set_compressed_coordinates(group, point, | 93 | ret = group->meth->point_set_compressed_coordinates(group, point, |
| 86 | x, y_bit, ctx); | 94 | x, y_bit, ctx); |
| 95 | |||
| 96 | err: | ||
| 97 | if (ctx != ctx_in) | ||
| 98 | BN_CTX_free(ctx); | ||
| 99 | |||
| 100 | return ret; | ||
| 87 | } | 101 | } |
| 88 | 102 | ||
| 89 | int | 103 | int |
| @@ -104,31 +118,59 @@ EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, EC_POINT *point, | |||
| 104 | 118 | ||
| 105 | size_t | 119 | size_t |
| 106 | EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, | 120 | EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, |
| 107 | point_conversion_form_t form, | 121 | point_conversion_form_t form, unsigned char *buf, size_t len, |
| 108 | unsigned char *buf, size_t len, BN_CTX *ctx) | 122 | BN_CTX *ctx_in) |
| 109 | { | 123 | { |
| 124 | BN_CTX *ctx; | ||
| 125 | int ret = 0; | ||
| 126 | |||
| 127 | if ((ctx = ctx_in) == NULL) | ||
| 128 | ctx = BN_CTX_new(); | ||
| 129 | if (ctx == NULL) | ||
| 130 | goto err; | ||
| 131 | |||
| 110 | if (group->meth->point2oct == NULL) { | 132 | if (group->meth->point2oct == NULL) { |
| 111 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 133 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
| 112 | return 0; | 134 | goto err; |
| 113 | } | 135 | } |
| 114 | if (group->meth != point->meth) { | 136 | if (group->meth != point->meth) { |
| 115 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 137 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
| 116 | return 0; | 138 | goto err; |
| 117 | } | 139 | } |
| 118 | return group->meth->point2oct(group, point, form, buf, len, ctx); | 140 | ret = group->meth->point2oct(group, point, form, buf, len, ctx); |
| 141 | |||
| 142 | err: | ||
| 143 | if (ctx != ctx_in) | ||
| 144 | BN_CTX_free(ctx); | ||
| 145 | |||
| 146 | return ret; | ||
| 119 | } | 147 | } |
| 120 | 148 | ||
| 121 | int | 149 | int |
| 122 | EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *point, | 150 | EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *point, |
| 123 | const unsigned char *buf, size_t len, BN_CTX *ctx) | 151 | const unsigned char *buf, size_t len, BN_CTX *ctx_in) |
| 124 | { | 152 | { |
| 153 | BN_CTX *ctx; | ||
| 154 | int ret = 0; | ||
| 155 | |||
| 156 | if ((ctx = ctx_in) == NULL) | ||
| 157 | ctx = BN_CTX_new(); | ||
| 158 | if (ctx == NULL) | ||
| 159 | goto err; | ||
| 160 | |||
| 125 | if (group->meth->oct2point == NULL) { | 161 | if (group->meth->oct2point == NULL) { |
| 126 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 162 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); |
| 127 | return 0; | 163 | goto err; |
| 128 | } | 164 | } |
| 129 | if (group->meth != point->meth) { | 165 | if (group->meth != point->meth) { |
| 130 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); | 166 | ECerror(EC_R_INCOMPATIBLE_OBJECTS); |
| 131 | return 0; | 167 | goto err; |
| 132 | } | 168 | } |
| 133 | return group->meth->oct2point(group, point, buf, len, ctx); | 169 | ret = group->meth->oct2point(group, point, buf, len, ctx); |
| 170 | |||
| 171 | err: | ||
| 172 | if (ctx != ctx_in) | ||
| 173 | BN_CTX_free(ctx); | ||
| 174 | |||
| 175 | return ret; | ||
| 134 | } | 176 | } |
