/*
 * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#include <openssl/core_dispatch.h>
#include "crypto/types.h"
#include "prov/skeymgmt_lcl.h"
#include "internal/skey.h"
#include "prov/implementations.h"

static OSSL_FUNC_skeymgmt_import_fn aes_import;
static OSSL_FUNC_skeymgmt_export_fn aes_export;

static void *aes_import(void *provctx, int selection,
    const OSSL_PARAM params[])
{
    PROV_SKEY *aes = generic_import(provctx, selection, params);

    if (aes == NULL)
        return NULL;

    if (aes->length != 16 && aes->length != 24 && aes->length != 32) {
        generic_free(aes);
        return NULL;
    }
    aes->type = SKEY_TYPE_AES;

    return aes;
}

static int aes_export(void *keydata, int selection,
    OSSL_CALLBACK *param_callback, void *cbarg)
{
    PROV_SKEY *aes = keydata;

    if (aes->type != SKEY_TYPE_AES)
        return 0;

    return generic_export(keydata, selection, param_callback, cbarg);
}

const OSSL_DISPATCH ossl_aes_skeymgmt_functions[] = {
    { OSSL_FUNC_SKEYMGMT_FREE, (void (*)(void))generic_free },
    { OSSL_FUNC_SKEYMGMT_IMPORT, (void (*)(void))aes_import },
    { OSSL_FUNC_SKEYMGMT_EXPORT, (void (*)(void))aes_export },
    { OSSL_FUNC_SKEYMGMT_IMP_SETTABLE_PARAMS,
        (void (*)(void))generic_imp_settable_params },
    OSSL_DISPATCH_END
};
