From 696792f08106e5bea4a8847e394401c1a68ecf9c Mon Sep 17 00:00:00 2001 From: manuel Date: Mon, 7 Aug 2023 16:33:27 +0200 Subject: add dns_tlsa(...) and dnstlsa utility --- dns.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'dns.c') diff --git a/dns.c b/dns.c index bed2bd2..b4d106c 100644 --- a/dns.c +++ b/dns.c @@ -418,3 +418,44 @@ unsigned long random; alloc_free(mx); return flagsoft; } + +int dns_tlsa(stralloc *out, const stralloc *fqdn) +{ + int ranswers = 0; + + switch(resolve(fqdn, T_TLSA)) + { + case DNS_MEM: return DNS_MEM; + case DNS_SOFT: return DNS_SOFT; + case DNS_HARD: return DNS_HARD; + } + + if (!stralloc_copys(out,"")) return DNS_MEM; + while(numanswers-- > 0) { + int i; + if (responsepos == responseend) return DNS_SOFT; + + i = dn_expand(response.buf, responseend, responsepos, name, MAXDNAME); + if (i < 0) return DNS_SOFT; + responsepos += i; + + i = responseend - responsepos; + if (i < 4 + 3 * 2) return DNS_SOFT; + + unsigned short rrtype = getshort(responsepos); + unsigned short rrdlen = getshort(responsepos + 8); + responsepos += 10; // skip dns header + if (responsepos + rrdlen > responseend) return DNS_HARD; + + if (rrtype == T_TLSA) + { + unsigned char rrlen[2] = { rrdlen >> 8, rrdlen & 0xFF }; + stralloc_catb(out, rrlen, 2); + if (!stralloc_catb(out, responsepos, rrdlen)) return DNS_MEM; + ++ranswers; + } + + responsepos += rrdlen; + } + return ranswers; +} -- cgit v1.2.3