summaryrefslogtreecommitdiffstats
path: root/crypto/rand
diff options
context:
space:
mode:
authorBenjamin Kaduk <bkaduk@akamai.com>2017-08-07 09:55:48 -0500
committerBen Kaduk <kaduk@mit.edu>2018-03-29 09:04:23 -0500
commitf2633200eb223f9fe7453de24ecd2e4f657040d9 (patch)
tree7f512619d518283dd7860c16ccaf690f9487f518 /crypto/rand
parentfffb1c5496e47dacc8245bd140f6955a31c5ea6f (diff)
Document RAND_DRBG fork-safety locking model
Add some more exposition on why unlocked access to the global rand_fork_count is safe, and provide a comment for the struct rand_drbg_st fork_count field. Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Matthias St. Pierre <Matthias.St.Pierre@ncp-e.com> (Merged from https://github.com/openssl/openssl/pull/4110)
Diffstat (limited to 'crypto/rand')
-rw-r--r--crypto/rand/rand_lcl.h18
1 files changed, 17 insertions, 1 deletions
diff --git a/crypto/rand/rand_lcl.h b/crypto/rand/rand_lcl.h
index 60c42f7ad5..0a34aa0b93 100644
--- a/crypto/rand/rand_lcl.h
+++ b/crypto/rand/rand_lcl.h
@@ -116,6 +116,12 @@ struct rand_drbg_st {
RAND_DRBG *parent;
int secure; /* 1: allocated on the secure heap, 0: otherwise */
int type; /* the nid of the underlying algorithm */
+ /*
+ * Stores the value of the rand_fork_count global as of when we last
+ * reseeded. The DRG reseeds automatically whenever drbg->fork_count !=
+ * rand_fork_count. Used to provide fork-safety and reseed this DRBG in
+ * the child process.
+ */
int fork_count;
unsigned short flags; /* various external flags */
@@ -202,7 +208,17 @@ struct rand_drbg_st {
/* The global RAND method, and the global buffer and DRBG instance. */
extern RAND_METHOD rand_meth;
-/* How often we've forked (only incremented in child). */
+/*
+ * A "generation count" of forks. Incremented in the child process after a
+ * fork. Since rand_fork_count is increment-only, and only ever written to in
+ * the child process of the fork, which is guaranteed to be single-threaded, no
+ * locking is needed for normal (read) accesses; the rest of pthread fork
+ * processing is assumed to introduce the necessary memory barriers. Sibling
+ * children of a given parent will produce duplicate values, but this is not
+ * problematic because the reseeding process pulls input from the system CSPRNG
+ * and/or other global sources, so the siblings will end up generating
+ * different output streams.
+ */
extern int rand_fork_count;
/* DRBG helpers */