diff options
author | tb <> | 2021-12-03 14:18:06 +0000 |
---|---|---|
committer | tb <> | 2021-12-03 14:18:06 +0000 |
commit | 3a616b37697e883a646f8587fdb0e5f838e0b41a (patch) | |
tree | 5cae9107a5a714abf239bd21271a57087f01893d | |
parent | bd634dd15594b3e9c78eb50c254cc44a25b8cba5 (diff) | |
download | openbsd-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.c | 45 | ||||
-rw-r--r-- | src/lib/libcrypto/evp/pmeth_lib.c | 41 |
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) | |||
340 | void | 340 | void |
341 | EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD *dst, const EVP_PKEY_ASN1_METHOD *src) | 341 | EVP_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 | ||
373 | void | 360 | void |
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) | |||
272 | void | 272 | void |
273 | EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src) | 273 | EVP_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 | ||
313 | void | 286 | void |