aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2025-07-06 03:59:59 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2025-07-06 03:59:59 +0200
commit85d3c48217bcbbe670aa466705fee703b95cbc36 (patch)
tree47bd6005011b1c2b7718c0dfefb3d3f48f2410d7 /libbb
parent1c977008e0b84f0d277367901b981c0d958dbdce (diff)
downloadbusybox-w32-85d3c48217bcbbe670aa466705fee703b95cbc36.tar.gz
busybox-w32-85d3c48217bcbbe670aa466705fee703b95cbc36.tar.bz2
busybox-w32-85d3c48217bcbbe670aa466705fee703b95cbc36.zip
libbb/yescrypt: code shrink in salt decoding
function old new delta yescrypt_r 1311 1288 -23 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb')
-rw-r--r--libbb/yescrypt/alg-yescrypt-common.c26
1 files changed, 11 insertions, 15 deletions
diff --git a/libbb/yescrypt/alg-yescrypt-common.c b/libbb/yescrypt/alg-yescrypt-common.c
index 65c92f22f..8d75fa051 100644
--- a/libbb/yescrypt/alg-yescrypt-common.c
+++ b/libbb/yescrypt/alg-yescrypt-common.c
@@ -233,33 +233,29 @@ uint8_t *yescrypt_r(
233 } 233 }
234 if (!src) 234 if (!src)
235 return NULL; 235 return NULL;
236 if (*src++ != '$') 236 if (*src != '$')
237 return NULL; 237 return NULL;
238 238
239 prefixlen = src - setting; 239 saltstr = src + 1;
240 240 src = (uint8_t *)strchrnul((char *)saltstr, '$');
241 saltstr = src; 241 prefixlen = src - setting; /* len("$y$<params>$<salt>") */
242 src = (uint8_t *)strrchr((char *)saltstr, '$'); 242 saltstrlen = src - saltstr; /* len("<salt>") */
243 if (src) 243 /* src points to end of salt ('$' or NUL byte), won't be used past this point */
244 saltstrlen = src - saltstr;
245 else
246 saltstrlen = strlen((char *)saltstr);
247 244
248 saltlen = sizeof(saltbin); 245 saltlen = sizeof(saltbin);
249 saltend = decode64(saltbin, &saltlen, saltstr, saltstrlen); 246 saltend = decode64(saltbin, &saltlen, saltstr, saltstrlen);
247 if (saltend != saltstr + saltstrlen)
248 goto fail; /* saltbin[] is too small, or bad char during decode */
250 249
251 if (!saltend || (size_t)(saltend - saltstr) != saltstrlen) 250 need = prefixlen + 1 + HASH_LEN + 1;
252 goto fail; 251 if (need > buflen || need < prefixlen)
253
254 need = prefixlen + saltstrlen + 1 + HASH_LEN + 1;
255 if (need > buflen || need < saltstrlen)
256 goto fail; 252 goto fail;
257 253
258 if (yescrypt_kdf(local, passwd, passwdlen, saltbin, saltlen, 254 if (yescrypt_kdf(local, passwd, passwdlen, saltbin, saltlen,
259 &params, hashbin, sizeof(hashbin))) 255 &params, hashbin, sizeof(hashbin)))
260 goto fail; 256 goto fail;
261 257
262 dst = mempcpy(buf, setting, prefixlen + saltstrlen); 258 dst = mempcpy(buf, setting, prefixlen);
263 *dst++ = '$'; 259 *dst++ = '$';
264 dst = encode64(dst, buflen - (dst - buf), hashbin, sizeof(hashbin)); 260 dst = encode64(dst, buflen - (dst - buf), hashbin, sizeof(hashbin));
265 explicit_bzero(hashbin, sizeof(hashbin)); 261 explicit_bzero(hashbin, sizeof(hashbin));