Mix random data directly into the pool and increase entropy instead of
estimating entropy with polling based timing.
This commit is contained in:
parent
a1eef7d6a4
commit
bab65a8da3
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pchb_rnd.c,v 1.7 2001/03/30 12:05:02 mycroft Exp $ */
|
||||
/* $NetBSD: pchb_rnd.c,v 1.8 2001/09/09 00:48:54 enami Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000 Michael Shalayeff
|
||||
|
@ -77,8 +77,9 @@ pchb_attach_rnd(struct pchb_softc *sc, struct pci_attach_args *pa)
|
|||
return;
|
||||
}
|
||||
|
||||
if ((bus_space_read_1(sc->sc_st, sc->sc_sh,
|
||||
I82802_RNG_HWST) & I82802_RNG_HWST_PRESENT) == 0) {
|
||||
reg8 = bus_space_read_1(sc->sc_st, sc->sc_sh,
|
||||
I82802_RNG_HWST);
|
||||
if ((reg8 & I82802_RNG_HWST_PRESENT) == 0) {
|
||||
/*
|
||||
* Random number generator is not present.
|
||||
*/
|
||||
|
@ -86,10 +87,16 @@ pchb_attach_rnd(struct pchb_softc *sc, struct pci_attach_args *pa)
|
|||
}
|
||||
|
||||
/* Enable the RNG. */
|
||||
reg8 = bus_space_read_1(sc->sc_st, sc->sc_sh,
|
||||
I82802_RNG_HWST);
|
||||
bus_space_write_1(sc->sc_st, sc->sc_sh,
|
||||
I82802_RNG_HWST, reg8 | I82802_RNG_HWST_ENABLE);
|
||||
reg8 = bus_space_read_1(sc->sc_st, sc->sc_sh,
|
||||
I82802_RNG_HWST);
|
||||
if ((reg8 & I82802_RNG_HWST_ENABLE) == 0) {
|
||||
/*
|
||||
* Couldn't enable the RNG.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
/* Check to see if we can read data from the RNG. */
|
||||
for (i = 0; i < 1000; i++) {
|
||||
|
@ -133,8 +140,13 @@ pchb_attach_rnd(struct pchb_softc *sc, struct pci_attach_args *pa)
|
|||
|
||||
callout_init(&sc->sc_rnd_ch);
|
||||
rnd_attach_source(&sc->sc_rnd_source,
|
||||
sc->sc_dev.dv_xname, RND_TYPE_UNKNOWN, 0); /* XXX */
|
||||
sc->sc_rnd_i = 4;
|
||||
sc->sc_dev.dv_xname, RND_TYPE_RNG,
|
||||
/*
|
||||
* We can't estimate entropy since we poll
|
||||
* random data periodically.
|
||||
*/
|
||||
RND_FLAG_NO_ESTIMATE);
|
||||
sc->sc_rnd_i = sizeof(sc->sc_rnd_ax);
|
||||
pchb_rnd_callout(sc);
|
||||
break;
|
||||
default:
|
||||
|
@ -150,11 +162,13 @@ pchb_rnd_callout(void *v)
|
|||
|
||||
if ((bus_space_read_1(sc->sc_st, sc->sc_sh, I82802_RNG_RNGST) &
|
||||
I82802_RNG_RNGST_DATAV) != 0) {
|
||||
sc->sc_rnd_ax = (sc->sc_rnd_ax << 8) |
|
||||
sc->sc_rnd_ax = (sc->sc_rnd_ax << NBBY) |
|
||||
bus_space_read_1(sc->sc_st, sc->sc_sh, I82802_RNG_DATA);
|
||||
if (--sc->sc_rnd_i == 0) {
|
||||
sc->sc_rnd_i = 4;
|
||||
rnd_add_uint32(&sc->sc_rnd_source, sc->sc_rnd_ax);
|
||||
sc->sc_rnd_i = sizeof(sc->sc_rnd_ax);
|
||||
rnd_add_data(&sc->sc_rnd_source, &sc->sc_rnd_ax,
|
||||
sizeof(sc->sc_rnd_ax),
|
||||
sizeof(sc->sc_rnd_ax) * NBBY);
|
||||
}
|
||||
}
|
||||
callout_reset(&sc->sc_rnd_ch, 1, pchb_rnd_callout, sc);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: rnd.c,v 1.23 2001/09/09 00:32:52 enami Exp $ */
|
||||
/* $NetBSD: rnd.c,v 1.24 2001/09/09 00:48:55 enami Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1997 The NetBSD Foundation, Inc.
|
||||
|
@ -874,6 +874,28 @@ rnd_add_uint32(rndsource_element_t *rs, u_int32_t val)
|
|||
rst->state = rnd_sample_allocate_isr(rst);
|
||||
}
|
||||
|
||||
void
|
||||
rnd_add_data(rndsource_element_t *rs, void *data, u_int32_t len,
|
||||
u_int32_t entropy)
|
||||
{
|
||||
rndsource_t *rst;
|
||||
|
||||
/* Mix in the random data directly into the pool. */
|
||||
rndpool_add_data(&rnd_pool, data, len, entropy);
|
||||
|
||||
if (rs != NULL) {
|
||||
rst = &rs->data;
|
||||
rst->total += entropy;
|
||||
|
||||
if ((rst->flags & RND_FLAG_NO_ESTIMATE) == 0)
|
||||
/* Estimate entropy using timing information */
|
||||
rnd_add_uint32(rs, *(u_int8_t *)data);
|
||||
}
|
||||
|
||||
/* Wake up any potential readers since we've just added some data. */
|
||||
rnd_wakeup_readers();
|
||||
}
|
||||
|
||||
/*
|
||||
* Timeout, run to process the events in the ring buffer. Only one of these
|
||||
* can possibly be running at a time, run at splsoftclock().
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: rnd.h,v 1.13 2001/09/09 00:32:52 enami Exp $ */
|
||||
/* $NetBSD: rnd.h,v 1.14 2001/09/09 00:48:55 enami Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1997 The NetBSD Foundation, Inc.
|
||||
|
@ -120,7 +120,9 @@ typedef struct {
|
|||
#define RND_TYPE_NET 2 /* source is a network device */
|
||||
#define RND_TYPE_TAPE 3 /* source is a tape drive */
|
||||
#define RND_TYPE_TTY 4 /* source is a tty device */
|
||||
#define RND_TYPE_MAX 4 /* last type id used */
|
||||
#define RND_TYPE_RNG 5 /* source is a random number
|
||||
generator */
|
||||
#define RND_TYPE_MAX 5 /* last type id used */
|
||||
|
||||
#ifdef _KERNEL
|
||||
typedef struct __rndsource_element rndsource_element_t;
|
||||
|
@ -152,6 +154,8 @@ int rndpool_extract_data __P((rndpool_t *, void *, u_int32_t,
|
|||
|
||||
void rnd_init __P((void));
|
||||
void rnd_add_uint32 __P((rndsource_element_t *, u_int32_t));
|
||||
void rnd_add_data __P((rndsource_element_t *, void *, u_int32_t,
|
||||
u_int32_t));
|
||||
int rnd_extract_data __P((void *, u_int32_t, u_int32_t));
|
||||
void rnd_attach_source __P((rndsource_element_t *, char *,
|
||||
u_int32_t, u_int32_t));
|
||||
|
|
Loading…
Reference in New Issue