diff options
Diffstat (limited to 'libbb')
| -rw-r--r-- | libbb/yescrypt/alg-yescrypt-common.c | 26 | ||||
| -rw-r--r-- | libbb/yescrypt/alg-yescrypt.h | 2 |
2 files changed, 16 insertions, 12 deletions
diff --git a/libbb/yescrypt/alg-yescrypt-common.c b/libbb/yescrypt/alg-yescrypt-common.c index 1c063b895..c51823787 100644 --- a/libbb/yescrypt/alg-yescrypt-common.c +++ b/libbb/yescrypt/alg-yescrypt-common.c | |||
| @@ -152,13 +152,13 @@ static const uint8_t *decode64( | |||
| 152 | uint8_t *dst, size_t *dstlen, | 152 | uint8_t *dst, size_t *dstlen, |
| 153 | const uint8_t *src) | 153 | const uint8_t *src) |
| 154 | { | 154 | { |
| 155 | size_t dstpos = 0; | 155 | unsigned dstpos = 0; |
| 156 | 156 | ||
| 157 | dbg_dec64("src:'%s'", src); | 157 | dbg_dec64("src:'%s'", src); |
| 158 | for (;;) { | 158 | for (;;) { |
| 159 | uint32_t c, value = 0; | 159 | uint32_t c, value = 0; |
| 160 | int bits = 0; | 160 | int bits = 0; |
| 161 | while (*src && *src != '$') { | 161 | while (*src != '\0' && *src != '$') { |
| 162 | c = a2i64(*src); | 162 | c = a2i64(*src); |
| 163 | if (c > 63) { /* bad ascii64 char, stop decoding at it */ | 163 | if (c > 63) { /* bad ascii64 char, stop decoding at it */ |
| 164 | break; | 164 | break; |
| @@ -174,9 +174,11 @@ static const uint8_t *decode64( | |||
| 174 | break; | 174 | break; |
| 175 | /* else: we got last, partial bit block - store it */ | 175 | /* else: we got last, partial bit block - store it */ |
| 176 | store: | 176 | store: |
| 177 | dbg_dec64(" storing bits:%d v:%08x", bits, (int)SWAP_BE32(value)); //BE to see lsb first | 177 | dbg_dec64(" storing bits:%d dstpos:%u v:%08x", bits, dstpos, (int)SWAP_BE32(value)); //BE to see lsb first |
| 178 | while (dstpos < *dstlen) { | 178 | for (;;) { |
| 179 | if ((!*src || *src == '$') && value == 0 && bits < 8) { | 179 | if ((*src == '\0' || *src == '$') |
| 180 | && value == 0 && bits < 8 | ||
| 181 | ) { | ||
| 180 | /* Example: mkpasswd PWD '$y$j9T$123': | 182 | /* Example: mkpasswd PWD '$y$j9T$123': |
| 181 | * the "123" is bits:18 value:03,51,00 | 183 | * the "123" is bits:18 value:03,51,00 |
| 182 | * is considered to be 2 bytes, not 3! | 184 | * is considered to be 2 bytes, not 3! |
| @@ -190,17 +192,18 @@ static const uint8_t *decode64( | |||
| 190 | */ | 192 | */ |
| 191 | goto end; | 193 | goto end; |
| 192 | } | 194 | } |
| 193 | dstpos++; | 195 | if (dstpos >= *dstlen) { |
| 196 | dbg_dec64(" ERR: bits:%d dstpos:%u dst[] is too small", bits, dstpos); | ||
| 197 | goto fail; | ||
| 198 | } | ||
| 194 | *dst++ = value; | 199 | *dst++ = value; |
| 200 | dstpos++; | ||
| 195 | value >>= 8; | 201 | value >>= 8; |
| 196 | bits -= 8; | 202 | bits -= 8; |
| 197 | if (bits <= 0) /* can get negative, if we e.g. had 6 bits */ | 203 | if (bits <= 0) /* can get negative, if we e.g. had 6 bits */ |
| 198 | goto next; | 204 | break; |
| 199 | } | 205 | } |
| 200 | dbg_dec64(" ERR: bits:%d dst[] is too small", bits); | 206 | if (*src == '\0' || *src == '$') |
| 201 | goto fail; | ||
| 202 | next: | ||
| 203 | if (!*src || *src == '$') | ||
| 204 | break; | 207 | break; |
| 205 | } | 208 | } |
| 206 | end: | 209 | end: |
| @@ -376,6 +379,7 @@ char *yescrypt_r( | |||
| 376 | saltend = decode64(yctx->salt, &yctx->saltlen, src); | 379 | saltend = decode64(yctx->salt, &yctx->saltlen, src); |
| 377 | if (!saltend || (*saltend != '\0' && *saltend != '$')) | 380 | if (!saltend || (*saltend != '\0' && *saltend != '$')) |
| 378 | goto fail; /* salt[] is too small, or bad char during decode */ | 381 | goto fail; /* salt[] is too small, or bad char during decode */ |
| 382 | dbg_dec64("salt is %d ascii64 chars -> %d bytes (in binary)", (int)(saltend - src), (int)yctx->saltlen); | ||
| 379 | 383 | ||
| 380 | prefixlen = saltend - setting; | 384 | prefixlen = saltend - setting; |
| 381 | need = prefixlen + 1 + YESCRYPT_HASH_LEN + 1; | 385 | need = prefixlen + 1 + YESCRYPT_HASH_LEN + 1; |
diff --git a/libbb/yescrypt/alg-yescrypt.h b/libbb/yescrypt/alg-yescrypt.h index 0b93945af..5051efbb4 100644 --- a/libbb/yescrypt/alg-yescrypt.h +++ b/libbb/yescrypt/alg-yescrypt.h | |||
| @@ -139,7 +139,7 @@ | |||
| 139 | #define YESCRYPT_GATHER_8 0x018 //gg=11 | 139 | #define YESCRYPT_GATHER_8 0x018 //gg=11 |
| 140 | #define YESCRYPT_SIMPLE_1 0x000 //ss=00 | 140 | #define YESCRYPT_SIMPLE_1 0x000 //ss=00 |
| 141 | #define YESCRYPT_SIMPLE_2 0x020 //ss=01 | 141 | #define YESCRYPT_SIMPLE_2 0x020 //ss=01 |
| 142 | #define YESCRYPT_SIMPLE_4 0x040 //ss=11 | 142 | #define YESCRYPT_SIMPLE_4 0x040 //ss=10 |
| 143 | #define YESCRYPT_SIMPLE_8 0x060 //ss=11 | 143 | #define YESCRYPT_SIMPLE_8 0x060 //ss=11 |
| 144 | #define YESCRYPT_SBOX_6K 0x000 //sbox=0000 | 144 | #define YESCRYPT_SBOX_6K 0x000 //sbox=0000 |
| 145 | #define YESCRYPT_SBOX_12K 0x080 //sbox=0001 | 145 | #define YESCRYPT_SBOX_12K 0x080 //sbox=0001 |
