]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Make the join commit order configurable.
[meshlink] / src / meshlink.c
index eb9142cc743d842c7f8967e0b9a4408aa170113e..903ff09a2040049d1b979bf8b3689bcb0ee42657 100644 (file)
@@ -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();