diff --git a/crypto/bn/bn_test.cc b/crypto/bn/bn_test.cc index 1ad5c479..8c41e48e 100644 --- a/crypto/bn/bn_test.cc +++ b/crypto/bn/bn_test.cc @@ -99,7 +99,6 @@ static const int num0 = 100; // number of tests static const int num1 = 50; // additional tests for some functions static const int num2 = 5; // number of tests for slow functions -static bool test_mul(FILE *fp); static bool test_div(FILE *fp, BN_CTX *ctx); static int rand_neg(); @@ -122,6 +121,7 @@ static bool test_asc2bn(BN_CTX *ctx); static bool test_mpi(); static bool test_rand(); static bool test_asn1(); +static bool TestNegativeZero(); static bool RunTest(FileTest *t, void *arg); // A wrapper around puts that takes its arguments in the same order as our *_fp @@ -180,12 +180,6 @@ int main(int argc, char *argv[]) { "| grep -v 0 */\n"); puts_fp(bc_file.get(), "obase=16\nibase=16\n"); - message(bc_file.get(), "BN_mul"); - if (!test_mul(bc_file.get())) { - return 1; - } - flush_fp(bc_file.get()); - message(bc_file.get(), "BN_div"); if (!test_div(bc_file.get(), ctx.get())) { return 1; @@ -260,7 +254,8 @@ int main(int argc, char *argv[]) { !test_asc2bn(ctx.get()) || !test_mpi() || !test_rand() || - !test_asn1()) { + !test_asn1() || + !TestNegativeZero()) { return 1; } @@ -463,6 +458,33 @@ static bool TestSquare(FileTest *t, BN_CTX *ctx) { return true; } +static bool TestProduct(FileTest *t, BN_CTX *ctx) { + ScopedBIGNUM a = GetBIGNUM(t, "A"); + ScopedBIGNUM b = GetBIGNUM(t, "B"); + ScopedBIGNUM product = GetBIGNUM(t, "Product"); + ScopedBIGNUM zero(BN_new()); + if (!a || !b || !product || !zero) { + return false; + } + + BN_zero(zero.get()); + + ScopedBIGNUM ret(BN_new()), remainder(BN_new()); + if (!ret || !remainder || + !BN_mul(ret.get(), a.get(), b.get(), ctx) || + !ExpectBIGNUMsEqual(t, "A * B", product.get(), ret.get()) || + !BN_div(ret.get(), remainder.get(), product.get(), a.get(), ctx) || + !ExpectBIGNUMsEqual(t, "Product / A", b.get(), ret.get()) || + !ExpectBIGNUMsEqual(t, "Product % A", zero.get(), remainder.get()) || + !BN_div(ret.get(), remainder.get(), product.get(), b.get(), ctx) || + !ExpectBIGNUMsEqual(t, "Product / B", a.get(), ret.get()) || + !ExpectBIGNUMsEqual(t, "Product % B", zero.get(), remainder.get())) { + return false; + } + + return true; +} + struct Test { const char *name; bool (*func)(FileTest *t, BN_CTX *ctx); @@ -474,6 +496,7 @@ static const Test kTests[] = { {"LShift", TestLShift}, {"RShift", TestRShift}, {"Square", TestSquare}, + {"Product", TestProduct}, }; static bool RunTest(FileTest *t, void *arg) { @@ -579,66 +602,6 @@ static bool test_div(FILE *fp, BN_CTX *ctx) { return true; } -static bool test_mul(FILE *fp) { - ScopedBN_CTX ctx(BN_CTX_new()); - ScopedBIGNUM a(BN_new()); - ScopedBIGNUM b(BN_new()); - ScopedBIGNUM c(BN_new()); - ScopedBIGNUM d(BN_new()); - ScopedBIGNUM e(BN_new()); - if (!ctx || !a || !b || !c || !d || !e) { - return false; - } - - for (int i = 0; i < num0 + num1; i++) { - if (i <= num1) { - if (!BN_rand(a.get(), 100, 0, 0) || - !BN_rand(b.get(), 100, 0, 0)) { - return false; - } - } else if (!BN_rand(b.get(), i - num1, 0, 0)) { - return false; - } - a->neg = rand_neg(); - b->neg = rand_neg(); - if (!BN_mul(c.get(), a.get(), b.get(), ctx.get())) { - return false; - } - if (fp != NULL) { - BN_print_fp(fp, a.get()); - puts_fp(fp, " * "); - BN_print_fp(fp, b.get()); - puts_fp(fp, " - "); - BN_print_fp(fp, c.get()); - puts_fp(fp, "\n"); - } - if (!BN_div(d.get(), e.get(), c.get(), a.get(), ctx.get()) || - !BN_sub(d.get(), d.get(), b.get())) { - return false; - } - if (!BN_is_zero(d.get()) || !BN_is_zero(e.get())) { - fprintf(stderr, "Multiplication test failed!\n"); - return false; - } - } - - // Test that BN_mul never gives negative zero. - if (!BN_set_word(a.get(), 1)) { - return false; - } - BN_set_negative(a.get(), 1); - BN_zero(b.get()); - if (!BN_mul(c.get(), a.get(), b.get(), ctx.get())) { - return false; - } - if (!BN_is_zero(c.get()) || BN_is_negative(c.get())) { - fprintf(stderr, "Multiplication test failed!\n"); - return false; - } - - return true; -} - static int rand_neg() { static unsigned int neg = 0; static const int sign[8] = {0, 0, 0, 1, 1, 0, 1, 1}; @@ -1760,3 +1723,29 @@ static bool test_asn1() { return true; } + +static bool TestNegativeZero() { + ScopedBN_CTX ctx(BN_CTX_new()); + ScopedBIGNUM a(BN_new()); + ScopedBIGNUM b(BN_new()); + ScopedBIGNUM c(BN_new()); + if (!ctx || !a || !b || !c) { + return false; + } + + // Test that BN_mul never gives negative zero. + if (!BN_set_word(a.get(), 1)) { + return false; + } + BN_set_negative(a.get(), 1); + BN_zero(b.get()); + if (!BN_mul(c.get(), a.get(), b.get(), ctx.get())) { + return false; + } + if (!BN_is_zero(c.get()) || BN_is_negative(c.get())) { + fprintf(stderr, "Multiplication test failed!\n"); + return false; + } + + return true; +} diff --git a/crypto/bn/bn_tests.txt b/crypto/bn/bn_tests.txt index db6245b4..1d91bccf 100644 --- a/crypto/bn/bn_tests.txt +++ b/crypto/bn/bn_tests.txt @@ -5348,3 +5348,608 @@ A = -e53ad05c88568f09f616797f0b7f2756fb543d691ec2a5b645c1e5892a247302826419a35b1 Square = eea8028b26e0df090504d54da714a6f5f2695202e53cff479c78aedd47a8dc676243ec586740fde53b3eca9ca02b91031ce766242184109503fbe25b1b6d318e3cd5970fabd16dfa22984dd2e9f1e0f14c189170fc69c031d66663703e6235a942d51a4545bd7b0769d01d302ce2b00b83f01568a1e378f61fd0ca6201b0490330580cd9de85719e174a71915d7efbf65cd73d8f4e66f27e0dd3144d58ec09ed0f7ed7d1238ee596922807100fb7a11127944ddcdec6a9ca3bbf6df7301e354f3f049bfb7c275b43c3d8cda5907a932fba507c9145ea3166081c1b48fcc710ee32cd931f936c796b14f8a78a592e67753a7c9e428a01719c8ba82652f3a89fae110 A = -3dcb44be1e54c5a5d7db48055ca9afa1ebe2ae648aa6e16ac497502a7deee09ffa124720fad0ab163ce8b3ea6a90f110ea52b67dbc424d0cf1e8c9726dfd9e45bebcefaa5cd5706edeed27896525f31c6bbea3d67ee97badefabf3e2532470b66e3ae3100f66ddf50cf02fc3a8e3f44c304251d3b6a7ca3a6e4bd5d16a41bd97a4 + + +# Product tests. +# +# These test vectors satisfy A * B = Product. + +Product = 5befab3320f8f90542f3120235abd926aac3805a19e343f690 +A = b057af553afb120db6b7764f8 +B = 857734c4c27a1d17f7cf59dee + +Product = -ab1ce167f4b2945c55ae3f87df50ad07d4be87cf9f8aa07b0c +A = ae7a6a87ea8981a567d0b3ecc +B = -fb0fed5f8c737bcacef4d6cb1 + +Product = -c2606cd48e6b075c8da79eb4668e7157f1f175c2860fd4c475 +A = -c28dc31984d4583e9d45424c3 +B = ffc4581a5c3f885cf42767e67 + +Product = aa6805b5408aff7f914472756da07830dcad902834dbdd6944 +A = -ffa07ff9f503511954e5dd3f9 +B = -aaa7af472ad8957763f5a7c64 + +Product = 58ca2569173389df29b5ce4b784086055dee821a7243db7210 +A = af417d936f4690008811a1ae8 +B = 81b26b80b43aa65aa55ded52a + +Product = -a043d31dfce8bd01724d31c863d0a64f1bf013509d77737c42 +A = fb5fae5edefb6997d44a1ecd6 +B = -a336e50c6f7845a1686cc88a3 + +Product = -b5d6a45ffce851b201239d938ba551bab7dcb59fc11fc35fce +A = -f918faa58bb57a2ffb8b01f05 +B = bae08c3006fade695029a1df6 + +Product = 6f2fde7d1a18625d727c6345ed85e597d546d9228bf7f0564a +A = -8d108d7a16f0696d4ceb24445 +B = -c9c764cae465207097ef8d2c2 + +Product = 93808b1140841dc9735cd61c6f855ddbbb83066689b0d7e1a0 +A = b386d08daf3fa2154e9c768d6 +B = d2557dceb2d02d04d9c578670 + +Product = -ad04212ca8cadb1f7861c5130ba3a747046a2a7e4a0c72b69a +A = e4e5f7d1311e0c5f2e404d55b +B = -c18057a328d8c7375afdfd4ee + +Product = -685e75c232f2b4a0e455fe5ee8aea52f292ad8b8178320e692 +A = -a683312f132b2320632e74ef6 +B = a0758f12791453b4af354730b + +Product = 6f588c53185c503dc5b0dc3002d3817ca2e7eb2370b3e9a647 +A = -d70c9b93170261091f0c53f27 +B = -848c86c51a186ac4c9080d3e1 + +Product = 5e3bc5a04e054a9a244bf7c86cae215072fdb70e9199989427 +A = 898b64ef09d7cf63966e1a3b5 +B = af638b12f26aa5d12e97439eb + +Product = -8d8372b235b16108285203c03a8aef6fdd3c0e1a9fd31d4f68 +A = f6003dc83818c14fbe36c9998 +B = -9343f6cbcc81fa4c9399dce5f + +Product = -5ee6509abeeb7af7fc5caef40d1822ad3150c8d74f522dc7c8 +A = -875ff6f56ca72cbdf614bb9ca +B = b375a68a21dfb1f159c22fa14 + +Product = ada25be404a17385af5a330da799e5909da81bfa0715baa6f4 +A = -c9b8df392e76abc3eb7d5ce04 +B = -dc5ab818c70594dd917b4243d + +Product = bb24422ee4656ddfcd50ec38201b15baf679d3b75e5cb878ca +A = f8e12cf4defe388b78510f687 +B = c07ee817b4ae95c2915b88966 + +Product = -93da296ba164c7220a17330647aef0980c94eddd2cfa2a3b2d +A = bc5dc74ddf7a1363d1c2b1f25 +B = -c8f069bad7f93cbfe6df51169 + +Product = -6b2e1d132c4e0b0dc9b7e7de7d424fda5180480cb5ff47c755 +A = -a8048acb66a8bb88df39266e7 +B = a34e0b265d71435ae8c92a463 + +Product = 6ccb2cd93783576a8602ae43f41c786008b6623a4cca0a010a +A = -b071f1f54790c951c1dd2a1cf +B = -9dd89bb4d9b546207e282e2d6 + +Product = 5c742ba47d0d64bd97509927ce957deedb855766cc24c60016 +A = b44f3f252c368096fa62747f2 +B = 83439b97dbac579fa4f7b7d23 + +Product = -7347ba65691c913286c2fb55e45b177f031c1d86ae0e9f654f +A = 937cf0643ffa53cdea24d642f +B = -c81881f78243dd5737a7d28e1 + +Product = -9bc0649a703674e59f83ff9b8a560e5cbf51f65ca310f80f95 +A = -b536f8d9769be6f62da941ae5 +B = dc0746fb101881ae0cacde6f1 + +Product = bf4992fc3a124de350f9fb90ea825cf663b1fa051282ef22e2 +A = -ff7eacc7de1bb01d668c693aa +B = -bfaa6627f9fc7ba68ae41bb2d + +Product = 7c8992d34cc0b63f1c953f68d4e12a99d3f3a34d16bd76caa9 +A = 9e0d5a850d078890a983c0ec9 +B = c9b72c118b3e1f1023a696ce1 + +Product = -a75840c95082b9a0ae0d6e0a4eb5e09288e4e2a66e9697d9cd +A = b2b042a21045a74ef1a5091d9 +B = -efbf8b120b384e869692a1b15 + +Product = -a510b333bdb4ed7479c142e8fbe2b12f7671a42acbe16c0998 +A = -e7fd5e0bb5496b9d876c27f65 +B = b6262653b2be44501af1d85b8 + +Product = a1c1e90afc4684754155526e307fc6ed798746f347bae2c880 +A = -b84674832b26ded0a690a8ff0 +B = -e0b7bdf2fd05a038ed3640b78 + +Product = 5588e0c33bffbefcc5695ca0615abd383343f21a8a0d22b222 +A = 80cad81ad9a66ab6a1c2e5669 +B = aa0453a77c8af1584f54750d2 + +Product = -6460c2fcd6cf3304ab163ea883ac48e2031cd10f2e9014c0ab +A = c49ad3d7c8848d4fbf913b10b +B = -82b3dedbe3cc7cd532ad632e1 + +Product = -a18717330b711669e85abde8c4dce426529aa621ba3da2a477 +A = -cab4a9c0a331a5a5e826dda1f +B = cbfee5041c13075dfe3399aa9 + +Product = 8ab6282ee892b53c083d319a9dcab48af97a1ac8493c0bfcad +A = -f7d13e47f9aaac8c25f9bf75b +B = -8f4aa95231c1e2336aa092297 + +Product = 8f2d1c23c78777ed371f13155445ca3c88cbc0a9b299bdf9d3 +A = 9d8248d00defce1ad081337c3 +B = e8b479295ecd9cef7301f24b1 + +Product = -86d5e0c5b581fe59819730b4b71e33d1f85f9ab504c7dbe2d6 +A = b21b45e88acff48562a19729a +B = -c1cdfebccc763beeac394b997 + +Product = -484ca05aefa113bdfcb1bc623f730c9f9555b462a8ab4c9606 +A = -8c12b406c02c4417163c0956b +B = 8422b15c80c1c087b17eedd92 + +Product = 614c3c91f60050c785fd229a3ad74674577a90cacb654e0a5c +A = -93d45bce155a23a397506d96a +B = -a87e339c3fd5aebede5fb1b36 + +Product = 9683285f194a7e4feeab196a36bdfc4f828035fd184b9cc692 +A = f196d8fe760fdcae7eb60e2f7 +B = 9f7d88a2163ad818bf3a6377e + +Product = -988a64599c19cc64f3cadc1a83fea6550185f6cc3ab82af822 +A = d0584b2a306671e4d2c9d0c7b +B = -bb6e7559df199c68d6df3a3c6 + +Product = -68456814cb0edd951196d04c853172afdd5787a5bd69a57876 +A = -cefce1b0a1fb22862418bb597 +B = 80f614139947aea5e76cd55fa + +Product = b4b1cbf5d6566e7a57aee0cc5c9c8ec4ad885e8766aa7662a4 +A = -d68ed1bea046c6cad057e21db +B = -d7988b9be54f6e332d019032c + +Product = 6b09212675ff5257a1384371e17b37dcc268bbb141577902e4 +A = a8208053adc20a609d5d01404 +B = a2fa927c5458c4fe662d7a3b9 + +Product = -8361bc26f9bcf55f677e047d822d3004027da0d0455b244d10 +A = e82b6410b29020c2d6810a977 +B = -90ddfe0e7f0d6b9cdc0815f70 + +Product = -f1b6da00923fd513a83e32040a515649fbd362f69ebc016d9f +A = -f9b697d9ec774a8d1ee5ea905 +B = f7ccb46a8869cb028492bed53 + +Product = d06206963f2e150bacdb32c823c3a47f013d5a267c3c0d0c88 +A = -ea8e63afa99c719897ad7f2ab +B = -e36f11f55b6148d1b4f46e598 + +Product = af774a5eae6084df5ca499ef005642730adabf6a4f9533e2fd +A = e4c7af7eea3ec9cc2443b7319 +B = c457bc264c8461789931baf85 + +Product = -76350f428bfbb95e6c253ec0f457aa84cebe8c7cb1af2a2120 +A = 8fd1ff97465775d44dee58ae0 +B = -d268a7d328f44baf80e35119f + +Product = -787ae3f114f9a8dd4d249d5d3f3b0897b02564b9469416cefe +A = -bc0b398bd0ec045b0cf147b7e +B = a4050955c234e473257d0c641 + +Product = 9d6320b3d4aabac097a079b9bd2aca7f1898bcab0f23409fd0 +A = -9d7a4ebac630cc0662b816fb5 +B = -ffda517d3eb3214986b04e290 + +Product = 80bab8bd800ac8c9dc3bb57dca306f10af6fd88c5d8314833c +A = 834bc50140d6c6ab938dc58b6 +B = fafee47793cbc533b3c66af3a + +Product = -b08920f5922226b1dec87151ae087d8a7e5c1aea8c9be148b6 +A = bfd5b1ad323c79428cb2db36a +B = -eb956a10edebdd658e6810fcf + +Product = -6d428e08e8350bb4b0fae3b662c82df2aef7beadaa17430dbb +A = -a57da276998c548101f514e9f +B = a9040c1909712e1149d295765 + +Product = a57da276998c548101f514e9f +A = -a57da276998c548101f514e9f +B = -1 + +Product = 14afb44ed3318a90203ea29d3e +A = a57da276998c548101f514e9f +B = 2 + +Product = -295f689da6631520407d453a7c +A = a57da276998c548101f514e9f +B = -4 + +Product = -867614005cc204a8d19720fe13 +A = -a57da276998c548101f514e9f +B = d + +Product = 12bf3b676f64e5929d38c35e803 +A = -a57da276998c548101f514e9f +B = -1d + +Product = 24d8f92c68303ed0b96f91a8167 +A = a57da276998c548101f514e9f +B = 39 + +Product = -49b1f258d0607da172df23502ce +A = a57da276998c548101f514e9f +B = -72 + +Product = -6fd5e6ca25c3d51b2e529f22173 +A = -a57da276998c548101f514e9f +B = ad + +Product = 1276d4705b81b82da4c7e82559d7 +A = -a57da276998c548101f514e9f +B = -1c9 + +Product = 1ddb9abfc5d4017f068a67b5f4fd +A = a57da276998c548101f514e9f +B = 2e3 + +Product = -3a8b41c914b1b4a4e341433601f7 +A = a57da276998c548101f514e9f +B = -5a9 + +Product = -97c0f4ba414d6e7d4c8b7ced84d4 +A = -a57da276998c548101f514e9f +B = eac + +Product = 1198739e0c23639c176d46d13f7c8 +A = -a57da276998c548101f514e9f +B = -1b38 + +Product = 159150954ee0dedf541e4dbac0ec3 +A = a57da276998c548101f514e9f +B = 215d + +Product = -441d4bc44c86f02ff12c3d91a1562 +A = a57da276998c548101f514e9f +B = -695e + +Product = -64726b76005ebee27592237ba5dde +A = -a57da276998c548101f514e9f +B = 9b62 + +Product = bbe4ec7cf7c5bbd198e0ea86bb658 +A = -a57da276998c548101f514e9f +B = -122a8 + +Product = 21f717d05681fd2eb1796776a69ef7 +A = a57da276998c548101f514e9f +B = 348a9 + +Product = -396ac788a1748bc6955f99be4d2c64 +A = a57da276998c548101f514e9f +B = -58d1c + +Product = -54a213eb083aed1a04f3d1b2da62e7 +A = -a57da276998c548101f514e9f +B = 82eb9 + +Product = 1366fb9c20fb14b8b9a9be4b3e3dde1 +A = -a57da276998c548101f514e9f +B = -1e037f + +Product = 238d65fd26da4733e5d93ab2485d40b +A = a57da276998c548101f514e9f +B = 36ff15 + +Product = -38272a99be154d531e922be405aee9a +A = a57da276998c548101f514e9f +B = -56dd26 + +Product = -64651b62b6a454c08951632c7f2c398 +A = -a57da276998c548101f514e9f +B = 9b4d68 + +Product = fb272e3597b816144f8b945ae6130e0 +A = -a57da276998c548101f514e9f +B = -1848320 + +Product = 280d9f5ed7243712ecb9a7c6358bcb8b +A = a57da276998c548101f514e9f +B = 3df5795 + +Product = -2fbb6bb8e1ba78cefc47fbbc20e188ee +A = a57da276998c548101f514e9f +B = -49d6652 + +Product = -57f29c13691ffa1642d2860dab9d288e +A = -a57da276998c548101f514e9f +B = 880c2b2 + +Product = 139c19d7668e6aabf2d7206cb0723ed34 +A = -a57da276998c548101f514e9f +B = -1e55aa4c + +Product = 2950ce04bf0cf836d4fe94b88fb757d0a +A = a57da276998c548101f514e9f +B = 3fe968b6 + +Product = -5175239488dad05a58414251496d2a06c +A = a57da276998c548101f514e9f +B = -7e020414 + +Product = -945ff0ed38bc6020cf679cbd3e0758c6d +A = -a57da276998c548101f514e9f +B = e585e573 + +Product = 11c69ae98f6b27e95477986f796bc67c8c +A = -a57da276998c548101f514e9f +B = -1b7f653f4 + +Product = 209afe75e8fb5ac76d13c06b545f5d4d73 +A = a57da276998c548101f514e9f +B = 3270154ad + +Product = -386d64b215e41506514f4988ed237e4da2 +A = a57da276998c548101f514e9f +B = -5749c891e + +Product = -6c13cccdb1d140d0babd52707ea72fa278 +A = -a57da276998c548101f514e9f +B = a72fb6288 + +Product = 136228a8a45540372b9b3cd7f82021f6546 +A = -a57da276998c548101f514e9f +B = -1dfc08a2fa + +Product = 1f0ad3babf9d132eaa08cf5cdb8f19dbf01 +A = a57da276998c548101f514e9f +B = 30050f2e5f + +Product = -50d615ce183258e95af77319b766fac81e2 +A = a57da276998c548101f514e9f +B = -7d0bf92cde + +Product = -817d358293b86a56a4e881e50257c549471 +A = -a57da276998c548101f514e9f +B = c84efb12ef + +Product = f09b9e80be251de474d726b16e25a6865fc +A = -a57da276998c548101f514e9f +B = -1743322a484 + +Product = 22996cb0f9c60e35dce49f3825f8a479db26 +A = a57da276998c548101f514e9f +B = 3585acec11a + +Product = -2b307a37c91791a61c0691858f5f783e4678 +A = a57da276998c548101f514e9f +B = -42cf6be3e88 + +Product = -8826698fcba6c30d755fc523de1cc25301ae +A = -a57da276998c548101f514e9f +B = d29cc8af592 + +Product = ae37fc99fd419809310782714530d7428d77 +A = -a57da276998c548101f514e9f +B = -10d8059d4a29 + +Product = 1d544a20f9bc7d95ab67d1f65743979f23bba +A = a57da276998c548101f514e9f +B = 2d5eadef1c06 + +Product = -367897184e9929a0294d320f10278889fbeb7 +A = a57da276998c548101f514e9f +B = -54431582d0e9 + +Product = -943a509076a00060a2e7fa1cddb7468d734a1 +A = -a57da276998c548101f514e9f +B = e54bb102f4bf + +Product = fcce6e42879af5ad13545c0bcaab85b690cea +A = -a57da276998c548101f514e9f +B = -18711db522cd6 + +Product = 258c49f86d0cbb14ae9edbd3456be8cede2022 +A = a57da276998c548101f514e9f +B = 3a1562c7c269e + +Product = -4a8bbce59ad7daa51136d557f7fa16e9a2faad +A = a57da276998c548101f514e9f +B = -7350e780b0f33 + +Product = -82f53ec9333275d5cc271876a7db936db49280 +A = -a57da276998c548101f514e9f +B = ca94ad312dd80 + +Product = 11daee4fcc713db5b2806e47fa5dff3b5b770eb +A = -a57da276998c548101f514e9f +B = -1b9ed6758f9635 + +Product = 17038cac4f0c94dc24985ea108ae6682e175752 +A = a57da276998c548101f514e9f +B = 2399b8a9b1116e + +Product = -37e5f14394bf347a3ed061769fe8e6424af4348 +A = a57da276998c548101f514e9f +B = -567840a7569fb8 + +Product = -9253d4a32a88d8f725984514d969012ead7cc9a +A = -a57da276998c548101f514e9f +B = e25b246f733f26 + +Product = ace3648371c16a931d29004e79f5b9678391da5 +A = -a57da276998c548101f514e9f +B = -10b717b27b6a13b + +Product = 1faa5b45d04c143c339b09d3aad94d39b94ef960 +A = a57da276998c548101f514e9f +B = 30fbd672e106aa0 + +Product = -3fdfe246d27aae0d08d63b2bc501461d2bff3b8d +A = a57da276998c548101f514e9f +B = -62cef5f078a8253 + +Product = -5b792bfaeff04ee3d948cb343a249d49eb344f57 +A = -a57da276998c548101f514e9f +B = 8d805ac65649c49 + +Product = c5f824406161eec321da5a58e3e00d393b55abe9 +A = -a57da276998c548101f514e9f +B = -1323dd41d2e1e077 + +Product = 2226dec8a57be8e84e42559007e2d101ccbe67f8d +A = a57da276998c548101f514e9f +B = 34d47842b5d0be53 + +Product = -340f50f812c7420b502000940788a700f6769788a +A = a57da276998c548101f514e9f +B = -508836d8e1193d36 + +Product = -a00f1d96e19c590479625c5329a87774b5964cc78 +A = -a57da276998c548101f514e9f +B = f798fc858657f888 + +Product = cb94f830cba8997331912a6a31c34f1bef826d121 +A = -a57da276998c548101f514e9f +B = -13aec7a5c52a0883f + +Product = 16b45140b048d6dc0b9fc811df7ce7dd88357fff04 +A = a57da276998c548101f514e9f +B = 231f27f3e347bd67c + +Product = -2aa94179351b4e87de5849ab619d94f47450640199 +A = a57da276998c548101f514e9f +B = -41fe3ec2189599cc7 + +Product = -5489401d3da93158d4284e557d74016c0a7cfd935a +A = -a57da276998c548101f514e9f +B = 82c5281df41bfc066 + +Product = ae04d5b212ecfc9a6d7df07794d565df52991fb70e +A = -a57da276998c548101f514e9f +B = -10d3139229f5d02432 + +Product = 27821bc811f45d63089790b41d307be978d4b19564c +A = a57da276998c548101f514e9f +B = 3d1da85cc012b3e234 + +Product = -3de3c9e9d7fa3020a578706339314890dccf63096c2 +A = a57da276998c548101f514e9f +B = -5fbcfb28bfc9044bfe + +Product = -627dcb299a6720044abcf11469bdfd3f951edbb5bf7 +A = -a57da276998c548101f514e9f +B = 985b930517b78e6ba9 + +Product = cc0622441497a37fddf1856d5e2c99df52b99ea4573 +A = -a57da276998c548101f514e9f +B = -13b9b88948fb7e95cad + +Product = 1a5168e1a492210591ad1ed660adde9110390e4caf32 +A = a57da276998c548101f514e9f +B = 28b631c6e04b6ab0d8e + +Product = -4d8ec27b7460ce616421b9f5cae708c2ac241daa59b4 +A = a57da276998c548101f514e9f +B = -77f99bdf1eb09da6dcc + +Product = -55afd796db7bce822a00073fc8926d3bd0c79772f036 +A = -a57da276998c548101f514e9f +B = 848cdd6212b9bb3620a + +Product = dc494b0d73e8ec07cd2bb6dd8191d2b4d48e7700cc34 +A = -a57da276998c548101f514e9f +B = -154c39567bd8be5f6b4c + +Product = 240e9301b4345b914ecd91a49a0e651524dcecb6fdc6c +A = a57da276998c548101f514e9f +B = 37c6e7ee89cf87674814 + +Product = -39002ecfd6d96661b336157ccef6536756ad2e9219be3 +A = a57da276998c548101f514e9f +B = -582cdab09915a652203d + +Product = -695f49fc891d53f396f0593efae3973082b76d4f9e944 +A = -a57da276998c548101f514e9f +B = a30074dbce2246af043c + +Product = bba2b7b45b97cb0d7fb30fed95089870742ad69e7aed7 +A = -a57da276998c548101f514e9f +B = -1224195afc7b394ae8cc9 + +Product = 1910edc278515ab7d4cc09b496dc3c06c32c75bc7368af +A = a57da276998c548101f514e9f +B = 26c6701c39334169e7bf1 + +Product = -3670b7f9b661aba35ce50984d83173c84c8fa60e04d100 +A = a57da276998c548101f514e9f +B = -5436e84b4a29858a68f00 + +Product = -7fa0d3e0082b37475342b7e22e5dbad7b8d4cb5d64f871 +A = -a57da276998c548101f514e9f +B = c56e0f44fc63bca242eef + +Product = da7fe3367ce640fa5941c033ac1874312f10ba5950da75 +A = -a57da276998c548101f514e9f +B = -15200043166ff309f0426b + +Product = 1871d72481f66b1d413100edd6b339cbbaa67b3b2b3cd57 +A = a57da276998c548101f514e9f +B = 25d057879db26fa29a5e49 + +Product = -3cf1dd1e2df3456757d72f35353c3c7a659b2ef844ad857 +A = a57da276998c548101f514e9f +B = -5e46be70de21949df67349 + +Product = -5e861cbe47aefab2a7ea59292aab1258932b9a322f66e63 +A = -a57da276998c548101f514e9f +B = 9238670897685a6c9cbdbd + +Product = f623344788efb857db55c924e95a437effa4dc8bb2bcd24 +A = -a57da276998c548101f514e9f +B = -17cc0ec84c228225a7cf45c + +Product = 15514c916b0ae7cde6add16c629d3e19ba52a101d75dff72 +A = a57da276998c548101f514e9f +B = 20f9f925b3ed307edbb154e + +Product = -460cf5b14f9d0b547c3084bf44207bf881745c409b08d07f +A = a57da276998c548101f514e9f +B = -6c5cbfd29f3dae1dce99221 + +Product = -5ddf7fb91d765af97dfda5333d8779e80837c2b51cfb4f43 +A = -a57da276998c548101f514e9f +B = 9136aa79080defd1bcf90dd + +Product = 12c1a0edfb6ab6a0caae2553fb3743827e1470a8954e0a3fd +A = -a57da276998c548101f514e9f +B = -1d03b512470dc3052779f3e3 + +Product = 28388a244214abf046488a8d95308d95f021eae4b994a5a52 +A = a57da276998c548101f514e9f +B = 3e37dce784274962ff862e6e + +Product = -4da476e76119deef291c0f56934a912a0877278a19a561ee0 +A = a57da276998c548101f514e9f +B = -781b2f2dc40094a7f8fed520 + +Product = -5792496d33dd45e225f9dfca17419a04e075ffc0c90b37b82 +A = -a57da276998c548101f514e9f +B = 87772a4fb582acafd3e4ef3e + +Product = dd3a3506a7d748de16fb43d666928a87de0354d8e8a1bcaaa +A = -a57da276998c548101f514e9f +B = -1563841bf7851ff158a395716 + +Product = 24e8fb09a9ab0808ff643122479dea5ed41060c6c5b74e8752 +A = a57da276998c548101f514e9f +B = 3918c30b5568318a58e9be16e + +Product = -366c125f96b38b58d01c939c27c4100af3377eabb792b5491a +A = a57da276998c548101f514e9f +B = -542fb814f45924aa09a16f2a6