X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fsptps.c;h=68695754900c59834017dfd4a551e9b80f471c84;hb=a518f82af79036527cb8d1a592a6778ec1657e9c;hp=1699b97f2758d00f6444c40d223de0e0afc1bbf3;hpb=9b9230a0a79c670b86f54fadd2807b864ff9d91f;p=tinc diff --git a/src/sptps.c b/src/sptps.c index 1699b97f..68695754 100644 --- a/src/sptps.c +++ b/src/sptps.c @@ -98,7 +98,9 @@ static bool send_record_priv_datagram(sptps_t *s, uint8_t type, const char *data if(s->outstate) { // If first handshake has finished, encrypt and HMAC - cipher_set_counter(s->outcipher, &seqno, sizeof seqno); + if(!cipher_set_counter(s->outcipher, &seqno, sizeof seqno)) + return false; + if(!cipher_counter_xor(s->outcipher, buffer + 6, len + 1UL, buffer + 6)) return false; @@ -317,6 +319,7 @@ static bool receive_sig(sptps_t *s, const char *data, uint16_t len) { char shared[ECDH_SHARED_SIZE]; if(!ecdh_compute_shared(s->ecdh, s->hiskex + 1 + 32, shared)) return false; + s->ecdh = NULL; // Generate key material from shared secret. if(!generate_key_material(s, shared, sizeof shared)) @@ -397,7 +400,7 @@ static bool receive_handshake(sptps_t *s, const char *data, uint16_t len) { return true; // TODO: split ACK into a VERify and ACK? default: - return error(s, EIO, "Invalid session state"); + return error(s, EIO, "Invalid session state %d", s->state); } } @@ -490,7 +493,8 @@ static bool sptps_receive_data_datagram(sptps_t *s, const char *data, size_t len // Decrypt. memcpy(&seqno, buffer + 2, 4); - cipher_set_counter(s->incipher, &seqno, sizeof seqno); + if(!cipher_set_counter(s->incipher, &seqno, sizeof seqno)) + return false; if(!cipher_counter_xor(s->incipher, buffer + 6, len - 4, buffer + 6)) return false; @@ -508,7 +512,7 @@ static bool sptps_receive_data_datagram(sptps_t *s, const char *data, size_t len if(!receive_handshake(s, buffer + 7, len - 21)) return false; } else { - return error(s, EIO, "Invalid record type"); + return error(s, EIO, "Invalid record type %d", type); } return true; @@ -516,6 +520,9 @@ static bool sptps_receive_data_datagram(sptps_t *s, const char *data, size_t len // Receive incoming data. Check if it contains a complete record, if so, handle it. bool sptps_receive_data(sptps_t *s, const char *data, size_t len) { + if(!s->state) + return error(s, EIO, "Invalid session state zero"); + if(s->datagram) return sptps_receive_data_datagram(s, data, len); @@ -598,7 +605,7 @@ bool sptps_receive_data(sptps_t *s, const char *data, size_t len) { if(!receive_handshake(s, s->inbuf + 7, s->reclen)) return false; } else { - return error(s, EIO, "Invalid record type"); + return error(s, EIO, "Invalid record type %d", type); } s->buflen = 4;