xref: /qemu/include/crypto/hmac.h (revision 006ca09f)
1 /*
2  * QEMU Crypto hmac algorithms
3  *
4  * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD.
5  *
6  * This work is licensed under the terms of the GNU GPL, version 2 or
7  * (at your option) any later version.  See the COPYING file in the
8  * top-level directory.
9  *
10  */
11 
12 #ifndef QCRYPTO_HMAC_H
13 #define QCRYPTO_HMAC_H
14 
15 #include "qapi-types.h"
16 
17 typedef struct QCryptoHmac QCryptoHmac;
18 struct QCryptoHmac {
19     QCryptoHashAlgorithm alg;
20     void *opaque;
21     void *driver;
22 };
23 
24 /**
25  * qcrypto_hmac_supports:
26  * @alg: the hmac algorithm
27  *
28  * Determine if @alg hmac algorithm is supported by
29  * the current configured build
30  *
31  * Returns:
32  *  true if the algorithm is supported, false otherwise
33  */
34 bool qcrypto_hmac_supports(QCryptoHashAlgorithm alg);
35 
36 /**
37  * qcrypto_hmac_new:
38  * @alg: the hmac algorithm
39  * @key: the key bytes
40  * @nkey: the length of @key
41  * @errp: pointer to a NULL-initialized error object
42  *
43  * Creates a new hmac object with the algorithm @alg
44  *
45  * The @key parameter provides the bytes representing
46  * the secret key to use. The @nkey parameter specifies
47  * the length of @key in bytes
48  *
49  * Note: must use qcrypto_hmac_free() to release the
50  * returned hmac object when no longer required
51  *
52  * Returns:
53  *  a new hmac object, or NULL on error
54  */
55 QCryptoHmac *qcrypto_hmac_new(QCryptoHashAlgorithm alg,
56                               const uint8_t *key, size_t nkey,
57                               Error **errp);
58 
59 /**
60  * qcrypto_hmac_free:
61  * @hmac: the hmac object
62  *
63  * Release the memory associated with @hmac that was
64  * previously allocated by qcrypto_hmac_new()
65  */
66 void qcrypto_hmac_free(QCryptoHmac *hmac);
67 
68 /**
69  * qcrypto_hmac_bytesv:
70  * @hmac: the hmac object
71  * @iov: the array of memory regions to hmac
72  * @niov: the length of @iov
73  * @result: pointer to hold output hmac
74  * @resultlen: pointer to hold length of @result
75  * @errp: pointer to a NULL-initialized error object
76  *
77  * Computes the hmac across all the memory regions
78  * present in @iov. The @result pointer will be
79  * filled with raw bytes representing the computed
80  * hmac, which will have length @resultlen. The
81  * memory pointer in @result must be released
82  * with a call to g_free() when no longer required.
83  *
84  * Returns:
85  *  0 on success, -1 on error
86  */
87 int qcrypto_hmac_bytesv(QCryptoHmac *hmac,
88                         const struct iovec *iov,
89                         size_t niov,
90                         uint8_t **result,
91                         size_t *resultlen,
92                         Error **errp);
93 
94 /**
95  * qcrypto_hmac_bytes:
96  * @hmac: the hmac object
97  * @buf: the memory region to hmac
98  * @len: the length of @buf
99  * @result: pointer to hold output hmac
100  * @resultlen: pointer to hold length of @result
101  * @errp: pointer to a NULL-initialized error object
102  *
103  * Computes the hmac across all the memory region
104  * @buf of length @len. The @result pointer will be
105  * filled with raw bytes representing the computed
106  * hmac, which will have length @resultlen. The
107  * memory pointer in @result must be released
108  * with a call to g_free() when no longer required.
109  *
110  * Returns:
111  *  0 on success, -1 on error
112  */
113 int qcrypto_hmac_bytes(QCryptoHmac *hmac,
114                        const char *buf,
115                        size_t len,
116                        uint8_t **result,
117                        size_t *resultlen,
118                        Error **errp);
119 
120 /**
121  * qcrypto_hmac_digestv:
122  * @hmac: the hmac object
123  * @iov: the array of memory regions to hmac
124  * @niov: the length of @iov
125  * @digest: pointer to hold output hmac
126  * @errp: pointer to a NULL-initialized error object
127  *
128  * Computes the hmac across all the memory regions
129  * present in @iov. The @digest pointer will be
130  * filled with the printable hex digest of the computed
131  * hmac, which will be terminated by '\0'. The
132  * memory pointer in @digest must be released
133  * with a call to g_free() when no longer required.
134  *
135  * Returns:
136  *  0 on success, -1 on error
137  */
138 int qcrypto_hmac_digestv(QCryptoHmac *hmac,
139                          const struct iovec *iov,
140                          size_t niov,
141                          char **digest,
142                          Error **errp);
143 
144 /**
145  * qcrypto_hmac_digest:
146  * @hmac: the hmac object
147  * @buf: the memory region to hmac
148  * @len: the length of @buf
149  * @digest: pointer to hold output hmac
150  * @errp: pointer to a NULL-initialized error object
151  *
152  * Computes the hmac across all the memory region
153  * @buf of length @len. The @digest pointer will be
154  * filled with the printable hex digest of the computed
155  * hmac, which will be terminated by '\0'. The
156  * memory pointer in @digest must be released
157  * with a call to g_free() when no longer required.
158  *
159  * Returns: 0 on success, -1 on error
160  */
161 int qcrypto_hmac_digest(QCryptoHmac *hmac,
162                         const char *buf,
163                         size_t len,
164                         char **digest,
165                         Error **errp);
166 
167 #endif
168