diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libcrypto/ec/ec_key.c | 60 |
1 files changed, 28 insertions, 32 deletions
diff --git a/src/lib/libcrypto/ec/ec_key.c b/src/lib/libcrypto/ec/ec_key.c index 753ababa31..4f3f27dabd 100644 --- a/src/lib/libcrypto/ec/ec_key.c +++ b/src/lib/libcrypto/ec/ec_key.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ec_key.c,v 1.44 2024/11/08 21:56:58 tb Exp $ */ | 1 | /* $OpenBSD: ec_key.c,v 1.45 2024/11/08 22:03:29 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Written by Nils Larsch for the OpenSSL project. | 3 | * Written by Nils Larsch for the OpenSSL project. |
4 | */ | 4 | */ |
@@ -132,58 +132,54 @@ EC_KEY_copy(EC_KEY *dest, const EC_KEY *src) | |||
132 | ECerror(ERR_R_PASSED_NULL_PARAMETER); | 132 | ECerror(ERR_R_PASSED_NULL_PARAMETER); |
133 | return NULL; | 133 | return NULL; |
134 | } | 134 | } |
135 | |||
135 | if (src->meth != dest->meth) { | 136 | if (src->meth != dest->meth) { |
136 | if (dest->meth != NULL && dest->meth->finish != NULL) | 137 | if (dest->meth != NULL && dest->meth->finish != NULL) |
137 | dest->meth->finish(dest); | 138 | dest->meth->finish(dest); |
138 | } | 139 | } |
139 | /* copy the parameters */ | 140 | |
140 | if (src->group) { | 141 | if (src->group != NULL) { |
141 | const EC_METHOD *meth = src->group->meth; | ||
142 | /* clear the old group */ | ||
143 | EC_GROUP_free(dest->group); | 142 | EC_GROUP_free(dest->group); |
144 | dest->group = EC_GROUP_new(meth); | 143 | if ((dest->group = EC_GROUP_dup(src->group)) == NULL) |
145 | if (dest->group == NULL) | ||
146 | return NULL; | ||
147 | if (!EC_GROUP_copy(dest->group, src->group)) | ||
148 | return NULL; | ||
149 | } | ||
150 | /* copy the public key */ | ||
151 | if (src->pub_key && src->group) { | ||
152 | EC_POINT_free(dest->pub_key); | ||
153 | dest->pub_key = EC_POINT_new(src->group); | ||
154 | if (dest->pub_key == NULL) | ||
155 | return NULL; | 144 | return NULL; |
156 | if (!EC_POINT_copy(dest->pub_key, src->pub_key)) | 145 | if (src->pub_key != NULL) { |
157 | return NULL; | 146 | EC_POINT_free(dest->pub_key); |
158 | } | 147 | if ((dest->pub_key = EC_POINT_dup(src->pub_key, |
159 | /* copy the private key */ | 148 | src->group)) == NULL) |
160 | if (src->priv_key) { | ||
161 | if (dest->priv_key == NULL) { | ||
162 | dest->priv_key = BN_new(); | ||
163 | if (dest->priv_key == NULL) | ||
164 | return NULL; | 149 | return NULL; |
165 | } | 150 | } |
166 | if (!bn_copy(dest->priv_key, src->priv_key)) | 151 | } |
152 | |||
153 | /* | ||
154 | * XXX - if there's no priv_key on src, dest retains its probably | ||
155 | * invalid priv_key. This makes no sense. Can we change this? | ||
156 | */ | ||
157 | if (src->priv_key != NULL) { | ||
158 | BN_free(dest->priv_key); | ||
159 | if ((dest->priv_key = BN_dup(src->priv_key)) == NULL) | ||
167 | return NULL; | 160 | return NULL; |
168 | } | 161 | } |
169 | 162 | ||
170 | /* copy the rest */ | ||
171 | dest->enc_flag = src->enc_flag; | 163 | dest->enc_flag = src->enc_flag; |
172 | dest->conv_form = src->conv_form; | 164 | dest->conv_form = src->conv_form; |
173 | dest->version = src->version; | 165 | dest->version = src->version; |
174 | dest->flags = src->flags; | 166 | dest->flags = src->flags; |
175 | 167 | ||
168 | /* | ||
169 | * The fun part about being a toolkit implementer is that the rest of | ||
170 | * the world gets to live with your terrible API design choices for | ||
171 | * eternity. (To be fair: the signature was changed in OpenSSL 3). | ||
172 | */ | ||
176 | if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_EC_KEY, &dest->ex_data, | 173 | if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_EC_KEY, &dest->ex_data, |
177 | &((EC_KEY *)src)->ex_data)) /* XXX const */ | 174 | &((EC_KEY *)src)->ex_data)) /* XXX const */ |
178 | return NULL; | 175 | return NULL; |
179 | 176 | ||
180 | if (src->meth != dest->meth) { | 177 | dest->meth = src->meth; |
181 | dest->meth = src->meth; | ||
182 | } | ||
183 | 178 | ||
184 | if (src->meth != NULL && src->meth->copy != NULL && | 179 | if (src->meth != NULL && src->meth->copy != NULL) { |
185 | src->meth->copy(dest, src) == 0) | 180 | if (!src->meth->copy(dest, src)) |
186 | return 0; | 181 | return NULL; |
182 | } | ||
187 | 183 | ||
188 | return dest; | 184 | return dest; |
189 | } | 185 | } |