in cvm-securekey-release-app/AttestationUtil.cpp [218:287]
std::string Util::GetIMDSToken(const std::string &KEKUrl)
{
TRACE_OUT("Entering Util::GetIMDSToken()");
CURL *curl = curl_easy_init();
if (!curl)
{
TRACE_ERROR_EXIT("curl_easy_init() failed")
}
// AKV and mHSM has different audience need to be passed to IMDS.
std::string resourceUrl = getResourceUrl(KEKUrl);
CURLcode curlRet = curl_easy_setopt(curl, CURLOPT_URL, GetImdsTokenUrl(resourceUrl).c_str());
if (curlRet != CURLE_OK)
{
TRACE_ERROR_EXIT("curl_easy_setopt() failed")
}
// ByPassing proxy for IMDS.
// ref: https://learn.microsoft.com/en-us/azure/virtual-machines/instance-metadata-service?tabs=windows
curlRet = curl_easy_setopt(curl, CURLOPT_PROXY, "");
if (curlRet != CURLE_OK)
{
std::ostringstream oss;
oss << "curl_easy_setopt() failed: " << curl_easy_strerror(curlRet);
TRACE_ERROR_EXIT(oss.str().c_str())
}
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Metadata: true");
curlRet = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
if (curlRet != CURLE_OK)
{
TRACE_ERROR_EXIT("curl_easy_setopt() failed\n")
}
curlRet = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlWriteCallback);
if (curlRet != CURLE_OK)
{
TRACE_ERROR_EXIT("curl_easy_setopt() failed")
}
std::string responseStr;
curlRet = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &responseStr);
if (curlRet != CURLE_OK)
{
std::ostringstream oss;
oss << "curl_easy_setopt() failed: " << curl_easy_strerror(curlRet);
TRACE_ERROR_EXIT(oss.str().c_str())
}
curlRet = curl_easy_perform(curl);
if (curlRet != CURLE_OK)
{
std::ostringstream oss;
oss << "curl_easy_perform() failed: " << curl_easy_strerror(curlRet);
TRACE_ERROR_EXIT(oss.str().c_str())
}
curl_easy_cleanup(curl);
TRACE_OUT("Response: %s\n", Util::reduct_log(responseStr).c_str());
json json_object = json::parse(responseStr.c_str());
std::string access_token = json_object["access_token"].get<std::string>();
TRACE_OUT("Access Token: %s\n", Util::reduct_log(access_token).c_str());
TRACE_OUT("Exiting Util::GetIMDSToken()");
return access_token;
}