aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2025-07-17 17:01:40 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2025-07-17 17:01:40 +0200
commitb823735b7eb6428e827cf463123d3caaa48804ff (patch)
treeb6b4e6f539233ab60be8b3549749b4d0ab42c61f
parentabe0b45cd7098f0f83f727d4d4c4c09dc2b172f7 (diff)
downloadbusybox-w32-b823735b7eb6428e827cf463123d3caaa48804ff.tar.gz
busybox-w32-b823735b7eb6428e827cf463123d3caaa48804ff.tar.bz2
busybox-w32-b823735b7eb6428e827cf463123d3caaa48804ff.zip
libbb/yescrypt: actually, largest allowed salt is 86 chars, support that
function old new delta yescrypt_r 767 756 -11 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--libbb/yescrypt/alg-yescrypt-common.c26
-rw-r--r--libbb/yescrypt/alg-yescrypt.h2
-rwxr-xr-xtestsuite/cryptpw.tests10
3 files changed, 23 insertions, 15 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
diff --git a/testsuite/cryptpw.tests b/testsuite/cryptpw.tests
index beac35efe..83bfde521 100755
--- a/testsuite/cryptpw.tests
+++ b/testsuite/cryptpw.tests
@@ -97,9 +97,13 @@ testing 'cryptpw yescrypt with 4-char salt "...."' \
97 'cryptpw -m yescrypt qweRTY123@-+ j9T\$....' \ 97 'cryptpw -m yescrypt qweRTY123@-+ j9T\$....' \
98 '$y$j9T$....$wOnauYL2/NEtr6YQi9pi8AtV7L57sEbVOAnWJIcP9q2\n' \ 98 '$y$j9T$....$wOnauYL2/NEtr6YQi9pi8AtV7L57sEbVOAnWJIcP9q2\n' \
99 '' '' 99 '' ''
100testing 'cryptpw yescrypt with 84-char salt (max size)' \ 100# 84 chars = 21 4-char blocks which decode into 21*3 = 63 bytes.
101 'cryptpw -m yescrypt qweRTY123@-+ j9T\$123456789012345678901234567890123456789012345678901234567890123456789012345678901234' \ 101# The last byte of the maximum allowed salt size has to come from an incomplete
102 '$y$j9T$123456789012345678901234567890123456789012345678901234567890123456789012345678901234$ubrUuPCpI97LIMlVMt/A0Mhs/kBK2UBJYcQSxEZSlz4\n' \ 102# char block. E.g. "z/" encodes byte 0x7f. "z1" is 0xff.
103# Anything larger (e.g. "z2") is an error (it encodes 0x13f).
104testing 'cryptpw yescrypt with 86-char salt (max size)' \
105 'cryptpw -m yescrypt qweRTY123@-+ j9T\$123456789012345678901234567890123456789012345678901234567890123456789012345678901234z/' \
106 '$y$j9T$123456789012345678901234567890123456789012345678901234567890123456789012345678901234z/$Exxe8IoPXiddFsqj7iqCanRf8FyquAoB0/uceLmLjG.\n' \
103 '' '' 107 '' ''
104testing 'cryptpw yescrypt implicit' \ 108testing 'cryptpw yescrypt implicit' \
105 'cryptpw qweRTY123@-+ \$y\$j9T\$123456789012345678901234' \ 109 'cryptpw qweRTY123@-+ \$y\$j9T\$123456789012345678901234' \