summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortb <>2021-12-03 14:18:06 +0000
committertb <>2021-12-03 14:18:06 +0000
commit3a616b37697e883a646f8587fdb0e5f838e0b41a (patch)
tree5cae9107a5a714abf239bd21271a57087f01893d
parentbd634dd15594b3e9c78eb50c254cc44a25b8cba5 (diff)
downloadopenbsd-3a616b37697e883a646f8587fdb0e5f838e0b41a.tar.gz
openbsd-3a616b37697e883a646f8587fdb0e5f838e0b41a.tar.bz2
openbsd-3a616b37697e883a646f8587fdb0e5f838e0b41a.zip
Fix EVP_PKEY_{asn1,meth}_copy once and for all
It is very easy to forget to copy over newly added methods. Everyone working in this corner has run into this. Instead, preserve what needs preserving and use a struct copy, so all methods get copied from src to dest. tweak/ok jsing
-rw-r--r--src/lib/libcrypto/asn1/ameth_lib.c45
-rw-r--r--src/lib/libcrypto/evp/pmeth_lib.c41
2 files changed, 23 insertions, 63 deletions
diff --git a/src/lib/libcrypto/asn1/ameth_lib.c b/src/lib/libcrypto/asn1/ameth_lib.c
index 8be82060ef..545ba8f1a1 100644
--- a/src/lib/libcrypto/asn1/ameth_lib.c
+++ b/src/lib/libcrypto/asn1/ameth_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ameth_lib.c,v 1.21 2019/11/02 16:06:25 inoguchi Exp $ */ 1/* $OpenBSD: ameth_lib.c,v 1.22 2021/12/03 14:18:06 tb Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 2006. 3 * project 2006.
4 */ 4 */
@@ -340,34 +340,21 @@ EVP_PKEY_asn1_new(int id, int flags, const char *pem_str, const char *info)
340void 340void
341EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD *dst, const EVP_PKEY_ASN1_METHOD *src) 341EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD *dst, const EVP_PKEY_ASN1_METHOD *src)
342{ 342{
343 dst->pub_decode = src->pub_decode; 343 EVP_PKEY_ASN1_METHOD preserve;
344 dst->pub_encode = src->pub_encode; 344
345 dst->pub_cmp = src->pub_cmp; 345 preserve.pkey_id = dst->pkey_id;
346 dst->pub_print = src->pub_print; 346 preserve.pkey_base_id = dst->pkey_base_id;
347 347 preserve.pkey_flags = dst->pkey_flags;
348 dst->priv_decode = src->priv_decode; 348 preserve.pem_str = dst->pem_str;
349 dst->priv_encode = src->priv_encode; 349 preserve.info = dst->info;
350 dst->priv_print = src->priv_print; 350
351 351 *dst = *src;
352 dst->old_priv_encode = src->old_priv_encode; 352
353 dst->old_priv_decode = src->old_priv_decode; 353 dst->pkey_id = preserve.pkey_id;
354 354 dst->pkey_base_id = preserve.pkey_base_id;
355 dst->pkey_size = src->pkey_size; 355 dst->pkey_flags = preserve.pkey_flags;
356 dst->pkey_bits = src->pkey_bits; 356 dst->pem_str = preserve.pem_str;
357 357 dst->info = preserve.info;
358 dst->param_decode = src->param_decode;
359 dst->param_encode = src->param_encode;
360 dst->param_missing = src->param_missing;
361 dst->param_copy = src->param_copy;
362 dst->param_cmp = src->param_cmp;
363 dst->param_print = src->param_print;
364 dst->sig_print = src->sig_print;
365
366 dst->pkey_free = src->pkey_free;
367 dst->pkey_ctrl = src->pkey_ctrl;
368
369 dst->item_sign = src->item_sign;
370 dst->item_verify = src->item_verify;
371} 358}
372 359
373void 360void
diff --git a/src/lib/libcrypto/evp/pmeth_lib.c b/src/lib/libcrypto/evp/pmeth_lib.c
index 36bfe8d9fc..359e57d74c 100644
--- a/src/lib/libcrypto/evp/pmeth_lib.c
+++ b/src/lib/libcrypto/evp/pmeth_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: pmeth_lib.c,v 1.16 2019/11/01 15:08:57 jsing Exp $ */ 1/* $OpenBSD: pmeth_lib.c,v 1.17 2021/12/03 14:18:06 tb Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 2006. 3 * project 2006.
4 */ 4 */
@@ -272,42 +272,15 @@ EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags, const EVP_PKEY_METHOD *meth)
272void 272void
273EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src) 273EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src)
274{ 274{
275 dst->init = src->init; 275 EVP_PKEY_METHOD preserve;
276 dst->copy = src->copy;
277 dst->cleanup = src->cleanup;
278 276
279 dst->paramgen_init = src->paramgen_init; 277 preserve.pkey_id = dst->pkey_id;
280 dst->paramgen = src->paramgen; 278 preserve.flags = dst->flags;
281 279
282 dst->keygen_init = src->keygen_init; 280 *dst = *src;
283 dst->keygen = src->keygen;
284 281
285 dst->sign_init = src->sign_init; 282 dst->pkey_id = preserve.pkey_id;
286 dst->sign = src->sign; 283 dst->flags = preserve.flags;
287
288 dst->verify_init = src->verify_init;
289 dst->verify = src->verify;
290
291 dst->verify_recover_init = src->verify_recover_init;
292 dst->verify_recover = src->verify_recover;
293
294 dst->signctx_init = src->signctx_init;
295 dst->signctx = src->signctx;
296
297 dst->verifyctx_init = src->verifyctx_init;
298 dst->verifyctx = src->verifyctx;
299
300 dst->encrypt_init = src->encrypt_init;
301 dst->encrypt = src->encrypt;
302
303 dst->decrypt_init = src->decrypt_init;
304 dst->decrypt = src->decrypt;
305
306 dst->derive_init = src->derive_init;
307 dst->derive = src->derive;
308
309 dst->ctrl = src->ctrl;
310 dst->ctrl_str = src->ctrl_str;
311} 284}
312 285
313void 286void