* [Qemu-devel] vNVRAM / blobstore design
@ 2013-03-25 21:39 Stefan Berger
2013-03-25 22:05 ` Anthony Liguori
0 siblings, 1 reply; 31+ messages in thread
From: Stefan Berger @ 2013-03-25 21:39 UTC (permalink / raw)
To: qemu-devel, Michael S. Tsirkin
Cc: Stefan Hajnoczi, Corey Bryant, Michael Roth, Joel Schopp,
Anthony Liguori
[-- Attachment #1: Type: text/plain, Size: 9810 bytes --]
[argh, just posted this to qemu-trivial -- it's not trivial]
Hello!
I am posting this message to revive the previous discussions about the
design of vNVRAM / blobstore cc'ing (at least) those that participated
in this discussion 'back then'.
The first goal of the implementation is to provide an vNVRAM storage for
a software implementation of a TPM to store its different blobs into.
Some of the data that the TPM writes into persistent memory needs to
survive a power down / power up cycle of a virtual machine, therefore
this type of persistent storage is needed. For the vNVRAM not to become
a road-block for VM migration, we would make use of block device
migration and layer the vNVRAM on top of the block device, therefore
using virtual machine images for storing the vNVRAM data.
Besides the TPM blobs the vNVRAM should of course also be able able to
accommodate other use cases where persistent data is stored into NVRAM,
BBRAM (battery backed-up RAM) or EEPROM. As far as I know more recent
machines with UEFI also have such types of persistent memory. I believe
the current design of the vNVRAM layer accommodates other use cases as
well, though additional 'glue devices' would need to be implemented to
interact with this vNVRAM layer.
Here is a reference to the previous discussion:
http://lists.gnu.org/archive/html/qemu-devel/2011-09/msg01791.html
http://lists.gnu.org/archive/html/qemu-devel/2011-09/msg01967.html
Two aspects of the vNVRAM seem of primary interest: its API and how the
data is organized in the virtual machine image leaving its inner
workings to the side for now.
API of the vNVRAM:
------------------
The following functions and data structures are important for devices:
enum NVRAMRWOp {
NVRAM_OP_READ,
NVRAM_OP_WRITE,
NVRAM_OP_FORMAT
};
/**
* Callback function a device must provide for reading and writing
* of blobs as well as for indicating to the NVRAM layer the maximum
* blob size of the given entry. Due to the layout of the data in the
* NVRAM, the device must always write a blob with the size indicated
* during formatting.
* @op: Indication of the NVRAM operation
* @v: Input visitor in case of a read operation, output visitor in
* case of a write or format operation.
* @entry_name: Unique name of the NVRAM entry
* @opaque: opaque data previously provided when registering the NVRAM
* entry
* @errp: Pointer to an Error pointer for the visitor to indicate error
*/
typedef int (*NVRAMRWData)(enum NVRAMRWOp op, Visitor *v,
const NVRAMEntryName *entry_name, void *opaque,
Error **errp);
/**
* nvram_setup:
* @drive_id: The ID of the drive to be used as NVRAM. Following the
command
* line '-drive if=none,id=tpm-bs,file=<file>' 'tpm-bs' would
* have to be passed.
* @errcode: Pointer to an integer for an error code
* @resetfn : Device reset function
* @dev: The DeviceState to be passed to the device reset function @resetfn
*
* This function returns a pointer to VNVRAM or NULL in case an error
occurred
*/
VNVRAM *nvram_setup(const char *drive_id, int *errcode,
qdev_resetfn resetfn, DeviceState *dev);
/**
* nvram_delete:
* @nvram: The NVRAM to destroy
*
* Destroy the NVRAM previously allocated using nvram_setup.
*/
int nvram_delete(VNVRAM *nvram);
/**
* nvram_start:
* @nvram: The NVRAM to start
* @fail_on_encrypted_drive: Fail if the drive is encrypted but no
* key was provided so far to lower layers.
*
* After all blobs that the device intends to write have been registered
* with the NVRAM, this function is used to start up the NVRAM. In case
* no error occurred, 0 is returned, an error code otherwise.
*/
int nvram_start(VNVRAM *nvram, bool fail_on_encrypted_drive);
/**
* nvram_process_requests:
*
* Have the NVRAM layer process all outstanding requests and wait
* for their completion.
*/
void nvram_process_requests(void);
/**
* nvram_register_entry:
*
* @nvram: The NVRAM to register an entry with
* @entry_name: The unique name of the blob to register
* @rwdata_callback: Callback function for the NVRAM layer to
* invoke for asynchronous requests such as
* delivering the results of a read operation
* or requesting the maximum size of the blob
* when formatting.
* @opaque: Data to pass to the callback function
*
* Register an entry for the NVRAM layer to write. In case of success
* this function returns 0, an error code otherwise.
*/
int nvram_register_entry(VNVRAM *nvram, const NVRAMEntryName *entry_name,
NVRAMRWData rwdata_callback, void *opaque);
/**
* nvram_deregister_entry:
* @nvram: The NVRAM to deregister an entry from
* @entry_name: the unique name of the entry
*
* Deregister an NVRAM entry previously registered with the NVRAM layer.
* The function returns 0 on success, an error code on failure.
*/
int nvram_deregister_entry(VNVRAM *nvram, const NVRAMEntryName *entry_name);
/**
* nvram_had_fatal_error:
* @nvram: The NVRAM to check
*
* Returns true in case the NVRAM had a fatal error and
* is unusable, false if the device can be used.
*/
bool nvram_had_fatal_error(VNVRAM *nvram);
/**
* nvram_write_data:
* @nvram: The NVRAM to write the data to
* @entry_name: The name of the blob to write
* @flags: Flags indicating sychronouse or asynchronous
* operation and whether to wait for completion
* of the operation.
* @cb: callback to invoke for an async write
* @opaque: data to pass to the callback
*
* Write data into NVRAM. This function will invoke the callback
* provided in nvram_setup where an output visitor will be
* provided for writing the blob. This function returns 0 in case
* of success, an error code otherwise.
*/
int nvram_write_data(VNVRAM *nvram, const NVRAMEntryName *entry_name,
int flags, NVRAMRWFinishCB cb, void *opaque);
/**
* nvram_write_data:
* @nvram: The NVRAM to read the data from
* @entry_name: The name of the blob tow rite
* @flags: Flags indicating sychronouse or asynchronous
* operation and whether to wait for completion
* of the operation.
* @cb: callback to invoke for an async read
* @opaque: data to pass to the callback
*
* Read data from NVRAM. This function will invoke the callback
* provided in nvram_setup where an input visitor will be
* provided for reading the data. This function return 0 in
* case of success, an error code otherwise.
*/
int nvram_read_data(VNVRAM *nvram, const NVRAMEntryName *entry_name,
int flags, NVRAMRWFinishCB cb, void *opaque);
/* flags used above */
#define VNVRAM_ASYNC_F (1 << 0)
#define VNVRAM_WAIT_COMPLETION_F (1 << 1)
Organization of the data in the virtual machine image:
------------------------------------------------------
All data on the VM image are written as a single ASN.1 stream with a
header followed by the individual fixed-sized NVRAM entries. The NVRAM
layer creates the header during an NVRAM formatting step that must be
initiated by the user (or libvirt) through an HMP or QMP command.
The fact that we are writing ASN.1 formatted data into the virtual
machine image is also the reason for the recent posts of the ASN.1
visitor patch series.
/*
* The NVRAM on-disk format is as follows:
* Let '{' and '}' denote an ASN.1 sequence start and end.
*
* {
* NVRAM-header: "qemu-nvram"
* # a sequence of blobs:
* {
* 1st NVRAM entry's name
* 1st NVRAM entry's ASN.1 blob (fixed size)
* }
* {
* 2nd NVRAM entry's name
* 2nd NVRAM entry's ASN.1 blob (fixed size)
* }
* ...
* }
*/
NVRAM entries are read by searching for the entry identified by its
unique name. If it is found, the device's callback function is invoked
with an input visitor for the device to read the data.
NVRAM entries are written by searching for the entry identified by its
unique name. If it is found, the device's callback function is invoked
with an output visitor positioned to where the data need to be written
to in the VM image. The device then uses the visitor directly to write
the blob.
The ASN.1 blobs have to be of fixed size since an inflating or deflating
1st blob would require that all subsequent blobs be moved or destroy the
integrity of the ASN.1 stream.
One complication is the requirements on size of the NVRAM and the fact
the virtual machine images typically don't grow. Here users may need
a-priori knowledge as to what the size of the NVRAM has to be for the
device to properly work. In case of the the TPM for example, the TPM
requires a virtual machine image of a certain size for it to be able to
write all its blobs into. It may be necessary for human users to start
QEMU once to find out the required size of the NVRAM image (using an HMP
command) or get it through documentation. In the case of libvirt the
required image size could be hard coded into libvirt since it will not
change anymore and is a property of the device. Another possibility
would be to use QEMU APIs to re-size the image before formatting (this
at least did not work a few months ago if I recall correctly, or did not
work with all VM image formats; details here faded from memory...)
I think this is enough detail for now. Please let me know of any
comments you may have. My primary concern for now is to get clarity on
the layout of the data inside the virtual machine image. The ASN.1
visitors were written for this purpose.
Thanks and regards,
Stefan
[-- Attachment #2: Type: text/html, Size: 16424 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-25 21:39 [Qemu-devel] vNVRAM / blobstore design Stefan Berger
@ 2013-03-25 22:05 ` Anthony Liguori
2013-03-25 22:20 ` Stefan Berger
0 siblings, 1 reply; 31+ messages in thread
From: Anthony Liguori @ 2013-03-25 22:05 UTC (permalink / raw)
To: Stefan Berger, qemu-devel, Michael S. Tsirkin
Cc: Joel Schopp, Corey Bryant, Michael Roth, Stefan Hajnoczi
Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
> [argh, just posted this to qemu-trivial -- it's not trivial]
>
>
> Hello!
>
> I am posting this message to revive the previous discussions about the
> design of vNVRAM / blobstore cc'ing (at least) those that participated
> in this discussion 'back then'.
>
> The first goal of the implementation is to provide an vNVRAM storage for
> a software implementation of a TPM to store its different blobs into.
> Some of the data that the TPM writes into persistent memory needs to
> survive a power down / power up cycle of a virtual machine, therefore
> this type of persistent storage is needed. For the vNVRAM not to become
> a road-block for VM migration, we would make use of block device
> migration and layer the vNVRAM on top of the block device, therefore
> using virtual machine images for storing the vNVRAM data.
>
> Besides the TPM blobs the vNVRAM should of course also be able able to
> accommodate other use cases where persistent data is stored into
> NVRAM,
Well let's focus more on the "blob store". What are the semantics of
this? Is there a max number of blobs? Are the sizes fixed or variable?
How often are new blobs added/removed?
Regards,
Anthony Liguori
> BBRAM (battery backed-up RAM) or EEPROM. As far as I know more recent
> machines with UEFI also have such types of persistent memory. I believe
> the current design of the vNVRAM layer accommodates other use cases as
> well, though additional 'glue devices' would need to be implemented to
> interact with this vNVRAM layer.
>
> Here is a reference to the previous discussion:
>
> http://lists.gnu.org/archive/html/qemu-devel/2011-09/msg01791.html
> http://lists.gnu.org/archive/html/qemu-devel/2011-09/msg01967.html
>
> Two aspects of the vNVRAM seem of primary interest: its API and how the
> data is organized in the virtual machine image leaving its inner
> workings to the side for now.
>
>
> API of the vNVRAM:
> ------------------
>
> The following functions and data structures are important for devices:
>
>
> enum NVRAMRWOp {
> NVRAM_OP_READ,
> NVRAM_OP_WRITE,
> NVRAM_OP_FORMAT
> };
>
> /**
> * Callback function a device must provide for reading and writing
> * of blobs as well as for indicating to the NVRAM layer the maximum
> * blob size of the given entry. Due to the layout of the data in the
> * NVRAM, the device must always write a blob with the size indicated
> * during formatting.
> * @op: Indication of the NVRAM operation
> * @v: Input visitor in case of a read operation, output visitor in
> * case of a write or format operation.
> * @entry_name: Unique name of the NVRAM entry
> * @opaque: opaque data previously provided when registering the NVRAM
> * entry
> * @errp: Pointer to an Error pointer for the visitor to indicate error
> */
> typedef int (*NVRAMRWData)(enum NVRAMRWOp op, Visitor *v,
> const NVRAMEntryName *entry_name, void *opaque,
> Error **errp);
>
> /**
> * nvram_setup:
> * @drive_id: The ID of the drive to be used as NVRAM. Following the
> command
> * line '-drive if=none,id=tpm-bs,file=<file>' 'tpm-bs' would
> * have to be passed.
> * @errcode: Pointer to an integer for an error code
> * @resetfn : Device reset function
> * @dev: The DeviceState to be passed to the device reset function @resetfn
> *
> * This function returns a pointer to VNVRAM or NULL in case an error
> occurred
> */
> VNVRAM *nvram_setup(const char *drive_id, int *errcode,
> qdev_resetfn resetfn, DeviceState *dev);
>
> /**
> * nvram_delete:
> * @nvram: The NVRAM to destroy
> *
> * Destroy the NVRAM previously allocated using nvram_setup.
> */
> int nvram_delete(VNVRAM *nvram);
>
> /**
> * nvram_start:
> * @nvram: The NVRAM to start
> * @fail_on_encrypted_drive: Fail if the drive is encrypted but no
> * key was provided so far to lower layers.
> *
> * After all blobs that the device intends to write have been registered
> * with the NVRAM, this function is used to start up the NVRAM. In case
> * no error occurred, 0 is returned, an error code otherwise.
> */
> int nvram_start(VNVRAM *nvram, bool fail_on_encrypted_drive);
>
> /**
> * nvram_process_requests:
> *
> * Have the NVRAM layer process all outstanding requests and wait
> * for their completion.
> */
> void nvram_process_requests(void);
>
> /**
> * nvram_register_entry:
> *
> * @nvram: The NVRAM to register an entry with
> * @entry_name: The unique name of the blob to register
> * @rwdata_callback: Callback function for the NVRAM layer to
> * invoke for asynchronous requests such as
> * delivering the results of a read operation
> * or requesting the maximum size of the blob
> * when formatting.
> * @opaque: Data to pass to the callback function
> *
> * Register an entry for the NVRAM layer to write. In case of success
> * this function returns 0, an error code otherwise.
> */
> int nvram_register_entry(VNVRAM *nvram, const NVRAMEntryName *entry_name,
> NVRAMRWData rwdata_callback, void *opaque);
>
> /**
> * nvram_deregister_entry:
> * @nvram: The NVRAM to deregister an entry from
> * @entry_name: the unique name of the entry
> *
> * Deregister an NVRAM entry previously registered with the NVRAM layer.
> * The function returns 0 on success, an error code on failure.
> */
> int nvram_deregister_entry(VNVRAM *nvram, const NVRAMEntryName *entry_name);
>
> /**
> * nvram_had_fatal_error:
> * @nvram: The NVRAM to check
> *
> * Returns true in case the NVRAM had a fatal error and
> * is unusable, false if the device can be used.
> */
> bool nvram_had_fatal_error(VNVRAM *nvram);
>
> /**
> * nvram_write_data:
> * @nvram: The NVRAM to write the data to
> * @entry_name: The name of the blob to write
> * @flags: Flags indicating sychronouse or asynchronous
> * operation and whether to wait for completion
> * of the operation.
> * @cb: callback to invoke for an async write
> * @opaque: data to pass to the callback
> *
> * Write data into NVRAM. This function will invoke the callback
> * provided in nvram_setup where an output visitor will be
> * provided for writing the blob. This function returns 0 in case
> * of success, an error code otherwise.
> */
> int nvram_write_data(VNVRAM *nvram, const NVRAMEntryName *entry_name,
> int flags, NVRAMRWFinishCB cb, void *opaque);
>
> /**
> * nvram_write_data:
> * @nvram: The NVRAM to read the data from
> * @entry_name: The name of the blob tow rite
> * @flags: Flags indicating sychronouse or asynchronous
> * operation and whether to wait for completion
> * of the operation.
> * @cb: callback to invoke for an async read
> * @opaque: data to pass to the callback
> *
> * Read data from NVRAM. This function will invoke the callback
> * provided in nvram_setup where an input visitor will be
> * provided for reading the data. This function return 0 in
> * case of success, an error code otherwise.
> */
> int nvram_read_data(VNVRAM *nvram, const NVRAMEntryName *entry_name,
> int flags, NVRAMRWFinishCB cb, void *opaque);
>
> /* flags used above */
> #define VNVRAM_ASYNC_F (1 << 0)
> #define VNVRAM_WAIT_COMPLETION_F (1 << 1)
>
>
>
> Organization of the data in the virtual machine image:
> ------------------------------------------------------
>
> All data on the VM image are written as a single ASN.1 stream with a
> header followed by the individual fixed-sized NVRAM entries. The NVRAM
> layer creates the header during an NVRAM formatting step that must be
> initiated by the user (or libvirt) through an HMP or QMP command.
>
> The fact that we are writing ASN.1 formatted data into the virtual
> machine image is also the reason for the recent posts of the ASN.1
> visitor patch series.
>
>
> /*
> * The NVRAM on-disk format is as follows:
> * Let '{' and '}' denote an ASN.1 sequence start and end.
> *
> * {
> * NVRAM-header: "qemu-nvram"
> * # a sequence of blobs:
> * {
> * 1st NVRAM entry's name
> * 1st NVRAM entry's ASN.1 blob (fixed size)
> * }
> * {
> * 2nd NVRAM entry's name
> * 2nd NVRAM entry's ASN.1 blob (fixed size)
> * }
> * ...
> * }
> */
>
> NVRAM entries are read by searching for the entry identified by its
> unique name. If it is found, the device's callback function is invoked
> with an input visitor for the device to read the data.
>
> NVRAM entries are written by searching for the entry identified by its
> unique name. If it is found, the device's callback function is invoked
> with an output visitor positioned to where the data need to be written
> to in the VM image. The device then uses the visitor directly to write
> the blob.
>
> The ASN.1 blobs have to be of fixed size since an inflating or deflating
> 1st blob would require that all subsequent blobs be moved or destroy the
> integrity of the ASN.1 stream.
>
>
> One complication is the requirements on size of the NVRAM and the fact
> the virtual machine images typically don't grow. Here users may need
> a-priori knowledge as to what the size of the NVRAM has to be for the
> device to properly work. In case of the the TPM for example, the TPM
> requires a virtual machine image of a certain size for it to be able to
> write all its blobs into. It may be necessary for human users to start
> QEMU once to find out the required size of the NVRAM image (using an HMP
> command) or get it through documentation. In the case of libvirt the
> required image size could be hard coded into libvirt since it will not
> change anymore and is a property of the device. Another possibility
> would be to use QEMU APIs to re-size the image before formatting (this
> at least did not work a few months ago if I recall correctly, or did not
> work with all VM image formats; details here faded from memory...)
>
> I think this is enough detail for now. Please let me know of any
> comments you may have. My primary concern for now is to get clarity on
> the layout of the data inside the virtual machine image. The ASN.1
> visitors were written for this purpose.
>
>
> Thanks and regards,
> Stefan
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-25 22:05 ` Anthony Liguori
@ 2013-03-25 22:20 ` Stefan Berger
2013-03-27 15:17 ` Corey Bryant
0 siblings, 1 reply; 31+ messages in thread
From: Stefan Berger @ 2013-03-25 22:20 UTC (permalink / raw)
To: Anthony Liguori
Cc: Michael S. Tsirkin, Stefan Hajnoczi, Corey Bryant, qemu-devel,
Michael Roth, Joel Schopp
On 03/25/2013 06:05 PM, Anthony Liguori wrote:
> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>
>> [argh, just posted this to qemu-trivial -- it's not trivial]
>>
>>
>> Hello!
>>
>> I am posting this message to revive the previous discussions about the
>> design of vNVRAM / blobstore cc'ing (at least) those that participated
>> in this discussion 'back then'.
>>
>> The first goal of the implementation is to provide an vNVRAM storage for
>> a software implementation of a TPM to store its different blobs into.
>> Some of the data that the TPM writes into persistent memory needs to
>> survive a power down / power up cycle of a virtual machine, therefore
>> this type of persistent storage is needed. For the vNVRAM not to become
>> a road-block for VM migration, we would make use of block device
>> migration and layer the vNVRAM on top of the block device, therefore
>> using virtual machine images for storing the vNVRAM data.
>>
>> Besides the TPM blobs the vNVRAM should of course also be able able to
>> accommodate other use cases where persistent data is stored into
>> NVRAM,
> Well let's focus more on the "blob store". What are the semantics of
> this? Is there a max number of blobs? Are the sizes fixed or variable?
> How often are new blobs added/removed?
In case of TPM 1.2 there are 3 blobs that can be written at different
times for different reasons.
Examples: As with a real-world TPM users loading an owner-evict key into
the TPM will cause the TPM to write that owner-evict key into is own
NVRAM. This key survives a power-off of the machine. Further, the TPM
models its own NVRAM slots. Someone writing into this type of memory
will cause data to be written into the NVRAM. There are other commands
that the TPM offers that will cause data to be written into NVRAM which
users can invoke at any time.
The sizes of the NVRAM blobs of the TPM at least vary in size but I
handle this in the TPM emulation to pad them to fixed size. Depending on
how many such owner-evict keys are loaded into the TPM its permanent
state blob size may vary. Other devices may act differently.
We have a-priori knowledge about the 3 different types of blobs the TPM
device produces. They are 'registered' once at the beginning (see API)
and are not 'removed' as such.
Regards,
Stefan
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-25 22:20 ` Stefan Berger
@ 2013-03-27 15:17 ` Corey Bryant
2013-03-27 15:20 ` Corey Bryant
0 siblings, 1 reply; 31+ messages in thread
From: Corey Bryant @ 2013-03-27 15:17 UTC (permalink / raw)
To: Anthony Liguori
Cc: Michael S. Tsirkin, Stefan Hajnoczi, Kent E Yoder, Stefan Berger,
qemu-devel, Michael Roth, Joel Schopp, Kenneth Goldman
On 03/25/2013 06:20 PM, Stefan Berger wrote:
> On 03/25/2013 06:05 PM, Anthony Liguori wrote:
>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>
>>> [argh, just posted this to qemu-trivial -- it's not trivial]
>>>
>>>
>>> Hello!
>>>
>>> I am posting this message to revive the previous discussions about the
>>> design of vNVRAM / blobstore cc'ing (at least) those that participated
>>> in this discussion 'back then'.
>>>
>>> The first goal of the implementation is to provide an vNVRAM storage for
>>> a software implementation of a TPM to store its different blobs into.
>>> Some of the data that the TPM writes into persistent memory needs to
>>> survive a power down / power up cycle of a virtual machine, therefore
>>> this type of persistent storage is needed. For the vNVRAM not to become
>>> a road-block for VM migration, we would make use of block device
>>> migration and layer the vNVRAM on top of the block device, therefore
>>> using virtual machine images for storing the vNVRAM data.
>>>
>>> Besides the TPM blobs the vNVRAM should of course also be able able to
>>> accommodate other use cases where persistent data is stored into
>>> NVRAM,
>> Well let's focus more on the "blob store". What are the semantics of
>> this? Is there a max number of blobs? Are the sizes fixed or variable?
>> How often are new blobs added/removed?
The max number of blobs and frequency of usage depends on the usage
scenario and NVRAM size. But that's probably obvious.
I think we should focus on worst case scenarios where NVRAM is filled up
and used frequently.
One example is that an application can use TSS APIs to define, undefine,
read, and write to the TPM's NVRAM storage. (The TPM owner password is
required to define NVRAM data.) An application could potentially fill
up NVRAM and frequently store, change, retrieve data in various places
within NVRAM. And the data could have various sizes.
For an example of total NVRAM size, Infineon's TPM has 16K of NVRAM.
--
Regards,
Corey Bryant
>
> In case of TPM 1.2 there are 3 blobs that can be written at different
> times for different reasons.
>
> Examples: As with a real-world TPM users loading an owner-evict key into
> the TPM will cause the TPM to write that owner-evict key into is own
> NVRAM. This key survives a power-off of the machine. Further, the TPM
> models its own NVRAM slots. Someone writing into this type of memory
> will cause data to be written into the NVRAM. There are other commands
> that the TPM offers that will cause data to be written into NVRAM which
> users can invoke at any time.
>
> The sizes of the NVRAM blobs of the TPM at least vary in size but I
> handle this in the TPM emulation to pad them to fixed size. Depending on
> how many such owner-evict keys are loaded into the TPM its permanent
> state blob size may vary. Other devices may act differently.
>
> We have a-priori knowledge about the 3 different types of blobs the TPM
> device produces. They are 'registered' once at the beginning (see API)
> and are not 'removed' as such.
>
> Regards,
> Stefan
>
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-27 15:17 ` Corey Bryant
@ 2013-03-27 15:20 ` Corey Bryant
2013-03-27 15:30 ` Michael S. Tsirkin
2013-03-27 15:43 ` Kenneth Goldman
0 siblings, 2 replies; 31+ messages in thread
From: Corey Bryant @ 2013-03-27 15:20 UTC (permalink / raw)
To: Anthony Liguori
Cc: Michael S. Tsirkin, Stefan Hajnoczi, Kent E Yoder, Stefan Berger,
qemu-devel, Michael Roth, Joel Schopp, Kenneth Goldman
On 03/27/2013 11:17 AM, Corey Bryant wrote:
>
>
> On 03/25/2013 06:20 PM, Stefan Berger wrote:
>> On 03/25/2013 06:05 PM, Anthony Liguori wrote:
>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>>
>>>> [argh, just posted this to qemu-trivial -- it's not trivial]
>>>>
>>>>
>>>> Hello!
>>>>
>>>> I am posting this message to revive the previous discussions about the
>>>> design of vNVRAM / blobstore cc'ing (at least) those that participated
>>>> in this discussion 'back then'.
>>>>
>>>> The first goal of the implementation is to provide an vNVRAM storage
>>>> for
>>>> a software implementation of a TPM to store its different blobs into.
>>>> Some of the data that the TPM writes into persistent memory needs to
>>>> survive a power down / power up cycle of a virtual machine, therefore
>>>> this type of persistent storage is needed. For the vNVRAM not to become
>>>> a road-block for VM migration, we would make use of block device
>>>> migration and layer the vNVRAM on top of the block device, therefore
>>>> using virtual machine images for storing the vNVRAM data.
>>>>
>>>> Besides the TPM blobs the vNVRAM should of course also be able able to
>>>> accommodate other use cases where persistent data is stored into
>>>> NVRAM,
>>> Well let's focus more on the "blob store". What are the semantics of
>>> this? Is there a max number of blobs? Are the sizes fixed or variable?
>>> How often are new blobs added/removed?
>
> The max number of blobs and frequency of usage depends on the usage
> scenario and NVRAM size. But that's probably obvious.
>
> I think we should focus on worst case scenarios where NVRAM is filled up
> and used frequently.
>
> One example is that an application can use TSS APIs to define, undefine,
> read, and write to the TPM's NVRAM storage. (The TPM owner password is
> required to define NVRAM data.) An application could potentially fill
> up NVRAM and frequently store, change, retrieve data in various places
> within NVRAM. And the data could have various sizes.
>
> For an example of total NVRAM size, Infineon's TPM has 16K of NVRAM.
>
> --
> Regards,
> Corey Bryant
>
I just wanted to add that we could really use some direction on which
way the community would prefer we go with this. The 2 options that are
on the table at the moment for encoding/decoding the vNVRAM byte stream
are BER or JSON visitors.
--
Regards,
Corey Bryant
>>
>> In case of TPM 1.2 there are 3 blobs that can be written at different
>> times for different reasons.
>>
>> Examples: As with a real-world TPM users loading an owner-evict key into
>> the TPM will cause the TPM to write that owner-evict key into is own
>> NVRAM. This key survives a power-off of the machine. Further, the TPM
>> models its own NVRAM slots. Someone writing into this type of memory
>> will cause data to be written into the NVRAM. There are other commands
>> that the TPM offers that will cause data to be written into NVRAM which
>> users can invoke at any time.
>>
>> The sizes of the NVRAM blobs of the TPM at least vary in size but I
>> handle this in the TPM emulation to pad them to fixed size. Depending on
>> how many such owner-evict keys are loaded into the TPM its permanent
>> state blob size may vary. Other devices may act differently.
>>
>> We have a-priori knowledge about the 3 different types of blobs the TPM
>> device produces. They are 'registered' once at the beginning (see API)
>> and are not 'removed' as such.
>>
>> Regards,
>> Stefan
>>
>
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-27 15:20 ` Corey Bryant
@ 2013-03-27 15:30 ` Michael S. Tsirkin
2013-03-27 16:07 ` mdroth
2013-03-27 15:43 ` Kenneth Goldman
1 sibling, 1 reply; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-03-27 15:30 UTC (permalink / raw)
To: Corey Bryant
Cc: Stefan Berger, Stefan Hajnoczi, Kent E Yoder, qemu-devel,
Michael Roth, Joel Schopp, Kenneth Goldman, Anthony Liguori
On Wed, Mar 27, 2013 at 11:20:43AM -0400, Corey Bryant wrote:
>
>
> On 03/27/2013 11:17 AM, Corey Bryant wrote:
> >
> >
> >On 03/25/2013 06:20 PM, Stefan Berger wrote:
> >>On 03/25/2013 06:05 PM, Anthony Liguori wrote:
> >>>Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
> >>>
> >>>>[argh, just posted this to qemu-trivial -- it's not trivial]
> >>>>
> >>>>
> >>>>Hello!
> >>>>
> >>>>I am posting this message to revive the previous discussions about the
> >>>>design of vNVRAM / blobstore cc'ing (at least) those that participated
> >>>>in this discussion 'back then'.
> >>>>
> >>>>The first goal of the implementation is to provide an vNVRAM storage
> >>>>for
> >>>>a software implementation of a TPM to store its different blobs into.
> >>>>Some of the data that the TPM writes into persistent memory needs to
> >>>>survive a power down / power up cycle of a virtual machine, therefore
> >>>>this type of persistent storage is needed. For the vNVRAM not to become
> >>>>a road-block for VM migration, we would make use of block device
> >>>>migration and layer the vNVRAM on top of the block device, therefore
> >>>>using virtual machine images for storing the vNVRAM data.
> >>>>
> >>>>Besides the TPM blobs the vNVRAM should of course also be able able to
> >>>>accommodate other use cases where persistent data is stored into
> >>>>NVRAM,
> >>>Well let's focus more on the "blob store". What are the semantics of
> >>>this? Is there a max number of blobs? Are the sizes fixed or variable?
> >>>How often are new blobs added/removed?
> >
> >The max number of blobs and frequency of usage depends on the usage
> >scenario and NVRAM size. But that's probably obvious.
> >
> >I think we should focus on worst case scenarios where NVRAM is filled up
> >and used frequently.
> >
> >One example is that an application can use TSS APIs to define, undefine,
> >read, and write to the TPM's NVRAM storage. (The TPM owner password is
> >required to define NVRAM data.) An application could potentially fill
> >up NVRAM and frequently store, change, retrieve data in various places
> >within NVRAM. And the data could have various sizes.
> >
> >For an example of total NVRAM size, Infineon's TPM has 16K of NVRAM.
> >
> >--
> >Regards,
> >Corey Bryant
> >
>
> I just wanted to add that we could really use some direction on
> which way the community would prefer we go with this. The 2 options
> that are on the table at the moment for encoding/decoding the vNVRAM
> byte stream are BER or JSON visitors.
>
> --
> Regards,
> Corey Bryant
I think I like BER better. JSON seems like a bad fit for a
bunch of binary blobs.
> >>
> >>In case of TPM 1.2 there are 3 blobs that can be written at different
> >>times for different reasons.
> >>
> >>Examples: As with a real-world TPM users loading an owner-evict key into
> >>the TPM will cause the TPM to write that owner-evict key into is own
> >>NVRAM. This key survives a power-off of the machine. Further, the TPM
> >>models its own NVRAM slots. Someone writing into this type of memory
> >>will cause data to be written into the NVRAM. There are other commands
> >>that the TPM offers that will cause data to be written into NVRAM which
> >>users can invoke at any time.
> >>
> >>The sizes of the NVRAM blobs of the TPM at least vary in size but I
> >>handle this in the TPM emulation to pad them to fixed size. Depending on
> >>how many such owner-evict keys are loaded into the TPM its permanent
> >>state blob size may vary. Other devices may act differently.
> >>
> >>We have a-priori knowledge about the 3 different types of blobs the TPM
> >>device produces. They are 'registered' once at the beginning (see API)
> >>and are not 'removed' as such.
> >>
> >>Regards,
> >> Stefan
> >>
> >
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-27 15:20 ` Corey Bryant
2013-03-27 15:30 ` Michael S. Tsirkin
@ 2013-03-27 15:43 ` Kenneth Goldman
2013-03-27 15:53 ` Michael S. Tsirkin
1 sibling, 1 reply; 31+ messages in thread
From: Kenneth Goldman @ 2013-03-27 15:43 UTC (permalink / raw)
To: Corey Bryant
Cc: Michael S. Tsirkin, Stefan Hajnoczi, Kent E Yoder, Stefan Berger,
Michael Roth, qemu-devel, Joel Schopp, Anthony Liguori
[-- Attachment #1: Type: text/plain, Size: 798 bytes --]
A few comments FWIW
When I first did TPM 1.2, I stored different parts of the TPM NV data
(permanent data, owner evict keys, defined space) in different files. It
got ugly and I eventually changed to one big blob, This was far more
portable, worked better for real flash memory, etc. It also handles
integrity and/or encryption with less overhead.
As for encoding, I didn't bother with DER, XML, etc, as the TPM was big
enough without importing complex parsers. The TPM already requires
marshalling and unmarshalling code in its native binary format for command
and response handling, so I just reused that code. I added version
numbers and count values to handle changes to the format, and a hash to
detect corruption.
--
Ken Goldman kgoldman@us.ibm.com
914-945-2415 (862-2415)
[-- Attachment #2: Type: text/html, Size: 1009 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-27 15:43 ` Kenneth Goldman
@ 2013-03-27 15:53 ` Michael S. Tsirkin
2013-03-27 16:12 ` Joel Schopp
2013-03-27 16:20 ` Kenneth Goldman
0 siblings, 2 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-03-27 15:53 UTC (permalink / raw)
To: Kenneth Goldman
Cc: Stefan Berger, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
Michael Roth, qemu-devel, Joel Schopp, Anthony Liguori
On Wed, Mar 27, 2013 at 11:43:53AM -0400, Kenneth Goldman wrote:
> A few comments FWIW
>
> When I first did TPM 1.2, I stored different parts of the TPM NV data
> (permanent data, owner evict keys, defined space) in different files. It got
> ugly and I eventually changed to one big blob, This was far more portable,
> worked better for real flash memory, etc. It also handles integrity and/or
> encryption with less overhead.
>
> As for encoding, I didn't bother with DER, XML, etc, as the TPM was big enough
> without importing complex parsers. The TPM already requires marshalling and
> unmarshalling code in its native binary format for command and response
> handling, so I just reused that code. I added version numbers and count values
> to handle changes to the format, and a hash to detect corruption.
>
> --
> Ken Goldman kgoldman@us.ibm.com
> 914-945-2415 (862-2415)
Yea it's not hard to invent a random format each time we write something
on disk.
But I think ASN.1 BER will be useful to have in qemu anyway. E.g. it's a
better format for migration than what we have now. Once we have it in
tree re-using it seems cleaner than maintaining some per-TPM thing.
--
MST
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-27 15:30 ` Michael S. Tsirkin
@ 2013-03-27 16:07 ` mdroth
0 siblings, 0 replies; 31+ messages in thread
From: mdroth @ 2013-03-27 16:07 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Stefan Berger, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
qemu-devel, Joel Schopp, Kenneth Goldman, Anthony Liguori
On Wed, Mar 27, 2013 at 05:30:09PM +0200, Michael S. Tsirkin wrote:
> On Wed, Mar 27, 2013 at 11:20:43AM -0400, Corey Bryant wrote:
> >
> >
> > On 03/27/2013 11:17 AM, Corey Bryant wrote:
> > >
> > >
> > >On 03/25/2013 06:20 PM, Stefan Berger wrote:
> > >>On 03/25/2013 06:05 PM, Anthony Liguori wrote:
> > >>>Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
> > >>>
> > >>>>[argh, just posted this to qemu-trivial -- it's not trivial]
> > >>>>
> > >>>>
> > >>>>Hello!
> > >>>>
> > >>>>I am posting this message to revive the previous discussions about the
> > >>>>design of vNVRAM / blobstore cc'ing (at least) those that participated
> > >>>>in this discussion 'back then'.
> > >>>>
> > >>>>The first goal of the implementation is to provide an vNVRAM storage
> > >>>>for
> > >>>>a software implementation of a TPM to store its different blobs into.
> > >>>>Some of the data that the TPM writes into persistent memory needs to
> > >>>>survive a power down / power up cycle of a virtual machine, therefore
> > >>>>this type of persistent storage is needed. For the vNVRAM not to become
> > >>>>a road-block for VM migration, we would make use of block device
> > >>>>migration and layer the vNVRAM on top of the block device, therefore
> > >>>>using virtual machine images for storing the vNVRAM data.
> > >>>>
> > >>>>Besides the TPM blobs the vNVRAM should of course also be able able to
> > >>>>accommodate other use cases where persistent data is stored into
> > >>>>NVRAM,
> > >>>Well let's focus more on the "blob store". What are the semantics of
> > >>>this? Is there a max number of blobs? Are the sizes fixed or variable?
> > >>>How often are new blobs added/removed?
> > >
> > >The max number of blobs and frequency of usage depends on the usage
> > >scenario and NVRAM size. But that's probably obvious.
> > >
> > >I think we should focus on worst case scenarios where NVRAM is filled up
> > >and used frequently.
> > >
> > >One example is that an application can use TSS APIs to define, undefine,
> > >read, and write to the TPM's NVRAM storage. (The TPM owner password is
> > >required to define NVRAM data.) An application could potentially fill
> > >up NVRAM and frequently store, change, retrieve data in various places
> > >within NVRAM. And the data could have various sizes.
> > >
> > >For an example of total NVRAM size, Infineon's TPM has 16K of NVRAM.
> > >
> > >--
> > >Regards,
> > >Corey Bryant
> > >
> >
> > I just wanted to add that we could really use some direction on
> > which way the community would prefer we go with this. The 2 options
> > that are on the table at the moment for encoding/decoding the vNVRAM
> > byte stream are BER or JSON visitors.
> >
> > --
> > Regards,
> > Corey Bryant
>
> I think I like BER better. JSON seems like a bad fit for a
> bunch of binary blobs.
>
I agree, but I also think that if we use visitors it shouldn't matter
what visitor implementation we use on the backend. It might be a good
idea to build the code around a stable, existing visitor implementation
like the JSON visitors, and then plug in a BER visitor prior to merge
(or after, if the encoding is configurable/detectable).
If a BER visitor provides benefits over JSON (and I do see that being the
case here) and is general enough that it's interchangeable with a JSON
visitor, then I don't see any reason that code wouldn't stand on it's own
rather than as a prereq for vTPM/nvram.
> > >>
> > >>In case of TPM 1.2 there are 3 blobs that can be written at different
> > >>times for different reasons.
> > >>
> > >>Examples: As with a real-world TPM users loading an owner-evict key into
> > >>the TPM will cause the TPM to write that owner-evict key into is own
> > >>NVRAM. This key survives a power-off of the machine. Further, the TPM
> > >>models its own NVRAM slots. Someone writing into this type of memory
> > >>will cause data to be written into the NVRAM. There are other commands
> > >>that the TPM offers that will cause data to be written into NVRAM which
> > >>users can invoke at any time.
> > >>
> > >>The sizes of the NVRAM blobs of the TPM at least vary in size but I
> > >>handle this in the TPM emulation to pad them to fixed size. Depending on
> > >>how many such owner-evict keys are loaded into the TPM its permanent
> > >>state blob size may vary. Other devices may act differently.
> > >>
> > >>We have a-priori knowledge about the 3 different types of blobs the TPM
> > >>device produces. They are 'registered' once at the beginning (see API)
> > >>and are not 'removed' as such.
> > >>
> > >>Regards,
> > >> Stefan
> > >>
> > >
>
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-27 15:53 ` Michael S. Tsirkin
@ 2013-03-27 16:12 ` Joel Schopp
2013-03-27 16:46 ` Stefan Berger
2013-03-27 16:20 ` Kenneth Goldman
1 sibling, 1 reply; 31+ messages in thread
From: Joel Schopp @ 2013-03-27 16:12 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Stefan Berger, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
Michael Roth, qemu-devel, Kenneth Goldman, Anthony Liguori
> Yea it's not hard to invent a random format each time we write something
> on disk.
>
> But I think ASN.1 BER will be useful to have in qemu anyway. E.g. it's a
> better format for migration than what we have now. Once we have it in
> tree re-using it seems cleaner than maintaining some per-TPM thing.
>
The asn.1 patches that have been posted seem to be getting a cool
reception. If people think asn.1 is the way to go some more review
comments, acked-bys, reviewed-bys, or signed-off-bys would make that
more likely to happen. The patches have gone through several rounds of
review and come with a decent set of tests but still haven't been
merged. I think they are very mergable.
I'm pretty agnostic on the encoding format. If the community wanted
nvram encoded in sandscrit I'd go off and write a sandscrit encoder. We
need to decide on something.
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-27 15:53 ` Michael S. Tsirkin
2013-03-27 16:12 ` Joel Schopp
@ 2013-03-27 16:20 ` Kenneth Goldman
1 sibling, 0 replies; 31+ messages in thread
From: Kenneth Goldman @ 2013-03-27 16:20 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Stefan Berger, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
Michael Roth, qemu-devel, Joel Schopp, Anthony Liguori
[-- Attachment #1: Type: text/plain, Size: 698 bytes --]
> Yea it's not hard to invent a random format each time we write something
> on disk.
> But I think ASN.1 BER will be useful to have in qemu anyway. E.g. it's
a
> better format for migration than what we have now. Once we have it in
> tree re-using it seems cleaner than maintaining some per-TPM thing.
The DER can be reused, but someone has to go through every possible TPM
structure that could be written to NV and define ASN.1 for it. Even more
work
is writing tests for all the corner cases.
I wasn't suggesting inventing a random format, but rather using the native
TPM
binary formats that are part of its standard and for which implementation
and
test code will already exist.
[-- Attachment #2: Type: text/html, Size: 1022 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-27 16:12 ` Joel Schopp
@ 2013-03-27 16:46 ` Stefan Berger
2013-03-27 17:14 ` Anthony Liguori
0 siblings, 1 reply; 31+ messages in thread
From: Stefan Berger @ 2013-03-27 16:46 UTC (permalink / raw)
To: Joel Schopp
Cc: Michael S. Tsirkin, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
Michael Roth, qemu-devel, Kenneth Goldman, Anthony Liguori
On 03/27/2013 12:12 PM, Joel Schopp wrote:
>
>> Yea it's not hard to invent a random format each time we write something
>> on disk.
>>
>> But I think ASN.1 BER will be useful to have in qemu anyway. E.g. it's a
>> better format for migration than what we have now. Once we have it in
>> tree re-using it seems cleaner than maintaining some per-TPM thing.
>>
>
> The asn.1 patches that have been posted seem to be getting a cool
> reception. If people think asn.1 is the way to go some more review
> comments, acked-bys, reviewed-bys, or signed-off-bys would make that
> more likely to happen. The patches have gone through several rounds
> of review and come with a decent set of tests but still haven't been
> merged. I think they are very mergable.
Let me post another version that makes all the tests in
test-visitor-serialize pass, including the ones using visit_optional.
I also think they are mergeable, but we should discuss a few aspects
around it. There are standards behind this that we may or may not need
to implement as such. I am thinking of CER encoding for example that
imposes restrictions on the size of primitive elements to be less than
1000 bytes (section 9.2) and need constructed encoding when bigger. We
may be able to change this limit to PAGE_SIZE * n with n = ?. There may
be other aspects.
Stefan
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-27 16:46 ` Stefan Berger
@ 2013-03-27 17:14 ` Anthony Liguori
2013-03-27 17:27 ` Stefan Berger
2013-03-27 18:04 ` Michael S. Tsirkin
0 siblings, 2 replies; 31+ messages in thread
From: Anthony Liguori @ 2013-03-27 17:14 UTC (permalink / raw)
To: Stefan Berger, Joel Schopp
Cc: Michael S. Tsirkin, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
Michael Roth, qemu-devel, Kenneth Goldman
Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
> On 03/27/2013 12:12 PM, Joel Schopp wrote:
>>
>>> Yea it's not hard to invent a random format each time we write something
>>> on disk.
>>>
>>> But I think ASN.1 BER will be useful to have in qemu anyway. E.g. it's a
>>> better format for migration than what we have now. Once we have it in
>>> tree re-using it seems cleaner than maintaining some per-TPM thing.
>>>
>>
>> The asn.1 patches that have been posted seem to be getting a cool
>> reception. If people think asn.1 is the way to go some more review
>> comments, acked-bys, reviewed-bys, or signed-off-bys would make that
>> more likely to happen. The patches have gone through several rounds
>> of review and come with a decent set of tests but still haven't been
>> merged. I think they are very mergable.
>
> Let me post another version that makes all the tests in
> test-visitor-serialize pass, including the ones using visit_optional.
What I struggle with is that we're calling this a "blobstore". Using
BER to store "blobs" seems kind of pointless especially when we're
talking about exactly three blobs.
I suspect real hardware does something like, flash is N bytes, blob 1 is
a max of X bytes, blob 2 is a max of Y bytes, and blob 3 is (N - X - Y)
bytes.
Do we really need to do anything more than that?
Regards,
Anthony Liguori
>
> I also think they are mergeable, but we should discuss a few aspects
> around it. There are standards behind this that we may or may not need
> to implement as such. I am thinking of CER encoding for example that
> imposes restrictions on the size of primitive elements to be less than
> 1000 bytes (section 9.2) and need constructed encoding when bigger. We
> may be able to change this limit to PAGE_SIZE * n with n = ?. There may
> be other aspects.
>
> Stefan
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-27 17:14 ` Anthony Liguori
@ 2013-03-27 17:27 ` Stefan Berger
2013-03-27 18:27 ` Anthony Liguori
2013-03-27 18:04 ` Michael S. Tsirkin
1 sibling, 1 reply; 31+ messages in thread
From: Stefan Berger @ 2013-03-27 17:27 UTC (permalink / raw)
To: Anthony Liguori
Cc: Michael S. Tsirkin, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
Michael Roth, qemu-devel, Joel Schopp, Kenneth Goldman
On 03/27/2013 01:14 PM, Anthony Liguori wrote:
> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>
>>
> What I struggle with is that we're calling this a "blobstore". Using
> BER to store "blobs" seems kind of pointless especially when we're
> talking about exactly three blobs.
>
> I suspect real hardware does something like, flash is N bytes, blob 1 is
> a max of X bytes, blob 2 is a max of Y bytes, and blob 3 is (N - X - Y)
> bytes.
>
> Do we really need to do anything more than that?
I typically call it NVRAM, but earlier discussions seemed to prefer
'blobstore'.
Using BER is the 2nd design of the NVRAM/blobstore. The 1st one didn't
use any visitors but used a directory in the first sector pointing to
the actual blobs in other sectors of the block device. The organization
of the directory and assignment of the blobs to their sectors, aka 'the
layout of the data' in the disk image, was handled by the
NVRAM/blobstore implementation.
I think the least one needs is to make the NVRAM/blobstore a bit more
generic than making it too TPM-specific is to provide a layer that
organizes the blobs the device may produce and provides functions to
register those blobs, have them read or written to without the device
knowing where exactly the data are located on the storage device. A
nugget of the 1st implementation was that we could encrypt the blobs
themselves easily which made it also easier to support encrypted blobs
on non-QCOW2 devices (modulo the loss of snapshotting then).
Stefan
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-27 17:14 ` Anthony Liguori
2013-03-27 17:27 ` Stefan Berger
@ 2013-03-27 18:04 ` Michael S. Tsirkin
1 sibling, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-03-27 18:04 UTC (permalink / raw)
To: Anthony Liguori
Cc: Stefan Berger, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
Michael Roth, qemu-devel, Joel Schopp, Kenneth Goldman
On Wed, Mar 27, 2013 at 12:14:00PM -0500, Anthony Liguori wrote:
> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>
> > On 03/27/2013 12:12 PM, Joel Schopp wrote:
> >>
> >>> Yea it's not hard to invent a random format each time we write something
> >>> on disk.
> >>>
> >>> But I think ASN.1 BER will be useful to have in qemu anyway. E.g. it's a
> >>> better format for migration than what we have now. Once we have it in
> >>> tree re-using it seems cleaner than maintaining some per-TPM thing.
> >>>
> >>
> >> The asn.1 patches that have been posted seem to be getting a cool
> >> reception. If people think asn.1 is the way to go some more review
> >> comments, acked-bys, reviewed-bys, or signed-off-bys would make that
> >> more likely to happen. The patches have gone through several rounds
> >> of review and come with a decent set of tests but still haven't been
> >> merged. I think they are very mergable.
> >
> > Let me post another version that makes all the tests in
> > test-visitor-serialize pass, including the ones using visit_optional.
>
> What I struggle with is that we're calling this a "blobstore". Using
> BER to store "blobs" seems kind of pointless especially when we're
> talking about exactly three blobs.
>
> I suspect real hardware does something like, flash is N bytes, blob 1 is
> a max of X bytes, blob 2 is a max of Y bytes, and blob 3 is (N - X - Y)
> bytes.
>
> Do we really need to do anything more than that?
>
> Regards,
>
> Anthony Liguori
Last I looked some metadata was stored per blob, for example
I think it has a concept of "number of bytes initialized".
So we'll need to serialize that.
More can come with time ...
>
> >
> > I also think they are mergeable, but we should discuss a few aspects
> > around it. There are standards behind this that we may or may not need
> > to implement as such. I am thinking of CER encoding for example that
> > imposes restrictions on the size of primitive elements to be less than
> > 1000 bytes (section 9.2) and need constructed encoding when bigger. We
> > may be able to change this limit to PAGE_SIZE * n with n = ?. There may
> > be other aspects.
> >
> > Stefan
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-27 17:27 ` Stefan Berger
@ 2013-03-27 18:27 ` Anthony Liguori
2013-03-27 19:12 ` Stefan Berger
0 siblings, 1 reply; 31+ messages in thread
From: Anthony Liguori @ 2013-03-27 18:27 UTC (permalink / raw)
To: Stefan Berger
Cc: Michael S. Tsirkin, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
Michael Roth, qemu-devel, Joel Schopp, Kenneth Goldman
Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
> On 03/27/2013 01:14 PM, Anthony Liguori wrote:
>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>
>>>
>> What I struggle with is that we're calling this a "blobstore". Using
>> BER to store "blobs" seems kind of pointless especially when we're
>> talking about exactly three blobs.
>>
>> I suspect real hardware does something like, flash is N bytes, blob 1 is
>> a max of X bytes, blob 2 is a max of Y bytes, and blob 3 is (N - X - Y)
>> bytes.
>>
>> Do we really need to do anything more than that?
>
> I typically call it NVRAM, but earlier discussions seemed to prefer
> 'blobstore'.
>
> Using BER is the 2nd design of the NVRAM/blobstore. The 1st one didn't
> use any visitors but used a directory in the first sector pointing to
> the actual blobs in other sectors of the block device. The organization
> of the directory and assignment of the blobs to their sectors, aka 'the
> layout of the data' in the disk image, was handled by the
> NVRAM/blobstore implementation.
Okay, the short response is:
Just make the TPM have a DRIVE property, drop all notion of
NVRAM/blobstore, and used fixed offsets into the BlockDriverState for
each blob.
The long version is below.
> I think the least one needs is to make the NVRAM/blobstore a bit more
> generic than making it too TPM-specific
'blobstore' is not a hardware concept so making it generic is solving a
problem that doesn't exist. Hardware typically falls into one of a few
categories:
1) No persistent state
2) Persistent state stored in flash/eeprom in a way that's completely
opaque to software
3) Persistent state stored in flash/eeprom that's visible (either
directly or indirectly) to software.
For (1), there's no discussion here. For (3), we're forced to use the
same layout that real hardware uses to make the software interface the
same.
As it turns out (2) is almost always such a small amount of state that
it basically doesn't matter. It's usually stuff like hardware mac
addresses so we don't even bother storing in a marshalled format. We
just accept properties during device creation.
(2) is rare for large amounts of state because it'd be a waste of
hardware to design an interface on top of NVRAM that is only going to
serve as an API for the device driver which is usually produced by the
same company anyway.
So this is really just not a problem even worth trying to solve. Even
if it was....
> is to provide a layer that
> organizes the blobs the device may produce and provides functions to
> register those blobs, have them read or written to without the device
> knowing where exactly the data are located on the storage device. A
> nugget of the 1st implementation was that we could encrypt the blobs
> themselves easily which made it also easier to support encrypted blobs
> on non-QCOW2 devices (modulo the loss of snapshotting then).
There is already an API for store named "blobs" that allow them to be
individually encrypted or handled in QEMU. It's called the Linux VFS
interface.
Really, this whole blobstore thing is just a half-hearted filesystem.
This is why the design rat-holed so quickly. If we need to use a
filesystem, just use the host filesystem and call it a day.
Regards,
Anthony Liguori
>
> Stefan
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-27 18:27 ` Anthony Liguori
@ 2013-03-27 19:12 ` Stefan Berger
2013-03-28 16:11 ` Stefan Berger
0 siblings, 1 reply; 31+ messages in thread
From: Stefan Berger @ 2013-03-27 19:12 UTC (permalink / raw)
To: Anthony Liguori
Cc: Michael S. Tsirkin, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
Michael Roth, qemu-devel, Joel Schopp, Kenneth Goldman
On 03/27/2013 02:27 PM, Anthony Liguori wrote:
> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>
>> On 03/27/2013 01:14 PM, Anthony Liguori wrote:
>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>>
>>> What I struggle with is that we're calling this a "blobstore". Using
>>> BER to store "blobs" seems kind of pointless especially when we're
>>> talking about exactly three blobs.
>>>
>>> I suspect real hardware does something like, flash is N bytes, blob 1 is
>>> a max of X bytes, blob 2 is a max of Y bytes, and blob 3 is (N - X - Y)
>>> bytes.
>>>
>>> Do we really need to do anything more than that?
>> I typically call it NVRAM, but earlier discussions seemed to prefer
>> 'blobstore'.
>>
>> Using BER is the 2nd design of the NVRAM/blobstore. The 1st one didn't
>> use any visitors but used a directory in the first sector pointing to
>> the actual blobs in other sectors of the block device. The organization
>> of the directory and assignment of the blobs to their sectors, aka 'the
>> layout of the data' in the disk image, was handled by the
>> NVRAM/blobstore implementation.
> Okay, the short response is:
>
> Just make the TPM have a DRIVE property, drop all notion of
> NVRAM/blobstore, and used fixed offsets into the BlockDriverState for
> each blob.
Fine by me. I don't see the need for visitors. I guess sharing of the
persistent storage between different types of devices is not a goal here
so that a layer that hides the layout and the blobs' position within the
storage would be necessary. Also fine by me for as long as we don't come
back to this discussion.
Stefan
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-27 19:12 ` Stefan Berger
@ 2013-03-28 16:11 ` Stefan Berger
2013-03-28 16:31 ` Michael S. Tsirkin
` (2 more replies)
0 siblings, 3 replies; 31+ messages in thread
From: Stefan Berger @ 2013-03-28 16:11 UTC (permalink / raw)
To: Anthony Liguori
Cc: Michael S. Tsirkin, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
qemu-devel, Michael Roth, Joel Schopp, Kenneth Goldman
On 03/27/2013 03:12 PM, Stefan Berger wrote:
> On 03/27/2013 02:27 PM, Anthony Liguori wrote:
>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>
>>> On 03/27/2013 01:14 PM, Anthony Liguori wrote:
>>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>>>
>>>> What I struggle with is that we're calling this a "blobstore". Using
>>>> BER to store "blobs" seems kind of pointless especially when we're
>>>> talking about exactly three blobs.
>>>>
>>>> I suspect real hardware does something like, flash is N bytes, blob
>>>> 1 is
>>>> a max of X bytes, blob 2 is a max of Y bytes, and blob 3 is (N - X
>>>> - Y)
>>>> bytes.
>>>>
>>>> Do we really need to do anything more than that?
>>> I typically call it NVRAM, but earlier discussions seemed to prefer
>>> 'blobstore'.
>>>
>>> Using BER is the 2nd design of the NVRAM/blobstore. The 1st one didn't
>>> use any visitors but used a directory in the first sector pointing to
>>> the actual blobs in other sectors of the block device. The organization
>>> of the directory and assignment of the blobs to their sectors, aka 'the
>>> layout of the data' in the disk image, was handled by the
>>> NVRAM/blobstore implementation.
>> Okay, the short response is:
>>
>> Just make the TPM have a DRIVE property, drop all notion of
>> NVRAM/blobstore, and used fixed offsets into the BlockDriverState for
>> each blob.
>
> Fine by me. I don't see the need for visitors. I guess sharing of the
> persistent storage between different types of devices is not a goal
> here so that a layer that hides the layout and the blobs' position
> within the storage would be necessary. Also fine by me for as long as
> we don't come back to this discussion.
One thing I'd like to get clarity about is the following corner-case. A
user supplies some VM image as persistent storage for the TPM. It
contains garbage. How do we handle this case? Does the TPM then just
start writing its state into this image or do we want to have some layer
in place that forces a user to go through the step of formatting after
that layer indicates that the data are unreadable. Besides that a
completely empty image also contains garbage from the perspective of TPM
persistent state and for that layer.
My intention would (again) be to put a header in front of every blob.
That header would contain a crc32 covering that header (minus the crc32
field itself of course) plus the blob to determine whether the blob is
garbage or not. It is similar in those terms as the 1st implementation
where we also had a directory that contained that crc32 for the
directory itself and for each blob. This is not a filesystem, I know that.
Regards,
Stefan
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-28 16:11 ` Stefan Berger
@ 2013-03-28 16:31 ` Michael S. Tsirkin
2013-03-28 17:02 ` Stefan Berger
2013-03-28 17:27 ` Anthony Liguori
2013-03-29 17:33 ` Kenneth Goldman
2 siblings, 1 reply; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-03-28 16:31 UTC (permalink / raw)
To: Stefan Berger
Cc: Stefan Hajnoczi, Kent E Yoder, Corey Bryant, Michael Roth,
qemu-devel, Joel Schopp, Kenneth Goldman, Anthony Liguori
On Thu, Mar 28, 2013 at 12:11:22PM -0400, Stefan Berger wrote:
> On 03/27/2013 03:12 PM, Stefan Berger wrote:
> >On 03/27/2013 02:27 PM, Anthony Liguori wrote:
> >>Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
> >>
> >>>On 03/27/2013 01:14 PM, Anthony Liguori wrote:
> >>>>Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
> >>>>
> >>>>What I struggle with is that we're calling this a "blobstore". Using
> >>>>BER to store "blobs" seems kind of pointless especially when we're
> >>>>talking about exactly three blobs.
> >>>>
> >>>>I suspect real hardware does something like, flash is N
> >>>>bytes, blob 1 is
> >>>>a max of X bytes, blob 2 is a max of Y bytes, and blob 3 is
> >>>>(N - X - Y)
> >>>>bytes.
> >>>>
> >>>>Do we really need to do anything more than that?
> >>>I typically call it NVRAM, but earlier discussions seemed to prefer
> >>>'blobstore'.
> >>>
> >>>Using BER is the 2nd design of the NVRAM/blobstore. The 1st one didn't
> >>>use any visitors but used a directory in the first sector pointing to
> >>>the actual blobs in other sectors of the block device. The organization
> >>>of the directory and assignment of the blobs to their sectors, aka 'the
> >>>layout of the data' in the disk image, was handled by the
> >>>NVRAM/blobstore implementation.
> >>Okay, the short response is:
> >>
> >>Just make the TPM have a DRIVE property, drop all notion of
> >>NVRAM/blobstore, and used fixed offsets into the BlockDriverState for
> >>each blob.
> >
> >Fine by me. I don't see the need for visitors. I guess sharing of
> >the persistent storage between different types of devices is not a
> >goal here so that a layer that hides the layout and the blobs'
> >position within the storage would be necessary. Also fine by me
> >for as long as we don't come back to this discussion.
>
> One thing I'd like to get clarity about is the following
> corner-case. A user supplies some VM image as persistent storage for
> the TPM. It contains garbage. How do we handle this case? Does the
> TPM then just start writing its state into this image or do we want
> to have some layer in place that forces a user to go through the
> step of formatting after that layer indicates that the data are
> unreadable. Besides that a completely empty image also contains
> garbage from the perspective of TPM persistent state and for that
> layer.
>
> My intention would (again) be to put a header in front of every
> blob. That header would contain a crc32 covering that header (minus
> the crc32 field itself of course) plus the blob to determine whether
> the blob is garbage or not. It is similar in those terms as the 1st
> implementation where we also had a directory that contained that
> crc32 for the directory itself and for each blob. This is not a
> filesystem, I know that.
>
> Regards,
> Stefan
>
>
It was precisely this addition of more and more metadata
that made me suggest a format like BER. But of course
a file per field will do too: following what Anthony suggested you would
put the checksum in a separate file?
--
MST
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-28 16:31 ` Michael S. Tsirkin
@ 2013-03-28 17:02 ` Stefan Berger
0 siblings, 0 replies; 31+ messages in thread
From: Stefan Berger @ 2013-03-28 17:02 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Stefan Hajnoczi, Kent E Yoder, Corey Bryant, Michael Roth,
qemu-devel, Joel Schopp, Kenneth Goldman, Anthony Liguori
On 03/28/2013 12:31 PM, Michael S. Tsirkin wrote:
> On Thu, Mar 28, 2013 at 12:11:22PM -0400, Stefan Berger wrote:
>> On 03/27/2013 03:12 PM, Stefan Berger wrote:
>>> On 03/27/2013 02:27 PM, Anthony Liguori wrote:
>>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>>>
>>>>> On 03/27/2013 01:14 PM, Anthony Liguori wrote:
>>>>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>>>>>
>>>>>> What I struggle with is that we're calling this a "blobstore". Using
>>>>>> BER to store "blobs" seems kind of pointless especially when we're
>>>>>> talking about exactly three blobs.
>>>>>>
>>>>>> I suspect real hardware does something like, flash is N
>>>>>> bytes, blob 1 is
>>>>>> a max of X bytes, blob 2 is a max of Y bytes, and blob 3 is
>>>>>> (N - X - Y)
>>>>>> bytes.
>>>>>>
>>>>>> Do we really need to do anything more than that?
>>>>> I typically call it NVRAM, but earlier discussions seemed to prefer
>>>>> 'blobstore'.
>>>>>
>>>>> Using BER is the 2nd design of the NVRAM/blobstore. The 1st one didn't
>>>>> use any visitors but used a directory in the first sector pointing to
>>>>> the actual blobs in other sectors of the block device. The organization
>>>>> of the directory and assignment of the blobs to their sectors, aka 'the
>>>>> layout of the data' in the disk image, was handled by the
>>>>> NVRAM/blobstore implementation.
>>>> Okay, the short response is:
>>>>
>>>> Just make the TPM have a DRIVE property, drop all notion of
>>>> NVRAM/blobstore, and used fixed offsets into the BlockDriverState for
>>>> each blob.
>>> Fine by me. I don't see the need for visitors. I guess sharing of
>>> the persistent storage between different types of devices is not a
>>> goal here so that a layer that hides the layout and the blobs'
>>> position within the storage would be necessary. Also fine by me
>>> for as long as we don't come back to this discussion.
>> One thing I'd like to get clarity about is the following
>> corner-case. A user supplies some VM image as persistent storage for
>> the TPM. It contains garbage. How do we handle this case? Does the
>> TPM then just start writing its state into this image or do we want
>> to have some layer in place that forces a user to go through the
>> step of formatting after that layer indicates that the data are
>> unreadable. Besides that a completely empty image also contains
>> garbage from the perspective of TPM persistent state and for that
>> layer.
>>
>> My intention would (again) be to put a header in front of every
>> blob. That header would contain a crc32 covering that header (minus
>> the crc32 field itself of course) plus the blob to determine whether
>> the blob is garbage or not. It is similar in those terms as the 1st
>> implementation where we also had a directory that contained that
>> crc32 for the directory itself and for each blob. This is not a
>> filesystem, I know that.
>>
>> Regards,
>> Stefan
>>
>>
> It was precisely this addition of more and more metadata
> that made me suggest a format like BER. But of course
> a file per field will do too: following what Anthony suggested you would
> put the checksum in a separate file?
>
My intention would be to still support migration, so a block device /
image file is then probably the best choice addressing this concern
unless we force every setup to provide a shared filesystem. I think the
latter wouldn't be accepted.
Another idea (again) would be to support encryption on other image file
than QCoW2. Here the user would supply the AES key to that persistent
storage layer and that layer would keep a flag whether the blobs are
encrypted and encrypt them upon writing , decrypt them upon reading. The
crc32 also here could serve the purpose of seeing whether the right key
was supplied, which can be detected upon decryption and the blob's crc
not matching what was computed when it was written. If crc32 is not good
enough, we can use a sha1 for this 'integrity' check or possibly the
padding of AES can reveal the bad decryption as well. Some form of
integrity checking in conjunction with a formatting step seems
necessary. Besides that not having to use QCoW2, and with that getting
automatic support for snapshotting, addresses a concern from the
virtualized TPM spec that as far as I know doesn't want to see multiple
states of the same TPM, which in effect snapshotting could cause. So if
one wanted to be compliant to that spec one could use raw VM image files
and along with that get encryption and migration.
At least in the following aspects we are away from the hardware-world:
- image files are accessible through the filesystem and can be looked
into and their secrets retrieved while the NVRAM of a device may be
shielded and more difficult to be examined (it's not impossible) -> so
we may want to have encryption for every type of image file and not just
rely on QCoW2 encryption or assume the image files always reside in
encrypted filesystems
- admittedly a corner case: persistent storage that contains garbage
needs to be consciously formatted or the user asked what to do; an image
file with all zeros could probably be detected, though, but if we
require formatting for the case where garbage is found,we may as well
require it here also
I understand your suggestion with the BER encoding. One problematic
aspect of the whole BER stuff including all the other patches around it
seem to be that they are be too big (~5.5ksloc) to find much love.
Stefan
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-28 16:11 ` Stefan Berger
2013-03-28 16:31 ` Michael S. Tsirkin
@ 2013-03-28 17:27 ` Anthony Liguori
2013-03-28 17:36 ` Stefan Berger
2013-03-28 17:39 ` Michael S. Tsirkin
2013-03-29 17:33 ` Kenneth Goldman
2 siblings, 2 replies; 31+ messages in thread
From: Anthony Liguori @ 2013-03-28 17:27 UTC (permalink / raw)
To: Stefan Berger
Cc: Michael S. Tsirkin, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
qemu-devel, Michael Roth, Joel Schopp, Kenneth Goldman
Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
> On 03/27/2013 03:12 PM, Stefan Berger wrote:
>> On 03/27/2013 02:27 PM, Anthony Liguori wrote:
>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>>
>>>> On 03/27/2013 01:14 PM, Anthony Liguori wrote:
>>>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>>>>
>>>>> What I struggle with is that we're calling this a "blobstore". Using
>>>>> BER to store "blobs" seems kind of pointless especially when we're
>>>>> talking about exactly three blobs.
>>>>>
>>>>> I suspect real hardware does something like, flash is N bytes, blob
>>>>> 1 is
>>>>> a max of X bytes, blob 2 is a max of Y bytes, and blob 3 is (N - X
>>>>> - Y)
>>>>> bytes.
>>>>>
>>>>> Do we really need to do anything more than that?
>>>> I typically call it NVRAM, but earlier discussions seemed to prefer
>>>> 'blobstore'.
>>>>
>>>> Using BER is the 2nd design of the NVRAM/blobstore. The 1st one didn't
>>>> use any visitors but used a directory in the first sector pointing to
>>>> the actual blobs in other sectors of the block device. The organization
>>>> of the directory and assignment of the blobs to their sectors, aka 'the
>>>> layout of the data' in the disk image, was handled by the
>>>> NVRAM/blobstore implementation.
>>> Okay, the short response is:
>>>
>>> Just make the TPM have a DRIVE property, drop all notion of
>>> NVRAM/blobstore, and used fixed offsets into the BlockDriverState for
>>> each blob.
>>
>> Fine by me. I don't see the need for visitors. I guess sharing of the
>> persistent storage between different types of devices is not a goal
>> here so that a layer that hides the layout and the blobs' position
>> within the storage would be necessary. Also fine by me for as long as
>> we don't come back to this discussion.
>
> One thing I'd like to get clarity about is the following corner-case. A
> user supplies some VM image as persistent storage for the TPM.
What Would Hardware Do?
If you need to provide a tool to initialize the state, then just provide
a small tool to do that or provide device option to initialize it that
can be used on first run or something.
Don't bother trying to add complexity with CRCs or anything like that.
Just keep it simple.
Regards,
Anthony Liguori
> It
> contains garbage. How do we handle this case? Does the TPM then just
> start writing its state into this image or do we want to have some layer
> in place that forces a user to go through the step of formatting after
> that layer indicates that the data are unreadable. Besides that a
> completely empty image also contains garbage from the perspective of TPM
> persistent state and for that layer.
>
> My intention would (again) be to put a header in front of every blob.
> That header would contain a crc32 covering that header (minus the crc32
> field itself of course) plus the blob to determine whether the blob is
> garbage or not. It is similar in those terms as the 1st implementation
> where we also had a directory that contained that crc32 for the
> directory itself and for each blob. This is not a filesystem, I know that.
>
> Regards,
> Stefan
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-28 17:27 ` Anthony Liguori
@ 2013-03-28 17:36 ` Stefan Berger
2013-03-28 17:39 ` Michael S. Tsirkin
1 sibling, 0 replies; 31+ messages in thread
From: Stefan Berger @ 2013-03-28 17:36 UTC (permalink / raw)
To: Anthony Liguori
Cc: Michael S. Tsirkin, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
qemu-devel, Michael Roth, Joel Schopp, Kenneth Goldman
On 03/28/2013 01:27 PM, Anthony Liguori wrote:
> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>
>> On 03/27/2013 03:12 PM, Stefan Berger wrote:
>>> On 03/27/2013 02:27 PM, Anthony Liguori wrote:
>>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>>>
>>>>> On 03/27/2013 01:14 PM, Anthony Liguori wrote:
>>>>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>>>>>
>>>>>> What I struggle with is that we're calling this a "blobstore". Using
>>>>>> BER to store "blobs" seems kind of pointless especially when we're
>>>>>> talking about exactly three blobs.
>>>>>>
>>>>>> I suspect real hardware does something like, flash is N bytes, blob
>>>>>> 1 is
>>>>>> a max of X bytes, blob 2 is a max of Y bytes, and blob 3 is (N - X
>>>>>> - Y)
>>>>>> bytes.
>>>>>>
>>>>>> Do we really need to do anything more than that?
>>>>> I typically call it NVRAM, but earlier discussions seemed to prefer
>>>>> 'blobstore'.
>>>>>
>>>>> Using BER is the 2nd design of the NVRAM/blobstore. The 1st one didn't
>>>>> use any visitors but used a directory in the first sector pointing to
>>>>> the actual blobs in other sectors of the block device. The organization
>>>>> of the directory and assignment of the blobs to their sectors, aka 'the
>>>>> layout of the data' in the disk image, was handled by the
>>>>> NVRAM/blobstore implementation.
>>>> Okay, the short response is:
>>>>
>>>> Just make the TPM have a DRIVE property, drop all notion of
>>>> NVRAM/blobstore, and used fixed offsets into the BlockDriverState for
>>>> each blob.
>>> Fine by me. I don't see the need for visitors. I guess sharing of the
>>> persistent storage between different types of devices is not a goal
>>> here so that a layer that hides the layout and the blobs' position
>>> within the storage would be necessary. Also fine by me for as long as
>>> we don't come back to this discussion.
>> One thing I'd like to get clarity about is the following corner-case. A
>> user supplies some VM image as persistent storage for the TPM.
> What Would Hardware Do?
Firmware inside the hardware may zero out the memory or format it upon
first run and set a flag indicating that the memory is now in valid
state -- is that too far fetched ? I don't know what it would do in
subsequent steps, whether it would add some sort of integrity check to
the blobs or not or even maintain some form of journal to recover from
disasters -- it may depend on the quality of the device. Hardware also
knows that the chip will unlikely be taken apart and the firmware, when
it sees garbage in memory, may refuse to start up or automatically
format the device.
Stefan
> If you need to provide a tool to initialize the state, then just provide
> a small tool to do that or provide device option to initialize it that
> can be used on first run or something.
>
> Don't bother trying to add complexity with CRCs or anything like that.
> Just keep it simple.
>
> Regards,
>
> Anthony Liguori
>
>> It
>> contains garbage. How do we handle this case? Does the TPM then just
>> start writing its state into this image or do we want to have some layer
>> in place that forces a user to go through the step of formatting after
>> that layer indicates that the data are unreadable. Besides that a
>> completely empty image also contains garbage from the perspective of TPM
>> persistent state and for that layer.
>>
>> My intention would (again) be to put a header in front of every blob.
>> That header would contain a crc32 covering that header (minus the crc32
>> field itself of course) plus the blob to determine whether the blob is
>> garbage or not. It is similar in those terms as the 1st implementation
>> where we also had a directory that contained that crc32 for the
>> directory itself and for each blob. This is not a filesystem, I know that.
>>
>> Regards,
>> Stefan
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-28 17:27 ` Anthony Liguori
2013-03-28 17:36 ` Stefan Berger
@ 2013-03-28 17:39 ` Michael S. Tsirkin
2013-03-29 13:55 ` Stefan Berger
1 sibling, 1 reply; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-03-28 17:39 UTC (permalink / raw)
To: Anthony Liguori
Cc: Stefan Berger, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
qemu-devel, Michael Roth, Joel Schopp, Kenneth Goldman
On Thu, Mar 28, 2013 at 12:27:45PM -0500, Anthony Liguori wrote:
> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>
> > On 03/27/2013 03:12 PM, Stefan Berger wrote:
> >> On 03/27/2013 02:27 PM, Anthony Liguori wrote:
> >>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
> >>>
> >>>> On 03/27/2013 01:14 PM, Anthony Liguori wrote:
> >>>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
> >>>>>
> >>>>> What I struggle with is that we're calling this a "blobstore". Using
> >>>>> BER to store "blobs" seems kind of pointless especially when we're
> >>>>> talking about exactly three blobs.
> >>>>>
> >>>>> I suspect real hardware does something like, flash is N bytes, blob
> >>>>> 1 is
> >>>>> a max of X bytes, blob 2 is a max of Y bytes, and blob 3 is (N - X
> >>>>> - Y)
> >>>>> bytes.
> >>>>>
> >>>>> Do we really need to do anything more than that?
> >>>> I typically call it NVRAM, but earlier discussions seemed to prefer
> >>>> 'blobstore'.
> >>>>
> >>>> Using BER is the 2nd design of the NVRAM/blobstore. The 1st one didn't
> >>>> use any visitors but used a directory in the first sector pointing to
> >>>> the actual blobs in other sectors of the block device. The organization
> >>>> of the directory and assignment of the blobs to their sectors, aka 'the
> >>>> layout of the data' in the disk image, was handled by the
> >>>> NVRAM/blobstore implementation.
> >>> Okay, the short response is:
> >>>
> >>> Just make the TPM have a DRIVE property, drop all notion of
> >>> NVRAM/blobstore, and used fixed offsets into the BlockDriverState for
> >>> each blob.
> >>
> >> Fine by me. I don't see the need for visitors. I guess sharing of the
> >> persistent storage between different types of devices is not a goal
> >> here so that a layer that hides the layout and the blobs' position
> >> within the storage would be necessary. Also fine by me for as long as
> >> we don't come back to this discussion.
> >
> > One thing I'd like to get clarity about is the following corner-case. A
> > user supplies some VM image as persistent storage for the TPM.
>
> What Would Hardware Do?
>
> If you need to provide a tool to initialize the state, then just provide
> a small tool to do that or provide device option to initialize it that
> can be used on first run or something.
>
> Don't bother trying to add complexity with CRCs or anything like that.
> Just keep it simple.
>
> Regards,
>
> Anthony Liguori
External tool sounds better. Update on first use creates
nasty corner cases - use isn't a well defined thing.
So it creates nasty interactions with migration etc.
> > It
> > contains garbage. How do we handle this case? Does the TPM then just
> > start writing its state into this image or do we want to have some layer
> > in place that forces a user to go through the step of formatting after
> > that layer indicates that the data are unreadable. Besides that a
> > completely empty image also contains garbage from the perspective of TPM
> > persistent state and for that layer.
> >
> > My intention would (again) be to put a header in front of every blob.
> > That header would contain a crc32 covering that header (minus the crc32
> > field itself of course) plus the blob to determine whether the blob is
> > garbage or not. It is similar in those terms as the 1st implementation
> > where we also had a directory that contained that crc32 for the
> > directory itself and for each blob. This is not a filesystem, I know that.
> >
> > Regards,
> > Stefan
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-28 17:39 ` Michael S. Tsirkin
@ 2013-03-29 13:55 ` Stefan Berger
2013-03-29 15:12 ` Anthony Liguori
0 siblings, 1 reply; 31+ messages in thread
From: Stefan Berger @ 2013-03-29 13:55 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Stefan Hajnoczi, Kent E Yoder, Corey Bryant, qemu-devel,
Michael Roth, Joel Schopp, Kenneth Goldman, Anthony Liguori
On 03/28/2013 01:39 PM, Michael S. Tsirkin wrote:
> On Thu, Mar 28, 2013 at 12:27:45PM -0500, Anthony Liguori wrote:
>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>
>>> On 03/27/2013 03:12 PM, Stefan Berger wrote:
>>>> On 03/27/2013 02:27 PM, Anthony Liguori wrote:
>>>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>>>>
>>>>>> On 03/27/2013 01:14 PM, Anthony Liguori wrote:
>>>>>>
>>>>> Okay, the short response is:
>>>>>
>>>>> Just make the TPM have a DRIVE property, drop all notion of
>>>>> NVRAM/blobstore, and used fixed offsets into the BlockDriverState for
>>>>> each blob.
>>>> Fine by me. I don't see the need for visitors. I guess sharing of the
>>>> persistent storage between different types of devices is not a goal
>>>> here so that a layer that hides the layout and the blobs' position
>>>> within the storage would be necessary. Also fine by me for as long as
>>>> we don't come back to this discussion.
>>> One thing I'd like to get clarity about is the following corner-case. A
>>> user supplies some VM image as persistent storage for the TPM.
>> What Would Hardware Do?
>>
>> If you need to provide a tool to initialize the state, then just provide
>> a small tool to do that or provide device option to initialize it that
>> can be used on first run or something.
>>
>> Don't bother trying to add complexity with CRCs or anything like that.
>> Just keep it simple.
>>
>> Regards,
>>
>> Anthony Liguori
>
> External tool sounds better. Update on first use creates
> nasty corner cases - use isn't a well defined thing.
> So it creates nasty interactions with migration etc.
What do we do with the following error cases:
- provided storage is too small to fit blobs into
- user skipped over using the external tool, storage is not formatted
- provided storage contains unknown / corrupted data
- encryption / decryption key is missing (yes, we want blob encryption!)
- encryption / decryption key is wrong and decrypted data therefore are
corrupted
Starting a device and providing it with corrupted data or data that
could not be properly decrypted becomes ambiguous. We can do better and
determine these error cases without starting up the device and having
the user guess what may be wrong : wrong key versus corrupted data.
Corrupted data is hopeless while a wrong key can be fixed.
My suggestion would be to have a layer inside of QEMU that handles these
error cases and QEMU would not start up unless these errors get
resolved. I think there is probably not much concern regarding the
separation of core vTPM functionality and this layer, but more how big
this layer becomes, what all it provides in terms of services and one
step further then whether it should not be a generic layer that can be
used by other devices as well.
Some additional HMP/QMP commands to query for the above error conditions
can be implemented and depending on how severe they are another HMP/QMP
command can be implemented to resolve some of these error condition,
i.e., provide another AES key or go through the step of formatting etc.
If a block device is not big enough it may require the user to use
qemu-img again and start over.
Thanks.
Stefan
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-29 13:55 ` Stefan Berger
@ 2013-03-29 15:12 ` Anthony Liguori
0 siblings, 0 replies; 31+ messages in thread
From: Anthony Liguori @ 2013-03-29 15:12 UTC (permalink / raw)
To: Stefan Berger, Michael S. Tsirkin
Cc: Stefan Hajnoczi, Kent E Yoder, Corey Bryant, qemu-devel,
Michael Roth, Joel Schopp, Kenneth Goldman
Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
> On 03/28/2013 01:39 PM, Michael S. Tsirkin wrote:
>> On Thu, Mar 28, 2013 at 12:27:45PM -0500, Anthony Liguori wrote:
>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>>
>>>> On 03/27/2013 03:12 PM, Stefan Berger wrote:
>>>>> On 03/27/2013 02:27 PM, Anthony Liguori wrote:
>>>>>> Stefan Berger <stefanb@linux.vnet.ibm.com> writes:
>>>>>>
>>>>>>> On 03/27/2013 01:14 PM, Anthony Liguori wrote:
>>>>>>>
>>>>>> Okay, the short response is:
>>>>>>
>>>>>> Just make the TPM have a DRIVE property, drop all notion of
>>>>>> NVRAM/blobstore, and used fixed offsets into the BlockDriverState for
>>>>>> each blob.
>>>>> Fine by me. I don't see the need for visitors. I guess sharing of the
>>>>> persistent storage between different types of devices is not a goal
>>>>> here so that a layer that hides the layout and the blobs' position
>>>>> within the storage would be necessary. Also fine by me for as long as
>>>>> we don't come back to this discussion.
>>>> One thing I'd like to get clarity about is the following corner-case. A
>>>> user supplies some VM image as persistent storage for the TPM.
>>> What Would Hardware Do?
>>>
>>> If you need to provide a tool to initialize the state, then just provide
>>> a small tool to do that or provide device option to initialize it that
>>> can be used on first run or something.
>>>
>>> Don't bother trying to add complexity with CRCs or anything like that.
>>> Just keep it simple.
>>>
>>> Regards,
>>>
>>> Anthony Liguori
>>
>> External tool sounds better. Update on first use creates
>> nasty corner cases - use isn't a well defined thing.
>> So it creates nasty interactions with migration etc.
>
> What do we do with the following error cases:
>
> - provided storage is too small to fit blobs into
Error creating device.
> - user skipped over using the external tool, storage is not formatted
> - provided storage contains unknown / corrupted data
Garbage in, garbage out.
> - encryption / decryption key is missing (yes, we want blob encryption!)
> - encryption / decryption key is wrong and decrypted data therefore are
> corrupted
No, encrypting the nvram is not the device's job. A user can either use
ecryptfs or AES encryption in qcow2 if they feel this is important.
There is nothing special about the TPM's nvram compared to a normal
virtual disk image. Any argument you would make regarding key storage
is equally applicable to a virtual disk image. An awful lot of private
keys are stored in virtual disk images today...
> Starting a device and providing it with corrupted data or data that
> could not be properly decrypted becomes ambiguous. We can do better and
> determine these error cases without starting up the device and having
> the user guess what may be wrong : wrong key versus corrupted data.
> Corrupted data is hopeless while a wrong key can be fixed.
Same applies to virtual disk images. If someone hands a guest a garbage
disk image, the behavior will be ambiguous. It's not a job to prevent
users from doing this.
(In fact, it may even be desirable to test these conditions)
> My suggestion would be to have a layer inside of QEMU that handles these
> error cases and QEMU would not start up unless these errors get
> resolved. I think there is probably not much concern regarding the
> separation of core vTPM functionality and this layer, but more how big
> this layer becomes, what all it provides in terms of services and one
> step further then whether it should not be a generic layer that can be
> used by other devices as well.
>
> Some additional HMP/QMP commands to query for the above error conditions
> can be implemented and depending on how severe they are another HMP/QMP
> command can be implemented to resolve some of these error condition,
> i.e., provide another AES key or go through the step of formatting etc.
> If a block device is not big enough it may require the user to use
> qemu-img again and start over.
You're overcomplicating things. QEMU's role is not to prevent a user
from doing something unusual. This isn't GNOME.
Regards,
Anthony Liguori
>
> Thanks.
>
> Stefan
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-28 16:11 ` Stefan Berger
2013-03-28 16:31 ` Michael S. Tsirkin
2013-03-28 17:27 ` Anthony Liguori
@ 2013-03-29 17:33 ` Kenneth Goldman
2013-03-31 8:17 ` Michael S. Tsirkin
2 siblings, 1 reply; 31+ messages in thread
From: Kenneth Goldman @ 2013-03-29 17:33 UTC (permalink / raw)
To: Stefan Berger
Cc: Michael S. Tsirkin, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
Michael Roth, qemu-devel, Joel Schopp, Anthony Liguori
[-- Attachment #1: Type: text/plain, Size: 1700 bytes --]
> One thing I'd like to get clarity about is the following corner-case. A
> user supplies some VM image as persistent storage for the TPM. It
> contains garbage. How do we handle this case? Does the TPM then just
> start writing its state into this image or do we want to have some layer
> in place that forces a user to go through the step of formatting after
> that layer indicates that the data are unreadable. Besides that a
> completely empty image also contains garbage from the perspective of TPM
> persistent state and for that layer.
A garbage persistent storage should be handled the same way a physical TPM
would handle an NV failure - failure mode. It's a broken part that must
be
replaced with a factory fresh part. That's done by some admin tool
nulling
the storage.
Empty (length zero or non-existent) is different from corrupt. The TPM
should
detect that and initialize itself to factory defaults. Those defaults are
specified in the TPM specification.
> My intention would (again) be to put a header in front of every blob.
> That header would contain a crc32 covering that header (minus the crc32
> field itself of course) plus the blob to determine whether the blob is
> garbage or not. It is similar in those terms as the 1st implementation
> where we also had a directory that contained that crc32 for the
> directory itself and for each blob. This is not a filesystem, I know
that.
I agree that an integrity value should be included. This is a security
device, and layers of protection are good.
I wonder about the choice of algorithm. The TPM doesn't have crc32 code
but it does have SHA-1. Why not reuse code rather than add a new
function?
[-- Attachment #2: Type: text/html, Size: 2266 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-29 17:33 ` Kenneth Goldman
@ 2013-03-31 8:17 ` Michael S. Tsirkin
2013-03-31 20:48 ` Kenneth Goldman
0 siblings, 1 reply; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-03-31 8:17 UTC (permalink / raw)
To: Kenneth Goldman
Cc: Stefan Berger, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
Michael Roth, qemu-devel, Joel Schopp, Anthony Liguori
On Fri, Mar 29, 2013 at 01:33:01PM -0400, Kenneth Goldman wrote:
> > One thing I'd like to get clarity about is the following corner-case. A
> > user supplies some VM image as persistent storage for the TPM. It
> > contains garbage. How do we handle this case? Does the TPM then just
> > start writing its state into this image or do we want to have some layer
> > in place that forces a user to go through the step of formatting after
> > that layer indicates that the data are unreadable. Besides that a
> > completely empty image also contains garbage from the perspective of TPM
> > persistent state and for that layer.
>
> A garbage persistent storage should be handled the same way a physical TPM
> would handle an NV failure - failure mode. It's a broken part that must be
> replaced with a factory fresh part. That's done by some admin tool nulling
> the storage.
>
> Empty (length zero or non-existent) is different from corrupt. The TPM should
> detect that and initialize itself to factory defaults. Those defaults are
> specified in the TPM specification.
>
> > My intention would (again) be to put a header in front of every blob.
> > That header would contain a crc32 covering that header (minus the crc32
> > field itself of course) plus the blob to determine whether the blob is
> > garbage or not. It is similar in those terms as the 1st implementation
> > where we also had a directory that contained that crc32 for the
> > directory itself and for each blob. This is not a filesystem, I know that.
>
> I agree that an integrity value should be included. This is a security
> device, and layers of protection are good.
>
> I wonder about the choice of algorithm. The TPM doesn't have crc32 code
> but it does have SHA-1. Why not reuse code rather than add a new function?
You want to protect against someone who is able to
manipulate some bits in the file (content) but not others (hash)?
What's the attack you are trying to protect against here?
I'm guessing the only result of extra checksums would be
unbootable guests when qemu manages to corrupt the checksum
without any help from attackers ...
--
MST
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-31 8:17 ` Michael S. Tsirkin
@ 2013-03-31 20:48 ` Kenneth Goldman
2013-04-02 12:06 ` Michael S. Tsirkin
0 siblings, 1 reply; 31+ messages in thread
From: Kenneth Goldman @ 2013-03-31 20:48 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Stefan Berger, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
Michael Roth, qemu-devel, Joel Schopp, Anthony Liguori
[-- Attachment #1: Type: text/plain, Size: 575 bytes --]
"Michael S. Tsirkin" <mst@redhat.com> wrote on 03/31/2013 04:17:28 AM:
>
> You want to protect against someone who is able to
> manipulate some bits in the file (content) but not others (hash)?
> What's the attack you are trying to protect against here?
>
> I'm guessing the only result of extra checksums would be
> unbootable guests when qemu manages to corrupt the checksum
> without any help from attackers ...
You are of course correct. I advised an integrity value just to detect
a hardware or software fault. The check value would not protect against
an
attack.
[-- Attachment #2: Type: text/html, Size: 792 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-03-31 20:48 ` Kenneth Goldman
@ 2013-04-02 12:06 ` Michael S. Tsirkin
2013-04-02 13:24 ` Kenneth Goldman
0 siblings, 1 reply; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-04-02 12:06 UTC (permalink / raw)
To: Kenneth Goldman
Cc: Stefan Berger, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
Michael Roth, qemu-devel, Joel Schopp, Anthony Liguori
On Sun, Mar 31, 2013 at 04:48:24PM -0400, Kenneth Goldman wrote:
> "Michael S. Tsirkin" <mst@redhat.com> wrote on 03/31/2013 04:17:28 AM:
> >
> > You want to protect against someone who is able to
> > manipulate some bits in the file (content) but not others (hash)?
> > What's the attack you are trying to protect against here?
> >
> > I'm guessing the only result of extra checksums would be
> > unbootable guests when qemu manages to corrupt the checksum
> > without any help from attackers ...
>
> You are of course correct. I advised an integrity value just to detect
> a hardware or software fault. The check value would not protect against an
> attack.
Fair enough, but why protect these bits specifically?
E.g. disk corruption seems more likely (since it's bigger). Add
integrity at that level? Why even stop at detection, let's do error
correction ...
--
MST
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-04-02 12:06 ` Michael S. Tsirkin
@ 2013-04-02 13:24 ` Kenneth Goldman
2013-04-02 13:37 ` Michael S. Tsirkin
0 siblings, 1 reply; 31+ messages in thread
From: Kenneth Goldman @ 2013-04-02 13:24 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Stefan Berger, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
Michael Roth, qemu-devel, Joel Schopp, Anthony Liguori
[-- Attachment #1: Type: text/plain, Size: 763 bytes --]
> > You are of course correct. I advised an integrity value just to
detect
> > a hardware or software fault. The check value would not protect
against an
> > attack.
>
> Fair enough, but why protect these bits specifically?
> E.g. disk corruption seems more likely (since it's bigger). Add
> integrity at that level? Why even stop at detection, let's do error
> correction ...
Why ... just because it's a security device. Whenever I code for
security,
I add layers of protection, constantly looking for "this should never
happen"
cases.
It might be just a small benefit, but hashing a few kbytes is a small part
of TPM startup time, and the function is already there. Think of it as
part
of the larger (and required) TPM self test that a TPM must do.
[-- Attachment #2: Type: text/html, Size: 1088 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [Qemu-devel] vNVRAM / blobstore design
2013-04-02 13:24 ` Kenneth Goldman
@ 2013-04-02 13:37 ` Michael S. Tsirkin
0 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-04-02 13:37 UTC (permalink / raw)
To: Kenneth Goldman
Cc: Stefan Berger, Stefan Hajnoczi, Kent E Yoder, Corey Bryant,
Michael Roth, qemu-devel, Joel Schopp, Anthony Liguori
On Tue, Apr 02, 2013 at 09:24:51AM -0400, Kenneth Goldman wrote:
> > > You are of course correct. I advised an integrity value just to detect
> > > a hardware or software fault. The check value would not protect against an
> > > attack.
> >
> > Fair enough, but why protect these bits specifically?
> > E.g. disk corruption seems more likely (since it's bigger). Add
> > integrity at that level? Why even stop at detection, let's do error
> > correction ...
>
> Why ... just because it's a security device. Whenever I code for security,
This is virtualization. Everything is for security here.
> I add layers of protection, constantly looking for "this should never happen"
> cases.
Confused. You said this checksum is for integrity not protection ...
> It might be just a small benefit, but hashing a few kbytes is a small part
> of TPM startup time, and the function is already there.
You are ignoring atomicity issues this can introduce in case of e.g.
host or qemu crash. Most likely, the result just will be data loss
in a situation which would be recoverable otherwise.
The reverse of what you were trying to achieve.
> Think of it as part
> of the larger (and required) TPM self test that a TPM must do.
Required?
--
MST
^ permalink raw reply [flat|nested] 31+ messages in thread
end of thread, other threads:[~2013-04-02 13:38 UTC | newest]
Thread overview: 31+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-03-25 21:39 [Qemu-devel] vNVRAM / blobstore design Stefan Berger
2013-03-25 22:05 ` Anthony Liguori
2013-03-25 22:20 ` Stefan Berger
2013-03-27 15:17 ` Corey Bryant
2013-03-27 15:20 ` Corey Bryant
2013-03-27 15:30 ` Michael S. Tsirkin
2013-03-27 16:07 ` mdroth
2013-03-27 15:43 ` Kenneth Goldman
2013-03-27 15:53 ` Michael S. Tsirkin
2013-03-27 16:12 ` Joel Schopp
2013-03-27 16:46 ` Stefan Berger
2013-03-27 17:14 ` Anthony Liguori
2013-03-27 17:27 ` Stefan Berger
2013-03-27 18:27 ` Anthony Liguori
2013-03-27 19:12 ` Stefan Berger
2013-03-28 16:11 ` Stefan Berger
2013-03-28 16:31 ` Michael S. Tsirkin
2013-03-28 17:02 ` Stefan Berger
2013-03-28 17:27 ` Anthony Liguori
2013-03-28 17:36 ` Stefan Berger
2013-03-28 17:39 ` Michael S. Tsirkin
2013-03-29 13:55 ` Stefan Berger
2013-03-29 15:12 ` Anthony Liguori
2013-03-29 17:33 ` Kenneth Goldman
2013-03-31 8:17 ` Michael S. Tsirkin
2013-03-31 20:48 ` Kenneth Goldman
2013-04-02 12:06 ` Michael S. Tsirkin
2013-04-02 13:24 ` Kenneth Goldman
2013-04-02 13:37 ` Michael S. Tsirkin
2013-03-27 18:04 ` Michael S. Tsirkin
2013-03-27 16:20 ` Kenneth Goldman
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).