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:
markm 2013-10-08 06:54:52 +00:00
parent 01bbfbe6b5
commit 04741fa764
5 changed files with 30 additions and 27 deletions

View File

@ -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)

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;