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])
| 597 | /// - selected_id data (variable) |
| 598 | /// - quote data (variable) |
| 599 | fn 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 | } |
no test coverage detected