[libvirt] [PATCH 2/5] Introduce virCryptoHashBuf

Stefan Berger stefanb at linux.vnet.ibm.com
Mon May 14 15:40:09 UTC 2018


On 05/11/2018 11:50 AM, Ján Tomko wrote:
> A function that keeps the hash in binary form instead of converting
> it to human-readable hexadecimal form.
>
> Signed-off-by: Ján Tomko <jtomko at redhat.com>
> ---
>   src/util/vircrypto.c | 31 +++++++++++++++++++++----------
>   src/util/vircrypto.h |  7 +++++++
>   2 files changed, 28 insertions(+), 10 deletions(-)
>
> diff --git a/src/util/vircrypto.c b/src/util/vircrypto.c
> index 48b04fc8ce..1a2dcc28b7 100644
> --- a/src/util/vircrypto.c
> +++ b/src/util/vircrypto.c
> @@ -54,28 +54,39 @@ struct virHashInfo {
>   verify(ARRAY_CARDINALITY(hashinfo) == VIR_CRYPTO_HASH_LAST);
>   
>   int
> -virCryptoHashString(virCryptoHash hash,
> -                    const char *input,
> -                    char **output)
> +virCryptoHashBuf(virCryptoHash hash,
> +                 const char *input,
> +                 unsigned char *output)
>   {
> -    unsigned char buf[VIR_CRYPTO_LARGEST_DIGEST_SIZE];
> -    size_t hashstrlen;
> -    size_t i;
> -
>       if (hash >= VIR_CRYPTO_HASH_LAST) {
>           virReportError(VIR_ERR_INVALID_ARG,
>                          _("Unknown crypto hash %d"), hash);
>           return -1;
>       }
>   
> -    hashstrlen = (hashinfo[hash].hashlen * 2) + 1;
> -
> -    if (!(hashinfo[hash].func(input, strlen(input), buf))) {
> +    if (!(hashinfo[hash].func(input, strlen(input), output))) {
>           virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>                          _("Unable to compute hash of data"));
>           return -1;
>       }
>   
> +    return 0;
> +}
> +
> +int
> +virCryptoHashString(virCryptoHash hash,
> +                    const char *input,
> +                    char **output)
> +{
> +    unsigned char buf[VIR_CRYPTO_LARGEST_DIGEST_SIZE];
> +    size_t hashstrlen;
> +    size_t i;
> +
> +    if (virCryptoHashBuf(hash, input, buf) < 0)
> +        return -1;
> +
> +    hashstrlen = (hashinfo[hash].hashlen * 2) + 1;
> +

How about virCryptoHashBuf returning the number of raw bytes it produced 
so that not all callers need to look it up?


    Stefan


>       if (VIR_ALLOC_N(*output, hashstrlen) < 0)
>           return -1;
>   
> diff --git a/src/util/vircrypto.h b/src/util/vircrypto.h
> index 81743d2f74..64984006be 100644
> --- a/src/util/vircrypto.h
> +++ b/src/util/vircrypto.h
> @@ -41,6 +41,13 @@ typedef enum {
>       VIR_CRYPTO_CIPHER_LAST
>   } virCryptoCipher;
>   
> +int
> +virCryptoHashBuf(virCryptoHash hash,
> +                 const char *input,
> +                 unsigned char *output)
> +    ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
> +    ATTRIBUTE_RETURN_CHECK;
> +
>   int
>   virCryptoHashString(virCryptoHash hash,
>                       const char *input,





More information about the libvir-list mailing list