[git commit] libbb/yescrypt: remove unreachable support for scrypt hash ("$7$...")
Denys Vlasenko
vda.linux at googlemail.com
Sat Jul 5 23:23:37 UTC 2025
commit: https://git.busybox.net/busybox/commit/?id=10196929da47461d1d684cc65662cbaf591412fe
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master
function old new delta
decode64 136 174 +38
decode64_uint32 166 201 +35
atoi64 25 - -25
yescrypt_r 879 692 -187
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 2/1 up/down: 73/-212) Total: -139 bytes
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
libbb/yescrypt/alg-yescrypt-common.c | 144 ++++++++++++-----------------------
1 file changed, 49 insertions(+), 95 deletions(-)
diff --git a/libbb/yescrypt/alg-yescrypt-common.c b/libbb/yescrypt/alg-yescrypt-common.c
index 9d7231f09..bf2934bc9 100644
--- a/libbb/yescrypt/alg-yescrypt-common.c
+++ b/libbb/yescrypt/alg-yescrypt-common.c
@@ -118,24 +118,6 @@ uint8_t *encode64(uint8_t *dst, size_t dstlen,
return dst;
}
-static const uint8_t *decode64_uint32_fixed(uint32_t *dst, uint32_t dstbits,
- const uint8_t *src)
-{
- uint32_t bits;
-
- *dst = 0;
- for (bits = 0; bits < dstbits; bits += 6) {
- uint32_t c = atoi64(*src++);
- if (c > 63) {
- *dst = 0;
- return NULL;
- }
- *dst |= c << bits;
- }
-
- return src;
-}
-
const uint8_t *decode64(uint8_t *dst, size_t *dstlen,
const uint8_t *src, size_t srclen)
{
@@ -192,91 +174,73 @@ uint8_t *yescrypt_r(
{
unsigned char saltbin[64], hashbin[32];
const uint8_t *src, *saltstr, *salt;
+ const uint8_t *saltend;
uint8_t *dst;
size_t need, prefixlen, saltstrlen, saltlen;
+ uint32_t flavor, N_log2;
yescrypt_params_t params = { .p = 1 };
- if (setting[0] != '$' ||
- (setting[1] != '7' && setting[1] != 'y') ||
- setting[2] != '$')
- return NULL;
+ /* we assume setting starts with "$y$" (caller must ensure this) */
src = setting + 3;
- if (setting[1] == '7') {
- uint32_t N_log2 = atoi64(*src++);
- if (N_log2 < 1 || N_log2 > 63)
- return NULL;
- params.N = (uint64_t)1 << N_log2;
-
- src = decode64_uint32_fixed(¶ms.r, 30, src);
- if (!src)
- return NULL;
+ src = decode64_uint32(&flavor, src, 0);
+ if (!src)
+ return NULL;
- src = decode64_uint32_fixed(¶ms.p, 30, src);
- if (!src)
- return NULL;
+ if (flavor < YESCRYPT_RW) {
+ params.flags = flavor;
+ } else if (flavor <= YESCRYPT_RW + (YESCRYPT_RW_FLAVOR_MASK >> 2)) {
+ params.flags = YESCRYPT_RW + ((flavor - YESCRYPT_RW) << 2);
} else {
- uint32_t flavor, N_log2;
+ return NULL;
+ }
- src = decode64_uint32(&flavor, src, 0);
- if (!src)
- return NULL;
+ src = decode64_uint32(&N_log2, src, 1);
+ if (!src || N_log2 > 63)
+ return NULL;
+ params.N = (uint64_t)1 << N_log2;
- if (flavor < YESCRYPT_RW) {
- params.flags = flavor;
- } else if (flavor <= YESCRYPT_RW + (YESCRYPT_RW_FLAVOR_MASK >> 2)) {
- params.flags = YESCRYPT_RW + ((flavor - YESCRYPT_RW) << 2);
- } else {
- return NULL;
- }
+ src = decode64_uint32(¶ms.r, src, 1);
+ if (!src)
+ return NULL;
- src = decode64_uint32(&N_log2, src, 1);
- if (!src || N_log2 > 63)
- return NULL;
- params.N = (uint64_t)1 << N_log2;
+ if (*src != '$') {
+ uint32_t have;
- src = decode64_uint32(¶ms.r, src, 1);
+ src = decode64_uint32(&have, src, 1);
if (!src)
return NULL;
- if (*src != '$') {
- uint32_t have;
-
- src = decode64_uint32(&have, src, 1);
+ if (have & 1) {
+ src = decode64_uint32(¶ms.p, src, 2);
if (!src)
return NULL;
+ }
- if (have & 1) {
- src = decode64_uint32(¶ms.p, src, 2);
- if (!src)
- return NULL;
- }
-
- if (have & 2) {
- src = decode64_uint32(¶ms.t, src, 1);
- if (!src)
- return NULL;
- }
-
- if (have & 4) {
- src = decode64_uint32(¶ms.g, src, 1);
- if (!src)
- return NULL;
- }
+ if (have & 2) {
+ src = decode64_uint32(¶ms.t, src, 1);
+ if (!src)
+ return NULL;
+ }
- if (have & 8) {
- uint32_t NROM_log2;
- src = decode64_uint32(&NROM_log2, src, 1);
- if (!src || NROM_log2 > 63)
- return NULL;
- params.NROM = (uint64_t)1 << NROM_log2;
- }
+ if (have & 4) {
+ src = decode64_uint32(¶ms.g, src, 1);
+ if (!src)
+ return NULL;
}
- if (*src++ != '$')
- return NULL;
+ if (have & 8) {
+ uint32_t NROM_log2;
+ src = decode64_uint32(&NROM_log2, src, 1);
+ if (!src || NROM_log2 > 63)
+ return NULL;
+ params.NROM = (uint64_t)1 << NROM_log2;
+ }
}
+ if (*src++ != '$')
+ return NULL;
+
prefixlen = src - setting;
saltstr = src;
@@ -286,23 +250,13 @@ uint8_t *yescrypt_r(
else
saltstrlen = strlen((char *)saltstr);
- if (setting[1] == '7') {
- salt = saltstr;
- saltlen = saltstrlen;
- } else {
- const uint8_t *saltend;
-
- saltlen = sizeof(saltbin);
- saltend = decode64(saltbin, &saltlen, saltstr, saltstrlen);
-
- if (!saltend || (size_t)(saltend - saltstr) != saltstrlen)
- goto fail;
+ saltlen = sizeof(saltbin);
+ saltend = decode64(saltbin, &saltlen, saltstr, saltstrlen);
- salt = saltbin;
+ if (!saltend || (size_t)(saltend - saltstr) != saltstrlen)
+ goto fail;
- //KEY:if (key)
- //KEY: yescrypt_sha256_cipher(saltbin, saltlen, key, ENC);
- }
+ salt = saltbin;
need = prefixlen + saltstrlen + 1 + HASH_LEN + 1;
if (need > buflen || need < saltstrlen)
More information about the busybox-cvs
mailing list