diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2025-07-06 03:59:59 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2025-07-06 03:59:59 +0200 |
| commit | 85d3c48217bcbbe670aa466705fee703b95cbc36 (patch) | |
| tree | 47bd6005011b1c2b7718c0dfefb3d3f48f2410d7 /libbb | |
| parent | 1c977008e0b84f0d277367901b981c0d958dbdce (diff) | |
| download | busybox-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.c | 26 |
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 | ¶ms, hashbin, sizeof(hashbin))) | 255 | ¶ms, 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)); |
