[PATCH 1/1] Add support for using DRNG random number generator

Jussi Kivilinna jussi.kivilinna at mbnet.fi
Mon Dec 17 16:24:07 CET 2012


Quoting "Kasatkin, Dmitry" <dmitry.kasatkin at intel.com>:

> On Mon, Dec 17, 2012 at 5:06 PM, Jussi Kivilinna
> <jussi.kivilinna at mbnet.fi> wrote:
>> Quoting Dmitry Kasatkin <dmitry.kasatkin at intel.com>:
>>
>>> This patch provides support for using Digital Random Number Generator
>>> (DRNG)
>>> engine, which is available on the latest Intel's CPUs. DRNG engine is
>>> accesible via new the RDRAND instruction.
>>>
>>> This patch adds the following:
>>> - support for disabling using of rdrand instruction
>>> - checking for RDRAND instruction support using cpuid
>>> - RDRAND usage implementation
>>>
>>> Signed-off-by: Dmitry Kasatkin <dmitry.kasatkin at intel.com>
>>> ---
>>
>> <snip>
>>
>>>
>>> diff --git a/src/hwfeatures.c b/src/hwfeatures.c
>>> index 82c435b..e55d9b6 100644
>>> --- a/src/hwfeatures.c
>>> +++ b/src/hwfeatures.c
>>> @@ -134,6 +134,20 @@ detect_x86_64_gnuc (void)
>>>       : "%eax", "%ebx", "%ecx", "%edx", "cc"
>>>       );
>>>  #endif /*#ifdef ENABLE_AESNI_SUPPORT*/
>>> +#ifdef ENABLE_DRNG_SUPPORT
>>> +   asm volatile
>>> +     ("movl $1, %%eax\n\t"           /* Get CPU info and feature flags.
>>> */
>>> +      "cpuid\n"
>>> +      "testl $0x40000000, %%ecx\n\t" /* Test bit 30.  */
>>> +      "jz .Lno_rdrand%=\n\t"         /* No RDRAND support.  */
>>> +      "orl $512, %0\n"               /* Set our HWF_INTEL_RDRAND bit.  */
>>> +
>>> +      ".Lno_rdrand%=:\n"
>>> +      : "+r" (hw_features)
>>> +      :
>>> +      : "%eax", "%ecx", "%edx", "cc"
>>
>>
>> %ebx gets modified by cpuid too.
>>
>
> Indeed...
>
> But seems not on 32 bit architecture.

On 32bit, %ebx is currently manually stored/restored through stack.  
Probably clobbering %ebx would be enough there too and gcc would  
handle this automatically. IMHO, hwfeatures.c needs some clean-up,  
moving cpuid assembler to separate function and handling flag checking  
in C instead of asm.

>
>>> +      );
>>> +#endif /* #ifdef ENABLE_DRNG_SUPPORT */
>>>
>>>  }
>>>  #endif /* __x86_64__ && __GNUC__ */
>>> @@ -267,6 +281,22 @@ detect_ia32_gnuc (void)
>>>       : "%eax", "%ecx", "%edx", "cc"
>>>       );
>>>  #endif /*ENABLE_AESNI_SUPPORT*/
>>> +#ifdef ENABLE_DRNG_SUPPORT
>>> +   asm volatile
>>> +     ("pushl %%ebx\n\t"                /* Save GOT register.  */
>>> +      "movl $1, %%eax\n\t"           /* Get CPU info and feature flags.
>>> */
>>> +      "cpuid\n"
>>> +      "popl %%ebx\n\t"         /* Restore GOT register. */
>>> +      "testl $0x40000000, %%ecx\n\t" /* Test bit 30.  */
>>> +      "jz .Lno_rdrand%=\n\t"         /* No RDRAND support.  */
>>> +      "orl $512, %0\n"               /* Set our HWF_INTEL_RDRAND bit.  */
>>> +
>>> +      ".Lno_rdrand%=:\n"
>>> +      : "+r" (hw_features)
>>> +      :
>>> +      : "%eax", "%ecx", "%edx", "cc"
>>> +      );
>>> +#endif /*ENABLE_DRNG_SUPPORT*/
>>>
>>>  }
>>>  #endif /* __i386__ && SIZEOF_UNSIGNED_LONG == 4 && __GNUC__ */
>>> --
>>> 1.7.10.4
>>>
>>>
>>> _______________________________________________
>>> Gcrypt-devel mailing list
>>> Gcrypt-devel at gnupg.org
>>> http://lists.gnupg.org/mailman/listinfo/gcrypt-devel
>>>
>>>
>>
>>
>>
>
>






More information about the Gcrypt-devel mailing list