Enforce maximum amount of bytes sent/received on meta-connections.
[tinc] / src / protocol_auth.c
index 65c5e89..224b6d8 100644 (file)
@@ -1,7 +1,7 @@
 /*
     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
@@ -421,10 +421,24 @@ bool send_metakey(connection_t *c) {
        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);
@@ -536,6 +550,8 @@ bool metakey_h(connection_t *c, const char *request) {
                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);
@@ -866,7 +882,8 @@ bool ack_h(connection_t *c, const char *request) {
        c->edge = new_edge();
        c->edge->from = myself;
        c->edge->to = n;
-       sockaddr_setport(&c->address, hisport);
+       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)