In message <1482516363.2501.34.ca...@hansenpartnership.com> on Fri, 23 Dec 2016 
10:06:03 -0800, James Bottomley <james.bottom...@hansenpartnership.com> said:

James.Bottomley> The reason this comes about is because we already have a 
standard form
James.Bottomley> for TPM 1.2 keys here:
James.Bottomley> 
James.Bottomley> 
http://david.woodhou.se/draft-woodhouse-cert-best-practice.html#ident-tpm
James.Bottomley> 
James.Bottomley> However, since I'm working on TPM2 enabling for openssl and 
gnutls, I
James.Bottomley> need to come up with a new key format because TPM2 requires 
some extra
James.Bottomley> parameters and the original TSS KEY BLOB, being a single
James.Bottomley> ASN1_OCTET_STRING isn't expandable.
James.Bottomley> 
James.Bottomley> As a digression, the extra parameters that TPM2 needs are:
James.Bottomley> 
James.Bottomley>    1. A public key blob.  In TPM12 the key complex was a joint
James.Bottomley>       public/private part.  In TPM2, the public and private 
key structures
James.Bottomley>       have variable length and are supplied separately.
James.Bottomley>    2. a boolean for emptyAuth.  In TPM12 there's a way to tell 
if a
James.Bottomley>       structure has no authorization.  In TPM2 there's no such 
thing as no
James.Bottomley>       authorization, but there's a conventional empty 
authorization to
James.Bottomley>       replace it but no way of querying whether any given key 
is using it,
James.Bottomley>       so we need to know explicitly whether to prompt for a 
password or
James.Bottomley>       not.
James.Bottomley>    3. There are different forms a TPM private key could be in. 
 One is
James.Bottomley>       symmetrically encrypted with a TPM private key, which 
makes it
James.Bottomley>       loadable, meaning it must be produced on the TPM itself 
and the
James.Bottomley>       other is asymmetrically encrypted meaning it can be 
produced away
James.Bottomley>       from the TPM but must be imported before being loaded.
James.Bottomley> 
James.Bottomley> I think there's value in having a universal structure for the 
key
James.Bottomley> representations, so I'm proposing an ASN1 representation that 
will work
James.Bottomley> for both TPM1.2 and TPM2 keys.  I'd also like it to be self 
describing,
James.Bottomley> so I think we should use an OID as the initial parameter of the
James.Bottomley> sequence.  With that, I think the format that works is
James.Bottomley> 
James.Bottomley> TPMKey ::= SEQUENCE {
James.Bottomley>        type            OBJECT IDENTIFIER
James.Bottomley>        version         [0] IMPLICIT INTEGER OPTIONAL
James.Bottomley>        emptyAuth       [1] IMPLICIT BOOLEAN OPTIONAL
James.Bottomley>        parent          [2] IMPLICIT INTEGER OPTIONAL
James.Bottomley>        publicKey       [3] IMPLICIT OCTET STRING OPTIONAL
James.Bottomley>        privateKey      OCTET STRING
James.Bottomley> }
James.Bottomley> 
James.Bottomley> Where TPM12 keys would have a TPM12Key type and use no 
optional fields
James.Bottomley> (meaning only privateKey) and TPM2 keys would have type 
TPM2LoadableKey
James.Bottomley> or TPM2ImportableKey type and then make use of all the 
optional fields
James.Bottomley> (except version).
James.Bottomley> 
James.Bottomley> Version is there for future expansion, but is unused in the 
initial
James.Bottomley> incarnation.
James.Bottomley> 
James.Bottomley> I'm torn on where to get the OIDs from.  Since this is a TPM 
key, it
James.Bottomley> might make sense to use the TCG OID (2.23.133) and just add 
something
James.Bottomley> they haven't already used, like 10 for key formats, or we 
could go with
James.Bottomley> a pkcs OID (1.2.840.113549.1)
James.Bottomley> 
James.Bottomley> If we can agree on this, we can update David's document and 
make it a
James.Bottomley> formal RFC.
James.Bottomley> 
James.Bottomley> Thoughts?

First reaction is +1, at least for actually making a universally
parsable description.

One detail that escapes me, though, is why you don't use version for,
well, TPM versions?  So, something like this?

TCG OBJECT IDENTIFIER ::=
        { joint-iso-itu-t(2) international-organizations(23) TCG(133)  }

TPMKey ::= SEQUENCE {
       type        OBJECT IDENTIFIER    -- always TCG
       version     [0] INTEGER { v1_2(0), v2(1) } DEFAULT v1_2
       emptyAuth   [1] IMPLICIT BOOLEAN OPTIONAL        -- v2 only
       parent      [2] IMPLICIT INTEGER OPTIONAL        -- v2 only
       publicKey   [3] IMPLICIT OCTET STRING OPTIONAL   -- v2 only
       privateKey  OCTET STRING
}

Cheers,
Richard

-- 
Richard Levitte         levi...@openssl.org
OpenSSL Project         http://www.openssl.org/~levitte/
-- 
openssl-dev mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-dev

Reply via email to