[git commit] libbb/yescrypt: no need to find salt-terminating "$" twice

Denys Vlasenko vda.linux at googlemail.com
Mon Jul 7 16:28:56 UTC 2025


commit: https://git.busybox.net/busybox/commit/?id=67b98c7b1b4e0eeeacdd3086baf24248c8ceeee9
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
yescrypt_r                                          1048    1029     -19

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 libbb/yescrypt/alg-yescrypt-common.c | 26 ++++++++++----------------
 1 file changed, 10 insertions(+), 16 deletions(-)

diff --git a/libbb/yescrypt/alg-yescrypt-common.c b/libbb/yescrypt/alg-yescrypt-common.c
index 99e8b1277..dfcf32145 100644
--- a/libbb/yescrypt/alg-yescrypt-common.c
+++ b/libbb/yescrypt/alg-yescrypt-common.c
@@ -66,7 +66,7 @@ fail:
 #if 1
 static const uint8_t *decode64(
 		uint8_t *dst, size_t *dstlen,
-		const uint8_t *src, size_t srclen)
+		const uint8_t *src)
 {
 	size_t dstpos = 0;
 
@@ -74,11 +74,9 @@ static const uint8_t *decode64(
 	for (;;) {
 		uint32_t c, value = 0;
 		int bits = 0;
-		while (srclen != 0) {
-			srclen--;
+		while (*src && *src != '$') {
 			c = a2i64(*src);
 			if (c > 63) { /* bad ascii64 char, stop decoding at it */
-				srclen = 0;
 				break;
 			}
 			src++;
@@ -94,7 +92,7 @@ static const uint8_t *decode64(
  store:
 		dbg_dec64(" storing bits:%d v:%08x", bits, (int)SWAP_BE32(value)); //BE to see lsb first
 		while (dstpos < *dstlen) {
-			if (srclen == 0 && value == 0 && bits < 8) {
+			if (!(*src && *src != '$') && value == 0 && bits < 8) {
 				/* Example: mkpasswd PWD '$y$j9T$123':
 				 * the "123" is bits:18 value:03,51,00
 				 * is considered to be 2 bytes, not 3!
@@ -118,7 +116,7 @@ static const uint8_t *decode64(
 		dbg_dec64(" ERR: bits:%d dst[] is too small", bits);
 		goto fail;
  next:
-		if (srclen == 0)
+		if (!*src || *src == '$')
 			break;
 	}
  end:
@@ -214,8 +212,8 @@ char *yescrypt_r(
 	yescrypt_ctx_t yctx[1];
 	unsigned char hashbin32[32];
 	char *dst;
-	const uint8_t *src, *saltstr, *saltend;
-	size_t need, prefixlen, saltstrlen;
+	const uint8_t *src, *saltend;
+	size_t need, prefixlen;
 	uint32_t u32;
 
 	memset(yctx, 0, sizeof(yctx));
@@ -280,17 +278,13 @@ char *yescrypt_r(
 			goto fail;
 	}
 
-	saltstr = src + 1;
-	src = (uint8_t *)strchrnul((char *)saltstr, '$');
-	prefixlen = src - setting;  /* len("$y$<params>$<salt>") */
-	saltstrlen = src - saltstr; /* len("<salt>") */
-	/* src points to end of salt ('$' or NUL byte), won't be used past this point */
-
 	yctx->saltlen = sizeof(yctx->salt);
-	saltend = decode64(yctx->salt, &yctx->saltlen, saltstr, saltstrlen);
-	if (saltend != saltstr + saltstrlen)
+	src++; /* now points to salt */
+	saltend = decode64(yctx->salt, &yctx->saltlen, src);
+	if (!saltend || (*saltend != '\0' && *saltend != '$'))
 		goto fail; /* salt[] is too small, or bad char during decode */
 
+	prefixlen = saltend - setting;
 	need = prefixlen + 1 + YESCRYPT_HASH_LEN + 1;
 	if (need > buflen || need < prefixlen)
 		goto fail;


More information about the busybox-cvs mailing list