mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 09:58:01 +00:00
Add tests of modpow.
[originally from svn r9100]
This commit is contained in:
parent
1b47322c3b
commit
15d7f8bb3e
68
sshbn.c
68
sshbn.c
@ -1737,6 +1737,9 @@ char *bignum_decimal(Bignum x)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* gcc -g -O0 -DTESTBN -o testbn sshbn.c misc.c -I unix -I charset
|
* gcc -g -O0 -DTESTBN -o testbn sshbn.c misc.c -I unix -I charset
|
||||||
|
*
|
||||||
|
* Then feed to this program's standard input the output of
|
||||||
|
* testdata/bignum.py .
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void modalfatalbox(char *p, ...)
|
void modalfatalbox(char *p, ...)
|
||||||
@ -1761,7 +1764,7 @@ int main(int argc, char **argv)
|
|||||||
while ((buf = fgetline(stdin)) != NULL) {
|
while ((buf = fgetline(stdin)) != NULL) {
|
||||||
int maxlen = strlen(buf);
|
int maxlen = strlen(buf);
|
||||||
unsigned char *data = snewn(maxlen, unsigned char);
|
unsigned char *data = snewn(maxlen, unsigned char);
|
||||||
unsigned char *ptrs[4], *q;
|
unsigned char *ptrs[5], *q;
|
||||||
int ptrnum;
|
int ptrnum;
|
||||||
char *bufp = buf;
|
char *bufp = buf;
|
||||||
|
|
||||||
@ -1770,6 +1773,11 @@ int main(int argc, char **argv)
|
|||||||
q = data;
|
q = data;
|
||||||
ptrnum = 0;
|
ptrnum = 0;
|
||||||
|
|
||||||
|
while (*bufp && !isspace((unsigned char)*bufp))
|
||||||
|
bufp++;
|
||||||
|
if (bufp)
|
||||||
|
*bufp++ = '\0';
|
||||||
|
|
||||||
while (*bufp) {
|
while (*bufp) {
|
||||||
char *start, *end;
|
char *start, *end;
|
||||||
int i;
|
int i;
|
||||||
@ -1798,11 +1806,17 @@ int main(int argc, char **argv)
|
|||||||
ptrs[ptrnum] = q;
|
ptrs[ptrnum] = q;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ptrnum == 3) {
|
if (!strcmp(buf, "mul")) {
|
||||||
Bignum a = bignum_from_bytes(ptrs[0], ptrs[1]-ptrs[0]);
|
Bignum a, b, c, p;
|
||||||
Bignum b = bignum_from_bytes(ptrs[1], ptrs[2]-ptrs[1]);
|
|
||||||
Bignum c = bignum_from_bytes(ptrs[2], ptrs[3]-ptrs[2]);
|
if (ptrnum != 3) {
|
||||||
Bignum p = bigmul(a, b);
|
printf("%d: mul with %d parameters, expected 3\n", line);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
a = bignum_from_bytes(ptrs[0], ptrs[1]-ptrs[0]);
|
||||||
|
b = bignum_from_bytes(ptrs[1], ptrs[2]-ptrs[1]);
|
||||||
|
c = bignum_from_bytes(ptrs[2], ptrs[3]-ptrs[2]);
|
||||||
|
p = bigmul(a, b);
|
||||||
|
|
||||||
if (bignum_cmp(c, p) == 0) {
|
if (bignum_cmp(c, p) == 0) {
|
||||||
passes++;
|
passes++;
|
||||||
@ -1825,7 +1839,49 @@ int main(int argc, char **argv)
|
|||||||
freebn(b);
|
freebn(b);
|
||||||
freebn(c);
|
freebn(c);
|
||||||
freebn(p);
|
freebn(p);
|
||||||
|
} else if (!strcmp(buf, "pow")) {
|
||||||
|
Bignum base, expt, modulus, expected, answer;
|
||||||
|
|
||||||
|
if (ptrnum != 4) {
|
||||||
|
printf("%d: mul with %d parameters, expected 3\n", line);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
base = bignum_from_bytes(ptrs[0], ptrs[1]-ptrs[0]);
|
||||||
|
expt = bignum_from_bytes(ptrs[1], ptrs[2]-ptrs[1]);
|
||||||
|
modulus = bignum_from_bytes(ptrs[2], ptrs[3]-ptrs[2]);
|
||||||
|
expected = bignum_from_bytes(ptrs[3], ptrs[4]-ptrs[3]);
|
||||||
|
answer = modpow(base, expt, modulus);
|
||||||
|
|
||||||
|
if (bignum_cmp(expected, answer) == 0) {
|
||||||
|
passes++;
|
||||||
|
} else {
|
||||||
|
char *as = bignum_decimal(base);
|
||||||
|
char *bs = bignum_decimal(expt);
|
||||||
|
char *cs = bignum_decimal(modulus);
|
||||||
|
char *ds = bignum_decimal(answer);
|
||||||
|
char *ps = bignum_decimal(expected);
|
||||||
|
|
||||||
|
printf("%d: fail: %s ^ %s mod %s gave %s expected %s\n",
|
||||||
|
line, as, bs, cs, ds, ps);
|
||||||
|
fails++;
|
||||||
|
|
||||||
|
sfree(as);
|
||||||
|
sfree(bs);
|
||||||
|
sfree(cs);
|
||||||
|
sfree(ds);
|
||||||
|
sfree(ps);
|
||||||
|
}
|
||||||
|
freebn(base);
|
||||||
|
freebn(expt);
|
||||||
|
freebn(modulus);
|
||||||
|
freebn(expected);
|
||||||
|
freebn(answer);
|
||||||
|
} else {
|
||||||
|
printf("%d: unrecognised test keyword: '%s'\n", line, buf);
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
sfree(buf);
|
sfree(buf);
|
||||||
sfree(data);
|
sfree(data);
|
||||||
}
|
}
|
||||||
|
11
testdata/bignum.py
vendored
11
testdata/bignum.py
vendored
@ -77,6 +77,13 @@ def hexstr(n):
|
|||||||
# carry to the very top of the number.
|
# carry to the very top of the number.
|
||||||
for i in range(1,4200):
|
for i in range(1,4200):
|
||||||
a, b, p = findprod((1<<i)+1, +1, (i, i*i+1))
|
a, b, p = findprod((1<<i)+1, +1, (i, i*i+1))
|
||||||
print hexstr(a), hexstr(b), hexstr(p)
|
print "mul", hexstr(a), hexstr(b), hexstr(p)
|
||||||
a, b, p = findprod((1<<i)+1, +1, (i, i+1))
|
a, b, p = findprod((1<<i)+1, +1, (i, i+1))
|
||||||
print hexstr(a), hexstr(b), hexstr(p)
|
print "mul", hexstr(a), hexstr(b), hexstr(p)
|
||||||
|
|
||||||
|
# Simple tests of modpow.
|
||||||
|
for i in range(64, 4097, 63):
|
||||||
|
modulus = mathlib.sqrt(1<<(2*i-1)) | 1
|
||||||
|
base = mathlib.sqrt(3*modulus*modulus) % modulus
|
||||||
|
expt = mathlib.sqrt(modulus*modulus*2/5)
|
||||||
|
print "pow", hexstr(base), hexstr(expt), hexstr(modulus), hexstr(pow(base, expt, modulus))
|
||||||
|
Loading…
Reference in New Issue
Block a user