@@ -228,8 +228,9 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
228228 struct trusted_key_payload * payload ,
229229 struct trusted_key_options * options )
230230{
231+ off_t offset = TPM_HEADER_SIZE ;
232+ struct tpm_buf buf , sized ;
231233 int blob_len = 0 ;
232- struct tpm_buf buf ;
233234 u32 hash ;
234235 u32 flags ;
235236 int i ;
@@ -258,6 +259,14 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
258259 return rc ;
259260 }
260261
262+ rc = tpm_buf_init_sized (& sized );
263+ if (rc ) {
264+ tpm_buf_destroy (& buf );
265+ tpm_put_ops (chip );
266+ return rc ;
267+ }
268+
269+ tpm_buf_reset (& buf , TPM2_ST_SESSIONS , TPM2_CC_CREATE );
261270 tpm_buf_append_u32 (& buf , options -> keyhandle );
262271 tpm2_buf_append_auth (& buf , TPM2_RS_PW ,
263272 NULL /* nonce */ , 0 ,
@@ -266,36 +275,36 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
266275 TPM_DIGEST_SIZE );
267276
268277 /* sensitive */
269- tpm_buf_append_u16 (& buf , 4 + options -> blobauth_len + payload -> key_len );
278+ tpm_buf_append_u16 (& sized , options -> blobauth_len );
270279
271- tpm_buf_append_u16 (& buf , options -> blobauth_len );
272280 if (options -> blobauth_len )
273- tpm_buf_append (& buf , options -> blobauth , options -> blobauth_len );
281+ tpm_buf_append (& sized , options -> blobauth , options -> blobauth_len );
274282
275- tpm_buf_append_u16 (& buf , payload -> key_len );
276- tpm_buf_append (& buf , payload -> key , payload -> key_len );
283+ tpm_buf_append_u16 (& sized , payload -> key_len );
284+ tpm_buf_append (& sized , payload -> key , payload -> key_len );
285+ tpm_buf_append (& buf , sized .data , sized .length );
277286
278287 /* public */
279- tpm_buf_append_u16 ( & buf , 14 + options -> policydigest_len );
280- tpm_buf_append_u16 (& buf , TPM_ALG_KEYEDHASH );
281- tpm_buf_append_u16 (& buf , hash );
288+ tpm_buf_reset_sized ( & sized );
289+ tpm_buf_append_u16 (& sized , TPM_ALG_KEYEDHASH );
290+ tpm_buf_append_u16 (& sized , hash );
282291
283292 /* key properties */
284293 flags = 0 ;
285294 flags |= options -> policydigest_len ? 0 : TPM2_OA_USER_WITH_AUTH ;
286- flags |= payload -> migratable ? 0 : (TPM2_OA_FIXED_TPM |
287- TPM2_OA_FIXED_PARENT );
288- tpm_buf_append_u32 (& buf , flags );
295+ flags |= payload -> migratable ? 0 : (TPM2_OA_FIXED_TPM | TPM2_OA_FIXED_PARENT );
296+ tpm_buf_append_u32 (& sized , flags );
289297
290298 /* policy */
291- tpm_buf_append_u16 (& buf , options -> policydigest_len );
299+ tpm_buf_append_u16 (& sized , options -> policydigest_len );
292300 if (options -> policydigest_len )
293- tpm_buf_append (& buf , options -> policydigest ,
294- options -> policydigest_len );
301+ tpm_buf_append (& sized , options -> policydigest , options -> policydigest_len );
295302
296303 /* public parameters */
297- tpm_buf_append_u16 (& buf , TPM_ALG_NULL );
298- tpm_buf_append_u16 (& buf , 0 );
304+ tpm_buf_append_u16 (& sized , TPM_ALG_NULL );
305+ tpm_buf_append_u16 (& sized , 0 );
306+
307+ tpm_buf_append (& buf , sized .data , sized .length );
299308
300309 /* outside info */
301310 tpm_buf_append_u16 (& buf , 0 );
@@ -312,21 +321,20 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
312321 if (rc )
313322 goto out ;
314323
315- blob_len = be32_to_cpup (( __be32 * ) & buf . data [ TPM_HEADER_SIZE ] );
316- if (blob_len > MAX_BLOB_SIZE ) {
324+ blob_len = tpm_buf_read_u32 ( & buf , & offset );
325+ if (blob_len > MAX_BLOB_SIZE || buf . flags & TPM_BUF_BOUNDARY_ERROR ) {
317326 rc = - E2BIG ;
318327 goto out ;
319328 }
320- if (tpm_buf_length ( & buf ) < TPM_HEADER_SIZE + 4 + blob_len ) {
329+ if (buf . length - offset < blob_len ) {
321330 rc = - EFAULT ;
322331 goto out ;
323332 }
324333
325- blob_len = tpm2_key_encode (payload , options ,
326- & buf .data [TPM_HEADER_SIZE + 4 ],
327- blob_len );
334+ blob_len = tpm2_key_encode (payload , options , & buf .data [offset ], blob_len );
328335
329336out :
337+ tpm_buf_destroy (& sized );
330338 tpm_buf_destroy (& buf );
331339
332340 if (rc > 0 ) {
0 commit comments