1// Copyright 2018 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// Package randutil contains internal randomness utilities for various
6// crypto packages.
7package randutil
8
9import (
10	"io"
11	"sync"
12)
13
14var (
15	closedChanOnce sync.Once
16	closedChan     chan struct{}
17)
18
19// MaybeReadByte reads a single byte from r with ~50% probability. This is used
20// to ensure that callers do not depend on non-guaranteed behaviour, e.g.
21// assuming that rsa.GenerateKey is deterministic w.r.t. a given random stream.
22//
23// This does not affect tests that pass a stream of fixed bytes as the random
24// source (e.g. a zeroReader).
25func MaybeReadByte(r io.Reader) {
26	closedChanOnce.Do(func() {
27		closedChan = make(chan struct{})
28		close(closedChan)
29	})
30
31	select {
32	case <-closedChan:
33		return
34	case <-closedChan:
35		var buf [1]byte
36		r.Read(buf[:])
37	}
38}
39