Skip to content
Snippets Groups Projects
Commit 6363cebe authored by Guy Zana's avatar Guy Zana
Browse files

Ported arc4random.c, make arc4random() available

parent 660b7401
No related branches found
No related tags found
No related merge requests found
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
extern "C" { extern "C" {
#include <bsd/porting/netport.h> #include <bsd/porting/netport.h>
#include <bsd/sys/sys/libkern.h>
#include <bsd/sys/sys/eventhandler.h> #include <bsd/sys/sys/eventhandler.h>
#include <bsd/sys/sys/mbuf.h> #include <bsd/sys/sys/mbuf.h>
#include <bsd/sys/net/netisr.h> #include <bsd/sys/net/netisr.h>
...@@ -15,6 +16,7 @@ extern "C" { ...@@ -15,6 +16,7 @@ extern "C" {
void net_init(void) void net_init(void)
{ {
debug("Initializing network stack..."); debug("Initializing network stack...");
arc4_init();
eventhandler_init(NULL); eventhandler_init(NULL);
mbuf_init(NULL); mbuf_init(NULL);
netisr_init(NULL); netisr_init(NULL);
......
...@@ -9,17 +9,16 @@ ...@@ -9,17 +9,16 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <bsd/porting/netport.h>
#include <bsd/porting/sync_stub.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/random.h>
#include <sys/libkern.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/time.h> #include <sys/time.h>
#include <bsd/sys/sys/param.h>
#include <bsd/sys/sys/libkern.h>
#define ARC4_RESEED_BYTES 65536 #define ARC4_RESEED_BYTES 65536
#define ARC4_RESEED_SECONDS 300 #define ARC4_RESEED_SECONDS 300
#define ARC4_KEYBYTES (256 / 8) #define ARC4_KEYBYTES (256 / 8)
...@@ -32,6 +31,16 @@ static struct mtx arc4_mtx; ...@@ -32,6 +31,16 @@ static struct mtx arc4_mtx;
static u_int8_t arc4_randbyte(void); static u_int8_t arc4_randbyte(void);
uint8_t read_random_gen = 0;
static int read_random(uint8_t* buf, int count)
{
for (int i=0; i<count; i++) {
buf[i] = read_random_gen++;
}
return (count);
}
static __inline void static __inline void
arc4_swap(u_int8_t *a, u_int8_t *b) arc4_swap(u_int8_t *a, u_int8_t *b)
{ {
...@@ -57,7 +66,7 @@ arc4_randomstir (void) ...@@ -57,7 +66,7 @@ arc4_randomstir (void)
* device is not loaded -- MarkM. * device is not loaded -- MarkM.
*/ */
r = read_random(key, ARC4_KEYBYTES); r = read_random(key, ARC4_KEYBYTES);
getmicrouptime(&tv_now); getmicrotime(&tv_now);
mtx_lock(&arc4_mtx); mtx_lock(&arc4_mtx);
/* If r == 0 || -1, just use what was on the stack. */ /* If r == 0 || -1, just use what was on the stack. */
if (r > 0) { if (r > 0) {
...@@ -88,8 +97,7 @@ arc4_randomstir (void) ...@@ -88,8 +97,7 @@ arc4_randomstir (void)
/* /*
* Initialize our S-box to its beginning defaults. * Initialize our S-box to its beginning defaults.
*/ */
static void void arc4_init(void)
arc4_init(void)
{ {
int n; int n;
...@@ -129,7 +137,7 @@ arc4rand(void *ptr, u_int len, int reseed) ...@@ -129,7 +137,7 @@ arc4rand(void *ptr, u_int len, int reseed)
u_char *p; u_char *p;
struct timeval tv; struct timeval tv;
getmicrouptime(&tv); getmicrotime(&tv);
if (reseed || if (reseed ||
(arc4_numruns > ARC4_RESEED_BYTES) || (arc4_numruns > ARC4_RESEED_BYTES) ||
(tv.tv_sec > arc4_t_reseed)) (tv.tv_sec > arc4_t_reseed))
......
...@@ -35,156 +35,15 @@ ...@@ -35,156 +35,15 @@
#include <sys/cdefs.h> #include <sys/cdefs.h>
#include <sys/types.h> #include <sys/types.h>
#ifdef _KERNEL
#include <sys/systm.h>
#endif
#ifndef LIBKERN_INLINE #ifndef LIBKERN_INLINE
#define LIBKERN_INLINE static __inline #define LIBKERN_INLINE static __inline
#define LIBKERN_BODY #define LIBKERN_BODY
#endif #endif
/* BCD conversions. */
extern u_char const bcd2bin_data[];
extern u_char const bin2bcd_data[];
extern char const hex2ascii_data[];
#define bcd2bin(bcd) (bcd2bin_data[bcd])
#define bin2bcd(bin) (bin2bcd_data[bin])
#define hex2ascii(hex) (hex2ascii_data[hex])
static __inline int imax(int a, int b) { return (a > b ? a : b); }
static __inline int imin(int a, int b) { return (a < b ? a : b); }
static __inline long lmax(long a, long b) { return (a > b ? a : b); }
static __inline long lmin(long a, long b) { return (a < b ? a : b); }
static __inline u_int max(u_int a, u_int b) { return (a > b ? a : b); }
static __inline u_int min(u_int a, u_int b) { return (a < b ? a : b); }
static __inline quad_t qmax(quad_t a, quad_t b) { return (a > b ? a : b); }
static __inline quad_t qmin(quad_t a, quad_t b) { return (a < b ? a : b); }
static __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); }
static __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); }
static __inline off_t omax(off_t a, off_t b) { return (a > b ? a : b); }
static __inline off_t omin(off_t a, off_t b) { return (a < b ? a : b); }
static __inline int abs(int a) { return (a < 0 ? -a : a); }
static __inline long labs(long a) { return (a < 0 ? -a : a); }
static __inline quad_t qabs(quad_t a) { return (a < 0 ? -a : a); }
/* Prototypes for non-quad routines. */ /* Prototypes for non-quad routines. */
struct malloc_type; void arc4_init(void);
uint32_t arc4random(void); uint32_t arc4random(void);
void arc4rand(void *ptr, u_int len, int reseed); void arc4rand(void *ptr, u_int len, int reseed);
int bcmp(const void *, const void *, size_t);
void *bsearch(const void *, const void *, size_t,
size_t, int (*)(const void *, const void *));
#ifndef HAVE_INLINE_FFS
int ffs(int);
#endif
#ifndef HAVE_INLINE_FFSL
int ffsl(long);
#endif
#ifndef HAVE_INLINE_FLS
int fls(int);
#endif
#ifndef HAVE_INLINE_FLSL
int flsl(long);
#endif
int fnmatch(const char *, const char *, int);
int locc(int, char *, u_int);
void *memchr(const void *s, int c, size_t n);
int memcmp(const void *b1, const void *b2, size_t len);
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
void qsort_r(void *base, size_t nmemb, size_t size, void *thunk,
int (*compar)(void *, const void *, const void *));
u_long random(void);
char *index(const char *, int);
char *rindex(const char *, int);
int scanc(u_int, const u_char *, const u_char *, int);
int skpc(int, int, char *);
void srandom(u_long);
int strcasecmp(const char *, const char *);
char *strcat(char * __restrict, const char * __restrict);
int strcmp(const char *, const char *);
char *strcpy(char * __restrict, const char * __restrict);
size_t strcspn(const char * __restrict, const char * __restrict) __pure;
char *strdup(const char *__restrict, struct malloc_type *);
size_t strlcat(char *, const char *, size_t);
size_t strlcpy(char *, const char *, size_t);
size_t strlen(const char *);
int strncasecmp(const char *, const char *, size_t);
int strncmp(const char *, const char *, size_t);
char *strncpy(char * __restrict, const char * __restrict, size_t);
size_t strnlen(const char *, size_t);
char *strsep(char **, const char *delim);
size_t strspn(const char *, const char *);
char *strstr(const char *, const char *);
int strvalid(const char *, size_t);
extern uint32_t crc32_tab[];
static __inline uint32_t
crc32_raw(const void *buf, size_t size, uint32_t crc)
{
const uint8_t *p = (const uint8_t *)buf;
while (size--)
crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
return (crc);
}
static __inline uint32_t
crc32(const void *buf, size_t size)
{
uint32_t crc;
crc = crc32_raw(buf, size, ~0U);
return (crc ^ ~0U);
}
uint32_t
calculate_crc32c(uint32_t crc32c, const unsigned char *buffer,
unsigned int length);
LIBKERN_INLINE void *memset(void *, int, size_t);
#ifdef LIBKERN_BODY
LIBKERN_INLINE void *
memset(void *b, int c, size_t len)
{
char *bb;
if (c == 0)
bzero(b, len);
else
for (bb = (char *)b; len--; )
*bb++ = c;
return (b);
}
#endif
static __inline char *
strchr(const char *p, int ch)
{
return (index(p, ch));
}
static __inline char *
strrchr(const char *p, int ch)
{
return (rindex(p, ch));
}
/* fnmatch() return values. */
#define FNM_NOMATCH 1 /* Match failed. */
/* fnmatch() flags. */
#define FNM_NOESCAPE 0x01 /* Disable backslash escaping. */
#define FNM_PATHNAME 0x02 /* Slash must be matched by slash. */
#define FNM_PERIOD 0x04 /* Period must be matched by period. */
#define FNM_LEADING_DIR 0x08 /* Ignore /<tail> after Imatch. */
#define FNM_CASEFOLD 0x10 /* Case insensitive search. */
#define FNM_IGNORECASE FNM_CASEFOLD
#define FNM_FILE_NAME FNM_PATHNAME
#endif /* !_SYS_LIBKERN_H_ */ #endif /* !_SYS_LIBKERN_H_ */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment