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
|
||||
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"
|
||||
|
@ -246,15 +246,13 @@ cp
|
|||
|
||||
int send_metakey(connection_t *c)
|
||||
{
|
||||
char *buffer;
|
||||
char buffer[MAX_STRING_SIZE];
|
||||
int len, x;
|
||||
cp
|
||||
len = RSA_size(c->rsa_key);
|
||||
|
||||
/* Allocate buffers for the meta key */
|
||||
|
||||
buffer = xmalloc(len*2+1);
|
||||
|
||||
if(!c->outkey)
|
||||
c->outkey = xmalloc(len);
|
||||
|
||||
|
@ -294,7 +292,6 @@ cp
|
|||
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);
|
||||
free(buffer);
|
||||
return -1;
|
||||
}
|
||||
cp
|
||||
|
@ -306,7 +303,6 @@ cp
|
|||
/* Send the meta key */
|
||||
|
||||
x = send_request(c, "%d %s", METAKEY, buffer);
|
||||
free(buffer);
|
||||
|
||||
/* 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);
|
||||
return -1;
|
||||
}
|
||||
|
||||
cp
|
||||
len = RSA_size(myself->connection->rsa_key);
|
||||
|
||||
/* Check if the length of the meta key is all right */
|
||||
|
@ -341,7 +337,7 @@ cp
|
|||
}
|
||||
|
||||
/* Allocate buffers for the meta key */
|
||||
|
||||
cp
|
||||
if(!c->inkey)
|
||||
c->inkey = xmalloc(len);
|
||||
|
||||
|
@ -349,11 +345,11 @@ cp
|
|||
c->inctx = xmalloc(sizeof(*c->inctx));
|
||||
|
||||
/* Convert the challenge from hexadecimal back to binary */
|
||||
|
||||
cp
|
||||
hex2bin(buffer,buffer,len);
|
||||
|
||||
/* Decrypt the meta key */
|
||||
|
||||
cp
|
||||
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);
|
||||
|
@ -368,7 +364,7 @@ cp
|
|||
}
|
||||
|
||||
/* All incoming requests will now be encrypted. */
|
||||
|
||||
cp
|
||||
EVP_DecryptInit(c->inctx, EVP_bf_cfb(),
|
||||
c->inkey + len - EVP_bf_cfb()->key_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)
|
||||
{
|
||||
char *buffer;
|
||||
char buffer[MAX_STRING_SIZE];
|
||||
int len, x;
|
||||
cp
|
||||
/* CHECKME: what is most reasonable value for len? */
|
||||
|
@ -391,11 +387,7 @@ cp
|
|||
|
||||
/* Allocate buffers for the challenge */
|
||||
|
||||
buffer = xmalloc(len*2+1);
|
||||
|
||||
if(c->hischallenge)
|
||||
free(c->hischallenge);
|
||||
|
||||
if(!c->hischallenge)
|
||||
c->hischallenge = xmalloc(len);
|
||||
cp
|
||||
/* Copy random data to the buffer */
|
||||
|
@ -412,7 +404,6 @@ cp
|
|||
/* Send the challenge */
|
||||
|
||||
x = send_request(c, "%d %s", CHALLENGE, buffer);
|
||||
free(buffer);
|
||||
cp
|
||||
return x;
|
||||
}
|
||||
|
@ -672,12 +663,12 @@ cp
|
|||
{
|
||||
other = (connection_t *)node->data;
|
||||
|
||||
if(other == c)
|
||||
continue;
|
||||
|
||||
if(other->status.active && other != c)
|
||||
{
|
||||
send_add_node(other, c->node);
|
||||
send_add_edge(other, c->edge);
|
||||
}
|
||||
}
|
||||
|
||||
/* Run MST and SSSP algorithms */
|
||||
|
||||
|
@ -736,13 +727,23 @@ cp
|
|||
|
||||
/* 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"),
|
||||
name, c->name, c->hostname);
|
||||
c->name, c->hostname, name);
|
||||
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 */
|
||||
|
||||
subnet_add(owner, s);
|
||||
|
@ -793,14 +794,6 @@ cp
|
|||
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 */
|
||||
|
||||
if(!(owner = lookup_node(name)))
|
||||
|
@ -810,10 +803,20 @@ cp
|
|||
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 */
|
||||
|
||||
find = lookup_subnet(owner, s);
|
||||
|
||||
free_subnet(s);
|
||||
|
||||
if(!find)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
subnet_del(owner, s);
|
||||
subnet_del(owner, find);
|
||||
|
||||
/* Tell the rest */
|
||||
|
||||
|
@ -1307,7 +1310,7 @@ cp
|
|||
for(node = connection_tree->head; node; node = node->next)
|
||||
{
|
||||
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);
|
||||
}
|
||||
cp
|
||||
|
|
Loading…
Reference in a new issue