mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
mini-os/tpmback: Replace UUID field with opaque pointer
Instead of only recording the UUID field, which may not be of interest to all tpmback implementations, provide a user-settable opaque pointer associated with the tpmback instance. Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
This commit is contained in:
1 parent
368fcb5264
commit
b05cb51b06
4 files changed
+43
-7
No files matched your search
@@ -45,10 +45,10 @@ struct tpmcmd {
|
||||
domid_t domid; /* Domid of the frontend */
|
||||
uint8_t locality; /* Locality requested by the frontend */
|
||||
unsigned int handle; /* Handle of the frontend */
|
||||
unsigned char uuid[16]; /* uuid of the tpm interface */
|
||||
void *opaque; /* Opaque pointer taken from the tpmback instance */
|
||||
|
||||
unsigned int req_len; /* Size of the command in buf - set by tpmback driver */
|
||||
uint8_t* req; /* tpm command bits, allocated by driver, DON'T FREE IT */
|
||||
unsigned int req_len; /* Size of the command in buf - set by tpmback driver */
|
||||
unsigned int resp_len; /* Size of the outgoing command,
|
||||
you set this before passing the cmd object to tpmback_resp */
|
||||
uint8_t* resp; /* Buffer for response - YOU MUST ALLOCATE IT, YOU MUST ALSO FREE IT */
|
||||
@@ -94,4 +94,9 @@ int tpmback_num_frontends(void);
|
||||
* The return value is internally allocated, so don't free it */
|
||||
unsigned char* tpmback_get_uuid(domid_t domid, unsigned int handle);
|
||||
|
||||
/* Get and set the opaque pointer for a tpmback instance */
|
||||
void* tpmback_get_opaque(domid_t domid, unsigned int handle);
|
||||
/* Returns zero if successful, nonzero on failure (no such frontend) */
|
||||
int tpmback_set_opaque(domid_t domid, unsigned int handle, void* opaque);
|
||||
|
||||
#endif
|
||||
@@ -92,6 +92,7 @@ struct tpmif {
|
||||
enum { DISCONNECTED, DISCONNECTING, CONNECTED } status;
|
||||
|
||||
unsigned char uuid[16];
|
||||
void* opaque;
|
||||
|
||||
/* state flags */
|
||||
int flags;
|
||||
@@ -391,6 +392,7 @@ inline tpmif_t* __init_tpmif(domid_t domid, unsigned int handle)
|
||||
tpmif->status = DISCONNECTED;
|
||||
tpmif->page = NULL;
|
||||
tpmif->flags = 0;
|
||||
tpmif->opaque = NULL;
|
||||
memset(tpmif->uuid, 0, sizeof(tpmif->uuid));
|
||||
return tpmif;
|
||||
}
|
||||
@@ -794,6 +796,29 @@ static void generate_backend_events(const char* path)
|
||||
return;
|
||||
}
|
||||
|
||||
void* tpmback_get_opaque(domid_t domid, unsigned int handle)
|
||||
{
|
||||
tpmif_t* tpmif;
|
||||
if((tpmif = get_tpmif(domid, handle)) == NULL) {
|
||||
TPMBACK_DEBUG("get_opaque() failed, %u/%u is an invalid frontend\n", (unsigned int) domid, handle);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return tpmif->opaque;
|
||||
}
|
||||
|
||||
int tpmback_set_opaque(domid_t domid, unsigned int handle, void *opaque)
|
||||
{
|
||||
tpmif_t* tpmif;
|
||||
if((tpmif = get_tpmif(domid, handle)) == NULL) {
|
||||
TPMBACK_DEBUG("set_opaque() failed, %u/%u is an invalid frontend\n", (unsigned int) domid, handle);
|
||||
return -1;
|
||||
}
|
||||
|
||||
tpmif->opaque = opaque;
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned char* tpmback_get_uuid(domid_t domid, unsigned int handle)
|
||||
{
|
||||
tpmif_t* tpmif;
|
||||
@@ -890,12 +915,12 @@ void shutdown_tpmback(void)
|
||||
schedule();
|
||||
}
|
||||
|
||||
inline void init_tpmcmd(tpmcmd_t* tpmcmd, domid_t domid, unsigned int handle, unsigned char uuid[16])
|
||||
static void init_tpmcmd(tpmcmd_t* tpmcmd, domid_t domid, unsigned int handle, void *opaque)
|
||||
{
|
||||
tpmcmd->domid = domid;
|
||||
tpmcmd->locality = -1;
|
||||
tpmcmd->handle = handle;
|
||||
memcpy(tpmcmd->uuid, uuid, sizeof(tpmcmd->uuid));
|
||||
tpmcmd->opaque = opaque;
|
||||
tpmcmd->req = NULL;
|
||||
tpmcmd->req_len = 0;
|
||||
tpmcmd->resp = NULL;
|
||||
@@ -917,7 +942,7 @@ tpmcmd_t* get_request(tpmif_t* tpmif) {
|
||||
if((cmd = malloc(sizeof(*cmd))) == NULL) {
|
||||
goto error;
|
||||
}
|
||||
init_tpmcmd(cmd, tpmif->domid, tpmif->handle, tpmif->uuid);
|
||||
init_tpmcmd(cmd, tpmif->domid, tpmif->handle, tpmif->opaque);
|
||||
|
||||
shr = tpmif->page;
|
||||
cmd->req_len = shr->length;
|
||||
|
||||
@@ -436,6 +436,12 @@ egress:
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Set up the opaque field to contain a pointer to the UUID */
|
||||
static void set_opaque_to_uuid(domid_t domid, unsigned int handle)
|
||||
{
|
||||
tpmback_set_opaque(domid, handle, tpmback_get_uuid(domid, handle));
|
||||
}
|
||||
|
||||
TPM_RESULT vtpmmgr_init(int argc, char** argv) {
|
||||
TPM_RESULT status = TPM_SUCCESS;
|
||||
|
||||
@@ -462,7 +468,7 @@ TPM_RESULT vtpmmgr_init(int argc, char** argv) {
|
||||
}
|
||||
|
||||
//Setup tpmback device
|
||||
init_tpmback(NULL, NULL);
|
||||
init_tpmback(set_opaque_to_uuid, NULL);
|
||||
|
||||
//Setup tpm access
|
||||
switch(opts.tpmdriver) {
|
||||
|
||||
@@ -61,7 +61,7 @@ void main_loop(void) {
|
||||
tpmcmd->resp = respbuf;
|
||||
|
||||
/* Process the command */
|
||||
vtpmmgr_handle_cmd(tpmcmd->uuid, tpmcmd);
|
||||
vtpmmgr_handle_cmd(tpmcmd->opaque, tpmcmd);
|
||||
|
||||
/* Send response */
|
||||
tpmback_resp(tpmcmd);
|
||||
|
||||