Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/random/random_harvestq.c
Show First 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | |||||
#include <crypto/rijndael/rijndael-api-fst.h> | #include <crypto/rijndael/rijndael-api-fst.h> | ||||
#include <crypto/sha2/sha256.h> | #include <crypto/sha2/sha256.h> | ||||
#include <dev/random/hash.h> | #include <dev/random/hash.h> | ||||
#include <dev/random/randomdev.h> | #include <dev/random/randomdev.h> | ||||
#include <dev/random/random_harvestq.h> | #include <dev/random/random_harvestq.h> | ||||
#if defined(RANDOM_ENABLE_ETHER) | |||||
gordon: Not generally a fan of double negatives in logic (ETHER_OFF == 0). But no real objection… | |||||
cemAuthorUnsubmitted Not Done Inline ActionsI'll convert it to single-negative (mask + ~ operator in the use), if that sounds better. I'm also not a fan of double negatives in logic and don't recall why I did it this way. cem: I'll convert it to single-negative (mask + `~` operator in the use), if that sounds better. | |||||
cemAuthorUnsubmitted Done Inline ActionsHm, actually I want to leave it as is. Both uses of the flag need the current sense as-is and I don't want to restructure the code where it is used. cem: Hm, actually I want to leave it as is. Both uses of the flag need the current sense as-is and… | |||||
#define _RANDOM_HARVEST_ETHER_OFF 0 | |||||
#else | |||||
#define _RANDOM_HARVEST_ETHER_OFF (1u << RANDOM_NET_ETHER) | |||||
#endif | |||||
#if defined(RANDOM_ENABLE_UMA) | |||||
#define _RANDOM_HARVEST_UMA_OFF 0 | |||||
#else | |||||
#define _RANDOM_HARVEST_UMA_OFF (1u << RANDOM_UMA) | |||||
#endif | |||||
static void random_kthread(void); | static void random_kthread(void); | ||||
static void random_sources_feed(void); | static void random_sources_feed(void); | ||||
static u_int read_rate; | static u_int read_rate; | ||||
/* List for the dynamic sysctls */ | /* List for the dynamic sysctls */ | ||||
static struct sysctl_ctx_list random_clist; | static struct sysctl_ctx_list random_clist; | ||||
▲ Show 20 Lines • Show All 174 Lines • ▼ Show 20 Lines | read_rate_increment(u_int chunk) | ||||
atomic_add_32(&read_rate, chunk); | atomic_add_32(&read_rate, chunk); | ||||
} | } | ||||
/* ARGSUSED */ | /* ARGSUSED */ | ||||
static int | static int | ||||
random_check_uint_harvestmask(SYSCTL_HANDLER_ARGS) | random_check_uint_harvestmask(SYSCTL_HANDLER_ARGS) | ||||
{ | { | ||||
static const u_int user_immutable_mask = | |||||
(((1 << ENTROPYSOURCE) - 1) & (-1UL << RANDOM_PURE_START)) | | |||||
_RANDOM_HARVEST_ETHER_OFF | _RANDOM_HARVEST_UMA_OFF; | |||||
int error; | int error; | ||||
u_int value, orig_value; | u_int value, orig_value; | ||||
orig_value = value = hc_source_mask; | orig_value = value = hc_source_mask; | ||||
error = sysctl_handle_int(oidp, &value, 0, req); | error = sysctl_handle_int(oidp, &value, 0, req); | ||||
if (error != 0 || req->newptr == NULL) | if (error != 0 || req->newptr == NULL) | ||||
return (error); | return (error); | ||||
if (flsl(value) > ENTROPYSOURCE) | if (flsl(value) > ENTROPYSOURCE) | ||||
return (EINVAL); | return (EINVAL); | ||||
/* | /* | ||||
* Disallow userspace modification of pure entropy sources. | * Disallow userspace modification of pure entropy sources. | ||||
*/ | */ | ||||
hc_source_mask = (value & ~RANDOM_HARVEST_PURE_MASK) | | hc_source_mask = (value & ~user_immutable_mask) | | ||||
(orig_value & RANDOM_HARVEST_PURE_MASK); | (orig_value & user_immutable_mask); | ||||
return (0); | return (0); | ||||
} | } | ||||
/* ARGSUSED */ | /* ARGSUSED */ | ||||
static int | static int | ||||
random_print_harvestmask(SYSCTL_HANDLER_ARGS) | random_print_harvestmask(SYSCTL_HANDLER_ARGS) | ||||
{ | { | ||||
struct sbuf sbuf; | struct sbuf sbuf; | ||||
▲ Show 20 Lines • Show All 65 Lines • ▼ Show 20 Lines | random_print_harvestmask_symbolic(SYSCTL_HANDLER_ARGS) | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
/* ARGSUSED */ | /* ARGSUSED */ | ||||
static void | static void | ||||
random_harvestq_init(void *unused __unused) | random_harvestq_init(void *unused __unused) | ||||
{ | { | ||||
static const u_int almost_everything_mask = | |||||
(((1 << (RANDOM_ENVIRONMENTAL_END + 1)) - 1) & | |||||
~_RANDOM_HARVEST_ETHER_OFF & ~_RANDOM_HARVEST_UMA_OFF); | |||||
struct sysctl_oid *random_sys_o; | struct sysctl_oid *random_sys_o; | ||||
random_sys_o = SYSCTL_ADD_NODE(&random_clist, | random_sys_o = SYSCTL_ADD_NODE(&random_clist, | ||||
SYSCTL_STATIC_CHILDREN(_kern_random), | SYSCTL_STATIC_CHILDREN(_kern_random), | ||||
OID_AUTO, "harvest", CTLFLAG_RW, 0, | OID_AUTO, "harvest", CTLFLAG_RW, 0, | ||||
"Entropy Device Parameters"); | "Entropy Device Parameters"); | ||||
hc_source_mask = RANDOM_HARVEST_EVERYTHING_MASK; | hc_source_mask = almost_everything_mask; | ||||
SYSCTL_ADD_PROC(&random_clist, | SYSCTL_ADD_PROC(&random_clist, | ||||
SYSCTL_CHILDREN(random_sys_o), | SYSCTL_CHILDREN(random_sys_o), | ||||
OID_AUTO, "mask", CTLTYPE_UINT | CTLFLAG_RW, | OID_AUTO, "mask", CTLTYPE_UINT | CTLFLAG_RW, | ||||
NULL, 0, random_check_uint_harvestmask, "IU", | NULL, 0, random_check_uint_harvestmask, "IU", | ||||
"Entropy harvesting mask"); | "Entropy harvesting mask"); | ||||
SYSCTL_ADD_PROC(&random_clist, | SYSCTL_ADD_PROC(&random_clist, | ||||
SYSCTL_CHILDREN(random_sys_o), | SYSCTL_CHILDREN(random_sys_o), | ||||
OID_AUTO, "mask_bin", CTLTYPE_STRING | CTLFLAG_RD, | OID_AUTO, "mask_bin", CTLTYPE_STRING | CTLFLAG_RD, | ||||
▲ Show 20 Lines • Show All 173 Lines • Show Last 20 Lines |
Not generally a fan of double negatives in logic (ETHER_OFF == 0). But no real objection otherwise.