[libvirt] [PATCH 2/5] Introduce virCryptoHashBuf

Ján Tomko posted 5 patches 7 years ago
[libvirt] [PATCH 2/5] Introduce virCryptoHashBuf
Posted by Ján Tomko 7 years ago
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@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;
+
     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,
-- 
2.16.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 2/5] Introduce virCryptoHashBuf
Posted by Michal Privoznik 6 years, 12 months ago
On 05/11/2018 05:50 PM, 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@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;
>      }

This check feels useless. It's like if we were checking a value before
passing it to vir*TypeToString(). But it's pre-existing, so you have my
ACK. But a follow up patch removing it (=trivial) would be nice.

Also, don't forget to export the symbol in libvirt_private.syms ;-)
I'm wondering how linker succeeds in 3/5 where you use the function
without it being exported. Maybe my compiler decided to inline this
function?

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 2/5] Introduce virCryptoHashBuf
Posted by Ján Tomko 6 years, 12 months ago
On Mon, May 14, 2018 at 11:17:51AM +0200, Michal Privoznik wrote:
>On 05/11/2018 05:50 PM, 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@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;
>>      }
>
>This check feels useless. It's like if we were checking a value before
>passing it to vir*TypeToString(). But it's pre-existing, so you have my
>ACK. But a follow up patch removing it (=trivial) would be nice.

On one hand, this check should be pointless if the rest of our code is
correct.

On the other hand, our functions in src/util usually do perform some
validation of the parameters. Although it could be transformed to use
virReportEnumRangeError.

>
>Also, don't forget to export the symbol in libvirt_private.syms ;-)
>I'm wondering how linker succeeds in 3/5 where you use the function
>without it being exported. Maybe my compiler decided to inline this
>function?

Thanks, fixed.

Jano

>
>Michal
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 2/5] Introduce virCryptoHashBuf
Posted by Stefan Berger 6 years, 12 months ago
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@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,


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list