本日重點:ht_sign
這是 ht_sign
的演算法,我們從 input 的 Message M 開始探討
如 FIPS 第 26 頁[1
] 所示,ht_sign
的 Message M 並不是字面上的 message,他其實是一個 FORS public key。
In SLH-DSA, the message 𝑀 that is provided to ht_sign is a FORS public key.
第 35 頁,slh_sign_internal
的 line 17 也能看到,ht_sign
的 M 是一個 FORS public key。
slh_sign_internal
的 line 16,這個 FORS public key 是透過 fors_pkFromSig
取得。今天我們主要是探討 ht_sign
,所以 slh_sign_internal
的細節後續會再回頭來看
ht_sign
的 input 在 M 之後是私鑰和公鑰的種子,理想情況下 MCU (例如 M33 或 M4) 是不應該碰到私鑰,而是直接讓 Secure Element (SE) 簽完章直接給 MCU 一個 signature,不過目前的 SE 還不支援 PQC sign,所以才會由 MCU 來簽。
那麼,是不是有一種方法能透過 讓 SE 做 KDF,來讓 MCU 完全碰不到私鑰的種子,而這樣獲取到的私鑰種子是否符合 FIPS 205 所說的 approved random bit generator,這我們後續會探討,今天不對此過多著墨。
這裡稍微提一下 SE 的 KDF 是指 Secure Element 的 key derivation functions,例如 SE051 的 KDF [2
]
Various options for key derivation functions, including HKDF, MIFARE KDF, PRF (TLS-PSK)
回到 ht_sign
的演算法,input 最後兩個參數是
idx_tree 和 idx_leaf 一開始傳給 ht_sign
的時候,他們的計算要看 slh_sign_internal
從 PRF_msg
的產生就會影響到 idx_tree, idx_leaf的計算結果, Day 5 有探討過 PRF_msg
和 addrnd
, 這裡就不重複.
H_msg
的定義是這樣
他在 SHAKE 和 SHA2 的實作不一樣,本系列的焦點在 SLH-DSA-SHA2-128s,所以我們用這個
值得注意的是 H_msg
雖然理論上有可能發生雜湊碰撞,但 FIPS 205 第 38 頁是這麼說的
Even if it is feasible to compute collisions on the hash functions or XOF used to instantiate H𝑚𝑠𝑔, PRF, PRF𝑚𝑠𝑔, F, H, and T𝑙, there is believed to be no adverse effect on the security of SLH-DSA
簡單來說,就是他們無損 SLH-DSA 的安全,這個主題我們留到後面再說,他們值得另外寫一篇文章去探討。
我們繼續看,idx_tree 和 idx_leaf 的計算,就是 H_msg 產生一個雜湊值,然後從中取兩段的 array,再由 toInt 轉成整數。
原本是打算今天就把程式寫出來,不過還是先理解 ht_sign
演算法比較實際,明天我們會在這些基礎上開始實作程式。