summaryrefslogtreecommitdiff
path: root/crypto
diff options
context:
space:
mode:
authorYann Ylavic <ylavic@apache.org>2018-06-12 07:51:40 +0000
committerYann Ylavic <ylavic@apache.org>2018-06-12 07:51:40 +0000
commitaf39a670ca00949536be1b3d615d2ec0392d63f3 (patch)
tree7ec35e84a03a26a59502d7b6e62cea33d6884116 /crypto
parent84435d92a26fee020f038b9dcc45d4ed380454c4 (diff)
downloadapr-af39a670ca00949536be1b3d615d2ec0392d63f3.tar.gz
Follow up to r1833359: apr_crypto_prng_after_fork() can now use a PID.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1833382 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'crypto')
-rw-r--r--crypto/apr_crypto_prng.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/crypto/apr_crypto_prng.c b/crypto/apr_crypto_prng.c
index 12f581a26..b136212c3 100644
--- a/crypto/apr_crypto_prng.c
+++ b/crypto/apr_crypto_prng.c
@@ -47,6 +47,7 @@
#if APU_HAVE_OPENSSL
#include <openssl/evp.h>
+#include <openssl/sha.h>
#include <openssl/obj_mac.h> /* for NID_* */
#if !defined(NID_chacha20) && !defined(NID_aes_256_ctr)
@@ -104,6 +105,17 @@ apr_status_t cprng_stream_ctx_mix(cprng_stream_ctx_t **pctx,
return APR_SUCCESS;
}
+static apr_status_t cprng_hash_to_seed(pid_t pid, unsigned char seed[])
+{
+ SHA256_CTX ctx;
+
+ SHA256_Init(&ctx);
+ SHA256_Update(&ctx, &pid, sizeof(pid));
+ SHA256_Final(seed, &ctx);
+
+ return APR_SUCCESS;
+}
+
#else /* APU_HAVE_OPENSSL */
/* XXX: APU_HAVE_CRYPTO_PRNG shoudn't be defined! */
@@ -178,13 +190,24 @@ APR_DECLARE(apr_status_t) apr_crypto_prng_term(void)
return APR_SUCCESS;
}
-APR_DECLARE(apr_status_t) apr_crypto_prng_after_fork(void)
+APR_DECLARE(apr_status_t) apr_crypto_prng_after_fork(apr_proc_t *proc)
{
+ unsigned char seedb[APR_CRYPTO_PRNG_SEED_SIZE], *seed = NULL;
+
if (!cprng_global) {
return APR_EINIT;
}
- return apr_crypto_prng_reseed(cprng_global, NULL);
+ if (proc) {
+ apr_status_t rv;
+ rv = cprng_hash_to_seed(proc->pid, seedb);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+ seed = seedb;
+ }
+
+ return apr_crypto_prng_reseed(cprng_global, seed);
}
APR_DECLARE(apr_status_t) apr_crypto_random_bytes(void *buf, apr_size_t len)