From f23e4a17a2309793a0ac787725736f1c4474c804 Mon Sep 17 00:00:00 2001 From: Tomas Mraz Date: Thu, 14 Jan 2021 14:43:11 +0100 Subject: [PATCH] Fixes related to broken DH support in CMS - DH support should work with both DH and DHX keys - UKM parameter is optional so it can have length 0 Fixes #13810 Reviewed-by: Matt Caswell (Merged from https://github.com/openssl/openssl/pull/13869) --- crypto/cms/cms_env.c | 4 +++- crypto/evp/dh_ctrl.c | 2 +- crypto/evp/p_lib.c | 2 ++ test/recipes/80-test_cms.t | 22 ++++++++++------------ 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/crypto/cms/cms_env.c b/crypto/cms/cms_env.c index d2f630146e..6f3ca020d8 100644 --- a/crypto/cms/cms_env.c +++ b/crypto/cms/cms_env.c @@ -115,7 +115,7 @@ int cms_env_asn1_ctrl(CMS_RecipientInfo *ri, int cmd) } else return 0; - if (EVP_PKEY_is_a(pkey, "DHX")) + if (EVP_PKEY_is_a(pkey, "DHX") || EVP_PKEY_is_a(pkey, "DH")) return cms_dh_envelope(ri, cmd); else if (EVP_PKEY_is_a(pkey, "EC")) return cms_ecdh_envelope(ri, cmd); @@ -1294,6 +1294,8 @@ int cms_pkey_get_ri_type(EVP_PKEY *pk) /* Check types that we know about */ if (EVP_PKEY_is_a(pk, "DH")) return CMS_RECIPINFO_AGREE; + else if (EVP_PKEY_is_a(pk, "DHX")) + return CMS_RECIPINFO_AGREE; else if (EVP_PKEY_is_a(pk, "DSA")) return CMS_RECIPINFO_NONE; else if (EVP_PKEY_is_a(pk, "EC")) diff --git a/crypto/evp/dh_ctrl.c b/crypto/evp/dh_ctrl.c index 64492389b7..7cf589f60b 100644 --- a/crypto/evp/dh_ctrl.c +++ b/crypto/evp/dh_ctrl.c @@ -514,7 +514,7 @@ int EVP_PKEY_CTX_set0_dh_kdf_ukm(EVP_PKEY_CTX *ctx, unsigned char *ukm, int len) int ret; OSSL_PARAM params[2], *p = params; - if (len <= 0) + if (len < 0) return -1; ret = dh_param_derive_check(ctx); diff --git a/crypto/evp/p_lib.c b/crypto/evp/p_lib.c index 93cdbb89bf..cc5a612748 100644 --- a/crypto/evp/p_lib.c +++ b/crypto/evp/p_lib.c @@ -972,6 +972,8 @@ int evp_pkey_name2type(const char *name) type = EVP_PKEY_DH; else if (strcasecmp(name, "X9.42 DH") == 0) type = EVP_PKEY_DHX; + else if (strcasecmp(name, "DHX") == 0) + type = EVP_PKEY_DHX; else if (strcasecmp(name, "DSA") == 0) type = EVP_PKEY_DSA; diff --git a/test/recipes/80-test_cms.t b/test/recipes/80-test_cms.t index 6783897139..005e9879ae 100644 --- a/test/recipes/80-test_cms.t +++ b/test/recipes/80-test_cms.t @@ -598,7 +598,7 @@ my @smime_cms_param_tests = ( "-stream", "-out", "{output}.cms", "-recip", catfile($smdir, "smec1.pem"), "-aes-128-gcm", "-keyopt", "ecdh_kdf_md:sha256" ], [ "{cmd2}", "-decrypt", "-recip", catfile($smdir, "smec1.pem"), - "-in", "{output}.cms", "-out", "{output}.txt" ], + "-in", "{output}.cms", "-out", "{output}.txt" ], \&final_compare ], @@ -610,18 +610,16 @@ my @smime_cms_param_tests = ( [ "{cmd2}", @prov, "-decrypt", "-recip", catfile($smdir, "smec2.pem"), "-in", "{output}.cms", "-out", "{output}.txt" ], \&final_compare - ] + ], - # TODO(3.0) Add this test back in when "dhpublicnumber" is supported - # in the keymanger. - #[ "enveloped content test streaming S/MIME format, X9.42 DH", - # [ "{cmd1}", @prov, "-encrypt", "-in", $smcont, - # "-stream", "-out", "{output}.cms", - # "-recip", catfile($smdir, "smdh.pem"), "-aes128" ], - # [ "{cmd2}", "-decrypt", "-recip", catfile($smdir, "smdh.pem"), - # "-in", "{output}.cms", "-out", "{output}.txt" ], - # \&final_compare - #] + [ "enveloped content test streaming S/MIME format, X9.42 DH", + [ "{cmd1}", @prov, "-encrypt", "-in", $smcont, + "-stream", "-out", "{output}.cms", + "-recip", catfile($smdir, "smdh.pem"), "-aes128" ], + [ "{cmd2}", "-decrypt", "-recip", catfile($smdir, "smdh.pem"), + "-in", "{output}.cms", "-out", "{output}.txt" ], + \&final_compare + ] ); my @contenttype_cms_test = ( -- 2.34.1