25 '\0',
'\0',
'\0',
'\0',
32 for (i = 0; i < 12; i++)
44 byte_copy(
query,2,
d->nonce + 8);
47 byte_copy(
query + 2,10,
d->flagrecursive ?
"\1\0\0\1\0\0\0\0\0\1" : \
48 "\0\0\0\1\0\0\0\0\0\1");
50 byte_copy(
query + 2,10,
d->flagrecursive ?
"\1\0\0\1\0\0\0\0\0\0" : \
51 "\0\0\0\1\0\0\0\0\0\0");
73 unsigned int suffixlen;
78 byte_copy(
d->query + 2,2,
d->nonce + 8);
84 byte_copy(nonce,12,
d->nonce);
85 byte_zero(nonce + 12,12);
86 key =
d->keys + 32 *
d->curserver;
88 byte_zero(
d->query,32);
92 (
const unsigned char *) nonce,(
const unsigned char *) key);
95 byte_copyr(
d->query + 54,
len + 32,
d->query + 16);
96 uint16_pack_big(
d->query,
len + 84);
97 byte_copy(
d->query + 2,8,
"Q6fnvWj8");
98 byte_copy(
d->query + 10,32,
d->pubkey);
99 byte_copy(
d->query + 42,12,nonce);
103 byte_copyr(
d->query +
d->querylen -
len - 32,
len + 32,
d->query + 16);
104 byte_copy(
d->query +
d->querylen -
len - 44,12,nonce);
109 uint16_pack_big(
d->query,
d->querylen - 2);
112 byte_copy(
d->query + 4,10,
"\0\0\0\1\0\0\0\0\0\0");
115 byte_copy(
d->query + 69 + m,suffixlen,
d->suffix);
131 unsigned int namelen;
133 if (!
d->keys)
return 0;
135 key =
d->keys + 32 *
d->curserver;
139 if (
len < 48)
return 1;
140 if (byte_diff(
buf,8,
"R6fnvWJ8"))
return 1;
141 if (byte_diff(
buf + 8,12,
d->nonce))
return 1;
142 byte_copy(nonce,24,
buf + 8);
143 byte_zero(
buf + 16,16);
146 (
const uint8 *) nonce,(
const uint8 *) key))
return 1;
155 if (byte_diff(
out,2,
d->query + 2))
return 1;
156 if (byte_diff(
out + 2,10,
"\204\0\0\1\0\1\0\0\0\0"))
return 1;
163 if (byte_diff(
out,14,
"\0\20\0\1\300\14\0\20\0\1\0\0\0\0"))
return 1;
164 uint16_unpack_big(
out + 14,&datalen);
165 if (datalen >
len - pos)
return 1;
169 for (i = 0; i < datalen; ++i) {
172 txtlen = (
unsigned char) ch;
178 if (txtlen)
return 1;
180 if (j < 32)
return 1;
181 byte_copy(nonce,12,
d->nonce);
182 byte_copy(nonce + 12,12,
buf + 4);
186 (
const unsigned char *) nonce,(
const unsigned char *) key))
return 1;
187 byte_copy(
buf,j - 32,
buf + 32);
197 while ((
c = *dn++)) {
199 if (!case_diffb(dn,3,
"uz5"))
202 dn += (
unsigned int)
c;
217 byte_copy(
tmp,16,s + (i << 4));
218 byte_copy(s + (i << 4),16,s + (n << 4));
219 byte_copy(s + (n << 4),16,
tmp);
221 byte_copy(
tmp,32,
t + (i << 5));
222 byte_copy(
t + (i << 5),32,
t + (n << 5));
223 byte_copy(
t + (n << 5),32,
tmp);
234 if (flagns == 1)
return 1;
235 if (flagns == -1) flagnskey = 0;
238 if (
z->flagnskeys[
z->level - 1]) {
239 if (!flagnskey)
goto IPONLY;
240 }
else if (flagnskey) {
242 byte_zero(
z->keys[
z->level - 1],1024);
243 z->flagnskeys[
z->level - 1] = 1;
249 if (byte_equal(
z->servers[
z->level - 1] + k,16,addr))
return flagns;
250 if (byte_equal(
z->servers[
z->level - 1] + k,16,V6localnet)) {
251 byte_copy(
z->servers[
z->level - 1] + k,16,addr);
252 if (flagnskey) byte_copy(
z->keys[
z->level - 1] + 2 * k,32,key);
262 int flagrecursive,
const char *q,
const char qtype[2], \
263 const char localip[16],\
264 const char keys[1024],
const char pubkey[32],
const char *suffix)
267 unsigned int suffixlen;
275 d->querylen =
len + 18;
278 d->querylen =
len + 86;
282 d->querylen = m + suffixlen + 73;
285 d->query = alloc(
d->querylen);
289 byte_copy(
d->qtype,2,qtype);
291 byte_copy(
d->localip,16,localip);
292 d->flagrecursive = flagrecursive;
298 uint16_pack_big(
d->query,
len + 16);
300 d->name =
d->query + 14;
302 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], int flagrecursive, const char *q, const char qtype[2], const char localip[16], const char keys[1024], const char pubkey[32], 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])
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 flagedserver
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)