diff options
| author | william <william@25tandclement.com> | 2014-04-19 19:47:00 -0700 |
|---|---|---|
| committer | william <william@25tandclement.com> | 2014-04-19 19:47:00 -0700 |
| commit | dd0ad8dc1b0962fc80dbf680aadaaaba6536c96b (patch) | |
| tree | 5396202c2426da7f6c33396ca0f07aa307dcc190 | |
| parent | 34bcf562917a1b5af40c140aac2285f9894d3b73 (diff) | |
| download | luaossl-dd0ad8dc1b0962fc80dbf680aadaaaba6536c96b.tar.gz luaossl-dd0ad8dc1b0962fc80dbf680aadaaaba6536c96b.tar.bz2 luaossl-dd0ad8dc1b0962fc80dbf680aadaaaba6536c96b.zip | |
call RAND_add with new randomness when fork detected
| -rw-r--r-- | src/openssl.c | 59 |
1 files changed, 54 insertions, 5 deletions
diff --git a/src/openssl.c b/src/openssl.c index 624f6d5..1d15f7c 100644 --- a/src/openssl.c +++ b/src/openssl.c | |||
| @@ -55,6 +55,10 @@ | |||
| 55 | 55 | ||
| 56 | #include <dlfcn.h> /* dladdr(3) dlopen(3) */ | 56 | #include <dlfcn.h> /* dladdr(3) dlopen(3) */ |
| 57 | 57 | ||
| 58 | #if __APPLE__ | ||
| 59 | #include <mach/mach_time.h> /* mach_absolute_time() */ | ||
| 60 | #endif | ||
| 61 | |||
| 58 | #include <openssl/err.h> | 62 | #include <openssl/err.h> |
| 59 | #include <openssl/bn.h> | 63 | #include <openssl/bn.h> |
| 60 | #include <openssl/asn1.h> | 64 | #include <openssl/asn1.h> |
| @@ -3980,6 +3984,15 @@ int luaopen__openssl_cipher(lua_State *L) { | |||
| 3980 | * | 3984 | * |
| 3981 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ | 3985 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ |
| 3982 | 3986 | ||
| 3987 | struct randL_state { | ||
| 3988 | pid_t pid; | ||
| 3989 | }; /* struct randL_state */ | ||
| 3990 | |||
| 3991 | static struct randL_state *randL_getstate(lua_State *L) { | ||
| 3992 | return lua_touserdata(L, lua_upvalueindex(1)); | ||
| 3993 | } /* randL_getstate() */ | ||
| 3994 | |||
| 3995 | |||
| 3983 | #ifndef HAVE_RANDOM_UUID | 3996 | #ifndef HAVE_RANDOM_UUID |
| 3984 | #define HAVE_RANDOM_UUID (defined __linux) /* RANDOM_UUID is an enum, not macro */ | 3997 | #define HAVE_RANDOM_UUID (defined __linux) /* RANDOM_UUID is an enum, not macro */ |
| 3985 | #endif | 3998 | #endif |
| @@ -3992,7 +4005,7 @@ int luaopen__openssl_cipher(lua_State *L) { | |||
| 3992 | #define HAVE_KERN_ARND (defined KERN_ARND) | 4005 | #define HAVE_KERN_ARND (defined KERN_ARND) |
| 3993 | #endif | 4006 | #endif |
| 3994 | 4007 | ||
| 3995 | static int stir(unsigned rqstd) { | 4008 | static int randL_stir(struct randL_state *st, unsigned rqstd) { |
| 3996 | unsigned count = 0; | 4009 | unsigned count = 0; |
| 3997 | int error; | 4010 | int error; |
| 3998 | unsigned char data[256]; | 4011 | unsigned char data[256]; |
| @@ -4054,6 +4067,8 @@ static int stir(unsigned rqstd) { | |||
| 4054 | close(fd); | 4067 | close(fd); |
| 4055 | } | 4068 | } |
| 4056 | 4069 | ||
| 4070 | st->pid = getpid(); | ||
| 4071 | |||
| 4057 | return 0; | 4072 | return 0; |
| 4058 | syserr: | 4073 | syserr: |
| 4059 | error = errno; | 4074 | error = errno; |
| @@ -4064,22 +4079,47 @@ error:; | |||
| 4064 | struct rusage ru; | 4079 | struct rusage ru; |
| 4065 | struct utsname un; | 4080 | struct utsname un; |
| 4066 | uintptr_t aslr; | 4081 | uintptr_t aslr; |
| 4082 | #if defined __APPLE__ | ||
| 4083 | uint64_t mt; | ||
| 4084 | #elif defined __sun | ||
| 4085 | struct timespec mt; | ||
| 4086 | #endif | ||
| 4067 | } junk; | 4087 | } junk; |
| 4068 | 4088 | ||
| 4069 | gettimeofday(&junk.tv, NULL); | 4089 | gettimeofday(&junk.tv, NULL); |
| 4070 | junk.pid = getpid(); | 4090 | junk.pid = getpid(); |
| 4071 | getrusage(RUSAGE_SELF, &junk.ru); | 4091 | getrusage(RUSAGE_SELF, &junk.ru); |
| 4072 | uname(&junk.un); | 4092 | uname(&junk.un); |
| 4073 | junk.aslr = (uintptr_t)&strcpy ^ (uintptr_t)&stir; | 4093 | junk.aslr = (uintptr_t)&strcpy ^ (uintptr_t)&randL_stir; |
| 4094 | #if defined __APPLE__ | ||
| 4095 | junk.mt = mach_absolute_time(); | ||
| 4096 | #elif defined __sun | ||
| 4097 | /* | ||
| 4098 | * NOTE: Linux requires -lrt for clock_gettime, and in any event | ||
| 4099 | * already has RANDOM_UUID. The BSDs have KERN_URND and KERN_ARND. | ||
| 4100 | * Just do this for Solaris to keep things simple. We've already | ||
| 4101 | * crossed the line of what can be reasonably accomplished on | ||
| 4102 | * unreasonable platforms. | ||
| 4103 | */ | ||
| 4104 | clock_gettime(CLOCK_MONOTONIC, &junk.mt); | ||
| 4105 | #endif | ||
| 4074 | 4106 | ||
| 4075 | RAND_add(&junk, sizeof junk, 0.1); | 4107 | RAND_add(&junk, sizeof junk, 0.1); |
| 4076 | 4108 | ||
| 4109 | st->pid = getpid(); | ||
| 4110 | |||
| 4077 | return error; | 4111 | return error; |
| 4078 | } /* stir() */ | 4112 | } /* randL_stir() */ |
| 4113 | |||
| 4114 | |||
| 4115 | static void randL_checkpid(struct randL_state *st) { | ||
| 4116 | if (st->pid != getpid()) | ||
| 4117 | (void)randL_stir(st, 16); | ||
| 4118 | } /* randL_checkpid() */ | ||
| 4079 | 4119 | ||
| 4080 | 4120 | ||
| 4081 | static int rand_stir(lua_State *L) { | 4121 | static int rand_stir(lua_State *L) { |
| 4082 | int error = stir(luaL_optunsigned(L, 1, 16)); | 4122 | int error = randL_stir(randL_getstate(L), luaL_optunsigned(L, 1, 16)); |
| 4083 | 4123 | ||
| 4084 | if (error) { | 4124 | if (error) { |
| 4085 | lua_pushboolean(L, 0); | 4125 | lua_pushboolean(L, 0); |
| @@ -4116,6 +4156,8 @@ static int rand_bytes(lua_State *L) { | |||
| 4116 | luaL_Buffer B; | 4156 | luaL_Buffer B; |
| 4117 | int count = 0, n; | 4157 | int count = 0, n; |
| 4118 | 4158 | ||
| 4159 | randL_checkpid(randL_getstate(L)); | ||
| 4160 | |||
| 4119 | luaL_buffinit(L, &B); | 4161 | luaL_buffinit(L, &B); |
| 4120 | 4162 | ||
| 4121 | while (count < size) { | 4163 | while (count < size) { |
| @@ -4219,6 +4261,8 @@ static unsigned long long rand_llu(lua_State *L) { | |||
| 4219 | static int rand_uniform(lua_State *L) { | 4261 | static int rand_uniform(lua_State *L) { |
| 4220 | unsigned long long r; | 4262 | unsigned long long r; |
| 4221 | 4263 | ||
| 4264 | randL_checkpid(randL_getstate(L)); | ||
| 4265 | |||
| 4222 | if (lua_isnoneornil(L, 1)) { | 4266 | if (lua_isnoneornil(L, 1)) { |
| 4223 | r = rand_llu(L); | 4267 | r = rand_llu(L); |
| 4224 | } else { | 4268 | } else { |
| @@ -4261,9 +4305,14 @@ static const luaL_Reg rand_globals[] = { | |||
| 4261 | }; | 4305 | }; |
| 4262 | 4306 | ||
| 4263 | int luaopen__openssl_rand(lua_State *L) { | 4307 | int luaopen__openssl_rand(lua_State *L) { |
| 4308 | struct randL_state *st; | ||
| 4309 | |||
| 4264 | initall(L); | 4310 | initall(L); |
| 4265 | 4311 | ||
| 4266 | luaL_newlib(L, rand_globals); | 4312 | luaL_newlibtable(L, rand_globals); |
| 4313 | st = lua_newuserdata(L, sizeof *st); | ||
| 4314 | memset(st, 0, sizeof *st); | ||
| 4315 | luaL_setfuncs(L, rand_globals, 1); | ||
| 4267 | 4316 | ||
| 4268 | return 1; | 4317 | return 1; |
| 4269 | } /* luaopen__openssl_rand() */ | 4318 | } /* luaopen__openssl_rand() */ |
