mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-23 16:20:26 -05:00
- Add ./configure --with-deprecate-rsa-1024 that turns off RSA 1024.
This commit is contained in:
parent
07fda669e4
commit
59ea44322e
9 changed files with 124 additions and 7 deletions
|
|
@ -28,6 +28,9 @@
|
||||||
/* Whether daemon is deprecated */
|
/* Whether daemon is deprecated */
|
||||||
#undef DEPRECATED_DAEMON
|
#undef DEPRECATED_DAEMON
|
||||||
|
|
||||||
|
/* Deprecate RSA 1024 bit length, makes that an unsupported key */
|
||||||
|
#undef DEPRECATE_RSA_1024
|
||||||
|
|
||||||
/* Define this to enable kernel based UDP source port randomization. */
|
/* Define this to enable kernel based UDP source port randomization. */
|
||||||
#undef DISABLE_EXPLICIT_PORT_RANDOMISATION
|
#undef DISABLE_EXPLICIT_PORT_RANDOMISATION
|
||||||
|
|
||||||
|
|
|
||||||
17
configure
vendored
17
configure
vendored
|
|
@ -877,6 +877,7 @@ enable_subnet
|
||||||
enable_gost
|
enable_gost
|
||||||
enable_ecdsa
|
enable_ecdsa
|
||||||
enable_dsa
|
enable_dsa
|
||||||
|
with_deprecate_rsa_1024
|
||||||
enable_ed25519
|
enable_ed25519
|
||||||
enable_ed448
|
enable_ed448
|
||||||
enable_event_api
|
enable_event_api
|
||||||
|
|
@ -1639,6 +1640,10 @@ Optional Packages:
|
||||||
/usr/ssl /usr/pkg /usr/local /opt/local /usr/sfw
|
/usr/ssl /usr/pkg /usr/local /opt/local /usr/sfw
|
||||||
/usr)
|
/usr)
|
||||||
--with-libbsd Use portable libbsd functions
|
--with-libbsd Use portable libbsd functions
|
||||||
|
--with-deprecate-rsa-1024
|
||||||
|
Deprecate RSA 1024 bit length, makes that an
|
||||||
|
unsupported key, for use when OpenSSL FIPS refuses
|
||||||
|
1024 bit verification
|
||||||
--with-libevent=pathname
|
--with-libevent=pathname
|
||||||
use libevent (will check /usr/local /opt/local
|
use libevent (will check /usr/local /opt/local
|
||||||
/usr/lib /usr/pkg /usr/sfw /usr or you can specify
|
/usr/lib /usr/pkg /usr/sfw /usr or you can specify
|
||||||
|
|
@ -19035,6 +19040,18 @@ _ACEOF
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
# Check whether --with-deprecate-rsa-1024 was given.
|
||||||
|
if test "${with_deprecate_rsa_1024+set}" = set; then :
|
||||||
|
withval=$with_deprecate_rsa_1024;
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$with_deprecate_rsa_1024" = "yes"; then
|
||||||
|
|
||||||
|
$as_echo "#define DEPRECATE_RSA_1024 1" >>confdefs.h
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
# Check whether --enable-ed25519 was given.
|
# Check whether --enable-ed25519 was given.
|
||||||
if test "${enable_ed25519+set}" = set; then :
|
if test "${enable_ed25519+set}" = set; then :
|
||||||
enableval=$enable_ed25519;
|
enableval=$enable_ed25519;
|
||||||
|
|
|
||||||
|
|
@ -1155,6 +1155,11 @@ AC_INCLUDES_DEFAULT
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
AC_ARG_WITH(deprecate-rsa-1024, AS_HELP_STRING([--with-deprecate-rsa-1024],[Deprecate RSA 1024 bit length, makes that an unsupported key, for use when OpenSSL FIPS refuses 1024 bit verification]))
|
||||||
|
if test "$with_deprecate_rsa_1024" = "yes"; then
|
||||||
|
AC_DEFINE([DEPRECATE_RSA_1024], [1], [Deprecate RSA 1024 bit length, makes that an unsupported key])
|
||||||
|
fi
|
||||||
|
|
||||||
AC_ARG_ENABLE(ed25519, AS_HELP_STRING([--disable-ed25519],[Disable ED25519 support]))
|
AC_ARG_ENABLE(ed25519, AS_HELP_STRING([--disable-ed25519],[Disable ED25519 support]))
|
||||||
use_ed25519="no"
|
use_ed25519="no"
|
||||||
case "$enable_ed25519" in
|
case "$enable_ed25519" in
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
7 May 2021: Wouter
|
7 May 2021: Wouter
|
||||||
- Fix #485: Unbound occasionally reports broken stats.
|
- Fix #485: Unbound occasionally reports broken stats.
|
||||||
|
- Add ./configure --with-deprecate-rsa-1024 that turns off RSA 1024.
|
||||||
|
|
||||||
4 May 2021: George
|
4 May 2021: George
|
||||||
- Fix for #367: only attempt to get the interface for queries that are no
|
- Fix for #367: only attempt to get the interface for queries that are no
|
||||||
|
|
|
||||||
|
|
@ -1579,6 +1579,7 @@ key_matches_a_ds(struct module_env* env, struct val_env* ve,
|
||||||
for(ds_idx=0; ds_idx<num; ds_idx++) {
|
for(ds_idx=0; ds_idx<num; ds_idx++) {
|
||||||
if(!ds_digest_algo_is_supported(ds_rrset, ds_idx) ||
|
if(!ds_digest_algo_is_supported(ds_rrset, ds_idx) ||
|
||||||
!ds_key_algo_is_supported(ds_rrset, ds_idx) ||
|
!ds_key_algo_is_supported(ds_rrset, ds_idx) ||
|
||||||
|
!dnskey_size_is_supported(dnskey_rrset, key_idx) ||
|
||||||
ds_get_digest_algo(ds_rrset, ds_idx) != d)
|
ds_get_digest_algo(ds_rrset, ds_idx) != d)
|
||||||
continue;
|
continue;
|
||||||
if(ds_get_key_algo(ds_rrset, ds_idx)
|
if(ds_get_key_algo(ds_rrset, ds_idx)
|
||||||
|
|
@ -1633,7 +1634,8 @@ update_events(struct module_env* env, struct val_env* ve,
|
||||||
}
|
}
|
||||||
/* is a key of this type supported?. Note rr_list and
|
/* is a key of this type supported?. Note rr_list and
|
||||||
* packed_rrset are in the same order. */
|
* packed_rrset are in the same order. */
|
||||||
if(!dnskey_algo_is_supported(dnskey_rrset, i)) {
|
if(!dnskey_algo_is_supported(dnskey_rrset, i) ||
|
||||||
|
!dnskey_size_is_supported(dnskey_rrset, i)) {
|
||||||
/* skip unknown algorithm key, it is useless to us */
|
/* skip unknown algorithm key, it is useless to us */
|
||||||
log_nametypeclass(VERB_DETAIL, "trust point has "
|
log_nametypeclass(VERB_DETAIL, "trust point has "
|
||||||
"unsupported algorithm at",
|
"unsupported algorithm at",
|
||||||
|
|
|
||||||
|
|
@ -971,7 +971,8 @@ anchors_dnskey_unsupported(struct trust_anchor* ta)
|
||||||
{
|
{
|
||||||
size_t i, num = 0;
|
size_t i, num = 0;
|
||||||
for(i=0; i<ta->numDNSKEY; i++) {
|
for(i=0; i<ta->numDNSKEY; i++) {
|
||||||
if(!dnskey_algo_is_supported(ta->dnskey_rrset, i))
|
if(!dnskey_algo_is_supported(ta->dnskey_rrset, i) ||
|
||||||
|
!dnskey_size_is_supported(ta->dnskey_rrset, i))
|
||||||
num++;
|
num++;
|
||||||
}
|
}
|
||||||
return num;
|
return num;
|
||||||
|
|
|
||||||
|
|
@ -386,6 +386,48 @@ int dnskey_algo_is_supported(struct ub_packed_rrset_key* dnskey_rrset,
|
||||||
dnskey_idx));
|
dnskey_idx));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int dnskey_size_is_supported(struct ub_packed_rrset_key* dnskey_rrset,
|
||||||
|
size_t dnskey_idx)
|
||||||
|
{
|
||||||
|
#ifdef DEPRECATE_RSA_1024
|
||||||
|
uint8_t* rdata;
|
||||||
|
size_t len;
|
||||||
|
int alg = dnskey_get_algo(dnskey_rrset, dnskey_idx);
|
||||||
|
size_t keysize;
|
||||||
|
|
||||||
|
rrset_get_rdata(dnskey_rrset, dnskey_idx, &rdata, &len);
|
||||||
|
if(len < 2+4)
|
||||||
|
return 0;
|
||||||
|
keysize = sldns_rr_dnskey_key_size_raw(rdata+2+4, len-2-4, alg);
|
||||||
|
|
||||||
|
switch((sldns_algorithm)alg) {
|
||||||
|
case LDNS_RSAMD5:
|
||||||
|
case LDNS_RSASHA1:
|
||||||
|
case LDNS_RSASHA1_NSEC3:
|
||||||
|
case LDNS_RSASHA256:
|
||||||
|
case LDNS_RSASHA512:
|
||||||
|
/* reject RSA keys of 1024 bits and shorter */
|
||||||
|
if(keysize <= 1024)
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
(void)dnskey_rrset; (void)dnskey_idx;
|
||||||
|
#endif /* DEPRECATE_RSA_1024 */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dnskeyset_size_is_supported(struct ub_packed_rrset_key* dnskey_rrset)
|
||||||
|
{
|
||||||
|
size_t i, num = rrset_get_count(dnskey_rrset);
|
||||||
|
for(i=0; i<num; i++) {
|
||||||
|
if(!dnskey_size_is_supported(dnskey_rrset, i))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
void algo_needs_init_dnskey_add(struct algo_needs* n,
|
void algo_needs_init_dnskey_add(struct algo_needs* n,
|
||||||
struct ub_packed_rrset_key* dnskey, uint8_t* sigalg)
|
struct ub_packed_rrset_key* dnskey, uint8_t* sigalg)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -180,6 +180,23 @@ uint16_t ds_get_keytag(struct ub_packed_rrset_key* ds_rrset, size_t ds_idx);
|
||||||
int dnskey_algo_is_supported(struct ub_packed_rrset_key* dnskey_rrset,
|
int dnskey_algo_is_supported(struct ub_packed_rrset_key* dnskey_rrset,
|
||||||
size_t dnskey_idx);
|
size_t dnskey_idx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See if the DNSKEY size at that algorithm is supported.
|
||||||
|
* @param dnskey_rrset: DNSKEY rrset.
|
||||||
|
* @param dnskey_idx: index of RR in rrset.
|
||||||
|
* @return true if supported.
|
||||||
|
*/
|
||||||
|
int dnskey_size_is_supported(struct ub_packed_rrset_key* dnskey_rrset,
|
||||||
|
size_t dnskey_idx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See if the DNSKEY size at that algorithm is supported for all the
|
||||||
|
* RRs in the DNSKEY RRset.
|
||||||
|
* @param dnskey_rrset: DNSKEY rrset.
|
||||||
|
* @return true if supported.
|
||||||
|
*/
|
||||||
|
int dnskeyset_size_is_supported(struct ub_packed_rrset_key* dnskey_rrset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* See if DS digest algorithm is supported
|
* See if DS digest algorithm is supported
|
||||||
* @param ds_rrset: DS rrset
|
* @param ds_rrset: DS rrset
|
||||||
|
|
|
||||||
|
|
@ -418,7 +418,7 @@ verify_dnskeys_with_ds_rr(struct module_env* env, struct val_env* ve,
|
||||||
struct module_qstate* qstate)
|
struct module_qstate* qstate)
|
||||||
{
|
{
|
||||||
enum sec_status sec = sec_status_bogus;
|
enum sec_status sec = sec_status_bogus;
|
||||||
size_t i, num, numchecked = 0, numhashok = 0;
|
size_t i, num, numchecked = 0, numhashok = 0, numsizesupp = 0;
|
||||||
num = rrset_get_count(dnskey_rrset);
|
num = rrset_get_count(dnskey_rrset);
|
||||||
for(i=0; i<num; i++) {
|
for(i=0; i<num; i++) {
|
||||||
/* Skip DNSKEYs that don't match the basic criteria. */
|
/* Skip DNSKEYs that don't match the basic criteria. */
|
||||||
|
|
@ -441,6 +441,11 @@ verify_dnskeys_with_ds_rr(struct module_env* env, struct val_env* ve,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
numhashok++;
|
numhashok++;
|
||||||
|
if(!dnskey_size_is_supported(dnskey_rrset, i)) {
|
||||||
|
verbose(VERB_ALGO, "DS okay but that DNSKEY size is not supported");
|
||||||
|
numsizesupp++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
verbose(VERB_ALGO, "DS match digest ok, trying signature");
|
verbose(VERB_ALGO, "DS match digest ok, trying signature");
|
||||||
|
|
||||||
/* Otherwise, we have a match! Make sure that the DNSKEY
|
/* Otherwise, we have a match! Make sure that the DNSKEY
|
||||||
|
|
@ -452,6 +457,10 @@ verify_dnskeys_with_ds_rr(struct module_env* env, struct val_env* ve,
|
||||||
}
|
}
|
||||||
/* If it didn't validate with the DNSKEY, try the next one! */
|
/* If it didn't validate with the DNSKEY, try the next one! */
|
||||||
}
|
}
|
||||||
|
if(numsizesupp != 0) {
|
||||||
|
/* there is a working DS, but that DNSKEY is not supported */
|
||||||
|
return sec_status_insecure;
|
||||||
|
}
|
||||||
if(numchecked == 0)
|
if(numchecked == 0)
|
||||||
algo_needs_reason(env, ds_get_key_algo(ds_rrset, ds_idx),
|
algo_needs_reason(env, ds_get_key_algo(ds_rrset, ds_idx),
|
||||||
reason, "no keys have a DS");
|
reason, "no keys have a DS");
|
||||||
|
|
@ -519,17 +528,24 @@ val_verify_DNSKEY_with_DS(struct module_env* env, struct val_env* ve,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sec = verify_dnskeys_with_ds_rr(env, ve, dnskey_rrset,
|
||||||
|
ds_rrset, i, reason, qstate);
|
||||||
|
if(sec == sec_status_insecure)
|
||||||
|
continue;
|
||||||
|
|
||||||
/* Once we see a single DS with a known digestID and
|
/* Once we see a single DS with a known digestID and
|
||||||
* algorithm, we cannot return INSECURE (with a
|
* algorithm, we cannot return INSECURE (with a
|
||||||
* "null" KeyEntry). */
|
* "null" KeyEntry). */
|
||||||
has_useful_ds = 1;
|
has_useful_ds = 1;
|
||||||
|
|
||||||
sec = verify_dnskeys_with_ds_rr(env, ve, dnskey_rrset,
|
|
||||||
ds_rrset, i, reason, qstate);
|
|
||||||
if(sec == sec_status_secure) {
|
if(sec == sec_status_secure) {
|
||||||
if(!sigalg || algo_needs_set_secure(&needs,
|
if(!sigalg || algo_needs_set_secure(&needs,
|
||||||
(uint8_t)ds_get_key_algo(ds_rrset, i))) {
|
(uint8_t)ds_get_key_algo(ds_rrset, i))) {
|
||||||
verbose(VERB_ALGO, "DS matched DNSKEY.");
|
verbose(VERB_ALGO, "DS matched DNSKEY.");
|
||||||
|
if(!dnskeyset_size_is_supported(dnskey_rrset)) {
|
||||||
|
verbose(VERB_ALGO, "DS works, but dnskeyset contain keys that are unsupported, treat as insecure");
|
||||||
|
return sec_status_insecure;
|
||||||
|
}
|
||||||
return sec_status_secure;
|
return sec_status_secure;
|
||||||
}
|
}
|
||||||
} else if(sigalg && sec == sec_status_bogus) {
|
} else if(sigalg && sec == sec_status_bogus) {
|
||||||
|
|
@ -631,17 +647,24 @@ val_verify_DNSKEY_with_TA(struct module_env* env, struct val_env* ve,
|
||||||
ds_get_digest_algo(ta_ds, i) != digest_algo)
|
ds_get_digest_algo(ta_ds, i) != digest_algo)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
sec = verify_dnskeys_with_ds_rr(env, ve, dnskey_rrset,
|
||||||
|
ta_ds, i, reason, qstate);
|
||||||
|
if(sec == sec_status_insecure)
|
||||||
|
continue;
|
||||||
|
|
||||||
/* Once we see a single DS with a known digestID and
|
/* Once we see a single DS with a known digestID and
|
||||||
* algorithm, we cannot return INSECURE (with a
|
* algorithm, we cannot return INSECURE (with a
|
||||||
* "null" KeyEntry). */
|
* "null" KeyEntry). */
|
||||||
has_useful_ta = 1;
|
has_useful_ta = 1;
|
||||||
|
|
||||||
sec = verify_dnskeys_with_ds_rr(env, ve, dnskey_rrset,
|
|
||||||
ta_ds, i, reason, qstate);
|
|
||||||
if(sec == sec_status_secure) {
|
if(sec == sec_status_secure) {
|
||||||
if(!sigalg || algo_needs_set_secure(&needs,
|
if(!sigalg || algo_needs_set_secure(&needs,
|
||||||
(uint8_t)ds_get_key_algo(ta_ds, i))) {
|
(uint8_t)ds_get_key_algo(ta_ds, i))) {
|
||||||
verbose(VERB_ALGO, "DS matched DNSKEY.");
|
verbose(VERB_ALGO, "DS matched DNSKEY.");
|
||||||
|
if(!dnskeyset_size_is_supported(dnskey_rrset)) {
|
||||||
|
verbose(VERB_ALGO, "trustanchor works, but dnskeyset contain keys that are unsupported, treat as insecure");
|
||||||
|
return sec_status_insecure;
|
||||||
|
}
|
||||||
return sec_status_secure;
|
return sec_status_secure;
|
||||||
}
|
}
|
||||||
} else if(sigalg && sec == sec_status_bogus) {
|
} else if(sigalg && sec == sec_status_bogus) {
|
||||||
|
|
@ -658,6 +681,8 @@ val_verify_DNSKEY_with_TA(struct module_env* env, struct val_env* ve,
|
||||||
/* Check to see if we can understand this DNSKEY */
|
/* Check to see if we can understand this DNSKEY */
|
||||||
if(!dnskey_algo_is_supported(ta_dnskey, i))
|
if(!dnskey_algo_is_supported(ta_dnskey, i))
|
||||||
continue;
|
continue;
|
||||||
|
if(!dnskey_size_is_supported(ta_dnskey, i))
|
||||||
|
continue;
|
||||||
|
|
||||||
/* we saw a useful TA */
|
/* we saw a useful TA */
|
||||||
has_useful_ta = 1;
|
has_useful_ta = 1;
|
||||||
|
|
@ -668,6 +693,10 @@ val_verify_DNSKEY_with_TA(struct module_env* env, struct val_env* ve,
|
||||||
if(!sigalg || algo_needs_set_secure(&needs,
|
if(!sigalg || algo_needs_set_secure(&needs,
|
||||||
(uint8_t)dnskey_get_algo(ta_dnskey, i))) {
|
(uint8_t)dnskey_get_algo(ta_dnskey, i))) {
|
||||||
verbose(VERB_ALGO, "anchor matched DNSKEY.");
|
verbose(VERB_ALGO, "anchor matched DNSKEY.");
|
||||||
|
if(!dnskeyset_size_is_supported(dnskey_rrset)) {
|
||||||
|
verbose(VERB_ALGO, "trustanchor works, but dnskeyset contain keys that are unsupported, treat as insecure");
|
||||||
|
return sec_status_insecure;
|
||||||
|
}
|
||||||
return sec_status_secure;
|
return sec_status_secure;
|
||||||
}
|
}
|
||||||
} else if(sigalg && sec == sec_status_bogus) {
|
} else if(sigalg && sec == sec_status_bogus) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue