本日重點: 回顧一下 SLH-DSA 簽章的過程: FORS、WOTS+、XMSS 和 FORS
經過了十幾天的鋪陳,我們經歷了 FORS signature、WOTS+ signature、Hypertree signature 和 XMSS signature,也經歷了 FORS public key 和 XMSS public key,今天我們回顧一下 SLH-DSA 簽章的過程。
一個 SLH-DSA 簽章包括了 R、FORS signature 和 Hyper signature
1
] 所述,他是一個 randomization string。slh_sign_internal
會 call fors_sign
,然後產生 FORS signature。這個 FORS signature 會直接成為 SLH-DSA signature 的一部份slh_sign_internal
在 call fors_sign
之後,會 call fors_pkFromSig
,然後得到一個 FORS public key,這個 FORS public key 就是 ht_sign
的其中一個 input,然後 call ht_sign
,取得 hypertree signature。這個 hypertree signature 也會直接成為 SLH-DSA signature 的一部份。簡單來說,組成 SLH-DSA signature 的三個部份分別透過 call 這三個 function 而獲得
PRF_msg
fors_sign
ht_sign
至此, 我們看一下 SLH-DSA signature 的格式 [1
]
fors_sign
會透過 call fors_skGen
產生 FORS private-key,private-key 的長度是 n byte。fors_sign
取得 FORS private-key 後,就會開始建立 AUTH。於是開始 call fors_node
a 次去計算 auth path,AUTH 的長度是 a * n bytes。
FORS private-key 和 AUTH 的長度合計是 (a + 1) * n bytes,這個過程會執行 k 次,所以 k * (a + 1) * n 就是 FORS signature 的長度。
至此,我們看一下 FORS signature 的格式 [1
]
HT signature 由 d 個 XMSS signature 所組成,d 代表 hypertree 有幾層。透過一次次的 call xmss_sign
然後 concatentation,構成了 HT signature。
這個 concatenation 的過程是從 layer 0 開始,從最底下的那一層開始往上計算 XMSS signature。一開始,是對 FORS public key 計算 xmss_sign
,此即為 layer 0 的 XMSS signature。
接著對 layer 0 的 XMSS signature 計算 xmss_pkFromSig
,然後拿這個 XMSS public key 去計算 xmss_sign
,此即為 layer 1 的 XMSS signature。
重複的拿 layer j 的 XMSS signature 去算 XMSS public key,以此去產生 layer j+1 的 XMSS signature。
換句話說,就是這個流程: layer j 的 XMSS signature -> layer j 的 XMSS public key -> layer j+1 的 XMSS signature。
要注意一個地方,xmss_pkFromSig
在這裡是為了拿 XMSS public key 去計算 layer j+1 的 XMSS signature,不是為了反推 XMSS public key 做驗章。
至此,我們看一下 Hypertree signature 的格式 [1
]