Several bugfixes.
This commit is contained in:
parent
8910cbd67e
commit
e5047d2835
1 changed files with 40 additions and 37 deletions
|
@ -17,7 +17,7 @@
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
$Id: protocol.c,v 1.28.4.117 2001/10/31 20:37:54 guus Exp $
|
$Id: protocol.c,v 1.28.4.118 2001/11/03 21:22:02 guus Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
@ -246,15 +246,13 @@ cp
|
||||||
|
|
||||||
int send_metakey(connection_t *c)
|
int send_metakey(connection_t *c)
|
||||||
{
|
{
|
||||||
char *buffer;
|
char buffer[MAX_STRING_SIZE];
|
||||||
int len, x;
|
int len, x;
|
||||||
cp
|
cp
|
||||||
len = RSA_size(c->rsa_key);
|
len = RSA_size(c->rsa_key);
|
||||||
|
|
||||||
/* Allocate buffers for the meta key */
|
/* Allocate buffers for the meta key */
|
||||||
|
|
||||||
buffer = xmalloc(len*2+1);
|
|
||||||
|
|
||||||
if(!c->outkey)
|
if(!c->outkey)
|
||||||
c->outkey = xmalloc(len);
|
c->outkey = xmalloc(len);
|
||||||
|
|
||||||
|
@ -294,7 +292,6 @@ cp
|
||||||
if(RSA_public_encrypt(len, c->outkey, buffer, c->rsa_key, RSA_NO_PADDING) != len)
|
if(RSA_public_encrypt(len, c->outkey, buffer, c->rsa_key, RSA_NO_PADDING) != len)
|
||||||
{
|
{
|
||||||
syslog(LOG_ERR, _("Error during encryption of meta key for %s (%s)"), c->name, c->hostname);
|
syslog(LOG_ERR, _("Error during encryption of meta key for %s (%s)"), c->name, c->hostname);
|
||||||
free(buffer);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
cp
|
cp
|
||||||
|
@ -306,7 +303,6 @@ cp
|
||||||
/* Send the meta key */
|
/* Send the meta key */
|
||||||
|
|
||||||
x = send_request(c, "%d %s", METAKEY, buffer);
|
x = send_request(c, "%d %s", METAKEY, buffer);
|
||||||
free(buffer);
|
|
||||||
|
|
||||||
/* Further outgoing requests are encrypted with the key we just generated */
|
/* Further outgoing requests are encrypted with the key we just generated */
|
||||||
|
|
||||||
|
@ -329,7 +325,7 @@ cp
|
||||||
syslog(LOG_ERR, _("Got bad %s from %s (%s)"), "METAKEY", c->name, c->hostname);
|
syslog(LOG_ERR, _("Got bad %s from %s (%s)"), "METAKEY", c->name, c->hostname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
cp
|
||||||
len = RSA_size(myself->connection->rsa_key);
|
len = RSA_size(myself->connection->rsa_key);
|
||||||
|
|
||||||
/* Check if the length of the meta key is all right */
|
/* Check if the length of the meta key is all right */
|
||||||
|
@ -341,7 +337,7 @@ cp
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate buffers for the meta key */
|
/* Allocate buffers for the meta key */
|
||||||
|
cp
|
||||||
if(!c->inkey)
|
if(!c->inkey)
|
||||||
c->inkey = xmalloc(len);
|
c->inkey = xmalloc(len);
|
||||||
|
|
||||||
|
@ -349,11 +345,11 @@ cp
|
||||||
c->inctx = xmalloc(sizeof(*c->inctx));
|
c->inctx = xmalloc(sizeof(*c->inctx));
|
||||||
|
|
||||||
/* Convert the challenge from hexadecimal back to binary */
|
/* Convert the challenge from hexadecimal back to binary */
|
||||||
|
cp
|
||||||
hex2bin(buffer,buffer,len);
|
hex2bin(buffer,buffer,len);
|
||||||
|
|
||||||
/* Decrypt the meta key */
|
/* Decrypt the meta key */
|
||||||
|
cp
|
||||||
if(RSA_private_decrypt(len, buffer, c->inkey, myself->connection->rsa_key, RSA_NO_PADDING) != len) /* See challenge() */
|
if(RSA_private_decrypt(len, buffer, c->inkey, myself->connection->rsa_key, RSA_NO_PADDING) != len) /* See challenge() */
|
||||||
{
|
{
|
||||||
syslog(LOG_ERR, _("Error during encryption of meta key for %s (%s)"), c->name, c->hostname);
|
syslog(LOG_ERR, _("Error during encryption of meta key for %s (%s)"), c->name, c->hostname);
|
||||||
|
@ -368,7 +364,7 @@ cp
|
||||||
}
|
}
|
||||||
|
|
||||||
/* All incoming requests will now be encrypted. */
|
/* All incoming requests will now be encrypted. */
|
||||||
|
cp
|
||||||
EVP_DecryptInit(c->inctx, EVP_bf_cfb(),
|
EVP_DecryptInit(c->inctx, EVP_bf_cfb(),
|
||||||
c->inkey + len - EVP_bf_cfb()->key_len,
|
c->inkey + len - EVP_bf_cfb()->key_len,
|
||||||
c->inkey + len - EVP_bf_cfb()->key_len - EVP_bf_cfb()->iv_len);
|
c->inkey + len - EVP_bf_cfb()->key_len - EVP_bf_cfb()->iv_len);
|
||||||
|
@ -382,7 +378,7 @@ cp
|
||||||
|
|
||||||
int send_challenge(connection_t *c)
|
int send_challenge(connection_t *c)
|
||||||
{
|
{
|
||||||
char *buffer;
|
char buffer[MAX_STRING_SIZE];
|
||||||
int len, x;
|
int len, x;
|
||||||
cp
|
cp
|
||||||
/* CHECKME: what is most reasonable value for len? */
|
/* CHECKME: what is most reasonable value for len? */
|
||||||
|
@ -391,12 +387,8 @@ cp
|
||||||
|
|
||||||
/* Allocate buffers for the challenge */
|
/* Allocate buffers for the challenge */
|
||||||
|
|
||||||
buffer = xmalloc(len*2+1);
|
if(!c->hischallenge)
|
||||||
|
c->hischallenge = xmalloc(len);
|
||||||
if(c->hischallenge)
|
|
||||||
free(c->hischallenge);
|
|
||||||
|
|
||||||
c->hischallenge = xmalloc(len);
|
|
||||||
cp
|
cp
|
||||||
/* Copy random data to the buffer */
|
/* Copy random data to the buffer */
|
||||||
|
|
||||||
|
@ -412,7 +404,6 @@ cp
|
||||||
/* Send the challenge */
|
/* Send the challenge */
|
||||||
|
|
||||||
x = send_request(c, "%d %s", CHALLENGE, buffer);
|
x = send_request(c, "%d %s", CHALLENGE, buffer);
|
||||||
free(buffer);
|
|
||||||
cp
|
cp
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
@ -672,11 +663,11 @@ cp
|
||||||
{
|
{
|
||||||
other = (connection_t *)node->data;
|
other = (connection_t *)node->data;
|
||||||
|
|
||||||
if(other == c)
|
if(other->status.active && other != c)
|
||||||
continue;
|
{
|
||||||
|
send_add_node(other, c->node);
|
||||||
send_add_node(other, c->node);
|
send_add_edge(other, c->edge);
|
||||||
send_add_edge(other, c->edge);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Run MST and SSSP algorithms */
|
/* Run MST and SSSP algorithms */
|
||||||
|
@ -736,13 +727,23 @@ cp
|
||||||
|
|
||||||
/* Check if the owner of the new subnet is in the connection list */
|
/* Check if the owner of the new subnet is in the connection list */
|
||||||
|
|
||||||
if(!(owner = lookup_node(name)))
|
owner = lookup_node(name);
|
||||||
|
|
||||||
|
if(!node)
|
||||||
{
|
{
|
||||||
syslog(LOG_ERR, _("Got ADD_SUBNET from %s (%s) for %s which is not in our connection list"),
|
syslog(LOG_ERR, _("Got ADD_SUBNET from %s (%s) for %s which is not in our connection list"),
|
||||||
name, c->name, c->hostname);
|
c->name, c->hostname, name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if we already know this subnet */
|
||||||
|
|
||||||
|
if(lookup_subnet(owner, s))
|
||||||
|
{
|
||||||
|
free_subnet(s);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* If everything is correct, add the subnet to the list of the owner */
|
/* If everything is correct, add the subnet to the list of the owner */
|
||||||
|
|
||||||
subnet_add(owner, s);
|
subnet_add(owner, s);
|
||||||
|
@ -793,14 +794,6 @@ cp
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if subnet string is valid */
|
|
||||||
|
|
||||||
if(!(s = str2net(subnetstr)))
|
|
||||||
{
|
|
||||||
syslog(LOG_ERR, _("Got bad %s from %s (%s): %s"), "DEL_SUBNET", c->name, c->hostname, _("invalid subnet string"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if the owner of the new subnet is in the connection list */
|
/* Check if the owner of the new subnet is in the connection list */
|
||||||
|
|
||||||
if(!(owner = lookup_node(name)))
|
if(!(owner = lookup_node(name)))
|
||||||
|
@ -810,10 +803,20 @@ cp
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if subnet string is valid */
|
||||||
|
|
||||||
|
if(!(s = str2net(subnetstr)))
|
||||||
|
{
|
||||||
|
syslog(LOG_ERR, _("Got bad %s from %s (%s): %s"), "DEL_SUBNET", c->name, c->hostname, _("invalid subnet string"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* If everything is correct, delete the subnet from the list of the owner */
|
/* If everything is correct, delete the subnet from the list of the owner */
|
||||||
|
|
||||||
find = lookup_subnet(owner, s);
|
find = lookup_subnet(owner, s);
|
||||||
|
|
||||||
|
free_subnet(s);
|
||||||
|
|
||||||
if(!find)
|
if(!find)
|
||||||
{
|
{
|
||||||
syslog(LOG_ERR, _("Got %s from %s (%s) for %s which does not appear in his subnet tree"),
|
syslog(LOG_ERR, _("Got %s from %s (%s) for %s which does not appear in his subnet tree"),
|
||||||
|
@ -821,7 +824,7 @@ cp
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
subnet_del(owner, s);
|
subnet_del(owner, find);
|
||||||
|
|
||||||
/* Tell the rest */
|
/* Tell the rest */
|
||||||
|
|
||||||
|
@ -1307,7 +1310,7 @@ cp
|
||||||
for(node = connection_tree->head; node; node = node->next)
|
for(node = connection_tree->head; node; node = node->next)
|
||||||
{
|
{
|
||||||
other = (connection_t *)node->data;
|
other = (connection_t *)node->data;
|
||||||
if(other != c && other->status.active)
|
if(other->status.active && other != c)
|
||||||
send_request(other, "%d %s", KEY_CHANGED, n->name);
|
send_request(other, "%d %s", KEY_CHANGED, n->name);
|
||||||
}
|
}
|
||||||
cp
|
cp
|
||||||
|
|
Loading…
Reference in a new issue