On Fri, 2023-09-22 at 08:00 +0200, Markus Armbruster wrote: > Found this cleaning out old mail, sorry for missing it until now! > > I think we owe James a quick decision wether we're willing to take > the > feature. Stefan, thoughts? > > James Bottomley <j...@linux.ibm.com> writes: > > > From: James Bottomley <james.bottom...@hansenpartnership.com> > > > > The Microsoft Simulator (mssim) is the reference emulation platform > > for the TCG TPM 2.0 specification. > > > > https://github.com/Microsoft/ms-tpm-20-ref.git > > > > It exports a fairly simple network socket based protocol on two > > sockets, one for command (default 2321) and one for control > > (default > > 2322). This patch adds a simple backend that can speak the mssim > > protocol over the network. It also allows the two sockets to be > > specified on the command line. The benefits are twofold: firstly > > it > > gives us a backend that actually speaks a standard TPM emulation > > protocol instead of the linux specific TPM driver format of the > > current emulated TPM backend and secondly, using the microsoft > > protocol, the end point of the emulator can be anywhere on the > > network, facilitating the cloud use case where a central TPM > > service > > can be used over a control network. > > > > The implementation does basic control commands like power off/on, > > but > > doesn't implement cancellation or startup. The former because > > cancellation is pretty much useless on a fast operating TPM > > emulator > > and the latter because this emulator is designed to be used with > > OVMF > > which itself does TPM startup and I wanted to validate that. > > > > To run this, simply download an emulator based on the MS > > specification > > (package ibmswtpm2 on openSUSE) and run it, then add these two > > lines > > to the qemu command and it will use the emulator. > > > > -tpmdev mssim,id=tpm0 \ > > -device tpm-crb,tpmdev=tpm0 \ > > > > to use a remote emulator replace the first line with > > > > -tpmdev > > "{'type':'mssim','id':'tpm0','command':{'type':inet,'host':'remote' > > ,'port':'2321'}}" > > > > tpm-tis also works as the backend. > > > > Signed-off-by: James Bottomley <j...@linux.ibm.com> > > [...] > > > diff --git a/docs/specs/tpm.rst b/docs/specs/tpm.rst > > index 535912a92b..1398735956 100644 > > --- a/docs/specs/tpm.rst > > +++ b/docs/specs/tpm.rst > > @@ -270,6 +270,38 @@ available as a module (assuming a TPM 2 is > > passed through): > > /sys/devices/LNXSYSTEM:00/LNXSYBUS:00/MSFT0101:00/tpm/tpm0/pcr- > > sha256/9 > > ... > > > > +The QEMU TPM Microsoft Simulator Device > > +--------------------------------------- > > + > > +The TCG provides a reference implementation for TPM 2.0 written by > > > Suggest to copy the cover letter's nice introductory paragraph here: > > The Microsoft Simulator (mssim) is the reference emulation platform > for the TCG TPM 2.0 specification. > > It provides a reference implementation for TPM 2.0 written by
Sure, that's easy. > > +Microsoft (See `ms-tpm-20-ref`_ on github). The reference > > implementation > > +starts a network server and listens for TPM commands on port 2321 > > and > > +TPM Platform control commands on port 2322, although these can be > > +altered. The QEMU mssim TPM backend talks to this > > implementation. By > > +default it connects to the default ports on localhost: > > + > > +.. code-block:: console > > + > > + qemu-system-x86_64 <qemu-options> \ > > + -tpmdev mssim,id=tpm0 \ > > + -device tpm-crb,tpmdev=tpm0 > > + > > + > > +Although it can also communicate with a remote host, which must be > > +specified as a SocketAddress via json on the command line for each > > of > > Is the "via JSON" part in "must be specified ... on the command line" > correct? I'd expect to be able to use dotted keys as well, like > > -tpmdev > type=mssim,id=tpm0,command.type=inet,command.host=remote,command.port > =2321',control.type=inet,control.host=remote,control.port=2322 Yes, I've verified that the dot notation works as well. However, I thought QEMU was calling all stuff like this JSON notation? If not, what do you usually call it? "json or dot notation"? > > Aside: I do recommend management applications stick to JSON. > > > +the command and control ports: > > + > > +.. code-block:: console > > + > > + qemu-system-x86_64 <qemu-options> \ > > + -tpmdev > > "{'type':'mssim','id':'tpm0','command':{'type':'inet','host':'remot > > e','port':'2321'},'control':{'type':'inet','host':'remote','port':' > > 2322'}}" \ > > + -device tpm-crb,tpmdev=tpm0 > > + > > + > > +The mssim backend supports snapshotting and migration, but the > > state > > +of the Microsoft Simulator server must be preserved (or the server > > +kept running) outside of QEMU for restore to be successful. > > + > > The QEMU TPM emulator device > > ---------------------------- > > > > @@ -526,3 +558,6 @@ the following: > > > > .. _SWTPM protocol: > > > > https://github.com/stefanberger/swtpm/blob/master/man/man3/swtpm_ioctls.pod > > + > > +.. _ms-tpm-20-ref: > > + https://github.com/microsoft/ms-tpm-20-ref > > diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c > > index ed78a87ddd..12482368d0 100644 > > --- a/monitor/hmp-cmds.c > > +++ b/monitor/hmp-cmds.c > > @@ -731,6 +731,7 @@ void hmp_info_tpm(Monitor *mon, const QDict > > *qdict) > > unsigned int c = 0; > > TPMPassthroughOptions *tpo; > > TPMEmulatorOptions *teo; > > + TPMmssimOptions *tmo; > > > > info_list = qmp_query_tpm(&err); > > if (err) { > > @@ -764,6 +765,14 @@ void hmp_info_tpm(Monitor *mon, const QDict > > *qdict) > > teo = ti->options->u.emulator.data; > > monitor_printf(mon, ",chardev=%s", teo->chardev); > > break; > > + case TPM_TYPE_MSSIM: > > + tmo = &ti->options->u.mssim; > > + monitor_printf(mon, ",command=%s:%s,control=%s:%s", > > + tmo->command->u.inet.host, > > + tmo->command->u.inet.port, > > + tmo->control->u.inet.host, > > + tmo->control->u.inet.port); > > + break; > > case TPM_TYPE__MAX: > > break; > > } > > diff --git a/qapi/tpm.json b/qapi/tpm.json > > index 2b491c28b4..f9dde35377 100644 > > --- a/qapi/tpm.json > > +++ b/qapi/tpm.json > > @@ -5,6 +5,7 @@ > > ## > > # = TPM (trusted platform module) devices > > ## > > Blank line, please. > > > +{ 'include': 'sockets.json' } > > > > ## > > # @TpmModel: > > @@ -49,7 +50,7 @@ > # > # @passthrough: TPM passthrough type > # > # @emulator: Software Emulator TPM type (since 2.11) > > # > > Missing member documentation: > > # @mssim: <brief description here> (since 8.2) > > > # Since: 1.5 > > ## > > -{ 'enum': 'TpmType', 'data': [ 'passthrough', 'emulator' ], > > +{ 'enum': 'TpmType', 'data': [ 'passthrough', 'emulator', 'mssim' > > ], > > 'if': 'CONFIG_TPM' } > > > > ## > > @@ -64,7 +65,7 @@ > > # Example: > > # > > # -> { "execute": "query-tpm-types" } > > -# <- { "return": [ "passthrough", "emulator" ] } > > +# <- { "return": [ "passthrough", "emulator", "mssim" ] } > > Thanks for updating the example. > > > # > > ## > > { 'command': 'query-tpm-types', 'returns': ['TpmType'], > > @@ -117,6 +118,22 @@ > > 'data': { 'data': 'TPMEmulatorOptions' }, > > 'if': 'CONFIG_TPM' } > > > > +## > > +# @TPMmssimOptions: > > Please capitalize similar to TPMPassthroughOptions and > TPMEmulatorOptions: TPMMssimOptions. OK > > > +# > > +# Information for the mssim emulator connection > > +# > > +# @command: command socket for the TPM emulator > > Blank line, please. OK > > > +# @control: control socket for the TPM emulator > > +# > > +# Since: 7.2.0 > > Since 8.2 Heh, yes, that keeps creeping with every release .. > > > +## > > +{ 'struct': 'TPMmssimOptions', > > + 'data': { > > + '*command': 'SocketAddress', > > + '*control': 'SocketAddress' }, > > Locally consistent indentation is > > 'data': { '*command': 'SocketAddress', > '*control': 'SocketAddress' }, > > > + 'if': 'CONFIG_TPM' } > > + > > ## > > # @TpmTypeOptions: > > # > > @@ -124,6 +141,7 @@ > > # > > # @type: - 'passthrough' The configuration options for the TPM > > passthrough type > > # - 'emulator' The configuration options for TPM emulator > > backend type > > +# - 'mssim' The configuration options for TPM emulator > > mssim type > > # > > # Since: 1.5 > > ## > > @@ -131,7 +149,8 @@ > > 'base': { 'type': 'TpmType' }, > > 'discriminator': 'type', > > 'data': { 'passthrough' : 'TPMPassthroughOptionsWrapper', > > - 'emulator': 'TPMEmulatorOptionsWrapper' }, > > + 'emulator': 'TPMEmulatorOptionsWrapper', > > + 'mssim' : 'TPMmssimOptions' }, > > 'if': 'CONFIG_TPM' } > > > > ## > > @@ -150,7 +169,8 @@ > > 'id' : 'str' }, > > 'discriminator': 'type', > > 'data': { 'passthrough' : 'TPMPassthroughOptions', > > - 'emulator': 'TPMEmulatorOptions' }, > > + 'emulator': 'TPMEmulatorOptions', > > + 'mssim': 'TPMmssimOptions' }, > > 'if': 'CONFIG_TPM' } > > > > ## > > Address my nitpicking, and you may add > > Acked-by: Markus Armbruster <arm...@redhat.com> James