X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;ds=inline;f=src%2Fprotocol_auth.c;h=2d5990e32c32e053093e590e38d9e0dfe2ca1280;hb=daee99be3e42946e3b554150c32d310836b37da6;hp=670bfbc23ee0cc48e908d481e150186dfa634db6;hpb=fb7b6e7a0c966a88a682f656ca1caeb9a0583c5b;p=meshlink diff --git a/src/protocol_auth.c b/src/protocol_auth.c index 670bfbc2..2d5990e3 100644 --- a/src/protocol_auth.c +++ b/src/protocol_auth.c @@ -28,6 +28,7 @@ #include "edge.h" #include "graph.h" #include "logger.h" +#include "meshlink_internal.h" #include "meta.h" #include "net.h" #include "netutl.h" @@ -37,6 +38,7 @@ #include "sptps.h" #include "utils.h" #include "xalloc.h" +#include "ed25519/sha512.h" ecdsa_t *invitation_key = NULL; @@ -129,13 +131,13 @@ static bool send_proxyrequest(connection_t *c) { bool send_id(connection_t *c) { gettimeofday(&c->start, NULL); - int minor = myself->connection->protocol_minor; + int minor = mesh->self->connection->protocol_minor; if(proxytype && c->outgoing) if(!send_proxyrequest(c)) return false; - return send_request(c, "%d %s %d.%d", ID, myself->connection->name, myself->connection->protocol_major, minor); + return send_request(c, "%d %s %d.%d", ID, mesh->self->connection->name, mesh->self->connection->protocol_major, minor); } static bool finalize_invitation(connection_t *c, const char *data, uint16_t len) { @@ -182,17 +184,14 @@ static bool receive_invitation_sptps(void *handle, uint8_t type, const char *dat return false; // Recover the filename from the cookie and the key - digest_t *digest = digest_open_by_name("sha256", 18); - if(!digest) - abort(); char *fingerprint = ecdsa_get_base64_public_key(invitation_key); + char hash[64]; char hashbuf[18 + strlen(fingerprint)]; char cookie[25]; memcpy(hashbuf, data, 18); memcpy(hashbuf + 18, fingerprint, sizeof hashbuf - 18); - digest_create(digest, hashbuf, sizeof hashbuf, cookie); - b64encode_urlsafe(cookie, cookie, 18); - digest_close(digest); + sha512(hashbuf, sizeof hashbuf, hash); + b64encode_urlsafe(hash, cookie, 18); free(fingerprint); char filename[PATH_MAX], usedname[PATH_MAX]; @@ -314,7 +313,7 @@ bool id_h(connection_t *c, const char *request) { /* Check if version matches */ - if(c->protocol_major != myself->connection->protocol_major) { + if(c->protocol_major != mesh->self->connection->protocol_major) { logger(DEBUG_ALWAYS, LOG_ERR, "Peer %s (%s) uses incompatible version %d.%d", c->name, c->hostname, c->protocol_major, c->protocol_minor); return false; @@ -349,17 +348,15 @@ bool id_h(connection_t *c, const char *request) { return false; } - c->allow_request = METAKEY; - c->allow_request = ACK; - char label[25 + strlen(myself->name) + strlen(c->name)]; + char label[25 + strlen(mesh->self->name) + strlen(c->name)]; if(c->outgoing) - snprintf(label, sizeof label, "tinc TCP key expansion %s %s", myself->name, c->name); + snprintf(label, sizeof label, "tinc TCP key expansion %s %s", mesh->self->name, c->name); else - snprintf(label, sizeof label, "tinc TCP key expansion %s %s", c->name, myself->name); + snprintf(label, sizeof label, "tinc TCP key expansion %s %s", c->name, mesh->self->name); - return sptps_start(&c->sptps, c, c->outgoing, false, myself->connection->ecdsa, c->ecdsa, label, sizeof label, send_meta_sptps, receive_meta_sptps); + return sptps_start(&c->sptps, c, c->outgoing, false, mesh->self->connection->ecdsa, c->ecdsa, label, sizeof label, send_meta_sptps, receive_meta_sptps); } bool send_ack(connection_t *c) { @@ -376,23 +373,9 @@ bool send_ack(connection_t *c) { /* Check some options */ - if((get_config_bool(lookup_config(c->config_tree, "IndirectData"), &choice) && choice) || myself->options & OPTION_INDIRECT) - c->options |= OPTION_INDIRECT; - - if((get_config_bool(lookup_config(c->config_tree, "TCPOnly"), &choice) && choice) || myself->options & OPTION_TCPONLY) - c->options |= OPTION_TCPONLY | OPTION_INDIRECT; - - if(myself->options & OPTION_PMTU_DISCOVERY) + if(mesh->self->options & OPTION_PMTU_DISCOVERY) c->options |= OPTION_PMTU_DISCOVERY; - choice = myself->options & OPTION_CLAMP_MSS; - get_config_bool(lookup_config(c->config_tree, "ClampMSS"), &choice); - if(choice) - c->options |= OPTION_CLAMP_MSS; - - if(!get_config_int(lookup_config(c->config_tree, "Weight"), &c->estimated_weight)) - get_config_int(lookup_config(config_tree, "Weight"), &c->estimated_weight); - return send_request(c, "%d %s %d %x", ACK, myport, c->estimated_weight, (c->options & 0xffffff) | (PROT_MINOR << 24)); } @@ -411,7 +394,7 @@ static void send_everything(connection_t *c) { send_tcppacket(c, &zeropkt.pkt); } - for splay_each(node_t, n, node_tree) { + for splay_each(node_t, n, mesh->nodes) { for splay_each(edge_t, e, n->edge_tree) send_add_edge(c, e); } @@ -467,19 +450,6 @@ bool ack_h(connection_t *c, const char *request) { } c->options |= options; - if(get_config_int(lookup_config(c->config_tree, "PMTU"), &mtu) && mtu < n->mtu) - n->mtu = mtu; - - if(get_config_int(lookup_config(config_tree, "PMTU"), &mtu) && mtu < n->mtu) - n->mtu = mtu; - - if(get_config_bool(lookup_config(c->config_tree, "ClampMSS"), &choice)) { - if(choice) - c->options |= OPTION_CLAMP_MSS; - else - c->options &= ~OPTION_CLAMP_MSS; - } - /* Activate this connection */ c->allow_request = ALL; @@ -495,7 +465,7 @@ bool ack_h(connection_t *c, const char *request) { /* Create an edge_t for this connection */ c->edge = new_edge(); - c->edge->from = myself; + c->edge->from = mesh->self; c->edge->to = n; sockaddr2str(&c->address, &hisaddress, NULL); c->edge->address = str2sockaddr(hisaddress, hisport);