On Sunday, October 18, 2015 at 8:23:32 PM UTC-4, Jeffrey Walton wrote:
>
>
> The only thing left to do with it is
>> a) verify that I actually did the opcode right [1]
>>
>
> By the way, I think RDSEED detection code should look similar to the 
> following. Also see the discussion of Highest Function level at 
> https://en.wikipedia.org/wiki/CPUID#EAX.3D0:_Highest_Function_Parameter 
> ...
>

Here's what the RDSEED detection code ended up being. AMD does not offer 
RDSEED, so we need to filter the call for Intel processors.

static bool IsIntel(const word32 output[4])
{
    // This is the "GenuineIntel" string
    return (output[1] /*EBX*/ == 0x756e6547) &&
        (output[2] /*ECX*/ == 0x6c65746e) &&
        (output[3] /*EDX*/ == 0x49656e69);
}

static bool IsAMD(const word32 output[4])
{
    // This is the "AuthenticAMD" string
    return (output[1] /*EBX*/ == 0x68747541) &&
        (output[2] /*ECX*/ == 0x69746E65) &&
        (output[3] /*EDX*/ == 0x444D4163);
}

static bool RDSEED_Runtime_Helper()
{
#if defined(CRYPTOPP_CPUID_AVAILABLE)
    bool rdseed = false; word32 output[4];
    if (CpuId(0, output))
    {
        // Only Intel supports RDSEED at the moment.
        if (IsIntel(output))
        {
            if (output[0] /*EAX*/ >= 7 && CpuId(7, output))
            {
                static const unsigned int RDSEED_FLAG = (1 << 18);
                rdseed = !!(output[1] /*EBX*/ & RDSEED_FLAG);
            }
        }
    }
    return rdseed;
#else
    return false;
#endif
}


And the updated RDRAND helper routine:

static bool RDRAND_Runtime_Helper()
{
#if defined(CRYPTOPP_CPUID_AVAILABLE)
    bool rdrand = false; word32 output[4];
    if (CpuId(0, output))
    {
        if (IsIntel(output) || IsAMD(output))
        {
            if (output[0] /*EAX*/ >= 1 && CpuId(1, output))
            {
                static const unsigned int RDRAND_FLAG = (1 << 30);
                rdrand = !!(output[2] /*ECX*/ & RDRAND_FLAG);
            }
        }
    }
    return rdrand;
#else
    return false;
#endif
}

Jeff 

-- 
-- 
You received this message because you are subscribed to the "Crypto++ Users" 
Google Group.
To unsubscribe, send an email to cryptopp-users-unsubscr...@googlegroups.com.
More information about Crypto++ and this group is available at 
http://www.cryptopp.com.
--- 
You received this message because you are subscribed to the Google Groups 
"Crypto++ Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to cryptopp-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to