本日重點:RBG、PRF
先前提到 SLH-DSA key pair 是 slh_keygen_internal
所產生,它的 input 是 SK.seed、SK.prf、PK.seed,這三個都是亂數,FIPS 205 第 37 頁 [1
] 要求這三個亂數必須由 approved random bit generator (RBG) 所產生,也就是說我用軟體隨便產生的亂數是不合格的,必須使用 approved RBG 產生,這個亂數產生器的規格可以參考 800-90A/90B/90C [7
, 8
, 9
]。
PRF 的定義在 FIPS 205 第 46 頁 [1
],其中的 PK.seed、SK.seed 就是透過 approved RBG 所產生的亂數。
PRF(PK.seed, SK.seed, ADRS) =
Trunc𝑛(SHA-256(PK.seed ∥ toByte(0, 64 − 𝑛) ∥ ADRS𝑐 ∥ SK.seed))
簡單來說,800-90A/90B/90C 各自規範的是亂數產生的演算法(800-90A)、熵的來源(800-90B)、演算法和熵怎麼組成一個RBG(800-90C)。
800-90A 是對 Deterministic Random Bit Generators 的完整演算法規範,800-90c 是 RBG 的construction 建議,這兩者透過軟體是能實現的,不過速度當然比硬體慢。但是 800-90B 就只能透過硬體來實現。
本系列不會實作 800-90A 的演算法,因為已經有現成的硬體能實現,例如 CryptoCell-310、CryptoCell-312,所以我們會使用 CC310、CC312。800-90C 是在 FIPS 140-3 才被納入,而 CC310、CC312 雖然只符合 FIPS 140-2,但本系列的實作會用 cc3xx 的 nrf_cc3xx_platform_ctr_drbg_get
[6
] 來取得 DRBG。
至此,我們知道了 SK.seed、SK.prf、PK.seed 是亂數,我們知道了亂數產生器要符合 800-90A/90B/90C,我們也知道 90A/90B 能透過 CC310、CC312 實現,我們也知道了 cc3xx 能取得 DRBG。本系列會使用 cc3xx 來取得亂數產生器,並用來產生亂數,做為 key pair 的種子。