概覽
在AMD和Intel的CPU上,CPUID指令都可以檢測中央處理器(CPU)是否支持RDRAND指令。如果支持,調用CPUID的標準函式01H之後,EXC暫存器的第30位會被設定成1。AMD處理器也可以使用同樣的方式檢測是否支持。在Intel CPU上,也可以使用類似的方法檢測RDSEED是否支持。如果支持RDSEED,在調用完CPUID的標準函式07H後,EBX暫存器的第18位會被設定為1。
RDRAND的操作碼是0x0F 0xC7,後面跟一個ModRM位元組,來指示目標暫存器。在64位模式下,還可以於REX前綴結合(這是可選的)。
Intel安全密鑰是Intel為RDRAND指令和底層的隨機數生成器(RNG)的硬體實現的統稱,它在開發期間的代號是"Bull Mountain"。Intel稱自己的RNG"數字隨機數生成器"或DRNG。生成器採用有硬體產生的256位原始熵樣本對,並將其套用到一個高級加密標準(AES)(在CBC-MAC模式下)調節器,將其減少到256位條件熵樣本。
NIST SP 800-90A中定義了一個名叫CTR_DRBG的確定性隨機數生成器。它由調節器的輸出來初始化,為使用RDRAND指令的應用程式提供了密碼學安全的隨機數。在重新初始化之前,硬體將發出最多511個128位的樣本。使用RDSEED可以訪問來自AES-CBC-MAC的、條件化後的256位樣本。
為了初始化另一個為隨機數生成器,RDSEED指令被添加到了Intel安全密鑰,在Broadwell微架構的CPU上開始支持。RDSEED指令的熵來源自時序線路,並且使用矽片上的熱噪聲來以3GHz的速度輸出隨機比特流。這比從RDRAND獲得的6.4Gbit/s速率要慢(這兩個速率都是所有核心、所有執行緒共享)。RDSEED用來初始化任意寬度的軟體 PRNG,而RDRAND指令適用於需要高質量隨機數的應用程式。如果不要求密碼學安全,軟體隨機數生成器比如Xorshift一般會比較快。
性能
在Intel 酷睿 i7-7700K,4500MHz(45 x 100MHz)的處理器(Kaby Lake-S架構)上,單個RDRAND或RDSEED指令花費110納秒或463個時鐘周期,不論運算元大小(16位、32位、64位)。這個時鐘周期數適用於所有Skylake和Kaby Lake架構的處理器。在Silvermont架構的處理器上,每個指令花費1472時鐘周期,不論運算元大小;在Ivy Bridge架構的處理器上,花費117時鐘周期。
在AMD Ryzen 處理器上,對於16位或32位運算元,每個指令約花費1200個時鐘周期;對於64位運算元,約花費2500個時鐘周期。
編譯器支持
GCC4.6+和Clang3.2+提供了RdRand的內置支持——當在編譯參數中指定了-mrdrnd命令行參數、並且在條件編譯時設定__RDRND__宏的情況下。更新的版本額外提供了immintrin.h將這些內置函式封裝成與英特爾C編譯器版本12.1+兼容的功能中。這些函式將隨機數據寫入參數指定的位置,並在成功時返回1。
用來檢測RDRAND指令的x86彙編語言例子
相關背景
在2013年9月,曹子德(Theodore Ts'o)為回應紐約時報的文章Global surveillance disclosures (2013–present),公開發文表達對Linux核心的/dev/random中使用RdRand的擔憂:
I am so glad I resisted pressure from Intel engineers to let /dev/random rely only on the RDRAND instruction. To quote from the article below: 'By this year, theSigint Enabling Projecthad found ways inside some of the encryption chips that scramble information for businesses and governments, either by working with chipmakers to insert back doors....' Relying solely on the hardware random number generator which is using an implementation sealed inside a chip which is impossible to audit is a BAD idea.
林納斯·托瓦茲駁斥了在Linux核心中使用RdRand的擔憂,並指出RdRand不是/dev/random的熵來源;從RdRand接受數據並和其他隨機數來源結合來改善熵。然而,Defuse Security的Taylor Hornby表明,如果將後門引入到專門針對使用代碼的RdRand指令中,Linux隨機數生成器可能會變得不安全。 泰勒的概念驗證實當前版本3.13之前的未修改的Linux核心上工作。
開發者注釋掉了FreeBSD核心中直接使用RdRand和威盛電子的代碼,並添加說明"對於FreeBSD10,我們將回溯並刪除RDRAND和Padlock後端,並將它們提供給Yarrow,而不是將其輸出直接傳遞到 /dev/random 。如果需要,還可以通過內聯彙編或使用OpenSSL直接訪問硬體隨機數生成器,即RDRAND,Padlock等,但是我們不能再信任他們。"