Debugging. My attempt at EVENTHANDLER(multiuser) was a failure; use EVENTHANDLER(mountroot) instead.
This means we can't count on /var being present, so something will need to be done about harvesting /var/db/entropy/... . Some policy now needs to be sorted out, and a pre-sync cache needs to be written, but apart from that we are now ready to go. Over to review.
This commit is contained in:
parent
01bbfbe6b5
commit
04741fa764
@ -25,7 +25,6 @@
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
@ -46,6 +45,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/unistd.h>
|
||||
|
||||
#include <machine/cpu.h>
|
||||
#include <machine/vmparam.h>
|
||||
|
||||
#include <dev/random/randomdev.h>
|
||||
#include <dev/random/randomdev_soft.h>
|
||||
@ -80,21 +80,18 @@ static struct proc *random_kthread_proc;
|
||||
|
||||
static const char *entropy_files[] = {
|
||||
"/entropy",
|
||||
"/var/db/entropy",
|
||||
"/boot/entropy", /* Yeah, Yeah. I know this is loaded by
|
||||
* loader(8), but not always, and it doesn't
|
||||
* hurt to do this again.
|
||||
*/
|
||||
NULL
|
||||
};
|
||||
|
||||
/* Deal with entropy cached externally if this is present.
|
||||
* Lots of policy may eventually arrive in this function.
|
||||
* Called after / is mounted.
|
||||
*/
|
||||
static void
|
||||
random_harvestq_cache(void *arg __unused)
|
||||
{
|
||||
const char **entropy_file;
|
||||
uint8_t *keyfile, *data;
|
||||
uint8_t *keyfile, *data, *zbuf;
|
||||
size_t size, i;
|
||||
int error;
|
||||
|
||||
@ -104,21 +101,34 @@ random_harvestq_cache(void *arg __unused)
|
||||
data = preload_fetch_addr(keyfile);
|
||||
size = preload_fetch_size(keyfile);
|
||||
if (data != NULL && size != 0) {
|
||||
for (i = 0U; i < size; i += 16)
|
||||
random_harvestq_internal(get_cyclecount(), data + i, 16, (16*8)/4, RANDOM_CACHED);
|
||||
for (i = 0; i < size; i += 16)
|
||||
random_harvestq_internal(get_cyclecount(), data + i, 16, 16, RANDOM_CACHED);
|
||||
printf("random: read %zu bytes from preloaded cache\n", size);
|
||||
bzero(data, size);
|
||||
}
|
||||
else
|
||||
printf("random: no preloaded entropy cache available\n");
|
||||
}
|
||||
|
||||
/* Read and attempt to overwrite the entropy cache files.
|
||||
* If the file exists, can be read and then overwritten,i
|
||||
* then use it. Ignore it otherwise, but print out what is
|
||||
* going on.
|
||||
*/
|
||||
data = malloc(PAGE_SIZE, M_ENTROPY, M_WAITOK);
|
||||
zbuf = __DECONST(void *, zero_region);
|
||||
for (entropy_file = entropy_files; *entropy_file; entropy_file++) {
|
||||
error = randomdev_read_file(*entropy_file, data);
|
||||
error = randomdev_read_file(*entropy_file, data, PAGE_SIZE);
|
||||
if (error == 0) {
|
||||
for (i = 0U; i < PAGE_SIZE; i += 16)
|
||||
random_harvestq_internal(get_cyclecount(), data + i, 16, (16*8)/4, RANDOM_CACHED);
|
||||
printf("random: read %d bytes from '%s'\n", PAGE_SIZE, *entropy_file);
|
||||
printf("random: entropy cache '%s' provides %d bytes\n", *entropy_file, PAGE_SIZE);
|
||||
error = randomdev_write_file(*entropy_file, zbuf, PAGE_SIZE);
|
||||
if (error == 0) {
|
||||
printf("random: entropy cache '%s' contents used and successfully overwritten\n", *entropy_file);
|
||||
for (i = 0; i < PAGE_SIZE; i += 16)
|
||||
random_harvestq_internal(get_cyclecount(), data + i, 16, 16, RANDOM_CACHED);
|
||||
}
|
||||
else
|
||||
printf("random: entropy cache '%s' not overwritten and therefore not used; error = %d\n", *entropy_file, error);
|
||||
}
|
||||
else
|
||||
printf("random: entropy cache '%s' not present or unreadable; error = %d\n", *entropy_file, error);
|
||||
@ -126,7 +136,7 @@ random_harvestq_cache(void *arg __unused)
|
||||
bzero(data, PAGE_SIZE);
|
||||
free(data, M_ENTROPY);
|
||||
}
|
||||
EVENTHANDLER_DEFINE(multiuser, random_harvestq_cache, NULL, 0);
|
||||
EVENTHANDLER_DEFINE(mountroot, random_harvestq_cache, NULL, 0);
|
||||
|
||||
static void
|
||||
random_kthread(void *arg)
|
||||
|
@ -39,7 +39,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <dev/random/rwfile.h>
|
||||
|
||||
int
|
||||
randomdev_read_file(const char *filename, void *buf)
|
||||
randomdev_read_file(const char *filename, void *buf, size_t length)
|
||||
{
|
||||
struct nameidata nd;
|
||||
struct thread* td = curthread;
|
||||
@ -55,8 +55,7 @@ randomdev_read_file(const char *filename, void *buf)
|
||||
if (nd.ni_vp->v_type != VREG)
|
||||
error = ENOEXEC;
|
||||
else
|
||||
error = vn_rdwr(UIO_READ, nd.ni_vp, buf, PAGE_SIZE, 0, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td);
|
||||
|
||||
error = vn_rdwr(UIO_READ, nd.ni_vp, buf, length, 0, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td);
|
||||
VOP_UNLOCK(nd.ni_vp, 0);
|
||||
vn_close(nd.ni_vp, FREAD, td->td_ucred, td);
|
||||
}
|
||||
@ -65,7 +64,7 @@ randomdev_read_file(const char *filename, void *buf)
|
||||
}
|
||||
|
||||
int
|
||||
randomdev_write_file(const char *filename, void *buf)
|
||||
randomdev_write_file(const char *filename, void *buf, size_t length)
|
||||
{
|
||||
struct nameidata nd;
|
||||
struct thread* td = curthread;
|
||||
@ -81,7 +80,7 @@ randomdev_write_file(const char *filename, void *buf)
|
||||
if (nd.ni_vp->v_type != VREG)
|
||||
error = ENOEXEC;
|
||||
else
|
||||
error = vn_rdwr(UIO_WRITE, nd.ni_vp, buf, PAGE_SIZE, 0, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td);
|
||||
error = vn_rdwr(UIO_WRITE, nd.ni_vp, buf, length, 0, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td);
|
||||
|
||||
VOP_UNLOCK(nd.ni_vp, 0);
|
||||
vn_close(nd.ni_vp, FREAD, td->td_ucred, td);
|
||||
|
@ -26,5 +26,5 @@
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
int randomdev_read_file(const char *filename, void *buf);
|
||||
int randomdev_write_file(const char *filename, void *buf);
|
||||
int randomdev_read_file(const char *filename, void *buf, size_t);
|
||||
int randomdev_write_file(const char *filename, void *buf, size_t);
|
||||
|
@ -847,8 +847,6 @@ kick_init(const void *udata __unused)
|
||||
{
|
||||
struct thread *td;
|
||||
|
||||
EVENTHANDLER_INVOKE(multiuser);
|
||||
|
||||
td = FIRST_THREAD_IN_PROC(initproc);
|
||||
thread_lock(td);
|
||||
TD_SET_CAN_RUN(td);
|
||||
|
@ -192,10 +192,6 @@ EVENTHANDLER_DECLARE(vm_lowmem, vm_lowmem_handler_t);
|
||||
typedef void (*mountroot_handler_t)(void *);
|
||||
EVENTHANDLER_DECLARE(mountroot, mountroot_handler_t);
|
||||
|
||||
/* Going multiuser (starting pid 1) event */
|
||||
typedef void (*multiuser_handler_t)(void *);
|
||||
EVENTHANDLER_DECLARE(multiuser, multiuser_handler_t);
|
||||
|
||||
/* File system mount events */
|
||||
struct mount;
|
||||
struct vnode;
|
||||
|
Loading…
Reference in New Issue
Block a user