@@ -5,6 +5,7 @@ pub use crate::error::TapError;
55use alloc:: vec:: Vec ;
66use crate :: spec:: * ;
77use alloc:: vec;
8+ use crate :: ensure;
89
910pub struct AttestationPayloadParser {
1011 pub pointer : * const u8 ,
@@ -13,23 +14,17 @@ pub struct AttestationPayloadParser {
1314
1415impl AttestationPayloadParser {
1516 pub fn from_raw_pointer ( pointer : * const u8 , size : usize ) -> Result < Self , TapError > {
16- Ok ( Self {
17- pointer, size
18- } )
17+ Ok ( Self { pointer, size } )
1918 }
2019
21- pub fn parse_and_verify ( & mut self , decapsulation_key : & Vec < u8 > ) -> Result < AttestationPayload , TapError > {
22- if self . read_u32 ( ) ? != ACE_MAGIC_TAP_START {
23- return Err ( TapError :: InvalidMagicStart ( ) ) ;
24- }
20+ pub fn parse_and_verify ( & mut self , decapsulation_key : & [ u8 ] ) -> Result < AttestationPayload , TapError > {
21+ ensure ! ( self . read_u32( ) ? == ACE_MAGIC_TAP_START , TapError :: InvalidMagicStart ( ) ) ?;
2522 self . read_u16 ( ) ?;
2623 // if self.read_u16()? as usize != self.size {
2724 // return Err(TapError::InvalidSize());
2825 // }
2926 let number_of_lockboxes = self . read_u16 ( ) ?;
30- if usize:: from ( number_of_lockboxes) > MAX_NUMBER_OF_LOCKBOXES {
31- return Err ( TapError :: InvalidSize ( ) ) ;
32- }
27+ ensure ! ( usize :: from( number_of_lockboxes) <= MAX_NUMBER_OF_LOCKBOXES , TapError :: InvalidSize ( ) ) ?;
3328
3429 let mut symmetric_key = vec ! [ ] ;
3530 for _ in 0 ..number_of_lockboxes {
@@ -38,26 +33,20 @@ impl AttestationPayloadParser {
3833 let _name = self . read_u64 ( ) ?;
3934 let algorithm = LockboxAlgorithm :: from_u16 ( self . read_u16 ( ) ?) ?;
4035 let esk_size = self . read_u16 ( ) ? as usize ;
36+ ensure ! ( esk_size < 100_000 , TapError :: InvalidSize ( ) ) ?;
4137 let esk = self . read_exact ( esk_size) ?;
4238 let nonce_size = self . read_u16 ( ) ? as usize ;
39+ ensure ! ( nonce_size < 100_000 , TapError :: InvalidSize ( ) ) ?;
4340 let nonce = self . read_exact ( nonce_size) ?;
4441 let tag_size = self . read_u16 ( ) ? as usize ;
42+ ensure ! ( tag_size < 100_000 , TapError :: InvalidSize ( ) ) ?;
4543 let tag = self . read_exact ( tag_size) ?;
4644 let tsk_size = self . read_u16 ( ) ? as usize ;
47- let tsk = self . read_exact ( tsk_size) ?;
48- match algorithm. decode ( decapsulation_key, esk, nonce, tag, tsk) {
49- Ok ( mut tsk) => {
50- symmetric_key. append ( & mut tsk) ;
51- break ;
52- }
53- Err ( e) => {
54- return Err ( e)
55- }
56- } ;
57- }
58- if symmetric_key. is_empty ( ) {
59- return Err ( TapError :: NoLockboxFound ( ) ) ;
45+ ensure ! ( tsk_size < 100_000 , TapError :: InvalidSize ( ) ) ?;
46+ symmetric_key = self . read_exact ( tsk_size) ?;
47+ algorithm. decode ( decapsulation_key, & esk, & nonce, & tag, & mut symmetric_key) ?;
6048 }
49+ ensure ! ( !symmetric_key. is_empty( ) , TapError :: NoLockboxFound ( ) ) ?;
6150
6251 let payload_encryption_algorithm = PayloadEncryptionAlgorithm :: from_u16 ( self . read_u16 ( ) ?) ?;
6352 match payload_encryption_algorithm {
@@ -66,9 +55,10 @@ impl AttestationPayloadParser {
6655 }
6756
6857 let number_of_digests = self . read_u16 ( ) ?;
69- let mut digests = vec ! [ ] ;
58+ let mut digests = Vec :: with_capacity ( number_of_digests . into ( ) ) ;
7059 for _ in 0 ..number_of_digests {
7160 let size = self . read_u16 ( ) ? as usize ;
61+ ensure ! ( 4 <= size && size < 100_000 , TapError :: InvalidSize ( ) ) ?;
7262 let pcr_id = self . read_u16 ( ) ?;
7363 let algorithm = DigestAlgorithm :: from_u16 ( self . read_u16 ( ) ?) ?;
7464 let value = self . read_exact ( size-4 ) ?;
@@ -83,30 +73,29 @@ impl AttestationPayloadParser {
8373 let mut secrets = vec ! [ ] ;
8474 for _ in 0 ..number_of_secrets {
8575 let size = self . read_u16 ( ) ? as usize ;
76+ ensure ! ( 10 <= size && size < 100_000 , TapError :: InvalidSize ( ) ) ?;
8677 let name = self . read_u64 ( ) ? as u64 ;
8778 let value = self . read_exact ( size-10 ) ?;
8879 secrets. push ( Secret { name, value } ) ;
8980 }
9081
91- Ok ( AttestationPayload {
92- digests,
93- secrets,
94- } )
82+ Ok ( AttestationPayload { digests, secrets } )
9583 }
9684
97- fn decrypt_aes_gcm_256 ( & mut self , symmetric_key : & Vec < u8 > ) -> Result < ( ) , TapError > {
85+ fn decrypt_aes_gcm_256 ( & mut self , symmetric_key : & [ u8 ] ) -> Result < ( ) , TapError > {
9886 use aes_gcm:: { AeadInPlace , Aes256Gcm , Key , KeyInit , Tag , Nonce } ;
9987
10088 let nonce_size = self . read_u16 ( ) ? as usize ;
89+ ensure ! ( nonce_size < 100_000 , TapError :: InvalidSize ( ) ) ?;
10190 let nonce = self . read_exact ( nonce_size) ?;
10291 let tag_size = self . read_u16 ( ) ? as usize ;
92+ ensure ! ( tag_size < 100_000 , TapError :: InvalidSize ( ) ) ?;
10393 let tag = self . read_exact ( tag_size) ?;
10494 let payload_size = self . read_u16 ( ) ? as usize ;
95+ ensure ! ( payload_size < 100_000 , TapError :: InvalidSize ( ) ) ?;
10596
106- if symmetric_key. len ( ) != 32 {
107- return Err ( TapError :: InvalidTskSize ( ) ) ;
108- }
109- let cipher = Aes256Gcm :: new ( Key :: < Aes256Gcm > :: from_slice ( symmetric_key. as_slice ( ) ) ) ;
97+ ensure ! ( symmetric_key. len( ) == 32 , TapError :: InvalidTskSize ( ) ) ?;
98+ let cipher = Aes256Gcm :: new ( Key :: < Aes256Gcm > :: from_slice ( symmetric_key) ) ;
11099 let nonce = Nonce :: from_slice ( & nonce) ;
111100 let tag = Tag :: from_slice ( & tag) ;
112101 let mut data_slice = unsafe { core:: slice:: from_raw_parts_mut ( self . pointer as * mut u8 , payload_size) } ;
@@ -115,25 +104,19 @@ impl AttestationPayloadParser {
115104 }
116105
117106 fn read_u16 ( & mut self ) -> Result < u16 , TapError > {
118- let value = unsafe { ( self . pointer as * const u16 ) . read_volatile ( ) } ;
119- self . pointer = self . pointer . wrapping_add ( 2 ) ;
120- Ok ( value)
107+ Ok ( u16:: from_le_bytes ( self . read_exact ( 2 ) ?. try_into ( ) . map_err ( |_| TapError :: InvalidSize ( ) ) ?) )
121108 }
122109
123110 fn read_u32 ( & mut self ) -> Result < u32 , TapError > {
124- let value = unsafe { ( self . pointer as * const u32 ) . read_volatile ( ) } ;
125- self . pointer = self . pointer . wrapping_add ( 4 ) ;
126- Ok ( value)
111+ Ok ( u32:: from_le_bytes ( self . read_exact ( 4 ) ?. try_into ( ) . map_err ( |_| TapError :: InvalidSize ( ) ) ?) )
127112 }
128113
129114 fn read_u64 ( & mut self ) -> Result < u64 , TapError > {
130- let value = unsafe { ( self . pointer as * const u64 ) . read_volatile ( ) } ;
131- self . pointer = self . pointer . wrapping_add ( 8 ) ;
132- Ok ( value)
115+ Ok ( u64:: from_le_bytes ( self . read_exact ( 8 ) ?. try_into ( ) . map_err ( |_| TapError :: InvalidSize ( ) ) ?) )
133116 }
134117
135118 fn read_exact ( & mut self , size : usize ) -> Result < Vec < u8 > , TapError > {
136- let mut result = vec ! [ ] ;
119+ let mut result = Vec :: with_capacity ( size ) ;
137120 for _ in 0 ..size {
138121 let value = unsafe { self . pointer . read_volatile ( ) } ;
139122 self . pointer = self . pointer . wrapping_add ( 1 ) ;
0 commit comments