/*
protocol_auth.c -- handle the meta-protocol, authentication
Copyright (C) 1999-2005 Ivo Timmermans,
- 2000-2014 Guus Sliepen <guus@tinc-vpn.org>
+ 2000-2016 Guus Sliepen <guus@tinc-vpn.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
i += 2;
c->tcplen += 22;
} else {
- logger(DEBUG_ALWAYS, LOG_ERR, "Address family %hx not supported for SOCKS 5 proxies!", c->address.sa.sa_family);
+ logger(DEBUG_ALWAYS, LOG_ERR, "Address family %x not supported for SOCKS 5 proxies!", c->address.sa.sa_family);
return false;
}
if(i > len)
if(!read_rsa_public_key(c))
return false;
- if(!(c->outcipher = cipher_open_blowfish_ofb()))
+ /* We need to use a stream mode for the meta protocol. Use AES for this,
+ but try to match the key size with the one from the cipher selected
+ by Cipher.
+ */
+
+ int keylen = cipher_keylength(myself->incipher);
+ if(keylen <= 16)
+ c->outcipher = cipher_open_by_name("aes-128-cfb");
+ else if(keylen <= 24)
+ c->outcipher = cipher_open_by_name("aes-192-cfb");
+ else
+ c->outcipher = cipher_open_by_name("aes-256-cfb");
+ if(!c)
return false;
- if(!(c->outdigest = digest_open_sha1(-1)))
+ c->outbudget = cipher_budget(c->outcipher);
+
+ if(!(c->outdigest = digest_open_by_name("sha256", -1)))
return false;
const size_t len = rsa_size(c->rsa);
c->incipher = NULL;
}
+ c->inbudget = cipher_budget(c->incipher);
+
if(digest) {
if(!(c->indigest = digest_open_by_nid(digest, -1))) {
logger(DEBUG_ALWAYS, LOG_ERR, "Error during initialisation of digest from %s (%s)", c->name, c->hostname);
return upgrade_h(c, request);
char hisport[MAX_STRING_SIZE];
- char *hisaddress;
int weight, mtu;
uint32_t options;
node_t *n;
c->edge = new_edge();
c->edge->from = myself;
c->edge->to = n;
- sockaddr2str(&c->address, &hisaddress, NULL);
- c->edge->address = str2sockaddr(hisaddress, hisport);
- free(hisaddress);
+ sockaddrcpy(&c->edge->address, &c->address);
+ sockaddr_setport(&c->edge->address, hisport);
sockaddr_t local_sa;
socklen_t local_salen = sizeof local_sa;
if (getsockname(c->socket, &local_sa.sa, &local_salen) < 0)
logger(DEBUG_ALWAYS, LOG_WARNING, "Could not get local socket address for connection with %s", c->name);
else {
- char *local_address;
- sockaddr2str(&local_sa, &local_address, NULL);
- c->edge->local_address = str2sockaddr(local_address, myport);
- free(local_address);
+ sockaddr_setport(&local_sa, myport);
+ c->edge->local_address = local_sa;
}
c->edge->weight = (weight + c->estimated_weight) / 2;
c->edge->connection = c;