cvm-attestation/read_report.py (59 lines of code) (raw):
import click
from AttestationClient import AttestationClient, AttestationClientParameters, Verifier
from src.Isolation import IsolationType
from src.Logger import Logger
from snp import AttestationReport
from src.ImdsClient import ImdsClient
from src.Encoder import Encoder
from deserialize_tdx_v4 import deserialize_td_quotev4, print_td_quotev4
DEFAULT_ENDPOINT = 'https://sharedweu.weu.attest.azure.net/attest/SevSnpVm?api-version=2022-08-01'
@click.command()
@click.option(
'--t', '-type',
type=click.Choice(['snp_report', 'td_quote'], case_sensitive=True),
default='snp_report',
help='Specify the type of hardware report to dump: snp_report or td_quote.'
)
@click.option(
'--o', '-out',
type=click.Path(writable=True, dir_okay=False),
required=False,
help='Specify the file path to store the output (optional).'
)
def read_report(t, o):
"""
CLI tool to read and optionally save hardware reports.
"""
logger = Logger('logger').get_logger()
logger.info("Attestation started...")
logger.info(f"Report type selected: {t}")
# Initialize attestation client
client_parameters = AttestationClientParameters(
DEFAULT_ENDPOINT,
Verifier.MAA,
IsolationType.SEV_SNP if t == 'snp_report' else IsolationType.TDX,
''
)
attestation_client = AttestationClient(logger, client_parameters)
# Handle the hardware report
handle_hardware_report(t, o, attestation_client)
def handle_hardware_report(report_type, output_path, attestation_client):
"""
Handle the hardware report generation and optional saving.
"""
logger = attestation_client.log
logger.info(f"Reading hardware report: {report_type}")
evidence = attestation_client.get_hardware_evidence()
if report_type == 'snp_report':
# Retrieve and deserialize the SNP report
report = AttestationReport.deserialize(evidence.hardware_report)
# Display the report
report.display()
filename = 'report.bin'
# Optionally save the report to a file
if output_path:
filename = output_path
with open(filename, 'wb') as file:
file.write(evidence.hardware_report)
logger.info(f"Report saved to: {filename}")
logger.info("Got attestation report successfully!")
elif report_type == 'td_quote':
try:
deserialized_td_quote = deserialize_td_quotev4(evidence.hardware_report)
print_td_quotev4(deserialized_td_quote)
except UnicodeDecodeError:
logger.error("Failed to decode the TD quote header. Ensure the report is valid.")
return
else:
raise ValueError(f"Invalid hardware report type: {report_type}")
if __name__ == "__main__":
read_report()