libs/bsd: update arc4random with OpenBSD sources.
Change-Id: I68970d44677a0628681b033f1832fa7afc37d031 Reviewed-on: https://review.haiku-os.org/c/haiku/+/9856 Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: arc4random.c,v 1.54 2015/09/13 08:31:47 guenther Exp $ */
|
/* $OpenBSD: arc4random.c,v 1.58 2022/07/31 13:41:45 tb Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1996, David Mazieres <[email protected]>
|
* Copyright (c) 1996, David Mazieres <[email protected]>
|
||||||
@@ -49,6 +49,8 @@
|
|||||||
#define BLOCKSZ 64
|
#define BLOCKSZ 64
|
||||||
#define RSBUFSZ (16*BLOCKSZ)
|
#define RSBUFSZ (16*BLOCKSZ)
|
||||||
|
|
||||||
|
#define REKEY_BASE (1024*1024) /* NB. should be a power of 2 */
|
||||||
|
|
||||||
/* Marked MAP_INHERIT_ZERO, so zero'd out in fork children. */
|
/* Marked MAP_INHERIT_ZERO, so zero'd out in fork children. */
|
||||||
static struct _rs {
|
static struct _rs {
|
||||||
size_t rs_have; /* valid bytes at end of rs_buf */
|
size_t rs_have; /* valid bytes at end of rs_buf */
|
||||||
@@ -147,7 +149,7 @@ _rs_init(u_char *buf, size_t n)
|
|||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
chacha_keysetup(&rsx->rs_chacha, buf, KEYSZ * 8, 0);
|
chacha_keysetup(&rsx->rs_chacha, buf, KEYSZ * 8);
|
||||||
chacha_ivsetup(&rsx->rs_chacha, buf + KEYSZ);
|
chacha_ivsetup(&rsx->rs_chacha, buf + KEYSZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,6 +157,7 @@ static void
|
|||||||
_rs_stir(void)
|
_rs_stir(void)
|
||||||
{
|
{
|
||||||
u_char rnd[KEYSZ + IVSZ];
|
u_char rnd[KEYSZ + IVSZ];
|
||||||
|
uint32_t rekey_fuzz = 0;
|
||||||
|
|
||||||
if (getentropy(rnd, sizeof rnd) == -1)
|
if (getentropy(rnd, sizeof rnd) == -1)
|
||||||
_getentropy_fail();
|
_getentropy_fail();
|
||||||
@@ -169,7 +172,10 @@ _rs_stir(void)
|
|||||||
rs->rs_have = 0;
|
rs->rs_have = 0;
|
||||||
memset(rsx->rs_buf, 0, sizeof(rsx->rs_buf));
|
memset(rsx->rs_buf, 0, sizeof(rsx->rs_buf));
|
||||||
|
|
||||||
rs->rs_count = 1600000;
|
/* rekey interval should not be predictable */
|
||||||
|
chacha_encrypt_bytes(&rsx->rs_chacha, (uint8_t *)&rekey_fuzz,
|
||||||
|
(uint8_t *)&rekey_fuzz, sizeof(rekey_fuzz));
|
||||||
|
rs->rs_count = REKEY_BASE + (rekey_fuzz % REKEY_BASE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ D. J. Bernstein
|
|||||||
Public domain.
|
Public domain.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $OpenBSD$ */
|
/* $OpenBSD: chacha_private.h,v 1.3 2022/02/28 21:56:29 dtucker Exp $ */
|
||||||
|
|
||||||
typedef unsigned char u8;
|
typedef unsigned char u8;
|
||||||
typedef unsigned int u32;
|
typedef unsigned int u32;
|
||||||
@@ -52,7 +52,7 @@ static const char sigma[16] = "expand 32-byte k";
|
|||||||
static const char tau[16] = "expand 16-byte k";
|
static const char tau[16] = "expand 16-byte k";
|
||||||
|
|
||||||
static void
|
static void
|
||||||
chacha_keysetup(chacha_ctx *x,const u8 *k,u32 kbits,u32 ivbits)
|
chacha_keysetup(chacha_ctx *x,const u8 *k,u32 kbits)
|
||||||
{
|
{
|
||||||
const char *constants;
|
const char *constants;
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ chacha_encrypt_bytes(chacha_ctx *x,const u8 *m,u8 *c,u32 bytes)
|
|||||||
u32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;
|
u32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;
|
||||||
u8 *ctarget = NULL;
|
u8 *ctarget = NULL;
|
||||||
u8 tmp[64];
|
u8 tmp[64];
|
||||||
unsigned int i;
|
u_int i;
|
||||||
|
|
||||||
if (!bytes) return;
|
if (!bytes) return;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user