intel-dcap-api 0.6.0

Intel DCAP API Client
Documentation
// SPDX-License-Identifier: Apache-2.0
// Copyright (c) 2025 Matter Labs

use intel_dcap_api::{
    ApiClient, ApiVersion, CaType, CrlEncoding, EnclaveIdentityResponse, IntelApiError,
    PckCrlResponse, PlatformFilter, TcbInfoResponse,
};

#[tokio::main]
async fn main() -> Result<(), IntelApiError> {
    for api_version in [ApiVersion::V3, ApiVersion::V4] {
        println!("Using API version: {}", api_version);

        let client = ApiClient::new_with_version(api_version)?;

        // Example: Get SGX TCB Info
        let fmspc_example = "00606A000000"; // Example FMSPC from docs
        match client.get_sgx_tcb_info(fmspc_example, None, None).await {
            Ok(TcbInfoResponse {
                tcb_info_json,
                issuer_chain,
            }) => println!(
                "SGX TCB Info for {}:\n{}\nIssuer Chain: {}",
                fmspc_example, tcb_info_json, issuer_chain
            ),
            Err(e) => eprintln!("Error getting SGX TCB info: {}", e),
        }

        // Example: Get FMSPCs
        match client.get_fmspcs(Some(PlatformFilter::E3)).await {
            // Filter for E3 platform type [cite: 230]
            Ok(fmspc_list) => println!("\nE3 FMSPCs:\n{}", fmspc_list),
            Err(e) => eprintln!("Error getting FMSPCs: {}", e),
        }

        // Example: Get SGX QE Identity
        match client.get_sgx_qe_identity(None, None).await {
            Ok(EnclaveIdentityResponse {
                enclave_identity_json,
                issuer_chain,
            }) => {
                println!(
                    "\nSGX QE Identity:\n{}\nIssuer Chain: {}",
                    enclave_identity_json, issuer_chain
                )
            }
            Err(e) => eprintln!("Error getting SGX QE Identity: {}", e),
        }

        // Example: Get PCK CRL (Platform CA, PEM encoding)
        match client
            .get_pck_crl(CaType::Platform, Some(CrlEncoding::Pem))
            .await
        {
            // [cite: 118, 119]
            Ok(PckCrlResponse {
                crl_data,
                issuer_chain,
            }) => {
                // Attempt to decode PEM for display, otherwise show byte count
                match String::from_utf8(crl_data.clone()) {
                    Ok(pem_string) => println!(
                        "\nPlatform PCK CRL (PEM):\n{}\nIssuer Chain: {}",
                        pem_string, issuer_chain
                    ),
                    Err(_) => println!(
                        "\nPlatform PCK CRL ({} bytes, likely DER):\nIssuer Chain: {}",
                        crl_data.len(),
                        issuer_chain
                    ),
                }
            }
            Err(e) => eprintln!("Error getting PCK CRL: {}", e),
        }
    }

    Ok(())
}