MCPcopy Create free account
hub / github.com/Dstack-TEE/dstack / parse_qgs_get_quote_response

Function parse_qgs_get_quote_response

tdx-attest/src/linux.rs:599–649  ·  view source on GitHub ↗

Parse QGS get_quote response and extract the quote Response format: - qgs_msg_header_t (16 bytes) - selected_id_size (4 bytes) - quote_size (4 bytes) - selected_id data (variable) - quote data (variable)

(data: &[u8])

Source from the content-addressed store, hash-verified

597/// - selected_id data (variable)
598/// - quote data (variable)
599fn parse_qgs_get_quote_response(data: &[u8]) -> Result<Vec<u8>> {
600 // Minimum size: header (16) + selected_id_size (4) + quote_size (4) = 24 bytes
601 if data.len() < 24 {
602 return Err(TdxAttestError::QuoteFailure(format!(
603 "response too short: {} bytes",
604 data.len()
605 )));
606 }
607
608 // Parse header
609 let msg_type = u32::from_le_bytes([data[4], data[5], data[6], data[7]]);
610 let error_code = u32::from_le_bytes([data[12], data[13], data[14], data[15]]);
611
612 if msg_type != QGS_MSG_GET_QUOTE_RESP {
613 return Err(TdxAttestError::QuoteFailure(format!(
614 "unexpected message type: {msg_type}"
615 )));
616 }
617
618 if error_code != 0 {
619 return Err(TdxAttestError::QuoteFailure(format!(
620 "QGS error code: 0x{error_code:x}"
621 )));
622 }
623
624 // Parse response body
625 let selected_id_size = u32::from_le_bytes([data[16], data[17], data[18], data[19]]) as usize;
626 let quote_size = u32::from_le_bytes([data[20], data[21], data[22], data[23]]) as usize;
627
628 // Validate sizes
629 let expected_len = 24 + selected_id_size + quote_size;
630 if data.len() < expected_len {
631 return Err(TdxAttestError::QuoteFailure(format!(
632 "response truncated: got {} bytes, expected {expected_len}",
633 data.len()
634 )));
635 }
636
637 // Extract quote (skip selected_id)
638 let quote_offset = 24 + selected_id_size;
639 let quote = data[quote_offset..quote_offset + quote_size].to_vec();
640
641 if quote.len() < QUOTE_MIN_SIZE {
642 return Err(TdxAttestError::QuoteFailure(format!(
643 "quote too short: {} bytes",
644 quote.len()
645 )));
646 }
647
648 Ok(quote)
649}

Callers 1

get_quote_via_vsockFunction · 0.85

Calls 2

to_vecMethod · 0.80
lenMethod · 0.45

Tested by

no test coverage detected