Denys Vlasenko, libxcrypt projesinden uyarlanarak modern yescrypt parola özetleme algoritmasını BusyBox'a ekledi. Bu, bir günde bitecek küçük bir yama değil — 40'tan fazla commit süren, canlı canlı geliştirilen büyük bir özellikti ve bu süre boyunca ana geliştirme dalı (git history) neredeyse hiç build edilemedi. İki ayrı, art arda gelen gerçek hata söz konusu:
1) Unutulan kaynak dosyaları. İlk commit,
libbb/pw_encrypt.c içine #include "pw_encrypt_yes.c"
satırı ekledi ama pw_encrypt_yes.c dosyasının kendisini commit'e
eklemeyi unuttu — derleyici anında fatal error: pw_encrypt_yes.c: No
such file or directory ile duruyordu. Denys bunu kendisi de fark etti:
bir gün sonra art arda iki "forgotten source file" commit'i attı
(a2a5db41a
ile pw_ascii64.c, ardından
e2091c984
ile hash_sha256_block.c ve nihayet asıl eksik olan
pw_encrypt_yes.c).
2) 64-bit'te derlenmeyen kod. Eksik dosyalar tamamlanınca
bu sefer libbb/yescrypt/alg-yescrypt-kdf.c içindeki
yescrypt_kdf32_body() fonksiyonunda error: 'buflen'
undeclared hatası çıktı — #if SIZE_MAX > UINT32_MAX
bloğu fonksiyonun hiçbir yerinde tanımlanmamış bir buflen
değişkenine referans veriyordu (muhtemelen refactor sırasında kalan bir
artık). Bu blok sadece SIZE_MAX'ın 32 biti aştığı — yani
64-bit — sistemlerde derlenmeye çalışıldığı için hata sadece 64-bit build'lerde
ortaya çıkıyordu, ki bizim build ortamımız tam olarak budur.
7 Temmuz 2025, saat 21:52'de ("libbb/yescrypt: 64-bit build
fixes" commit'inde) Denys sorunlu #if SIZE_MAX > UINT32_MAX
bloğunu tamamen kaldırdı, r ve p değişkenlerini
fonksiyonun başında düzgün bildirdi ve gereksiz iç blok parantezlerini
temizledi. Bu commit'ten itibaren yescrypt kodu 64-bit sistemlerde de
sorunsuz derleniyor.
Aşağıda düzeltme commit'inin gerçek diff'i var — dosya dosya gezinebilirsin.
| @@ -823,6 +823,7 @@ static int yescrypt_kdf32_body( | |
| salsa20_blk_t *V, *XY; | |
| uint8_t sha256[32]; | |
| uint8_t dk[sizeof(sha256)], *dkp = buf32; | |
| + | uint32_t r, p; |
| /* Sanity-check parameters */ | |
| switch (flags___YESCRYPT_MODE_MASK) { | |
| @@ -849,13 +850,9 @@ static int yescrypt_kdf32_body( | |
| default: | |
| goto out_EINVAL; | |
| } | |
| - | #if SIZE_MAX > UINT32_MAX |
| - | if (buflen > (((uint64_t)1 << 32) - 1) * 32) |
| - | goto out_EINVAL; |
| - | #endif |
| - | { |
| - | const uint32_t r = YCTX_param_r; |
| - | const uint32_t p = YCTX_param_p; |
| + | |
| + | r = YCTX_param_r; |
| + | p = YCTX_param_p; |
| if ((uint64_t)r * (uint64_t)p >= 1 << 30) | |
| goto out_EINVAL; | |
| if (N > UINT32_MAX) | |
| @@ -982,7 +979,6 @@ static int yescrypt_kdf32_body( | |
| out_EINVAL: | |
| errno = EINVAL; | |
| return -1; | |
| - | } |
| } | |
| /** | |