今天實驗的目的是 forks Mbed TLS,修改 mbedtls_entropy_func
,在 CI 下載,make 後做 cache,然後以這個 mbedtls 做為實現 SLH-DSA 演算法的底層。
在 Day 22 我實驗了透過實作 mbedtls_psa_external_get_random
和 mbedtls_platform_entropy_poll
讓 Mbed TLS 走軟體的路線去獲取熵,但我都失敗了,本來我是想先把重點放在以 PSA Crypto API 去改寫簽章的 function,不過碰到一個情況,就是 PRF_msg
必須要對 SK.prf 做 HMAC-SHA-256,在 PSA Crypto API 只能傳遞 key handle,那我就得想一個方法讓 key handle 能取得 SK.prf,甚至我還想一個路線把私鑰存起來並能獲得 key handle。
PRF𝑚𝑠𝑔(SK.prf, 𝑜𝑝𝑡_𝑟𝑎𝑛𝑑, 𝑀 ) = Trunc𝑛(HMAC-SHA-256(SK.prf, 𝑜𝑝𝑡_𝑟𝑎𝑛𝑑 ∥ 𝑀 ))
讓 key handle 能取得 SK.prf,有兩個方法,首先這個 key 需要是 PSA_KEY_USAGE_EXPORT
If a key does not have export permission, implementations must not permit the key to be exported in plain form from the cryptoprocessor, whether through psa_export_key() or through a proprietary interface.
或者,這把 key 沒有 PSA_KEY_USAGE_EXPORT,但寫了 PSA driver,然後在 PSA driver 裡用 key handle 去拿 key 的明文。
將 key 設成 PSA_KEY_USAGE_EXPORT,然後串接完後在 memory 清零雖然也是一種方法,但將私鑰設成可匯出,這樣實在不好。所以我傾向用 PSA driver,可是寫 PSA driver 又太花時間了,這不是本系列的重點,所以我想到了一個方法,就是直接 fork Mbed TLS,直接把它取熵那一段 hard code。
/**
* DE AD BE EF、FE ED FA CE、12 34 56 78
*/
static const uint8_t entropy_input[32] = {
0x15,0x2B,0x7E,0xC3,0xA1,0x9D,0x1F,0x63,
0x5A,0x8E,0x2D,0x44,0x91,0x17,0x6B,0x3C,
0xDE,0xAD,0xBE,0xEF,0xFE,0xED,0xFA,0xCE,
0x12,0x34,0x56,0x78,0x9A,0xBC,0xDF,0x01
};
int mbedtls_entropy_func(void *data, unsigned char *output, size_t len)
{
(void)data;
for (size_t i = 0; i < len; i++) output[i] = entropy_input[i & 31];
return 0;
...
}
- name: mbedtls libs (cache+build) mbedtls-3.6-use-nist-kat-entropy
uses: ./.github/actions/mbedtls-lib-mbedtls-3.6-use-nist-kat-entropy
在 GitHub make Mbed TLS 的 yml, action.yml
在 CI make 產生的 Mbed TLS,然後 cache,就會看到這個畫面
這一版的 mbedtls_entropy_func
每次返回的熵都一樣,而且不會去碰硬體,應該 能用來直接在 Renode 模擬,明天我們就來試試他是不是真如預期那樣運作。