}
func (c *nistCurve) GenerateKey(r io.Reader) (*PrivateKey, error) {
- if boring.Enabled && r == boring.RandReader {
+ if boring.Enabled && rand.IsDefaultReader(r) {
key, bytes, err := boring.GenerateKeyECDH(c.name)
if err != nil {
return nil, err
// ignored unless GODEBUG=cryptocustomrand=1 is set. This setting will be removed
// in a future Go release. Instead, use [testing/cryptotest.SetGlobalRandom].
func GenerateKey(c elliptic.Curve, r io.Reader) (*PrivateKey, error) {
- if boring.Enabled && r == boring.RandReader {
+ if boring.Enabled && rand.IsDefaultReader(r) {
x, y, d, err := boring.GenerateKeyECDSA(c.Params().Name)
if err != nil {
return nil, err
// is set. This setting will be removed in a future Go release. Instead, use
// [testing/cryptotest.SetGlobalRandom].
func SignASN1(r io.Reader, priv *PrivateKey, hash []byte) ([]byte, error) {
- if boring.Enabled && r == boring.RandReader {
+ if boring.Enabled && rand.IsDefaultReader(r) {
b, err := boringPrivateKey(priv)
if err != nil {
return nil, err
import (
"crypto"
- "crypto/internal/fips140/drbg"
"crypto/internal/fips140/ed25519"
"crypto/internal/fips140cache"
"crypto/internal/fips140only"
if random == nil {
if cryptocustomrand.Value() == "1" {
random = cryptorand.Reader
- if _, ok := random.(drbg.DefaultReader); !ok {
+ if !rand.IsDefaultReader(random) {
cryptocustomrand.IncNonDefault()
}
} else {
// If returning a non-default Reader, it calls [randutil.MaybeReadByte] on it.
func CustomReader(r io.Reader) io.Reader {
if cryptocustomrand.Value() == "1" {
- if _, ok := r.(drbg.DefaultReader); !ok {
+ if !IsDefaultReader(r) {
randutil.MaybeReadByte(r)
cryptocustomrand.IncNonDefault()
}
}
return Reader
}
+
+// IsDefaultReader reports whether r is the default [crypto/rand.Reader].
+//
+// If true, the Read method of r can be assumed to call [drbg.Read].
+func IsDefaultReader(r io.Reader) bool {
+ _, ok := r.(drbg.DefaultReader)
+ return ok
+}
//
// In FIPS 140-3 mode, the output passes through an SP 800-90A Rev. 1
// Deterministric Random Bit Generator (DRBG).
-var Reader io.Reader
-
-func init() {
- if boring.Enabled {
- Reader = boring.RandReader
- return
- }
- Reader = rand.Reader
-}
+var Reader io.Reader = rand.Reader
// fatal is [runtime.fatal], pushed via linkname.
//
// through a potentially overridden Reader, so we special-case the default
// case which we can keep non-escaping, and in the general case we read into
// a heap buffer and copy from it.
- if _, ok := Reader.(drbg.DefaultReader); ok {
- boring.Unreachable()
- drbg.Read(b)
+ if rand.IsDefaultReader(Reader) {
+ if boring.Enabled {
+ _, err = io.ReadFull(boring.RandReader, b)
+ } else {
+ drbg.Read(b)
+ }
} else {
bb := make([]byte, len(b))
_, err = io.ReadFull(Reader, bb)
"crypto/internal/fips140/rsa"
"crypto/internal/fips140hash"
"crypto/internal/fips140only"
+ "crypto/internal/rand"
"errors"
"hash"
"io"
// used. If opts.Hash is set, it overrides hash.
//
// The signature is randomized depending on the message, key, and salt size,
-// using bytes from rand. Most applications should use [crypto/rand.Reader] as
-// rand.
-func SignPSS(rand io.Reader, priv *PrivateKey, hash crypto.Hash, digest []byte, opts *PSSOptions) ([]byte, error) {
+// using bytes from random. Most applications should use [crypto/rand.Reader] as
+// random.
+func SignPSS(random io.Reader, priv *PrivateKey, hash crypto.Hash, digest []byte, opts *PSSOptions) ([]byte, error) {
if err := checkPublicKeySize(&priv.PublicKey); err != nil {
return nil, err
}
hash = opts.Hash
}
- if boring.Enabled && rand == boring.RandReader {
+ if boring.Enabled && rand.IsDefaultReader(random) {
bkey, err := boringPrivateKey(priv)
if err != nil {
return nil, err
if fips140only.Enforced() && !fips140only.ApprovedHash(h) {
return nil, errors.New("crypto/rsa: use of hash functions other than SHA-2 or SHA-3 is not allowed in FIPS 140-only mode")
}
- if fips140only.Enforced() && !fips140only.ApprovedRandomReader(rand) {
+ if fips140only.Enforced() && !fips140only.ApprovedRandomReader(random) {
return nil, errors.New("crypto/rsa: only crypto/rand.Reader is allowed in FIPS 140-only mode")
}
}
}
- return fipsError2(rsa.SignPSS(rand, k, h, digest, saltLength))
+ return fipsError2(rsa.SignPSS(random, k, h, digest, saltLength))
}
// VerifyPSS verifies a PSS signature.
defer hash.Reset()
defer mgfHash.Reset()
- if boring.Enabled && random == boring.RandReader {
+ if boring.Enabled && rand.IsDefaultReader(random) {
k := pub.Size()
if len(msg) > k-2*hash.Size()-2 {
return nil, ErrMessageTooLong
return nil, ErrMessageTooLong
}
- if boring.Enabled && random == boring.RandReader {
+ if boring.Enabled && rand.IsDefaultReader(random) {
bkey, err := boringPublicKey(pub)
if err != nil {
return nil, err
return nil, err
}
- if boring.Enabled && random == boring.RandReader &&
+ if boring.Enabled && rand.IsDefaultReader(random) &&
(bits == 2048 || bits == 3072 || bits == 4096) {
bN, bE, bD, bP, bQ, bDp, bDq, bQinv, err := boring.GenerateKeyRSA(bits)
if err != nil {