diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2025-07-07 18:28:56 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2025-07-07 18:28:56 +0200 |
| commit | 67b98c7b1b4e0eeeacdd3086baf24248c8ceeee9 (patch) | |
| tree | e87d0ebc1acb791667eda58bbfcdcc679de325e8 | |
| parent | e3484095f9fd48d771df4e49db8b6384b5219c21 (diff) | |
| download | busybox-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.c | 26 |
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 |
| 67 | static const uint8_t *decode64( | 67 | static 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; |
