iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0
Security

裸機實作 SLH-DSA 簽章:FIPS 205 之演算法實作、測試、防禦與跨平台系列 第 20

Day 20 使用 Mbed TLS (PSA Crypto) 進行金鑰管理與產生符合 SP 800-90A 的亂數 (一)

  • 分享至 

  • xImage
  •  

在 SLH-DSA 的簽章演算法 [1] 中,用到私鑰的 function 不少,這是其中兩個

𝑠𝑘 ← PRF(PK.seed, SK.seed, skADRS)
𝑅 ← PRF𝑚𝑠𝑔(SK.prf, 𝑜𝑝𝑡_𝑟𝑎𝑛𝑑, 𝑀 )

PK.seed、SK.seed 和 SK.prf 必須由 approved RBG產生符合 SP 800-90A 的亂數,我們可以直接用 Mbed TLS 來產生亂數 (psa_crypto_initpsa_generate_random)

PRF 和 PRF𝑚𝑠𝑔 的參數是私鑰,但他們在 mbedTLS 的處理方式略有不同

PRF𝑚𝑠𝑔(SK.prf, 𝑜𝑝𝑡_𝑟𝑎𝑛𝑑, 𝑀 ) = 
Trunc𝑛(HMAC-SHA-256(SK.prf, 𝑜𝑝𝑡_𝑟𝑎𝑛𝑑 ∥ 𝑀 ))
PRF(PK.seed, SK.seed, SK.seed, ADRS) =
Trunc𝑛(SHA-256(PK.seed ∥ toByte(0, 64 − 𝑛) ∥ ADRS𝑐 ∥ SK.seed))

PRFmsg可以直接把 key handle 傳給 psa_mac_compute,但PRF在計算 SHA-256 之前需要對私鑰進行合併,由於MCU在這種情況下必須要持有私鑰,所以在 PRF 必須考慮兩件事

  • 持有私鑰的時間要極小化
  • 用完後要立刻清除

因為 MCU 會短暫持有私鑰,所以用完之後要立刻清除。這個清除的動作,由於該 memory 設為零之後就不再使用了,所以編譯器在做最佳化的時候,會把這個清除的動作予以消滅,此即為 Dead Store Elimination [2, 3]。也就是說,這個 address 被設成零之後,因為沒有再用到這個 address,所以被編譯器認為 memset 這個動作是 dead code,然後這個動作就乾脆不執行了。如果這個 address 放的是 non-sensitive 那還無所謂,但如果放的是像私鑰這種 sensitive 的資料,就有安全問題了,所以這裡要用顯式清零的方式避免發生 DSE。

今天我們只有稍微提到 psa_crypto_initpsa_generate_randompsa_mac_compute,明天我會用這三個去改寫之前本系列實作的相關 function。

References

  1. FIPS 205 Stateless Hash-Based Digital Signature Standard
  2. Insecure_Compiler_Optimization
  3. Dead Store Elimination (Still) Considered Harmful

上一篇
Day 19 初探 PSA Certified Crypto API 金鑰保護機制
系列文
裸機實作 SLH-DSA 簽章:FIPS 205 之演算法實作、測試、防禦與跨平台20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言