cvm-attestation/deserialize_tdx_v4.py (74 lines of code) (raw):

# deserialize_tdx_v4.py # # Copyright (c) Microsoft Corporation. # Licensed under the MIT license. from construct import Struct, Int16ul, Int32ul, Int64ul, Bytes, Array, this import sys def deserialize_td_quotev4(tq_quote): """ Parses the given TD quote object and returns the structured data. :param tq_quote: The TD quote binary data. :return: Parsed TD Quote structure. """ QuoteHeaderv4 = Struct( "version" / Int16ul, "attestation_key_type" / Int16ul, "tee_type" / Bytes(4), "reserved_0" / Int16ul, "reserved_1" / Int16ul, "qe_vendor_id" / Bytes(16), "user_data" / Bytes(20) ) TDQuoteBodyv4 = 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_0" / Bytes(48), "rtmr_1" / Bytes(48), "rtmr_2" / Bytes(48), "rtmr_3" / Bytes(48), "report_data" / Bytes(64) ) QuoteSignatureDatav4 = Struct( "signature" / Bytes(64), "attestation_key" / Bytes(64), "qe_certification_data_type" / Bytes(2), "cert_data_size" / Int32ul, "cert_data" / Bytes(this.cert_data_size) ) TDQuote_V4 = Struct( "header" / QuoteHeaderv4, "td_quote_body" / TDQuoteBodyv4, "quote_signature_data_len" / Int32ul, "quote_signature_data" / QuoteSignatureDatav4, ) try: return TDQuote_V4.parse(tq_quote) except Exception as e: print(f"Error parsing TD Quote: {e}", file=sys.stderr) return None def print_td_quotev4(parsed_quote): print("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.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:") print(f" TEE TCB SVN: {parsed_quote.td_quote_body.tee_tcb_svn.hex()}") print(f" MR SEAM: {parsed_quote.td_quote_body.mrseam.hex()}") print(f" MR SIGNER SEAM: {parsed_quote.td_quote_body.mrsignerseam.hex()}") print(f" SEAM ATTRIBUTES: {parsed_quote.td_quote_body.seam_attributes.hex()}") print(f" TD ATTRIBUTES: {parsed_quote.td_quote_body.td_attributes.hex()}") print(f" XFAM: {parsed_quote.td_quote_body.xfam}") print(f" MR TD: {parsed_quote.td_quote_body.mr_td.hex()}") print(f" MR CONFIG ID: {parsed_quote.td_quote_body.mr_config_id.hex()}") print(f" MR OWNER: {parsed_quote.td_quote_body.mr_owner.hex()}") print(f" MR OWNER CONFIG: {parsed_quote.td_quote_body.mr_owner_config.hex()}") print(f" RTMR[0]: {parsed_quote.td_quote_body.rtmr_0.hex()}") print(f" RTMR[1]: {parsed_quote.td_quote_body.rtmr_1.hex()}") print(f" RTMR[2]: {parsed_quote.td_quote_body.rtmr_2.hex()}") print(f" RTMR[3]: {parsed_quote.td_quote_body.rtmr_3.hex()}") print(f" REPORT DATA: {parsed_quote.td_quote_body.report_data.hex()}") print("\nQuote Signature Data:") print(f" Signature: {parsed_quote.quote_signature_data.signature.hex()}") print(f" Attestation Key: {parsed_quote.quote_signature_data.attestation_key.hex()}") print(f" Cert Data Size: {parsed_quote.quote_signature_data.cert_data_size}")