Refactor crypto RNG; add getrandom() support
[tinc] / src / net_packet.c
index eb438b0..28459ce 100644 (file)
@@ -53,6 +53,7 @@
 #include "protocol.h"
 #include "route.h"
 #include "utils.h"
+#include "random.h"
 
 /* The minimum size of a probe is 14 bytes, but since we normally use CBC mode
    encryption, we can add a few extra random bytes without increasing the
@@ -962,7 +963,8 @@ bool send_sptps_data(node_t *to, node_t *from, int type, const void *data, size_
 
        if(type == SPTPS_HANDSHAKE || tcponly || (!direct && !relay_supported) || (type != PKT_PROBE && origlen > relay->minmtu)) {
                if(type != SPTPS_HANDSHAKE && (to->nexthop->connection->options >> 24) >= 7) {
-                       uint8_t buf[len + sizeof(to->id) + sizeof(from->id)];
+                       const size_t buflen = len + sizeof(to->id) + sizeof(from->id);
+                       uint8_t *buf = alloca(buflen);
                        uint8_t *buf_ptr = buf;
                        memcpy(buf_ptr, &to->id, sizeof(to->id));
                        buf_ptr += sizeof(to->id);
@@ -970,10 +972,10 @@ bool send_sptps_data(node_t *to, node_t *from, int type, const void *data, size_
                        buf_ptr += sizeof(from->id);
                        memcpy(buf_ptr, data, len);
                        logger(DEBUG_TRAFFIC, LOG_INFO, "Sending packet from %s (%s) to %s (%s) via %s (%s) (TCP)", from->name, from->hostname, to->name, to->hostname, to->nexthop->name, to->nexthop->hostname);
-                       return send_sptps_tcppacket(to->nexthop->connection, buf, sizeof(buf));
+                       return send_sptps_tcppacket(to->nexthop->connection, buf, buflen);
                }
 
-               char buf[B64_SIZE(len)];
+               char *buf = alloca(B64_SIZE(len));
                b64encode_tinc(data, buf, len);
 
                /* If this is a handshake packet, use ANS_KEY instead of REQ_KEY, for two reasons:
@@ -993,7 +995,7 @@ bool send_sptps_data(node_t *to, node_t *from, int type, const void *data, size_
                overhead += sizeof(to->id) + sizeof(from->id);
        }
 
-       char buf[len + overhead];
+       char *buf = alloca(len + overhead);
        char *buf_ptr = buf;
 
        if(relay_supported) {
@@ -1170,6 +1172,7 @@ static void send_udp_probe_packet(node_t *n, size_t len) {
                len = sizeof(packet.data);
        }
 
+       len = MAX(len, MIN_PROBE_SIZE);
        packet.offset = DEFAULT_PACKET_OFFSET;
        memset(DATA(&packet), 0, 14);
        randomize(DATA(&packet) + 14, len - 14);
@@ -1255,7 +1258,7 @@ static length_t choose_initial_maxmtu(node_t *n) {
 
        if(connect(sock, &sa->sa, SALEN(sa->sa))) {
                logger(DEBUG_TRAFFIC, LOG_ERR, "Connecting MTU assessment socket for %s (%s) failed: %s", n->name, n->hostname, sockstrerror(sockerrno));
-               close(sock);
+               closesocket(sock);
                return MTU;
        }
 
@@ -1264,11 +1267,11 @@ static length_t choose_initial_maxmtu(node_t *n) {
 
        if(getsockopt(sock, IPPROTO_IP, IP_MTU, (void *)&ip_mtu, &ip_mtu_len)) {
                logger(DEBUG_TRAFFIC, LOG_ERR, "getsockopt(IP_MTU) on %s (%s) failed: %s", n->name, n->hostname, sockstrerror(sockerrno));
-               close(sock);
+               closesocket(sock);
                return MTU;
        }
 
-       close(sock);
+       closesocket(sock);
 
        if(ip_mtu < MINMTU) {
                logger(DEBUG_TRAFFIC, LOG_ERR, "getsockopt(IP_MTU) on %s (%s) returned absurdly small value: %d", n->name, n->hostname, ip_mtu);
@@ -1904,7 +1907,7 @@ void handle_device_data(void *data, int flags) {
                myself->in_bytes += packet.len;
                route(myself, &packet);
        } else {
-               usleep(errors * 50000);
+               sleep_millis(errors * 50);
                errors++;
 
                if(errors > 10) {