Change _rs_allocate so it can combine the two regions (rs and rsx)
authorderaadt <deraadt@openbsd.org>
Sat, 19 Jul 2014 00:08:41 +0000 (00:08 +0000)
committerderaadt <deraadt@openbsd.org>
Sat, 19 Jul 2014 00:08:41 +0000 (00:08 +0000)
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

lib/libc/crypt/arc4random.c
lib/libc/crypt/arc4random.h
lib/libcrypto/arc4random/arc4random_linux.h
lib/libcrypto/arc4random/arc4random_osx.h
lib/libcrypto/arc4random/arc4random_solaris.h
lib/libcrypto/arc4random/arc4random_win.h
lib/libcrypto/crypto/arc4random_linux.h
lib/libcrypto/crypto/arc4random_osx.h
lib/libcrypto/crypto/arc4random_solaris.h
lib/libcrypto/crypto/arc4random_win.h

index d42022c..3c80beb 100644 (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();
        }
 
index e0309a3..d867687 100644 (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>
  * 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();
 }
index f02ae38..a713d15 100644 (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>
  * 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);
-}
-
index 46053a4..ea4bd70 100644 (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>
  * 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);
-}
-
index 2386dbe..ec9353f 100644 (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>
  * 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);
-}
-
index 7d01d42..1fc228d 100644 (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>
  * 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)
-{
-}
-
index f02ae38..a713d15 100644 (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>
  * 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);
-}
-
index 46053a4..ea4bd70 100644 (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>
  * 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);
-}
-
index 2386dbe..ec9353f 100644 (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>
  * 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);
-}
-
index 7d01d42..1fc228d 100644 (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>
  * 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)
-{
-}
-