29 for (i = 0; i < 12; i++)
41 byte_copy(
query,2,
d->nonce + 8);
43 byte_copy(
query + 2,10,
d->flagrecursive ?
"\1\0\0\1\0\0\0\0\0\0" : \
44 "\0\0\0\1\0\0\0\0\0\0gcc-bug-workaround");
58 unsigned int suffixlen;
63 byte_copy(
d->query + 2,2,
d->nonce + 8);
69 byte_copy(nonce,12,
d->nonce);
70 byte_zero(nonce + 12,12);
71 key =
d->keys + 32 *
d->curserver;
73 byte_zero(
d->query,32);
77 (
const unsigned char *) nonce,(
const unsigned char *) key);
80 byte_copyr(
d->query + 54,
len + 32,
d->query + 16);
81 uint16_pack_big(
d->query,
len + 84);
82 byte_copy(
d->query + 2,8,
"Q6fnvWj8");
83 byte_copy(
d->query + 10,32,
d->pubkey);
84 byte_copy(
d->query + 42,12,nonce);
88 byte_copyr(
d->query +
d->querylen -
len - 32,
len + 32,
d->query + 16);
89 byte_copy(
d->query +
d->querylen -
len - 44,12,nonce);
94 uint16_pack_big(
d->query,
d->querylen - 2);
97 byte_copy(
d->query + 4,10,
"\0\0\0\1\0\0\0\0\0\0");
100 byte_copy(
d->query + 69 + m,suffixlen,
d->suffix);
116 unsigned int namelen;
118 if (!
d->keys)
return 0;
120 key =
d->keys + 32 *
d->curserver;
124 if (
len < 48)
return 1;
125 if (byte_diff(
buf,8,
"R6fnvWJ8"))
return 1;
126 if (byte_diff(
buf + 8,12,
d->nonce))
return 1;
127 byte_copy(nonce,24,
buf + 8);
128 byte_zero(
buf + 16,16);
131 (
const uint8 *) nonce,(
const uint8 *) key))
return 1;
140 if (byte_diff(
out,2,
d->query + 2))
return 1;
141 if (byte_diff(
out + 2,10,
"\204\0\0\1\0\1\0\0\0\0"))
return 1;
148 if (byte_diff(
out,14,
"\0\20\0\1\300\14\0\20\0\1\0\0\0\0"))
return 1;
149 uint16_unpack_big(
out + 14,&datalen);
150 if (datalen >
len - pos)
return 1;
154 for (i = 0; i < datalen; ++i) {
157 txtlen = (
unsigned char) ch;
163 if (txtlen)
return 1;
165 if (j < 32)
return 1;
166 byte_copy(nonce,12,
d->nonce);
167 byte_copy(nonce + 12,12,
buf + 4);
171 (
const unsigned char *) nonce,(
const unsigned char *) key))
return 1;
172 byte_copy(
buf,j - 32,
buf + 32);
182 while ((
c = *dn++)) {
184 if (!case_diffb(dn,3,
"uz5"))
187 dn += (
unsigned int)
c;
202 byte_copy(
tmp,16,s + (i << 4));
203 byte_copy(s + (i << 4),16,s + (n << 4));
204 byte_copy(s + (n << 4),16,
tmp);
206 byte_copy(
tmp,32,
t + (i << 5));
207 byte_copy(
t + (i << 5),32,
t + (n << 5));
208 byte_copy(
t + (n << 5),32,
tmp);
219 if (flagns == 1)
return 1;
220 if (flagns == -1) flagnskey = 0;
223 if (
z->flagnskeys[
z->level - 1]) {
224 if (!flagnskey)
goto IPONLY;
225 }
else if (flagnskey) {
227 byte_zero(
z->keys[
z->level - 1],1024);
228 z->flagnskeys[
z->level - 1] = 1;
234 if (byte_equal(
z->servers[
z->level - 1] + k,16,addr))
return flagns;
235 if (byte_equal(
z->servers[
z->level - 1] + k,16,V6localnet)) {
236 byte_copy(
z->servers[
z->level - 1] + k,16,addr);
237 if (flagnskey) byte_copy(
z->keys[
z->level - 1] + 2 * k,32,key);
247 int flagrecursive,
const char *q,
const char qtype[2], \
248 const char localip[16],\
249 const char keys[1024],
const char pubkey[32],
const char *suffix)
252 unsigned int suffixlen;
260 d->querylen =
len + 18;
262 d->querylen =
len + 86;
266 d->querylen = m + suffixlen + 73;
269 d->query = alloc(
d->querylen);
273 byte_copy(
d->qtype,2,qtype);
275 byte_copy(
d->localip,16,localip);
276 d->flagrecursive = flagrecursive;
282 uint16_pack_big(
d->query,
len + 16);
284 d->name =
d->query + 14;
286 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)
int cns_pubkey(const char *dn, char key[32])
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_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)