// Copyright 2024 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package drbg provides cryptographically secure random bytes // usable by FIPS code. In FIPS mode it uses an SP 800-90A Rev. 1 // Deterministic Random Bit Generator (DRBG). Otherwise, // it uses the operating system's random number generator.
package drbg import ( ) // Read fills b with cryptographically secure random bytes. In FIPS mode, it // uses an SP 800-90A Rev. 1 Deterministic Random Bit Generator (DRBG). // Otherwise, it uses the operating system's random number generator. func ( []byte) { if testingReader != nil { fips140.RecordNonApproved() // Avoid letting b escape in the non-testing case. := make([]byte, len()) testingReader.Read() copy(, ) return } if !fips140.Enabled { sysrand.Read() return } readFromEntropy() } var testingReader io.Reader // SetTestingReader sets a global, deterministic cryptographic randomness source // for testing purposes. Its Read method must never return an error, it must // never return short, and it must be safe for concurrent use. // // This is only intended to be used by the testing/cryptotest package. func ( io.Reader) { testingReader = } // DefaultReader is a sentinel type, embedded in the default // [crypto/rand.Reader], used to recognize it when passed to // APIs that accept a rand io.Reader. // // Any Reader that implements this interface is assumed to // call [Read] as its Read method. type DefaultReader interface{ defaultReader() } // ReadWithReader uses Reader to fill b with cryptographically secure random // bytes. It is intended for use in APIs that expose a rand io.Reader. func ( io.Reader, []byte) error { if , := .(DefaultReader); { Read() return nil } fips140.RecordNonApproved() , := io.ReadFull(, ) return }