Try handling the case when the first side knows the ecdsa key of
[tinc] / src / protocol_auth.c
index 73a591e..5782a97 100644 (file)
@@ -381,11 +381,11 @@ bool id_h(connection_t *c, const char *request) {
                if(experimental)
                        read_ecdsa_public_key(c);
                        /* Ignore failures if no key known yet */
-       } else {
-               if(c->protocol_minor && !ecdsa_active(c->ecdsa))
-                       c->protocol_minor = 1;
        }
 
+       if(c->protocol_minor && !ecdsa_active(c->ecdsa))
+               c->protocol_minor = 1;
+
        /* Forbid version rollback for nodes whose Ed25519 key we know */
 
        if(ecdsa_active(c->ecdsa) && c->protocol_minor < 2) {
@@ -730,6 +730,12 @@ static bool upgrade_h(connection_t *c, const char *request) {
                return false;
        }
 
+       c->ecdsa = ecdsa_set_base64_public_key(pubkey);
+       if(!c->ecdsa) {
+               logger(DEBUG_ALWAYS, LOG_INFO, "Got bad Ed25519 public key from %s (%s), not upgrading.", c->name, c->hostname);
+               return false;
+       }
+
        logger(DEBUG_ALWAYS, LOG_INFO, "Got Ed25519 public key from %s (%s), upgrading!", c->name, c->hostname);
        append_config_file(c->name, "Ed25519PublicKey", pubkey);
        c->allow_request = TERMREQ;