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 就是一個 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。