Utility function: bignum_from_decimal.

This commit is contained in:
Simon Tatham 2015-05-12 12:10:42 +01:00
Родитель 6179c5cc7c
Коммит 9971da40c3
2 изменённых файлов: 28 добавлений и 1 удалений

1
ssh.h
Просмотреть файл

@ -630,6 +630,7 @@ Bignum bignum_rshift(Bignum number, int shift);
Bignum bignum_lshift(Bignum number, int shift);
int bignum_cmp(Bignum a, Bignum b);
char *bignum_decimal(Bignum x);
Bignum bignum_from_decimal(const char *decimal);
#ifdef DEBUG
void diagbn(char *prefix, Bignum md);

28
sshbn.c
Просмотреть файл

@ -7,6 +7,7 @@
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <ctype.h>
#include "misc.h"
@ -102,6 +103,7 @@ typedef BignumInt *Bignum;
BignumInt bnZero[1] = { 0 };
BignumInt bnOne[2] = { 1, 1 };
BignumInt bnTen[2] = { 1, 10 };
/*
* The Bignum format is an array of `BignumInt'. The first
@ -117,7 +119,7 @@ BignumInt bnOne[2] = { 1, 1 };
* nonzero.
*/
Bignum Zero = bnZero, One = bnOne;
Bignum Zero = bnZero, One = bnOne, Ten = bnTen;
static Bignum newbn(int length)
{
@ -1255,6 +1257,30 @@ Bignum bignum_from_bytes_le(const unsigned char *data, int nbytes)
return result;
}
Bignum bignum_from_decimal(const char *decimal)
{
Bignum result = copybn(Zero);
while (*decimal) {
Bignum tmp, tmp2;
if (!isdigit((unsigned char)*decimal)) {
freebn(result);
return 0;
}
tmp = bigmul(result, Ten);
tmp2 = bignum_from_long(*decimal - '0');
result = bigadd(tmp, tmp2);
freebn(tmp);
freebn(tmp2);
decimal++;
}
return result;
}
Bignum bignum_random_in_range(const Bignum lower, const Bignum upper)
{
Bignum ret = NULL;