linux-integrity.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* tpm2key.asn1 parent identification
@ 2025-09-14 16:08 Jarkko Sakkinen
  2025-09-14 16:23 ` Jarkko Sakkinen
  2025-09-15  3:24 ` James Bottomley
  0 siblings, 2 replies; 16+ messages in thread
From: Jarkko Sakkinen @ 2025-09-14 16:08 UTC (permalink / raw)
  To: linux-integrity, tpm2; +Cc: James Bottomley

Hi,

In practice, while implementing tpm2sh and its self-contained TPM emulator
called "MockTPM", I've noticed that 'tpm2key.asn1.' has a major bottleneck,
but luckily it is easy to squash.

Parent handle should never be persisted, as it defies the existential
reason of having a file format in the first place.

To address this issue I just added couple of optional fields to TPMKey:

  parentName   [6] EXPLICIT OCTET STRING OPTIONAL,
  parentPubkey [7] EXPLICIT OCTET STRING OPTIONAL

By persisting this information TPM2_GetCapability + TPM2_ReadPublic can
be used to acquire an appropriate handle.

I'd highly recommend to add this quirk to anything that processes this
ASN.1 format.

BR, Jarkko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: tpm2key.asn1 parent identification
  2025-09-14 16:08 tpm2key.asn1 parent identification Jarkko Sakkinen
@ 2025-09-14 16:23 ` Jarkko Sakkinen
  2025-09-22 21:42   ` James Bottomley
  2025-09-15  3:24 ` James Bottomley
  1 sibling, 1 reply; 16+ messages in thread
From: Jarkko Sakkinen @ 2025-09-14 16:23 UTC (permalink / raw)
  To: linux-integrity, tpm2; +Cc: James Bottomley

On Sun, Sep 14, 2025 at 07:08:37PM +0300, Jarkko Sakkinen wrote:
> Hi,
> 
> In practice, while implementing tpm2sh and its self-contained TPM emulator
> called "MockTPM", I've noticed that 'tpm2key.asn1.' has a major bottleneck,
> but luckily it is easy to squash.
> 
> Parent handle should never be persisted, as it defies the existential
> reason of having a file format in the first place.
> 
> To address this issue I just added couple of optional fields to TPMKey:
> 
>   parentName   [6] EXPLICIT OCTET STRING OPTIONAL,
>   parentPubkey [7] EXPLICIT OCTET STRING OPTIONAL
> 
> By persisting this information TPM2_GetCapability + TPM2_ReadPublic can
> be used to acquire an appropriate handle.
> 
> I'd highly recommend to add this quirk to anything that processes this
> ASN.1 format.


Here's a proof of concept:

https://github.com/puavo-org/tpm2sh/commit/18ec3c2169b23523d8866c58fa7b8a89a79bd3d4

BR, Jarkko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: tpm2key.asn1 parent identification
  2025-09-14 16:08 tpm2key.asn1 parent identification Jarkko Sakkinen
  2025-09-14 16:23 ` Jarkko Sakkinen
@ 2025-09-15  3:24 ` James Bottomley
  2025-09-15 14:50   ` Jarkko Sakkinen
  1 sibling, 1 reply; 16+ messages in thread
From: James Bottomley @ 2025-09-15  3:24 UTC (permalink / raw)
  To: Jarkko Sakkinen, linux-integrity, tpm2

On Sun, 2025-09-14 at 19:08 +0300, Jarkko Sakkinen wrote:
> Hi,
> 
> In practice, while implementing tpm2sh and its self-contained TPM
> emulator called "MockTPM", I've noticed that 'tpm2key.asn1.' has a
> major bottleneck, but luckily it is easy to squash.
> 
> Parent handle should never be persisted, as it defies the existential
> reason of having a file format in the first place.

Actually, if you read the spec:it describes how to handle non-
persistent parents by defining the exact form of the P256 parent you
derive from the permanent handle in section 3.1.8:

https://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html

This is the way all the implementations (well except the kernel, but
that's fixable) do it.

> To address this issue I just added couple of optional fields to
> TPMKey:
> 
>   parentName   [6] EXPLICIT OCTET STRING OPTIONAL,
>   parentPubkey [7] EXPLICIT OCTET STRING OPTIONAL

So that's a bit redundant, since if you know the key, you know its
name.

> By persisting this information TPM2_GetCapability + TPM2_ReadPublic
> can be used to acquire an appropriate handle.

It can, how?  If the parent is a primary, you can't insert it from a
public key, you have to derive it and if it's non-primary, you need its
parent to do the insertion.

> I'd highly recommend to add this quirk to anything that processes
> this ASN.1 format.

Well, patches to the standard are accepted:

https://groups.io/g/openssl-tpm2-engine/topics

But first verify you don't simply need to use the non-persistent
format.

Regards,

James




^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: tpm2key.asn1 parent identification
  2025-09-15  3:24 ` James Bottomley
@ 2025-09-15 14:50   ` Jarkko Sakkinen
  2025-09-15 18:08     ` Jarkko Sakkinen
  0 siblings, 1 reply; 16+ messages in thread
From: Jarkko Sakkinen @ 2025-09-15 14:50 UTC (permalink / raw)
  To: James Bottomley; +Cc: linux-integrity, tpm2

On Sun, Sep 14, 2025 at 11:24:24PM -0400, James Bottomley wrote:
> On Sun, 2025-09-14 at 19:08 +0300, Jarkko Sakkinen wrote:
> > Hi,
> > 
> > In practice, while implementing tpm2sh and its self-contained TPM
> > emulator called "MockTPM", I've noticed that 'tpm2key.asn1.' has a
> > major bottleneck, but luckily it is easy to squash.
> > 
> > Parent handle should never be persisted, as it defies the existential
> > reason of having a file format in the first place.
> 
> Actually, if you read the spec:it describes how to handle non-
> persistent parents by defining the exact form of the P256 parent you
> derive from the permanent handle in section 3.1.8:
> 
> https://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html
> 
> This is the way all the implementations (well except the kernel, but
> that's fixable) do it.

Even if you fix it to persistent handle, the problem does not go
magically go away. Read public attributes are ubiquitos and
cryptographically correct way to do the binding.

> 
> > To address this issue I just added couple of optional fields to
> > TPMKey:
> > 
> >   parentName   [6] EXPLICIT OCTET STRING OPTIONAL,
> >   parentPubkey [7] EXPLICIT OCTET STRING OPTIONAL
> 
> So that's a bit redundant, since if you know the key, you know its
> name.

What I know is irrelevant here :-)

> 
> > By persisting this information TPM2_GetCapability + TPM2_ReadPublic
> > can be used to acquire an appropriate handle.
> 
> It can, how?  If the parent is a primary, you can't insert it from a
> public key, you have to derive it and if it's non-primary, you need its
> parent to do the insertion.

Transient handle is like file handle and persistent handle is like inode
number. Neither unambigiuously (and this is dead obvious) does not 
identify any possible key.

Further by binding key correctly, the requirement of being persistent
key goes away, which is a limiting factor.

> 
> > I'd highly recommend to add this quirk to anything that processes
> > this ASN.1 format.
> 
> Well, patches to the standard are accepted:
> 
> https://groups.io/g/openssl-tpm2-engine/topics
> 
> But first verify you don't simply need to use the non-persistent
> format.
> 
> Regards,
> 
> James
> 
> 
> 

BR, Jarkko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: tpm2key.asn1 parent identification
  2025-09-15 14:50   ` Jarkko Sakkinen
@ 2025-09-15 18:08     ` Jarkko Sakkinen
  2025-09-16  2:10       ` Jarkko Sakkinen
  2025-09-17  2:33       ` James Bottomley
  0 siblings, 2 replies; 16+ messages in thread
From: Jarkko Sakkinen @ 2025-09-15 18:08 UTC (permalink / raw)
  To: James Bottomley; +Cc: linux-integrity, tpm2

On Mon, Sep 15, 2025 at 05:50:07PM +0300, Jarkko Sakkinen wrote:
> On Sun, Sep 14, 2025 at 11:24:24PM -0400, James Bottomley wrote:
> > On Sun, 2025-09-14 at 19:08 +0300, Jarkko Sakkinen wrote:
> > > Hi,
> > > 
> > > In practice, while implementing tpm2sh and its self-contained TPM
> > > emulator called "MockTPM", I've noticed that 'tpm2key.asn1.' has a
> > > major bottleneck, but luckily it is easy to squash.
> > > 
> > > Parent handle should never be persisted, as it defies the existential
> > > reason of having a file format in the first place.
> > 
> > Actually, if you read the spec:it describes how to handle non-
> > persistent parents by defining the exact form of the P256 parent you
> > derive from the permanent handle in section 3.1.8:
> > 
> > https://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html
> > 
> > This is the way all the implementations (well except the kernel, but
> > that's fixable) do it.
> 
> Even if you fix it to persistent handle, the problem does not go
> magically go away. Read public attributes are ubiquitos and
> cryptographically correct way to do the binding.
> 
> > 
> > > To address this issue I just added couple of optional fields to
> > > TPMKey:
> > > 
> > >   parentName   [6] EXPLICIT OCTET STRING OPTIONAL,
> > >   parentPubkey [7] EXPLICIT OCTET STRING OPTIONAL
> > 
> > So that's a bit redundant, since if you know the key, you know its
> > name.
> 
> What I know is irrelevant here :-)
> 
> > 
> > > By persisting this information TPM2_GetCapability + TPM2_ReadPublic
> > > can be used to acquire an appropriate handle.
> > 
> > It can, how?  If the parent is a primary, you can't insert it from a
> > public key, you have to derive it and if it's non-primary, you need its
> > parent to do the insertion.
> 
> Transient handle is like file handle and persistent handle is like inode
> number. Neither unambigiuously (and this is dead obvious) does not 
> identify any possible key.
> 
> Further by binding key correctly, the requirement of being persistent
> key goes away, which is a limiting factor.
> 
> > 
> > > I'd highly recommend to add this quirk to anything that processes
> > > this ASN.1 format.
> > 
> > Well, patches to the standard are accepted:
> > 
> > https://groups.io/g/openssl-tpm2-engine/topics

Further there is two options:

1. Either remove TPM2 key ASN.1 support from kernel entirely.
2. Fix the 0day bug.

It is unacceptable to make strong binding to a random open source
project. I zero care what OpenSSL TPM2 engine does with the file
format.

> > 
> > But first verify you don't simply need to use the non-persistent
> > format.
> > 
> > Regards,
> > 
> > James
> > 
> > 
> > 
> 
> BR, Jarkko

BR, Jarkko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: tpm2key.asn1 parent identification
  2025-09-15 18:08     ` Jarkko Sakkinen
@ 2025-09-16  2:10       ` Jarkko Sakkinen
  2025-09-16  2:19         ` Jarkko Sakkinen
  2025-09-17  2:33       ` James Bottomley
  1 sibling, 1 reply; 16+ messages in thread
From: Jarkko Sakkinen @ 2025-09-16  2:10 UTC (permalink / raw)
  To: James Bottomley; +Cc: linux-integrity, tpm2

On Mon, Sep 15, 2025 at 09:08:31PM +0300, Jarkko Sakkinen wrote:
> On Mon, Sep 15, 2025 at 05:50:07PM +0300, Jarkko Sakkinen wrote:
> > On Sun, Sep 14, 2025 at 11:24:24PM -0400, James Bottomley wrote:
> > > On Sun, 2025-09-14 at 19:08 +0300, Jarkko Sakkinen wrote:
> > > > Hi,
> > > > 
> > > > In practice, while implementing tpm2sh and its self-contained TPM
> > > > emulator called "MockTPM", I've noticed that 'tpm2key.asn1.' has a
> > > > major bottleneck, but luckily it is easy to squash.
> > > > 
> > > > Parent handle should never be persisted, as it defies the existential
> > > > reason of having a file format in the first place.
> > > 
> > > Actually, if you read the spec:it describes how to handle non-
> > > persistent parents by defining the exact form of the P256 parent you
> > > derive from the permanent handle in section 3.1.8:
> > > 
> > > https://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html
> > > 
> > > This is the way all the implementations (well except the kernel, but
> > > that's fixable) do it.
> > 
> > Even if you fix it to persistent handle, the problem does not go
> > magically go away. Read public attributes are ubiquitos and
> > cryptographically correct way to do the binding.
> > 
> > > 
> > > > To address this issue I just added couple of optional fields to
> > > > TPMKey:
> > > > 
> > > >   parentName   [6] EXPLICIT OCTET STRING OPTIONAL,
> > > >   parentPubkey [7] EXPLICIT OCTET STRING OPTIONAL
> > > 
> > > So that's a bit redundant, since if you know the key, you know its
> > > name.
> > 
> > What I know is irrelevant here :-)
> > 
> > > 
> > > > By persisting this information TPM2_GetCapability + TPM2_ReadPublic
> > > > can be used to acquire an appropriate handle.
> > > 
> > > It can, how?  If the parent is a primary, you can't insert it from a
> > > public key, you have to derive it and if it's non-primary, you need its
> > > parent to do the insertion.
> > 
> > Transient handle is like file handle and persistent handle is like inode
> > number. Neither unambigiuously (and this is dead obvious) does not 
> > identify any possible key.
> > 
> > Further by binding key correctly, the requirement of being persistent
> > key goes away, which is a limiting factor.
> > 
> > > 
> > > > I'd highly recommend to add this quirk to anything that processes
> > > > this ASN.1 format.
> > > 
> > > Well, patches to the standard are accepted:
> > > 
> > > https://groups.io/g/openssl-tpm2-engine/topics
> 
> Further there is two options:
> 
> 1. Either remove TPM2 key ASN.1 support from kernel entirely.
> 2. Fix the 0day bug.
> 
> It is unacceptable to make strong binding to a random open source
> project. I zero care what OpenSSL TPM2 engine does with the file
> format.

OK, so obviously the binding exists that if the key matches the whatever
is in that persistent handle it will be loaded. However, that has still
ambiguity concern given that any pair of parent and child key matching
will do. It's much better if you can require a specific parent based
on its cryptographic stamp.

So what I'll do for my project is that I just add those as optional
while adding parent handle for backward compatibility but users
of tpm2sh still get the benefit of enhanced security.

BR, Jarkko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: tpm2key.asn1 parent identification
  2025-09-16  2:10       ` Jarkko Sakkinen
@ 2025-09-16  2:19         ` Jarkko Sakkinen
  0 siblings, 0 replies; 16+ messages in thread
From: Jarkko Sakkinen @ 2025-09-16  2:19 UTC (permalink / raw)
  To: James Bottomley; +Cc: linux-integrity, tpm2

On Tue, Sep 16, 2025 at 05:10:06AM +0300, Jarkko Sakkinen wrote:
> On Mon, Sep 15, 2025 at 09:08:31PM +0300, Jarkko Sakkinen wrote:
> > On Mon, Sep 15, 2025 at 05:50:07PM +0300, Jarkko Sakkinen wrote:
> > > On Sun, Sep 14, 2025 at 11:24:24PM -0400, James Bottomley wrote:
> > > > On Sun, 2025-09-14 at 19:08 +0300, Jarkko Sakkinen wrote:
> > > > > Hi,
> > > > > 
> > > > > In practice, while implementing tpm2sh and its self-contained TPM
> > > > > emulator called "MockTPM", I've noticed that 'tpm2key.asn1.' has a
> > > > > major bottleneck, but luckily it is easy to squash.
> > > > > 
> > > > > Parent handle should never be persisted, as it defies the existential
> > > > > reason of having a file format in the first place.
> > > > 
> > > > Actually, if you read the spec:it describes how to handle non-
> > > > persistent parents by defining the exact form of the P256 parent you
> > > > derive from the permanent handle in section 3.1.8:
> > > > 
> > > > https://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html
> > > > 
> > > > This is the way all the implementations (well except the kernel, but
> > > > that's fixable) do it.
> > > 
> > > Even if you fix it to persistent handle, the problem does not go
> > > magically go away. Read public attributes are ubiquitos and
> > > cryptographically correct way to do the binding.
> > > 
> > > > 
> > > > > To address this issue I just added couple of optional fields to
> > > > > TPMKey:
> > > > > 
> > > > >   parentName   [6] EXPLICIT OCTET STRING OPTIONAL,
> > > > >   parentPubkey [7] EXPLICIT OCTET STRING OPTIONAL
> > > > 
> > > > So that's a bit redundant, since if you know the key, you know its
> > > > name.
> > > 
> > > What I know is irrelevant here :-)
> > > 
> > > > 
> > > > > By persisting this information TPM2_GetCapability + TPM2_ReadPublic
> > > > > can be used to acquire an appropriate handle.
> > > > 
> > > > It can, how?  If the parent is a primary, you can't insert it from a
> > > > public key, you have to derive it and if it's non-primary, you need its
> > > > parent to do the insertion.
> > > 
> > > Transient handle is like file handle and persistent handle is like inode
> > > number. Neither unambigiuously (and this is dead obvious) does not 
> > > identify any possible key.
> > > 
> > > Further by binding key correctly, the requirement of being persistent
> > > key goes away, which is a limiting factor.
> > > 
> > > > 
> > > > > I'd highly recommend to add this quirk to anything that processes
> > > > > this ASN.1 format.
> > > > 
> > > > Well, patches to the standard are accepted:
> > > > 
> > > > https://groups.io/g/openssl-tpm2-engine/topics
> > 
> > Further there is two options:
> > 
> > 1. Either remove TPM2 key ASN.1 support from kernel entirely.
> > 2. Fix the 0day bug.
> > 
> > It is unacceptable to make strong binding to a random open source
> > project. I zero care what OpenSSL TPM2 engine does with the file
> > format.
> 
> OK, so obviously the binding exists that if the key matches the whatever
> is in that persistent handle it will be loaded. However, that has still
> ambiguity concern given that any pair of parent and child key matching
> will do. It's much better if you can require a specific parent based
> on its cryptographic stamp.
> 
> So what I'll do for my project is that I just add those as optional
> while adding parent handle for backward compatibility but users
> of tpm2sh still get the benefit of enhanced security.

E.g., for kernel you could have them as kernel command-line parameter,
and by having known stamps for legit parents also adds a bit interposer
protection i.e., it disables capability from interposer to generate
child keys effectively (with low cost as this requires only extra
readpublic).

I'll see how it works in my tools, gain experience and submit a kernel
patch so that the feature gets semi-standardized.

BR, Jarkko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: tpm2key.asn1 parent identification
  2025-09-15 18:08     ` Jarkko Sakkinen
  2025-09-16  2:10       ` Jarkko Sakkinen
@ 2025-09-17  2:33       ` James Bottomley
  2025-09-18 15:48         ` Jarkko Sakkinen
  1 sibling, 1 reply; 16+ messages in thread
From: James Bottomley @ 2025-09-17  2:33 UTC (permalink / raw)
  To: Jarkko Sakkinen; +Cc: linux-integrity, tpm2

On Mon, 2025-09-15 at 21:08 +0300, Jarkko Sakkinen wrote:
> On Mon, Sep 15, 2025 at 05:50:07PM +0300, Jarkko Sakkinen wrote:
> > On Sun, Sep 14, 2025 at 11:24:24PM -0400, James Bottomley wrote:
> > > On Sun, 2025-09-14 at 19:08 +0300, Jarkko Sakkinen wrote:
> > > > Hi,
> > > > 
> > > > In practice, while implementing tpm2sh and its self-contained
> > > > TPM emulator called "MockTPM", I've noticed that
> > > > 'tpm2key.asn1.' has a major bottleneck, but luckily it is easy
> > > > to squash.
> > > > 
> > > > Parent handle should never be persisted, as it defies the
> > > > existential reason of having a file format in the first place.
> > > 
> > > Actually, if you read the spec:it describes how to handle non-
> > > persistent parents by defining the exact form of the P256 parent
> > > you derive from the permanent handle in section 3.1.8:
> > > 
> > > https://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html
> > > 
> > > This is the way all the implementations (well except the kernel,
> > > but that's fixable) do it.
> > 
> > Even if you fix it to persistent handle, the problem does not go
> > magically go away. Read public attributes are ubiquitos and
> > cryptographically correct way to do the binding.
> > 
> > > 
> > > > To address this issue I just added couple of optional fields to
> > > > TPMKey:
> > > > 
> > > >   parentName   [6] EXPLICIT OCTET STRING OPTIONAL,
> > > >   parentPubkey [7] EXPLICIT OCTET STRING OPTIONAL
> > > 
> > > So that's a bit redundant, since if you know the key, you know
> > > its name.
> > 
> > What I know is irrelevant here :-)
> > 
> > > 
> > > > By persisting this information TPM2_GetCapability +
> > > > TPM2_ReadPublic can be used to acquire an appropriate handle.
> > > 
> > > It can, how?  If the parent is a primary, you can't insert it
> > > from a public key, you have to derive it and if it's non-primary,
> > > you need its parent to do the insertion.
> > 
> > Transient handle is like file handle and persistent handle is like
> > inode number. Neither unambigiuously (and this is dead obvious)
> > does not identify any possible key.
> > 
> > Further by binding key correctly, the requirement of being
> > persistent key goes away, which is a limiting factor.
> > 
> > > 
> > > > I'd highly recommend to add this quirk to anything that
> > > > processes this ASN.1 format.
> > > 
> > > Well, patches to the standard are accepted:
> > > 
> > > https://groups.io/g/openssl-tpm2-engine/topics
> 
> Further there is two options:
> 
> 1. Either remove TPM2 key ASN.1 support from kernel entirely.
> 2. Fix the 0day bug.

Can you please explain in technical terms what you see as a zero day
bug in the current implementation?

> It is unacceptable to make strong binding to a random open source
> project. I zero care what OpenSSL TPM2 engine does with the file
> format.

I don't really get what you mean here, but the tone, which is also in
several of your replies is unmistakably hostile.  My usual playbook for
defusing this is to respond only to technical content.  However,
several people have cited to me this hostility as the reason they're
unwilling to engage further with the linux-integrity@ or keyrings@
lists and have moved on to pursue other interests. Since losing
talented contributors because of things like this is a tragedy and
because it's partly my fault for letting this continue, I'm now asking
you to please make the effort to tone down the hostile rhetoric. 
That's not to say you can't do technical criticism, you absolutely can,
just do it without hectoring and implying sinister motivations.

I think most of us have noticed that there seem to be various
circumstances in your life that are producing significant stress but at
the same time, that's not a reason to take it out on the mailing lists.
There are resources available to help with maintainer stress and
burnout and I'd certainly be happy to connect you or help out here in
another way if you'd like.

Regards,

James


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: tpm2key.asn1 parent identification
  2025-09-17  2:33       ` James Bottomley
@ 2025-09-18 15:48         ` Jarkko Sakkinen
  2025-09-18 17:35           ` Jarkko Sakkinen
  0 siblings, 1 reply; 16+ messages in thread
From: Jarkko Sakkinen @ 2025-09-18 15:48 UTC (permalink / raw)
  To: James Bottomley; +Cc: linux-integrity, tpm2

On Tue, Sep 16, 2025 at 10:33:43PM -0400, James Bottomley wrote:
> On Mon, 2025-09-15 at 21:08 +0300, Jarkko Sakkinen wrote:
> > On Mon, Sep 15, 2025 at 05:50:07PM +0300, Jarkko Sakkinen wrote:
> > > On Sun, Sep 14, 2025 at 11:24:24PM -0400, James Bottomley wrote:
> > > > On Sun, 2025-09-14 at 19:08 +0300, Jarkko Sakkinen wrote:
> > > > > Hi,
> > > > > 
> > > > > In practice, while implementing tpm2sh and its self-contained
> > > > > TPM emulator called "MockTPM", I've noticed that
> > > > > 'tpm2key.asn1.' has a major bottleneck, but luckily it is easy
> > > > > to squash.
> > > > > 
> > > > > Parent handle should never be persisted, as it defies the
> > > > > existential reason of having a file format in the first place.
> > > > 
> > > > Actually, if you read the spec:it describes how to handle non-
> > > > persistent parents by defining the exact form of the P256 parent
> > > > you derive from the permanent handle in section 3.1.8:
> > > > 
> > > > https://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html
> > > > 
> > > > This is the way all the implementations (well except the kernel,
> > > > but that's fixable) do it.
> > > 
> > > Even if you fix it to persistent handle, the problem does not go
> > > magically go away. Read public attributes are ubiquitos and
> > > cryptographically correct way to do the binding.
> > > 
> > > > 
> > > > > To address this issue I just added couple of optional fields to
> > > > > TPMKey:
> > > > > 
> > > > >   parentName   [6] EXPLICIT OCTET STRING OPTIONAL,
> > > > >   parentPubkey [7] EXPLICIT OCTET STRING OPTIONAL
> > > > 
> > > > So that's a bit redundant, since if you know the key, you know
> > > > its name.
> > > 
> > > What I know is irrelevant here :-)
> > > 
> > > > 
> > > > > By persisting this information TPM2_GetCapability +
> > > > > TPM2_ReadPublic can be used to acquire an appropriate handle.
> > > > 
> > > > It can, how?  If the parent is a primary, you can't insert it
> > > > from a public key, you have to derive it and if it's non-primary,
> > > > you need its parent to do the insertion.
> > > 
> > > Transient handle is like file handle and persistent handle is like
> > > inode number. Neither unambigiuously (and this is dead obvious)
> > > does not identify any possible key.
> > > 
> > > Further by binding key correctly, the requirement of being
> > > persistent key goes away, which is a limiting factor.
> > > 
> > > > 
> > > > > I'd highly recommend to add this quirk to anything that
> > > > > processes this ASN.1 format.
> > > > 
> > > > Well, patches to the standard are accepted:
> > > > 
> > > > https://groups.io/g/openssl-tpm2-engine/topics
> > 
> > Further there is two options:
> > 
> > 1. Either remove TPM2 key ASN.1 support from kernel entirely.
> > 2. Fix the 0day bug.
> 
> Can you please explain in technical terms what you see as a zero day
> bug in the current implementation?

It's essentially ambiguity problem in my opinion that locks in the
creator TPM if you know the expected parent. 0day might be overstatement
yes, but it is essentially the immutable reference in this scheme.
If you want to scope it, it's essentially a great way to add some defence
in depth to the scheme.

> 
> > It is unacceptable to make strong binding to a random open source
> > project. I zero care what OpenSSL TPM2 engine does with the file
> > format.
> 
> I don't really get what you mean here, but the tone, which is also in
> several of your replies is unmistakably hostile.  My usual playbook for
> defusing this is to respond only to technical content.  However,
> several people have cited to me this hostility as the reason they're
> unwilling to engage further with the linux-integrity@ or keyrings@
> lists and have moved on to pursue other interests. Since losing
> talented contributors because of things like this is a tragedy and
> because it's partly my fault for letting this continue, I'm now asking
> you to please make the effort to tone down the hostile rhetoric. 
> That's not to say you can't do technical criticism, you absolutely can,
> just do it without hectoring and implying sinister motivations.

This goes a bit off-topic but I don't recognize this as I'm usually
helpful in my own code reviews at least, and acknowledging my own
misconceptions.

> 
> I think most of us have noticed that there seem to be various
> circumstances in your life that are producing significant stress but at
> the same time, that's not a reason to take it out on the mailing lists.
> There are resources available to help with maintainer stress and
> burnout and I'd certainly be happy to connect you or help out here in
> another way if you'd like.

Sure I get that but as said there's been mostly positive tone in
the patch reviews.

> 
> Regards,
> 
> James
> 

BRm Jarkko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: tpm2key.asn1 parent identification
  2025-09-18 15:48         ` Jarkko Sakkinen
@ 2025-09-18 17:35           ` Jarkko Sakkinen
  2025-09-22  8:56             ` Jarkko Sakkinen
  0 siblings, 1 reply; 16+ messages in thread
From: Jarkko Sakkinen @ 2025-09-18 17:35 UTC (permalink / raw)
  To: James Bottomley; +Cc: linux-integrity, tpm2

On Thu, Sep 18, 2025 at 06:48:06PM +0300, Jarkko Sakkinen wrote:
> On Tue, Sep 16, 2025 at 10:33:43PM -0400, James Bottomley wrote:
> > On Mon, 2025-09-15 at 21:08 +0300, Jarkko Sakkinen wrote:
> > > On Mon, Sep 15, 2025 at 05:50:07PM +0300, Jarkko Sakkinen wrote:
> > > > On Sun, Sep 14, 2025 at 11:24:24PM -0400, James Bottomley wrote:
> > > > > On Sun, 2025-09-14 at 19:08 +0300, Jarkko Sakkinen wrote:
> > > > > > Hi,
> > > > > > 
> > > > > > In practice, while implementing tpm2sh and its self-contained
> > > > > > TPM emulator called "MockTPM", I've noticed that
> > > > > > 'tpm2key.asn1.' has a major bottleneck, but luckily it is easy
> > > > > > to squash.
> > > > > > 
> > > > > > Parent handle should never be persisted, as it defies the
> > > > > > existential reason of having a file format in the first place.
> > > > > 
> > > > > Actually, if you read the spec:it describes how to handle non-
> > > > > persistent parents by defining the exact form of the P256 parent
> > > > > you derive from the permanent handle in section 3.1.8:
> > > > > 
> > > > > https://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html
> > > > > 
> > > > > This is the way all the implementations (well except the kernel,
> > > > > but that's fixable) do it.
> > > > 
> > > > Even if you fix it to persistent handle, the problem does not go
> > > > magically go away. Read public attributes are ubiquitos and
> > > > cryptographically correct way to do the binding.
> > > > 
> > > > > 
> > > > > > To address this issue I just added couple of optional fields to
> > > > > > TPMKey:
> > > > > > 
> > > > > >   parentName   [6] EXPLICIT OCTET STRING OPTIONAL,
> > > > > >   parentPubkey [7] EXPLICIT OCTET STRING OPTIONAL
> > > > > 
> > > > > So that's a bit redundant, since if you know the key, you know
> > > > > its name.
> > > > 
> > > > What I know is irrelevant here :-)
> > > > 
> > > > > 
> > > > > > By persisting this information TPM2_GetCapability +
> > > > > > TPM2_ReadPublic can be used to acquire an appropriate handle.
> > > > > 
> > > > > It can, how?  If the parent is a primary, you can't insert it
> > > > > from a public key, you have to derive it and if it's non-primary,
> > > > > you need its parent to do the insertion.
> > > > 
> > > > Transient handle is like file handle and persistent handle is like
> > > > inode number. Neither unambigiuously (and this is dead obvious)
> > > > does not identify any possible key.
> > > > 
> > > > Further by binding key correctly, the requirement of being
> > > > persistent key goes away, which is a limiting factor.
> > > > 
> > > > > 
> > > > > > I'd highly recommend to add this quirk to anything that
> > > > > > processes this ASN.1 format.
> > > > > 
> > > > > Well, patches to the standard are accepted:
> > > > > 
> > > > > https://groups.io/g/openssl-tpm2-engine/topics
> > > 
> > > Further there is two options:
> > > 
> > > 1. Either remove TPM2 key ASN.1 support from kernel entirely.
> > > 2. Fix the 0day bug.
> > 
> > Can you please explain in technical terms what you see as a zero day
> > bug in the current implementation?
> 
> It's essentially ambiguity problem in my opinion that locks in the
> creator TPM if you know the expected parent. 0day might be overstatement
> yes, but it is essentially the immutable reference in this scheme.
> If you want to scope it, it's essentially a great way to add some defence
> in depth to the scheme.
> 
> > 
> > > It is unacceptable to make strong binding to a random open source
> > > project. I zero care what OpenSSL TPM2 engine does with the file
> > > format.

The way I see it, a "random project" would apply to any project that a
format is locked in, and it is quite obvious that fixing handle as the
anchor is exactly fit for exactly for this project, and within those
exact limits it is probably a sustainable choice.

Being able to fix key into cryptographic  identity is somewhat sane
addition because not only does it lock-in the creator but it also allows
to use offline stored keys with the same scheme i.e., non-endorsement
hierarchy derived keys created with TPM2_Create or TPM2_Import.

In the context of OpenSSL TPM2 engine, perhaps the current scheme is
fine but in the context of supporting a "ecosystem" as a kernel feature
it's not in its current form robust enough.

And how else I can describe it other than I don't care about the
project, if the file format enforces me align with it?

> > 
> > I don't really get what you mean here, but the tone, which is also in
> > several of your replies is unmistakably hostile.  My usual playbook for
> > defusing this is to respond only to technical content.  However,
> > several people have cited to me this hostility as the reason they're
> > unwilling to engage further with the linux-integrity@ or keyrings@
> > lists and have moved on to pursue other interests. Since losing
> > talented contributors because of things like this is a tragedy and
> > because it's partly my fault for letting this continue, I'm now asking
> > you to please make the effort to tone down the hostile rhetoric. 
> > That's not to say you can't do technical criticism, you absolutely can,
> > just do it without hectoring and implying sinister motivations.
> 
> This goes a bit off-topic but I don't recognize this as I'm usually
> helpful in my own code reviews at least, and acknowledging my own
> misconceptions.
> 
> > 
> > I think most of us have noticed that there seem to be various
> > circumstances in your life that are producing significant stress but at
> > the same time, that's not a reason to take it out on the mailing lists.
> > There are resources available to help with maintainer stress and
> > burnout and I'd certainly be happy to connect you or help out here in
> > another way if you'd like.
> 
> Sure I get that but as said there's been mostly positive tone in
> the patch reviews.
> 
> > 
> > Regards,
> > 
> > James
> > 

BR, Jarkko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: tpm2key.asn1 parent identification
  2025-09-18 17:35           ` Jarkko Sakkinen
@ 2025-09-22  8:56             ` Jarkko Sakkinen
  2025-09-22 21:31               ` James Bottomley
  0 siblings, 1 reply; 16+ messages in thread
From: Jarkko Sakkinen @ 2025-09-22  8:56 UTC (permalink / raw)
  To: James Bottomley; +Cc: linux-integrity, tpm2

On Thu, Sep 18, 2025 at 08:35:38PM +0300, Jarkko Sakkinen wrote:
> On Thu, Sep 18, 2025 at 06:48:06PM +0300, Jarkko Sakkinen wrote:
> > On Tue, Sep 16, 2025 at 10:33:43PM -0400, James Bottomley wrote:
> > > On Mon, 2025-09-15 at 21:08 +0300, Jarkko Sakkinen wrote:
> > > > On Mon, Sep 15, 2025 at 05:50:07PM +0300, Jarkko Sakkinen wrote:
> > > > > On Sun, Sep 14, 2025 at 11:24:24PM -0400, James Bottomley wrote:
> > > > > > On Sun, 2025-09-14 at 19:08 +0300, Jarkko Sakkinen wrote:
> > > > > > > Hi,
> > > > > > > 
> > > > > > > In practice, while implementing tpm2sh and its self-contained
> > > > > > > TPM emulator called "MockTPM", I've noticed that
> > > > > > > 'tpm2key.asn1.' has a major bottleneck, but luckily it is easy
> > > > > > > to squash.
> > > > > > > 
> > > > > > > Parent handle should never be persisted, as it defies the
> > > > > > > existential reason of having a file format in the first place.
> > > > > > 
> > > > > > Actually, if you read the spec:it describes how to handle non-
> > > > > > persistent parents by defining the exact form of the P256 parent
> > > > > > you derive from the permanent handle in section 3.1.8:
> > > > > > 
> > > > > > https://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html
> > > > > > 
> > > > > > This is the way all the implementations (well except the kernel,
> > > > > > but that's fixable) do it.
> > > > > 
> > > > > Even if you fix it to persistent handle, the problem does not go
> > > > > magically go away. Read public attributes are ubiquitos and
> > > > > cryptographically correct way to do the binding.
> > > > > 
> > > > > > 
> > > > > > > To address this issue I just added couple of optional fields to
> > > > > > > TPMKey:
> > > > > > > 
> > > > > > >   parentName   [6] EXPLICIT OCTET STRING OPTIONAL,
> > > > > > >   parentPubkey [7] EXPLICIT OCTET STRING OPTIONAL
> > > > > > 
> > > > > > So that's a bit redundant, since if you know the key, you know
> > > > > > its name.
> > > > > 
> > > > > What I know is irrelevant here :-)
> > > > > 
> > > > > > 
> > > > > > > By persisting this information TPM2_GetCapability +
> > > > > > > TPM2_ReadPublic can be used to acquire an appropriate handle.
> > > > > > 
> > > > > > It can, how?  If the parent is a primary, you can't insert it
> > > > > > from a public key, you have to derive it and if it's non-primary,
> > > > > > you need its parent to do the insertion.
> > > > > 
> > > > > Transient handle is like file handle and persistent handle is like
> > > > > inode number. Neither unambigiuously (and this is dead obvious)
> > > > > does not identify any possible key.
> > > > > 
> > > > > Further by binding key correctly, the requirement of being
> > > > > persistent key goes away, which is a limiting factor.
> > > > > 
> > > > > > 
> > > > > > > I'd highly recommend to add this quirk to anything that
> > > > > > > processes this ASN.1 format.
> > > > > > 
> > > > > > Well, patches to the standard are accepted:
> > > > > > 
> > > > > > https://groups.io/g/openssl-tpm2-engine/topics
> > > > 
> > > > Further there is two options:
> > > > 
> > > > 1. Either remove TPM2 key ASN.1 support from kernel entirely.
> > > > 2. Fix the 0day bug.
> > > 
> > > Can you please explain in technical terms what you see as a zero day
> > > bug in the current implementation?
> > 
> > It's essentially ambiguity problem in my opinion that locks in the
> > creator TPM if you know the expected parent. 0day might be overstatement
> > yes, but it is essentially the immutable reference in this scheme.
> > If you want to scope it, it's essentially a great way to add some defence
> > in depth to the scheme.
> > 
> > > 
> > > > It is unacceptable to make strong binding to a random open source
> > > > project. I zero care what OpenSSL TPM2 engine does with the file
> > > > format.
> 
> The way I see it, a "random project" would apply to any project that a
> format is locked in, and it is quite obvious that fixing handle as the
> anchor is exactly fit for exactly for this project, and within those
> exact limits it is probably a sustainable choice.
> 
> Being able to fix key into cryptographic  identity is somewhat sane
> addition because not only does it lock-in the creator but it also allows
> to use offline stored keys with the same scheme i.e., non-endorsement
> hierarchy derived keys created with TPM2_Create or TPM2_Import.
> 
> In the context of OpenSSL TPM2 engine, perhaps the current scheme is
> fine but in the context of supporting a "ecosystem" as a kernel feature
> it's not in its current form robust enough.
> 
> And how else I can describe it other than I don't care about the
> project, if the file format enforces me align with it?

The ASN.1 definition limits types of keys while there's no any good
reasons to disregard transient keys. 

It also enforces handle numbers, which is not very robust approach.

I've neither seen any cryptographic object in my life, which uses
ambiguous data as part of the identity no matter how hypothetical
the possible threat scenarios are. It's a bad security practice
plain and simple.

BR, Jarkko


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: tpm2key.asn1 parent identification
  2025-09-22  8:56             ` Jarkko Sakkinen
@ 2025-09-22 21:31               ` James Bottomley
  2025-09-23 14:25                 ` Jarkko Sakkinen
  0 siblings, 1 reply; 16+ messages in thread
From: James Bottomley @ 2025-09-22 21:31 UTC (permalink / raw)
  To: Jarkko Sakkinen; +Cc: linux-integrity, tpm2

On Mon, 2025-09-22 at 11:56 +0300, Jarkko Sakkinen wrote:
> On Thu, Sep 18, 2025 at 08:35:38PM +0300, Jarkko Sakkinen wrote:
> > On Thu, Sep 18, 2025 at 06:48:06PM +0300, Jarkko Sakkinen wrote:
> > > On Tue, Sep 16, 2025 at 10:33:43PM -0400, James Bottomley wrote:
> > > > On Mon, 2025-09-15 at 21:08 +0300, Jarkko Sakkinen wrote:
> > > > > On Mon, Sep 15, 2025 at 05:50:07PM +0300, Jarkko Sakkinen
> > > > > wrote:
> > > > > > On Sun, Sep 14, 2025 at 11:24:24PM -0400, James Bottomley
> > > > > > wrote:
> > > > > > > On Sun, 2025-09-14 at 19:08 +0300, Jarkko Sakkinen wrote:
> > > > > > > > Hi,
> > > > > > > > 
> > > > > > > > In practice, while implementing tpm2sh and its self-
> > > > > > > > contained TPM emulator called "MockTPM", I've noticed
> > > > > > > > that 'tpm2key.asn1.' has a major bottleneck, but
> > > > > > > > luckily it is easy to squash.
> > > > > > > > 
> > > > > > > > Parent handle should never be persisted, as it defies
> > > > > > > > the existential reason of having a file format in the
> > > > > > > > first place.
> > > > > > > 
> > > > > > > Actually, if you read the spec:it describes how to handle
> > > > > > > non-persistent parents by defining the exact form of the
> > > > > > > P256 parent you derive from the permanent handle in
> > > > > > > section 3.1.8:
> > > > > > > 
> > > > > > > https://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html
> > > > > > > 
> > > > > > > This is the way all the implementations (well except the
> > > > > > > kernel, but that's fixable) do it.
> > > > > > 
> > > > > > Even if you fix it to persistent handle, the problem does
> > > > > > not go magically go away. Read public attributes are
> > > > > > ubiquitos and cryptographically correct way to do the
> > > > > > binding.
> > > > > > 
> > > > > > > 
> > > > > > > > To address this issue I just added couple of optional
> > > > > > > > fields to
> > > > > > > > TPMKey:
> > > > > > > > 
> > > > > > > >   parentName   [6] EXPLICIT OCTET STRING OPTIONAL,
> > > > > > > >   parentPubkey [7] EXPLICIT OCTET STRING OPTIONAL
> > > > > > > 
> > > > > > > So that's a bit redundant, since if you know the key, you
> > > > > > > know
> > > > > > > its name.
> > > > > > 
> > > > > > What I know is irrelevant here :-)
> > > > > > 
> > > > > > > 
> > > > > > > > By persisting this information TPM2_GetCapability +
> > > > > > > > TPM2_ReadPublic can be used to acquire an appropriate
> > > > > > > > handle.
> > > > > > > 
> > > > > > > It can, how?  If the parent is a primary, you can't
> > > > > > > insert it from a public key, you have to derive it and if
> > > > > > > it's non-primary, you need its parent to do the
> > > > > > > insertion.
> > > > > > 
> > > > > > Transient handle is like file handle and persistent handle
> > > > > > is like inode number. Neither unambigiuously (and this is
> > > > > > dead obvious) does not identify any possible key.
> > > > > > 
> > > > > > Further by binding key correctly, the requirement of being
> > > > > > persistent key goes away, which is a limiting factor.
> > > > > > 
> > > > > > > 
> > > > > > > > I'd highly recommend to add this quirk to anything that
> > > > > > > > processes this ASN.1 format.
> > > > > > > 
> > > > > > > Well, patches to the standard are accepted:
> > > > > > > 
> > > > > > > https://groups.io/g/openssl-tpm2-engine/topics
> > > > > 
> > > > > Further there is two options:
> > > > > 
> > > > > 1. Either remove TPM2 key ASN.1 support from kernel entirely.
> > > > > 2. Fix the 0day bug.
> > > > 
> > > > Can you please explain in technical terms what you see as a
> > > > zero day bug in the current implementation?
> > > 
> > > It's essentially ambiguity problem in my opinion that locks in
> > > the creator TPM if you know the expected parent. 0day might be
> > > overstatement yes, but it is essentially the immutable reference
> > > in this scheme. If you want to scope it, it's essentially a great
> > > way to add some defence in depth to the scheme.
> > > 
> > > > 
> > > > > It is unacceptable to make strong binding to a random open
> > > > > source project. I zero care what OpenSSL TPM2 engine does
> > > > > with the file format.
> > 
> > The way I see it, a "random project" would apply to any project
> > that a format is locked in, and it is quite obvious that fixing
> > handle as the anchor is exactly fit for exactly for this project,
> > and within those exact limits it is probably a sustainable choice.
> > 
> > Being able to fix key into cryptographic  identity is somewhat sane
> > addition because not only does it lock-in the creator but it also
> > allows to use offline stored keys with the same scheme i.e.,
> > non-endorsement hierarchy derived keys created with TPM2_Create or
> > TPM2_Import.
> > 
> > In the context of OpenSSL TPM2 engine, perhaps the current scheme
> > is fine but in the context of supporting a "ecosystem" as a kernel
> > feature it's not in its current form robust enough.
> > 
> > And how else I can describe it other than I don't care about the
> > project, if the file format enforces me align with it?
> 
> The ASN.1 definition limits types of keys while there's no any good
> reasons to disregard transient keys. 

As I explained in the bit you quote above, the spec covers volatile
parents.

> It also enforces handle numbers, which is not very robust approach.

I think if you read the spec, you'll find it only requires handle
numbers for persistent keys ... specific handle numbers being a feature
of those keys required by TPM spec.

> I've neither seen any cryptographic object in my life, which uses
> ambiguous data as part of the identity no matter how hypothetical
> the possible threat scenarios are. It's a bad security practice
> plain and simple.

This contains no actionable technical content.  However, it is possible
the spec doesn't cover your use case, it's just you haven't actually
outlined what your use case is, so no-one who knows the spec can
actually confirm or deny this.

Regards,

James


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: tpm2key.asn1 parent identification
  2025-09-14 16:23 ` Jarkko Sakkinen
@ 2025-09-22 21:42   ` James Bottomley
  0 siblings, 0 replies; 16+ messages in thread
From: James Bottomley @ 2025-09-22 21:42 UTC (permalink / raw)
  To: Jarkko Sakkinen, linux-integrity, tpm2

On Sun, 2025-09-14 at 19:23 +0300, Jarkko Sakkinen wrote:
> On Sun, Sep 14, 2025 at 07:08:37PM +0300, Jarkko Sakkinen wrote:
> > Hi,
> > 
> > In practice, while implementing tpm2sh and its self-contained TPM
> > emulator called "MockTPM", I've noticed that 'tpm2key.asn1.' has a
> > major bottleneck, but luckily it is easy to squash.
> > 
> > Parent handle should never be persisted, as it defies the
> > existential reason of having a file format in the first place.
> > 
> > To address this issue I just added couple of optional fields to
> > TPMKey:
> > 
> >   parentName   [6] EXPLICIT OCTET STRING OPTIONAL,
> >   parentPubkey [7] EXPLICIT OCTET STRING OPTIONAL
> > 
> > By persisting this information TPM2_GetCapability + TPM2_ReadPublic
> > can be used to acquire an appropriate handle.
> > 
> > I'd highly recommend to add this quirk to anything that processes
> > this ASN.1 format.
> 
> 
> Here's a proof of concept:
> 
> https://github.com/puavo-org/tpm2sh/commit/18ec3c2169b23523d8866c58fa7b8a89a79bd3d4

Saving the output of read_public and comparing against the saved value
provides no proof of binding.  This is actually what the systemd TPM
keys handlers do and, as I demonstrated in FOSDEM, an interposer attack
that's early enough to come at key sealing still manages to exfiltrate
the secret without being revealed.

https://archive.fosdem.org/2025/schedule/event/fosdem-2025-4827-recent-tpm-security-enhancements-to-the-linux-kernel/

One possible benefit of saving the public part of the TPM key parent is
to give subsequent sessions a known key to encrypt a salt to which an
interposer can't hack.  However, this only works, as demonstrated
above, if you certify the parent *before* you save it.  However, if
you're doing certification, it's just as easy to derive a primary and
certify that before salting the session ... again, as demonstrated,
this is done by saving the name of the EK signing key somewhere in an
encrypted filesystem the attacker wouldn't find it easy to alter.

Regards,

James


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: tpm2key.asn1 parent identification
  2025-09-22 21:31               ` James Bottomley
@ 2025-09-23 14:25                 ` Jarkko Sakkinen
  2025-09-23 14:37                   ` James Bottomley
  0 siblings, 1 reply; 16+ messages in thread
From: Jarkko Sakkinen @ 2025-09-23 14:25 UTC (permalink / raw)
  To: James Bottomley; +Cc: linux-integrity, tpm2

On Mon, Sep 22, 2025 at 05:31:24PM -0400, James Bottomley wrote:
> On Mon, 2025-09-22 at 11:56 +0300, Jarkko Sakkinen wrote:
> > On Thu, Sep 18, 2025 at 08:35:38PM +0300, Jarkko Sakkinen wrote:
> > > On Thu, Sep 18, 2025 at 06:48:06PM +0300, Jarkko Sakkinen wrote:
> > > > On Tue, Sep 16, 2025 at 10:33:43PM -0400, James Bottomley wrote:
> > > > > On Mon, 2025-09-15 at 21:08 +0300, Jarkko Sakkinen wrote:
> > > > > > On Mon, Sep 15, 2025 at 05:50:07PM +0300, Jarkko Sakkinen
> > > > > > wrote:
> > > > > > > On Sun, Sep 14, 2025 at 11:24:24PM -0400, James Bottomley
> > > > > > > wrote:
> > > > > > > > On Sun, 2025-09-14 at 19:08 +0300, Jarkko Sakkinen wrote:
> > > > > > > > > Hi,
> > > > > > > > > 
> > > > > > > > > In practice, while implementing tpm2sh and its self-
> > > > > > > > > contained TPM emulator called "MockTPM", I've noticed
> > > > > > > > > that 'tpm2key.asn1.' has a major bottleneck, but
> > > > > > > > > luckily it is easy to squash.
> > > > > > > > > 
> > > > > > > > > Parent handle should never be persisted, as it defies
> > > > > > > > > the existential reason of having a file format in the
> > > > > > > > > first place.
> > > > > > > > 
> > > > > > > > Actually, if you read the spec:it describes how to handle
> > > > > > > > non-persistent parents by defining the exact form of the
> > > > > > > > P256 parent you derive from the permanent handle in
> > > > > > > > section 3.1.8:
> > > > > > > > 
> > > > > > > > https://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html
> > > > > > > > 
> > > > > > > > This is the way all the implementations (well except the
> > > > > > > > kernel, but that's fixable) do it.
> > > > > > > 
> > > > > > > Even if you fix it to persistent handle, the problem does
> > > > > > > not go magically go away. Read public attributes are
> > > > > > > ubiquitos and cryptographically correct way to do the
> > > > > > > binding.
> > > > > > > 
> > > > > > > > 
> > > > > > > > > To address this issue I just added couple of optional
> > > > > > > > > fields to
> > > > > > > > > TPMKey:
> > > > > > > > > 
> > > > > > > > >   parentName   [6] EXPLICIT OCTET STRING OPTIONAL,
> > > > > > > > >   parentPubkey [7] EXPLICIT OCTET STRING OPTIONAL
> > > > > > > > 
> > > > > > > > So that's a bit redundant, since if you know the key, you
> > > > > > > > know
> > > > > > > > its name.
> > > > > > > 
> > > > > > > What I know is irrelevant here :-)
> > > > > > > 
> > > > > > > > 
> > > > > > > > > By persisting this information TPM2_GetCapability +
> > > > > > > > > TPM2_ReadPublic can be used to acquire an appropriate
> > > > > > > > > handle.
> > > > > > > > 
> > > > > > > > It can, how?  If the parent is a primary, you can't
> > > > > > > > insert it from a public key, you have to derive it and if
> > > > > > > > it's non-primary, you need its parent to do the
> > > > > > > > insertion.
> > > > > > > 
> > > > > > > Transient handle is like file handle and persistent handle
> > > > > > > is like inode number. Neither unambigiuously (and this is
> > > > > > > dead obvious) does not identify any possible key.
> > > > > > > 
> > > > > > > Further by binding key correctly, the requirement of being
> > > > > > > persistent key goes away, which is a limiting factor.
> > > > > > > 
> > > > > > > > 
> > > > > > > > > I'd highly recommend to add this quirk to anything that
> > > > > > > > > processes this ASN.1 format.
> > > > > > > > 
> > > > > > > > Well, patches to the standard are accepted:
> > > > > > > > 
> > > > > > > > https://groups.io/g/openssl-tpm2-engine/topics
> > > > > > 
> > > > > > Further there is two options:
> > > > > > 
> > > > > > 1. Either remove TPM2 key ASN.1 support from kernel entirely.
> > > > > > 2. Fix the 0day bug.
> > > > > 
> > > > > Can you please explain in technical terms what you see as a
> > > > > zero day bug in the current implementation?
> > > > 
> > > > It's essentially ambiguity problem in my opinion that locks in
> > > > the creator TPM if you know the expected parent. 0day might be
> > > > overstatement yes, but it is essentially the immutable reference
> > > > in this scheme. If you want to scope it, it's essentially a great
> > > > way to add some defence in depth to the scheme.
> > > > 
> > > > > 
> > > > > > It is unacceptable to make strong binding to a random open
> > > > > > source project. I zero care what OpenSSL TPM2 engine does
> > > > > > with the file format.
> > > 
> > > The way I see it, a "random project" would apply to any project
> > > that a format is locked in, and it is quite obvious that fixing
> > > handle as the anchor is exactly fit for exactly for this project,
> > > and within those exact limits it is probably a sustainable choice.
> > > 
> > > Being able to fix key into cryptographic  identity is somewhat sane
> > > addition because not only does it lock-in the creator but it also
> > > allows to use offline stored keys with the same scheme i.e.,
> > > non-endorsement hierarchy derived keys created with TPM2_Create or
> > > TPM2_Import.
> > > 
> > > In the context of OpenSSL TPM2 engine, perhaps the current scheme
> > > is fine but in the context of supporting a "ecosystem" as a kernel
> > > feature it's not in its current form robust enough.
> > > 
> > > And how else I can describe it other than I don't care about the
> > > project, if the file format enforces me align with it?
> > 
> > The ASN.1 definition limits types of keys while there's no any good
> > reasons to disregard transient keys. 
> 
> As I explained in the bit you quote above, the spec covers volatile
> parents.
> 
> > It also enforces handle numbers, which is not very robust approach.
> 
> I think if you read the spec, you'll find it only requires handle
> numbers for persistent keys ... specific handle numbers being a feature
> of those keys required by TPM spec.
> 
> > I've neither seen any cryptographic object in my life, which uses
> > ambiguous data as part of the identity no matter how hypothetical
> > the possible threat scenarios are. It's a bad security practice
> > plain and simple.
> 
> This contains no actionable technical content.  However, it is possible
> the spec doesn't cover your use case, it's just you haven't actually
> outlined what your use case is, so no-one who knows the spec can
> actually confirm or deny this.

I revisited the issue and this is how I see the situation.

I think the most feasible approch especially for volatile keys would be
to store all structures included in TPM2_Create response, instead of 
only storing the first two response parameters. Rest of the blobs
can be e.g. optional. It's the most bottleneck free way to address
any issues.

Creation data contains indefinitive information about parent and this
also enable the use of tickets.

> 
> Regards,
> 
> James
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: tpm2key.asn1 parent identification
  2025-09-23 14:25                 ` Jarkko Sakkinen
@ 2025-09-23 14:37                   ` James Bottomley
  2025-09-23 15:08                     ` Jarkko Sakkinen
  0 siblings, 1 reply; 16+ messages in thread
From: James Bottomley @ 2025-09-23 14:37 UTC (permalink / raw)
  To: Jarkko Sakkinen; +Cc: linux-integrity, tpm2

On Tue, 2025-09-23 at 17:25 +0300, Jarkko Sakkinen wrote:
> On Mon, Sep 22, 2025 at 05:31:24PM -0400, James Bottomley wrote:
> > On Mon, 2025-09-22 at 11:56 +0300, Jarkko Sakkinen wrote:
> > > On Thu, Sep 18, 2025 at 08:35:38PM +0300, Jarkko Sakkinen wrote:
[...]
> > > > The way I see it, a "random project" would apply to any project
> > > > that a format is locked in, and it is quite obvious that fixing
> > > > handle as the anchor is exactly fit for exactly for this
> > > > project, and within those exact limits it is probably a
> > > > sustainable choice.
> > > > 
> > > > Being able to fix key into cryptographic  identity is somewhat
> > > > sane addition because not only does it lock-in the creator but
> > > > it also allows to use offline stored keys with the same scheme
> > > > i.e., non-endorsement hierarchy derived keys created with
> > > > TPM2_Create or TPM2_Import.
> > > > 
> > > > In the context of OpenSSL TPM2 engine, perhaps the current
> > > > scheme is fine but in the context of supporting a "ecosystem"
> > > > as a kernel feature it's not in its current form robust enough.
> > > > 
> > > > And how else I can describe it other than I don't care about
> > > > the project, if the file format enforces me align with it?
> > > 
> > > The ASN.1 definition limits types of keys while there's no any
> > > good reasons to disregard transient keys. 
> > 
> > As I explained in the bit you quote above, the spec covers volatile
> > parents.
> > 
> > > It also enforces handle numbers, which is not very robust
> > > approach.
> > 
> > I think if you read the spec, you'll find it only requires handle
> > numbers for persistent keys ... specific handle numbers being a
> > feature of those keys required by TPM spec.
> > 
> > > I've neither seen any cryptographic object in my life, which uses
> > > ambiguous data as part of the identity no matter how hypothetical
> > > the possible threat scenarios are. It's a bad security practice
> > > plain and simple.
> > 
> > This contains no actionable technical content.  However, it is
> > possible the spec doesn't cover your use case, it's just you
> > haven't actually outlined what your use case is, so no-one who
> > knows the spec can actually confirm or deny this.
> 
> I revisited the issue and this is how I see the situation.
> 
> I think the most feasible approch especially for volatile keys would
> be to store all structures included in TPM2_Create response, instead
> of only storing the first two response parameters. Rest of the blobs
> can be e.g. optional. It's the most bottleneck free way to address
> any issues.

I still don't understand what issues you're referring to.  However ...

> Creation data contains indefinitive information about parent and this
> also enable the use of tickets.

This is already being discussed on the list if you want to join:

https://groups.io/g/openssl-tpm2-engine/topic/patch_doc_update_draft_rfc/115384542

Regards,

James


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: tpm2key.asn1 parent identification
  2025-09-23 14:37                   ` James Bottomley
@ 2025-09-23 15:08                     ` Jarkko Sakkinen
  0 siblings, 0 replies; 16+ messages in thread
From: Jarkko Sakkinen @ 2025-09-23 15:08 UTC (permalink / raw)
  To: James Bottomley; +Cc: linux-integrity, tpm2

On Tue, Sep 23, 2025 at 10:37:06AM -0400, James Bottomley wrote:
> On Tue, 2025-09-23 at 17:25 +0300, Jarkko Sakkinen wrote:
> > On Mon, Sep 22, 2025 at 05:31:24PM -0400, James Bottomley wrote:
> > > On Mon, 2025-09-22 at 11:56 +0300, Jarkko Sakkinen wrote:
> > > > On Thu, Sep 18, 2025 at 08:35:38PM +0300, Jarkko Sakkinen wrote:
> [...]
> > > > > The way I see it, a "random project" would apply to any project
> > > > > that a format is locked in, and it is quite obvious that fixing
> > > > > handle as the anchor is exactly fit for exactly for this
> > > > > project, and within those exact limits it is probably a
> > > > > sustainable choice.
> > > > > 
> > > > > Being able to fix key into cryptographic  identity is somewhat
> > > > > sane addition because not only does it lock-in the creator but
> > > > > it also allows to use offline stored keys with the same scheme
> > > > > i.e., non-endorsement hierarchy derived keys created with
> > > > > TPM2_Create or TPM2_Import.
> > > > > 
> > > > > In the context of OpenSSL TPM2 engine, perhaps the current
> > > > > scheme is fine but in the context of supporting a "ecosystem"
> > > > > as a kernel feature it's not in its current form robust enough.
> > > > > 
> > > > > And how else I can describe it other than I don't care about
> > > > > the project, if the file format enforces me align with it?
> > > > 
> > > > The ASN.1 definition limits types of keys while there's no any
> > > > good reasons to disregard transient keys. 
> > > 
> > > As I explained in the bit you quote above, the spec covers volatile
> > > parents.
> > > 
> > > > It also enforces handle numbers, which is not very robust
> > > > approach.
> > > 
> > > I think if you read the spec, you'll find it only requires handle
> > > numbers for persistent keys ... specific handle numbers being a
> > > feature of those keys required by TPM spec.
> > > 
> > > > I've neither seen any cryptographic object in my life, which uses
> > > > ambiguous data as part of the identity no matter how hypothetical
> > > > the possible threat scenarios are. It's a bad security practice
> > > > plain and simple.
> > > 
> > > This contains no actionable technical content.  However, it is
> > > possible the spec doesn't cover your use case, it's just you
> > > haven't actually outlined what your use case is, so no-one who
> > > knows the spec can actually confirm or deny this.
> > 
> > I revisited the issue and this is how I see the situation.
> > 
> > I think the most feasible approch especially for volatile keys would
> > be to store all structures included in TPM2_Create response, instead
> > of only storing the first two response parameters. Rest of the blobs
> > can be e.g. optional. It's the most bottleneck free way to address
> > any issues.
> 
> I still don't understand what issues you're referring to.  However ...

OK so I can work on the topic more. In my case, I realized that the is
existential question that why having ASN.1 format is useful in the first
place. This is not to say there is not existential reason (i.e. not
claiming that but) if save just the whole response to the disk I can
load a key as:

1. Read the response blob.
2. Read parent identity from CREATION_DATA
3. With the information iterate through handles in the TPM and find the
   correct parent
4. Pass the parent handle to TPM2_Load

So if this works out I might not need to change tpm2key if I just use
the response blob itself as the file format. I need to experiment with
this and find the possible issues wit the approach, and if there are
fields in ASN.1 that don't exist in some form in the raw TPM data.

> 
> > Creation data contains indefinitive information about parent and this
> > also enable the use of tickets.
> 
> This is already being discussed on the list if you want to join:
> 
> https://groups.io/g/openssl-tpm2-engine/topic/patch_doc_update_draft_rfc/115384542
> 
> Regards,
> 
> James
> 

BR, Jarkko

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2025-09-23 15:08 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-14 16:08 tpm2key.asn1 parent identification Jarkko Sakkinen
2025-09-14 16:23 ` Jarkko Sakkinen
2025-09-22 21:42   ` James Bottomley
2025-09-15  3:24 ` James Bottomley
2025-09-15 14:50   ` Jarkko Sakkinen
2025-09-15 18:08     ` Jarkko Sakkinen
2025-09-16  2:10       ` Jarkko Sakkinen
2025-09-16  2:19         ` Jarkko Sakkinen
2025-09-17  2:33       ` James Bottomley
2025-09-18 15:48         ` Jarkko Sakkinen
2025-09-18 17:35           ` Jarkko Sakkinen
2025-09-22  8:56             ` Jarkko Sakkinen
2025-09-22 21:31               ` James Bottomley
2025-09-23 14:25                 ` Jarkko Sakkinen
2025-09-23 14:37                   ` James Bottomley
2025-09-23 15:08                     ` Jarkko Sakkinen

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