Kiss for a new path
This commit is contained in:
43
mud.c
43
mud.c
@@ -987,6 +987,26 @@ mud_packet_check_size(unsigned char *data, size_t size)
|
|||||||
(sizes[packet->hdr.code] != size);
|
(sizes[packet->hdr.code] != size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
mud_packet_check(struct mud *mud, unsigned char *data, size_t size)
|
||||||
|
{
|
||||||
|
unsigned char tmp[MUD_PACKET_MAX_SIZE];
|
||||||
|
|
||||||
|
struct mud_crypto_opt opt = {
|
||||||
|
.dst = tmp,
|
||||||
|
.src = {
|
||||||
|
.data = data + size - MUD_MAC_SIZE,
|
||||||
|
.size = MUD_MAC_SIZE,
|
||||||
|
},
|
||||||
|
.ad = {
|
||||||
|
.data = data,
|
||||||
|
.size = size - MUD_MAC_SIZE,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
return mud_decrypt_opt(&mud->crypto.private, &opt);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mud_packet_recv(struct mud *mud, struct mud_path *path,
|
mud_packet_recv(struct mud *mud, struct mud_path *path,
|
||||||
uint64_t now, unsigned char *data, size_t size)
|
uint64_t now, unsigned char *data, size_t size)
|
||||||
@@ -1063,34 +1083,21 @@ mud_recv(struct mud *mud, void *data, size_t size)
|
|||||||
uint64_t send_time = mud_read48(packet);
|
uint64_t send_time = mud_read48(packet);
|
||||||
|
|
||||||
int mud_packet = !send_time;
|
int mud_packet = !send_time;
|
||||||
|
int new_path = 0;
|
||||||
|
|
||||||
if (mud_packet) {
|
if (mud_packet) {
|
||||||
if (mud_packet_check_size(packet, packet_size))
|
if (mud_packet_check_size(packet, packet_size))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
send_time = mud_read48(&packet[MUD_U48_SIZE]);
|
send_time = mud_read48(&packet[MUD_U48_SIZE]);
|
||||||
|
new_path = ((struct mud_packet *)packet)->hdr.code == mud_kiss;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mud_abs_diff(now, send_time) >= mud->time_tolerance)
|
if (mud_abs_diff(now, send_time) >= mud->time_tolerance)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (mud_packet) {
|
if (mud_packet && mud_packet_check(mud, packet, packet_size))
|
||||||
unsigned char tmp[sizeof(packet)];
|
return 0;
|
||||||
|
|
||||||
struct mud_crypto_opt opt = {
|
|
||||||
.dst = tmp,
|
|
||||||
.src = {
|
|
||||||
.data = packet + packet_size - MUD_MAC_SIZE,
|
|
||||||
.size = MUD_MAC_SIZE,
|
|
||||||
},
|
|
||||||
.ad = {
|
|
||||||
.data = packet, .size = packet_size - MUD_MAC_SIZE,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
if (mud_decrypt_opt(&mud->crypto.private, &opt))
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
mud_unmapv4((struct sockaddr *)&addr);
|
mud_unmapv4((struct sockaddr *)&addr);
|
||||||
|
|
||||||
@@ -1100,7 +1107,7 @@ mud_recv(struct mud *mud, void *data, size_t size)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
struct mud_path *path = mud_path(mud, &local_addr,
|
struct mud_path *path = mud_path(mud, &local_addr,
|
||||||
(struct sockaddr *)&addr, mud_packet);
|
(struct sockaddr *)&addr, new_path);
|
||||||
|
|
||||||
if (!path)
|
if (!path)
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user