iT邦幫忙

2025 iThome 鐵人賽

DAY 24
0
Security

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

Day 24 以 PSA Certified Crypto API 的 interface 實作 SLH-DSA 演算法 (二)

  • 分享至 

  • xImage
  •  

Day 23 我重新 make 一個 mbedtls,想實驗一下是不是能直接用我hardcode的熵,結果直接在這一行掛掉。

psa_status_t status = psa_crypto_init();

即便我把 mbedtls 的 psa_crypto_init 強制 return PSA_SUCCESS 也沒用

psa_status_t psa_crypto_init(void)
{
   return PSA_SUCCESS;
   ...

再跟他糾纏下去Day 24的鐵人賽就要交白卷了,所以這個問題無限期延後,下次再碰 psa_crypto_init,就是直接用實體的開發版。

我要繼續 Day 22 的路線,用 PSA Certified Crypto API 的 interface 去實作 SLH-DSA 演算法。

Day 18 提到 psa_mac_compute

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);

用他去改寫 prf_msg

static void prf_msg(uint8_t R[SPX_N],
                    const uint8_t sk_prf[SPX_N],
                    const uint8_t optrand[SPX_N],
                    const uint8_t *m, 
                    size_t mlen)
{
    uint8_t opt_rand_M[SPX_N + mlen];
    memcpy(opt_rand_M, optrand, SPX_N);
    memcpy(opt_rand_M + SPX_N, m, mlen);

    uint8_t hmac_sha256_out[32];
    hmac_sha256(hmac_sha256_out, sk_prf, SPX_N, opt_rand_M, sizeof(opt_rand_M));

    memcpy(R, hmac_sha256_out, SPX_N);
    uint8_t log[] = "prf_msg DONE\r\n";
    uarte0_tx(log, sizeof(log) - 1);
}

第12行的 hmac_sha256 就必須要改成傳 psa_key_id_t,而 psa_algorithm_t 就要用 PSA_ALG_HMAC(PSA_ALG_SHA_256),所以應該像這樣

psa_mac_compute(key, PSA_ALG_HMAC(PSA_ALG_SHA_256), ...)

所以 prf_msg(R, sk_prf, ...) 就要改成 prf_msg(R, key_id, ...),也就是說,slh_sign_internal 和 PRF𝑚𝑠𝑔 要傳的就不是 sk_prf,而是 key id

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

所以,從最開始的 gen key 的時候就要用 key id,所以,改寫就要從 psa_generate_key 開始

psa_status_t psa_generate_key(const psa_key_attributes_t * attributes,
                              psa_key_id_t * key);

psa_key_id_t 就是 uint32_t,所以先這樣寫

typedef uint32_t psa_key_id_t

psa_key_attributes_t 包含了

  • lifetime
  • key identifier
  • type
  • bits
  • usage_flags
  • algorithm

所以 psa_key_attributes_t 就是一個 struct,參考 mbed TLS v3.1.0, psa_core_key_attributes_t Struct Reference,psa_key_attributes_t 的結構大概像這樣

typedef uint16_t psa_key_type_t;
typedef uint16_t psa_key_bits_t;
typedef uint32_t psa_key_lifetime_t;
typedef struct psa_key_attributes_s {
    psa_key_type_t      type;
    psa_key_bits_t      bits;
    psa_key_lifetime_t  lifetime;
} psa_key_attributes_t;

psa_key_attributes_t 有一個欄位 psa_key_lifetime_t 如果是 PSA_KEY_LIFETIME_VOLATILE, 那就不會存在外部的 storage, 在純軟的模擬環境下, 會以這個為主進行實驗。

明天我將從 psa_generate_key 開始,一路將 sk.seed, sk.prf 換成 psa_key_id_t。


上一篇
Day 23 修改 Mbed TLS ,直接在 Renode 進行模擬取熵
系列文
裸機實作 SLH-DSA 簽章:FIPS 205 之演算法實作、測試、防禦與跨平台24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言