1ddbb0d09SDaniel P. Berrange /* 2ddbb0d09SDaniel P. Berrange * QEMU Crypto hash algorithms 3ddbb0d09SDaniel P. Berrange * 4ddbb0d09SDaniel P. Berrange * Copyright (c) 2015 Red Hat, Inc. 5ddbb0d09SDaniel P. Berrange * 6ddbb0d09SDaniel P. Berrange * This library is free software; you can redistribute it and/or 7ddbb0d09SDaniel P. Berrange * modify it under the terms of the GNU Lesser General Public 8ddbb0d09SDaniel P. Berrange * License as published by the Free Software Foundation; either 9*b7cbb874SThomas Huth * version 2.1 of the License, or (at your option) any later version. 10ddbb0d09SDaniel P. Berrange * 11ddbb0d09SDaniel P. Berrange * This library is distributed in the hope that it will be useful, 12ddbb0d09SDaniel P. Berrange * but WITHOUT ANY WARRANTY; without even the implied warranty of 13ddbb0d09SDaniel P. Berrange * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14ddbb0d09SDaniel P. Berrange * Lesser General Public License for more details. 15ddbb0d09SDaniel P. Berrange * 16ddbb0d09SDaniel P. Berrange * You should have received a copy of the GNU Lesser General Public 17ddbb0d09SDaniel P. Berrange * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18ddbb0d09SDaniel P. Berrange * 19ddbb0d09SDaniel P. Berrange */ 20ddbb0d09SDaniel P. Berrange 212a6a4076SMarkus Armbruster #ifndef QCRYPTO_HASH_H 222a6a4076SMarkus Armbruster #define QCRYPTO_HASH_H 23ddbb0d09SDaniel P. Berrange 249af23989SMarkus Armbruster #include "qapi/qapi-types-crypto.h" 25ddbb0d09SDaniel P. Berrange 26d84b79d3SDaniel P. Berrange /* See also "QCryptoHashAlgorithm" defined in qapi/crypto.json */ 27ddbb0d09SDaniel P. Berrange 28ddbb0d09SDaniel P. Berrange /** 29ddbb0d09SDaniel P. Berrange * qcrypto_hash_supports: 30ddbb0d09SDaniel P. Berrange * @alg: the hash algorithm 31ddbb0d09SDaniel P. Berrange * 32ddbb0d09SDaniel P. Berrange * Determine if @alg hash algorithm is supported by the 33ddbb0d09SDaniel P. Berrange * current configured build. 34ddbb0d09SDaniel P. Berrange * 35ddbb0d09SDaniel P. Berrange * Returns: true if the algorithm is supported, false otherwise 36ddbb0d09SDaniel P. Berrange */ 37ddbb0d09SDaniel P. Berrange gboolean qcrypto_hash_supports(QCryptoHashAlgorithm alg); 38ddbb0d09SDaniel P. Berrange 397b36064cSDaniel P. Berrange 407b36064cSDaniel P. Berrange /** 417b36064cSDaniel P. Berrange * qcrypto_hash_digest_len: 427b36064cSDaniel P. Berrange * @alg: the hash algorithm 437b36064cSDaniel P. Berrange * 447b36064cSDaniel P. Berrange * Determine the size of the hash digest in bytes 457b36064cSDaniel P. Berrange * 467b36064cSDaniel P. Berrange * Returns: the digest length in bytes 477b36064cSDaniel P. Berrange */ 487b36064cSDaniel P. Berrange size_t qcrypto_hash_digest_len(QCryptoHashAlgorithm alg); 497b36064cSDaniel P. Berrange 50ddbb0d09SDaniel P. Berrange /** 51ddbb0d09SDaniel P. Berrange * qcrypto_hash_bytesv: 52ddbb0d09SDaniel P. Berrange * @alg: the hash algorithm 53ddbb0d09SDaniel P. Berrange * @iov: the array of memory regions to hash 54ddbb0d09SDaniel P. Berrange * @niov: the length of @iov 55ddbb0d09SDaniel P. Berrange * @result: pointer to hold output hash 56ddbb0d09SDaniel P. Berrange * @resultlen: pointer to hold length of @result 5707982d2eSDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 58ddbb0d09SDaniel P. Berrange * 59ddbb0d09SDaniel P. Berrange * Computes the hash across all the memory regions 60ddbb0d09SDaniel P. Berrange * present in @iov. The @result pointer will be 61ddbb0d09SDaniel P. Berrange * filled with raw bytes representing the computed 62ddbb0d09SDaniel P. Berrange * hash, which will have length @resultlen. The 63ddbb0d09SDaniel P. Berrange * memory pointer in @result must be released 64ddbb0d09SDaniel P. Berrange * with a call to g_free() when no longer required. 65ddbb0d09SDaniel P. Berrange * 66ddbb0d09SDaniel P. Berrange * Returns: 0 on success, -1 on error 67ddbb0d09SDaniel P. Berrange */ 68ddbb0d09SDaniel P. Berrange int qcrypto_hash_bytesv(QCryptoHashAlgorithm alg, 69ddbb0d09SDaniel P. Berrange const struct iovec *iov, 70ddbb0d09SDaniel P. Berrange size_t niov, 71ddbb0d09SDaniel P. Berrange uint8_t **result, 72ddbb0d09SDaniel P. Berrange size_t *resultlen, 73ddbb0d09SDaniel P. Berrange Error **errp); 74ddbb0d09SDaniel P. Berrange 75ddbb0d09SDaniel P. Berrange /** 76ddbb0d09SDaniel P. Berrange * qcrypto_hash_bytes: 77ddbb0d09SDaniel P. Berrange * @alg: the hash algorithm 78ddbb0d09SDaniel P. Berrange * @buf: the memory region to hash 79ddbb0d09SDaniel P. Berrange * @len: the length of @buf 80ddbb0d09SDaniel P. Berrange * @result: pointer to hold output hash 81ddbb0d09SDaniel P. Berrange * @resultlen: pointer to hold length of @result 8207982d2eSDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 83ddbb0d09SDaniel P. Berrange * 84ddbb0d09SDaniel P. Berrange * Computes the hash across all the memory region 85ddbb0d09SDaniel P. Berrange * @buf of length @len. The @result pointer will be 86ddbb0d09SDaniel P. Berrange * filled with raw bytes representing the computed 87ddbb0d09SDaniel P. Berrange * hash, which will have length @resultlen. The 88ddbb0d09SDaniel P. Berrange * memory pointer in @result must be released 89ddbb0d09SDaniel P. Berrange * with a call to g_free() when no longer required. 90ddbb0d09SDaniel P. Berrange * 91ddbb0d09SDaniel P. Berrange * Returns: 0 on success, -1 on error 92ddbb0d09SDaniel P. Berrange */ 93ddbb0d09SDaniel P. Berrange int qcrypto_hash_bytes(QCryptoHashAlgorithm alg, 94ddbb0d09SDaniel P. Berrange const char *buf, 95ddbb0d09SDaniel P. Berrange size_t len, 96ddbb0d09SDaniel P. Berrange uint8_t **result, 97ddbb0d09SDaniel P. Berrange size_t *resultlen, 98ddbb0d09SDaniel P. Berrange Error **errp); 99ddbb0d09SDaniel P. Berrange 100ddbb0d09SDaniel P. Berrange /** 101ddbb0d09SDaniel P. Berrange * qcrypto_hash_digestv: 102ddbb0d09SDaniel P. Berrange * @alg: the hash algorithm 103ddbb0d09SDaniel P. Berrange * @iov: the array of memory regions to hash 104ddbb0d09SDaniel P. Berrange * @niov: the length of @iov 105ddbb0d09SDaniel P. Berrange * @digest: pointer to hold output hash 10607982d2eSDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 107ddbb0d09SDaniel P. Berrange * 108ddbb0d09SDaniel P. Berrange * Computes the hash across all the memory regions 109ddbb0d09SDaniel P. Berrange * present in @iov. The @digest pointer will be 110ddbb0d09SDaniel P. Berrange * filled with the printable hex digest of the computed 111ddbb0d09SDaniel P. Berrange * hash, which will be terminated by '\0'. The 112ddbb0d09SDaniel P. Berrange * memory pointer in @digest must be released 113ddbb0d09SDaniel P. Berrange * with a call to g_free() when no longer required. 114ddbb0d09SDaniel P. Berrange * 115ddbb0d09SDaniel P. Berrange * Returns: 0 on success, -1 on error 116ddbb0d09SDaniel P. Berrange */ 117ddbb0d09SDaniel P. Berrange int qcrypto_hash_digestv(QCryptoHashAlgorithm alg, 118ddbb0d09SDaniel P. Berrange const struct iovec *iov, 119ddbb0d09SDaniel P. Berrange size_t niov, 120ddbb0d09SDaniel P. Berrange char **digest, 121ddbb0d09SDaniel P. Berrange Error **errp); 122ddbb0d09SDaniel P. Berrange 123ddbb0d09SDaniel P. Berrange /** 124ddbb0d09SDaniel P. Berrange * qcrypto_hash_digest: 125ddbb0d09SDaniel P. Berrange * @alg: the hash algorithm 126ddbb0d09SDaniel P. Berrange * @buf: the memory region to hash 127ddbb0d09SDaniel P. Berrange * @len: the length of @buf 128ddbb0d09SDaniel P. Berrange * @digest: pointer to hold output hash 12907982d2eSDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 130ddbb0d09SDaniel P. Berrange * 131ddbb0d09SDaniel P. Berrange * Computes the hash across all the memory region 132ddbb0d09SDaniel P. Berrange * @buf of length @len. The @digest pointer will be 133ddbb0d09SDaniel P. Berrange * filled with the printable hex digest of the computed 134ddbb0d09SDaniel P. Berrange * hash, which will be terminated by '\0'. The 135ddbb0d09SDaniel P. Berrange * memory pointer in @digest must be released 136ddbb0d09SDaniel P. Berrange * with a call to g_free() when no longer required. 137ddbb0d09SDaniel P. Berrange * 138ddbb0d09SDaniel P. Berrange * Returns: 0 on success, -1 on error 139ddbb0d09SDaniel P. Berrange */ 140ddbb0d09SDaniel P. Berrange int qcrypto_hash_digest(QCryptoHashAlgorithm alg, 141ddbb0d09SDaniel P. Berrange const char *buf, 142ddbb0d09SDaniel P. Berrange size_t len, 143ddbb0d09SDaniel P. Berrange char **digest, 144ddbb0d09SDaniel P. Berrange Error **errp); 145ddbb0d09SDaniel P. Berrange 146ddbb0d09SDaniel P. Berrange /** 147ddbb0d09SDaniel P. Berrange * qcrypto_hash_base64v: 148ddbb0d09SDaniel P. Berrange * @alg: the hash algorithm 149ddbb0d09SDaniel P. Berrange * @iov: the array of memory regions to hash 150ddbb0d09SDaniel P. Berrange * @niov: the length of @iov 151ddbb0d09SDaniel P. Berrange * @base64: pointer to hold output hash 15207982d2eSDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 153ddbb0d09SDaniel P. Berrange * 154ddbb0d09SDaniel P. Berrange * Computes the hash across all the memory regions 155ddbb0d09SDaniel P. Berrange * present in @iov. The @base64 pointer will be 156ddbb0d09SDaniel P. Berrange * filled with the base64 encoding of the computed 157ddbb0d09SDaniel P. Berrange * hash, which will be terminated by '\0'. The 158ddbb0d09SDaniel P. Berrange * memory pointer in @base64 must be released 159ddbb0d09SDaniel P. Berrange * with a call to g_free() when no longer required. 160ddbb0d09SDaniel P. Berrange * 161ddbb0d09SDaniel P. Berrange * Returns: 0 on success, -1 on error 162ddbb0d09SDaniel P. Berrange */ 163ddbb0d09SDaniel P. Berrange int qcrypto_hash_base64v(QCryptoHashAlgorithm alg, 164ddbb0d09SDaniel P. Berrange const struct iovec *iov, 165ddbb0d09SDaniel P. Berrange size_t niov, 166ddbb0d09SDaniel P. Berrange char **base64, 167ddbb0d09SDaniel P. Berrange Error **errp); 168ddbb0d09SDaniel P. Berrange 169ddbb0d09SDaniel P. Berrange /** 170ddbb0d09SDaniel P. Berrange * qcrypto_hash_base64: 171ddbb0d09SDaniel P. Berrange * @alg: the hash algorithm 172ddbb0d09SDaniel P. Berrange * @buf: the memory region to hash 173ddbb0d09SDaniel P. Berrange * @len: the length of @buf 174ddbb0d09SDaniel P. Berrange * @base64: pointer to hold output hash 17507982d2eSDaniel P. Berrange * @errp: pointer to a NULL-initialized error object 176ddbb0d09SDaniel P. Berrange * 177ddbb0d09SDaniel P. Berrange * Computes the hash across all the memory region 178ddbb0d09SDaniel P. Berrange * @buf of length @len. The @base64 pointer will be 179ddbb0d09SDaniel P. Berrange * filled with the base64 encoding of the computed 180ddbb0d09SDaniel P. Berrange * hash, which will be terminated by '\0'. The 181ddbb0d09SDaniel P. Berrange * memory pointer in @base64 must be released 182ddbb0d09SDaniel P. Berrange * with a call to g_free() when no longer required. 183ddbb0d09SDaniel P. Berrange * 184ddbb0d09SDaniel P. Berrange * Returns: 0 on success, -1 on error 185ddbb0d09SDaniel P. Berrange */ 186ddbb0d09SDaniel P. Berrange int qcrypto_hash_base64(QCryptoHashAlgorithm alg, 187ddbb0d09SDaniel P. Berrange const char *buf, 188ddbb0d09SDaniel P. Berrange size_t len, 189ddbb0d09SDaniel P. Berrange char **base64, 190ddbb0d09SDaniel P. Berrange Error **errp); 191ddbb0d09SDaniel P. Berrange 1922a6a4076SMarkus Armbruster #endif /* QCRYPTO_HASH_H */ 193