X-Git-Url: http://git.meshlink.io/?p=meshlink;a=blobdiff_plain;f=src%2Fmeshlink.c;h=903ff09a2040049d1b979bf8b3689bcb0ee42657;hp=eb9142cc743d842c7f8967e0b9a4408aa170113e;hb=d65ff28f38ba779fbd6f970fb3c84b0ed98daa28;hpb=da64ed8d36196524ec78ad4b3b350bed35f4535c diff --git a/src/meshlink.c b/src/meshlink.c index eb9142cc..903ff09a 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -775,21 +775,44 @@ static bool invitation_receive(void *handle, uint8_t type, const void *msg, uint join_state_t *state = handle; meshlink_handle_t *mesh = state->mesh; - switch(type) { - case SPTPS_HANDSHAKE: - return sptps_send_record(&state->sptps, 0, state->cookie, 18); + if(mesh->inviter_commits_first) { + switch(type) { + case SPTPS_HANDSHAKE: + return sptps_send_record(&state->sptps, 2, state->cookie, 18 + 32); - case 0: - return finalize_join(state, msg, len); + case 1: + break; - case 1: - logger(mesh, MESHLINK_DEBUG, "Invitation successfully accepted.\n"); - shutdown(state->sock, SHUT_RDWR); - state->success = true; - break; + case 0: + if(!finalize_join(state, msg, len)) { + return false; + } - default: - return false; + logger(mesh, MESHLINK_DEBUG, "Invitation successfully accepted.\n"); + shutdown(state->sock, SHUT_RDWR); + state->success = true; + break; + + default: + return false; + } + } else { + switch(type) { + case SPTPS_HANDSHAKE: + return sptps_send_record(&state->sptps, 0, state->cookie, 18); + + case 0: + return finalize_join(state, msg, len); + + case 1: + logger(mesh, MESHLINK_DEBUG, "Invitation successfully accepted.\n"); + shutdown(state->sock, SHUT_RDWR); + state->success = true; + break; + + default: + return false; + } } return true; @@ -2647,6 +2670,10 @@ bool meshlink_join(meshlink_handle_t *mesh, const char *invitation) { goto invalid; } + if(mesh->inviter_commits_first) { + memcpy(state.cookie + 18, ecdsa_get_public_key(mesh->private_key), 32); + } + // Generate a throw-away key for the invitation. key = ecdsa_generate();