/*
 * QEMU Crypto hmac driver supports
 *
 * Copyright (c) 2017 HUAWEI TECHNOLOGIES CO., LTD.
 *
 * Authors:
 *    Longpeng(Mike) <longpeng2@huawei.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or
 * (at your option) any later version.  See the COPYING file in the
 * top-level directory.
 *
 */

#ifndef QCRYPTO_HMACPRIV_H
#define QCRYPTO_HMACPRIV_H

typedef struct QCryptoHmacDriver QCryptoHmacDriver;

struct QCryptoHmacDriver {
    int (*hmac_bytesv)(QCryptoHmac *hmac,
                       const struct iovec *iov,
                       size_t niov,
                       uint8_t **result,
                       size_t *resultlen,
                       Error **errp);

    void (*hmac_free)(QCryptoHmac *hmac);
};

void *qcrypto_hmac_ctx_new(QCryptoHashAlgorithm alg,
                           const uint8_t *key, size_t nkey,
                           Error **errp);
extern QCryptoHmacDriver qcrypto_hmac_lib_driver;

#ifdef CONFIG_AF_ALG

#include "afalgpriv.h"

QCryptoAFAlg *qcrypto_afalg_hmac_ctx_new(QCryptoHashAlgorithm alg,
                                         const uint8_t *key, size_t nkey,
                                         Error **errp);
extern QCryptoHmacDriver qcrypto_hmac_afalg_driver;

#endif

#endif
