in lib/auth/athenz/ZTSClient.cc [209:288]
const std::string ZTSClient::getPrincipalToken() const {
// construct unsigned principal token
std::string unsignedTokenString = "v=S1";
char host[BUFSIZ] = {};
long long t = (long long)time(NULL);
gethostname(host, sizeof(host));
unsignedTokenString += ";d=" + tenantDomain_;
unsignedTokenString += ";n=" + tenantService_;
unsignedTokenString += ";h=" + std::string(host);
unsignedTokenString += ";a=" + getSalt();
unsignedTokenString += ";t=" + std::to_string(t);
unsignedTokenString += ";e=" + std::to_string(t + PRINCIPAL_TOKEN_EXPIRATION_TIME_SEC);
unsignedTokenString += ";k=" + keyId_;
LOG_DEBUG("Created unsigned principal token: " << unsignedTokenString);
// signing
const char *unsignedToken = unsignedTokenString.c_str();
unsigned char signature[BUFSIZ] = {};
unsigned char hash[SHA256_DIGEST_LENGTH] = {};
unsigned int siglen;
FILE *fp;
RSA *privateKey;
if (privateKeyUri_.scheme == "data") {
if (privateKeyUri_.mediaTypeAndEncodingType != "application/x-pem-file;base64") {
LOG_ERROR("Unsupported mediaType or encodingType: " << privateKeyUri_.mediaTypeAndEncodingType);
return "";
}
char *decodeStr = base64Decode(privateKeyUri_.data.c_str());
if (decodeStr == NULL) {
LOG_ERROR("Failed to decode privateKey");
return "";
}
BIO *bio = BIO_new_mem_buf((void *)decodeStr, -1);
BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
if (bio == NULL) {
LOG_ERROR("Failed to create key BIO");
free(decodeStr);
return "";
}
privateKey = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL);
BIO_free(bio);
free(decodeStr);
if (privateKey == NULL) {
LOG_ERROR("Failed to load privateKey");
return "";
}
} else if (privateKeyUri_.scheme == "file") {
fp = fopen(privateKeyUri_.path.c_str(), "r");
if (fp == NULL) {
LOG_ERROR("Failed to open athenz private key file: " << privateKeyUri_.path);
return "";
}
privateKey = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL);
fclose(fp);
if (privateKey == NULL) {
LOG_ERROR("Failed to read private key: " << privateKeyUri_.path);
return "";
}
} else {
LOG_ERROR("URI scheme not supported in privateKey: " << privateKeyUri_.scheme);
return "";
}
SHA256((unsigned char *)unsignedToken, unsignedTokenString.length(), hash);
RSA_sign(NID_sha256, hash, SHA256_DIGEST_LENGTH, signature, &siglen, privateKey);
std::string principalToken = unsignedTokenString + ";s=" + ybase64Encode(signature, siglen);
LOG_DEBUG("Created signed principal token: " << principalToken);
RSA_free(privateKey);
return principalToken;
}