← Commit list

f5af8aefe

Denys Vlasenko
Denys Vlasenko
2025-07-06
SOURCE BUG Duration: 72s

Subject

libbb/yescrypt: shrink PBKDF2

SOURCE BUG

This commit was genuinely broken at the time (not related to our build system): libbb/yescrypt eklenirken (2025-07-06 - 2025-07-07 arasi) once unutulan kaynak dosyalari (pw_encrypt_yes.c, hash_sha256_block.c, pw_ascii64.c), ardindan 64-bit'te derlenmeyen bir 'buflen' degiskeni (alg-yescrypt-kdf.c) vardi - busybox'in kendi kodundaki gercek hatalar (e5d3a8763 ile duzeltildi)

→ Bu hatanin tam hikayesini ve duzeltme diffini gor

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

libbb/yescrypt/alg-sha256.c+14 -14
@@ -77,7 +77,7 @@ HMAC_SHA256_Update(HMAC_SHA256_CTX *ctx, const void *in, size_t len)
* buffer ${digest}.
*/
static void
-HMAC_SHA256_Final(HMAC_SHA256_CTX *ctx, uint8_t digest[32])
+HMAC_SHA256_Final(HMAC_SHA256_CTX *ctx, void *digest)
{
/* Finish the inner SHA256 operation. */
sha256_end(&ctx->ictx, digest); /* using digest[] as scratch space */
@@ -93,8 +93,7 @@ HMAC_SHA256_Final(HMAC_SHA256_CTX *ctx, uint8_t digest[32])
* length ${Klen}, and write the result to ${digest}.
*/
static void
-HMAC_SHA256_Buf(const void *K, size_t Klen, const void *in, size_t len,
- uint8_t digest[32])
+HMAC_SHA256_Buf(const void *K, size_t Klen, const void *in, size_t len, void *digest)
{
HMAC_SHA256_CTX ctx;
HMAC_SHA256_Init(&ctx, K, Klen);
@@ -114,11 +113,6 @@ PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen,
{
HMAC_SHA256_CTX Phctx, PShctx, hctx;
size_t i;
- uint8_t U[32];
- uint8_t T[32];
- uint64_t j;
- int k;
- size_t clen;
/* Compute HMAC state after processing P. */
HMAC_SHA256_Init(&Phctx, passwd, passwdlen);
@@ -128,14 +122,19 @@ PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen,
HMAC_SHA256_Update(&PShctx, salt, saltlen);
/* Iterate through the blocks. */
- for (i = 0; i * 32 < dkLen; i++) {
+ for (i = 0; dkLen != 0; i++) {
+ uint64_t U[32 / 8];
+ uint64_t T[32 / 8];
+ uint64_t j;
uint32_t ivec;
+ size_t clen;
+ int k;
/* Generate INT(i + 1). */
ivec = SWAP_BE32((uint32_t)(i + 1));
/* Compute U_1 = PRF(P, S || INT(i)). */
- memcpy(&hctx, &PShctx, sizeof(HMAC_SHA256_CTX));
+ hctx = PShctx;
HMAC_SHA256_Update(&hctx, &ivec, 4);
HMAC_SHA256_Final(&hctx, T);
@@ -144,19 +143,20 @@ PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen,
memcpy(U, T, 32);
for (j = 2; j <= c; j++) {
/* Compute U_j. */
- memcpy(&hctx, &Phctx, sizeof(HMAC_SHA256_CTX));
+ hctx = Phctx;
HMAC_SHA256_Update(&hctx, U, 32);
HMAC_SHA256_Final(&hctx, U);
/* ... xor U_j ... */
- for (k = 0; k < 32; k++)
+ for (k = 0; k < 32 / 8; k++)
T[k] ^= U[k];
}
}
/* Copy as many bytes as necessary into buf. */
- clen = dkLen - i * 32;
+ clen = dkLen;
if (clen > 32)
clen = 32;
- memcpy(&buf[i * 32], T, clen);
+ buf = mempcpy(buf, T, clen);
+ dkLen -= clen;
}
}