1 #ifndef _DNS_H____
2 #define _DNS_H____
3 
4 #include <poll.h>
5 #include "stralloc.h"
6 
7 #define DNS_C_IN (unsigned char *)"\0\1"
8 #define DNS_C_ANY (unsigned char *)"\0\377"
9 
10 #define DNS_T_A (unsigned char *)"\0\1"
11 #define DNS_T_NS (unsigned char *)"\0\2"
12 #define DNS_T_CNAME (unsigned char *)"\0\5"
13 #define DNS_T_SOA (unsigned char *)"\0\6"
14 #define DNS_T_PTR (unsigned char *)"\0\14"
15 #define DNS_T_MX (unsigned char *)"\0\17"
16 #define DNS_T_TXT (unsigned char *)"\0\20"
17 #define DNS_T_AAAA (unsigned char *)"\0\34"
18 #define DNS_T_SRV (unsigned char *)"\0\41"
19 #define DNS_T_AXFR (unsigned char *)"\0\374"
20 #define DNS_T_ANY (unsigned char *)"\0\377"
21 
22 #define DNS_MAGICQ (unsigned char *)"Q6fnvWj8"
23 #define DNS_MAGICR (unsigned char *)"R6fnvWJ8"
24 
25 struct dns_transmit {
26     unsigned char *query; /* 0, or dynamically allocated */
27     long long querylen;
28     unsigned char *packet; /* 0, or dynamically allocated */
29     long long packetlen;
30     int s1; /* 0, or 1 + an open file descriptor */
31     int s1type;
32     long long tcpstate;
33     long long udploop;
34     long long curserver;
35     long long deadline;
36     long long pos;
37     const unsigned char *servers;
38     unsigned char localip[32];
39     unsigned char qtype[2];
40     unsigned char port[2];
41     long long scope_id;
42 
43     long long paddinglen;
44     unsigned char id[2];
45     unsigned char nonce[12];
46     const unsigned char *keys;
47     const unsigned char *pk;
48     const unsigned char *suffix;
49     const unsigned char *name;
50     int flagrecursive;
51     int flagipv4only;
52 };
53 
54 #define DNS_HASKEY(d) (d->keys && *(d->keys + 33 * d->curserver))
55 #define DNS_ISTXT(d) (d->keys && (*(d->keys + 33 * d->curserver) == 2))
56 #define DNS_KEYPTR(d) d->keys + 33 * d->curserver + 1
57 
58 /* dns_domain */
59 extern void dns_domain_free(unsigned char **);
60 extern int dns_domain_copy(unsigned char **, const unsigned char *);
61 extern long long dns_domain_length(const unsigned char *);
62 extern int dns_domain_equal(const unsigned char *, const unsigned char *);
63 extern int dns_domain_suffix(const unsigned char *, const unsigned char *);
64 extern long long dns_domain_suffixpos(const unsigned char *, const unsigned char *);
65 extern int dns_domain_fromdot(unsigned char **, const unsigned char *, long long);
66 extern int dns_domain_fromdot_static(unsigned char *, const unsigned char *, long long);
67 extern int dns_domain_todot_cat(stralloc *, const unsigned char *);
68 
69 /* dns_packet */
70 extern long long dns_packet_copy(const unsigned char *,long long,long long,unsigned char *,long long);
71 extern long long dns_packet_getname(const unsigned char *,long long,long long,unsigned char **);
72 extern long long dns_packet_skipname(const unsigned char *,long long,long long);
73 extern long long dns_packet_getname_static(const unsigned char *,long long,long long,unsigned char *);
74 
75 /* dns_transmit */
76 extern int dns_transmit_start(struct dns_transmit *d, const unsigned char servers[256], int flagrecursive, const unsigned char *q, const unsigned char qtype[2], const unsigned char localip[32]);
77 extern int dns_transmit_startext(struct dns_transmit *d, const unsigned char servers[256], int flagrecursive, int flagtcp, int flagipv4only, const unsigned char *q, const unsigned char qtype[2], const unsigned char localip[32], const unsigned char port[2], const unsigned char keys[528], const unsigned char pk[32], const unsigned char *suffix);
78 
79 extern void dns_transmit_free(struct dns_transmit *);
80 extern void dns_transmit_io(struct dns_transmit *,struct pollfd *,long long *);
81 extern int dns_transmit_get(struct dns_transmit *,const struct pollfd *,const long long);
82 
83 extern void dns_transmit_magic(const char *, const char *);
84 
85 
86 /* dns_data */
87 struct dns_data {
88 
89     /* ---- OUTPUT */
90 
91     /* name */
92     unsigned char *name;
93     stralloc fqdn;
94 
95     /* result */
96     stralloc result;
97 
98     /* keys */
99     unsigned char *curvecpkey;
100     unsigned char *dnscurvekey;
101 
102     /* ---- INPUT */
103 
104     /* options */
105     char curvecpselector;
106 };
107 
108 extern void dns_data_free(struct dns_data *);
109 
110 extern int dns_resolvconfip(unsigned char *);
111 extern int dns_resolve(const unsigned char *q, const unsigned char qtype[2]);
112 extern struct dns_transmit dns_resolve_tx;
113 extern int dns_ip(struct dns_data *, const char *);
114 extern int dns_ip4(struct dns_data *, const char *);
115 extern int dns_ip6(struct dns_data *, const char *);
116 
117 extern int dns_resolvconfrewrite(stralloc *);
118 extern int dns_ip_qualify(struct dns_data *, const char *);
119 extern int dns_ip4_qualify(struct dns_data *, const char *);
120 extern int dns_ip6_qualify(struct dns_data *, const char *);
121 
122 #define DNS_IPTONAME_LEN 73
123 extern char *dns_iptoname(char *, const unsigned char *);
124 
125 /* utils */
126 extern void dns_sortip4(unsigned char *, long long);
127 extern void dns_sortip(unsigned char *, long long);
128 extern void dns_sortipkey(unsigned char *, unsigned char *, long long);
129 
130 /*base32 */
131 extern long long dns_base32_bytessize(long long);
132 extern void dns_base32_encodebytes(unsigned char *, const unsigned char *, long long);
133 extern void dns_base32_encodekey(unsigned char *, const unsigned char *);
134 extern long long base32_decode(unsigned char *, const unsigned char *, long long, int);
135 
136 /* nonce */
137 extern void dns_nonce_purge(void);
138 extern int dns_nonce_init(const char *, const unsigned char *);
139 extern void dns_nonce(unsigned char *);
140 
141 /* verbose */
142 extern int dns_verbosity_flag;
143 extern const char *dns_verbosity_message;
144 extern void dns_verbosity_setflag(int);
145 extern void dns_verbosity_setmessage(const char *);
146 extern void dns_verbosity_writehex(const char *, const unsigned char *, long long);
147 extern void dns_verbosity_writedomain(const char *, unsigned char *);
148 extern void dns_verbosity_resolving(const char *);
149 extern void dns_verbosity_resolved(struct dns_data *, const char *);
150 extern void dns_verbosity_querysent(struct dns_transmit *, int);
151 extern void dns_verbosity_queryfailed(struct dns_transmit *, int);
152 extern void dns_verbosity_queryfailedtc(struct dns_transmit *);
153 extern void dns_verbosity_queryok(struct dns_transmit *);
154 
155 /* keys */
156 extern void dns_keys_derive(unsigned char *, long long, unsigned char *);
157 
158 #endif
159