2 * QEMU Crypto hash algorithms
4 * Copyright (c) 2024 Seagate Technology LLC and/or its Affiliates
5 * Copyright (c) 2015 Red Hat, Inc.
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
22 #ifndef QCRYPTO_HASH_H
23 #define QCRYPTO_HASH_H
25 #include "qapi/qapi-types-crypto.h"
27 #define QCRYPTO_HASH_DIGEST_LEN_MD5 16
28 #define QCRYPTO_HASH_DIGEST_LEN_SHA1 20
29 #define QCRYPTO_HASH_DIGEST_LEN_SHA224 28
30 #define QCRYPTO_HASH_DIGEST_LEN_SHA256 32
31 #define QCRYPTO_HASH_DIGEST_LEN_SHA384 48
32 #define QCRYPTO_HASH_DIGEST_LEN_SHA512 64
33 #define QCRYPTO_HASH_DIGEST_LEN_RIPEMD160 20
35 /* See also "QCryptoHashAlgo" defined in qapi/crypto.json */
37 typedef struct QCryptoHash QCryptoHash
;
45 * qcrypto_hash_supports:
46 * @alg: the hash algorithm
48 * Determine if @alg hash algorithm is supported by the
49 * current configured build.
51 * Returns: true if the algorithm is supported, false otherwise
53 gboolean
qcrypto_hash_supports(QCryptoHashAlgo alg
);
57 * qcrypto_hash_digest_len:
58 * @alg: the hash algorithm
60 * Determine the size of the hash digest in bytes
62 * Returns: the digest length in bytes
64 size_t qcrypto_hash_digest_len(QCryptoHashAlgo alg
);
67 * qcrypto_hash_bytesv:
68 * @alg: the hash algorithm
69 * @iov: the array of memory regions to hash
70 * @niov: the length of @iov
71 * @result: pointer to hold output hash
72 * @resultlen: pointer to hold length of @result
73 * @errp: pointer to a NULL-initialized error object
75 * Computes the hash across all the memory regions
76 * present in @iov. The @result pointer will be
77 * filled with raw bytes representing the computed
78 * hash, which will have length @resultlen. The
79 * memory pointer in @result must be released
80 * with a call to g_free() when no longer required.
82 * Returns: 0 on success, -1 on error
84 int qcrypto_hash_bytesv(QCryptoHashAlgo alg
,
85 const struct iovec
*iov
,
93 * @alg: the hash algorithm
94 * @buf: the memory region to hash
95 * @len: the length of @buf
96 * @result: pointer to hold output hash
97 * @resultlen: pointer to hold length of @result
98 * @errp: pointer to a NULL-initialized error object
100 * Computes the hash across all the memory region
101 * @buf of length @len. The @result pointer will be
102 * filled with raw bytes representing the computed
103 * hash, which will have length @resultlen. The
104 * memory pointer in @result must be released
105 * with a call to g_free() when no longer required.
107 * Returns: 0 on success, -1 on error
109 int qcrypto_hash_bytes(QCryptoHashAlgo alg
,
117 * qcrypto_hash_digestv:
118 * @alg: the hash algorithm
119 * @iov: the array of memory regions to hash
120 * @niov: the length of @iov
121 * @digest: pointer to hold output hash
122 * @errp: pointer to a NULL-initialized error object
124 * Computes the hash across all the memory regions
125 * present in @iov. The @digest pointer will be
126 * filled with the printable hex digest of the computed
127 * hash, which will be terminated by '\0'. The
128 * memory pointer in @digest must be released
129 * with a call to g_free() when no longer required.
131 * Returns: 0 on success, -1 on error
133 int qcrypto_hash_digestv(QCryptoHashAlgo alg
,
134 const struct iovec
*iov
,
140 * qcrypto_hash_updatev:
141 * @hash: hash object from qcrypto_hash_new
142 * @iov: the array of memory regions to hash
143 * @niov: the length of @iov
144 * @errp: pointer to a NULL-initialized error object
146 * Updates the given hash object with all the memory regions
149 * Returns: 0 on success, -1 on error
151 int qcrypto_hash_updatev(QCryptoHash
*hash
,
152 const struct iovec
*iov
,
156 * qcrypto_hash_update:
157 * @hash: hash object from qcrypto_hash_new
158 * @buf: the memory region to hash
159 * @len: the length of @buf
160 * @errp: pointer to a NULL-initialized error object
162 * Updates the given hash object with the data from
165 * Returns: 0 on success, -1 on error
167 int qcrypto_hash_update(QCryptoHash
*hash
,
173 * qcrypto_hash_finalize_digest:
174 * @hash: the hash object to finalize
175 * @digest: pointer to hold output hash
176 * @errp: pointer to a NULL-initialized error object
178 * Computes the hash from the given hash object. Hash object
179 * is expected to have its data updated from the qcrypto_hash_update function.
180 * The @digest pointer will be filled with the printable hex digest of the
181 * computed hash, which will be terminated by '\0'. The memory pointer
182 * in @digest must be released with a call to g_free() when
183 * no longer required.
185 * Returns: 0 on success, -1 on error
187 int qcrypto_hash_finalize_digest(QCryptoHash
*hash
,
192 * qcrypto_hash_finalize_base64:
193 * @hash_ctx: hash object to finalize
194 * @base64: pointer to store the hash result in
195 * @errp: pointer to a NULL-initialized error object
197 * Computes the hash from the given hash object. Hash object
198 * is expected to have it's data updated from the qcrypto_hash_update function.
199 * The @base64 pointer will be filled with the base64 encoding of the computed
200 * hash, which will be terminated by '\0'. The memory pointer in @base64
201 * must be released with a call to g_free() when no longer required.
203 * Returns: 0 on success, -1 on error
205 int qcrypto_hash_finalize_base64(QCryptoHash
*hash
,
210 * qcrypto_hash_finalize_bytes:
211 * @hash_ctx: hash object to finalize
212 * @result: pointer to store the hash result in
213 * @result_len: Pointer to store the length of the result in
214 * @errp: pointer to a NULL-initialized error object
216 * Computes the hash from the given hash object. Hash object
217 * is expected to have it's data updated from the qcrypto_hash_update function.
218 * The memory pointer in @result must be released with a call to g_free()
219 * when no longer required.
221 * Returns: 0 on success, -1 on error
223 int qcrypto_hash_finalize_bytes(QCryptoHash
*hash
,
230 * @alg: the hash algorithm
231 * @errp: pointer to a NULL-initialized error object
233 * Creates a new hashing context for the chosen algorithm for
234 * usage with qcrypto_hash_update.
236 * Returns: New hash object with the given algorithm, or NULL on error.
238 QCryptoHash
*qcrypto_hash_new(QCryptoHashAlgo alg
, Error
**errp
);
242 * @hash: hash object to free
244 * Frees a hashing context for the chosen algorithm.
246 void qcrypto_hash_free(QCryptoHash
*hash
);
248 G_DEFINE_AUTOPTR_CLEANUP_FUNC(QCryptoHash
, qcrypto_hash_free
)
251 * qcrypto_hash_digest:
252 * @alg: the hash algorithm
253 * @buf: the memory region to hash
254 * @len: the length of @buf
255 * @digest: pointer to hold output hash
256 * @errp: pointer to a NULL-initialized error object
258 * Computes the hash across all the memory region
259 * @buf of length @len. The @digest pointer will be
260 * filled with the printable hex digest of the computed
261 * hash, which will be terminated by '\0'. The
262 * memory pointer in @digest must be released
263 * with a call to g_free() when no longer required.
265 * Returns: 0 on success, -1 on error
267 int qcrypto_hash_digest(QCryptoHashAlgo alg
,
274 * qcrypto_hash_base64v:
275 * @alg: the hash algorithm
276 * @iov: the array of memory regions to hash
277 * @niov: the length of @iov
278 * @base64: pointer to hold output hash
279 * @errp: pointer to a NULL-initialized error object
281 * Computes the hash across all the memory regions
282 * present in @iov. The @base64 pointer will be
283 * filled with the base64 encoding of the computed
284 * hash, which will be terminated by '\0'. The
285 * memory pointer in @base64 must be released
286 * with a call to g_free() when no longer required.
288 * Returns: 0 on success, -1 on error
290 int qcrypto_hash_base64v(QCryptoHashAlgo alg
,
291 const struct iovec
*iov
,
297 * qcrypto_hash_base64:
298 * @alg: the hash algorithm
299 * @buf: the memory region to hash
300 * @len: the length of @buf
301 * @base64: pointer to hold output hash
302 * @errp: pointer to a NULL-initialized error object
304 * Computes the hash across all the memory region
305 * @buf of length @len. The @base64 pointer will be
306 * filled with the base64 encoding of the computed
307 * hash, which will be terminated by '\0'. The
308 * memory pointer in @base64 must be released
309 * with a call to g_free() when no longer required.
311 * Returns: 0 on success, -1 on error
313 int qcrypto_hash_base64(QCryptoHashAlgo alg
,
319 #endif /* QCRYPTO_HASH_H */