the seed wasnt saved in the server between it was sent to the client and the client logged in, extracted function for sending version_responses

This commit is contained in:
Bjorn Andersson 2007-02-10 22:17:11 +00:00
parent a49e400ea9
commit c538bd0b6d
1 changed files with 46 additions and 22 deletions

View File

@ -67,68 +67,91 @@ sigint(int sig)
static int static int
tunnel_tun(int tun_fd, int dns_fd) tunnel_tun(int tun_fd, int dns_fd)
{ {
unsigned long outlen;
char out[64*1024]; char out[64*1024];
char in[64*1024]; char in[64*1024];
long outlen;
int read; int read;
if ((read = read_tun(tun_fd, in, sizeof(in))) <= 0) if ((read = read_tun(tun_fd, in, sizeof(in))) <= 0)
return 0; return 0;
outlen = sizeof(out); outlen = sizeof(out);
compress2(out, &outlen, in, read, 9); compress2((uint8_t*)out, &outlen, (uint8_t*)in, read, 9);
memcpy(outpacket.data, out, outlen); memcpy(outpacket.data, out, outlen);
outpacket.len = outlen; outpacket.len = outlen;
return outlen; return outlen;
} }
typedef enum {
VERSION_ACK,
VERSION_NACK
} version_ack_t;
static void
send_version_response(int fd, version_ack_t ack, uint32_t payload)
{
char out[8];
switch (ack) {
case VERSION_ACK:
strncpy(out, "VACK", sizeof(out));
break;
case VERSION_NACK:
strncpy(out, "VNAK", sizeof(out));
break;
}
out[4] = ((payload >> 24) & 0xff);
out[5] = ((payload >> 16) & 0xff);
out[6] = ((payload >> 8) & 0xff);
out[7] = ((payload) & 0xff);
write_dns(fd, &q, out, 8);
}
static int static int
tunnel_dns(int tun_fd, int dns_fd) tunnel_dns(int tun_fd, int dns_fd)
{ {
struct in_addr clientip; struct in_addr clientip;
unsigned long outlen;
struct in_addr myip; struct in_addr myip;
char logindata[16]; char logindata[16];
char out[64*1024]; char out[64*1024];
char in[64*1024]; char in[64*1024];
static int seed;
char *tmp[2]; char *tmp[2];
long outlen; int version;
int read; int read;
int code; int code;
int version;
int seed;
int nseed;
if ((read = read_dns(dns_fd, &q, in, sizeof(in))) <= 0) if ((read = read_dns(dns_fd, &q, in, sizeof(in))) <= 0)
return 0; return 0;
if(in[0] == 'V' || in[0] == 'v') { if(in[0] == 'V' || in[0] == 'v') {
/* Version greeting, compare and send ack/nak */ /* Version greeting, compare and send ack/nak */
if (read >= 5) { if (read > 4) {
/* Received V + 32bits version */ /* Received V + 32bits version */
memcpy(&version, in + 1, 4);
version = ntohl(version); version = (((in[1] & 0xff) << 24) |
((in[2] & 0xff) << 16) |
((in[3] & 0xff) << 8) |
((in[4] & 0xff)));
if (version == VERSION) { if (version == VERSION) {
seed = rand(); seed = rand();
nseed = htonl(seed);
strncpy(out, "VACK", sizeof(out)); send_version_response(dns_fd, VERSION_ACK, seed);
memcpy(out+4, &nseed, 4);
write_dns(dns_fd, &q, out, 8);
} else { } else {
version = htonl(VERSION); send_version_response(dns_fd, VERSION_NACK, VERSION);
strncpy(out, "VNAK", sizeof(out));
memcpy(out+4, &version, 4);
write_dns(dns_fd, &q, out, 8);
} }
} else { } else {
version = htonl(VERSION); send_version_response(dns_fd, VERSION_NACK, VERSION);
strncpy(out, "VNAK", sizeof(out));
memcpy(out+4, &version, 4);
write_dns(dns_fd, &q, out, 8);
} }
} else if(in[0] == 'L' || in[0] == 'l') { } else if(in[0] == 'L' || in[0] == 'l') {
/* Login phase, handle auth */ /* Login phase, handle auth */
login_calculate(logindata, 16, password, seed); login_calculate(logindata, 16, password, seed);
if (read >= 17 && (memcmp(logindata, in+1, 16) == 0)) { if (read >= 17 && (memcmp(logindata, in+1, 16) == 0)) {
/* Login ok, send ip/mtu info */ /* Login ok, send ip/mtu info */
myip.s_addr = my_ip; myip.s_addr = my_ip;
@ -173,7 +196,8 @@ tunnel_dns(int tun_fd, int dns_fd)
if (code & 1) { if (code & 1) {
outlen = sizeof(out); outlen = sizeof(out);
uncompress(out, &outlen, packetbuf.data, packetbuf.len); uncompress((uint8_t*)out, &outlen,
(uint8_t*)packetbuf.data, packetbuf.len);
write_tun(tun_fd, out, outlen); write_tun(tun_fd, out, outlen);