From 9971da40c3d45850eccde0fbfc038c0c9faef500 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Tue, 12 May 2015 12:10:42 +0100 Subject: [PATCH] Utility function: bignum_from_decimal. --- ssh.h | 1 + sshbn.c | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/ssh.h b/ssh.h index 256478cb..56b770e0 100644 --- a/ssh.h +++ b/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); diff --git a/sshbn.c b/sshbn.c index b5c99125..0d64620d 100644 --- a/sshbn.c +++ b/sshbn.c @@ -7,6 +7,7 @@ #include #include #include +#include #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;