123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343 |
- /*
- * QEMU Crypto hash algorithms
- *
- * Copyright (c) 2024 Seagate Technology LLC and/or its Affiliates
- * Copyright (c) 2015 Red Hat, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, see <http://www.gnu.org/licenses/>.
- *
- */
- #ifndef QCRYPTO_HASH_H
- #define QCRYPTO_HASH_H
- #include "qapi/qapi-types-crypto.h"
- #define QCRYPTO_HASH_DIGEST_LEN_MD5 16
- #define QCRYPTO_HASH_DIGEST_LEN_SHA1 20
- #define QCRYPTO_HASH_DIGEST_LEN_SHA224 28
- #define QCRYPTO_HASH_DIGEST_LEN_SHA256 32
- #define QCRYPTO_HASH_DIGEST_LEN_SHA384 48
- #define QCRYPTO_HASH_DIGEST_LEN_SHA512 64
- #define QCRYPTO_HASH_DIGEST_LEN_RIPEMD160 20
- #define QCRYPTO_HASH_DIGEST_LEN_SM3 32
- /* See also "QCryptoHashAlgo" defined in qapi/crypto.json */
- typedef struct QCryptoHash QCryptoHash;
- struct QCryptoHash {
- QCryptoHashAlgo alg;
- void *opaque;
- void *driver;
- };
- /**
- * qcrypto_hash_supports:
- * @alg: the hash algorithm
- *
- * Determine if @alg hash algorithm is supported by the
- * current configured build.
- *
- * Returns: true if the algorithm is supported, false otherwise
- */
- gboolean qcrypto_hash_supports(QCryptoHashAlgo alg);
- /**
- * qcrypto_hash_digest_len:
- * @alg: the hash algorithm
- *
- * Determine the size of the hash digest in bytes
- *
- * Returns: the digest length in bytes
- */
- size_t qcrypto_hash_digest_len(QCryptoHashAlgo alg);
- /**
- * qcrypto_hash_bytesv:
- * @alg: the hash algorithm
- * @iov: the array of memory regions to hash
- * @niov: the length of @iov
- * @result: pointer to hold output hash
- * @resultlen: pointer to hold length of @result
- * @errp: pointer to a NULL-initialized error object
- *
- * Computes the hash 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_hash_bytesv(QCryptoHashAlgo alg,
- const struct iovec *iov,
- size_t niov,
- uint8_t **result,
- size_t *resultlen,
- Error **errp);
- /**
- * qcrypto_hash_bytes:
- * @alg: the hash algorithm
- * @buf: the memory region to hash
- * @len: the length of @buf
- * @result: pointer to hold output hash
- * @resultlen: pointer to hold length of @result
- * @errp: pointer to a NULL-initialized error object
- *
- * Computes the hash 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_hash_bytes(QCryptoHashAlgo alg,
- const char *buf,
- size_t len,
- uint8_t **result,
- size_t *resultlen,
- Error **errp);
- /**
- * qcrypto_hash_digestv:
- * @alg: the hash algorithm
- * @iov: the array of memory regions to hash
- * @niov: the length of @iov
- * @digest: pointer to hold output hash
- * @errp: pointer to a NULL-initialized error object
- *
- * Computes the hash across all the memory regions
- * present in @iov. The @digest pointer will be
- * filled with the printable hex digest of the computed
- * hash, 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_hash_digestv(QCryptoHashAlgo alg,
- const struct iovec *iov,
- size_t niov,
- char **digest,
- Error **errp);
- /**
- * qcrypto_hash_updatev:
- * @hash: hash object from qcrypto_hash_new
- * @iov: the array of memory regions to hash
- * @niov: the length of @iov
- * @errp: pointer to a NULL-initialized error object
- *
- * Updates the given hash object with all the memory regions
- * present in @iov.
- *
- * Returns: 0 on success, -1 on error
- */
- int qcrypto_hash_updatev(QCryptoHash *hash,
- const struct iovec *iov,
- size_t niov,
- Error **errp);
- /**
- * qcrypto_hash_update:
- * @hash: hash object from qcrypto_hash_new
- * @buf: the memory region to hash
- * @len: the length of @buf
- * @errp: pointer to a NULL-initialized error object
- *
- * Updates the given hash object with the data from
- * the given buffer.
- *
- * Returns: 0 on success, -1 on error
- */
- int qcrypto_hash_update(QCryptoHash *hash,
- const char *buf,
- size_t len,
- Error **errp);
- /**
- * qcrypto_hash_finalize_digest:
- * @hash: the hash object to finalize
- * @digest: pointer to hold output hash
- * @errp: pointer to a NULL-initialized error object
- *
- * Computes the hash from the given hash object. Hash object
- * is expected to have its data updated from the qcrypto_hash_update function.
- * The @digest pointer will be filled with the printable hex digest of the
- * computed hash, 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_hash_finalize_digest(QCryptoHash *hash,
- char **digest,
- Error **errp);
- /**
- * qcrypto_hash_finalize_base64:
- * @hash_ctx: hash object to finalize
- * @base64: pointer to store the hash result in
- * @errp: pointer to a NULL-initialized error object
- *
- * Computes the hash from the given hash object. Hash object
- * is expected to have it's data updated from the qcrypto_hash_update function.
- * The @base64 pointer will be filled with the base64 encoding of the computed
- * hash, which will be terminated by '\0'. The memory pointer in @base64
- * must be released with a call to g_free() when no longer required.
- *
- * Returns: 0 on success, -1 on error
- */
- int qcrypto_hash_finalize_base64(QCryptoHash *hash,
- char **base64,
- Error **errp);
- /**
- * qcrypto_hash_finalize_bytes:
- * @hash_ctx: hash object to finalize
- * @result: pointer to store the hash result in
- * @result_len: Pointer to store the length of the result in
- * @errp: pointer to a NULL-initialized error object
- *
- * Computes the hash from the given hash object. Hash object
- * is expected to have it's data updated from the qcrypto_hash_update function.
- *
- * 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_hash_finalize_bytes(QCryptoHash *hash,
- uint8_t **result,
- size_t *result_len,
- Error **errp);
- /**
- * qcrypto_hash_new:
- * @alg: the hash algorithm
- * @errp: pointer to a NULL-initialized error object
- *
- * Creates a new hashing context for the chosen algorithm for
- * usage with qcrypto_hash_update.
- *
- * Returns: New hash object with the given algorithm, or NULL on error.
- */
- QCryptoHash *qcrypto_hash_new(QCryptoHashAlgo alg, Error **errp);
- /**
- * qcrypto_hash_free:
- * @hash: hash object to free
- *
- * Frees a hashing context for the chosen algorithm.
- */
- void qcrypto_hash_free(QCryptoHash *hash);
- G_DEFINE_AUTOPTR_CLEANUP_FUNC(QCryptoHash, qcrypto_hash_free)
- /**
- * qcrypto_hash_digest:
- * @alg: the hash algorithm
- * @buf: the memory region to hash
- * @len: the length of @buf
- * @digest: pointer to hold output hash
- * @errp: pointer to a NULL-initialized error object
- *
- * Computes the hash across all the memory region
- * @buf of length @len. The @digest pointer will be
- * filled with the printable hex digest of the computed
- * hash, 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_hash_digest(QCryptoHashAlgo alg,
- const char *buf,
- size_t len,
- char **digest,
- Error **errp);
- /**
- * qcrypto_hash_base64v:
- * @alg: the hash algorithm
- * @iov: the array of memory regions to hash
- * @niov: the length of @iov
- * @base64: pointer to hold output hash
- * @errp: pointer to a NULL-initialized error object
- *
- * Computes the hash across all the memory regions
- * present in @iov. The @base64 pointer will be
- * filled with the base64 encoding of the computed
- * hash, which will be terminated by '\0'. The
- * memory pointer in @base64 must be released
- * with a call to g_free() when no longer required.
- *
- * Returns: 0 on success, -1 on error
- */
- int qcrypto_hash_base64v(QCryptoHashAlgo alg,
- const struct iovec *iov,
- size_t niov,
- char **base64,
- Error **errp);
- /**
- * qcrypto_hash_base64:
- * @alg: the hash algorithm
- * @buf: the memory region to hash
- * @len: the length of @buf
- * @base64: pointer to hold output hash
- * @errp: pointer to a NULL-initialized error object
- *
- * Computes the hash across all the memory region
- * @buf of length @len. The @base64 pointer will be
- * filled with the base64 encoding of the computed
- * hash, which will be terminated by '\0'. The
- * memory pointer in @base64 must be released
- * with a call to g_free() when no longer required.
- *
- * Returns: 0 on success, -1 on error
- */
- int qcrypto_hash_base64(QCryptoHashAlgo alg,
- const char *buf,
- size_t len,
- char **base64,
- Error **errp);
- #endif /* QCRYPTO_HASH_H */
|