29 '\0',
'\0',
'\0',
'\0',
35 '\0',
'\0',
'\200',
'\0',
44 for (i = 0; i < 12; i++)
56 byte_copy(
query,2,
d->nonce + 8);
59 byte_copy(
query + 2,10,
d->flagrecursive ?
"\1\0\0\1\0\0\0\0\0\1" : \
60 "\0\0\0\1\0\0\0\0\0\1");
62 byte_copy(
query + 2,10,
d->flagrecursive ?
"\1\0\0\1\0\0\0\0\0\0" : \
63 "\0\0\0\1\0\0\0\0\0\0");
88 unsigned int suffixlen;
93 byte_copy(
d->query + 2,2,
d->nonce + 8);
99 byte_copy(nonce,12,
d->nonce);
100 byte_zero(nonce + 12,12);
107 (
const unsigned char *) nonce,(
const unsigned char *) key);
111 uint16_pack_big(
d->query,
len + 84);
112 byte_copy(
d->query + 2,8,
"Q6fnvWj8");
113 byte_copy(
d->query + 10,
KEY_LEN,
d->pubkey);
114 byte_copy(
d->query + 42,12,nonce);
119 byte_copy(
d->query +
d->querylen -
len - 44,12,nonce);
124 uint16_pack_big(
d->query,
d->querylen - 2);
127 byte_copy(
d->query + 4,10,
"\0\0\0\1\0\0\0\0\0\0");
130 byte_copy(
d->query + 69 + m,suffixlen,
d->suffix);
146 unsigned int namelen;
148 if (!
d->keys)
return 0;
154 if (
len < 48)
return 1;
155 if (byte_diff(
buf,8,
"R6fnvWJ8"))
return 1;
156 if (byte_diff(
buf + 8,12,
d->nonce))
return 1;
157 byte_copy(nonce,24,
buf + 8);
158 byte_zero(
buf + 16,16);
161 (
const uint8 *) nonce,(
const uint8 *) key))
return 1;
170 if (byte_diff(
out,2,
d->query + 2))
return 1;
171 if (byte_diff(
out + 2,10,
"\204\0\0\1\0\1\0\0\0\0"))
return 1;
178 if (byte_diff(
out,14,
"\0\20\0\1\300\14\0\20\0\1\0\0\0\0"))
return 1;
179 uint16_unpack_big(
out + 14,&datalen);
180 if (datalen >
len - pos)
return 1;
184 for (i = 0; i < datalen; ++i) {
187 txtlen = (
unsigned char) ch;
193 if (txtlen)
return 1;
196 byte_copy(nonce,12,
d->nonce);
197 byte_copy(nonce + 12,12,
buf + 4);
201 (
const unsigned char *) nonce,(
const unsigned char *) key))
return 1;
212 while ((
c = *dn++)) {
214 if (!case_diffb(dn,3,
"uz5"))
217 dn += (
unsigned int)
c;
232 byte_copy(
tmp,16,s + (i << 4));
233 byte_copy(s + (i << 4),16,s + (n << 4));
234 byte_copy(s + (n << 4),16,
tmp);
236 byte_copy(
t + (i << 5),
KEY_LEN,
t + (n << 5));
245 int flagcurvetxt = 0;
252 if (flagns == 1)
return 1;
254 if (flagns == -1) flagnskey = 0;
258 if (
z->flagnskeys[
z->level - 1]) {
259 if (!flagnskey)
goto IPONLY;
260 }
else if (flagnskey) {
263 z->flagnskeys[
z->level - 1] = 1;
268 z->ctx[
z->level - 1][n] =
'd';
269 if (flagedns == 1)
z->ctx[
z->level - 1][n] =
'e';
270 if (flagedns == 2)
z->ctx[
z->level - 1][n] =
's';
271 if (flagnskey)
z->ctx[
z->level - 1][n] =
'c';
272 if (flagnskey && flagcurvetxt)
z->ctx[
z->level - 1][n] =
't';
274 if (byte_equal(
z->servers[
z->level - 1] + k,16,addr))
return flagns;
276 if (byte_equal(
z->servers[
z->level - 1] + k,16,V6localnet)) {
277 byte_copy(
z->servers[
z->level - 1] + k,16,addr);
278 if (flagnskey) byte_copy(
z->keys[
z->level - 1] + 2 * k,
KEY_LEN,key);
287 char qflags[2],
const char *q,
const char qtype[2],
const char localip[16],\
291 unsigned int suffixlen;
293 int flagrecursive = qflags[0];
294 int flagedns = qflags[1];
301 d->querylen =
len + 18;
302 if (flagedns)
d->querylen += 11;
304 d->querylen =
len + 86;
308 d->querylen = m + suffixlen + 73;
311 d->query = alloc(
d->querylen);
315 byte_copy(
d->qtype,2,qtype);
317 byte_copy(
d->localip,16,localip);
318 d->flagrecursive = flagrecursive;
319 d->flagedns = flagedns;
325 uint16_pack_big(
d->query,
len + 16);
327 d->name =
d->query + 14;
329 d->udploop = flagrecursive ? 1 : 0;
unsigned int base32_bytessize(unsigned int len)
void base32_clientkey(uint8 *out, const char *key)
unsigned int base32_decode(uint8 *out, const char *in, unsigned int len, int mode)
void base32_encode(uint8 *out, const char *in, unsigned int len)
#define crypto_box_afternm
#define crypto_box_open_afternm
int cns_transmit_start(struct dns_transmit *d, const char servers[QUERY_MAXIPLEN], char qflags[2], const char *q, const char qtype[2], const char localip[16], const char keys[QUERY_MAXNS *KEY_LEN], const char pubkey[KEY_LEN], const char *suffix)
void dns_basequery(struct dns_transmit *d, char *query)
void cns_sortns(char *s, char *t, unsigned int n)
void cns_query(struct dns_transmit *d)
void cns_nonce(char nonce[12])
unsigned int udp_msgsize(void)
int cns_uncurve(const struct dns_transmit *d, char *buf, unsigned int *lenp)
int cns_pubkey(const char *dn, char *key)
int cns_addns(struct query *z, const char *addr, int flagnskey, const char *key)
unsigned int dns_domain_length(const char *dn)
unsigned int dns_packet_copy(const char *buf, unsigned int len, unsigned int pos, char *out, unsigned int outlen)
unsigned int dns_random(unsigned int n)
void dns_transmit_free(struct dns_transmit *d)
int firstudp(struct dns_transmit *d)
int firsttcp(struct dns_transmit *d)
struct tcpclient t[QUERY_MAXTCP]
char servers[QUERY_MAXIPLEN]
void out(const char *s, unsigned int len)
void c(const char *home, const char *subdir, const char *file, int uid, int gid, int mode)
void d(const char *home, const char *subdir, int uid, int gid, int mode)
void z(char *home, char *subdir, char *file, int len, int uid, int gid, int mode)