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/qapi-types-crypto.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 G_DEFINE_AUTOPTR_CLEANUP_FUNC(QCryptoHmac, qcrypto_hmac_free) 69 70 /** 71 * qcrypto_hmac_bytesv: 72 * @hmac: the hmac object 73 * @iov: the array of memory regions to hmac 74 * @niov: the length of @iov 75 * @result: pointer to hold output hmac 76 * @resultlen: pointer to hold length of @result 77 * @errp: pointer to a NULL-initialized error object 78 * 79 * Computes the hmac across all the memory regions 80 * present in @iov. The @result pointer will be 81 * filled with raw bytes representing the computed 82 * hmac, which will have length @resultlen. The 83 * memory pointer in @result must be released 84 * with a call to g_free() when no longer required. 85 * 86 * Returns: 87 * 0 on success, -1 on error 88 */ 89 int qcrypto_hmac_bytesv(QCryptoHmac *hmac, 90 const struct iovec *iov, 91 size_t niov, 92 uint8_t **result, 93 size_t *resultlen, 94 Error **errp); 95 96 /** 97 * qcrypto_hmac_bytes: 98 * @hmac: the hmac object 99 * @buf: the memory region to hmac 100 * @len: the length of @buf 101 * @result: pointer to hold output hmac 102 * @resultlen: pointer to hold length of @result 103 * @errp: pointer to a NULL-initialized error object 104 * 105 * Computes the hmac across all the memory region 106 * @buf of length @len. The @result pointer will be 107 * filled with raw bytes representing the computed 108 * hmac, which will have length @resultlen. The 109 * memory pointer in @result must be released 110 * with a call to g_free() when no longer required. 111 * 112 * Returns: 113 * 0 on success, -1 on error 114 */ 115 int qcrypto_hmac_bytes(QCryptoHmac *hmac, 116 const char *buf, 117 size_t len, 118 uint8_t **result, 119 size_t *resultlen, 120 Error **errp); 121 122 /** 123 * qcrypto_hmac_digestv: 124 * @hmac: the hmac object 125 * @iov: the array of memory regions to hmac 126 * @niov: the length of @iov 127 * @digest: pointer to hold output hmac 128 * @errp: pointer to a NULL-initialized error object 129 * 130 * Computes the hmac across all the memory regions 131 * present in @iov. The @digest pointer will be 132 * filled with the printable hex digest of the computed 133 * hmac, which will be terminated by '\0'. The 134 * memory pointer in @digest must be released 135 * with a call to g_free() when no longer required. 136 * 137 * Returns: 138 * 0 on success, -1 on error 139 */ 140 int qcrypto_hmac_digestv(QCryptoHmac *hmac, 141 const struct iovec *iov, 142 size_t niov, 143 char **digest, 144 Error **errp); 145 146 /** 147 * qcrypto_hmac_digest: 148 * @hmac: the hmac object 149 * @buf: the memory region to hmac 150 * @len: the length of @buf 151 * @digest: pointer to hold output hmac 152 * @errp: pointer to a NULL-initialized error object 153 * 154 * Computes the hmac across all the memory region 155 * @buf of length @len. The @digest pointer will be 156 * filled with the printable hex digest of the computed 157 * hmac, which will be terminated by '\0'. The 158 * memory pointer in @digest must be released 159 * with a call to g_free() when no longer required. 160 * 161 * Returns: 0 on success, -1 on error 162 */ 163 int qcrypto_hmac_digest(QCryptoHmac *hmac, 164 const char *buf, 165 size_t len, 166 char **digest, 167 Error **errp); 168 169 #endif 170