X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fprotocol.c;h=36e10c40ea9ac8bfe5130c9105e74dacb0872662;hp=6cb8037940f7296a1be2c99a5dacda3929f19864;hb=a4938b22e7502579ce44cac42410111db11256eb;hpb=54b756f7dfb71c5622b7738fd449e126da959864 diff --git a/src/protocol.c b/src/protocol.c index 6cb80379..36e10c40 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -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.116 2001/10/31 20:02:06 guus Exp $ + $Id: protocol.c,v 1.28.4.121 2001/11/16 17:39:59 zarq Exp $ */ #include "config.h" @@ -50,7 +50,6 @@ #include "conf.h" #include "net.h" -#include "netutl.h" #include "protocol.h" #include "meta.h" #include "connection.h" @@ -246,15 +245,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); @@ -290,11 +287,10 @@ cp This is allowed, because we encrypt a totally random string with a length equal to that of the modulus of the RSA key. */ - + 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 +302,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 +324,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 +336,7 @@ cp } /* Allocate buffers for the meta key */ - +cp if(!c->inkey) c->inkey = xmalloc(len); @@ -349,11 +344,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 +363,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 +377,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,12 +386,8 @@ cp /* Allocate buffers for the challenge */ - buffer = xmalloc(len*2+1); - - if(c->hischallenge) - free(c->hischallenge); - - c->hischallenge = xmalloc(len); + if(!c->hischallenge) + c->hischallenge = xmalloc(len); cp /* Copy random data to the buffer */ @@ -412,7 +403,6 @@ cp /* Send the challenge */ x = send_request(c, "%d %s", CHALLENGE, buffer); - free(buffer); cp return x; } @@ -540,7 +530,6 @@ cp int ack_h(connection_t *c) { - port_t port; int weight; node_t *n; subnet_t *s; @@ -672,11 +661,11 @@ cp { other = (connection_t *)node->data; - if(other == c) - continue; - - send_add_node(other, c->node); - send_add_edge(other, c->edge); + 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 +725,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(!owner) { 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,20 +792,20 @@ cp return -1; } - /* Check if subnet string is valid */ + /* Check if the owner of the new subnet is in the connection list */ - if(!(s = str2net(subnetstr))) + if(!(owner = lookup_node(name))) { - syslog(LOG_ERR, _("Got bad %s from %s (%s): %s"), "DEL_SUBNET", c->name, c->hostname, _("invalid subnet string")); + syslog(LOG_ERR, _("Got %s from %s (%s) for %s which is not in our connection list"), + "DEL_SUBNET", c->name, c->hostname, name); return -1; } - /* Check if the owner of the new subnet is in the connection list */ + /* Check if subnet string is valid */ - if(!(owner = lookup_node(name))) + if(!(s = str2net(subnetstr))) { - syslog(LOG_ERR, _("Got %s from %s (%s) for %s which is not in our connection list"), - "DEL_SUBNET", c->name, c->hostname, name); + syslog(LOG_ERR, _("Got bad %s from %s (%s): %s"), "DEL_SUBNET", c->name, c->hostname, _("invalid subnet string")); return -1; } @@ -814,6 +813,8 @@ cp 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 +822,7 @@ cp return -1; } - subnet_del(owner, s); + subnet_del(owner, find); /* Tell the rest */ @@ -983,7 +984,7 @@ cp int send_add_edge(connection_t *c, edge_t *e) { cp - return send_request(c, "%d %s %s %lx %d", ADD_NODE, + return send_request(c, "%d %s %s %lx %d", ADD_EDGE, e->from->name, e->to->name, e->options, e->weight); } @@ -1123,7 +1124,7 @@ cp if(!from) { syslog(LOG_ERR, _("Got bad %s from %s (%s): %s"), "DEL_EDGE", c->name, c->hostname, _("unknown node")); - return -1; + return 0; } to = lookup_node(to_name); @@ -1131,7 +1132,7 @@ cp if(!to) { syslog(LOG_ERR, _("Got bad %s from %s (%s): %s"), "DEL_EDGE", c->name, c->hostname, _("unknown node")); - return -1; + return 0; } /* Check if edge exists */ @@ -1149,7 +1150,7 @@ cp else { syslog(LOG_ERR, _("Got bad %s from %s (%s): %s"), "DEL_EDGE", c->name, c->hostname, _("unknown edge")); - return -1; + return 0; } /* Tell the rest about the deleted edge */ @@ -1307,7 +1308,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