]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
device: timers: seed unsafe rng before use for jitter
authorJason A. Donenfeld <Jason@zx2c4.com>
Thu, 28 Oct 2021 11:34:21 +0000 (13:34 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Thu, 28 Oct 2021 11:34:21 +0000 (13:34 +0200)
Forgetting to seed the unsafe rng, the jitter before followed a fixed
pattern, which didn't help when a fleet of computers all boot at once.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
device/timers.go

index ee191e55bdd2fc4f8da95fed3ee10dd259d1af05..aa6f28abdd6f177b460ebaf4331374224ea2fdc6 100644 (file)
@@ -8,12 +8,20 @@
 package device
 
 import (
-       "math/rand"
+       "crypto/rand"
+       unsafeRand "math/rand"
        "sync"
        "sync/atomic"
        "time"
+       "unsafe"
 )
 
+func init() {
+       var seed int64
+       rand.Read(unsafe.Slice((*byte)(unsafe.Pointer(&seed)), unsafe.Sizeof(seed)))
+       unsafeRand.Seed(seed)
+}
+
 // A Timer manages time-based aspects of the WireGuard protocol.
 // Timer roughly copies the interface of the Linux kernel's struct timer_list.
 type Timer struct {
@@ -144,7 +152,7 @@ func expiredPersistentKeepalive(peer *Peer) {
 /* Should be called after an authenticated data packet is sent. */
 func (peer *Peer) timersDataSent() {
        if peer.timersActive() && !peer.timers.newHandshake.IsPending() {
-               peer.timers.newHandshake.Mod(KeepaliveTimeout + RekeyTimeout + time.Millisecond*time.Duration(rand.Int31n(RekeyTimeoutJitterMaxMs)))
+               peer.timers.newHandshake.Mod(KeepaliveTimeout + RekeyTimeout + time.Millisecond*time.Duration(unsafeRand.Int63n(RekeyTimeoutJitterMaxMs)))
        }
 }
 
@@ -176,7 +184,7 @@ func (peer *Peer) timersAnyAuthenticatedPacketReceived() {
 /* Should be called after a handshake initiation message is sent. */
 func (peer *Peer) timersHandshakeInitiated() {
        if peer.timersActive() {
-               peer.timers.retransmitHandshake.Mod(RekeyTimeout + time.Millisecond*time.Duration(rand.Int31n(RekeyTimeoutJitterMaxMs)))
+               peer.timers.retransmitHandshake.Mod(RekeyTimeout + time.Millisecond*time.Duration(unsafeRand.Int63n(RekeyTimeoutJitterMaxMs)))
        }
 }