in src/dcap_provider.cpp [777:831]
static sgx_plat_error_t parse_svn_values(
const curl_easy& curl,
const nlohmann::json& json,
sgx_ql_config_t* quote_config)
{
sgx_plat_error_t result = SGX_PLAT_ERROR_OK;
std::string tcb;
result = extract_from_json(json, headers::TCB_INFO, &tcb);
if (result != SGX_PLAT_ERROR_OK)
return result;
// string size == byte size * 2 (for hex-encoding)
static constexpr size_t CPUSVN_SIZE =
2 * sizeof(quote_config->cert_cpu_svn);
static constexpr size_t PCESVN_SIZE =
2 * sizeof(quote_config->cert_pce_isv_svn);
if (tcb.size() != CPUSVN_SIZE + PCESVN_SIZE)
{
log(SGX_QL_LOG_ERROR, "TCB info header is malformed.");
return SGX_PLAT_ERROR_UNEXPECTED_SERVER_RESPONSE;
}
const std::string cpu_svn_string = tcb.substr(0, CPUSVN_SIZE);
log(SGX_QL_LOG_INFO, "CPU SVN: '%s", cpu_svn_string.c_str());
if (const sgx_plat_error_t err =
hex_decode(cpu_svn_string, "e_config->cert_cpu_svn))
{
log(SGX_QL_LOG_ERROR, "CPU SVN is malformed.");
return err;
}
const std::string pce_svn_string = tcb.substr(CPUSVN_SIZE, PCESVN_SIZE);
log(SGX_QL_LOG_INFO, "PCE ISV SVN: '%s'.", pce_svn_string.c_str());
if (const sgx_plat_error_t err =
hex_decode(pce_svn_string, "e_config->cert_pce_isv_svn))
{
log(SGX_QL_LOG_ERROR, "PCE ISV SVN is malformed.");
return err;
}
if (is_little_endian()) // PCESVN is hosted in big-endian format for
// consistency with Intel
{
quote_config->cert_pce_isv_svn =
byte_swap(quote_config->cert_pce_isv_svn);
}
log(SGX_QL_LOG_INFO,
"PCE SVN parsed as '0x%04x'",
quote_config->cert_pce_isv_svn);
return SGX_PLAT_ERROR_OK;
}