Skip to content

Commit 5c29271

Browse files
committed
Split file operation from loader.rs and change parse() API
Signed-off-by: OuyangHang33 <[email protected]>
1 parent 9b4e454 commit 5c29271

File tree

6 files changed

+85
-68
lines changed

6 files changed

+85
-68
lines changed

.github/workflows/main.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ jobs:
8787
8888
- name: Meta data check
8989
run: |
90-
cargo run -p td-shim-tools --bin td-shim-checker --no-default-features --features=loader -- target/release/final.bin
90+
cargo run -p td-shim-tools --bin td-shim-checker --no-default-features --features=loader,read_file -- target/release/final.bin
9191
9292
- name: Build debug image without payload
9393
run: |

td-shim-tools/Cargo.toml

+3-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ required-features = ["signer"]
2121

2222
[[bin]]
2323
name = "td-shim-checker"
24-
required-features = ["loader"]
24+
required-features = ["loader", "read_file"]
2525

2626
[[bin]]
2727
name = "td-shim-strip-info"
@@ -61,11 +61,12 @@ byteorder = { version = "1.4.3", optional = true }
6161
parse_int = { version = "0.6.0", optional = true }
6262

6363
[features]
64-
default = ["enroller", "linker", "signer", "loader", "tee", "calculator"]
64+
default = ["enroller", "linker", "signer", "loader", "tee", "calculator", "read_file"]
6565
enroller = ["clap", "der", "env_logger", "log", "ring", "td-shim/secure-boot"]
6666
linker = ["clap", "env_logger", "log", "parse_int", "serde_json", "serde", "td-loader"]
6767
signer = ["clap", "der", "env_logger", "log", "ring", "td-shim/secure-boot"]
6868
loader = ["clap", "env_logger", "log"]
69+
read_file = ["clap", "env_logger", "log", "anyhow"]
6970
tee = ["clap", "env_logger", "log", "serde_json", "serde", "hex", "sha2", "byteorder"]
7071
calculator = ["clap", "hex", "parse_int", "sha2", "anyhow", "block-padding"]
7172
exec-payload-section = []

td-shim-tools/src/bin/td-shim-checker/main.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use std::vec::Vec;
1212
use std::{env, io};
1313
use td_shim::metadata::{TdxMetadataDescriptor, TdxMetadataSection};
1414
use td_shim_tools::loader::TdShimLoader;
15+
use td_shim_tools::read_file::read_from_binary_file;
1516

1617
struct Config {
1718
// Input file path to be read
@@ -101,7 +102,9 @@ fn main() -> io::Result<()> {
101102
"Parse td-shim binary [{}] to get TdxMetadata ...",
102103
config.input
103104
);
104-
let tdx_metadata = TdShimLoader::parse(&config.input);
105+
106+
let tdx_file_buff = read_from_binary_file(&config.input).unwrap();
107+
let tdx_metadata = TdShimLoader::parse(tdx_file_buff);
105108
if tdx_metadata.is_none() {
106109
println!(
107110
"Failed to parse td-shim binary [{}] to get TdxMetadata",

td-shim-tools/src/lib.rs

+3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ pub mod signer;
2727
#[cfg(feature = "loader")]
2828
pub mod loader;
2929

30+
#[cfg(feature = "read_file")]
31+
pub mod read_file;
32+
3033
#[cfg(feature = "tee")]
3134
pub mod tee_info_hash;
3235

td-shim-tools/src/loader.rs

+18-64
Original file line numberDiff line numberDiff line change
@@ -2,69 +2,32 @@
22
//
33
// SPDX-License-Identifier: BSD-2-Clause-Patent
44

5-
use log::debug;
5+
use core::convert::TryInto;
66
use log::error;
77
use scroll::Pread;
8-
use std::fs;
9-
use std::io;
10-
use std::io::Read;
11-
use std::io::Seek;
128
use td_shim::metadata::{
139
self, TdxMetadataDescriptor, TdxMetadataGuid, TdxMetadataSection, TDX_METADATA_DESCRIPTOR_LEN,
1410
TDX_METADATA_GUID_LEN, TDX_METADATA_OFFSET, TDX_METADATA_SECTION_LEN,
1511
};
1612

1713
pub struct TdShimLoader;
1814

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-
2815
impl TdShimLoader {
2916
/// generate TdxMetadata elements tupple from input file
3017
///
3118
/// # Arguments
3219
///
3320
/// * `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();
5323
// Then read 4 bytes at the pos of [file_len - 0x20]
5424
// 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);
6831
if metadata_offset > file_size as u32 - TDX_METADATA_OFFSET - TDX_METADATA_DESCRIPTOR_LEN {
6932
error!("The metadata offset is invalid. {}", metadata_offset);
7033
error!("{:X?}", buffer);
@@ -73,26 +36,21 @@ impl TdShimLoader {
7336

7437
// Then read the guid
7538
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);
8244
if metadata_guid.is_none() {
8345
error!("Invalid TdxMetadataGuid");
8446
error!("{:X?}", &buffer);
8547
return None;
8648
}
8749

8850
// Then the descriptor
89-
let mut buffer: [u8; TDX_METADATA_DESCRIPTOR_LEN as usize] =
90-
[0; TDX_METADATA_DESCRIPTOR_LEN as usize];
9151
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];
9654
let metadata_descriptor: TdxMetadataDescriptor =
9755
buffer.pread::<TdxMetadataDescriptor>(0).unwrap();
9856
if !metadata_descriptor.is_valid() {
@@ -117,12 +75,8 @@ impl TdShimLoader {
11775
metadata_offset += TDX_METADATA_DESCRIPTOR_LEN;
11876

11977
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];
12680

12781
let section = buffer.pread::<TdxMetadataSection>(0).unwrap();
12882
metadata_sections.push(section);

td-shim-tools/src/read_file.rs

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// Copyright (c) 2022 Intel Corporation
2+
//
3+
// SPDX-License-Identifier: BSD-2-Clause-Patent
4+
5+
use anyhow::*;
6+
use log::debug;
7+
use std::fs;
8+
use std::io::Read;
9+
use std::io::Seek;
10+
use td_shim::metadata::TDX_METADATA_OFFSET;
11+
12+
fn read_from_file(file: &mut std::fs::File, pos: u64, buffer: &mut [u8]) -> Result<()> {
13+
debug!("Read at pos={0:X}, len={1:X}", pos, buffer.len());
14+
let _pos = std::io::SeekFrom::Start(pos);
15+
file.seek(_pos)?;
16+
file.read_exact(buffer)?;
17+
debug!("{:X?}", buffer);
18+
Ok(())
19+
}
20+
21+
pub fn read_from_binary_file(filename: &String) -> Result<Vec<u8>> {
22+
let f = fs::File::open(filename);
23+
if f.is_err() {
24+
bail!("Problem opening the file");
25+
}
26+
27+
let mut file = f.unwrap();
28+
29+
let file_metadata = fs::metadata(filename);
30+
if file_metadata.is_err() {
31+
bail!("Problem read file meatadata");
32+
}
33+
34+
let file_metadata = file_metadata.unwrap();
35+
let file_size = file_metadata.len();
36+
37+
// Then read 4 bytes at the pos of [file_len - 0x20]
38+
// This is the offset of TdxMetadata
39+
let mut metadata_buffer: Vec<u8> = vec![0; 4];
40+
if read_from_file(
41+
&mut file,
42+
file_size - TDX_METADATA_OFFSET as u64,
43+
&mut metadata_buffer,
44+
)
45+
.is_err()
46+
{
47+
bail!("Failed to read metadata offset");
48+
}
49+
50+
// Read whole binary file and return binary string
51+
let mut buffer: Vec<u8> = vec![0; file_size as usize];
52+
if read_from_file(&mut file, 0, &mut buffer).is_err() {
53+
bail!("Failed to read tdshim binary file");
54+
}
55+
Ok(buffer)
56+
}

0 commit comments

Comments
 (0)