(report_data: &TdxReportData)
| 498 | // ============================================================================ |
| 499 | |
| 500 | fn get_quote_via_vsock(report_data: &TdxReportData) -> Result<Vec<u8>> { |
| 501 | use std::io::{Read as _, Write as _}; |
| 502 | |
| 503 | let vsock_port = read_vsock_port()?; |
| 504 | if vsock_port == 0 { |
| 505 | return Err(TdxAttestError::NotSupported(format!( |
| 506 | "no vsock port configured in {TDX_ATTEST_CONFIG_PATH}" |
| 507 | ))); |
| 508 | } |
| 509 | |
| 510 | let report = get_report(report_data)?; |
| 511 | let request = build_qgs_get_quote_request(&report.0); |
| 512 | |
| 513 | let mut stream = vsock::VsockStream::connect_with_cid_port(vsock::VMADDR_CID_HOST, vsock_port)?; |
| 514 | |
| 515 | let len_header = (request.len() as u32).to_be_bytes(); |
| 516 | stream.write_all(&len_header)?; |
| 517 | stream.write_all(&request)?; |
| 518 | |
| 519 | let mut len_buf = [0u8; QGS_MSG_LEN_PREFIX_SIZE]; |
| 520 | stream.read_exact(&mut len_buf)?; |
| 521 | let msg_len = u32::from_be_bytes(len_buf) as usize; |
| 522 | |
| 523 | if msg_len > QGS_REQ_BUF_SIZE { |
| 524 | return Err(TdxAttestError::QuoteFailure(format!( |
| 525 | "response too large: {msg_len}" |
| 526 | ))); |
| 527 | } |
| 528 | |
| 529 | let mut response = vec![0u8; msg_len]; |
| 530 | stream.read_exact(&mut response)?; |
| 531 | |
| 532 | parse_qgs_get_quote_response(&response) |
| 533 | } |
| 534 | |
| 535 | fn read_vsock_port() -> Result<u32> { |
| 536 | let content = match fs::read_to_string(TDX_ATTEST_CONFIG_PATH) { |
no test coverage detected