@@ -103,15 +103,30 @@ pub mod sensitive;
103
103
pub mod sensitive_create;
104
104
105
105
pub mod auth {
106
- buffer_type ! ( Auth , 64 , TPM2B_AUTH ) ;
106
+ // Same size as TPM2B_DIGEST according to the specification.
107
+ use crate :: tss2_esys:: TPMU_HA ;
108
+ use std:: mem:: size_of;
109
+ const TPM2B_AUTH_BUFFER_SIZE : usize = size_of :: < TPMU_HA > ( ) ;
110
+ buffer_type ! ( Auth , TPM2B_AUTH_BUFFER_SIZE , TPM2B_AUTH ) ;
107
111
}
108
112
109
113
pub mod data {
110
- buffer_type ! ( Data , 64 , TPM2B_DATA ) ;
114
+ // This should, according to the specification, be
115
+ // size_of::<TPMT_HA>() but due to a bug in tpm2-tss
116
+ // (https://github.com/tpm2-software/tpm2-tss/issues/2888)
117
+ // it is the size of TPMU_HA
118
+ use crate :: tss2_esys:: TPMU_HA ;
119
+ use std:: mem:: size_of;
120
+ const TPM2B_DATA_BUFFER_SIZE : usize = size_of :: < TPMU_HA > ( ) ;
121
+ buffer_type ! ( Data , TPM2B_DATA_BUFFER_SIZE , TPM2B_DATA ) ;
111
122
}
112
123
113
124
pub mod digest {
114
- buffer_type ! ( Digest , 64 , TPM2B_DIGEST ) ;
125
+ use crate :: tss2_esys:: TPMU_HA ;
126
+ use std:: mem:: size_of;
127
+ const TPM2B_DIGEST_BUFFER_SIZE : usize = size_of :: < TPMU_HA > ( ) ;
128
+
129
+ buffer_type ! ( Digest , TPM2B_DIGEST_BUFFER_SIZE , TPM2B_DIGEST ) ;
115
130
116
131
// Some implementations to get from Digest to [u8; N] for common values of N (sha* primarily)
117
132
// This is used to work around the fact that Rust does not allow custom functions for general values of N in [T; N],
@@ -208,80 +223,101 @@ pub mod digest {
208
223
}
209
224
210
225
pub mod ecc_parameter {
226
+ use crate :: tss2_esys:: TPM2_MAX_ECC_KEY_BYTES ;
227
+ const TPM2B_ECC_PARAMETER_BUFFER_SIZE : usize = TPM2_MAX_ECC_KEY_BYTES as usize ;
211
228
buffer_type ! (
212
229
EccParameter ,
213
- crate :: tss2_esys :: TPM2_MAX_ECC_KEY_BYTES as usize ,
230
+ TPM2B_ECC_PARAMETER_BUFFER_SIZE ,
214
231
TPM2B_ECC_PARAMETER
215
232
) ;
216
233
}
217
234
218
235
pub mod encrypted_secret {
219
- named_field_buffer_type ! ( EncryptedSecret , 256 , TPM2B_ENCRYPTED_SECRET , secret) ;
236
+ use crate :: tss2_esys:: TPMU_ENCRYPTED_SECRET ;
237
+ use std:: mem:: size_of;
238
+ const TPM2B_ENCRYPTED_SECRET_BUFFER_SIZE : usize = size_of :: < TPMU_ENCRYPTED_SECRET > ( ) ;
239
+ named_field_buffer_type ! (
240
+ EncryptedSecret ,
241
+ TPM2B_ENCRYPTED_SECRET_BUFFER_SIZE ,
242
+ TPM2B_ENCRYPTED_SECRET ,
243
+ secret
244
+ ) ;
220
245
}
221
246
222
247
pub mod id_object {
223
- named_field_buffer_type ! ( IdObject , 256 , TPM2B_ID_OBJECT , credential) ;
248
+ use crate :: tss2_esys:: TPMS_ID_OBJECT ;
249
+ use std:: mem:: size_of;
250
+ const TPM2B_ID_OBJECT_BUFFER_SIZE : usize = size_of :: < TPMS_ID_OBJECT > ( ) ;
251
+ named_field_buffer_type ! (
252
+ IdObject ,
253
+ TPM2B_ID_OBJECT_BUFFER_SIZE ,
254
+ TPM2B_ID_OBJECT ,
255
+ credential
256
+ ) ;
224
257
}
225
258
226
259
pub mod initial_value {
227
- buffer_type ! (
228
- InitialValue ,
229
- crate :: tss2_esys:: TPM2_MAX_SYM_BLOCK_SIZE as usize ,
230
- TPM2B_IV
231
- ) ;
260
+ use crate :: tss2_esys:: TPM2_MAX_SYM_BLOCK_SIZE ;
261
+ const TPM2B_IV_BUFFER_SIZE : usize = TPM2_MAX_SYM_BLOCK_SIZE as usize ;
262
+ buffer_type ! ( InitialValue , TPM2B_IV_BUFFER_SIZE , TPM2B_IV ) ;
232
263
}
233
264
234
265
pub mod max_buffer {
235
266
use crate :: tss2_esys:: TPM2_MAX_DIGEST_BUFFER ;
236
- buffer_type ! ( MaxBuffer , TPM2_MAX_DIGEST_BUFFER as usize , TPM2B_MAX_BUFFER ) ;
267
+ const TPM2B_MAX_BUFFER_BUFFER_SIZE : usize = TPM2_MAX_DIGEST_BUFFER as usize ;
268
+ buffer_type ! ( MaxBuffer , TPM2B_MAX_BUFFER_BUFFER_SIZE , TPM2B_MAX_BUFFER ) ;
237
269
}
238
270
239
271
pub mod max_nv_buffer {
240
272
use crate :: tss2_esys:: TPM2_MAX_NV_BUFFER_SIZE ;
273
+ const TPM2B_MAX_NV_BUFFER_BUFFER_SIZE : usize = TPM2_MAX_NV_BUFFER_SIZE as usize ;
241
274
buffer_type ! (
242
275
MaxNvBuffer ,
243
- TPM2_MAX_NV_BUFFER_SIZE as usize ,
276
+ TPM2B_MAX_NV_BUFFER_BUFFER_SIZE ,
244
277
TPM2B_MAX_NV_BUFFER
245
278
) ;
246
279
}
247
280
248
281
pub mod nonce {
249
- buffer_type ! ( Nonce , 64 , TPM2B_NONCE ) ;
282
+ // Same size as TPM2B_DIGEST according to the specification.
283
+ use crate :: tss2_esys:: TPMU_HA ;
284
+ use std:: mem:: size_of;
285
+ const TPM2B_NONCE_BUFFER_SIZE : usize = size_of :: < TPMU_HA > ( ) ;
286
+
287
+ buffer_type ! ( Nonce , TPM2B_NONCE_BUFFER_SIZE , TPM2B_NONCE ) ;
250
288
}
251
289
252
290
pub mod private_key_rsa {
253
291
use crate :: tss2_esys:: TPM2_MAX_RSA_KEY_BYTES ;
292
+ const TPM2B_PRIVATE_KEY_RSA_BUFFER_SIZE : usize = ( TPM2_MAX_RSA_KEY_BYTES as usize ) * 5 / 2 ;
254
293
255
- // The maximum size is given in the spec as:
256
- // "RSA_PRIVATE_SIZE is a vendor specific value that can be (MAX_RSA_KEY_BYTES / 2) or
257
- // ((MAX_RSA_KEY_BYTES * 5) ./ 2. The larger size would only apply to keys that have fixedTPM parents.
258
- // The larger size was added in revision 01.53."
259
- // The TSS stack we use only accepts the smaller of the two sizes described above (for now).
260
294
buffer_type ! (
261
295
PrivateKeyRsa ,
262
- ( TPM2_MAX_RSA_KEY_BYTES / 2 ) as usize ,
296
+ TPM2B_PRIVATE_KEY_RSA_BUFFER_SIZE ,
263
297
TPM2B_PRIVATE_KEY_RSA
264
298
) ;
265
299
}
266
300
267
301
pub mod private_vendor_specific {
268
302
use crate :: tss2_esys:: TPM2_PRIVATE_VENDOR_SPECIFIC_BYTES ;
269
-
303
+ const TPM2B_PRIVATE_VENDOR_SPECIFIC_BUFFER_SIZE : usize =
304
+ TPM2_PRIVATE_VENDOR_SPECIFIC_BYTES as usize ;
270
305
// The spec states the maximum size as:
271
306
// "The value for PRIVATE_VENDOR_SPECIFIC_BYTES is determined by the vendor."
272
307
// Not very helpful, but the TSS exposes a generic value that we can use.
273
308
buffer_type ! (
274
309
PrivateVendorSpecific ,
275
- TPM2_PRIVATE_VENDOR_SPECIFIC_BYTES as usize ,
310
+ TPM2B_PRIVATE_VENDOR_SPECIFIC_BUFFER_SIZE ,
276
311
TPM2B_PRIVATE_VENDOR_SPECIFIC
277
312
) ;
278
313
}
279
314
280
315
pub mod public_key_rsa {
281
316
use crate :: { interface_types:: key_bits:: RsaKeyBits , tss2_esys:: TPM2_MAX_RSA_KEY_BYTES } ;
317
+ const TPM2B_PUBLIC_KEY_RSA_BUFFER_SIZE : usize = TPM2_MAX_RSA_KEY_BYTES as usize ;
282
318
buffer_type ! (
283
319
PublicKeyRsa ,
284
- TPM2_MAX_RSA_KEY_BYTES as usize ,
320
+ TPM2B_PUBLIC_KEY_RSA_BUFFER_SIZE ,
285
321
TPM2B_PUBLIC_KEY_RSA
286
322
) ;
287
323
@@ -359,45 +395,47 @@ pub mod sensitive_data {
359
395
// versions of tpm2-tss supported by the crate so the fall back is to
360
396
// calculate the max size by removing the size of the size parameter(UINT16)
361
397
// from the total size of the buffer type.
398
+ use std:: mem:: size_of;
362
399
cfg_if:: cfg_if! {
363
400
if #[ cfg( has_tpmu_sensitive_create) ] {
364
401
use crate :: tss2_esys:: TPMU_SENSITIVE_CREATE ;
365
- #[ allow( unused_qualifications) ]
366
- const TPMU_SENSITIVE_CREATE_MEM_SIZE : usize = std:: mem:: size_of:: <TPMU_SENSITIVE_CREATE >( ) ;
402
+ const TPM2B_SENSITIVE_DATA_BUFFER_SIZE : usize = size_of:: <TPMU_SENSITIVE_CREATE >( ) ;
367
403
} else {
368
404
use crate :: tss2_esys:: UINT16 ;
369
- #[ allow( unused_qualifications) ]
370
- const TPMU_SENSITIVE_CREATE_MEM_SIZE : usize = std:: mem:: size_of:: <TPM2B_SENSITIVE_DATA >( ) - std:: mem:: size_of:: <UINT16 >( ) ;
405
+ const TPM2B_SENSITIVE_DATA_BUFFER_SIZE : usize = size_of:: <TPM2B_SENSITIVE_DATA >( ) - size_of:: <UINT16 >( ) ;
371
406
}
372
407
}
373
408
buffer_type ! (
374
409
SensitiveData ,
375
- TPMU_SENSITIVE_CREATE_MEM_SIZE ,
410
+ TPM2B_SENSITIVE_DATA_BUFFER_SIZE ,
376
411
TPM2B_SENSITIVE_DATA
377
412
) ;
378
413
}
379
414
380
415
pub mod symmetric_key {
381
416
use crate :: tss2_esys:: TPM2_MAX_SYM_KEY_BYTES ;
382
-
417
+ const TPM2B_SYM_KEY_BUFFER_SIZE : usize = TPM2_MAX_SYM_KEY_BYTES as usize ;
383
418
// The spec states the maximum size as:
384
419
// "MAX_SYM_KEY_BYTES will be the larger of the largest symmetric key supported by the TPM and the
385
420
// largest digest produced by any hashing algorithm implemented on the TPM"
386
- buffer_type ! ( SymmetricKey , TPM2_MAX_SYM_KEY_BYTES as usize , TPM2B_SYM_KEY ) ;
421
+ buffer_type ! ( SymmetricKey , TPM2B_SYM_KEY_BUFFER_SIZE , TPM2B_SYM_KEY ) ;
387
422
}
388
423
389
424
pub mod timeout {
390
- buffer_type ! ( Timeout , 8 , TPM2B_TIMEOUT ) ;
425
+ use crate :: tss2_esys:: UINT64 ;
426
+ use std:: mem:: size_of;
427
+ const TPM2B_TIMEOUT_BUFFER_SIZE : usize = size_of :: < UINT64 > ( ) ;
428
+ buffer_type ! ( Timeout , TPM2B_TIMEOUT_BUFFER_SIZE , TPM2B_TIMEOUT ) ;
391
429
}
392
430
393
431
pub mod tpm_context_data {
394
432
use crate :: tss2_esys:: TPMS_CONTEXT_DATA ;
433
+ use std:: mem:: size_of;
395
434
396
- #[ allow( unused_qualifications) ]
397
- const TPMS_CONTEXT_DATA_MEM_SIZE : usize = std:: mem:: size_of :: < TPMS_CONTEXT_DATA > ( ) ;
435
+ const TPM2B_CONTEXT_DATA_BUFFER_SIZE : usize = size_of :: < TPMS_CONTEXT_DATA > ( ) ;
398
436
buffer_type ! (
399
437
TpmContextData ,
400
- TPMS_CONTEXT_DATA_MEM_SIZE ,
438
+ TPM2B_CONTEXT_DATA_BUFFER_SIZE ,
401
439
TPM2B_CONTEXT_DATA
402
440
) ;
403
441
}
0 commit comments