static ADUC_Result ParseRootKey()

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;
}