aboutsummaryrefslogtreecommitdiffstats
path: root/src/tests/test_bigint.cpp
diff options
context:
space:
mode:
authorJack Lloyd <[email protected]>2016-01-29 14:35:30 -0500
committerJack Lloyd <[email protected]>2016-02-01 06:14:44 -0500
commitd7471d1d3bbb8b2ed454cb2e2ae15a7d178f2770 (patch)
tree8fe6b3e74fead0ff32fc956e50f68c821bdc17a7 /src/tests/test_bigint.cpp
parent61f919adb8bb3e0ba225f1758d679f775df876ba (diff)
Fix (nearly) infinite loop in RESSOL (modular square root).
It first computed the first i for q**(2**i) == 1, then checked that i was smaller than s. Given a composite modulus (for which the algorithm does not work), the loop might do a very large amount of work before returning the failure.
Diffstat (limited to 'src/tests/test_bigint.cpp')
-rw-r--r--src/tests/test_bigint.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/tests/test_bigint.cpp b/src/tests/test_bigint.cpp
index e63be6333..33db242aa 100644
--- a/src/tests/test_bigint.cpp
+++ b/src/tests/test_bigint.cpp
@@ -278,6 +278,24 @@ class BigInt_KAT_Tests : public Text_Based_Test
result.test_eq("value", Botan::is_prime(value, Test::rng()), v_is_prime);
}
+ else if(algo == "RESSOL")
+ {
+ const Botan::BigInt a = get_req_bn(vars, "Input");
+ const Botan::BigInt p = get_req_bn(vars, "Modulus");
+ const Botan::BigInt exp = get_req_bn(vars, "Output");
+
+ const Botan::BigInt a_sqrt = Botan::ressol(a, p);
+
+ result.test_eq("result", a_sqrt, exp);
+
+ if(a_sqrt > 1)
+ {
+ const Botan::BigInt a_sqrt2 = (a_sqrt*a_sqrt) % p;
+ result.test_eq("square correct", a_sqrt2, a);
+ }
+
+ return result;
+ }
else
{
result.test_failure("Unknown BigInt algorithm " + algo);