libsecureboot: allow control of when pseudo pcr is updated

During boot we only want to measure things which *must*
be verified - this should provide more deterministic ordering.

Reviewed by:	stevek
MFC after:	1 week
Sponsored by:	Juniper Networks
Differential Revision:	https://reviews.freebsd.org/D20297
This commit is contained in:
Simon J. Gerraty 2019-05-19 20:28:49 +00:00
parent e5ec655d67
commit 980bde5834
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=347981
4 changed files with 38 additions and 1 deletions

View file

@ -81,6 +81,8 @@ unsigned char *verify_asc(const char *, int); /* OpenPGP */
void ve_pcr_init(void);
void ve_pcr_update(unsigned char *, size_t);
ssize_t ve_pcr_get(unsigned char *, size_t);
int ve_pcr_updating_get(void);
void ve_pcr_updating_set(int);
/* flags for verify_{asc,sig,signed} */
#define VEF_VERBOSE 1

View file

@ -74,6 +74,9 @@ main(int argc, char *argv[])
}
}
#ifdef VE_PCR_SUPPORT
ve_pcr_updating_set(1);
#endif
ve_self_tests();
for ( ; optind < argc; optind++) {
@ -176,6 +179,10 @@ main(int argc, char *argv[])
}
}
}
#ifdef VE_PCR_SUPPORT
verify_pcr_export();
printf("pcr=%s\n", getenv("loader.ve.pcr"));
#endif
return (0);
}

View file

@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
static const br_hash_class *pcr_md = NULL;
static br_hash_compat_context pcr_ctx;
static size_t pcr_hlen = 0;
static int pcr_updating;
/**
* @brief initialize pcr context
@ -53,18 +54,37 @@ static size_t pcr_hlen = 0;
void
ve_pcr_init(void)
{
pcr_updating = 0;
pcr_hlen = br_sha256_SIZE;
pcr_md = &br_sha256_vtable;
pcr_md->init(&pcr_ctx.vtable);
}
/**
* @brief get pcr_updating state
*/
int
ve_pcr_updating_get(void)
{
return (pcr_updating);
}
/**
* @brief set pcr_updating state
*/
void
ve_pcr_updating_set(int updating)
{
pcr_updating = updating;
}
/**
* @brief update pcr context
*/
void
ve_pcr_update(unsigned char *data, size_t dlen)
{
if (pcr_md)
if (pcr_updating != 0 && pcr_md != NULL)
pcr_md->update(&pcr_ctx.vtable, data, dlen);
}

View file

@ -340,6 +340,14 @@ verify_file(int fd, const char *filename, off_t off, int severity)
if (rc != VE_FINGERPRINT_WRONG && loaded_manifests) {
if (severity <= VE_GUESS)
severity = severity_guess(filename);
#ifdef VE_PCR_SUPPORT
/*
* Only update pcr with things that must verify
* these tend to be processed in a more deterministic
* order, which makes our pseudo pcr more useful.
*/
ve_pcr_updating_set((severity == VE_MUST));
#endif
if ((rc = verify_fd(fd, filename, off, &st)) >= 0) {
if (verbose || severity > VE_WANT) {
#if defined(VE_DEBUG_LEVEL) && VE_DEBUG_LEVEL > 0