diff options
Diffstat (limited to 'libc/stdlib')
-rw-r--r-- | libc/stdlib/Makefile.in | 1 | ||||
-rw-r--r-- | libc/stdlib/arc4random.c | 216 |
2 files changed, 0 insertions, 217 deletions
diff --git a/libc/stdlib/Makefile.in b/libc/stdlib/Makefile.in index 7b6eda34e..386890ce7 100644 --- a/libc/stdlib/Makefile.in +++ b/libc/stdlib/Makefile.in @@ -21,7 +21,6 @@ CSRC-y := \ CSRC-$(UCLIBC_SUSV2_LEGACY) += valloc.c CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_memalign.c CSRC-$(UCLIBC_HAS_PTY) += grantpt.c unlockpt.c ptsname.c -CSRC-$(UCLIBC_HAS_ARC4RANDOM) += arc4random.c CSRC-y += mkstemp64.c mkostemp64.c mkstemps64.c mkostemps64.c CSRC-$(UCLIBC_HAS_FLOATS) += drand48.c drand48_r.c erand48.c erand48_r.c CSRC-$(if $(findstring yy,$(UCLIBC_HAS_FLOATS)$(UCLIBC_SUSV3_LEGACY)),y) += \ diff --git a/libc/stdlib/arc4random.c b/libc/stdlib/arc4random.c deleted file mode 100644 index 03b2234ae..000000000 --- a/libc/stdlib/arc4random.c +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (c) 1996, David Mazieres <dm@uun.org> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * Arc4 random number generator for OpenBSD. - * - * This code is derived from section 17.1 of Applied Cryptography, - * second edition, which describes a stream cipher allegedly - * compatible with RSA Labs "RC4" cipher (the actual description of - * which is a trade secret). The same algorithm is used as a stream - * cipher called "arcfour" in Tatu Ylonen's ssh package. - * - * Here the stream cipher has been modified always to include entropy - * when initializing the state. That makes it impossible to - * regenerate the same random sequence twice, so this can't be used - * for encryption, but will generate good random numbers. - * - * RC4 is a registered trademark of RSA Laboratories. - */ - -/* $OpenBSD: arc4random.c,v 1.16 2007/02/12 19:58:47 otto Exp $ */ - -#include <features.h> - -#include <fcntl.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/time.h> - -struct arc4_stream { - u_int8_t i; - u_int8_t j; - u_int8_t s[256]; -}; - -static smallint rs_initialized; -static struct arc4_stream rs; -static pid_t arc4_stir_pid; -static int arc4_count; - -static __inline__ void -arc4_init(struct arc4_stream *as) -{ - int n; - - for (n = 0; n < 256; n++) - as->s[n] = n; - as->i = 0; - as->j = 0; -} - -static __inline__ u_int8_t -arc4_getbyte(struct arc4_stream *as) -{ - u_int8_t si, sj; - - as->i = (as->i + 1); - si = as->s[as->i]; - as->j = (as->j + si); - sj = as->s[as->j]; - as->s[as->i] = sj; - as->s[as->j] = si; - return (as->s[(si + sj) & 0xff]); -} - -static __inline__ void -arc4_addrandom(struct arc4_stream *as, u_char *dat, int datlen) -{ - int n; - u_int8_t si; - - as->i--; - for (n = 0; n < 256; n++) { - as->i = (as->i + 1); - si = as->s[as->i]; - as->j = (as->j + si + dat[n % datlen]); - as->s[as->i] = as->s[as->j]; - as->s[as->j] = si; - } - as->j = as->i; -} - -static void -arc4_stir(struct arc4_stream *as) -{ - int n; - u_char rnd[128]; - struct timeval tv; - -#ifndef __ARC4RANDOM_USES_NODEV__ - int fd; - - fd = open("/dev/urandom", O_RDONLY); - if (fd != -1) { - read(fd, rnd, sizeof(rnd)); - close(fd); - } - /* Did the pseudo-random device fail? Use gettimeofday(). */ - else -#endif - if (gettimeofday(&tv, NULL) != (-1)) { - - /* Initialize the first element so it's hopefully not '0', - * to help out the next loop. Tossing in some prime numbers - * probably can't hurt. */ - rnd[0] = (tv.tv_sec % 10000) * 3 + tv.tv_usec * 7 + \ - (getpid() % 1000) * 13; - - for (n = 1; n < 127 ; n++) { - - /* Take advantage of the stack space. Only initialize - * elements equal to '0'. This will make the rnd[] - * array much less vulnerable to timing attacks. Here - * we'll stir getpid() into the value of the previous - * element. Approximately 1 in 128 elements will still - * become '0'. */ - - if (rnd[n] == 0) { - rnd[n] = ((rnd[n - 1] + n) ^ \ - ((getpid() % 1000) * 17)); - } - } - } - else { - /* gettimeofday() failed? Do the same thing as above, but only - * with getpid(). */ - - rnd[0] = (getpid() % 1000) * 19; - for (n = 1; n < 127 ; n++) { - if (rnd[n] == 0) { - rnd[n] = ((rnd[n - 1] + n) ^ \ - ((getpid() % 1000) * 23)); - } - } - } - - arc4_stir_pid = getpid(); - arc4_addrandom(as, rnd, sizeof(rnd)); - - /* - * Discard early keystream, as per recommendations. - * Network Operations Division Cryptographic requirements - * published on wikileaks on march 2017 - */ - for (n = 0; n < 3072; n++) - (void)arc4_getbyte(as); - arc4_count = 1600000; -} - -#if 0 -static void __arc4random_stir(void); -/* - * __arc4_getbyte() is a libc private function intended for use - * with malloc. - */ -u_int8_t -__arc4_getbyte(void) -{ - if (--arc4_count == 0 || !rs_initialized) - __arc4random_stir(); - return arc4_getbyte(&rs); -} -#endif - -static __inline__ u_int32_t -arc4_getword(struct arc4_stream *as) -{ - u_int32_t val; - val = arc4_getbyte(as) << 24; - val |= arc4_getbyte(as) << 16; - val |= arc4_getbyte(as) << 8; - val |= arc4_getbyte(as); - return val; -} - -static void -__arc4random_stir(void) -{ - if (!rs_initialized) { - arc4_init(&rs); - rs_initialized = 1; - } - arc4_stir(&rs); -} -strong_alias(__arc4random_stir,arc4random_stir) - -void -arc4random_addrandom(u_char *dat, int datlen) -{ - if (!rs_initialized) - __arc4random_stir(); - arc4_addrandom(&rs, dat, datlen); -} - -u_int32_t -arc4random(void) -{ - arc4_count -= 4; - if (arc4_count <= 0 || !rs_initialized || arc4_stir_pid != getpid()) - __arc4random_stir(); - return arc4_getword(&rs); -} |