X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fsptps.c;h=2449e7bcbb613b5fc475a14aeec8a76631f1e8b6;hb=d756bb92ed52d5b1ecdd42af32f11f733db64d91;hp=fa1594db842dc95555e9056d6df035010530c630;hpb=3a4fe104a06b73fd19c550546e7c65a59ff2afe3;p=tinc diff --git a/src/sptps.c b/src/sptps.c index fa1594db..2449e7bc 100644 --- a/src/sptps.c +++ b/src/sptps.c @@ -301,7 +301,7 @@ static bool receive_sig(sptps_t *s, const char *data, uint16_t len) { s->hiskex = NULL; // Send cipher change record - if(!send_ack(s)) + if(s->outstate && !send_ack(s)) return false; // TODO: only set new keys after ACK has been set/received @@ -319,8 +319,6 @@ static bool receive_sig(sptps_t *s, const char *data, uint16_t len) { return false; } - s->outstate = true; - return true; } @@ -352,7 +350,16 @@ static bool receive_handshake(sptps_t *s, const char *data, uint16_t len) { // If we already sent our secondary public ECDH key, we expect the peer to send his. if(!receive_sig(s, data, len)) return false; - s->state = SPTPS_ACK; + if(s->outstate) + s->state = SPTPS_ACK; + else { + s->outstate = true; + if(!receive_ack(s, NULL, 0)) + return false; + s->receive_record(s->handle, SPTPS_HANDSHAKE, NULL, 0); + s->state = SPTPS_SECONDARY_KEX; + } + return true; case SPTPS_ACK: // We expect a handshake message to indicate transition to the new keys.