[git commit] libbb/yescrypt: use mmap for allocation, it's large - 16Mbytes
Denys Vlasenko
vda.linux at googlemail.com
Sun Jul 6 04:50:18 UTC 2025
commit: https://git.busybox.net/busybox/commit/?id=8be6dafe94690f24829901680c4768847a41b8f2
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master
This automatically gives it alignment sufficient for any future SIMD
optimizations.
function old new delta
yescrypt_r 1217 1221 +4
yescrypt_kdf32_body 1077 1059 -18
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 4/-18) Total: -14 bytes
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
libbb/yescrypt/alg-yescrypt-common.c | 22 +++++++++++++++++
libbb/yescrypt/alg-yescrypt-kdf.c | 3 ++-
libbb/yescrypt/alg-yescrypt-platform.c | 43 ++++++++++++----------------------
libbb/yescrypt/alg-yescrypt.h | 13 ++++------
4 files changed, 43 insertions(+), 38 deletions(-)
diff --git a/libbb/yescrypt/alg-yescrypt-common.c b/libbb/yescrypt/alg-yescrypt-common.c
index ebc531b08..a54e21ce2 100644
--- a/libbb/yescrypt/alg-yescrypt-common.c
+++ b/libbb/yescrypt/alg-yescrypt-common.c
@@ -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)
diff --git a/libbb/yescrypt/alg-yescrypt-kdf.c b/libbb/yescrypt/alg-yescrypt-kdf.c
index 2b84564b9..01a66a6a8 100644
--- a/libbb/yescrypt/alg-yescrypt-kdf.c
+++ b/libbb/yescrypt/alg-yescrypt-kdf.c
@@ -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" */
diff --git a/libbb/yescrypt/alg-yescrypt-platform.c b/libbb/yescrypt/alg-yescrypt-platform.c
index 41627df2d..8dd5feb55 100644
--- a/libbb/yescrypt/alg-yescrypt-platform.c
+++ b/libbb/yescrypt/alg-yescrypt-platform.c
@@ -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;
}
diff --git a/libbb/yescrypt/alg-yescrypt.h b/libbb/yescrypt/alg-yescrypt.h
index cac1959f9..ebd705cf0 100644
--- a/libbb/yescrypt/alg-yescrypt.h
+++ b/libbb/yescrypt/alg-yescrypt.h
@@ -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;
/**
More information about the busybox-cvs
mailing list