summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Watson <cjwatson@debian.org>2014-02-09 16:10:01 +0000
committerColin Watson <cjwatson@debian.org>2018-10-20 22:54:09 +0100
commit0ee33d93c5c7a5fbb8b027aa24e7c9668125fda9 (patch)
tree2cfe63d8c48d48f29b7813a31a94073af8225c17
parentcabad6b7182cd6eaa8b760718200a316e7f578ed (diff)
Force use of DNSSEC even if "options edns0" isn't in resolv.conf
This allows SSHFP DNS records to be verified if glibc 2.11 is installed. Origin: vendor, https://cvs.fedoraproject.org/viewvc/F-12/openssh/openssh-5.2p1-edns.patch?revision=1.1&view=markup Bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=572049 Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=572049 Last-Update: 2010-04-06 Patch-Name: dnssec-sshfp.patch
-rw-r--r--dns.c14
-rw-r--r--openbsd-compat/getrrsetbyname.c10
-rw-r--r--openbsd-compat/getrrsetbyname.h3
3 files changed, 21 insertions, 6 deletions
diff --git a/dns.c b/dns.c
index ff1a2c41c..82ec97199 100644
--- a/dns.c
+++ b/dns.c
@@ -211,6 +211,7 @@ verify_host_key_dns(const char *hostname, struct sockaddr *address,
211{ 211{
212 u_int counter; 212 u_int counter;
213 int result; 213 int result;
214 unsigned int rrset_flags = 0;
214 struct rrsetinfo *fingerprints = NULL; 215 struct rrsetinfo *fingerprints = NULL;
215 216
216 u_int8_t hostkey_algorithm; 217 u_int8_t hostkey_algorithm;
@@ -234,8 +235,19 @@ verify_host_key_dns(const char *hostname, struct sockaddr *address,
234 return -1; 235 return -1;
235 } 236 }
236 237
238 /*
239 * Original getrrsetbyname function, found on OpenBSD for example,
240 * doesn't accept any flag and prerequisite for obtaining AD bit in
241 * DNS response is set by "options edns0" in resolv.conf.
242 *
243 * Our version is more clever and use RRSET_FORCE_EDNS0 flag.
244 */
245#ifndef HAVE_GETRRSETBYNAME
246 rrset_flags |= RRSET_FORCE_EDNS0;
247#endif
237 result = getrrsetbyname(hostname, DNS_RDATACLASS_IN, 248 result = getrrsetbyname(hostname, DNS_RDATACLASS_IN,
238 DNS_RDATATYPE_SSHFP, 0, &fingerprints); 249 DNS_RDATATYPE_SSHFP, rrset_flags, &fingerprints);
250
239 if (result) { 251 if (result) {
240 verbose("DNS lookup error: %s", dns_result_totext(result)); 252 verbose("DNS lookup error: %s", dns_result_totext(result));
241 return -1; 253 return -1;
diff --git a/openbsd-compat/getrrsetbyname.c b/openbsd-compat/getrrsetbyname.c
index dc6fe0533..e061a290a 100644
--- a/openbsd-compat/getrrsetbyname.c
+++ b/openbsd-compat/getrrsetbyname.c
@@ -209,8 +209,8 @@ getrrsetbyname(const char *hostname, unsigned int rdclass,
209 goto fail; 209 goto fail;
210 } 210 }
211 211
212 /* don't allow flags yet, unimplemented */ 212 /* Allow RRSET_FORCE_EDNS0 flag only. */
213 if (flags) { 213 if ((flags & !RRSET_FORCE_EDNS0) != 0) {
214 result = ERRSET_INVAL; 214 result = ERRSET_INVAL;
215 goto fail; 215 goto fail;
216 } 216 }
@@ -226,9 +226,9 @@ getrrsetbyname(const char *hostname, unsigned int rdclass,
226#endif /* DEBUG */ 226#endif /* DEBUG */
227 227
228#ifdef RES_USE_DNSSEC 228#ifdef RES_USE_DNSSEC
229 /* turn on DNSSEC if EDNS0 is configured */ 229 /* turn on DNSSEC if required */
230 if (_resp->options & RES_USE_EDNS0) 230 if (flags & RRSET_FORCE_EDNS0)
231 _resp->options |= RES_USE_DNSSEC; 231 _resp->options |= (RES_USE_EDNS0|RES_USE_DNSSEC);
232#endif /* RES_USE_DNSEC */ 232#endif /* RES_USE_DNSEC */
233 233
234 /* make query */ 234 /* make query */
diff --git a/openbsd-compat/getrrsetbyname.h b/openbsd-compat/getrrsetbyname.h
index 1283f5506..dbbc85a2a 100644
--- a/openbsd-compat/getrrsetbyname.h
+++ b/openbsd-compat/getrrsetbyname.h
@@ -72,6 +72,9 @@
72#ifndef RRSET_VALIDATED 72#ifndef RRSET_VALIDATED
73# define RRSET_VALIDATED 1 73# define RRSET_VALIDATED 1
74#endif 74#endif
75#ifndef RRSET_FORCE_EDNS0
76# define RRSET_FORCE_EDNS0 0x0001
77#endif
75 78
76/* 79/*
77 * Return codes for getrrsetbyname() 80 * Return codes for getrrsetbyname()