cvm-attestation/deserialize_tdx_v5.py (74 lines of code) (raw):
# deserialize_tdx_v5.py
#
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.
from construct import Struct, Int16ul, Int32ul, Int64ul, Bytes, Array, this
def deserialize_td_quotev5(tq_quote):
"""
Parses the given TD quote object and returns the structured data.
"""
TDQuoteHeaderv5 = Struct(
"version" / Int16ul,
"attestation_key_type" / Int16ul,
"tee_type" / Int32ul,
"reserved_1" / Bytes(2),
"reserved_2" / Bytes(2),
"qe_vendor_id" / Bytes(16),
"user_data" / Bytes(20)
)
TDQuoteBodyv5 = Struct(
"tee_tcb_svn" / Bytes(16),
"mrseam" / Bytes(48),
"mrsignerseam" / Bytes(48),
"seam_attributes" / Bytes(8),
"td_attributes" / Bytes(8),
"xfam" / Int64ul,
"mr_td" / Bytes(48),
"mr_config_id" / Bytes(48),
"mr_owner" / Bytes(48),
"mr_owner_config" / Bytes(48),
"rtmr" / Array(4, Bytes(48)),
"report_data" / Bytes(64),
"tee_tcb_svn_2" / Bytes(16),
"mr_service_td" / Bytes(48)
)
TDQuoteBodyDescriptorv5 = Struct(
"quote_body_type" / Bytes(2),
"size" / Int32ul,
"body" / TDQuoteBodyv5
)
TDQuotev5 = Struct(
"header" / TDQuoteHeaderv5,
"body" / TDQuoteBodyDescriptorv5,
"quote_signature_data_len" / Int32ul,
"quote_signature_data" / Bytes(this.quote_signature_data_len)
)
try:
return TDQuotev5.parse(tq_quote)
except Exception as e:
print(f"Error parsing TD Quote: {e}", file=sys.stderr)
return None
def print_td_quotev5(parsed_quote):
"""
Prints the parsed TD quote data in a structured format.
"""
print("TD Quote Header:")
print(f" Version: {parsed_quote.header.version}")
print(f" Attestation Key Type: {parsed_quote.header.attestation_key_type}")
print(f" TEE Type: {parsed_quote.header.tee_type}")
print(f" Reserved 1: {parsed_quote.header.reserved_1.hex()}")
print(f" Reserved 2: {parsed_quote.header.reserved_2.hex()}")
print(f" QE Vendor ID: {parsed_quote.header.qe_vendor_id.hex()}")
print(f" User Data: {parsed_quote.header.user_data.hex()}")
print("\nTD Quote Body Descriptor:")
print(f" Quote Body Type: {parsed_quote.body.quote_body_type.hex()}")
print(f" Size: {parsed_quote.body.size}")
print("\nTD Quote Body:")
print(f" TEE TCB SVN: {parsed_quote.body.body.tee_tcb_svn.hex()}")
print(f" MRSEAM: {parsed_quote.body.body.mrseam.hex()}")
print(f" MRSIGNERSEAM: {parsed_quote.body.body.mrsignerseam.hex()}")
print(f" SEAM ATTRIBUTES: {parsed_quote.body.body.seam_attributes.hex()}")
print(f" TD ATTRIBUTES: {parsed_quote.body.body.td_attributes.hex()}")
print(f" XFAM: {parsed_quote.body.body.xfam}")
print(f" MR TD: {parsed_quote.body.body.mr_td.hex()}")
print(f" MR CONFIG ID: {parsed_quote.body.body.mr_config_id.hex()}")
print(f" MR OWNER: {parsed_quote.body.body.mr_owner.hex()}")
print(f" MR OWNER CONFIG: {parsed_quote.body.body.mr_owner_config.hex()}")
for i, rtmr in enumerate(parsed_quote.body.body.rtmr):
print(f" RTMR[{i}]: {rtmr.hex()}")
print(f" REPORT DATA: {parsed_quote.body.body.report_data.hex()}")
print(f" TEE TCB SVN 2: {parsed_quote.body.body.tee_tcb_svn_2.hex()}")
print(f" MR SERVICE TD: {parsed_quote.body.body.mr_service_td.hex()}")
print("\nQuote Signature Data:")
print(f" Length: {parsed_quote.quote_signature_data_len}")
print(f" Data: {parsed_quote.quote_signature_data.hex()}")