Day 21 我試著用 Mbed TLS 產生亂數,然後把產生亂數所需要的取熵以我自己實作的 mbedtls_hardware_poll
去給 Mbed TLS 取熵,昨天我以為我成功了,後來我 double confirm, 把多餘的 .c 刪掉再檢驗,我發現我失敗了,因為我在 Makefile 的 BUG,導致自始我就一直停在 NIST KAT rng.c,並沒有切換到 Mbed TLS。
這一行寫錯了,應該是 override export KAT_RNG := 0
override export KAT := 0
因為 KAT_RNG 由外傳進來的 1,並沒有在 Makefile 的開頭被強制指定為 0,所以這個 BUG,將導致取亂數的路線仍然停留在 NIST KAT rng.c。
# Only use KAT rng.c when make KAT_RNG=1
ifeq ($(KAT_RNG),1)
RNG_SRC := kat/rng.c kat/kat_rng.c kat/aes256.c
CFLAGS += -DKAT_RNG
else
#RNG_SRC := $(PLATFORM)/rng.c
RNG_SRC := platforms/mbedtls/rng.c
endif
我刻意在 mbedtls_hardware_poll
裡放著跟 NIST KAT rng.c 一樣的熵,然後企圖產生跟 KAT rng.c 一樣的亂數做種子,想藉由觀察是不是也產生出一樣的亂數,來判斷我 mbedtls_hardware_poll
提供熵的功能是否正常。結果,我是看到一樣的亂數,我以為我確實提供了熵給 Mbed TLS,但事實上熵是一樣,但這熵並非來自於我實作的 mbedtls_hardware_poll
,而是自始仍然停留在 NIST KAT rng.c。所以,今天我繼續試,讓我能在 Renode 上提供熵。
我試了重新 make mbedtls 搭配實作 PSA External RNG,也就是 -DMBEDTLS_PSA_CRYPTO_EXTERNAL_RNG
搭配實作 mbedtls_psa_external_get_random
,結果無效。也試了重新 make mbedtls,再搭配實作 mbedtls_platform_entropy_poll
,也是無效。
我就在想,如果我把 mbedtls_platform_entropy_poll
或 mbedtls_hardware_poll
直接寫在 mbedtls 裡再重新 make 一版 mbedtls,是不是就能從根本上實現軟體的取熵?但我覺得這樣做的意義不大,首先這不是本系列的重點,其次是因為我已經有了 nRF52840 dongle 和 nRF5340 DK 的開發版,大可直接用 CC310/CC312 上的 TRNG 取熵,如果還要花很多時間去搞軟體版的取熵,就有點本末倒置了,所以我決定換一個方向,以 PSA Certified Crypto API 的 interface 實作 SLH-DSA 演算法,也就是用 psa/crypto.h 的 function declaration 去實作 SLH-DSA 的簽章,在實作的過程中,全綁定 psa/crypto.h,底層直接用軟體版實現,不去接硬體,全在 Renode 上實現,等到全寫完了,再直接把底層換成平台提供的實作,例如 nrf_cc3xx_platform,到時候只需要處理 Makefile 怎麼寫就可以了。
所以我將繼續把焦點放在 PSA Certified Crypto API 的 psa/crypto.h,舉例來說,我就是直接實作 psa_crypto_init
和 psa_generate_random
這兩個 function
psa_status_t psa_crypto_init() {
unsigned char entropy_input[48];
for (int i=0; i<48; i++) {
entropy_input[i] = i;
}
unsigned char *personalization_string = NULL;
randombytes_init(entropy_input, personalization_string, 256);
return PSA_SUCCESS;
}
psa_status_t psa_generate_random(uint8_t *output, size_t output_size) {
return randombytes((unsigned char*)output, (unsigned long long)output_size);
}