aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
Diffstat (limited to 'libbb')
-rw-r--r--libbb/yescrypt/alg-yescrypt-common.c26
-rw-r--r--libbb/yescrypt/alg-yescrypt.h2
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