Browse Source

Change _rs_allocate so it can combine the two regions (rs and rsx)

into one if a system has an awesome getentropy().  In that case it
is valid to totally throw away the rsx state in the child.  If the
getentropy() is not very good and has a lazy reseed operation, this
combining is a bad idea, and the reseed should probably continue to
use the "something old, something new" mix.  _rs_allocate() can
accomodate either method, but not on the fly.
ok matthew
OPENBSD_5_6
deraadt 10 years ago
parent
commit
884e90e06c
10 changed files with 135 additions and 138 deletions
  1. +8
    -14
      src/lib/libc/crypt/arc4random.c
  2. +17
    -14
      src/lib/libc/crypt/arc4random.h
  3. +14
    -15
      src/lib/libcrypto/arc4random/arc4random_linux.h
  4. +14
    -15
      src/lib/libcrypto/arc4random/arc4random_osx.h
  5. +14
    -15
      src/lib/libcrypto/arc4random/arc4random_solaris.h
  6. +13
    -10
      src/lib/libcrypto/arc4random/arc4random_win.h
  7. +14
    -15
      src/lib/libcrypto/crypto/arc4random_linux.h
  8. +14
    -15
      src/lib/libcrypto/crypto/arc4random_osx.h
  9. +14
    -15
      src/lib/libcrypto/crypto/arc4random_solaris.h
  10. +13
    -10
      src/lib/libcrypto/crypto/arc4random_win.h

+ 8
- 14
src/lib/libc/crypt/arc4random.c View File

@ -1,4 +1,4 @@
/* $OpenBSD: arc4random.c,v 1.47 2014/07/18 02:05:55 deraadt Exp $ */
/* $OpenBSD: arc4random.c,v 1.48 2014/07/19 00:08:41 deraadt Exp $ */
/*
* Copyright (c) 1996, David Mazieres <dm@uun.org>
@ -57,17 +57,16 @@ static struct _rs {
size_t rs_count; /* bytes till reseed */
} *rs;
static inline void *_rs_allocate(size_t len);
static inline void _rs_forkdetect(void);
static inline void _rs_forkdetectsetup(struct _rs *buf, size_t len);
#include "arc4random.h"
/* Preserved in fork children. */
static struct {
/* Maybe be preserved in fork children, if _rs_allocate() decides. */
static struct _rsx {
chacha_ctx rs_chacha; /* chacha context for random keystream */
u_char rs_buf[RSBUFSZ]; /* keystream blocks */
} *rsx;
static inline int _rs_allocate(struct _rs **, struct _rsx **);
static inline void _rs_forkdetect(void);
#include "arc4random.h"
static inline void _rs_rekey(u_char *dat, size_t datlen);
static inline void
@ -77,12 +76,7 @@ _rs_init(u_char *buf, size_t n)
return;
if (rs == NULL) {
if ((rs = _rs_allocate(sizeof(*rs))) == NULL)
abort();
_rs_forkdetectsetup(rs, sizeof(*rs));
}
if (rsx == NULL) {
if ((rsx = _rs_allocate(sizeof(*rsx))) == NULL)
if (_rs_allocate(&rs, &rsx) == -1)
abort();
}


+ 17
- 14
src/lib/libc/crypt/arc4random.h View File

@ -1,4 +1,4 @@
/* $OpenBSD: arc4random.h,v 1.1 2014/07/18 02:05:55 deraadt Exp $ */
/* $OpenBSD: arc4random.h,v 1.2 2014/07/19 00:08:41 deraadt Exp $ */
/*
* Copyright (c) 1996, David Mazieres <dm@uun.org>
@ -22,25 +22,28 @@
* Stub functions for portability.
*/
static inline void *
_rs_allocate(size_t len)
static inline int
_rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
{
void *p;
struct {
struct _rs rs;
struct _rsx rsx;
} *p;
if ((p = mmap(NULL, sizeof(*rs), PROT_READ|PROT_WRITE,
if ((p = mmap(NULL, sizeof(*p), PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
return (NULL);
return (p);
}
return (-1);
if (minherit(p, sizeof(*p), MAP_INHERIT_ZERO) == -1) {
munmap(p, sizeof(*p));
return (-1);
}
static inline void
_rs_forkdetect(void)
{
*rsp = &p->rs;
*rsxp = &p->rsx;
return (0);
}
static inline void
_rs_forkdetectsetup(struct _rs *rs, size_t len)
_rs_forkdetect(void)
{
if (minherit(rs, len, MAP_INHERIT_ZERO) == -1)
abort();
}

+ 14
- 15
src/lib/libcrypto/arc4random/arc4random_linux.h View File

@ -1,4 +1,4 @@
/* $OpenBSD: arc4random_linux.h,v 1.2 2014/07/18 21:40:54 matthew Exp $ */
/* $OpenBSD: arc4random_linux.h,v 1.3 2014/07/19 00:08:43 deraadt Exp $ */
/*
* Copyright (c) 1996, David Mazieres <dm@uun.org>
@ -22,15 +22,21 @@
* Stub functions for portability.
*/
static inline void *
_rs_allocate(size_t len)
static inline int
_rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
{
void *p;
if ((p = mmap(NULL, len, PROT_READ|PROT_WRITE,
if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
return (NULL);
return (p);
return (-1);
if ((*rsxp = mmap(NULL, sizeof(**rsxp) PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
munmap(*rsxp, sizeof(**rsxp);
return (-1);
}
_ARC4_ATFORK(_rs_forkhandler);
return (0);
}
static volatile sig_atomic_t _rs_forked;
@ -54,10 +60,3 @@ _rs_forkdetect(void)
memset(rs, 0, sizeof(*rs));
}
}
static inline void
_rs_forkdetectsetup(struct _rs *rs, size_t len)
{
_ARC4_ATFORK(_rs_forkhandler);
}

+ 14
- 15
src/lib/libcrypto/arc4random/arc4random_osx.h View File

@ -1,4 +1,4 @@
/* $OpenBSD: arc4random_osx.h,v 1.2 2014/07/18 21:40:54 matthew Exp $ */
/* $OpenBSD: arc4random_osx.h,v 1.3 2014/07/19 00:08:43 deraadt Exp $ */
/*
* Copyright (c) 1996, David Mazieres <dm@uun.org>
@ -22,15 +22,21 @@
* Stub functions for portability.
*/
static inline void *
_rs_allocate(size_t len)
static inline int
_rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
{
void *p;
if ((p = mmap(NULL, len, PROT_READ|PROT_WRITE,
if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
return (NULL);
return (p);
return (-1);
if ((*rsxp = mmap(NULL, sizeof(**rsxp) PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
munmap(*rsxp, sizeof(**rsxp);
return (-1);
}
_ARC4_ATFORK(_rs_forkhandler);
return (0);
}
static volatile sig_atomic_t _rs_forked;
@ -54,10 +60,3 @@ _rs_forkdetect(void)
memset(rs, 0, sizeof(*rs));
}
}
static inline void
_rs_forkdetectsetup(struct _rs *rs, size_t len)
{
_ARC4_ATFORK(_rs_forkhandler);
}

+ 14
- 15
src/lib/libcrypto/arc4random/arc4random_solaris.h View File

@ -1,4 +1,4 @@
/* $OpenBSD: arc4random_solaris.h,v 1.2 2014/07/18 21:40:54 matthew Exp $ */
/* $OpenBSD: arc4random_solaris.h,v 1.3 2014/07/19 00:08:43 deraadt Exp $ */
/*
* Copyright (c) 1996, David Mazieres <dm@uun.org>
@ -22,15 +22,21 @@
* Stub functions for portability.
*/
static inline void *
_rs_allocate(size_t len)
static inline int
_rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
{
void *p;
if ((p = mmap(NULL, len, PROT_READ|PROT_WRITE,
if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
return (NULL);
return (p);
return (-1);
if ((*rsxp = mmap(NULL, sizeof(**rsxp) PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
munmap(*rsxp, sizeof(**rsxp);
return (-1);
}
_ARC4_ATFORK(_rs_forkhandler);
return (0);
}
static volatile sig_atomic_t _rs_forked;
@ -54,10 +60,3 @@ _rs_forkdetect(void)
memset(rs, 0, sizeof(*rs));
}
}
static inline void
_rs_forkdetectsetup(struct _rs *rs, size_t len)
{
_ARC4_ATFORK(_rs_forkhandler);
}

+ 13
- 10
src/lib/libcrypto/arc4random/arc4random_win.h View File

@ -1,4 +1,4 @@
/* $OpenBSD: arc4random_win.h,v 1.1 2014/07/18 02:05:55 deraadt Exp $ */
/* $OpenBSD: arc4random_win.h,v 1.2 2014/07/19 00:08:43 deraadt Exp $ */
/*
* Copyright (c) 1996, David Mazieres <dm@uun.org>
@ -22,10 +22,19 @@
* Stub functions for portability.
*/
static inline void *
_rs_allocate(size_t len)
static inline int
_rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
{
return calloc(1, sizeof(*rs));
*rsp = calloc(1, sizeof(**rsp));
if (*rsp == NULL)
return (-1);
*rsxp = calloc(1, sizeof(**rsxp));
if (*rsxp == NULL) {
free(*rsp);
return (-1);
}
return (0);
}
static inline void
@ -37,9 +46,3 @@ static inline void
_rs_forkdetect(void)
{
}
static inline void
_rs_forkdetectsetup(struct _rs *rs, size_t len)
{
}

+ 14
- 15
src/lib/libcrypto/crypto/arc4random_linux.h View File

@ -1,4 +1,4 @@
/* $OpenBSD: arc4random_linux.h,v 1.2 2014/07/18 21:40:54 matthew Exp $ */
/* $OpenBSD: arc4random_linux.h,v 1.3 2014/07/19 00:08:43 deraadt Exp $ */
/*
* Copyright (c) 1996, David Mazieres <dm@uun.org>
@ -22,15 +22,21 @@
* Stub functions for portability.
*/
static inline void *
_rs_allocate(size_t len)
static inline int
_rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
{
void *p;
if ((p = mmap(NULL, len, PROT_READ|PROT_WRITE,
if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
return (NULL);
return (p);
return (-1);
if ((*rsxp = mmap(NULL, sizeof(**rsxp) PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
munmap(*rsxp, sizeof(**rsxp);
return (-1);
}
_ARC4_ATFORK(_rs_forkhandler);
return (0);
}
static volatile sig_atomic_t _rs_forked;
@ -54,10 +60,3 @@ _rs_forkdetect(void)
memset(rs, 0, sizeof(*rs));
}
}
static inline void
_rs_forkdetectsetup(struct _rs *rs, size_t len)
{
_ARC4_ATFORK(_rs_forkhandler);
}

+ 14
- 15
src/lib/libcrypto/crypto/arc4random_osx.h View File

@ -1,4 +1,4 @@
/* $OpenBSD: arc4random_osx.h,v 1.2 2014/07/18 21:40:54 matthew Exp $ */
/* $OpenBSD: arc4random_osx.h,v 1.3 2014/07/19 00:08:43 deraadt Exp $ */
/*
* Copyright (c) 1996, David Mazieres <dm@uun.org>
@ -22,15 +22,21 @@
* Stub functions for portability.
*/
static inline void *
_rs_allocate(size_t len)
static inline int
_rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
{
void *p;
if ((p = mmap(NULL, len, PROT_READ|PROT_WRITE,
if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
return (NULL);
return (p);
return (-1);
if ((*rsxp = mmap(NULL, sizeof(**rsxp) PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
munmap(*rsxp, sizeof(**rsxp);
return (-1);
}
_ARC4_ATFORK(_rs_forkhandler);
return (0);
}
static volatile sig_atomic_t _rs_forked;
@ -54,10 +60,3 @@ _rs_forkdetect(void)
memset(rs, 0, sizeof(*rs));
}
}
static inline void
_rs_forkdetectsetup(struct _rs *rs, size_t len)
{
_ARC4_ATFORK(_rs_forkhandler);
}

+ 14
- 15
src/lib/libcrypto/crypto/arc4random_solaris.h View File

@ -1,4 +1,4 @@
/* $OpenBSD: arc4random_solaris.h,v 1.2 2014/07/18 21:40:54 matthew Exp $ */
/* $OpenBSD: arc4random_solaris.h,v 1.3 2014/07/19 00:08:43 deraadt Exp $ */
/*
* Copyright (c) 1996, David Mazieres <dm@uun.org>
@ -22,15 +22,21 @@
* Stub functions for portability.
*/
static inline void *
_rs_allocate(size_t len)
static inline int
_rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
{
void *p;
if ((p = mmap(NULL, len, PROT_READ|PROT_WRITE,
if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
return (NULL);
return (p);
return (-1);
if ((*rsxp = mmap(NULL, sizeof(**rsxp) PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
munmap(*rsxp, sizeof(**rsxp);
return (-1);
}
_ARC4_ATFORK(_rs_forkhandler);
return (0);
}
static volatile sig_atomic_t _rs_forked;
@ -54,10 +60,3 @@ _rs_forkdetect(void)
memset(rs, 0, sizeof(*rs));
}
}
static inline void
_rs_forkdetectsetup(struct _rs *rs, size_t len)
{
_ARC4_ATFORK(_rs_forkhandler);
}

+ 13
- 10
src/lib/libcrypto/crypto/arc4random_win.h View File

@ -1,4 +1,4 @@
/* $OpenBSD: arc4random_win.h,v 1.1 2014/07/18 02:05:55 deraadt Exp $ */
/* $OpenBSD: arc4random_win.h,v 1.2 2014/07/19 00:08:43 deraadt Exp $ */
/*
* Copyright (c) 1996, David Mazieres <dm@uun.org>
@ -22,10 +22,19 @@
* Stub functions for portability.
*/
static inline void *
_rs_allocate(size_t len)
static inline int
_rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
{
return calloc(1, sizeof(*rs));
*rsp = calloc(1, sizeof(**rsp));
if (*rsp == NULL)
return (-1);
*rsxp = calloc(1, sizeof(**rsxp));
if (*rsxp == NULL) {
free(*rsp);
return (-1);
}
return (0);
}
static inline void
@ -37,9 +46,3 @@ static inline void
_rs_forkdetect(void)
{
}
static inline void
_rs_forkdetectsetup(struct _rs *rs, size_t len)
{
}

Loading…
Cancel
Save