libbb/yescrypt: use mmap for allocation, it's large - 16Mbytes
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)
No binary (build failed)
—
(log yok)
| @@ -197,6 +197,9 @@ uint8_t *yescrypt_r( | |
| src = setting + 3; | |
| src = decode64_uint32(&flavor, src, 0); | |
| + | dbg("yescrypt flavor=0x%x YESCRYPT_RW:%u", |
| + | (unsigned)flavor, !!(flavor & YESCRYPT_RW) |
| + | ); |
| //if (!src) | |
| // goto fail; | |
| @@ -204,6 +207,22 @@ uint8_t *yescrypt_r( | |
| yctx->param.flags = flavor; | |
| } else if (flavor <= YESCRYPT_RW + (YESCRYPT_RW_FLAVOR_MASK >> 2)) { | |
| yctx->param.flags = YESCRYPT_RW + ((flavor - YESCRYPT_RW) << 2); | |
| + | dbg("yctx->param.flags=0x%x", (unsigned)yctx->param.flags); |
| + | dbg(" YESCRYPT_RW:%u" , !!(yctx->param.flags & YESCRYPT_RW )); |
| + | dbg(" YESCRYPT_ROUNDS_6:%u" , !!(yctx->param.flags & YESCRYPT_ROUNDS_6 )); |
| + | dbg(" YESCRYPT_GATHER_2:%u" , !!(yctx->param.flags & YESCRYPT_GATHER_2 )); |
| + | dbg(" YESCRYPT_GATHER_4:%u" , !!(yctx->param.flags & YESCRYPT_GATHER_4 )); |
| + | dbg(" YESCRYPT_GATHER_8:%u" , !!(yctx->param.flags & YESCRYPT_GATHER_8 )); |
| + | dbg(" YESCRYPT_SIMPLE_2:%u" , !!(yctx->param.flags & YESCRYPT_SIMPLE_2 )); |
| + | dbg(" YESCRYPT_SIMPLE_4:%u" , !!(yctx->param.flags & YESCRYPT_SIMPLE_4 )); |
| + | dbg(" YESCRYPT_SIMPLE_8:%u" , !!(yctx->param.flags & YESCRYPT_SIMPLE_8 )); |
| + | dbg(" YESCRYPT_SBOX_12K:%u" , !!(yctx->param.flags & YESCRYPT_SBOX_12K )); |
| + | dbg(" YESCRYPT_SBOX_24K:%u" , !!(yctx->param.flags & YESCRYPT_SBOX_24K )); |
| + | dbg(" YESCRYPT_SBOX_48K:%u" , !!(yctx->param.flags & YESCRYPT_SBOX_48K )); |
| + | dbg(" YESCRYPT_SBOX_96K:%u" , !!(yctx->param.flags & YESCRYPT_SBOX_96K )); |
| + | dbg(" YESCRYPT_SBOX_192K:%u", !!(yctx->param.flags & YESCRYPT_SBOX_192K)); |
| + | dbg(" YESCRYPT_SBOX_384K:%u", !!(yctx->param.flags & YESCRYPT_SBOX_384K)); |
| + | dbg(" YESCRYPT_SBOX_768K:%u", !!(yctx->param.flags & YESCRYPT_SBOX_768K)); |
| } else { | |
| goto fail; | |
| } | |
| @@ -212,13 +231,16 @@ uint8_t *yescrypt_r( | |
| if (/*!src ||*/ N_log2 > 63) | |
| goto fail; | |
| yctx->param.N = (uint64_t)1 << N_log2; | |
| + | dbg("yctx->param.N=%llu (1<<%u)", (unsigned long long)yctx->param.N, (unsigned)N_log2); |
| src = decode64_uint32(&yctx->param.r, src, 1); | |
| if (!src) | |
| goto fail; | |
| + | dbg("yctx->param.r=%u", yctx->param.r); |
| if (*src != '$') { | |
| uint32_t have; | |
| src = decode64_uint32(&have, src, 1); | |
| + | dbg("yescrypt has extended params:0x%x", (unsigned)have); |
| if (have & 1) | |
| src = decode64_uint32(&yctx->param.p, src, 2); | |
| if (have & 2) | |
| @@ -887,7 +887,8 @@ static int yescrypt_kdf32_body( | |
| if (yctx->local->aligned_size < need) { | |
| free_region(yctx->local); | |
| alloc_region(yctx->local, need); | |
| - | dbg("allocated local:%u", need); |
| + | dbg("allocated local:%u 0x%x", need, need); |
| + | /* standard "j9T" params allocate 16Mbytes here */ |
| } | |
| if (flags & YESCRYPT_ALLOC_ONLY) | |
| return -3; /* expected "failure" */ | |
| @@ -20,39 +20,26 @@ | |
| static void alloc_region(yescrypt_region_t *region, size_t size) | |
| { | |
| - | size_t base_size = size; |
| - | uint8_t *base, *aligned; |
| - | |
| - | #if 0 //def MAP_ANON - use mmap, possibly |
| - | //(if defined(MAP_HUGETLB) && defined(MAP_HUGE_2MB)) using 2MB pages |
| - | #else /* mmap not available */ |
| - | base = aligned = NULL; |
| - | if (size + 63 < size) |
| + | int flags = |
| + | # ifdef MAP_NOCORE /* huh? */ |
| + | MAP_NOCORE | |
| + | # endif |
| + | MAP_ANON | MAP_PRIVATE; |
| + | uint8_t *base = mmap(NULL, size, PROT_READ | PROT_WRITE, flags, -1, 0); |
| + | if (base == MAP_FAILED) |
| bb_die_memory_exhausted(); | |
| - | base = malloc(size + 63); |
| - | if (base) { |
| - | aligned = base + 63; |
| - | aligned -= (uintptr_t)aligned & 63; |
| - | } |
| - | #endif |
| - | region->base = base; |
| - | region->aligned = aligned; |
| - | region->base_size = base ? base_size : 0; |
| - | region->aligned_size = base ? size : 0; |
| + | //region->base = base; |
| + | //region->base_size = size; |
| + | region->aligned = base; |
| + | region->aligned_size = size; |
| } | |
| static void free_region(yescrypt_region_t *region) | |
| { | |
| - | #if 0 //def MAP_ANON |
| - | if (region->base) { |
| - | if (munmap(region->base, region->base_size)) |
| - | return -1; |
| - | } |
| - | #else |
| - | free(region->base); |
| - | #endif |
| - | region->base = NULL; |
| + | if (region->aligned) |
| + | munmap(region->aligned, region->aligned_size); |
| + | //region->base = NULL; |
| + | //region->base_size = 0; |
| region->aligned = NULL; | |
| - | region->base_size = 0; |
| region->aligned_size = 0; | |
| } | |
| @@ -35,13 +35,6 @@ | |
| # endif | |
| #endif | |
| - | /** |
| - | * Two 64-bit tags placed 48 bytes to the end of a ROM in host byte endianness |
| - | * (and followed by 32 bytes of the ROM digest). |
| - | */ |
| - | #define YESCRYPT_ROM_TAG1 0x7470797263736579 /* "yescrypt" */ |
| - | #define YESCRYPT_ROM_TAG2 0x687361684d4f522d /* "-ROMhash" */ |
| - | |
| /** | |
| * Type and possible values for the flags argument of yescrypt_kdf(), | |
| * yescrypt_encode_params_r(), yescrypt_encode_params(). Most of these may be | |
| @@ -98,8 +91,10 @@ typedef uint32_t yescrypt_flags_t; | |
| * they might differ from each other in a future version. | |
| */ | |
| typedef struct { | |
| - | void *base, *aligned; |
| - | size_t base_size, aligned_size; |
| + | // void *base; |
| + | void *aligned; |
| + | // size_t base_size; |
| + | size_t aligned_size; |
| } yescrypt_region_t; | |
| /** | |