Skip to content

Commit

Permalink
security: crypto/rand ShuffleChromeTLSExtensions (#286)
Browse files Browse the repository at this point in the history
`math/rand` might not be randomly seeded as documented on some platforms, including wasm.

Signed-off-by: Gaukas Wang <[email protected]>
  • Loading branch information
gaukas authored Feb 21, 2024
1 parent d2768e4 commit 3d4788c
Showing 1 changed file with 21 additions and 6 deletions.
27 changes: 21 additions & 6 deletions u_parrots.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,14 @@ package tls

import (
"crypto/ecdh"
crand "crypto/rand"
"crypto/sha256"
"encoding/binary"
"errors"
"fmt"
"io"
"math"
"math/big"
"math/rand"
"sort"
"strconv"
Expand Down Expand Up @@ -2558,12 +2561,24 @@ func ShuffleChromeTLSExtensions(exts []TLSExtension) []TLSExtension {
}

// Shuffle other extensions
rand.Shuffle(len(exts), func(i, j int) {
if skipShuf(i, exts) || skipShuf(j, exts) {
return // do not shuffle some of the extensions
}
exts[i], exts[j] = exts[j], exts[i]
})
randInt64, err := crand.Int(crand.Reader, big.NewInt(math.MaxInt64))
if err != nil {
// warning: random could be deterministic
rand.Shuffle(len(exts), func(i, j int) {
if skipShuf(i, exts) || skipShuf(j, exts) {
return // do not shuffle some of the extensions
}
exts[i], exts[j] = exts[j], exts[i]
})
fmt.Println("Warning: failed to use a cryptographically secure random number generator. The shuffle can be deterministic.")
} else {
rand.New(rand.NewSource(randInt64.Int64())).Shuffle(len(exts), func(i, j int) {
if skipShuf(i, exts) || skipShuf(j, exts) {
return // do not shuffle some of the extensions
}
exts[i], exts[j] = exts[j], exts[i]
})
}

return exts
}
Expand Down

0 comments on commit 3d4788c

Please sign in to comment.