From a113381c12a2da3c9b7bd594f47a1b2657bdfdf2 Mon Sep 17 00:00:00 2001 From: Matt Johnston Date: Sun, 12 Feb 2023 22:44:32 +0800 Subject: Disable rsa signatures when no rsa hostkey Otherwise Dropbear will offer RSA as a hostkey signature option, but the session will exit with an assertion or NULL pointer dereference once that algorithm is negotiated. This likely regressed in 2020.79 when signature vs key type enums were split, for rsa-sha256. Fixes #219 on github --- svr-runopts.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) --- a/svr-runopts.c +++ b/svr-runopts.c @@ -505,11 +505,11 @@ static void addportandaddress(const char svr_opts.portcount++; } -static void disablekey(int type) { +static void disablekey(enum signature_type type) { int i; TRACE(("Disabling key type %d", type)) for (i = 0; sigalgs[i].name != NULL; i++) { - if (sigalgs[i].val == type) { + if ((int)sigalgs[i].val == (int)type) { sigalgs[i].usable = 0; break; } @@ -624,7 +624,8 @@ void load_all_hostkeys() { #if DROPBEAR_RSA if (!svr_opts.delay_hostkey && !svr_opts.hostkey->rsakey) { - disablekey(DROPBEAR_SIGNKEY_RSA); + disablekey(DROPBEAR_SIGNATURE_RSA_SHA256); + disablekey(DROPBEAR_SIGNATURE_RSA_SHA1); } else { any_keys = 1; } @@ -632,7 +633,7 @@ void load_all_hostkeys() { #if DROPBEAR_DSS if (!svr_opts.delay_hostkey && !svr_opts.hostkey->dsskey) { - disablekey(DROPBEAR_SIGNKEY_DSS); + disablekey(DROPBEAR_SIGNATURE_DSS); } else { any_keys = 1; } @@ -666,35 +667,35 @@ void load_all_hostkeys() { #if DROPBEAR_ECC_256 if (!svr_opts.hostkey->ecckey256 && (!svr_opts.delay_hostkey || loaded_any_ecdsa || ECDSA_DEFAULT_SIZE != 256 )) { - disablekey(DROPBEAR_SIGNKEY_ECDSA_NISTP256); + disablekey(DROPBEAR_SIGNATURE_ECDSA_NISTP256); } #endif #if DROPBEAR_ECC_384 if (!svr_opts.hostkey->ecckey384 && (!svr_opts.delay_hostkey || loaded_any_ecdsa || ECDSA_DEFAULT_SIZE != 384 )) { - disablekey(DROPBEAR_SIGNKEY_ECDSA_NISTP384); + disablekey(DROPBEAR_SIGNATURE_ECDSA_NISTP384); } #endif #if DROPBEAR_ECC_521 if (!svr_opts.hostkey->ecckey521 && (!svr_opts.delay_hostkey || loaded_any_ecdsa || ECDSA_DEFAULT_SIZE != 521 )) { - disablekey(DROPBEAR_SIGNKEY_ECDSA_NISTP521); + disablekey(DROPBEAR_SIGNATURE_ECDSA_NISTP521); } #endif #endif /* DROPBEAR_ECDSA */ #if DROPBEAR_ED25519 if (!svr_opts.delay_hostkey && !svr_opts.hostkey->ed25519key) { - disablekey(DROPBEAR_SIGNKEY_ED25519); + disablekey(DROPBEAR_SIGNATURE_ED25519); } else { any_keys = 1; } #endif #if DROPBEAR_SK_ECDSA - disablekey(DROPBEAR_SIGNKEY_SK_ECDSA_NISTP256); + disablekey(DROPBEAR_SIGNATURE_SK_ECDSA_NISTP256); #endif #if DROPBEAR_SK_ED25519 - disablekey(DROPBEAR_SIGNKEY_SK_ED25519); + disablekey(DROPBEAR_SIGNATURE_SK_ED25519); #endif if (!any_keys) {