diff options
-rw-r--r-- | src/lib/libcrypto/ec/ec_curve.c | 71 |
1 files changed, 55 insertions, 16 deletions
diff --git a/src/lib/libcrypto/ec/ec_curve.c b/src/lib/libcrypto/ec/ec_curve.c index 61d6c01048..2179924666 100644 --- a/src/lib/libcrypto/ec/ec_curve.c +++ b/src/lib/libcrypto/ec/ec_curve.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ec_curve.c,v 1.31 2023/05/01 08:16:17 tb Exp $ */ | 1 | /* $OpenBSD: ec_curve.c,v 1.32 2023/05/01 12:39:38 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Written by Nils Larsch for the OpenSSL project. | 3 | * Written by Nils Larsch for the OpenSSL project. |
4 | */ | 4 | */ |
@@ -2113,7 +2113,7 @@ ec_group_new_from_data(const ec_list_element curve) | |||
2113 | EC_GROUP *group = NULL; | 2113 | EC_GROUP *group = NULL; |
2114 | EC_POINT *P = NULL; | 2114 | EC_POINT *P = NULL; |
2115 | BN_CTX *ctx = NULL; | 2115 | BN_CTX *ctx = NULL; |
2116 | BIGNUM *p = NULL, *a = NULL, *b = NULL, *x = NULL, *y = NULL, *order = NULL; | 2116 | BIGNUM *p, *a, *b, *x, *y, *order, *cofactor; |
2117 | int ok = 0; | 2117 | int ok = 0; |
2118 | int seed_len, param_len; | 2118 | int seed_len, param_len; |
2119 | const EC_CURVE_DATA *data; | 2119 | const EC_CURVE_DATA *data; |
@@ -2123,15 +2123,52 @@ ec_group_new_from_data(const ec_list_element curve) | |||
2123 | ECerror(ERR_R_MALLOC_FAILURE); | 2123 | ECerror(ERR_R_MALLOC_FAILURE); |
2124 | goto err; | 2124 | goto err; |
2125 | } | 2125 | } |
2126 | BN_CTX_start(ctx); | ||
2127 | |||
2128 | if ((p = BN_CTX_get(ctx)) == NULL) { | ||
2129 | ECerror(ERR_R_BN_LIB); | ||
2130 | goto err; | ||
2131 | } | ||
2132 | if ((a = BN_CTX_get(ctx)) == NULL) { | ||
2133 | ECerror(ERR_R_BN_LIB); | ||
2134 | goto err; | ||
2135 | } | ||
2136 | if ((b = BN_CTX_get(ctx)) == NULL) { | ||
2137 | ECerror(ERR_R_BN_LIB); | ||
2138 | goto err; | ||
2139 | } | ||
2140 | if ((x = BN_CTX_get(ctx)) == NULL) { | ||
2141 | ECerror(ERR_R_BN_LIB); | ||
2142 | goto err; | ||
2143 | } | ||
2144 | if ((y = BN_CTX_get(ctx)) == NULL) { | ||
2145 | ECerror(ERR_R_BN_LIB); | ||
2146 | goto err; | ||
2147 | } | ||
2148 | if ((order = BN_CTX_get(ctx)) == NULL) { | ||
2149 | ECerror(ERR_R_BN_LIB); | ||
2150 | goto err; | ||
2151 | } | ||
2152 | if ((cofactor = BN_CTX_get(ctx)) == NULL) { | ||
2153 | ECerror(ERR_R_BN_LIB); | ||
2154 | goto err; | ||
2155 | } | ||
2156 | |||
2126 | data = curve.data; | 2157 | data = curve.data; |
2127 | seed_len = data->seed_len; | 2158 | seed_len = data->seed_len; |
2128 | param_len = data->param_len; | 2159 | param_len = data->param_len; |
2129 | params = (const unsigned char *) (data + 1); /* skip header */ | 2160 | params = (const unsigned char *) (data + 1); /* skip header */ |
2130 | params += seed_len; /* skip seed */ | 2161 | params += seed_len; /* skip seed */ |
2131 | 2162 | ||
2132 | if (!(p = BN_bin2bn(params + 0 * param_len, param_len, NULL)) || | 2163 | if (BN_bin2bn(params + 0 * param_len, param_len, p) == NULL) { |
2133 | !(a = BN_bin2bn(params + 1 * param_len, param_len, NULL)) || | 2164 | ECerror(ERR_R_BN_LIB); |
2134 | !(b = BN_bin2bn(params + 2 * param_len, param_len, NULL))) { | 2165 | goto err; |
2166 | } | ||
2167 | if (BN_bin2bn(params + 1 * param_len, param_len, a) == NULL) { | ||
2168 | ECerror(ERR_R_BN_LIB); | ||
2169 | goto err; | ||
2170 | } | ||
2171 | if (BN_bin2bn(params + 2 * param_len, param_len, b) == NULL) { | ||
2135 | ECerror(ERR_R_BN_LIB); | 2172 | ECerror(ERR_R_BN_LIB); |
2136 | goto err; | 2173 | goto err; |
2137 | } | 2174 | } |
@@ -2146,8 +2183,11 @@ ec_group_new_from_data(const ec_list_element curve) | |||
2146 | ECerror(ERR_R_EC_LIB); | 2183 | ECerror(ERR_R_EC_LIB); |
2147 | goto err; | 2184 | goto err; |
2148 | } | 2185 | } |
2149 | if (!(x = BN_bin2bn(params + 3 * param_len, param_len, NULL)) | 2186 | if (BN_bin2bn(params + 3 * param_len, param_len, x) == NULL) { |
2150 | || !(y = BN_bin2bn(params + 4 * param_len, param_len, NULL))) { | 2187 | ECerror(ERR_R_BN_LIB); |
2188 | goto err; | ||
2189 | } | ||
2190 | if (BN_bin2bn(params + 4 * param_len, param_len, y) == NULL) { | ||
2151 | ECerror(ERR_R_BN_LIB); | 2191 | ECerror(ERR_R_BN_LIB); |
2152 | goto err; | 2192 | goto err; |
2153 | } | 2193 | } |
@@ -2155,12 +2195,15 @@ ec_group_new_from_data(const ec_list_element curve) | |||
2155 | ECerror(ERR_R_EC_LIB); | 2195 | ECerror(ERR_R_EC_LIB); |
2156 | goto err; | 2196 | goto err; |
2157 | } | 2197 | } |
2158 | if (!(order = BN_bin2bn(params + 5 * param_len, param_len, NULL)) | 2198 | if (BN_bin2bn(params + 5 * param_len, param_len, order) == NULL) { |
2159 | || !BN_set_word(x, (BN_ULONG) data->cofactor)) { | ||
2160 | ECerror(ERR_R_BN_LIB); | 2199 | ECerror(ERR_R_BN_LIB); |
2161 | goto err; | 2200 | goto err; |
2162 | } | 2201 | } |
2163 | if (!EC_GROUP_set_generator(group, P, order, x)) { | 2202 | if (!BN_set_word(cofactor, data->cofactor)) { |
2203 | ECerror(ERR_R_BN_LIB); | ||
2204 | goto err; | ||
2205 | } | ||
2206 | if (!EC_GROUP_set_generator(group, P, order, cofactor)) { | ||
2164 | ECerror(ERR_R_EC_LIB); | 2207 | ECerror(ERR_R_EC_LIB); |
2165 | goto err; | 2208 | goto err; |
2166 | } | 2209 | } |
@@ -2177,13 +2220,9 @@ ec_group_new_from_data(const ec_list_element curve) | |||
2177 | group = NULL; | 2220 | group = NULL; |
2178 | } | 2221 | } |
2179 | EC_POINT_free(P); | 2222 | EC_POINT_free(P); |
2223 | BN_CTX_end(ctx); | ||
2180 | BN_CTX_free(ctx); | 2224 | BN_CTX_free(ctx); |
2181 | BN_free(p); | 2225 | |
2182 | BN_free(a); | ||
2183 | BN_free(b); | ||
2184 | BN_free(order); | ||
2185 | BN_free(x); | ||
2186 | BN_free(y); | ||
2187 | return group; | 2226 | return group; |
2188 | } | 2227 | } |
2189 | 2228 | ||