X-Git-Url: http://andersk.mit.edu/gitweb/openssh.git/blobdiff_plain/759ab0d942c216fce0ea2db06370b89327b69f29..3be6fc361f698f8df80d7be6f32e94a835d19ba1:/entropy.c diff --git a/entropy.c b/entropy.c index b3081af9..8b705397 100644 --- a/entropy.c +++ b/entropy.c @@ -24,8 +24,24 @@ #include "includes.h" +#include +#include + +#ifdef HAVE_SYS_STAT_H +# include +#endif + +#ifdef HAVE_FCNTL_H +# include +#endif +#include +#include +#include +#include + #include #include +#include #include "ssh.h" #include "misc.h" @@ -33,6 +49,7 @@ #include "atomicio.h" #include "pathnames.h" #include "log.h" +#include "buffer.h" /* * Portable OpenSSH PRNG seeding: @@ -45,8 +62,6 @@ * XXX: we should tell the child how many bytes we need. */ -RCSID("$Id$"); - #ifndef OPENSSL_PRNG_ONLY #define RANDOM_SEED_SIZE 48 static uid_t original_uid, original_euid; @@ -150,3 +165,30 @@ init_rng(void) #endif } +#ifndef OPENSSL_PRNG_ONLY +void +rexec_send_rng_seed(Buffer *m) +{ + u_char buf[RANDOM_SEED_SIZE]; + + if (RAND_bytes(buf, sizeof(buf)) <= 0) { + error("Couldn't obtain random bytes (error %ld)", + ERR_get_error()); + buffer_put_string(m, "", 0); + } else + buffer_put_string(m, buf, sizeof(buf)); +} + +void +rexec_recv_rng_seed(Buffer *m) +{ + u_char *buf; + u_int len; + + buf = buffer_get_string_ret(m, &len); + if (buf != NULL) { + debug3("rexec_recv_rng_seed: seeding rng with %u bytes", len); + RAND_add(buf, len, len); + } +} +#endif