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