/*
protocol_key.c -- handle the meta-protocol, key exchange
- Copyright (C) 1999-2003 Ivo Timmermans <ivo@o2w.nl>,
- 2000-2003 Guus Sliepen <guus@sliepen.eu.org>
+ Copyright (C) 1999-2004 Ivo Timmermans <ivo@tinc-vpn.org>,
+ 2000-2004 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
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- $Id: protocol_key.c,v 1.1.4.21 2003/07/23 22:17:31 guus Exp $
+ $Id$
*/
#include "system.h"
+#include <openssl/evp.h>
+#include <openssl/err.h>
+
#include "avl_tree.h"
#include "connection.h"
#include "logger.h"
bool mykeyused = false;
-bool send_key_changed(connection_t *c, node_t *n)
+bool send_key_changed(connection_t *c, const node_t *n)
{
cp();
/* Tell the others */
- forward_request(c);
+ if(!tunnelserver)
+ forward_request(c);
return true;
}
-bool send_req_key(connection_t *c, node_t *from, node_t *to)
+bool send_req_key(connection_t *c, const node_t *from, const node_t *to)
{
cp();
memset(from->late, 0, sizeof(from->late));
send_ans_key(c, myself, from);
} else {
+ if(tunnelserver)
+ return false;
+
send_req_key(to->nexthop->connection, from, to);
}
return true;
}
-bool send_ans_key(connection_t *c, node_t *from, node_t *to)
+bool send_ans_key(connection_t *c, const node_t *from, const node_t *to)
{
char key[MAX_STRING_SIZE];
/* Forward it if necessary */
if(to != myself) {
+ if(tunnelserver)
+ return false;
+
return send_request(to->nexthop->connection, "%s", c->buffer);
}
from->compression = compression;
if(from->cipher)
- EVP_EncryptInit_ex(&from->packet_ctx, from->cipher, NULL, from->key, from->key + from->cipher->key_len);
+ if(!EVP_EncryptInit_ex(&from->packet_ctx, from->cipher, NULL, from->key, from->key + from->cipher->key_len)) {
+ logger(LOG_ERR, _("Error during initialisation of key from %s (%s): %s"),
+ from->name, from->hostname, ERR_error_string(ERR_get_error(), NULL));
+ return false;
+ }
+
+ if(from->options & OPTION_PMTU_DISCOVERY && !from->mtuprobes)
+ send_mtu_probe(from);
flush_queue(from);