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