summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/ec/ec_key.c60
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}