@@ -54,10 +54,13 @@ use utils::{Signature, TpmaSession, TpmsContext};
54
54
#[ macro_use]
55
55
macro_rules! wrap_buffer {
56
56
( $buf: expr, $buf_type: ty, $buf_size: expr) => { {
57
+ if $buf. len( ) > $buf_size {
58
+ return Err ( Error :: local_error( ErrorKind :: WrongParamSize ) ) ;
59
+ }
57
60
let mut buffer = [ 0u8 ; $buf_size] ;
58
61
buffer[ ..$buf. len( ) ] . clone_from_slice( & $buf[ ..$buf. len( ) ] ) ;
59
62
let mut buf_struct: $buf_type = Default :: default ( ) ;
60
- buf_struct. size = $buf. len( ) . try_into( ) . unwrap( ) ;
63
+ buf_struct. size = $buf. len( ) . try_into( ) . unwrap( ) ; // should not fail since the length is checked above
61
64
buf_struct. buffer = buffer;
62
65
buf_struct
63
66
} } ;
@@ -115,7 +118,7 @@ impl Context {
115
118
let ret = unsafe {
116
119
tss2_esys:: Esys_Initialize (
117
120
& mut esys_context,
118
- tcti_context. as_mut ( ) . unwrap ( ) . as_mut_ptr ( ) ,
121
+ tcti_context. as_mut ( ) . unwrap ( ) . as_mut_ptr ( ) , // will not panic as per how tcti_context is initialised
119
122
null_mut ( ) ,
120
123
)
121
124
} ;
@@ -162,10 +165,6 @@ impl Context {
162
165
symmetric : TPMT_SYM_DEF ,
163
166
auth_hash : TPMI_ALG_HASH ,
164
167
) -> Result < ESYS_TR > {
165
- if nonce. len ( ) > 64 {
166
- return Err ( Error :: local_error ( ErrorKind :: WrongParamSize ) ) ;
167
- }
168
-
169
168
let nonce_caller = wrap_buffer ! ( nonce, TPM2B_NONCE , 64 ) ;
170
169
let mut sess = ESYS_TR_NONE ;
171
170
@@ -218,30 +217,26 @@ impl Context {
218
217
outside_info : & [ u8 ] ,
219
218
creation_pcrs : & [ TPMS_PCR_SELECTION ] ,
220
219
) -> Result < ESYS_TR > {
221
- if auth_value. len ( ) > 64
222
- || initial_data. len ( ) > 256
223
- || outside_info. len ( ) > 64
224
- || creation_pcrs. len ( ) > 16
225
- {
226
- return Err ( Error :: local_error ( ErrorKind :: WrongParamSize ) ) ;
227
- }
228
-
229
220
let sensitive_create = TPM2B_SENSITIVE_CREATE {
230
221
size : std:: mem:: size_of :: < TPMS_SENSITIVE_CREATE > ( )
231
222
. try_into ( )
232
- . unwrap ( ) ,
223
+ . unwrap ( ) , // will not fail on targets of at least 16 bits
233
224
sensitive : TPMS_SENSITIVE_CREATE {
234
225
userAuth : wrap_buffer ! ( auth_value, TPM2B_AUTH , 64 ) ,
235
226
data : wrap_buffer ! ( initial_data, TPM2B_SENSITIVE_DATA , 256 ) ,
236
227
} ,
237
228
} ;
238
-
239
229
let outside_info = wrap_buffer ! ( outside_info, TPM2B_DATA , 64 ) ;
230
+
231
+ if creation_pcrs. len ( ) > 16 {
232
+ return Err ( Error :: local_error ( ErrorKind :: WrongParamSize ) ) ;
233
+ }
234
+
240
235
let mut creation_pcrs_buffer = [ Default :: default ( ) ; 16 ] ;
241
236
creation_pcrs_buffer[ ..creation_pcrs. len ( ) ]
242
237
. clone_from_slice ( & creation_pcrs[ ..creation_pcrs. len ( ) ] ) ;
243
238
let creation_pcrs = TPML_PCR_SELECTION {
244
- count : creation_pcrs. len ( ) . try_into ( ) . unwrap ( ) ,
239
+ count : creation_pcrs. len ( ) . try_into ( ) . unwrap ( ) , // will not fail given the len checks above
245
240
pcrSelections : creation_pcrs_buffer,
246
241
} ;
247
242
@@ -297,18 +292,10 @@ impl Context {
297
292
outside_info : & [ u8 ] ,
298
293
creation_pcrs : & [ TPMS_PCR_SELECTION ] ,
299
294
) -> Result < ( TPM2B_PRIVATE , TPM2B_PUBLIC ) > {
300
- if auth_value. len ( ) > 64
301
- || initial_data. len ( ) > 256
302
- || outside_info. len ( ) > 64
303
- || creation_pcrs. len ( ) > 16
304
- {
305
- return Err ( Error :: local_error ( ErrorKind :: WrongParamSize ) ) ;
306
- }
307
-
308
295
let sensitive_create = TPM2B_SENSITIVE_CREATE {
309
296
size : std:: mem:: size_of :: < TPMS_SENSITIVE_CREATE > ( )
310
297
. try_into ( )
311
- . unwrap ( ) ,
298
+ . unwrap ( ) , // will not fail on targets of at least 16 bits
312
299
sensitive : TPMS_SENSITIVE_CREATE {
313
300
userAuth : wrap_buffer ! ( auth_value, TPM2B_AUTH , 64 ) ,
314
301
data : wrap_buffer ! ( initial_data, TPM2B_SENSITIVE_DATA , 256 ) ,
@@ -317,11 +304,14 @@ impl Context {
317
304
318
305
let outside_info = wrap_buffer ! ( outside_info, TPM2B_DATA , 64 ) ;
319
306
307
+ if creation_pcrs. len ( ) > 16 {
308
+ return Err ( Error :: local_error ( ErrorKind :: WrongParamSize ) ) ;
309
+ }
320
310
let mut creation_pcrs_buffer = [ Default :: default ( ) ; 16 ] ;
321
311
creation_pcrs_buffer[ ..creation_pcrs. len ( ) ]
322
312
. clone_from_slice ( & creation_pcrs[ ..creation_pcrs. len ( ) ] ) ;
323
313
let creation_pcrs = TPML_PCR_SELECTION {
324
- count : creation_pcrs. len ( ) . try_into ( ) . unwrap ( ) ,
314
+ count : creation_pcrs. len ( ) . try_into ( ) . unwrap ( ) , // will not fail given the len checks above
325
315
pcrSelections : creation_pcrs_buffer,
326
316
} ;
327
317
@@ -403,9 +393,6 @@ impl Context {
403
393
scheme : TPMT_SIG_SCHEME ,
404
394
validation : & TPMT_TK_HASHCHECK ,
405
395
) -> Result < Signature > {
406
- if digest. len ( ) > 64 {
407
- return Err ( Error :: local_error ( ErrorKind :: WrongParamSize ) ) ;
408
- }
409
396
let mut signature = null_mut ( ) ;
410
397
let digest = wrap_buffer ! ( digest, TPM2B_DIGEST , 64 ) ;
411
398
let ret = unsafe {
@@ -438,9 +425,6 @@ impl Context {
438
425
digest : & [ u8 ] ,
439
426
signature : & TPMT_SIGNATURE ,
440
427
) -> Result < TPMT_TK_VERIFIED > {
441
- if digest. len ( ) > 64 {
442
- return Err ( Error :: local_error ( ErrorKind :: WrongParamSize ) ) ;
443
- }
444
428
let mut validation = null_mut ( ) ;
445
429
let digest = wrap_buffer ! ( digest, TPM2B_DIGEST , 64 ) ;
446
430
let ret = unsafe {
@@ -577,7 +561,7 @@ impl Context {
577
561
let ret = Error :: from_tss_rc ( ret) ;
578
562
if ret. is_success ( ) {
579
563
let context = unsafe { MBox :: < TPMS_CONTEXT > :: from_raw ( context) } ;
580
- Ok ( ( * context) . into ( ) )
564
+ Ok ( ( * context) . try_into ( ) ? )
581
565
} else {
582
566
error ! ( "Error in saving context: {}." , ret) ;
583
567
Err ( ret)
@@ -612,7 +596,9 @@ impl Context {
612
596
self . sessions . 0 ,
613
597
self . sessions . 1 ,
614
598
self . sessions . 2 ,
615
- num_bytes. try_into ( ) . unwrap ( ) ,
599
+ num_bytes
600
+ . try_into ( )
601
+ . or_else ( |_| Err ( Error :: local_error ( ErrorKind :: WrongParamSize ) ) ) ?,
616
602
& mut buffer,
617
603
)
618
604
} ;
@@ -621,7 +607,7 @@ impl Context {
621
607
if ret. is_success ( ) {
622
608
let buffer = unsafe { MBox :: from_raw ( buffer) } ;
623
609
let mut random = buffer. buffer . to_vec ( ) ;
624
- random. truncate ( buffer. size . try_into ( ) . unwrap ( ) ) ;
610
+ random. truncate ( buffer. size . try_into ( ) . unwrap ( ) ) ; // should not panic given the TryInto above
625
611
Ok ( random)
626
612
} else {
627
613
error ! ( "Error in flushing context: {}." , ret) ;
@@ -630,10 +616,6 @@ impl Context {
630
616
}
631
617
632
618
pub fn set_handle_auth ( & mut self , handle : ESYS_TR , auth_value : & [ u8 ] ) -> Result < ( ) > {
633
- if auth_value. len ( ) > 64 {
634
- return Err ( Error :: local_error ( ErrorKind :: WrongParamSize ) ) ;
635
- }
636
-
637
619
let auth = wrap_buffer ! ( auth_value, TPM2B_AUTH , 64 ) ;
638
620
let ret = unsafe { Esys_TR_SetAuth ( self . mut_context ( ) , handle, & auth) } ;
639
621
let ret = Error :: from_tss_rc ( ret) ;
@@ -657,7 +639,7 @@ impl Context {
657
639
}
658
640
659
641
fn mut_context ( & mut self ) -> * mut ESYS_CONTEXT {
660
- self . esys_context . as_mut ( ) . unwrap ( ) . as_mut_ptr ( )
642
+ self . esys_context . as_mut ( ) . unwrap ( ) . as_mut_ptr ( ) // will only fail if called from Drop after .take()
661
643
}
662
644
}
663
645
@@ -673,8 +655,8 @@ impl Drop for Context {
673
655
}
674
656
} ) ;
675
657
676
- let esys_context = self . esys_context . take ( ) . unwrap ( ) ;
677
- let tcti_context = self . tcti_context . take ( ) . unwrap ( ) ;
658
+ let esys_context = self . esys_context . take ( ) . unwrap ( ) ; // should not fail based on how the context is initialised/used
659
+ let tcti_context = self . tcti_context . take ( ) . unwrap ( ) ; // should not fail based on how the context is initialised/used
678
660
679
661
// Close the TCTI context.
680
662
unsafe {
0 commit comments