@@ -15,14 +15,18 @@ typedef struct {
1515 ASN1_INTEGER * parent ;
1616 ASN1_OCTET_STRING * pubkey ;
1717 ASN1_OCTET_STRING * privkey ;
18+ ASN1_INTEGER * privkeyType ;
19+ ASN1_INTEGER * privkeyHandle ;
1820} TSSPRIVKEY ;
1921
2022ASN1_SEQUENCE (TSSPRIVKEY ) = {
2123 ASN1_SIMPLE (TSSPRIVKEY , type , ASN1_OBJECT ),
2224 ASN1_EXP_OPT (TSSPRIVKEY , emptyAuth , ASN1_BOOLEAN , 0 ),
2325 ASN1_SIMPLE (TSSPRIVKEY , parent , ASN1_INTEGER ),
2426 ASN1_SIMPLE (TSSPRIVKEY , pubkey , ASN1_OCTET_STRING ),
25- ASN1_SIMPLE (TSSPRIVKEY , privkey , ASN1_OCTET_STRING )
27+ ASN1_SIMPLE (TSSPRIVKEY , privkey , ASN1_OCTET_STRING ),
28+ ASN1_EXP_OPT (TSSPRIVKEY , privkeyType , ASN1_INTEGER , 1 ),
29+ ASN1_EXP_OPT (TSSPRIVKEY , privkeyHandle , ASN1_INTEGER , 2 ),
2630} ASN1_SEQUENCE_END (TSSPRIVKEY )
2731
2832#define OID_loadableKey "2.23.133.10.1.3"
@@ -62,10 +66,33 @@ tpm2_keydata_write(const TPM2_KEYDATA *keydata, BIO *bout, TPM2_PKEY_FORMAT form
6266 if (!tpk )
6367 return 0 ;
6468
65- if (Tss2_MU_TPM2B_PRIVATE_Marshal (& keydata -> priv , & privbuf [0 ],
66- sizeof (privbuf ), & privbuf_len ))
69+ if (tpk -> privkeyType == NULL ) {
70+ tpk -> privkeyType = ASN1_INTEGER_new ();
71+ if (tpk -> privkeyType == NULL )
72+ goto error ;
73+ };
74+ if (!ASN1_INTEGER_set_uint64 (tpk -> privkeyType , keydata -> privatetype ))
6775 goto error ;
6876
77+ switch (keydata -> privatetype ) {
78+ case KEY_TYPE_HANDLE :
79+ if (tpk -> privkeyHandle == NULL ) {
80+ tpk -> privkeyHandle = ASN1_INTEGER_new ();
81+ if (tpk -> privkeyHandle == NULL )
82+ goto error ;
83+ }
84+ if (!ASN1_INTEGER_set_uint64 (tpk -> privkeyHandle , keydata -> handle ))
85+ goto error ;
86+ break ;
87+ case KEY_TYPE_BLOB :
88+ if (Tss2_MU_TPM2B_PRIVATE_Marshal (& keydata -> priv , & privbuf [0 ],
89+ sizeof (privbuf ), & privbuf_len ))
90+ goto error ;
91+ break ;
92+ default :
93+ goto error ;
94+ }
95+
6996 if (Tss2_MU_TPM2B_PUBLIC_Marshal (& keydata -> pub , & pubbuf [0 ],
7097 sizeof (pubbuf ), & pubbuf_len ))
7198 goto error ;
@@ -131,7 +158,6 @@ tpm2_keydata_read(BIO *bin, TPM2_KEYDATA *keydata, TPM2_PKEY_FORMAT format)
131158 if (tpk == NULL )
132159 return 0 ;
133160
134- keydata -> privatetype = KEY_TYPE_BLOB ;
135161 keydata -> emptyAuth = (tpk -> emptyAuth != V_ASN1_UNDEF && tpk -> emptyAuth );
136162
137163 // the ASN1_INTEGER_get on a 32-bit machine will fail for numbers of UINT32_MAX
@@ -149,10 +175,30 @@ tpm2_keydata_read(BIO *bin, TPM2_KEYDATA *keydata, TPM2_PKEY_FORMAT format)
149175 strcmp (type_oid , OID_loadableKey ))
150176 goto error ;
151177
152- if (Tss2_MU_TPM2B_PRIVATE_Unmarshal (tpk -> privkey -> data ,
153- tpk -> privkey -> length , NULL ,
154- & keydata -> priv ))
178+ uint64_t privkeyType ;
179+ if (tpk -> privkeyType != NULL ) {
180+ if (!ASN1_INTEGER_get_uint64 (& privkeyType , tpk -> privkeyType ))
181+ goto error ;
182+ } else {
183+ privkeyType = KEY_TYPE_BLOB ;
184+ }
185+ keydata -> privatetype = privkeyType ;
186+
187+ switch (keydata -> privatetype ) {
188+ case KEY_TYPE_HANDLE :
189+ if (tpk -> privkeyType != NULL
190+ && !ASN1_INTEGER_get_uint64 ((uint64_t * )& keydata -> handle , tpk -> privkeyHandle ))
191+ goto error ;
192+ break ;
193+ case KEY_TYPE_BLOB :
194+ if (Tss2_MU_TPM2B_PRIVATE_Unmarshal (tpk -> privkey -> data ,
195+ tpk -> privkey -> length , NULL ,
196+ & keydata -> priv ))
197+ goto error ;
198+ break ;
199+ default :
155200 goto error ;
201+ }
156202
157203 if (Tss2_MU_TPM2B_PUBLIC_Unmarshal (tpk -> pubkey -> data ,
158204 tpk -> pubkey -> length , NULL ,
0 commit comments