mp_radix off-by-one error and other related code-cleanup

This commit is contained in:
nijtmans 2019-10-30 14:19:50 +01:00 committed by Steffen Jaeckel
parent 7e47ae6550
commit bbb178089d
No known key found for this signature in database
GPG Key ID: AF0CB17621EDAD72
5 changed files with 21 additions and 25 deletions

View File

@ -1138,7 +1138,7 @@ static int test_mp_read_radix(void)
DO(mp_read_radix(&a, "123456", 10));
DO(mp_to_radix(&a, buf, SIZE_MAX, &written, 10));
DO(mp_to_radix(&a, buf, sizeof(buf), &written, 10));
printf(" '123456' a == %s, length = %zu", buf, written);
/* See comment in mp_to_radix.c */
@ -1153,11 +1153,11 @@ static int test_mp_read_radix(void)
buf, written, mp_error_to_string(err));
*/
DO(mp_read_radix(&a, "-123456", 10));
DO(mp_to_radix(&a, buf, SIZE_MAX, &written, 10));
DO(mp_to_radix(&a, buf, sizeof(buf), &written, 10));
printf("\r '-123456' a == %s, length = %zu", buf, written);
DO(mp_read_radix(&a, "0", 10));
DO(mp_to_radix(&a, buf, SIZE_MAX, &written, 10));
DO(mp_to_radix(&a, buf, sizeof(buf), &written, 10));
printf("\r '0' a == %s, length = %zu", buf, written);
while (0) {
@ -1335,7 +1335,7 @@ static int test_mp_reduce_2k_l(void)
mp_int a, b, c, d;
int cnt;
char buf[4096];
size_t length[1];
size_t length;
DOR(mp_init_multi(&a, &b, NULL));
/* test the mp_reduce_2k_l code */
# if LTM_DEMO_TEST_REDUCE_2K_L == 1
@ -1353,9 +1353,8 @@ static int test_mp_reduce_2k_l(void)
# else
# error oops
# endif
*length = sizeof(buf);
DO(mp_to_radix(&a, buf, length, 10));
printf("\n\np==%s, length = %zu\n", buf, *length);
DO(mp_to_radix(&a, buf, sizeof(buf), &length, 10));
printf("\n\np==%s, length = %zu\n", buf, length);
/* now mp_reduce_is_2k_l() should return */
if (mp_reduce_is_2k_l(&a) != 1) {
printf("mp_reduce_is_2k_l() return 0, should be 1\n");

View File

@ -35,14 +35,14 @@ mp_err mp_fread(mp_int *a, int radix, FILE *stream)
uint8_t y;
unsigned pos;
ch = (radix <= 36) ? MP_TOUPPER(ch) : ch;
pos = (unsigned)(ch - (int)'(');
if (MP_RMAP_REVERSE_SIZE < pos) {
pos = (unsigned)(ch - (int)'+');
if (MP_RMAP_REVERSE_SIZE <= pos) {
break;
}
y = s_mp_rmap_reverse[pos];
if ((y == 0xff) || (y >= radix)) {
if (y >= radix) {
break;
}

View File

@ -6,17 +6,14 @@
/* chars used in radix conversions */
const char s_mp_rmap[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";
const uint8_t s_mp_rmap_reverse[] = {
0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f, /* ()*+,-./ */
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 01234567 */
0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 89:;<=>? */
0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, /* @ABCDEFG */
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, /* HIJKLMNO */
0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, /* PQRSTUVW */
0x21, 0x22, 0x23, 0xff, 0xff, 0xff, 0xff, 0xff, /* XYZ[\]^_ */
0xff, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, /* `abcdefg */
0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, /* hijklmno */
0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, /* pqrstuvw */
0x3b, 0x3c, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, /* xyz{|}~. */
0x3e, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04, /* +,-./01234 */
0x05, 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, /* 56789:;<=> */
0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, /* ?@ABCDEFGH */
0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, /* IJKLMNOPQR */
0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0xff, 0xff, /* STUVWXYZ[\ */
0xff, 0xff, 0xff, 0xff, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, /* ]^_`abcdef */
0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, /* ghijklmnop */
0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d /* qrstuvwxyz */
};
MP_STATIC_ASSERT(correct_rmap_reverse_size, sizeof(s_mp_rmap_reverse) == MP_RMAP_REVERSE_SIZE)
#endif

View File

@ -33,8 +33,8 @@ mp_err mp_read_radix(mp_int *a, const char *str, int radix)
*/
uint8_t y;
char ch = (radix <= 36) ? (char)MP_TOUPPER((int)*str) : *str;
unsigned pos = (unsigned)(ch - '(');
if (MP_RMAP_REVERSE_SIZE < pos) {
unsigned pos = (unsigned)(ch - '+');
if (MP_RMAP_REVERSE_SIZE <= pos) {
break;
}
y = s_mp_rmap_reverse[pos];
@ -43,7 +43,7 @@ mp_err mp_read_radix(mp_int *a, const char *str, int radix)
* and is less than the given radix add it
* to the number, otherwise exit the loop.
*/
if ((y == 0xff) || (y >= radix)) {
if (y >= radix) {
break;
}
if ((err = mp_mul_d(a, (mp_digit)radix, a)) != MP_OKAY) {

View File

@ -193,7 +193,7 @@ MP_PRIVATE void s_mp_copy_digs(mp_digit *d, const mp_digit *s, int digits);
MP_PRIVATE mp_err s_mp_rand_jenkins(void *p, size_t n) MP_WUR;
MP_PRIVATE void s_mp_rand_jenkins_init(uint64_t seed);
#define MP_RMAP_REVERSE_SIZE 88u
#define MP_RMAP_REVERSE_SIZE 80u
extern MP_PRIVATE const char s_mp_rmap[];
extern MP_PRIVATE const uint8_t s_mp_rmap_reverse[];
extern MP_PRIVATE const mp_digit s_mp_prime_tab[];