10 #include "socket_if.h"
23 uint64_pack(nonce,++
x);
36 byte_copy(
query,2,
d->nonce + 8);
37 byte_copy(
query + 2,10,
d->flagrecursive ?
"\1\0\0\1\0\0\0\0\0\0" : \
38 "\0\0\0\1\0\0\0\0\0\0gcc-bug-workaround");
48 byte_zero(
d->query,
d->querylen);
52 d->querylen =
len + 18;
54 uint16_pack_big(
d->query,
len + 16);
55 byte_copy(
d->query + 2,12,
d->flagrecursive ?
"\0\0\1\0\0\1\0\0\0\0\0\0" : \
56 "\0\0\0\0\0\1\0\0\0\0\0\0gcc-bug-workaround");
57 byte_copy(
d->query + 2,2,
d->nonce + 8);
58 byte_copy(
d->query + 14,
len,
d->name);
59 byte_copy(
d->query + 14 +
len,2,
d->qtype);
69 unsigned int suffixlen;
74 byte_copy(
d->query + 2,2,
d->nonce + 8);
80 byte_copy(nonce,12,
d->nonce);
81 byte_zero(nonce + 12,12);
82 key =
d->keys + 32 *
d->curserver;
84 byte_zero(
d->query,32);
88 (
const unsigned char *) nonce,(
const unsigned char *) key);
91 byte_copyr(
d->query + 54,
len + 32,
d->query + 16);
92 uint16_pack_big(
d->query,
len + 84);
93 byte_copy(
d->query + 2,8,
"Q6fnvWj8");
94 byte_copy(
d->query + 10,32,
d->pubkey);
95 byte_copy(
d->query + 42,12,nonce);
99 byte_copyr(
d->query +
d->querylen -
len - 32,
len + 32,
d->query + 16);
100 byte_copy(
d->query +
d->querylen -
len - 44,12,nonce);
105 uint16_pack_big(
d->query,
d->querylen - 2);
108 byte_copy(
d->query + 4,10,
"\0\0\0\1\0\0\0\0\0\0");
111 byte_copy(
d->query + 69 + m,suffixlen,
d->suffix);
127 unsigned int namelen;
129 if (!
d->keys)
return 0;
131 key =
d->keys + 32 *
d->curserver;
135 if (
len < 48)
return 1;
136 if (byte_diff(
buf,8,
"R6fnvWJ8"))
return 1;
137 if (byte_diff(
buf + 8,12,
d->nonce))
return 1;
138 byte_copy(nonce,24,
buf + 8);
139 byte_zero(
buf + 16,16);
141 (
const unsigned char *) nonce,(
const unsigned char *) key))
return 1;
150 if (byte_diff(
out,2,
d->query + 2))
return 1;
151 if (byte_diff(
out + 2,10,
"\204\0\0\1\0\1\0\0\0\0"))
return 1;
158 if (byte_diff(
out,14,
"\0\20\0\1\300\14\0\20\0\1\0\0\0\0"))
return 1;
159 uint16_unpack_big(
out + 14,&datalen);
160 if (datalen >
len - pos)
return 1;
164 for (i = 0; i < datalen; ++i) {
167 txtlen = (
unsigned char) ch;
173 if (txtlen)
return 1;
175 if (j < 32)
return 1;
176 byte_copy(nonce,12,
d->nonce);
177 byte_copy(nonce + 12,12,
buf + 4);
181 (
const unsigned char *) nonce,(
const unsigned char *) key))
return 1;
182 byte_copy(
buf,j - 32,
buf + 32);
191 while ((
c = *dn++)) {
193 if (!case_diffb(dn,3,
"uz5"))
196 dn += (
unsigned int)
c;
211 byte_copy(
tmp,16,s + (i << 4));
212 byte_copy(s + (i << 4),16,s + (n << 4));
213 byte_copy(s + (n << 4),16,
tmp);
215 byte_copy(
tmp,32,
t + (i << 5));
216 byte_copy(
t + (i << 5),32,
t + (n << 5));
217 byte_copy(
t + (n << 5),32,
tmp);
228 if (flagns == 1)
return 1;
229 if (flagns == -1) flagnskey = 0;
232 if (
z->flagnskeys[
z->level - 1]) {
233 if (!flagnskey)
goto IPONLY;
234 }
else if (flagnskey) {
236 byte_zero(
z->keys[
z->level - 1],1024);
237 z->flagnskeys[
z->level - 1] = 1;
243 if (byte_equal(
z->servers[
z->level - 1] + k,16,addr))
return flagns;
244 if (byte_equal(
z->servers[
z->level - 1] + k,16,V6localnet)) {
245 byte_copy(
z->servers[
z->level - 1] + k,16,addr);
247 byte_copy(
z->keys[
z->level - 1] + 2 * k,32,key);
257 int flagrecursive,
const char *q,
const char qtype[2],
const char localip[16], \
258 const char keys[1024],
const char pubkey[32],
const char *suffix)
261 unsigned int suffixlen;
269 d->querylen =
len + 18;
271 d->querylen =
len + 86;
275 d->querylen = m + suffixlen + 73;
278 d->query = alloc(
d->querylen);
282 byte_copy(
d->qtype,2,qtype);
284 byte_copy(
d->localip,16,localip);
285 d->flagrecursive = flagrecursive;
291 uint16_pack_big(
d->query,
len + 16);
293 d->name =
d->query + 14;
295 d->udploop = flagrecursive ? 1 : 0;
unsigned int base32_bytessize(unsigned int len)
void base32_encodebytes(char *out, const char *in, unsigned int len)
unsigned int base32_decode(char *out, const char *in, unsigned int len, int mode)
void base32_encodekey(char *out, const char *key)
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 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])
void cns_basequery(struct dns_transmit *d, char *query)
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)
void cns_altquery(struct dns_transmit *d)
#define crypto_box_afternm
#define crypto_box_open_afternm
void dns_transmit_free(struct dns_transmit *)
unsigned int dns_packet_copy(const char *, unsigned int, unsigned int, char *, unsigned int)
unsigned int dns_random(unsigned int)
int firstudp(struct dns_transmit *)
int firsttcp(struct dns_transmit *)
unsigned int dns_domain_length(const char *)
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)
int serverok(char ip[16])