@@ -97,15 +97,30 @@ pub mod public;
97
97
pub mod sensitive;
98
98
99
99
pub mod auth {
100
- buffer_type ! ( Auth , 64 , TPM2B_AUTH ) ;
100
+ // Same size as TPM2B_DIGEST according to the specification.
101
+ use crate :: tss2_esys:: TPMU_HA ;
102
+ use std:: mem:: size_of;
103
+ const TPM2B_AUTH_BUFFER_SIZE : usize = size_of :: < TPMU_HA > ( ) ;
104
+ buffer_type ! ( Auth , TPM2B_AUTH_BUFFER_SIZE , TPM2B_AUTH ) ;
101
105
}
102
106
103
107
pub mod data {
104
- buffer_type ! ( Data , 64 , TPM2B_DATA ) ;
108
+ // This should, according to the specification, be
109
+ // size_of::<TPMT_HA>() but due to a bug in tpm2-tss
110
+ // (https://github.com/tpm2-software/tpm2-tss/issues/2888)
111
+ // it is the size of TPMU_HA
112
+ use crate :: tss2_esys:: TPMU_HA ;
113
+ use std:: mem:: size_of;
114
+ const TPM2B_DATA_BUFFER_SIZE : usize = size_of :: < TPMU_HA > ( ) ;
115
+ buffer_type ! ( Data , TPM2B_DATA_BUFFER_SIZE , TPM2B_DATA ) ;
105
116
}
106
117
107
118
pub mod digest {
108
- buffer_type ! ( Digest , 64 , TPM2B_DIGEST ) ;
119
+ use crate :: tss2_esys:: TPMU_HA ;
120
+ use std:: mem:: size_of;
121
+ const TPM2B_DIGEST_BUFFER_SIZE : usize = size_of :: < TPMU_HA > ( ) ;
122
+
123
+ buffer_type ! ( Digest , TPM2B_DIGEST_BUFFER_SIZE , TPM2B_DIGEST ) ;
109
124
110
125
// Some implementations to get from Digest to [u8; N] for common values of N (sha* primarily)
111
126
// This is used to work around the fact that Rust does not allow custom functions for general values of N in [T; N],
@@ -170,50 +185,75 @@ pub mod digest {
170
185
}
171
186
172
187
pub mod ecc_parameter {
188
+ use crate :: tss2_esys:: TPM2_MAX_ECC_KEY_BYTES ;
189
+ const TPM2B_ECC_PARAMETER_BUFFER_SIZE : usize = TPM2_MAX_ECC_KEY_BYTES as usize ;
173
190
buffer_type ! (
174
191
EccParameter ,
175
- crate :: tss2_esys :: TPM2_MAX_ECC_KEY_BYTES as usize ,
192
+ TPM2B_ECC_PARAMETER_BUFFER_SIZE ,
176
193
TPM2B_ECC_PARAMETER
177
194
) ;
178
195
}
179
196
180
197
pub mod encrypted_secret {
181
- named_field_buffer_type ! ( EncryptedSecret , 256 , TPM2B_ENCRYPTED_SECRET , secret) ;
198
+ use crate :: tss2_esys:: TPMU_ENCRYPTED_SECRET ;
199
+ use std:: mem:: size_of;
200
+ const TPM2B_ENCRYPTED_SECRET_BUFFER_SIZE : usize = size_of :: < TPMU_ENCRYPTED_SECRET > ( ) ;
201
+ named_field_buffer_type ! (
202
+ EncryptedSecret ,
203
+ TPM2B_ENCRYPTED_SECRET_BUFFER_SIZE ,
204
+ TPM2B_ENCRYPTED_SECRET ,
205
+ secret
206
+ ) ;
182
207
}
183
208
184
209
pub mod id_object {
185
- named_field_buffer_type ! ( IdObject , 256 , TPM2B_ID_OBJECT , credential) ;
210
+ use crate :: tss2_esys:: TPMS_ID_OBJECT ;
211
+ use std:: mem:: size_of;
212
+ const TPM2B_ID_OBJECT_BUFFER_SIZE : usize = size_of :: < TPMS_ID_OBJECT > ( ) ;
213
+ named_field_buffer_type ! (
214
+ IdObject ,
215
+ TPM2B_ID_OBJECT_BUFFER_SIZE ,
216
+ TPM2B_ID_OBJECT ,
217
+ credential
218
+ ) ;
186
219
}
187
220
188
221
pub mod initial_value {
189
- buffer_type ! (
190
- InitialValue ,
191
- crate :: tss2_esys:: TPM2_MAX_SYM_BLOCK_SIZE as usize ,
192
- TPM2B_IV
193
- ) ;
222
+ use crate :: tss2_esys:: TPM2_MAX_SYM_BLOCK_SIZE ;
223
+ const TPM2B_IV_BUFFER_SIZE : usize = TPM2_MAX_SYM_BLOCK_SIZE as usize ;
224
+ buffer_type ! ( InitialValue , TPM2B_IV_BUFFER_SIZE , TPM2B_IV ) ;
194
225
}
195
226
196
227
pub mod max_buffer {
197
228
use crate :: tss2_esys:: TPM2_MAX_DIGEST_BUFFER ;
198
- buffer_type ! ( MaxBuffer , TPM2_MAX_DIGEST_BUFFER as usize , TPM2B_MAX_BUFFER ) ;
229
+ const TPM2B_MAX_BUFFER_BUFFER_SIZE : usize = TPM2_MAX_DIGEST_BUFFER as usize ;
230
+ buffer_type ! ( MaxBuffer , TPM2B_MAX_BUFFER_BUFFER_SIZE , TPM2B_MAX_BUFFER ) ;
199
231
}
200
232
201
233
pub mod max_nv_buffer {
202
234
use crate :: tss2_esys:: TPM2_MAX_NV_BUFFER_SIZE ;
235
+ const TPM2B_MAX_NV_BUFFER_BUFFER_SIZE : usize = TPM2_MAX_NV_BUFFER_SIZE as usize ;
203
236
buffer_type ! (
204
237
MaxNvBuffer ,
205
- TPM2_MAX_NV_BUFFER_SIZE as usize ,
238
+ TPM2B_MAX_NV_BUFFER_BUFFER_SIZE ,
206
239
TPM2B_MAX_NV_BUFFER
207
240
) ;
208
241
}
209
242
210
243
pub mod nonce {
211
- buffer_type ! ( Nonce , 64 , TPM2B_NONCE ) ;
244
+ // Same size as TPM2B_DIGEST according to the specification.
245
+ use crate :: tss2_esys:: TPMU_HA ;
246
+ use std:: mem:: size_of;
247
+ const TPM2B_NONCE_BUFFER_SIZE : usize = size_of :: < TPMU_HA > ( ) ;
248
+
249
+ buffer_type ! ( Nonce , TPM2B_NONCE_BUFFER_SIZE , TPM2B_NONCE ) ;
212
250
}
213
251
214
252
pub mod private {
253
+ use std:: mem:: size_of;
215
254
use tss_esapi_sys:: _PRIVATE;
216
- buffer_type ! ( Private , :: std:: mem:: size_of:: <_PRIVATE>( ) , TPM2B_PRIVATE ) ;
255
+ const TPM2B_PRIVATE_BUFFER_SIZE : usize = size_of :: < _PRIVATE > ( ) ;
256
+ buffer_type ! ( Private , TPM2B_PRIVATE_BUFFER_SIZE , TPM2B_PRIVATE ) ;
217
257
}
218
258
219
259
pub mod private_key_rsa {
@@ -224,31 +264,34 @@ pub mod private_key_rsa {
224
264
// ((MAX_RSA_KEY_BYTES * 5) ./ 2. The larger size would only apply to keys that have fixedTPM parents.
225
265
// The larger size was added in revision 01.53."
226
266
// The TSS stack we use only accepts the smaller of the two sizes described above (for now).
267
+ const TPM2B_PRIVATE_KEY_RSA_BUFFER_SIZE : usize = ( TPM2_MAX_RSA_KEY_BYTES as usize ) / 2 ;
227
268
buffer_type ! (
228
269
PrivateKeyRsa ,
229
- ( TPM2_MAX_RSA_KEY_BYTES / 2 ) as usize ,
270
+ TPM2B_PRIVATE_KEY_RSA_BUFFER_SIZE ,
230
271
TPM2B_PRIVATE_KEY_RSA
231
272
) ;
232
273
}
233
274
234
275
pub mod private_vendor_specific {
235
276
use crate :: tss2_esys:: TPM2_PRIVATE_VENDOR_SPECIFIC_BYTES ;
236
-
277
+ const TPM2B_PRIVATE_VENDOR_SPECIFIC_BUFFER_SIZE : usize =
278
+ TPM2_PRIVATE_VENDOR_SPECIFIC_BYTES as usize ;
237
279
// The spec states the maximum size as:
238
280
// "The value for PRIVATE_VENDOR_SPECIFIC_BYTES is determined by the vendor."
239
281
// Not very helpful, but the TSS exposes a generic value that we can use.
240
282
buffer_type ! (
241
283
PrivateVendorSpecific ,
242
- TPM2_PRIVATE_VENDOR_SPECIFIC_BYTES as usize ,
284
+ TPM2B_PRIVATE_VENDOR_SPECIFIC_BUFFER_SIZE ,
243
285
TPM2B_PRIVATE_VENDOR_SPECIFIC
244
286
) ;
245
287
}
246
288
247
289
pub mod public_key_rsa {
248
290
use crate :: { interface_types:: key_bits:: RsaKeyBits , tss2_esys:: TPM2_MAX_RSA_KEY_BYTES } ;
291
+ const TPM2B_PUBLIC_KEY_RSA_BUFFER_SIZE : usize = TPM2_MAX_RSA_KEY_BYTES as usize ;
249
292
buffer_type ! (
250
293
PublicKeyRsa ,
251
- TPM2_MAX_RSA_KEY_BYTES as usize ,
294
+ TPM2B_PUBLIC_KEY_RSA_BUFFER_SIZE ,
252
295
TPM2B_PUBLIC_KEY_RSA
253
296
) ;
254
297
@@ -321,22 +364,31 @@ pub mod public_key_rsa {
321
364
}
322
365
323
366
pub mod sensitive_data {
367
+ // This should be size_of::<TPMU_SENSITIVE_CREATE>(), but this not available
368
+ // in old versions of tpm2-tss so the size calculated from sized buffer instead.
369
+ use crate :: tss2_esys:: UINT16 ;
370
+ use std:: mem:: size_of;
371
+ const TPM2B_SENSITIVE_DATA_BUFFER_SIZE : usize =
372
+ size_of :: < TPM2B_SENSITIVE_DATA > ( ) - size_of :: < UINT16 > ( ) ;
324
373
buffer_type ! (
325
374
SensitiveData ,
326
- :: std :: mem :: size_of :: < TPM2B_SENSITIVE_DATA > ( ) ,
375
+ TPM2B_SENSITIVE_DATA_BUFFER_SIZE ,
327
376
TPM2B_SENSITIVE_DATA
328
377
) ;
329
378
}
330
379
331
380
pub mod symmetric_key {
332
381
use crate :: tss2_esys:: TPM2_MAX_SYM_KEY_BYTES ;
333
-
382
+ const TPM2B_SYM_KEY_BUFFER_SIZE : usize = TPM2_MAX_SYM_KEY_BYTES as usize ;
334
383
// The spec states the maximum size as:
335
384
// "MAX_SYM_KEY_BYTES will be the larger of the largest symmetric key supported by the TPM and the
336
385
// largest digest produced by any hashing algorithm implemented on the TPM"
337
- buffer_type ! ( SymmetricKey , TPM2_MAX_SYM_KEY_BYTES as usize , TPM2B_SYM_KEY ) ;
386
+ buffer_type ! ( SymmetricKey , TPM2B_SYM_KEY_BUFFER_SIZE , TPM2B_SYM_KEY ) ;
338
387
}
339
388
340
389
pub mod timeout {
341
- buffer_type ! ( Timeout , 8 , TPM2B_TIMEOUT ) ;
390
+ use crate :: tss2_esys:: UINT64 ;
391
+ use std:: mem:: size_of;
392
+ const TPM2B_TIMEOUT_BUFFER_SIZE : usize = size_of :: < UINT64 > ( ) ;
393
+ buffer_type ! ( Timeout , TPM2B_TIMEOUT_BUFFER_SIZE , TPM2B_TIMEOUT ) ;
342
394
}
0 commit comments