iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0
Security

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

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

  • 分享至 

  • xImage
  •  

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_pollmbedtls_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_initpsa_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);
}

References

  1. FIPS 205 Stateless Hash-Based Digital Signature Standard

上一篇
Day 21 使用 Mbed TLS (PSA Crypto) 進行金鑰管理與產生符合 SP 800-90A 的亂數 (二)
系列文
裸機實作 SLH-DSA 簽章:FIPS 205 之演算法實作、測試、防禦與跨平台22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言