mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
- Added root-key-sentinel support
git-svn-id: file:///svn/unbound/trunk@4652 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
parent
1508d3708c
commit
4d06c36342
20 changed files with 3297 additions and 3069 deletions
|
|
@ -502,6 +502,7 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
|
||||||
* let validator do that */
|
* let validator do that */
|
||||||
return 0;
|
return 0;
|
||||||
case sec_status_bogus:
|
case sec_status_bogus:
|
||||||
|
case sec_status_secure_sentinel_fail:
|
||||||
/* some rrsets are bogus, reply servfail */
|
/* some rrsets are bogus, reply servfail */
|
||||||
edns->edns_version = EDNS_ADVERTISED_VERSION;
|
edns->edns_version = EDNS_ADVERTISED_VERSION;
|
||||||
edns->udp_size = EDNS_ADVERTISED_SIZE;
|
edns->udp_size = EDNS_ADVERTISED_SIZE;
|
||||||
|
|
@ -658,7 +659,8 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* check security status of the cached answer */
|
/* check security status of the cached answer */
|
||||||
if( rep->security == sec_status_bogus && must_validate) {
|
if(must_validate && (rep->security == sec_status_bogus ||
|
||||||
|
rep->security == sec_status_secure_sentinel_fail)) {
|
||||||
/* BAD cached */
|
/* BAD cached */
|
||||||
edns->edns_version = EDNS_ADVERTISED_VERSION;
|
edns->edns_version = EDNS_ADVERTISED_VERSION;
|
||||||
edns->udp_size = EDNS_ADVERTISED_SIZE;
|
edns->udp_size = EDNS_ADVERTISED_SIZE;
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
24 April 2018: Ralph
|
||||||
|
- Added root-key-sentinel support
|
||||||
|
|
||||||
23 April 2018: Wouter
|
23 April 2018: Wouter
|
||||||
- makedist uses bz2 for expat code, instead of tar.gz.
|
- makedist uses bz2 for expat code, instead of tar.gz.
|
||||||
- Fix #4092: libunbound: use-caps-for-id lacks colon in
|
- Fix #4092: libunbound: use-caps-for-id lacks colon in
|
||||||
|
|
|
||||||
|
|
@ -458,6 +458,9 @@ server:
|
||||||
|
|
||||||
# trust anchor signaling sends a RFC8145 key tag query after priming.
|
# trust anchor signaling sends a RFC8145 key tag query after priming.
|
||||||
# trust-anchor-signaling: yes
|
# trust-anchor-signaling: yes
|
||||||
|
|
||||||
|
# Root key trust anchor sentinel (draft-ietf-dnsop-kskroll-sentinel)
|
||||||
|
# root-key-sentinel: yes
|
||||||
|
|
||||||
# File with DLV trusted keys. Same format as trust-anchor-file.
|
# File with DLV trusted keys. Same format as trust-anchor-file.
|
||||||
# There can be only one DLV configured, it is trusted from root down.
|
# There can be only one DLV configured, it is trusted from root down.
|
||||||
|
|
|
||||||
|
|
@ -849,6 +849,9 @@ expanded on start and on reload.
|
||||||
.B trust\-anchor\-signaling: \fI<yes or no>
|
.B trust\-anchor\-signaling: \fI<yes or no>
|
||||||
Send RFC8145 key tag query after trust anchor priming. Default is on.
|
Send RFC8145 key tag query after trust anchor priming. Default is on.
|
||||||
.TP
|
.TP
|
||||||
|
.B root\-key\-sentinel: \fI<yes or no>
|
||||||
|
Root key trust anchor sentinel. Default is on.
|
||||||
|
.TP
|
||||||
.B dlv\-anchor\-file: \fI<filename>
|
.B dlv\-anchor\-file: \fI<filename>
|
||||||
This option was used during early days DNSSEC deployment when no parent-side
|
This option was used during early days DNSSEC deployment when no parent-side
|
||||||
DS record registrations were easily available. Nowadays, it is best to have
|
DS record registrations were easily available. Nowadays, it is best to have
|
||||||
|
|
|
||||||
|
|
@ -975,7 +975,8 @@ mesh_do_callback(struct mesh_state* m, int rcode, struct reply_info* rep,
|
||||||
else secure = 0;
|
else secure = 0;
|
||||||
if(!rep && rcode == LDNS_RCODE_NOERROR)
|
if(!rep && rcode == LDNS_RCODE_NOERROR)
|
||||||
rcode = LDNS_RCODE_SERVFAIL;
|
rcode = LDNS_RCODE_SERVFAIL;
|
||||||
if(!rcode && rep->security == sec_status_bogus) {
|
if(!rcode && (rep->security == sec_status_bogus ||
|
||||||
|
rep->security == sec_status_secure_sentinel_fail)) {
|
||||||
if(!(reason = errinf_to_str(&m->s)))
|
if(!(reason = errinf_to_str(&m->s)))
|
||||||
rcode = LDNS_RCODE_SERVFAIL;
|
rcode = LDNS_RCODE_SERVFAIL;
|
||||||
}
|
}
|
||||||
|
|
@ -1041,7 +1042,8 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
|
||||||
/* examine security status */
|
/* examine security status */
|
||||||
if(m->s.env->need_to_validate && (!(r->qflags&BIT_CD) ||
|
if(m->s.env->need_to_validate && (!(r->qflags&BIT_CD) ||
|
||||||
m->s.env->cfg->ignore_cd) && rep &&
|
m->s.env->cfg->ignore_cd) && rep &&
|
||||||
rep->security <= sec_status_bogus) {
|
(rep->security <= sec_status_bogus ||
|
||||||
|
rep->security == sec_status_secure_sentinel_fail)) {
|
||||||
rcode = LDNS_RCODE_SERVFAIL;
|
rcode = LDNS_RCODE_SERVFAIL;
|
||||||
if(m->s.env->cfg->stat_extended)
|
if(m->s.env->cfg->stat_extended)
|
||||||
m->s.env->mesh->ans_bogus++;
|
m->s.env->mesh->ans_bogus++;
|
||||||
|
|
|
||||||
|
|
@ -213,6 +213,7 @@ config_create(void)
|
||||||
cfg->trust_anchor_list = NULL;
|
cfg->trust_anchor_list = NULL;
|
||||||
cfg->trusted_keys_file_list = NULL;
|
cfg->trusted_keys_file_list = NULL;
|
||||||
cfg->trust_anchor_signaling = 1;
|
cfg->trust_anchor_signaling = 1;
|
||||||
|
cfg->root_key_sentinel = 1;
|
||||||
cfg->dlv_anchor_file = NULL;
|
cfg->dlv_anchor_file = NULL;
|
||||||
cfg->dlv_anchor_list = NULL;
|
cfg->dlv_anchor_list = NULL;
|
||||||
cfg->domain_insecure = NULL;
|
cfg->domain_insecure = NULL;
|
||||||
|
|
@ -521,6 +522,7 @@ int config_set_option(struct config_file* cfg, const char* opt,
|
||||||
else S_STRLIST("trust-anchor:", trust_anchor_list)
|
else S_STRLIST("trust-anchor:", trust_anchor_list)
|
||||||
else S_STRLIST("trusted-keys-file:", trusted_keys_file_list)
|
else S_STRLIST("trusted-keys-file:", trusted_keys_file_list)
|
||||||
else S_YNO("trust-anchor-signaling:", trust_anchor_signaling)
|
else S_YNO("trust-anchor-signaling:", trust_anchor_signaling)
|
||||||
|
else S_YNO("root-key-sentinel:", root_key_sentinel)
|
||||||
else S_STR("dlv-anchor-file:", dlv_anchor_file)
|
else S_STR("dlv-anchor-file:", dlv_anchor_file)
|
||||||
else S_STRLIST("dlv-anchor:", dlv_anchor_list)
|
else S_STRLIST("dlv-anchor:", dlv_anchor_list)
|
||||||
else S_STRLIST("domain-insecure:", domain_insecure)
|
else S_STRLIST("domain-insecure:", domain_insecure)
|
||||||
|
|
@ -932,6 +934,7 @@ config_get_option(struct config_file* cfg, const char* opt,
|
||||||
else O_LST(opt, "trust-anchor", trust_anchor_list)
|
else O_LST(opt, "trust-anchor", trust_anchor_list)
|
||||||
else O_LST(opt, "trusted-keys-file", trusted_keys_file_list)
|
else O_LST(opt, "trusted-keys-file", trusted_keys_file_list)
|
||||||
else O_YNO(opt, "trust-anchor-signaling", trust_anchor_signaling)
|
else O_YNO(opt, "trust-anchor-signaling", trust_anchor_signaling)
|
||||||
|
else O_YNO(opt, "root-key-sentinel", root_key_sentinel)
|
||||||
else O_LST(opt, "dlv-anchor", dlv_anchor_list)
|
else O_LST(opt, "dlv-anchor", dlv_anchor_list)
|
||||||
else O_LST(opt, "control-interface", control_ifs)
|
else O_LST(opt, "control-interface", control_ifs)
|
||||||
else O_LST(opt, "domain-insecure", domain_insecure)
|
else O_LST(opt, "domain-insecure", domain_insecure)
|
||||||
|
|
|
||||||
|
|
@ -291,6 +291,8 @@ struct config_file {
|
||||||
struct config_strlist* domain_insecure;
|
struct config_strlist* domain_insecure;
|
||||||
/** send key tag query */
|
/** send key tag query */
|
||||||
int trust_anchor_signaling;
|
int trust_anchor_signaling;
|
||||||
|
/** enable root key sentinel */
|
||||||
|
int root_key_sentinel;
|
||||||
|
|
||||||
/** if not 0, this value is the validation date for RRSIGs */
|
/** if not 0, this value is the validation date for RRSIGs */
|
||||||
int32_t val_date_override;
|
int32_t val_date_override;
|
||||||
|
|
|
||||||
3585
util/configlexer.c
3585
util/configlexer.c
File diff suppressed because it is too large
Load diff
|
|
@ -336,6 +336,7 @@ auto-trust-anchor-file{COLON} { YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
|
||||||
trusted-keys-file{COLON} { YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
|
trusted-keys-file{COLON} { YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
|
||||||
trust-anchor{COLON} { YDVAR(1, VAR_TRUST_ANCHOR) }
|
trust-anchor{COLON} { YDVAR(1, VAR_TRUST_ANCHOR) }
|
||||||
trust-anchor-signaling{COLON} { YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) }
|
trust-anchor-signaling{COLON} { YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) }
|
||||||
|
root-key-sentinel{COLON} { YDVAR(1, VAR_ROOT_KEY_SENTINEL) }
|
||||||
val-override-date{COLON} { YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
|
val-override-date{COLON} { YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
|
||||||
val-sig-skew-min{COLON} { YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
|
val-sig-skew-min{COLON} { YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
|
||||||
val-sig-skew-max{COLON} { YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
|
val-sig-skew-max{COLON} { YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
|
||||||
|
|
|
||||||
2443
util/configparser.c
2443
util/configparser.c
File diff suppressed because it is too large
Load diff
|
|
@ -248,41 +248,42 @@ extern int yydebug;
|
||||||
VAR_USE_SYSTEMD = 458,
|
VAR_USE_SYSTEMD = 458,
|
||||||
VAR_SHM_ENABLE = 459,
|
VAR_SHM_ENABLE = 459,
|
||||||
VAR_SHM_KEY = 460,
|
VAR_SHM_KEY = 460,
|
||||||
VAR_DNSCRYPT = 461,
|
VAR_ROOT_KEY_SENTINEL = 461,
|
||||||
VAR_DNSCRYPT_ENABLE = 462,
|
VAR_DNSCRYPT = 462,
|
||||||
VAR_DNSCRYPT_PORT = 463,
|
VAR_DNSCRYPT_ENABLE = 463,
|
||||||
VAR_DNSCRYPT_PROVIDER = 464,
|
VAR_DNSCRYPT_PORT = 464,
|
||||||
VAR_DNSCRYPT_SECRET_KEY = 465,
|
VAR_DNSCRYPT_PROVIDER = 465,
|
||||||
VAR_DNSCRYPT_PROVIDER_CERT = 466,
|
VAR_DNSCRYPT_SECRET_KEY = 466,
|
||||||
VAR_DNSCRYPT_PROVIDER_CERT_ROTATED = 467,
|
VAR_DNSCRYPT_PROVIDER_CERT = 467,
|
||||||
VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE = 468,
|
VAR_DNSCRYPT_PROVIDER_CERT_ROTATED = 468,
|
||||||
VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS = 469,
|
VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE = 469,
|
||||||
VAR_DNSCRYPT_NONCE_CACHE_SIZE = 470,
|
VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS = 470,
|
||||||
VAR_DNSCRYPT_NONCE_CACHE_SLABS = 471,
|
VAR_DNSCRYPT_NONCE_CACHE_SIZE = 471,
|
||||||
VAR_IPSECMOD_ENABLED = 472,
|
VAR_DNSCRYPT_NONCE_CACHE_SLABS = 472,
|
||||||
VAR_IPSECMOD_HOOK = 473,
|
VAR_IPSECMOD_ENABLED = 473,
|
||||||
VAR_IPSECMOD_IGNORE_BOGUS = 474,
|
VAR_IPSECMOD_HOOK = 474,
|
||||||
VAR_IPSECMOD_MAX_TTL = 475,
|
VAR_IPSECMOD_IGNORE_BOGUS = 475,
|
||||||
VAR_IPSECMOD_WHITELIST = 476,
|
VAR_IPSECMOD_MAX_TTL = 476,
|
||||||
VAR_IPSECMOD_STRICT = 477,
|
VAR_IPSECMOD_WHITELIST = 477,
|
||||||
VAR_CACHEDB = 478,
|
VAR_IPSECMOD_STRICT = 478,
|
||||||
VAR_CACHEDB_BACKEND = 479,
|
VAR_CACHEDB = 479,
|
||||||
VAR_CACHEDB_SECRETSEED = 480,
|
VAR_CACHEDB_BACKEND = 480,
|
||||||
VAR_CACHEDB_REDISHOST = 481,
|
VAR_CACHEDB_SECRETSEED = 481,
|
||||||
VAR_CACHEDB_REDISPORT = 482,
|
VAR_CACHEDB_REDISHOST = 482,
|
||||||
VAR_CACHEDB_REDISTIMEOUT = 483,
|
VAR_CACHEDB_REDISPORT = 483,
|
||||||
VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 484,
|
VAR_CACHEDB_REDISTIMEOUT = 484,
|
||||||
VAR_FOR_UPSTREAM = 485,
|
VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 485,
|
||||||
VAR_AUTH_ZONE = 486,
|
VAR_FOR_UPSTREAM = 486,
|
||||||
VAR_ZONEFILE = 487,
|
VAR_AUTH_ZONE = 487,
|
||||||
VAR_MASTER = 488,
|
VAR_ZONEFILE = 488,
|
||||||
VAR_URL = 489,
|
VAR_MASTER = 489,
|
||||||
VAR_FOR_DOWNSTREAM = 490,
|
VAR_URL = 490,
|
||||||
VAR_FALLBACK_ENABLED = 491,
|
VAR_FOR_DOWNSTREAM = 491,
|
||||||
VAR_ADDITIONAL_TLS_PORT = 492,
|
VAR_FALLBACK_ENABLED = 492,
|
||||||
VAR_LOW_RTT = 493,
|
VAR_ADDITIONAL_TLS_PORT = 493,
|
||||||
VAR_LOW_RTT_PCT = 494,
|
VAR_LOW_RTT = 494,
|
||||||
VAR_ALLOW_NOTIFY = 495
|
VAR_LOW_RTT_PCT = 495,
|
||||||
|
VAR_ALLOW_NOTIFY = 496
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
/* Tokens. */
|
/* Tokens. */
|
||||||
|
|
@ -489,41 +490,42 @@ extern int yydebug;
|
||||||
#define VAR_USE_SYSTEMD 458
|
#define VAR_USE_SYSTEMD 458
|
||||||
#define VAR_SHM_ENABLE 459
|
#define VAR_SHM_ENABLE 459
|
||||||
#define VAR_SHM_KEY 460
|
#define VAR_SHM_KEY 460
|
||||||
#define VAR_DNSCRYPT 461
|
#define VAR_ROOT_KEY_SENTINEL 461
|
||||||
#define VAR_DNSCRYPT_ENABLE 462
|
#define VAR_DNSCRYPT 462
|
||||||
#define VAR_DNSCRYPT_PORT 463
|
#define VAR_DNSCRYPT_ENABLE 463
|
||||||
#define VAR_DNSCRYPT_PROVIDER 464
|
#define VAR_DNSCRYPT_PORT 464
|
||||||
#define VAR_DNSCRYPT_SECRET_KEY 465
|
#define VAR_DNSCRYPT_PROVIDER 465
|
||||||
#define VAR_DNSCRYPT_PROVIDER_CERT 466
|
#define VAR_DNSCRYPT_SECRET_KEY 466
|
||||||
#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 467
|
#define VAR_DNSCRYPT_PROVIDER_CERT 467
|
||||||
#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 468
|
#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 468
|
||||||
#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 469
|
#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 469
|
||||||
#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 470
|
#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 470
|
||||||
#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 471
|
#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 471
|
||||||
#define VAR_IPSECMOD_ENABLED 472
|
#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 472
|
||||||
#define VAR_IPSECMOD_HOOK 473
|
#define VAR_IPSECMOD_ENABLED 473
|
||||||
#define VAR_IPSECMOD_IGNORE_BOGUS 474
|
#define VAR_IPSECMOD_HOOK 474
|
||||||
#define VAR_IPSECMOD_MAX_TTL 475
|
#define VAR_IPSECMOD_IGNORE_BOGUS 475
|
||||||
#define VAR_IPSECMOD_WHITELIST 476
|
#define VAR_IPSECMOD_MAX_TTL 476
|
||||||
#define VAR_IPSECMOD_STRICT 477
|
#define VAR_IPSECMOD_WHITELIST 477
|
||||||
#define VAR_CACHEDB 478
|
#define VAR_IPSECMOD_STRICT 478
|
||||||
#define VAR_CACHEDB_BACKEND 479
|
#define VAR_CACHEDB 479
|
||||||
#define VAR_CACHEDB_SECRETSEED 480
|
#define VAR_CACHEDB_BACKEND 480
|
||||||
#define VAR_CACHEDB_REDISHOST 481
|
#define VAR_CACHEDB_SECRETSEED 481
|
||||||
#define VAR_CACHEDB_REDISPORT 482
|
#define VAR_CACHEDB_REDISHOST 482
|
||||||
#define VAR_CACHEDB_REDISTIMEOUT 483
|
#define VAR_CACHEDB_REDISPORT 483
|
||||||
#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 484
|
#define VAR_CACHEDB_REDISTIMEOUT 484
|
||||||
#define VAR_FOR_UPSTREAM 485
|
#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 485
|
||||||
#define VAR_AUTH_ZONE 486
|
#define VAR_FOR_UPSTREAM 486
|
||||||
#define VAR_ZONEFILE 487
|
#define VAR_AUTH_ZONE 487
|
||||||
#define VAR_MASTER 488
|
#define VAR_ZONEFILE 488
|
||||||
#define VAR_URL 489
|
#define VAR_MASTER 489
|
||||||
#define VAR_FOR_DOWNSTREAM 490
|
#define VAR_URL 490
|
||||||
#define VAR_FALLBACK_ENABLED 491
|
#define VAR_FOR_DOWNSTREAM 491
|
||||||
#define VAR_ADDITIONAL_TLS_PORT 492
|
#define VAR_FALLBACK_ENABLED 492
|
||||||
#define VAR_LOW_RTT 493
|
#define VAR_ADDITIONAL_TLS_PORT 493
|
||||||
#define VAR_LOW_RTT_PCT 494
|
#define VAR_LOW_RTT 494
|
||||||
#define VAR_ALLOW_NOTIFY 495
|
#define VAR_LOW_RTT_PCT 495
|
||||||
|
#define VAR_ALLOW_NOTIFY 496
|
||||||
|
|
||||||
/* Value type. */
|
/* Value type. */
|
||||||
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
||||||
|
|
@ -534,7 +536,7 @@ union YYSTYPE
|
||||||
|
|
||||||
char* str;
|
char* str;
|
||||||
|
|
||||||
#line 538 "util/configparser.h" /* yacc.c:1909 */
|
#line 540 "util/configparser.h" /* yacc.c:1909 */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef union YYSTYPE YYSTYPE;
|
typedef union YYSTYPE YYSTYPE;
|
||||||
|
|
|
||||||
|
|
@ -142,6 +142,7 @@ extern struct config_parser_state* cfg_parser;
|
||||||
%token VAR_VIEW_FIRST VAR_SERVE_EXPIRED VAR_FAKE_DSA VAR_FAKE_SHA1
|
%token VAR_VIEW_FIRST VAR_SERVE_EXPIRED VAR_FAKE_DSA VAR_FAKE_SHA1
|
||||||
%token VAR_LOG_IDENTITY VAR_HIDE_TRUSTANCHOR VAR_TRUST_ANCHOR_SIGNALING
|
%token VAR_LOG_IDENTITY VAR_HIDE_TRUSTANCHOR VAR_TRUST_ANCHOR_SIGNALING
|
||||||
%token VAR_AGGRESSIVE_NSEC VAR_USE_SYSTEMD VAR_SHM_ENABLE VAR_SHM_KEY
|
%token VAR_AGGRESSIVE_NSEC VAR_USE_SYSTEMD VAR_SHM_ENABLE VAR_SHM_KEY
|
||||||
|
%token VAR_ROOT_KEY_SENTINEL
|
||||||
%token VAR_DNSCRYPT VAR_DNSCRYPT_ENABLE VAR_DNSCRYPT_PORT VAR_DNSCRYPT_PROVIDER
|
%token VAR_DNSCRYPT VAR_DNSCRYPT_ENABLE VAR_DNSCRYPT_PORT VAR_DNSCRYPT_PROVIDER
|
||||||
%token VAR_DNSCRYPT_SECRET_KEY VAR_DNSCRYPT_PROVIDER_CERT
|
%token VAR_DNSCRYPT_SECRET_KEY VAR_DNSCRYPT_PROVIDER_CERT
|
||||||
%token VAR_DNSCRYPT_PROVIDER_CERT_ROTATED
|
%token VAR_DNSCRYPT_PROVIDER_CERT_ROTATED
|
||||||
|
|
@ -242,6 +243,7 @@ content_server: server_num_threads | server_verbosity | server_port |
|
||||||
server_response_ip_tag | server_response_ip | server_response_ip_data |
|
server_response_ip_tag | server_response_ip | server_response_ip_data |
|
||||||
server_shm_enable | server_shm_key | server_fake_sha1 |
|
server_shm_enable | server_shm_key | server_fake_sha1 |
|
||||||
server_hide_trustanchor | server_trust_anchor_signaling |
|
server_hide_trustanchor | server_trust_anchor_signaling |
|
||||||
|
server_root_key_sentinel |
|
||||||
server_ipsecmod_enabled | server_ipsecmod_hook |
|
server_ipsecmod_enabled | server_ipsecmod_hook |
|
||||||
server_ipsecmod_ignore_bogus | server_ipsecmod_max_ttl |
|
server_ipsecmod_ignore_bogus | server_ipsecmod_max_ttl |
|
||||||
server_ipsecmod_whitelist | server_ipsecmod_strict |
|
server_ipsecmod_whitelist | server_ipsecmod_strict |
|
||||||
|
|
@ -871,6 +873,17 @@ server_trust_anchor_signaling: VAR_TRUST_ANCHOR_SIGNALING STRING_ARG
|
||||||
free($2);
|
free($2);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
server_root_key_sentinel: VAR_ROOT_KEY_SENTINEL STRING_ARG
|
||||||
|
{
|
||||||
|
OUTYY(("P(server_root_key_sentinel:%s)\n", $2));
|
||||||
|
if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
|
||||||
|
yyerror("expected yes or no.");
|
||||||
|
else
|
||||||
|
cfg_parser->cfg->root_key_sentinel =
|
||||||
|
(strcmp($2, "yes")==0);
|
||||||
|
free($2);
|
||||||
|
}
|
||||||
|
;
|
||||||
server_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG
|
server_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG
|
||||||
{
|
{
|
||||||
OUTYY(("P(server_domain_insecure:%s)\n", $2));
|
OUTYY(("P(server_domain_insecure:%s)\n", $2));
|
||||||
|
|
|
||||||
|
|
@ -523,6 +523,29 @@ dname_lab_cmp(uint8_t* d1, int labs1, uint8_t* d2, int labs2, int* mlabs)
|
||||||
return lastdiff;
|
return lastdiff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dname_lab_startswith(uint8_t* label, char* prefix, char** endptr)
|
||||||
|
{
|
||||||
|
size_t plen = strlen(prefix);
|
||||||
|
size_t orig_plen = plen;
|
||||||
|
size_t lablen = (size_t)*label;
|
||||||
|
if(plen > lablen)
|
||||||
|
return 0;
|
||||||
|
label++;
|
||||||
|
while(plen--) {
|
||||||
|
if(*prefix != tolower((unsigned char)*label)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
prefix++; label++;
|
||||||
|
}
|
||||||
|
if(orig_plen < lablen)
|
||||||
|
*endptr = (char *)label;
|
||||||
|
else
|
||||||
|
/* prefix length == label length */
|
||||||
|
*endptr = NULL;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
dname_buffer_write(sldns_buffer* pkt, uint8_t* dname)
|
dname_buffer_write(sldns_buffer* pkt, uint8_t* dname)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -185,6 +185,17 @@ int dname_count_size_labels(uint8_t* dname, size_t* size);
|
||||||
*/
|
*/
|
||||||
int dname_lab_cmp(uint8_t* d1, int labs1, uint8_t* d2, int labs2, int* mlabs);
|
int dname_lab_cmp(uint8_t* d1, int labs1, uint8_t* d2, int labs2, int* mlabs);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if labels starts with given prefix
|
||||||
|
* @param label: dname label
|
||||||
|
* @param prefix: the string to match label with, null terminated.
|
||||||
|
* @param endptr: pointer to location in label after prefix, only if return
|
||||||
|
* value is 1. NULL if nothing in the label after the prefix, i.e. prefix
|
||||||
|
* and label are the same.
|
||||||
|
* @return: 1 if label starts with prefix, else 0
|
||||||
|
*/
|
||||||
|
int dname_lab_startswith(uint8_t* label, char* prefix, char** endptr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* See if domain name d1 is a strict subdomain of d2.
|
* See if domain name d1 is a strict subdomain of d2.
|
||||||
* That is a subdomain, but not equal.
|
* That is a subdomain, but not equal.
|
||||||
|
|
|
||||||
|
|
@ -253,6 +253,7 @@ sec_status_to_string(enum sec_status s)
|
||||||
case sec_status_bogus: return "sec_status_bogus";
|
case sec_status_bogus: return "sec_status_bogus";
|
||||||
case sec_status_indeterminate: return "sec_status_indeterminate";
|
case sec_status_indeterminate: return "sec_status_indeterminate";
|
||||||
case sec_status_insecure: return "sec_status_insecure";
|
case sec_status_insecure: return "sec_status_insecure";
|
||||||
|
case sec_status_secure_sentinel_fail: return "sec_status_secure_sentinel_fail";
|
||||||
case sec_status_secure: return "sec_status_secure";
|
case sec_status_secure: return "sec_status_secure";
|
||||||
}
|
}
|
||||||
return "unknown_sec_status_value";
|
return "unknown_sec_status_value";
|
||||||
|
|
|
||||||
|
|
@ -187,6 +187,10 @@ enum sec_status {
|
||||||
* insecure. Generally this means that this RRset is below a trust
|
* insecure. Generally this means that this RRset is below a trust
|
||||||
* anchor, but also below a verified, insecure delegation. */
|
* anchor, but also below a verified, insecure delegation. */
|
||||||
sec_status_insecure,
|
sec_status_insecure,
|
||||||
|
/** SECURE_SENTINEL_FAIL means that the object (RRset or message)
|
||||||
|
* validated according to local policy but did not succeed in the root
|
||||||
|
* KSK sentinel test (draft-ietf-dnsop-kskroll-sentinel). */
|
||||||
|
sec_status_secure_sentinel_fail,
|
||||||
/** SECURE means that the object (RRset or message) validated
|
/** SECURE means that the object (RRset or message) validated
|
||||||
* according to local policy. */
|
* according to local policy. */
|
||||||
sec_status_secure
|
sec_status_secure
|
||||||
|
|
|
||||||
|
|
@ -1309,3 +1309,44 @@ anchor_list_keytags(struct trust_anchor* ta, uint16_t* list, size_t num)
|
||||||
qsort(list, ret, sizeof(*list), keytag_compare);
|
qsort(list, ret, sizeof(*list), keytag_compare);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
anchor_has_keytag(struct val_anchors* anchors, uint8_t* name, int namelabs,
|
||||||
|
size_t namelen, uint16_t dclass, uint16_t keytag)
|
||||||
|
{
|
||||||
|
uint16_t* taglist;
|
||||||
|
uint16_t* tl;
|
||||||
|
size_t numtag, i;
|
||||||
|
struct trust_anchor* anchor = anchor_find(anchors,
|
||||||
|
name, namelabs, namelen, dclass);
|
||||||
|
if(!anchor)
|
||||||
|
return 0;
|
||||||
|
if(!anchor->numDS && !anchor->numDNSKEY) {
|
||||||
|
lock_basic_unlock(&anchor->lock);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
taglist = calloc(anchor->numDS + anchor->numDNSKEY, sizeof(*taglist));
|
||||||
|
if(!taglist) {
|
||||||
|
lock_basic_unlock(&anchor->lock);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
numtag = anchor_list_keytags(anchor, taglist,
|
||||||
|
anchor->numDS+anchor->numDNSKEY);
|
||||||
|
lock_basic_unlock(&anchor->lock);
|
||||||
|
if(!numtag) {
|
||||||
|
free(taglist);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
tl = taglist;
|
||||||
|
for(i=0; i<numtag; i++) {
|
||||||
|
if(*tl == keytag) {
|
||||||
|
free(taglist);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
tl++;
|
||||||
|
}
|
||||||
|
free(taglist);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -227,4 +227,19 @@ void anchors_delete_insecure(struct val_anchors* anchors, uint16_t c,
|
||||||
*/
|
*/
|
||||||
size_t anchor_list_keytags(struct trust_anchor* ta, uint16_t* list, size_t num);
|
size_t anchor_list_keytags(struct trust_anchor* ta, uint16_t* list, size_t num);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if there is a trust anchor for given zone with this keytag.
|
||||||
|
*
|
||||||
|
* @param anchors: anchor storage
|
||||||
|
* @param name: name of trust anchor (wireformat)
|
||||||
|
* @param namelabs: labels in name
|
||||||
|
* @param namelen: length of name
|
||||||
|
* @param dclass: class of trust anchor
|
||||||
|
* @param keytag: keytag
|
||||||
|
* @return 1 if there is a trust anchor in the trustachor store for this zone
|
||||||
|
* and keytag, else 0.
|
||||||
|
*/
|
||||||
|
int anchor_has_keytag(struct val_anchors* anchors, uint8_t* name, int namelabs,
|
||||||
|
size_t namelen, uint16_t dclass, uint16_t keytag);
|
||||||
|
|
||||||
#endif /* VALIDATOR_VAL_ANCHOR_H */
|
#endif /* VALIDATOR_VAL_ANCHOR_H */
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@
|
||||||
* According to RFC 4034.
|
* According to RFC 4034.
|
||||||
*/
|
*/
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include <ctype.h>
|
||||||
#include "validator/validator.h"
|
#include "validator/validator.h"
|
||||||
#include "validator/val_anchor.h"
|
#include "validator/val_anchor.h"
|
||||||
#include "validator/val_kcache.h"
|
#include "validator/val_kcache.h"
|
||||||
|
|
@ -477,6 +478,31 @@ generate_keytag_query(struct module_qstate* qstate, int id,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get keytag as uint16_t from string
|
||||||
|
*
|
||||||
|
* @param start: start of string containing keytag
|
||||||
|
* @param keytag: pointer where to store the extracted keytag
|
||||||
|
* @return: 1 if keytag was extracted, else 0.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
sentinel_get_keytag(char* start, uint16_t* keytag) {
|
||||||
|
char* keytag_str;
|
||||||
|
char* e = NULL;
|
||||||
|
keytag_str = calloc(1, SENTINEL_KEYTAG_LEN + 1 /* null byte */);
|
||||||
|
if(!keytag_str)
|
||||||
|
return 0;
|
||||||
|
strncpy(keytag_str, start, SENTINEL_KEYTAG_LEN);
|
||||||
|
keytag_str[SENTINEL_KEYTAG_LEN] = '\0';
|
||||||
|
*keytag = (uint16_t)strtol(keytag_str, &e, 10);
|
||||||
|
if(!e || *e != '\0') {
|
||||||
|
free(keytag_str);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
free(keytag_str);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prime trust anchor for use.
|
* Prime trust anchor for use.
|
||||||
* Generate and dispatch a priming query for the given trust anchor.
|
* Generate and dispatch a priming query for the given trust anchor.
|
||||||
|
|
@ -2223,6 +2249,34 @@ processFinished(struct module_qstate* qstate, struct val_qstate* vq,
|
||||||
vq->orig_msg->rep->security = sec_status_indeterminate;
|
vq->orig_msg->rep->security = sec_status_indeterminate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(vq->orig_msg->rep->security == sec_status_secure &&
|
||||||
|
qstate->env->cfg->root_key_sentinel &&
|
||||||
|
(qstate->qinfo.qtype == LDNS_RR_TYPE_A ||
|
||||||
|
qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA)) {
|
||||||
|
char* keytag_start;
|
||||||
|
uint16_t keytag;
|
||||||
|
if(*qstate->qinfo.qname == strlen(SENTINEL_IS) +
|
||||||
|
SENTINEL_KEYTAG_LEN &&
|
||||||
|
dname_lab_startswith(qstate->qinfo.qname, SENTINEL_IS,
|
||||||
|
&keytag_start)) {
|
||||||
|
if(sentinel_get_keytag(keytag_start, &keytag) &&
|
||||||
|
!anchor_has_keytag(qstate->env->anchors,
|
||||||
|
(uint8_t*)"", 1, 0, vq->qchase.qclass, keytag)) {
|
||||||
|
vq->orig_msg->rep->security =
|
||||||
|
sec_status_secure_sentinel_fail;
|
||||||
|
}
|
||||||
|
} else if(*qstate->qinfo.qname == strlen(SENTINEL_NOT) +
|
||||||
|
SENTINEL_KEYTAG_LEN &&
|
||||||
|
dname_lab_startswith(qstate->qinfo.qname, SENTINEL_NOT,
|
||||||
|
&keytag_start)) {
|
||||||
|
if(sentinel_get_keytag(keytag_start, &keytag) &&
|
||||||
|
anchor_has_keytag(qstate->env->anchors,
|
||||||
|
(uint8_t*)"", 1, 0, vq->qchase.qclass, keytag)) {
|
||||||
|
vq->orig_msg->rep->security =
|
||||||
|
sec_status_secure_sentinel_fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
/* store results in cache */
|
/* store results in cache */
|
||||||
if(qstate->query_flags&BIT_RD) {
|
if(qstate->query_flags&BIT_RD) {
|
||||||
/* if secure, this will override cache anyway, no need
|
/* if secure, this will override cache anyway, no need
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,13 @@ struct config_strlist;
|
||||||
/** max number of query restarts, number of IPs to probe */
|
/** max number of query restarts, number of IPs to probe */
|
||||||
#define VAL_MAX_RESTART_COUNT 5
|
#define VAL_MAX_RESTART_COUNT 5
|
||||||
|
|
||||||
|
/** Root key sentinel is ta preamble */
|
||||||
|
#define SENTINEL_IS "root-key-sentinel-is-ta-"
|
||||||
|
/** Root key sentinel is not ta preamble */
|
||||||
|
#define SENTINEL_NOT "root-key-sentinel-not-ta-"
|
||||||
|
/** Root key sentinal keytag length */
|
||||||
|
#define SENTINEL_KEYTAG_LEN 5
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Global state for the validator.
|
* Global state for the validator.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue