在 FIPS 205 規範的演算法中,我們看到 SK.seed 和 SK.prf 是做為 function 的參數在四處傳遞,這其實是不安全的,但,畢竟 FIPS 205 是在規範演算法,並不是在規範一個安全的產品要怎麼保管 private key,所以,當我們在實作一個安全產品的時候,不能直接照演算法的定義將 private key seed 當參數四處的傳遞,也就是說,須要從金鑰保護機制的角度來實作程式。因此,本文將探討 PSA Certified Crypto API,從中尋找相關的金鑰保護機制,並以此來修改本系列的 SLH-DSA 的簽章實作。
從 HMAC-SHA-256 來看, PSA 有這個 psa_mac_compute interface
psa_status_t psa_mac_compute(psa_key_id_t key,
psa_algorithm_t alg,
const uint8_t * input,
size_t input_length,
uint8_t * mac,
size_t mac_size,
size_t * mac_length);
psa_algorithm_t 如果是 PSA_ALG_SHA_256 就是 HMAC-SHA-256。
psa_key_id_t 我們能用來保護金鑰,透過傳遞 key identifier 就不用直接碰私鑰的種子, PSA Certified Crypto API 有這一段
A key identifier can be a permanent name for a persistent key, or a transient reference to volatile key. See Key identifiers.
從這裡我們能看出,在 PSA 裡,私鑰能存到 flash 這種 storage 也能存到關機就不存在的 RAM。換句話說,私鑰究竟是存在硬體的KMU裡還是 flash,PSA 並沒有強制規定,他只定義語意和interface,不強制儲存媒體是哪一種介質。
psa_key_id_t 是透過 psa_generate_key 產生,然後獲得 psa_key_id_t,至於他存在什麼地方,透過 Key attributes 的 Key lifetimes 決定,他的 persistence level 在 Persistence level 有定義,其中 PSA_KEY_PERSISTENCE_VOLATILE 代表一旦關機 key 就沒了。
有了 psa_key_id_t,就能用 key handle 取代私鑰在 function 之間傳遞,明天開始我們會對之前的實作進行修改。