in src/utils/rootkeypackage_utils/src/rootkeypackage_parse.c [565:689]
static ADUC_Result ParseRootKey(JSON_Object* rootKeysObj, size_t index, VECTOR_HANDLE* outRootKeys)
{
ADUC_Result result = { .ResultCode = ADUC_GeneralResult_Failure, .ExtendedResultCode = 0 };
JSON_Object* rootKeyDefinition = NULL;
STRING_HANDLE kidStrHandle = NULL;
ADUC_RootKey_KeyType keyType = ADUC_RootKey_KeyType_INVALID;
CONSTBUFFER_HANDLE rsa_modulus = NULL;
unsigned int rsa_exponent = 0;
ADUC_RootKey rootKey;
memset(&rootKey, 0, sizeof(rootKey));
size_t modulus_len = 0;
uint8_t* modulus_buf = NULL;
const char* keytypeStr = NULL;
const char* n_modulusStr = NULL;
double e_exponent = INVALID_EXPONENT;
const char* kid = json_object_get_name(rootKeysObj, index);
if (IsNullOrEmpty(kid))
{
result.ExtendedResultCode = ADUC_ERC_UTILITIES_ROOTKEYPKG_PARSE_INVALID_KEY_ID;
goto done;
}
kidStrHandle = STRING_construct(kid);
if (kidStrHandle == NULL)
{
result.ExtendedResultCode = ADUC_ERC_NOMEM;
goto done;
}
rootKeyDefinition = json_object_get_object(rootKeysObj, kid);
if (rootKeyDefinition == NULL)
{
result.ExtendedResultCode = ADUC_ERC_UTILITIES_ROOTKEYPKG_UNEXPECTED;
goto done;
}
keytypeStr = json_object_get_string(rootKeyDefinition, ADUC_ROOTKEY_PACKAGE_PROPERTY_KEY_TYPE);
if (IsNullOrEmpty(keytypeStr))
{
result.ExtendedResultCode = ADUC_ERC_UTILITIES_ROOTKEYPKG_PARSE_MISSING_REQUIRED_PROPERTY_KEYTYPE;
goto done;
}
if (strcmp(keytypeStr, ADUC_ROOTKEY_PACKAGE_PROPERTY_KEY_TYPE_RSA) == 0)
{
keyType = ADUC_RootKey_KeyType_RSA;
n_modulusStr = json_object_get_string(rootKeyDefinition, ADUC_ROOTKEY_PACKAGE_PROPERTY_RSA_MODULUS);
if (IsNullOrEmpty(n_modulusStr))
{
result.ExtendedResultCode = ADUC_ERC_UTILITIES_ROOTKEYPKG_PARSE_INVALID_MODULUS;
goto done;
}
e_exponent = json_object_get_number(rootKeyDefinition, ADUC_ROOTKEY_PACKAGE_PROPERTY_RSA_EXPONENT);
if (e_exponent == INVALID_EXPONENT || ADUC_IS_NUMBER_INVALID(e_exponent))
{
result.ExtendedResultCode = ADUC_ERC_UTILITIES_ROOTKEYPKG_PARSE_INVALID_EXPONENT;
goto done;
}
rsa_exponent = (unsigned int)e_exponent;
modulus_len = Base64URLDecode(n_modulusStr, &modulus_buf);
if (modulus_len == 0)
{
result.ExtendedResultCode = ADUC_ERC_UTILITIES_ROOTKEYPKG_PARSE_INVALID_RSA_PARAMETERS;
goto done;
}
rsa_modulus = CONSTBUFFER_Create(modulus_buf, modulus_len);
if (rsa_modulus == NULL)
{
result.ExtendedResultCode = ADUC_ERC_NOMEM;
goto done;
}
}
else
{
result.ExtendedResultCode = ADUC_ERC_UTILITIES_ROOTKEYPKG_PARSE_UNSUPPORTED_KEYTYPE;
goto done;
}
rootKey.kid = kidStrHandle;
rootKey.keyType = keyType;
rootKey.rsaParameters.n = rsa_modulus;
rootKey.rsaParameters.e = rsa_exponent;
if (VECTOR_push_back(*outRootKeys, &rootKey, 1) != 0)
{
result.ExtendedResultCode = ADUC_ERC_NOMEM;
goto done;
}
// commit transfer
kidStrHandle = NULL;
rsa_modulus = NULL;
memset(&rootKey, 0, sizeof(rootKey));
result.ResultCode = ADUC_GeneralResult_Success;
done:
if (kidStrHandle != NULL)
{
STRING_delete(kidStrHandle);
}
free(modulus_buf);
if (rsa_modulus != NULL)
{
CONSTBUFFER_DecRef(rsa_modulus);
}
if (IsAducResultCodeFailure(result.ResultCode))
{
Log_Error("Failed parse of rootkey, ERC %d", result.ResultCode);
}
return result;
}