@@ -228,8 +228,9 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
228
228
struct trusted_key_payload * payload ,
229
229
struct trusted_key_options * options )
230
230
{
231
+ off_t offset = TPM_HEADER_SIZE ;
232
+ struct tpm_buf buf , sized ;
231
233
int blob_len = 0 ;
232
- struct tpm_buf buf ;
233
234
u32 hash ;
234
235
u32 flags ;
235
236
int i ;
@@ -258,6 +259,14 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
258
259
return rc ;
259
260
}
260
261
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 );
261
270
tpm_buf_append_u32 (& buf , options -> keyhandle );
262
271
tpm2_buf_append_auth (& buf , TPM2_RS_PW ,
263
272
NULL /* nonce */ , 0 ,
@@ -266,36 +275,36 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
266
275
TPM_DIGEST_SIZE );
267
276
268
277
/* sensitive */
269
- tpm_buf_append_u16 (& buf , 4 + options -> blobauth_len + payload -> key_len );
278
+ tpm_buf_append_u16 (& sized , options -> blobauth_len );
270
279
271
- tpm_buf_append_u16 (& buf , options -> blobauth_len );
272
280
if (options -> blobauth_len )
273
- tpm_buf_append (& buf , options -> blobauth , options -> blobauth_len );
281
+ tpm_buf_append (& sized , options -> blobauth , options -> blobauth_len );
274
282
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 );
277
286
278
287
/* 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 );
282
291
283
292
/* key properties */
284
293
flags = 0 ;
285
294
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 );
289
297
290
298
/* policy */
291
- tpm_buf_append_u16 (& buf , options -> policydigest_len );
299
+ tpm_buf_append_u16 (& sized , options -> policydigest_len );
292
300
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 );
295
302
296
303
/* 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 );
299
308
300
309
/* outside info */
301
310
tpm_buf_append_u16 (& buf , 0 );
@@ -312,21 +321,20 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
312
321
if (rc )
313
322
goto out ;
314
323
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 ) {
317
326
rc = - E2BIG ;
318
327
goto out ;
319
328
}
320
- if (tpm_buf_length ( & buf ) < TPM_HEADER_SIZE + 4 + blob_len ) {
329
+ if (buf . length - offset < blob_len ) {
321
330
rc = - EFAULT ;
322
331
goto out ;
323
332
}
324
333
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 );
328
335
329
336
out :
337
+ tpm_buf_destroy (& sized );
330
338
tpm_buf_destroy (& buf );
331
339
332
340
if (rc > 0 ) {
0 commit comments