summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1
diff options
context:
space:
mode:
authortb <>2021-12-03 14:18:06 +0000
committertb <>2021-12-03 14:18:06 +0000
commit3a616b37697e883a646f8587fdb0e5f838e0b41a (patch)
tree5cae9107a5a714abf239bd21271a57087f01893d /src/lib/libcrypto/asn1
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
Diffstat (limited to 'src/lib/libcrypto/asn1')
-rw-r--r--src/lib/libcrypto/asn1/ameth_lib.c45
1 files changed, 16 insertions, 29 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