summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorCesar Pereida Garcia <cesar.pereidagarcia@tut.fi>2019-09-20 14:11:19 +0300
committerNicola Tuveri <nic.tuv@gmail.com>2019-10-17 14:31:52 +0300
commitaa20a9b3e098f8ed95184a33ffbf2166039f2fd1 (patch)
treee4d57876e9ad1b79997ea80bacc8c4b5b65eaa73 /test
parentef599605040bc5c1a426ccd83d58cd0dd294509f (diff)
Add GCD testing infrastructure.
This commit adds testing and Known Answer Tests (KATs) to OpenSSL for the `BN_gcd` function. (cherry picked from commit b75d6310857bc44ef2851bde68a1979c18bb4807) Reviewed-by: Paul Dale <paul.dale@oracle.com> Reviewed-by: Nicola Tuveri <nic.tuv@gmail.com> Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from https://github.com/openssl/openssl/pull/10122)
Diffstat (limited to 'test')
-rw-r--r--test/bntest.c54
-rw-r--r--test/recipes/10-test_bn.t5
-rw-r--r--test/recipes/10-test_bn_data/bngcd.txt17179
3 files changed, 17235 insertions, 3 deletions
diff --git a/test/bntest.c b/test/bntest.c
index 0bd9a06f72..9f63ec121c 100644
--- a/test/bntest.c
+++ b/test/bntest.c
@@ -1634,6 +1634,30 @@ static int file_modsqrt(STANZA *s)
return st;
}
+static int file_gcd(STANZA *s)
+{
+ BIGNUM *a = NULL, *b = NULL, *gcd = NULL, *ret = NULL;
+ int st = 0;
+
+ if (!TEST_ptr(a = getBN(s, "A"))
+ || !TEST_ptr(b = getBN(s, "B"))
+ || !TEST_ptr(gcd = getBN(s, "GCD"))
+ || !TEST_ptr(ret = BN_new()))
+ goto err;
+
+ if (!TEST_true(BN_gcd(ret, a, b, ctx))
+ || !equalBN("gcd(A,B)", gcd, ret))
+ goto err;
+
+ st = 1;
+ err:
+ BN_free(a);
+ BN_free(b);
+ BN_free(gcd);
+ BN_free(ret);
+ return st;
+}
+
static int test_bn2padded(void)
{
#if HAVE_BN_PADDED
@@ -2352,6 +2376,34 @@ static int test_ctx_consttime_flag(void)
return st;
}
+static int test_gcd_prime(void)
+{
+ BIGNUM *a = NULL, *b = NULL, *gcd = NULL;
+ int i, st = 0;
+
+ if (!TEST_ptr(a = BN_new())
+ || !TEST_ptr(b = BN_new())
+ || !TEST_ptr(gcd = BN_new()))
+ goto err;
+
+ if (!TEST_true(BN_generate_prime_ex(a, 1024, 0, NULL, NULL, NULL)))
+ goto err;
+ for (i = 0; i < NUM0; i++) {
+ if (!TEST_true(BN_generate_prime_ex(b, 1024, 0,
+ NULL, NULL, NULL))
+ || !TEST_true(BN_gcd(gcd, a, b, ctx))
+ || !TEST_true(BN_is_one(gcd)))
+ goto err;
+ }
+
+ st = 1;
+ err:
+ BN_free(a);
+ BN_free(b);
+ BN_free(gcd);
+ return st;
+}
+
static int file_test_run(STANZA *s)
{
static const FILETEST filetests[] = {
@@ -2366,6 +2418,7 @@ static int file_test_run(STANZA *s)
{"ModExp", file_modexp},
{"Exp", file_exp},
{"ModSqrt", file_modsqrt},
+ {"GCD", file_gcd},
};
int numtests = OSSL_NELEM(filetests);
const FILETEST *tp = filetests;
@@ -2454,6 +2507,7 @@ int setup_tests(void)
#endif
ADD_ALL_TESTS(test_is_prime, (int)OSSL_NELEM(primes));
ADD_ALL_TESTS(test_not_prime, (int)OSSL_NELEM(not_primes));
+ ADD_TEST(test_gcd_prime);
} else {
ADD_ALL_TESTS(run_file_tests, n);
}
diff --git a/test/recipes/10-test_bn.t b/test/recipes/10-test_bn.t
index a663009ce9..4e38c8f8b4 100644
--- a/test/recipes/10-test_bn.t
+++ b/test/recipes/10-test_bn.t
@@ -16,9 +16,8 @@ use OpenSSL::Test qw/:DEFAULT data_file/;
setup("test_bn");
-my @files = (
- "bnexp.txt", "bnmod.txt", "bnmul.txt", "bnshift.txt", "bnsum.txt"
- );
+my @files = qw( bnexp.txt bnmod.txt bnmul.txt bnshift.txt bnsum.txt bngcd.txt );
+
plan tests => 1 + scalar(@files);
foreach my $f ( @files ) {
diff --git a/test/recipes/10-test_bn_data/bngcd.txt b/test/recipes/10-test_bn_data/bngcd.txt
new file mode 100644
index 0000000000..ea19336b5d
--- /dev/null
+++ b/test/recipes/10-test_bn_data/bngcd.txt
@@ -0,0 +1,17179 @@
+# Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
+#
+# Licensed under the Apache License 2.0 (the "License"). You may not use
+# this file except in compliance with the License. You can obtain a copy
+# in the file LICENSE in the source distribution or at
+# https://www.openssl.org/source/license.html
+
+# GCD tests.
+#
+# These test vectors satisfy gcd(A, B) = GCD.
+# They were generated with sage, independent of OpenSSL.
+
+A = 0
+B = 0
+GCD = 0
+
+# gcd(1,0) = 1
+A = 1
+B = 0
+GCD = 1
+
+# gcd(1,1) = 1
+A = 1
+B = 1
+GCD = 1
+
+# gcd(0,a) = a
+A = 0
+B = 70030ffeeea3deaea19387f4f1d0f460a6954a2a9cb98290602ac09036143ef8eb9692f3eac22961811083e073ee0be1506c24d7b0d4eb0089406758828f7c99dc01692846f88aafb58b2d56a6dd1157b781eeaf807d59496aac6ca754f8830b743ea938ce16cbe03c8fd8675c78ba2420d502f2227a9bbe3979865cd154cbb2
+GCD = 70030ffeeea3deaea19387f4f1d0f460a6954a2a9cb98290602ac09036143ef8eb9692f3eac22961811083e073ee0be1506c24d7b0d4eb0089406758828f7c99dc01692846f88aafb58b2d56a6dd1157b781eeaf807d59496aac6ca754f8830b743ea938ce16cbe03c8fd8675c78ba2420d502f2227a9bbe3979865cd154cbb2
+
+# gcd(-a,0) = |a|
+A = -231f16458c487346cf50a17beec83632f25d19abeea1097c746533cd3e35207b7efd75dc3e9c663a64b6861e88579dad08649f107a13edf2ad43d0056f9240ad2a08c4aba20f05cc4aad23eb47e77cc8031df5b1c735b55103e164ca6c07bd040e12616df28064e5895a8903a26dfde7e88229a8d29fc4cb77711bf81bd04db9
+B = 0
+GCD = 231f16458c487346cf50a17beec83632f25d19abeea1097c746533cd3e35207b7efd75dc3e9c663a64b6861e88579dad08649f107a13edf2ad43d0056f9240ad2a08c4aba20f05cc4aad23eb47e77cc8031df5b1c735b55103e164ca6c07bd040e12616df28064e5895a8903a26dfde7e88229a8d29fc4cb77711bf81bd04db9
+
+# for even i, test:
+# gcd(2**i - 1, 2**(i/2) - 1) = 2**(i/2) - 1
+# gcd(2**i - 1, 2**(i/2) + 1) = 2**(i/2) + 1
+A = f
+B = 3
+GCD = 3
+
+A = f
+B = 5
+GCD = 5
+
+A = 3f
+B = 7
+GCD = 7
+
+A = 3f
+B = 9
+GCD = 9
+
+A = ff
+B = f
+GCD = f
+
+A = ff
+B = 11
+GCD = 11
+
+A = 3ff
+B = 1f
+GCD = 1f
+
+A = 3ff
+B = 21
+GCD = 21
+
+A = fff
+B = 3f
+GCD = 3f
+
+A = fff
+B = 41
+GCD = 41
+
+A = 3fff
+B = 7f
+GCD = 7f
+
+A = 3fff
+B = 81
+GCD = 81
+
+A = ffff
+B = ff
+GCD = ff
+
+A = ffff
+B = 101
+GCD = 101
+
+A = 3ffff
+B = 1ff
+GCD = 1ff
+
+A = 3ffff
+B = 201
+GCD = 201
+
+A = fffff
+B = 3ff
+GCD = 3ff
+
+A = fffff
+B = 401
+GCD = 401
+
+A = 3fffff
+B = 7ff
+GCD = 7ff
+
+A = 3fffff
+B = 801
+GCD = 801
+
+A = ffffff
+B = fff
+GCD = fff
+
+A = ffffff
+B = 1001
+GCD = 1001
+
+A = 3ffffff
+B = 1fff
+GCD = 1fff
+
+A = 3ffffff
+B = 2001
+GCD = 2001
+
+A = fffffff
+B = 3fff
+GCD = 3fff
+
+A = fffffff
+B = 4001
+GCD = 4001
+
+A = 3fffffff
+B = 7fff
+GCD = 7fff
+
+A = 3fffffff
+B = 8001
+GCD = 8001
+
+A = ffffffff
+B = ffff
+GCD = ffff
+
+A = ffffffff
+B = 10001
+GCD = 10001
+
+A = 3ffffffff
+B = 1ffff
+GCD = 1ffff
+
+A = 3ffffffff
+B = 20001
+GCD = 20001
+
+A = fffffffff
+B = 3ffff
+GCD = 3ffff
+
+A = fffffffff
+B = 40001
+GCD = 40001
+
+A = 3fffffffff
+B = 7ffff
+GCD = 7ffff
+
+A = 3fffffffff
+B = 80001
+GCD = 80001
+
+A = ffffffffff
+B = fffff
+GCD = fffff
+
+A = ffffffffff
+B = 100001
+GCD = 100001
+
+A = 3ffffffffff
+B = 1fffff
+GCD = 1fffff
+
+A = 3ffffffffff
+B = 200001
+GCD = 200001
+
+A = fffffffffff
+B = 3fffff
+GCD = 3fffff
+
+A = fffffffffff
+B = 400001
+GCD = 400001
+
+A = 3fffffffffff
+B = 7fffff
+GCD = 7fffff
+
+A = 3fffffffffff
+B = 800001
+GCD = 800001
+
+A = ffffffffffff
+B = ffffff
+GCD = ffffff
+
+A = ffffffffffff
+B = 1000001
+GCD = 1000001
+
+A = 3ffffffffffff
+B = 1ffffff
+GCD = 1ffffff
+
+A = 3ffffffffffff
+B = 2000001
+GCD = 2000001
+
+A = fffffffffffff
+B = 3ffffff
+GCD = 3ffffff
+
+A = fffffffffffff
+B = 4000001
+GCD = 4000001
+
+A = 3fffffffffffff
+B = 7ffffff
+GCD = 7ffffff
+
+A = 3fffffffffffff
+B = 8000001
+GCD = 8000001
+
+A = ffffffffffffff
+B = fffffff
+GCD = fffffff
+
+A = ffffffffffffff
+B = 10000001
+GCD = 10000001
+
+A = 3ffffffffffffff
+B = 1fffffff
+GCD = 1fffffff
+
+A = 3ffffffffffffff
+B = 20000001
+GCD = 20000001
+
+A = fffffffffffffff
+B = 3fffffff
+GCD = 3fffffff
+
+A = fffffffffffffff
+B = 40000001
+GCD = 40000001
+
+A = 3fffffffffffffff
+B = 7fffffff
+GCD = 7fffffff
+
+A = 3fffffffffffffff
+B = 80000001
+GCD = 80000001
+
+A = ffffffffffffffff
+B = ffffffff
+GCD = ffffffff
+
+A = ffffffffffffffff
+B = 100000001
+GCD = 100000001
+
+A = 3ffffffffffffffff
+B = 1ffffffff
+GCD = 1ffffffff
+
+A = 3ffffffffffffffff
+B = 200000001
+GCD = 200000001
+
+A = fffffffffffffffff
+B = 3ffffffff
+GCD = 3ffffffff
+
+A = fffffffffffffffff
+B = 400000001
+GCD = 400000001
+
+A = 3fffffffffffffffff
+B = 7ffffffff
+GCD = 7ffffffff
+
+A = 3fffffffffffffffff
+B = 800000001
+GCD = 800000001
+
+A = ffffffffffffffffff
+B = fffffffff
+GCD = fffffffff
+
+A = ffffffffffffffffff
+B = 1000000001
+GCD = 1000000001
+
+A = 3ffffffffffffffffff
+B = 1fffffffff
+GCD = 1fffffffff
+
+A = 3ffffffffffffffffff
+B = 2000000001
+GCD = 2000000001
+
+A = fffffffffffffffffff
+B = 3fffffffff
+GCD = 3fffffffff
+
+A = fffffffffffffffffff
+B = 4000000001
+GCD = 4000000001
+
+A = 3fffffffffffffffffff
+B = 7fffffffff
+GCD = 7fffffffff
+
+A = 3fffffffffffffffffff
+B = 8000000001
+GCD = 8000000001
+
+A = ffffffffffffffffffff
+B = ffffffffff
+GCD = ffffffffff
+
+A = ffffffffffffffffffff
+B = 10000000001
+GCD = 10000000001
+
+A = 3ffffffffffffffffffff
+B = 1ffffffffff
+GCD = 1ffffffffff
+
+A = 3ffffffffffffffffffff
+B = 20000000001
+GCD = 20000000001
+
+A = fffffffffffffffffffff
+B = 3ffffffffff
+GCD = 3ffffffffff
+
+A = fffffffffffffffffffff
+B = 40000000001
+GCD = 40000000001
+
+A = 3fffffffffffffffffffff
+B = 7ffffffffff
+GCD = 7ffffffffff
+
+A = 3fffffffffffffffffffff
+B = 80000000001
+GCD = 80000000001
+
+A = ffffffffffffffffffffff
+B = fffffffffff
+GCD = fffffffffff
+
+A = ffffffffffffffffffffff
+B = 100000000001
+GCD = 100000000001
+
+A = 3ffffffffffffffffffffff
+B = 1fffffffffff
+GCD = 1fffffffffff
+
+A = 3ffffffffffffffffffffff
+B = 200000000001
+GCD = 200000000001
+
+A = fffffffffffffffffffffff
+B = 3fffffffffff
+GCD = 3fffffffffff
+
+A = fffffffffffffffffffffff
+B = 400000000001
+GCD = 400000000001
+
+A = 3fffffffffffffffffffffff
+B = 7fffffffffff
+GCD = 7fffffffffff
+
+A = 3fffffffffffffffffffffff
+B = 800000000001
+GCD = 800000000001
+
+A = ffffffffffffffffffffffff
+B = ffffffffffff
+GCD = ffffffffffff
+
+A = ffffffffffffffffffffffff
+B = 1000000000001
+GCD = 1000000000001
+
+A = 3ffffffffffffffffffffffff
+B = 1ffffffffffff
+GCD = 1ffffffffffff
+
+A = 3ffffffffffffffffffffffff
+B = 2000000000001
+GCD = 2000000000001
+
+A = fffffffffffffffffffffffff
+B = 3ffffffffffff
+GCD = 3ffffffffffff
+
+A = fffffffffffffffffffffffff
+B = 4000000000001
+GCD = 4000000000001
+
+A = 3fffffffffffffffffffffffff
+B = 7ffffffffffff
+GCD = 7ffffffffffff
+
+A = 3fffffffffffffffffffffffff
+B = 8000000000001
+GCD = 8000000000001
+
+A = ffffffffffffffffffffffffff
+B = fffffffffffff
+GCD = fffffffffffff
+
+A = ffffffffffffffffffffffffff
+B = 10000000000001
+GCD = 10000000000001
+
+A = 3ffffffffffffffffffffffffff
+B = 1fffffffffffff
+GCD = 1fffffffffffff
+
+A = 3ffffffffffffffffffffffffff
+B = 20000000000001
+GCD = 20000000000001
+
+A = fffffffffffffffffffffffffff
+B = 3fffffffffffff
+GCD = 3fffffffffffff
+
+A = fffffffffffffffffffffffffff
+B = 40000000000001
+GCD = 40000000000001
+
+A = 3fffffffffffffffffffffffffff
+B = 7fffffffffffff
+GCD = 7fffffffffffff
+
+A = 3fffffffffffffffffffffffffff
+B = 80000000000001
+GCD = 80000000000001
+
+A = ffffffffffffffffffffffffffff
+B = ffffffffffffff
+GCD = ffffffffffffff
+
+A = ffffffffffffffffffffffffffff
+B = 100000000000001
+GCD = 100000000000001
+
+A = 3ffffffffffffffffffffffffffff
+B = 1ffffffffffffff
+GCD = 1ffffffffffffff
+
+A = 3ffffffffffffffffffffffffffff
+B = 200000000000001
+GCD = 200000000000001
+
+A = fffffffffffffffffffffffffffff
+B = 3ffffffffffffff
+GCD = 3ffffffffffffff
+
+A = fffffffffffffffffffffffffffff
+B = 400000000000001
+GCD = 400000000000001
+
+A = 3fffffffffffffffffffffffffffff
+B = 7ffffffffffffff
+GCD = 7ffffffffffffff
+
+A = 3fffffffffffffffffffffffffffff
+B = 800000000000001
+GCD = 800000000000001
+
+A = ffffffffffffffffffffffffffffff
+B = fffffffffffffff
+GCD = fffffffffffffff
+
+A = ffffffffffffffffffffffffffffff
+B = 1000000000000001
+GCD = 1000000000000001
+
+A = 3ffffffffffffffffffffffffffffff
+B = 1fffffffffffffff
+GCD = 1fffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffff
+B = 2000000000000001
+GCD = 2000000000000001
+
+A = fffffffffffffffffffffffffffffff
+B = 3fffffffffffffff
+GCD = 3fffffffffffffff
+
+A = fffffffffffffffffffffffffffffff
+B = 4000000000000001
+GCD = 4000000000000001
+
+A = 3fffffffffffffffffffffffffffffff
+B = 7fffffffffffffff
+GCD = 7fffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffff
+B = 8000000000000001
+GCD = 8000000000000001
+
+A = ffffffffffffffffffffffffffffffff
+B = ffffffffffffffff
+GCD = ffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffff
+B = 10000000000000001
+GCD = 10000000000000001
+
+A = 3ffffffffffffffffffffffffffffffff
+B = 1ffffffffffffffff
+GCD = 1ffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffff
+B = 20000000000000001
+GCD = 20000000000000001
+
+A = fffffffffffffffffffffffffffffffff
+B = 3ffffffffffffffff
+GCD = 3ffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffff
+B = 40000000000000001
+GCD = 40000000000000001
+
+A = 3fffffffffffffffffffffffffffffffff
+B = 7ffffffffffffffff
+GCD = 7ffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffff
+B = 80000000000000001
+GCD = 80000000000000001
+
+A = ffffffffffffffffffffffffffffffffff
+B = fffffffffffffffff
+GCD = fffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffff
+B = 100000000000000001
+GCD = 100000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffff
+B = 1fffffffffffffffff
+GCD = 1fffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffff
+B = 200000000000000001
+GCD = 200000000000000001
+
+A = fffffffffffffffffffffffffffffffffff
+B = 3fffffffffffffffff
+GCD = 3fffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffff
+B = 400000000000000001
+GCD = 400000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffff
+B = 7fffffffffffffffff
+GCD = 7fffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffff
+B = 800000000000000001
+GCD = 800000000000000001
+
+A = ffffffffffffffffffffffffffffffffffff
+B = ffffffffffffffffff
+GCD = ffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffff
+B = 1000000000000000001
+GCD = 1000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffff
+B = 1ffffffffffffffffff
+GCD = 1ffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffff
+B = 2000000000000000001
+GCD = 2000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffff
+B = 3ffffffffffffffffff
+GCD = 3ffffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffffff
+B = 4000000000000000001
+GCD = 4000000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffffff
+B = 7ffffffffffffffffff
+GCD = 7ffffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffffff
+B = 8000000000000000001
+GCD = 8000000000000000001
+
+A = ffffffffffffffffffffffffffffffffffffff
+B = fffffffffffffffffff
+GCD = fffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffffff
+B = 10000000000000000001
+GCD = 10000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffffff
+B = 1fffffffffffffffffff
+GCD = 1fffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffffff
+B = 20000000000000000001
+GCD = 20000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffffff
+B = 3fffffffffffffffffff
+GCD = 3fffffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffffffff
+B = 40000000000000000001
+GCD = 40000000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffffffff
+B = 7fffffffffffffffffff
+GCD = 7fffffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffffffff
+B = 80000000000000000001
+GCD = 80000000000000000001
+
+A = ffffffffffffffffffffffffffffffffffffffff
+B = ffffffffffffffffffff
+GCD = ffffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffffffff
+B = 100000000000000000001
+GCD = 100000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffffffff
+B = 1ffffffffffffffffffff
+GCD = 1ffffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffffffff
+B = 200000000000000000001
+GCD = 200000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffffffff
+B = 3ffffffffffffffffffff
+GCD = 3ffffffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffffffffff
+B = 400000000000000000001
+GCD = 400000000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffffffffff
+B = 7ffffffffffffffffffff
+GCD = 7ffffffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffffffffff
+B = 800000000000000000001
+GCD = 800000000000000000001
+
+A = ffffffffffffffffffffffffffffffffffffffffff
+B = fffffffffffffffffffff
+GCD = fffffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffffffffff
+B = 1000000000000000000001
+GCD = 1000000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffffffffff
+B = 1fffffffffffffffffffff
+GCD = 1fffffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffffffffff
+B = 2000000000000000000001
+GCD = 2000000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffffffffff
+B = 3fffffffffffffffffffff
+GCD = 3fffffffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffffffffffff
+B = 4000000000000000000001
+GCD = 4000000000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffffffffffff
+B = 7fffffffffffffffffffff
+GCD = 7fffffffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffffffffffff
+B = 8000000000000000000001
+GCD = 8000000000000000000001
+
+A = ffffffffffffffffffffffffffffffffffffffffffff
+B = ffffffffffffffffffffff
+GCD = ffffffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffffffffffff
+B = 10000000000000000000001
+GCD = 10000000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffff
+B = 1ffffffffffffffffffffff
+GCD = 1ffffffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffff
+B = 20000000000000000000001
+GCD = 20000000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffffffffffff
+B = 3ffffffffffffffffffffff
+GCD = 3ffffffffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffffffffffffff
+B = 40000000000000000000001
+GCD = 40000000000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffff
+B = 7ffffffffffffffffffffff
+GCD = 7ffffffffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffff
+B = 80000000000000000000001
+GCD = 80000000000000000000001
+
+A = ffffffffffffffffffffffffffffffffffffffffffffff
+B = fffffffffffffffffffffff
+GCD = fffffffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffffffffffffff
+B = 100000000000000000000001
+GCD = 100000000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffff
+B = 1fffffffffffffffffffffff
+GCD = 1fffffffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffff
+B = 200000000000000000000001
+GCD = 200000000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffffffffffffff
+B = 3fffffffffffffffffffffff
+GCD = 3fffffffffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffffffffffffffff
+B = 400000000000000000000001
+GCD = 400000000000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffff
+B = 7fffffffffffffffffffffff
+GCD = 7fffffffffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffff
+B = 800000000000000000000001
+GCD = 800000000000000000000001
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffff
+B = ffffffffffffffffffffffff
+GCD = ffffffffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffff
+B = 1000000000000000000000001
+GCD = 1000000000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffff
+B = 1ffffffffffffffffffffffff
+GCD = 1ffffffffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffff
+B = 2000000000000000000000001
+GCD = 2000000000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffff
+B = 3ffffffffffffffffffffffff
+GCD = 3ffffffffffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffff
+B = 4000000000000000000000001
+GCD = 4000000000000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffff
+B = 7ffffffffffffffffffffffff
+GCD = 7ffffffffffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffff
+B = 8000000000000000000000001
+GCD = 8000000000000000000000001
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffff
+B = fffffffffffffffffffffffff
+GCD = fffffffffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 10000000000000000000000001
+GCD = 10000000000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 1fffffffffffffffffffffffff
+GCD = 1fffffffffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 20000000000000000000000001
+GCD = 20000000000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 3fffffffffffffffffffffffff
+GCD = 3fffffffffffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 40000000000000000000000001
+GCD = 40000000000000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 7fffffffffffffffffffffffff
+GCD = 7fffffffffffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 80000000000000000000000001
+GCD = 80000000000000000000000001
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = ffffffffffffffffffffffffff
+GCD = ffffffffffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 100000000000000000000000001
+GCD = 100000000000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 1ffffffffffffffffffffffffff
+GCD = 1ffffffffffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 200000000000000000000000001
+GCD = 200000000000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 3ffffffffffffffffffffffffff
+GCD = 3ffffffffffffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 400000000000000000000000001
+GCD = 400000000000000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 7ffffffffffffffffffffffffff
+GCD = 7ffffffffffffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 800000000000000000000000001
+GCD = 800000000000000000000000001
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = fffffffffffffffffffffffffff
+GCD = fffffffffffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 1000000000000000000000000001
+GCD = 1000000000000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 1fffffffffffffffffffffffffff
+GCD = 1fffffffffffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 2000000000000000000000000001
+GCD = 2000000000000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 3fffffffffffffffffffffffffff
+GCD = 3fffffffffffffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 4000000000000000000000000001
+GCD = 4000000000000000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 7fffffffffffffffffffffffffff
+GCD = 7fffffffffffffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 8000000000000000000000000001
+GCD = 8000000000000000000000000001
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = ffffffffffffffffffffffffffff
+GCD = ffffffffffffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 10000000000000000000000000001
+GCD = 10000000000000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 1ffffffffffffffffffffffffffff
+GCD = 1ffffffffffffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 20000000000000000000000000001
+GCD = 20000000000000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 3ffffffffffffffffffffffffffff
+GCD = 3ffffffffffffffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 40000000000000000000000000001
+GCD = 40000000000000000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 7ffffffffffffffffffffffffffff
+GCD = 7ffffffffffffffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 80000000000000000000000000001
+GCD = 80000000000000000000000000001
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = fffffffffffffffffffffffffffff
+GCD = fffffffffffffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 100000000000000000000000000001
+GCD = 100000000000000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 1fffffffffffffffffffffffffffff
+GCD = 1fffffffffffffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 200000000000000000000000000001
+GCD = 200000000000000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 3fffffffffffffffffffffffffffff
+GCD = 3fffffffffffffffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 400000000000000000000000000001
+GCD = 400000000000000000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 7fffffffffffffffffffffffffffff
+GCD = 7fffffffffffffffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 800000000000000000000000000001
+GCD = 800000000000000000000000000001
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = ffffffffffffffffffffffffffffff
+GCD = ffffffffffffffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 1000000000000000000000000000001
+GCD = 1000000000000000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 1ffffffffffffffffffffffffffffff
+GCD = 1ffffffffffffffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 2000000000000000000000000000001
+GCD = 2000000000000000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 3ffffffffffffffffffffffffffffff
+GCD = 3ffffffffffffffffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 4000000000000000000000000000001
+GCD = 4000000000000000000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 7ffffffffffffffffffffffffffffff
+GCD = 7ffffffffffffffffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 8000000000000000000000000000001
+GCD = 8000000000000000000000000000001
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = fffffffffffffffffffffffffffffff
+GCD = fffffffffffffffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 10000000000000000000000000000001
+GCD = 10000000000000000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 1fffffffffffffffffffffffffffffff
+GCD = 1fffffffffffffffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 20000000000000000000000000000001
+GCD = 20000000000000000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 3fffffffffffffffffffffffffffffff
+GCD = 3fffffffffffffffffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 40000000000000000000000000000001
+GCD = 40000000000000000000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 7fffffffffffffffffffffffffffffff
+GCD = 7fffffffffffffffffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 80000000000000000000000000000001
+GCD = 80000000000000000000000000000001
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = ffffffffffffffffffffffffffffffff
+GCD = ffffffffffffffffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 100000000000000000000000000000001
+GCD = 100000000000000000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 1ffffffffffffffffffffffffffffffff
+GCD = 1ffffffffffffffffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 200000000000000000000000000000001
+GCD = 200000000000000000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 3ffffffffffffffffffffffffffffffff
+GCD = 3ffffffffffffffffffffffffffffffff
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 400000000000000000000000000000001
+GCD = 400000000000000000000000000000001
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 7ffffffffffffffffffffffffffffffff
+GCD = 7ffffffffffffffffffffffffffffffff
+
+A = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 800000000000000000000000000000001
+GCD = 800000000000000000000000000000001
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = fffffffffffffffffffffffffffffffff
+GCD = fffffffffffffffffffffffffffffffff
+
+A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 1000000000000000000000000000000001
+GCD = 1000000000000000000000000000000001
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 1fffffffffffffffffffffffffffffffff
+GCD = 1fffffffffffffffffffffffffffffffff
+
+A = 3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 2000000000000000000000000000000001
+GCD = 2000000000000000000000000000000001
+
+A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+B = 3fffffffffffffffffffffffffffffffff
+GCD = 3fffffffffffffffffffffffffffffffff
+