2
2
//
3
3
// SPDX-License-Identifier: BSD-2-Clause-Patent
4
4
5
- use log :: debug ;
5
+ use core :: convert :: TryInto ;
6
6
use log:: error;
7
7
use scroll:: Pread ;
8
- use std:: fs;
9
- use std:: io;
10
- use std:: io:: Read ;
11
- use std:: io:: Seek ;
12
8
use td_shim:: metadata:: {
13
9
self , TdxMetadataDescriptor , TdxMetadataGuid , TdxMetadataSection , TDX_METADATA_DESCRIPTOR_LEN ,
14
10
TDX_METADATA_GUID_LEN , TDX_METADATA_OFFSET , TDX_METADATA_SECTION_LEN ,
15
11
} ;
16
12
17
13
pub struct TdShimLoader ;
18
14
19
- fn read_from_file ( file : & mut std:: fs:: File , pos : u64 , buffer : & mut [ u8 ] ) -> io:: Result < ( ) > {
20
- debug ! ( "Read at pos={0:X}, len={1:X}" , pos, buffer. len( ) ) ;
21
- let _pos = std:: io:: SeekFrom :: Start ( pos) ;
22
- file. seek ( _pos) ?;
23
- file. read_exact ( buffer) ?;
24
- debug ! ( "{:X?}" , buffer) ;
25
- Ok ( ( ) )
26
- }
27
-
28
15
impl TdShimLoader {
29
16
/// generate TdxMetadata elements tupple from input file
30
17
///
31
18
/// # Arguments
32
19
///
33
20
/// * `filename` - The td-shim binary which contains TdxMetadata
34
- pub fn parse ( filename : & String ) -> Option < ( TdxMetadataDescriptor , Vec < TdxMetadataSection > ) > {
35
- // first we open the input file and get its size
36
- let f = fs:: File :: open ( filename) ;
37
- if f. is_err ( ) {
38
- error ! ( "Problem opening the file" ) ;
39
- return None ;
40
- }
41
-
42
- let mut file = f. unwrap ( ) ;
43
-
44
- let file_metadata = fs:: metadata ( filename) ;
45
- if file_metadata. is_err ( ) {
46
- error ! ( "Problem read file meatadata" ) ;
47
- return None ;
48
- }
49
-
50
- let file_metadata = file_metadata. unwrap ( ) ;
51
- let file_size = file_metadata. len ( ) ;
52
-
21
+ pub fn parse ( binary_file : Vec < u8 > ) -> Option < ( TdxMetadataDescriptor , Vec < TdxMetadataSection > ) > {
22
+ let file_size = binary_file. len ( ) ;
53
23
// Then read 4 bytes at the pos of [file_len - 0x20]
54
24
// This is the offset of TdxMetadata
55
- let mut buffer: [ u8 ; 4 ] = [ 0 ; 4 ] ;
56
- if read_from_file (
57
- & mut file,
58
- file_size - TDX_METADATA_OFFSET as u64 ,
59
- & mut buffer,
60
- )
61
- . is_err ( )
62
- {
63
- error ! ( "Failed to read metadata offset" ) ;
64
- return None ;
65
- }
66
-
67
- let mut metadata_offset = u32:: from_le_bytes ( buffer) ;
25
+ let metadata_offset_addr = file_size - TDX_METADATA_OFFSET as usize ;
26
+ let buffer = & binary_file[ metadata_offset_addr..metadata_offset_addr + 4 ] ;
27
+ let mut metadata_offset = ( ( buffer[ 3 ] as u32 ) << 24 )
28
+ | ( ( buffer[ 2 ] as u32 ) << 16 )
29
+ | ( ( buffer[ 1 ] as u32 ) << 8 )
30
+ | ( buffer[ 0 ] as u32 ) ;
68
31
if metadata_offset > file_size as u32 - TDX_METADATA_OFFSET - TDX_METADATA_DESCRIPTOR_LEN {
69
32
error ! ( "The metadata offset is invalid. {}" , metadata_offset) ;
70
33
error ! ( "{:X?}" , buffer) ;
@@ -73,26 +36,21 @@ impl TdShimLoader {
73
36
74
37
// Then read the guid
75
38
metadata_offset -= TDX_METADATA_GUID_LEN ;
76
- let mut buffer: [ u8 ; TDX_METADATA_GUID_LEN as usize ] = [ 0 ; TDX_METADATA_GUID_LEN as usize ] ;
77
- if read_from_file ( & mut file, metadata_offset as u64 , & mut buffer) . is_err ( ) {
78
- error ! ( "Failed to read metadata guid from file" ) ;
79
- return None ;
80
- }
81
- let metadata_guid = TdxMetadataGuid :: from_bytes ( & buffer) ;
39
+ let buffer = & binary_file
40
+ [ metadata_offset as usize ..( metadata_offset + TDX_METADATA_GUID_LEN ) as usize ]
41
+ . try_into ( )
42
+ . unwrap ( ) ;
43
+ let metadata_guid = TdxMetadataGuid :: from_bytes ( buffer) ;
82
44
if metadata_guid. is_none ( ) {
83
45
error ! ( "Invalid TdxMetadataGuid" ) ;
84
46
error ! ( "{:X?}" , & buffer) ;
85
47
return None ;
86
48
}
87
49
88
50
// Then the descriptor
89
- let mut buffer: [ u8 ; TDX_METADATA_DESCRIPTOR_LEN as usize ] =
90
- [ 0 ; TDX_METADATA_DESCRIPTOR_LEN as usize ] ;
91
51
metadata_offset += TDX_METADATA_GUID_LEN ;
92
- if read_from_file ( & mut file, metadata_offset as u64 , & mut buffer) . is_err ( ) {
93
- error ! ( "Failed to read metadata descriptor from file" ) ;
94
- return None ;
95
- }
52
+ let buffer = & binary_file
53
+ [ metadata_offset as usize ..( metadata_offset + TDX_METADATA_DESCRIPTOR_LEN ) as usize ] ;
96
54
let metadata_descriptor: TdxMetadataDescriptor =
97
55
buffer. pread :: < TdxMetadataDescriptor > ( 0 ) . unwrap ( ) ;
98
56
if !metadata_descriptor. is_valid ( ) {
@@ -117,12 +75,8 @@ impl TdShimLoader {
117
75
metadata_offset += TDX_METADATA_DESCRIPTOR_LEN ;
118
76
119
77
loop {
120
- let mut buffer: [ u8 ; TDX_METADATA_SECTION_LEN as usize ] =
121
- [ 0 ; TDX_METADATA_SECTION_LEN as usize ] ;
122
- if read_from_file ( & mut file, metadata_offset as u64 , & mut buffer) . is_err ( ) {
123
- error ! ( "Failed to read section[{}] from file" , i) ;
124
- return None ;
125
- }
78
+ let buffer = & binary_file
79
+ [ metadata_offset as usize ..( metadata_offset + TDX_METADATA_SECTION_LEN ) as usize ] ;
126
80
127
81
let section = buffer. pread :: < TdxMetadataSection > ( 0 ) . unwrap ( ) ;
128
82
metadata_sections. push ( section) ;
0 commit comments