[libvirt] [PATCH 04/10] virCryptoGenerateRandom: Don't allocate return buffer

Michal Privoznik mprivozn at redhat.com
Wed May 30 09:49:30 UTC 2018


On 05/30/2018 02:46 AM, Eric Blake wrote:
> On 05/29/2018 03:24 AM, Michal Privoznik wrote:
>> To unify our vir*Random() functions we need to make
>> virCryptoGenerateRandom NOT allocate return buffer. It should
>> just fill given buffer with random data.
>>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>>   src/qemu/qemu_domain.c   | 12 ++++++++----
>>   src/util/vircrypto.c     | 29 ++++++++++++-----------------
>>   src/util/vircrypto.h     |  3 ++-
>>   tests/qemuxml2argvmock.c | 14 ++++----------
>>   4 files changed, 26 insertions(+), 32 deletions(-)
>>
>> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
>> index 47910acb83..2d13a03344 100644
>> --- a/src/qemu/qemu_domain.c
>> +++ b/src/qemu/qemu_domain.c
>> @@ -930,12 +930,13 @@ qemuDomainMasterKeyCreate(virDomainObjPtr vm)
>>       if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_OBJECT_SECRET))
>>           return 0;
>>   -    if (!(priv->masterKey =
>> -          virCryptoGenerateRandom(QEMU_DOMAIN_MASTER_KEY_LEN)))
>> +    if (VIR_ALLOC_N(priv->masterKey, QEMU_DOMAIN_MASTER_KEY_LEN) < 0)
>>           return -1;
>> -
>>       priv->masterKeyLen = QEMU_DOMAIN_MASTER_KEY_LEN;
>>   +    if (virCryptoGenerateRandom(priv->masterKey,
>> QEMU_DOMAIN_MASTER_KEY_LEN) < 0)
>> +        return -1;
> 
> Should this free priv->masterKey and set it back to NULL, so that no
> other client is tempted to use a half-baked buffer as a key prior to the
> object being destroyed?

Good point.

> 
> 
>> +++ b/tests/qemuxml2argvmock.c
>> @@ -190,17 +190,11 @@ virCommandPassFD(virCommandPtr cmd
>> ATTRIBUTE_UNUSED,
>>       /* nada */
>>   }
>>   -uint8_t *
>> -virCryptoGenerateRandom(size_t nbytes)
>> +int
>> +virCryptoGenerateRandom(unsigned char *buf,
>> +                       size_t buflen)
> 
> Indentation looks off.
> 
>>   {
>> -    uint8_t *buf;
>> -
>> -    if (VIR_ALLOC_N(buf, nbytes) < 0)
>> -        return NULL;
>> -
>> -    ignore_value(virRandomBytes(buf, nbytes));
>> -
>> -    return buf;
>> +    return virRandomBytes(buf, buflen);
> 
> Hmm, my earlier comment about the #if 0 for debugging might be more
> relevant here - if we are going to mock the random numbers to be
> reproducible during the testsuite, THIS would be a nice place to fall
> back to rand() and friends with a reliable sequence when given a fixed
> seed (rather than directly in src/util/virrandom.c).
> 
> 

As I say in my reply to 08/10 I don't think we need to preserve ability
to use weak PRNG. I see two reasons for not having fallback in:

1) even though we have gnutls optional we build everywhere with it, so
gnutls_rnd() is going to be used. Therefore we can have a small mock:

gnutls_rnd() {
  return 4; /* yes, xkcd reference */
}

2) In case when building without gnutls, one has to modify RANDOM_SOURCE
macro in src/util/virrandom.c (which I'm introducing in 06/10).

But as I say in the cover letter, I'm planning on making gnutls
required. So no workaround like 2) would be needed.

Michal




More information about the libvir-list mailing list