aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2025-07-07 18:28:56 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2025-07-07 18:28:56 +0200
commit67b98c7b1b4e0eeeacdd3086baf24248c8ceeee9 (patch)
treee87d0ebc1acb791667eda58bbfcdcc679de325e8
parente3484095f9fd48d771df4e49db8b6384b5219c21 (diff)
downloadbusybox-w32-67b98c7b1b4e0eeeacdd3086baf24248c8ceeee9.tar.gz
busybox-w32-67b98c7b1b4e0eeeacdd3086baf24248c8ceeee9.tar.bz2
busybox-w32-67b98c7b1b4e0eeeacdd3086baf24248c8ceeee9.zip
libbb/yescrypt: no need to find salt-terminating "$" twice
function old new delta yescrypt_r 1048 1029 -19 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--libbb/yescrypt/alg-yescrypt-common.c26
1 files 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:
66#if 1 66#if 1
67static const uint8_t *decode64( 67static const uint8_t *decode64(
68 uint8_t *dst, size_t *dstlen, 68 uint8_t *dst, size_t *dstlen,
69 const uint8_t *src, size_t srclen) 69 const uint8_t *src)
70{ 70{
71 size_t dstpos = 0; 71 size_t dstpos = 0;
72 72
@@ -74,11 +74,9 @@ static const uint8_t *decode64(
74 for (;;) { 74 for (;;) {
75 uint32_t c, value = 0; 75 uint32_t c, value = 0;
76 int bits = 0; 76 int bits = 0;
77 while (srclen != 0) { 77 while (*src && *src != '$') {
78 srclen--;
79 c = a2i64(*src); 78 c = a2i64(*src);
80 if (c > 63) { /* bad ascii64 char, stop decoding at it */ 79 if (c > 63) { /* bad ascii64 char, stop decoding at it */
81 srclen = 0;
82 break; 80 break;
83 } 81 }
84 src++; 82 src++;
@@ -94,7 +92,7 @@ static const uint8_t *decode64(
94 store: 92 store:
95 dbg_dec64(" storing bits:%d v:%08x", bits, (int)SWAP_BE32(value)); //BE to see lsb first 93 dbg_dec64(" storing bits:%d v:%08x", bits, (int)SWAP_BE32(value)); //BE to see lsb first
96 while (dstpos < *dstlen) { 94 while (dstpos < *dstlen) {
97 if (srclen == 0 && value == 0 && bits < 8) { 95 if (!(*src && *src != '$') && value == 0 && bits < 8) {
98 /* Example: mkpasswd PWD '$y$j9T$123': 96 /* Example: mkpasswd PWD '$y$j9T$123':
99 * the "123" is bits:18 value:03,51,00 97 * the "123" is bits:18 value:03,51,00
100 * is considered to be 2 bytes, not 3! 98 * is considered to be 2 bytes, not 3!
@@ -118,7 +116,7 @@ static const uint8_t *decode64(
118 dbg_dec64(" ERR: bits:%d dst[] is too small", bits); 116 dbg_dec64(" ERR: bits:%d dst[] is too small", bits);
119 goto fail; 117 goto fail;
120 next: 118 next:
121 if (srclen == 0) 119 if (!*src || *src == '$')
122 break; 120 break;
123 } 121 }
124 end: 122 end:
@@ -214,8 +212,8 @@ char *yescrypt_r(
214 yescrypt_ctx_t yctx[1]; 212 yescrypt_ctx_t yctx[1];
215 unsigned char hashbin32[32]; 213 unsigned char hashbin32[32];
216 char *dst; 214 char *dst;
217 const uint8_t *src, *saltstr, *saltend; 215 const uint8_t *src, *saltend;
218 size_t need, prefixlen, saltstrlen; 216 size_t need, prefixlen;
219 uint32_t u32; 217 uint32_t u32;
220 218
221 memset(yctx, 0, sizeof(yctx)); 219 memset(yctx, 0, sizeof(yctx));
@@ -280,17 +278,13 @@ char *yescrypt_r(
280 goto fail; 278 goto fail;
281 } 279 }
282 280
283 saltstr = src + 1;
284 src = (uint8_t *)strchrnul((char *)saltstr, '$');
285 prefixlen = src - setting; /* len("$y$<params>$<salt>") */
286 saltstrlen = src - saltstr; /* len("<salt>") */
287 /* src points to end of salt ('$' or NUL byte), won't be used past this point */
288
289 yctx->saltlen = sizeof(yctx->salt); 281 yctx->saltlen = sizeof(yctx->salt);
290 saltend = decode64(yctx->salt, &yctx->saltlen, saltstr, saltstrlen); 282 src++; /* now points to salt */
291 if (saltend != saltstr + saltstrlen) 283 saltend = decode64(yctx->salt, &yctx->saltlen, src);
284 if (!saltend || (*saltend != '\0' && *saltend != '$'))
292 goto fail; /* salt[] is too small, or bad char during decode */ 285 goto fail; /* salt[] is too small, or bad char during decode */
293 286
287 prefixlen = saltend - setting;
294 need = prefixlen + 1 + YESCRYPT_HASH_LEN + 1; 288 need = prefixlen + 1 + YESCRYPT_HASH_LEN + 1;
295 if (need > buflen || need < prefixlen) 289 if (need > buflen || need < prefixlen)
296 goto fail; 290 goto fail;