@@ -22,7 +22,6 @@ use openssl::error::ErrorStack;
22
22
use openssl:: hash:: { Hasher , MessageDigest } ;
23
23
use openssl:: nid:: Nid ;
24
24
use serde:: Deserialize ;
25
- use std:: fs;
26
25
27
26
const CBOR_TAG : u64 = 399 ;
28
27
const PLATFORM_LABEL : i128 = 44234 ;
@@ -467,10 +466,14 @@ impl Evidence {
467
466
468
467
match self . check_binding ( ) {
469
468
Err ( _) => {
470
- /* swallow error */
471
469
return Ok ( ( ) ) ;
472
470
}
473
- _ => { /* we are done */ }
471
+ _ => {
472
+ // early return on binder errors
473
+ if self . realm_tvec . instance_identity . get ( ) == CRYPTO_VALIDATION_FAILED {
474
+ return Ok ( ( ) ) ;
475
+ }
476
+ }
474
477
}
475
478
476
479
self . realm_tvec . instance_identity . set ( TRUSTWORTHY_INSTANCE ) ;
@@ -487,6 +490,10 @@ impl Evidence {
487
490
assert ! ( !self . realm. bytes. is_empty( ) , "Realm Token is Mandatory" ) ;
488
491
self . verify_realm_token ( ) ?;
489
492
self . check_binding ( ) ?;
493
+ // early return on binder errors
494
+ if self . realm_tvec . instance_identity . get ( ) == CRYPTO_VALIDATION_FAILED {
495
+ return Ok ( ( ) ) ;
496
+ }
490
497
self . realm_tvec . instance_identity . set ( TRUSTWORTHY_INSTANCE ) ;
491
498
Ok ( ( ) )
492
499
}
@@ -521,13 +528,17 @@ impl Evidence {
521
528
522
529
let mut hasher = hasher_from_alg ( realm_pub_key_hash_alg. as_str ( ) ) ?;
523
530
524
- hasher
525
- . update ( & realm_pub_key)
526
- . map_err ( |e| Error :: HashCalculateFail ( format ! ( "{e:?}" ) ) ) ?;
531
+ hasher. update ( & realm_pub_key) . map_err ( |e| {
532
+ self . realm_tvec . set_all ( VERIFIER_MALFUNCTION ) ;
533
+
534
+ Error :: HashCalculateFail ( format ! ( "{e:?}" ) )
535
+ } ) ?;
527
536
528
- let sum = hasher
529
- . finish ( )
530
- . map_err ( |e| Error :: HashCalculateFail ( format ! ( "{:?}" , e) ) ) ?;
537
+ let sum = hasher. finish ( ) . map_err ( |e| {
538
+ self . realm_tvec . set_all ( VERIFIER_MALFUNCTION ) ;
539
+
540
+ Error :: HashCalculateFail ( format ! ( "{e:?}" ) )
541
+ } ) ?;
531
542
532
543
if sum. to_vec ( ) != * platform_nonce {
533
544
self . realm_tvec . set_all ( CRYPTO_VALIDATION_FAILED ) ;
@@ -595,9 +606,11 @@ mod tests {
595
606
596
607
const TEST_CCA_TOKEN_1_OK : & [ u8 ; 1222 ] = include_bytes ! ( "../../testdata/cca-token-01.cbor" ) ;
597
608
const TEST_CCA_TOKEN_2_OK : & [ u8 ; 1125 ] = include_bytes ! ( "../../testdata/cca-token-02.cbor" ) ;
609
+ const TEST_CCA_TOKEN_BUG_33 : & [ u8 ; 2507 ] = include_bytes ! ( "../../testdata/bug-33-repro.cbor" ) ;
598
610
const TEST_CCA_RVS_OK : & str = include_str ! ( "../../testdata/rv.json" ) ;
599
611
const TEST_TA_2_OK : & str = include_str ! ( "../../testdata/ta-02-ok.json" ) ;
600
612
const TEST_TA_2_BAD : & str = include_str ! ( "../../testdata/ta-02-bad.json" ) ;
613
+ const TEST_TA_TFA : & str = include_str ! ( "../../testdata/ta-tfa.json" ) ;
601
614
602
615
#[ test]
603
616
fn decode_good_token ( ) {
@@ -688,4 +701,20 @@ mod tests {
688
701
serde_json:: to_string_pretty( & evidence. realm_tvec) . unwrap( )
689
702
) ;
690
703
}
704
+
705
+ #[ test]
706
+ fn bug_33_regression ( ) {
707
+ let mut evidence = Evidence :: decode ( & TEST_CCA_TOKEN_BUG_33 . to_vec ( ) )
708
+ . expect ( "decoding TEST_CCA_TOKEN_BUG_33" ) ;
709
+
710
+ let mut tas = MemoTrustAnchorStore :: new ( ) ;
711
+ tas. load_json ( TEST_TA_TFA ) . expect ( "loading trust anchors" ) ;
712
+
713
+ let r = evidence. verify ( & tas) ;
714
+
715
+ assert ! ( r. is_ok( ) ) ;
716
+
717
+ assert ! ( evidence. realm_tvec. instance_identity. get( ) == CRYPTO_VALIDATION_FAILED ) ;
718
+ assert ! ( evidence. platform_tvec. instance_identity. get( ) == TRUSTWORTHY_INSTANCE ) ;
719
+ }
691
720
}
0 commit comments