/* * QEMU Crypto hmac algorithms * * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD. * * 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_HMAC_H #define QCRYPTO_HMAC_H #include "qapi/qapi-types-crypto.h" typedef struct QCryptoHmac QCryptoHmac; struct QCryptoHmac { QCryptoHashAlgo alg; void *opaque; void *driver; }; /** * qcrypto_hmac_supports: * @alg: the hmac algorithm * * Determine if @alg hmac algorithm is supported by * the current configured build * * Returns: * true if the algorithm is supported, false otherwise */ bool qcrypto_hmac_supports(QCryptoHashAlgo alg); /** * qcrypto_hmac_new: * @alg: the hmac algorithm * @key: the key bytes * @nkey: the length of @key * @errp: pointer to a NULL-initialized error object * * Creates a new hmac object with the algorithm @alg * * The @key parameter provides the bytes representing * the secret key to use. The @nkey parameter specifies * the length of @key in bytes * * Note: must use qcrypto_hmac_free() to release the * returned hmac object when no longer required * * Returns: * a new hmac object, or NULL on error */ QCryptoHmac *qcrypto_hmac_new(QCryptoHashAlgo alg, const uint8_t *key, size_t nkey, Error **errp); /** * qcrypto_hmac_free: * @hmac: the hmac object * * Release the memory associated with @hmac that was * previously allocated by qcrypto_hmac_new() */ void qcrypto_hmac_free(QCryptoHmac *hmac); G_DEFINE_AUTOPTR_CLEANUP_FUNC(QCryptoHmac, qcrypto_hmac_free) /** * qcrypto_hmac_bytesv: * @hmac: the hmac object * @iov: the array of memory regions to hmac * @niov: the length of @iov * @result: pointer to hold output hmac * @resultlen: pointer to hold length of @result * @errp: pointer to a NULL-initialized error object * * Computes the hmac across all the memory regions * present in @iov. * * If @result_len is set to a non-zero value by the caller, then * @result must hold a pointer that is @result_len in size, and * @result_len match the size of the hash output. The digest will * be written into @result. * * If @result_len is set to zero, then this function will allocate * a buffer to hold the hash output digest, storing a pointer to * the buffer in @result, and setting @result_len to its size. * The memory referenced in @result must be released with a call * to g_free() when no longer required by the caller. * * Returns: * 0 on success, -1 on error */ int qcrypto_hmac_bytesv(QCryptoHmac *hmac, const struct iovec *iov, size_t niov, uint8_t **result, size_t *resultlen, Error **errp); /** * qcrypto_hmac_bytes: * @hmac: the hmac object * @buf: the memory region to hmac * @len: the length of @buf * @result: pointer to hold output hmac * @resultlen: pointer to hold length of @result * @errp: pointer to a NULL-initialized error object * * Computes the hmac across all the memory region * @buf of length @len. * * If @result_len is set to a non-zero value by the caller, then * @result must hold a pointer that is @result_len in size, and * @result_len match the size of the hash output. The digest will * be written into @result. * * If @result_len is set to zero, then this function will allocate * a buffer to hold the hash output digest, storing a pointer to * the buffer in @result, and setting @result_len to its size. * The memory referenced in @result must be released with a call * to g_free() when no longer required by the caller. * * Returns: * 0 on success, -1 on error */ int qcrypto_hmac_bytes(QCryptoHmac *hmac, const char *buf, size_t len, uint8_t **result, size_t *resultlen, Error **errp); /** * qcrypto_hmac_digestv: * @hmac: the hmac object * @iov: the array of memory regions to hmac * @niov: the length of @iov * @digest: pointer to hold output hmac * @errp: pointer to a NULL-initialized error object * * Computes the hmac across all the memory regions * present in @iov. The @digest pointer will be * filled with the printable hex digest of the computed * hmac, which will be terminated by '\0'. The * memory pointer in @digest must be released * with a call to g_free() when no longer required. * * Returns: * 0 on success, -1 on error */ int qcrypto_hmac_digestv(QCryptoHmac *hmac, const struct iovec *iov, size_t niov, char **digest, Error **errp); /** * qcrypto_hmac_digest: * @hmac: the hmac object * @buf: the memory region to hmac * @len: the length of @buf * @digest: pointer to hold output hmac * @errp: pointer to a NULL-initialized error object * * Computes the hmac across all the memory region * @buf of length @len. The @digest pointer will be * filled with the printable hex digest of the computed * hmac, which will be terminated by '\0'. The * memory pointer in @digest must be released * with a call to g_free() when no longer required. * * Returns: 0 on success, -1 on error */ int qcrypto_hmac_digest(QCryptoHmac *hmac, const char *buf, size_t len, char **digest, Error **errp); #endif