support base 64 for GMP
This commit is contained in:
parent
20f0c74d17
commit
3fbccfcb5c
@ -138,13 +138,49 @@ static int twoexpt(void *a, int n)
|
|||||||
|
|
||||||
/* ---- conversions ---- */
|
/* ---- conversions ---- */
|
||||||
|
|
||||||
|
static const char rmap[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";
|
||||||
|
|
||||||
/* read ascii string */
|
/* read ascii string */
|
||||||
static int read_radix(void *a, const char *b, int radix)
|
static int read_radix(void *a, const char *b, int radix)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
LTC_ARGCHK(a != NULL);
|
LTC_ARGCHK(a != NULL);
|
||||||
LTC_ARGCHK(b != NULL);
|
LTC_ARGCHK(b != NULL);
|
||||||
mpz_set_str(a, b, radix);
|
if (radix == 64) {
|
||||||
return CRYPT_OK;
|
/* Sadly, GMP only supports radixes up to 62, but we need 64.
|
||||||
|
* So, although this is not the most elegant or efficient way,
|
||||||
|
* let's just convert the base 64 string (6 bits per digit) to
|
||||||
|
* an octal string (3 bits per digit) that's twice as long. */
|
||||||
|
char c, *tmp, *q;
|
||||||
|
const char *p;
|
||||||
|
int i;
|
||||||
|
tmp = XMALLOC (1 + 2 * strlen (b));
|
||||||
|
if (tmp == NULL) {
|
||||||
|
return CRYPT_MEM;
|
||||||
|
}
|
||||||
|
p = b;
|
||||||
|
q = tmp;
|
||||||
|
while ((c = *p++) != 0) {
|
||||||
|
for (i = 0; i < 64; i++) {
|
||||||
|
if (c == rmap[i])
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == 64) {
|
||||||
|
XFREE (tmp);
|
||||||
|
// printf ("c = '%c'\n", c);
|
||||||
|
return CRYPT_ERROR;
|
||||||
|
}
|
||||||
|
*q++ = '0' + (i / 8);
|
||||||
|
*q++ = '0' + (i % 8);
|
||||||
|
}
|
||||||
|
*q = 0;
|
||||||
|
ret = mpz_set_str(a, tmp, 8);
|
||||||
|
// printf ("ret = %d for '%s'\n", ret, tmp);
|
||||||
|
XFREE (tmp);
|
||||||
|
} else {
|
||||||
|
ret = mpz_set_str(a, b, radix);
|
||||||
|
}
|
||||||
|
return (ret == 0 ? CRYPT_OK : CRYPT_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* write one */
|
/* write one */
|
||||||
|
Loading…
Reference in New Issue
Block a user