Skip to content

Commit

Permalink
Support TLSA records.
Browse files Browse the repository at this point in the history
  • Loading branch information
vstakhov committed Mar 27, 2014
1 parent 38f3dc8 commit 495ef96
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 5 deletions.
10 changes: 9 additions & 1 deletion include/rdns.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ enum rdns_request_type {
DNS_REQUEST_TXT = 0x1 << 3,
DNS_REQUEST_SRV = 0x1 << 4,
DNS_REQUEST_SPF = 0x1 << 5,
DNS_REQUEST_AAA = 0x1 << 6
DNS_REQUEST_AAAA = 0x1 << 6,
DNS_REQUEST_TLSA = 0x1 << 7
};

union rdns_reply_element_un {
Expand All @@ -73,6 +74,13 @@ union rdns_reply_element_un {
uint16_t port;
char *target;
} srv;
struct {
uint8_t usage;
uint8_t selector;
uint8_t match_type;
uint16_t datalen;
uint8_t *data;
} tlsa;
};

struct rdns_reply_entry {
Expand Down
4 changes: 2 additions & 2 deletions src/dns_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -221,8 +221,8 @@ enum dns_type {
DNS_T_SRV = 33,
DNS_T_OPT = 41,
DNS_T_SSHFP = 44,
DNS_T_TLSA = 52,
DNS_T_SPF = 99,

DNS_T_ALL = 255
};
/* enum dns_type */
Expand Down Expand Up @@ -250,7 +250,7 @@ static const char dns_types[][16] = {
[DNS_REQUEST_TXT] = "TXT request",
[DNS_REQUEST_SRV] = "SRV request",
[DNS_REQUEST_SPF] = "SPF request",
[DNS_REQUEST_AAA] = "AAA request"
[DNS_REQUEST_AAAA] = "AAAA request"
};


Expand Down
18 changes: 17 additions & 1 deletion src/parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ rdns_parse_labels (struct rdns_resolver *resolver,
return true;
}

#define GET8(x) do {(x) = ((*p)); p += sizeof (uint8_t); *remain -= sizeof (uint8_t); } while(0)
#define GET16(x) do {(x) = ((*p) << 8) + *(p + 1); p += sizeof (uint16_t); *remain -= sizeof (uint16_t); } while(0)
#define GET32(x) do {(x) = ((*p) << 24) + ((*(p + 1)) << 16) + ((*(p + 2)) << 8) + *(p + 3); p += sizeof (uint32_t); *remain -= sizeof (uint32_t); } while(0)
#define SKIP(type) do { p += sizeof(type); *remain -= sizeof(type); } while (0)
Expand Down Expand Up @@ -278,7 +279,7 @@ rdns_parse_rr (struct rdns_resolver *resolver,
p += datalen;
*remain -= datalen;
parsed = true;
elt->type = DNS_REQUEST_AAA;
elt->type = DNS_REQUEST_AAAA;
}
else {
rdns_info ("corrupted AAAA record");
Expand Down Expand Up @@ -343,6 +344,21 @@ rdns_parse_rr (struct rdns_resolver *resolver,
parsed = true;
elt->type = DNS_REQUEST_SRV;
break;
case DNS_T_TLSA:
if (p - *pos > (int)(*remain - sizeof (uint8_t) * 3)) {
rdns_info ("stripped dns reply while reading TLSA record");
return -1;
}
GET8 (elt->content.tlsa.usage);
GET8 (elt->content.tlsa.selector);
GET8 (elt->content.tlsa.match_type);
datalen -= 3;
elt->content.tlsa.data = malloc (datalen);
elt->content.tlsa.datalen = datalen;
memcpy (elt->content.tlsa.data, p, datalen);
parsed = true;
elt->type = DNS_REQUEST_TLSA;
break;
case DNS_T_CNAME:
/* Skip cname records */
p += datalen;
Expand Down
5 changes: 4 additions & 1 deletion src/resolver.c
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,7 @@ rdns_make_request_full (
case DNS_REQUEST_A:
rdns_add_rr (req, name, DNS_T_A);
break;
case DNS_REQUEST_AAA:
case DNS_REQUEST_AAAA:
rdns_add_rr (req, name, DNS_T_AAAA);
break;
case DNS_REQUEST_TXT:
Expand All @@ -514,6 +514,9 @@ rdns_make_request_full (
case DNS_REQUEST_SRV:
rdns_add_rr (req, name, DNS_T_SRV);
break;
case DNS_REQUEST_TLSA:
rdns_add_rr (req, name, DNS_T_TLSA);
break;
}
}
va_end (args);
Expand Down

0 comments on commit 495ef96

Please sign in to comment.