From 46d95551ff1852aa2e13a875b25d817a7f044a1c Mon Sep 17 00:00:00 2001 From: knaccc <hello@monero.how> Date: Wed, 13 Sep 2017 23:27:46 +0100 Subject: [PATCH] RuffCT first commit --- source-code/RuffCT-java/c/crypto-ops-data.c | 872 +++++ source-code/RuffCT-java/c/crypto-ops.c | 2923 +++++++++++++++++ source-code/RuffCT-java/c/crypto-ops.h | 153 + .../c/how_monero_hodl_jni_CryptoOpsUtil.c | 87 + .../c/how_monero_hodl_jni_CryptoOpsUtil.h | 29 + source-code/RuffCT-java/c/warnings.h | 30 + source-code/RuffCT-java/doc/readme.txt | 19 + .../RuffCT-java/lib/commons-codec-1.10.jar | Bin 0 -> 284184 bytes .../RuffCT-java/lib/commons-pool2-2.4.2.jar | Bin 0 -> 111969 bytes .../src/com/joemelsha/crypto/hash/Keccak.java | 449 +++ .../how/monero/hodl/crypto/CryptoUtil.java | 155 + .../how/monero/hodl/crypto/HashToPoint.java | 136 + .../src/how/monero/hodl/crypto/PointPair.java | 37 + .../src/how/monero/hodl/crypto/Scalar.java | 100 + .../how/monero/hodl/crypto/ScalarPair.java | 12 + .../hodl/cursor/BootleRuffingCursor.java | 38 + .../src/how/monero/hodl/cursor/Cursor.java | 75 + .../how/monero/hodl/jni/CryptoOpsUtil.java | 11 + .../hodl/ringSignature/BootleRuffing.java | 560 ++++ .../hodl/ringSignature/Multisignature.java | 114 + .../hodl/ringSignature/SpendParams.java | 19 + .../src/how/monero/hodl/util/ByteUtil.java | 83 + .../monero/hodl/util/ExceptionAdapter.java | 8 + .../src/how/monero/hodl/util/VarInt.java | 45 + .../src/org/nem/core/crypto/Curve.java | 30 + .../nem/core/crypto/ed25519/Ed25519Curve.java | 41 + .../ed25519/arithmetic/CoordinateSystem.java | 37 + .../Ed25519EncodedFieldElement.java | 1005 ++++++ .../Ed25519EncodedGroupElement.java | 129 + .../ed25519/arithmetic/Ed25519Field.java | 43 + .../arithmetic/Ed25519FieldElement.java | 1026 ++++++ .../ed25519/arithmetic/Ed25519Group.java | 36 + .../arithmetic/Ed25519GroupElement.java | 1012 ++++++ .../nem/core/utils/AbstractTwoLevelMap.java | 74 + .../src/org/nem/core/utils/ArrayUtils.java | 156 + .../src/org/nem/core/utils/Base32Encoder.java | 37 + .../src/org/nem/core/utils/Base64Encoder.java | 37 + .../src/org/nem/core/utils/ByteUtils.java | 100 + .../src/org/nem/core/utils/CircularStack.java | 88 + .../org/nem/core/utils/ExceptionUtils.java | 102 + .../src/org/nem/core/utils/FormatUtils.java | 63 + .../src/org/nem/core/utils/HexEncoder.java | 57 + .../src/org/nem/core/utils/HttpStatus.java | 494 +++ .../src/org/nem/core/utils/LockFile.java | 82 + .../src/org/nem/core/utils/MustBe.java | 118 + .../src/org/nem/core/utils/SetOnce.java | 42 + .../src/org/nem/core/utils/StringEncoder.java | 31 + .../src/org/nem/core/utils/StringUtils.java | 50 + .../monero/hodl/BootleRuffingBenchmarks.java | 126 + .../monero/hodl/BootleRuffingSpendTest.java | 168 + .../how/monero/hodl/Prove1Valid1Test1.java | 29 + .../how/monero/hodl/Prove2Valid2Test1.java | 37 + .../how/monero/hodl/Prove2Valid2Test1a.java | 42 + .../how/monero/hodl/Prove2Valid2Test1b.java | 61 + 54 files changed, 11308 insertions(+) create mode 100644 source-code/RuffCT-java/c/crypto-ops-data.c create mode 100644 source-code/RuffCT-java/c/crypto-ops.c create mode 100644 source-code/RuffCT-java/c/crypto-ops.h create mode 100644 source-code/RuffCT-java/c/how_monero_hodl_jni_CryptoOpsUtil.c create mode 100644 source-code/RuffCT-java/c/how_monero_hodl_jni_CryptoOpsUtil.h create mode 100644 source-code/RuffCT-java/c/warnings.h create mode 100644 source-code/RuffCT-java/doc/readme.txt create mode 100644 source-code/RuffCT-java/lib/commons-codec-1.10.jar create mode 100644 source-code/RuffCT-java/lib/commons-pool2-2.4.2.jar create mode 100755 source-code/RuffCT-java/src/com/joemelsha/crypto/hash/Keccak.java create mode 100644 source-code/RuffCT-java/src/how/monero/hodl/crypto/CryptoUtil.java create mode 100644 source-code/RuffCT-java/src/how/monero/hodl/crypto/HashToPoint.java create mode 100644 source-code/RuffCT-java/src/how/monero/hodl/crypto/PointPair.java create mode 100644 source-code/RuffCT-java/src/how/monero/hodl/crypto/Scalar.java create mode 100644 source-code/RuffCT-java/src/how/monero/hodl/crypto/ScalarPair.java create mode 100644 source-code/RuffCT-java/src/how/monero/hodl/cursor/BootleRuffingCursor.java create mode 100644 source-code/RuffCT-java/src/how/monero/hodl/cursor/Cursor.java create mode 100644 source-code/RuffCT-java/src/how/monero/hodl/jni/CryptoOpsUtil.java create mode 100644 source-code/RuffCT-java/src/how/monero/hodl/ringSignature/BootleRuffing.java create mode 100644 source-code/RuffCT-java/src/how/monero/hodl/ringSignature/Multisignature.java create mode 100644 source-code/RuffCT-java/src/how/monero/hodl/ringSignature/SpendParams.java create mode 100644 source-code/RuffCT-java/src/how/monero/hodl/util/ByteUtil.java create mode 100644 source-code/RuffCT-java/src/how/monero/hodl/util/ExceptionAdapter.java create mode 100644 source-code/RuffCT-java/src/how/monero/hodl/util/VarInt.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/crypto/Curve.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/Ed25519Curve.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/CoordinateSystem.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519EncodedFieldElement.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519EncodedGroupElement.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519Field.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519FieldElement.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519Group.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519GroupElement.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/utils/AbstractTwoLevelMap.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/utils/ArrayUtils.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/utils/Base32Encoder.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/utils/Base64Encoder.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/utils/ByteUtils.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/utils/CircularStack.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/utils/ExceptionUtils.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/utils/FormatUtils.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/utils/HexEncoder.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/utils/HttpStatus.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/utils/LockFile.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/utils/MustBe.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/utils/SetOnce.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/utils/StringEncoder.java create mode 100755 source-code/RuffCT-java/src/org/nem/core/utils/StringUtils.java create mode 100644 source-code/RuffCT-java/src/test/how/monero/hodl/BootleRuffingBenchmarks.java create mode 100644 source-code/RuffCT-java/src/test/how/monero/hodl/BootleRuffingSpendTest.java create mode 100644 source-code/RuffCT-java/src/test/how/monero/hodl/Prove1Valid1Test1.java create mode 100644 source-code/RuffCT-java/src/test/how/monero/hodl/Prove2Valid2Test1.java create mode 100644 source-code/RuffCT-java/src/test/how/monero/hodl/Prove2Valid2Test1a.java create mode 100644 source-code/RuffCT-java/src/test/how/monero/hodl/Prove2Valid2Test1b.java diff --git a/source-code/RuffCT-java/c/crypto-ops-data.c b/source-code/RuffCT-java/c/crypto-ops-data.c new file mode 100644 index 0000000..246808a --- /dev/null +++ b/source-code/RuffCT-java/c/crypto-ops-data.c @@ -0,0 +1,872 @@ +// Copyright (c) 2014-2017, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers + +#include <stdint.h> + +#include "crypto-ops.h" + +/* sqrt(x) is such an integer y that 0 <= y <= p - 1, y % 2 = 0, and y^2 = x (mod p). */ +/* d = -121665 / 121666 */ +const fe fe_d = {-10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116}; /* d */ +const fe fe_sqrtm1 = {-32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482}; /* sqrt(-1) */ +const fe fe_d2 = {-21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199}; /* 2 * d */ + +/* base[i][j] = (j+1)*256^i*B */ +const ge_precomp ge_base[32][8] = { + { + {{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605}, + {-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378}, + {-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546}}, + {{-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303}, + {-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081}, + {26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697}}, + {{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024}, + {16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574}, + {30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357}}, + {{-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540}, + {23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397}, + {7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325}}, + {{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380}, + {4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306}, + {19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942}}, + {{-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777}, + {-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737}, + {-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652}}, + {{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766}, + {-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701}, + {28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300}}, + {{14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726}, + {-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955}, + {27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425}} + }, { + {{-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171}, + {27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510}, + {17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660}}, + {{-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639}, + {29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963}, + {5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950}}, + {{-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568}, + {12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335}, + {25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628}}, + {{-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007}, + {-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772}, + {-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653}}, + {{2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567}, + {13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686}, + {21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372}}, + {{-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887}, + {-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954}, + {-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953}}, + {{24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833}, + {-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532}, + {-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876}}, + {{2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268}, + {33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214}, + {1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038}} + }, { + {{6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800}, + {4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645}, + {-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664}}, + {{1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933}, + {-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182}, + {-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222}}, + {{-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991}, + {20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880}, + {9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092}}, + {{-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295}, + {19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788}, + {8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553}}, + {{-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026}, + {11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347}, + {-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033}}, + {{-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395}, + {-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278}, + {1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890}}, + {{32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995}, + {-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596}, + {-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891}}, + {{31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060}, + {11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608}, + {-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606}} + }, { + {{7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389}, + {-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016}, + {-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341}}, + {{-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505}, + {14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553}, + {-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655}}, + {{15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220}, + {12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631}, + {-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099}}, + {{26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556}, + {14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749}, + {236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930}}, + {{1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391}, + {5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253}, + {20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066}}, + {{24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958}, + {-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082}, + {-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383}}, + {{-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521}, + {-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807}, + {23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948}}, + {{9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134}, + {-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455}, + {27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629}} + }, { + {{-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069}, + {-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746}, + {24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919}}, + {{11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837}, + {8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906}, + {-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771}}, + {{-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817}, + {10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098}, + {10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409}}, + {{-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504}, + {-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727}, + {28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420}}, + {{-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003}, + {-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605}, + {-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384}}, + {{-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701}, + {-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683}, + {29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708}}, + {{-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563}, + {-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260}, + {-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387}}, + {{-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672}, + {23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686}, + {-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665}} + }, { + {{11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182}, + {-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277}, + {14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628}}, + {{-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474}, + {-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539}, + {-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822}}, + {{-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970}, + {19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756}, + {-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508}}, + {{-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683}, + {-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655}, + {-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158}}, + {{-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125}, + {-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839}, + {-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664}}, + {{27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294}, + {-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899}, + {-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070}}, + {{3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294}, + {-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949}, + {-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083}}, + {{31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420}, + {-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940}, + {29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396}} + }, { + {{-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567}, + {20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127}, + {-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294}}, + {{-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887}, + {22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964}, + {16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195}}, + {{9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244}, + {24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999}, + {-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762}}, + {{-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274}, + {-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236}, + {-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605}}, + {{-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761}, + {-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884}, + {-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482}}, + {{-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638}, + {-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490}, + {-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170}}, + {{5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736}, + {10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124}, + {-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392}}, + {{8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029}, + {6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048}, + {28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958}} + }, { + {{24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593}, + {26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071}, + {-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692}}, + {{11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687}, + {-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441}, + {-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001}}, + {{-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460}, + {-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007}, + {-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762}}, + {{15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005}, + {-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674}, + {4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035}}, + {{7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590}, + {-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957}, + {-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812}}, + {{33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740}, + {-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122}, + {-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158}}, + {{8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885}, + {26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140}, + {19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857}}, + {{801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155}, + {19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260}, + {19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483}} + }, { + {{-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677}, + {32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815}, + {22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751}}, + {{-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203}, + {-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208}, + {1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230}}, + {{16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850}, + {-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389}, + {-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968}}, + {{-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689}, + {14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880}, + {5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304}}, + {{30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632}, + {-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412}, + {20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566}}, + {{-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038}, + {-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232}, + {-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943}}, + {{17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856}, + {23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738}, + {15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971}}, + {{-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718}, + {-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697}, + {-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883}} + }, { + {{5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912}, + {-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358}, + {3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849}}, + {{29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307}, + {-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977}, + {-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335}}, + {{-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644}, + {-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616}, + {-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735}}, + {{-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099}, + {29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341}, + {-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336}}, + {{-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646}, + {31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425}, + {-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388}}, + {{-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743}, + {-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822}, + {-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462}}, + {{18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985}, + {9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702}, + {-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797}}, + {{21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293}, + {27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100}, + {19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688}} + }, { + {{12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186}, + {2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610}, + {-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707}}, + {{7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220}, + {915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025}, + {32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044}}, + {{32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992}, + {-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027}, + {21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197}}, + {{8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901}, + {31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952}, + {19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878}}, + {{-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390}, + {32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730}, + {2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730}}, + {{-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180}, + {-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272}, + {-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715}}, + {{-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970}, + {-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772}, + {-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865}}, + {{15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750}, + {20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373}, + {32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348}} + }, { + {{9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144}, + {-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195}, + {5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086}}, + {{-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684}, + {-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518}, + {-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233}}, + {{-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793}, + {-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794}, + {580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435}}, + {{23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921}, + {13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518}, + {2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563}}, + {{14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278}, + {-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024}, + {4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030}}, + {{10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783}, + {27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717}, + {6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844}}, + {{14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333}, + {16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048}, + {22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760}}, + {{-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760}, + {-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757}, + {-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112}} + }, { + {{-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468}, + {3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184}, + {10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289}}, + {{15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066}, + {24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882}, + {13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226}}, + {{16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101}, + {29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279}, + {-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811}}, + {{27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709}, + {20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714}, + {-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121}}, + {{9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464}, + {12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847}, + {13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400}}, + {{4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414}, + {-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158}, + {17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045}}, + {{-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415}, + {-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459}, + {-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079}}, + {{21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412}, + {-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743}, + {-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836}} + }, { + {{12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022}, + {18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429}, + {-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065}}, + {{30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861}, + {10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000}, + {-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101}}, + {{32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815}, + {29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642}, + {10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966}}, + {{25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574}, + {-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742}, + {-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689}}, + {{12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020}, + {-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772}, + {3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982}}, + {{-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953}, + {-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218}, + {-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265}}, + {{29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073}, + {-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325}, + {-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798}}, + {{-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870}, + {-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863}, + {-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927}} + }, { + {{-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267}, + {-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663}, + {22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862}}, + {{-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673}, + {15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943}, + {15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020}}, + {{-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238}, + {11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064}, + {14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795}}, + {{15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052}, + {-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904}, + {29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531}}, + {{-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979}, + {-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841}, + {10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431}}, + {{10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324}, + {-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940}, + {10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320}}, + {{-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184}, + {14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114}, + {30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878}}, + {{12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784}, + {-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091}, + {-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585}} + }, { + {{-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208}, + {10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864}, + {17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661}}, + {{7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233}, + {26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212}, + {-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525}}, + {{-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068}, + {9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397}, + {-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988}}, + {{5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889}, + {32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038}, + {14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697}}, + {{20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875}, + {-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905}, + {-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656}}, + {{11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818}, + {27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714}, + {10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203}}, + {{20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931}, + {-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024}, + {-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084}}, + {{-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204}, + {20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817}, + {27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667}} + }, { + {{11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504}, + {-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768}, + {-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255}}, + {{6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790}, + {1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438}, + {-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333}}, + {{17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971}, + {31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905}, + {29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409}}, + {{12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409}, + {6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499}, + {-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363}}, + {{28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664}, + {-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324}, + {-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940}}, + {{13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990}, + {-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914}, + {-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290}}, + {{24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257}, + {-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433}, + {-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236}}, + {{-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045}, + {11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093}, + {-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347}} + }, { + {{-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191}, + {-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507}, + {-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906}}, + {{3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018}, + {-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109}, + {-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926}}, + {{-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528}, + {8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625}, + {-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286}}, + {{2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033}, + {27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866}, + {21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896}}, + {{30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075}, + {26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347}, + {-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437}}, + {{-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165}, + {-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588}, + {-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193}}, + {{-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017}, + {-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883}, + {21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961}}, + {{8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043}, + {29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663}, + {-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362}} + }, { + {{-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860}, + {2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466}, + {-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063}}, + {{-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997}, + {-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295}, + {-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369}}, + {{9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385}, + {18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109}, + {2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906}}, + {{4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424}, + {-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185}, + {7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962}}, + {{-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325}, + {10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593}, + {696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404}}, + {{-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644}, + {17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801}, + {26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804}}, + {{-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884}, + {-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577}, + {-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849}}, + {{32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473}, + {-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644}, + {-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319}} + }, { + {{-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599}, + {-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768}, + {-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084}}, + {{-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328}, + {-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369}, + {20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920}}, + {{12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815}, + {-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025}, + {-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397}}, + {{-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448}, + {6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981}, + {30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165}}, + {{32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501}, + {17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073}, + {-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861}}, + {{14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845}, + {-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211}, + {18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870}}, + {{10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096}, + {33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803}, + {-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168}}, + {{30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965}, + {-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505}, + {18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598}} + }, { + {{5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782}, + {5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900}, + {-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479}}, + {{-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208}, + {8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232}, + {17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719}}, + {{16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271}, + {-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326}, + {-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132}}, + {{14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300}, + {8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570}, + {15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670}}, + {{-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994}, + {-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913}, + {31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317}}, + {{-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730}, + {842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096}, + {-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078}}, + {{-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411}, + {-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905}, + {-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654}}, + {{-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870}, + {-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498}, + {12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579}} + }, { + {{14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677}, + {10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647}, + {-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743}}, + {{-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468}, + {21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375}, + {-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155}}, + {{6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725}, + {-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612}, + {-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943}}, + {{-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944}, + {30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928}, + {9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406}}, + {{22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139}, + {-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963}, + {-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693}}, + {{1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734}, + {-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680}, + {-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410}}, + {{-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931}, + {-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654}, + {22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710}}, + {{29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180}, + {-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684}, + {-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895}} + }, { + {{22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501}, + {-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413}, + {6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880}}, + {{-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874}, + {22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962}, + {-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899}}, + {{21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152}, + {9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063}, + {7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080}}, + {{-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146}, + {-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183}, + {-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133}}, + {{-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421}, + {-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622}, + {-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197}}, + {{2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663}, + {31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753}, + {4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755}}, + {{-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862}, + {-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118}, + {26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171}}, + {{15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380}, + {16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824}, + {28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270}} + }, { + {{-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438}, + {-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584}, + {-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562}}, + {{30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471}, + {18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610}, + {19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269}}, + {{-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650}, + {14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369}, + {19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461}}, + {{30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462}, + {-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793}, + {-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218}}, + {{-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226}, + {18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019}, + {-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037}}, + {{31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171}, + {-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132}, + {-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841}}, + {{21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181}, + {-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210}, + {-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040}}, + {{3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935}, + {24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105}, + {-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814}} + }, { + {{793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852}, + {5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581}, + {-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646}}, + {{10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844}, + {10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025}, + {27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453}}, + {{-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068}, + {4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192}, + {-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921}}, + {{-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259}, + {-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426}, + {-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072}}, + {{-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305}, + {13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832}, + {28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943}}, + {{-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011}, + {24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447}, + {17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494}}, + {{-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245}, + {-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859}, + {28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915}}, + {{16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707}, + {10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848}, + {-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224}} + }, { + {{-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391}, + {15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215}, + {-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101}}, + {{23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713}, + {21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849}, + {-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930}}, + {{-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940}, + {-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031}, + {-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404}}, + {{-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243}, + {-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116}, + {-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525}}, + {{-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509}, + {-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883}, + {15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865}}, + {{-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660}, + {4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273}, + {-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138}}, + {{-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560}, + {-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135}, + {2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941}}, + {{-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739}, + {18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756}, + {-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819}} + }, { + {{-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347}, + {-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028}, + {21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075}}, + {{16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799}, + {-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609}, + {-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817}}, + {{-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989}, + {-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523}, + {4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278}}, + {{31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045}, + {19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377}, + {24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480}}, + {{17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016}, + {510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426}, + {18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525}}, + {{13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396}, + {9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080}, + {12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892}}, + {{15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275}, + {11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074}, + {20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140}}, + {{-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717}, + {-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101}, + {24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127}} + }, { + {{-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632}, + {-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415}, + {-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160}}, + {{31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876}, + {22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625}, + {-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478}}, + {{27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164}, + {26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595}, + {-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248}}, + {{-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858}, + {15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193}, + {8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184}}, + {{-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942}, + {-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635}, + {21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948}}, + {{11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935}, + {-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415}, + {-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416}}, + {{-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018}, + {4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778}, + {366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659}}, + {{-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385}, + {18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503}, + {476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329}} + }, { + {{20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056}, + {-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838}, + {24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948}}, + {{-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691}, + {-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118}, + {-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517}}, + {{-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269}, + {-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904}, + {-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589}}, + {{-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193}, + {-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910}, + {-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930}}, + {{-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667}, + {25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481}, + {-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876}}, + {{22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640}, + {-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278}, + {-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112}}, + {{26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272}, + {17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012}, + {-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221}}, + {{30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046}, + {13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345}, + {-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310}} + }, { + {{19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937}, + {31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636}, + {-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008}}, + {{-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429}, + {-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576}, + {31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066}}, + {{-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490}, + {-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104}, + {33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053}}, + {{31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275}, + {-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511}, + {22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095}}, + {{-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439}, + {23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939}, + {-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424}}, + {{2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310}, + {3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608}, + {-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079}}, + {{-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101}, + {21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418}, + {18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576}}, + {{30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356}, + {9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996}, + {-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099}} + }, { + {{-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728}, + {-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658}, + {-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242}}, + {{-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001}, + {-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766}, + {18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373}}, + {{26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458}, + {-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628}, + {-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657}}, + {{-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062}, + {25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616}, + {31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014}}, + {{24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383}, + {-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814}, + {-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718}}, + {{30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417}, + {2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222}, + {33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444}}, + {{-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597}, + {23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970}, + {1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799}}, + {{-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647}, + {13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511}, + {-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032}} + }, { + {{9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834}, + {-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461}, + {29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062}}, + {{-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516}, + {-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547}, + {-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240}}, + {{-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038}, + {-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741}, + {16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103}}, + {{-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747}, + {-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323}, + {31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016}}, + {{-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373}, + {15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228}, + {-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141}}, + {{16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399}, + {11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831}, + {-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376}}, + {{-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313}, + {-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958}, + {-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577}}, + {{-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743}, + {29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684}, + {-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476}} + } +}; + +const ge_precomp ge_Bi[8] = { + {{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605}, + {-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378}, + {-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546}}, {{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024}, + {16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574}, + {30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357}}, {{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380}, + {4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306}, + {19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942}}, {{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766}, + {-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701}, + {28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300}}, {{-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877}, + {-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951}, + {4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784}}, {{-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436}, + {25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918}, + {23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877}}, {{-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800}, + {-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305}, + {-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300}}, {{-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876}, + {-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619}, + {-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683}} +}; + +/* A = 2 * (1 - d) / (1 + d) = 486662 */ +const fe fe_ma2 = {-12721188, -3529, 0, 0, 0, 0, 0, 0, 0, 0}; /* -A^2 */ +const fe fe_ma = {-486662, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* -A */ +const fe fe_fffb1 = {-31702527, -2466483, -26106795, -12203692, -12169197, -321052, 14850977, -10296299, -16929438, -407568}; /* sqrt(-2 * A * (A + 2)) */ +const fe fe_fffb2 = {8166131, -6741800, -17040804, 3154616, 21461005, 1466302, -30876704, -6368709, 10503587, -13363080}; /* sqrt(2 * A * (A + 2)) */ +const fe fe_fffb3 = {-13620103, 14639558, 4532995, 7679154, 16815101, -15883539, -22863840, -14813421, 13716513, -6477756}; /* sqrt(-sqrt(-1) * A * (A + 2)) */ +const fe fe_fffb4 = {-21786234, -12173074, 21573800, 4524538, -4645904, 16204591, 8012863, -8444712, 3212926, 6885324}; /* sqrt(sqrt(-1) * A * (A + 2)) */ diff --git a/source-code/RuffCT-java/c/crypto-ops.c b/source-code/RuffCT-java/c/crypto-ops.c new file mode 100644 index 0000000..e104825 --- /dev/null +++ b/source-code/RuffCT-java/c/crypto-ops.c @@ -0,0 +1,2923 @@ +// Copyright (c) 2014-2017, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers + +#include <assert.h> +#include <stdint.h> + +/*#include "warnings.h"*/ +#include "crypto-ops.h" + +// DISABLE_VS_WARNINGS(4146 4244) + +/* Predeclarations */ + +static void fe_mul(fe, const fe, const fe); +static void fe_sq(fe, const fe); +static void ge_madd(ge_p1p1 *, const ge_p3 *, const ge_precomp *); +static void ge_msub(ge_p1p1 *, const ge_p3 *, const ge_precomp *); +static void ge_p2_0(ge_p2 *); +static void ge_p3_dbl(ge_p1p1 *, const ge_p3 *); +static void fe_divpowm1(fe, const fe, const fe); + +/* Common functions */ + +uint64_t load_3(const unsigned char *in) { + uint64_t result; + result = (uint64_t) in[0]; + result |= ((uint64_t) in[1]) << 8; + result |= ((uint64_t) in[2]) << 16; + return result; +} + +uint64_t load_4(const unsigned char *in) +{ + uint64_t result; + result = (uint64_t) in[0]; + result |= ((uint64_t) in[1]) << 8; + result |= ((uint64_t) in[2]) << 16; + result |= ((uint64_t) in[3]) << 24; + return result; +} + +/* From fe_0.c */ + +/* +h = 0 +*/ + +static void fe_0(fe h) { + h[0] = 0; + h[1] = 0; + h[2] = 0; + h[3] = 0; + h[4] = 0; + h[5] = 0; + h[6] = 0; + h[7] = 0; + h[8] = 0; + h[9] = 0; +} + +/* From fe_1.c */ + +/* +h = 1 +*/ + +static void fe_1(fe h) { + h[0] = 1; + h[1] = 0; + h[2] = 0; + h[3] = 0; + h[4] = 0; + h[5] = 0; + h[6] = 0; + h[7] = 0; + h[8] = 0; + h[9] = 0; +} + +/* From fe_add.c */ + +/* +h = f + g +Can overlap h with f or g. + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +void fe_add(fe h, const fe f, const fe g) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t h0 = f0 + g0; + int32_t h1 = f1 + g1; + int32_t h2 = f2 + g2; + int32_t h3 = f3 + g3; + int32_t h4 = f4 + g4; + int32_t h5 = f5 + g5; + int32_t h6 = f6 + g6; + int32_t h7 = f7 + g7; + int32_t h8 = f8 + g8; + int32_t h9 = f9 + g9; + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/* From fe_cmov.c */ + +/* +Replace (f,g) with (g,g) if b == 1; +replace (f,g) with (f,g) if b == 0. + +Preconditions: b in {0,1}. +*/ + +static void fe_cmov(fe f, const fe g, unsigned int b) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t x0 = f0 ^ g0; + int32_t x1 = f1 ^ g1; + int32_t x2 = f2 ^ g2; + int32_t x3 = f3 ^ g3; + int32_t x4 = f4 ^ g4; + int32_t x5 = f5 ^ g5; + int32_t x6 = f6 ^ g6; + int32_t x7 = f7 ^ g7; + int32_t x8 = f8 ^ g8; + int32_t x9 = f9 ^ g9; + assert((((b - 1) & ~b) | ((b - 2) & ~(b - 1))) == (unsigned int) -1); + b = -b; + x0 &= b; + x1 &= b; + x2 &= b; + x3 &= b; + x4 &= b; + x5 &= b; + x6 &= b; + x7 &= b; + x8 &= b; + x9 &= b; + f[0] = f0 ^ x0; + f[1] = f1 ^ x1; + f[2] = f2 ^ x2; + f[3] = f3 ^ x3; + f[4] = f4 ^ x4; + f[5] = f5 ^ x5; + f[6] = f6 ^ x6; + f[7] = f7 ^ x7; + f[8] = f8 ^ x8; + f[9] = f9 ^ x9; +} + +/* From fe_copy.c */ + +/* +h = f +*/ + +static void fe_copy(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + h[0] = f0; + h[1] = f1; + h[2] = f2; + h[3] = f3; + h[4] = f4; + h[5] = f5; + h[6] = f6; + h[7] = f7; + h[8] = f8; + h[9] = f9; +} + +/* From fe_invert.c */ + +void fe_invert(fe out, const fe z) { + fe t0; + fe t1; + fe t2; + fe t3; + int i; + + fe_sq(t0, z); + fe_sq(t1, t0); + fe_sq(t1, t1); + fe_mul(t1, z, t1); + fe_mul(t0, t0, t1); + fe_sq(t2, t0); + fe_mul(t1, t1, t2); + fe_sq(t2, t1); + for (i = 0; i < 4; ++i) { + fe_sq(t2, t2); + } + fe_mul(t1, t2, t1); + fe_sq(t2, t1); + for (i = 0; i < 9; ++i) { + fe_sq(t2, t2); + } + fe_mul(t2, t2, t1); + fe_sq(t3, t2); + for (i = 0; i < 19; ++i) { + fe_sq(t3, t3); + } + fe_mul(t2, t3, t2); + fe_sq(t2, t2); + for (i = 0; i < 9; ++i) { + fe_sq(t2, t2); + } + fe_mul(t1, t2, t1); + fe_sq(t2, t1); + for (i = 0; i < 49; ++i) { + fe_sq(t2, t2); + } + fe_mul(t2, t2, t1); + fe_sq(t3, t2); + for (i = 0; i < 99; ++i) { + fe_sq(t3, t3); + } + fe_mul(t2, t3, t2); + fe_sq(t2, t2); + for (i = 0; i < 49; ++i) { + fe_sq(t2, t2); + } + fe_mul(t1, t2, t1); + fe_sq(t1, t1); + for (i = 0; i < 4; ++i) { + fe_sq(t1, t1); + } + fe_mul(out, t1, t0); + + return; +} + +/* From fe_isnegative.c */ + +/* +return 1 if f is in {1,3,5,...,q-2} +return 0 if f is in {0,2,4,...,q-1} + +Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +static int fe_isnegative(const fe f) { + unsigned char s[32]; + fe_tobytes(s, f); + return s[0] & 1; +} + +/* From fe_isnonzero.c, modified */ + +static int fe_isnonzero(const fe f) { + unsigned char s[32]; + fe_tobytes(s, f); + return (((int) (s[0] | s[1] | s[2] | s[3] | s[4] | s[5] | s[6] | s[7] | s[8] | + s[9] | s[10] | s[11] | s[12] | s[13] | s[14] | s[15] | s[16] | s[17] | + s[18] | s[19] | s[20] | s[21] | s[22] | s[23] | s[24] | s[25] | s[26] | + s[27] | s[28] | s[29] | s[30] | s[31]) - 1) >> 8) + 1; +} + +/* From fe_mul.c */ + +/* +h = f * g +Can overlap h with f or g. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + |g| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + +/* +Notes on implementation strategy: + +Using schoolbook multiplication. +Karatsuba would save a little in some cost models. + +Most multiplications by 2 and 19 are 32-bit precomputations; +cheaper than 64-bit postcomputations. + +There is one remaining multiplication by 19 in the carry chain; +one *19 precomputation can be merged into this, +but the resulting data flow is considerably less clean. + +There are 12 carries below. +10 of them are 2-way parallelizable and vectorizable. +Can get away with 11 carries, but then data flow is much deeper. + +With tighter constraints on inputs can squeeze carries into int32. +*/ + +static void fe_mul(fe h, const fe f, const fe g) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t g1_19 = 19 * g1; /* 1.959375*2^29 */ + int32_t g2_19 = 19 * g2; /* 1.959375*2^30; still ok */ + int32_t g3_19 = 19 * g3; + int32_t g4_19 = 19 * g4; + int32_t g5_19 = 19 * g5; + int32_t g6_19 = 19 * g6; + int32_t g7_19 = 19 * g7; + int32_t g8_19 = 19 * g8; + int32_t g9_19 = 19 * g9; + int32_t f1_2 = 2 * f1; + int32_t f3_2 = 2 * f3; + int32_t f5_2 = 2 * f5; + int32_t f7_2 = 2 * f7; + int32_t f9_2 = 2 * f9; + int64_t f0g0 = f0 * (int64_t) g0; + int64_t f0g1 = f0 * (int64_t) g1; + int64_t f0g2 = f0 * (int64_t) g2; + int64_t f0g3 = f0 * (int64_t) g3; + int64_t f0g4 = f0 * (int64_t) g4; + int64_t f0g5 = f0 * (int64_t) g5; + int64_t f0g6 = f0 * (int64_t) g6; + int64_t f0g7 = f0 * (int64_t) g7; + int64_t f0g8 = f0 * (int64_t) g8; + int64_t f0g9 = f0 * (int64_t) g9; + int64_t f1g0 = f1 * (int64_t) g0; + int64_t f1g1_2 = f1_2 * (int64_t) g1; + int64_t f1g2 = f1 * (int64_t) g2; + int64_t f1g3_2 = f1_2 * (int64_t) g3; + int64_t f1g4 = f1 * (int64_t) g4; + int64_t f1g5_2 = f1_2 * (int64_t) g5; + int64_t f1g6 = f1 * (int64_t) g6; + int64_t f1g7_2 = f1_2 * (int64_t) g7; + int64_t f1g8 = f1 * (int64_t) g8; + int64_t f1g9_38 = f1_2 * (int64_t) g9_19; + int64_t f2g0 = f2 * (int64_t) g0; + int64_t f2g1 = f2 * (int64_t) g1; + int64_t f2g2 = f2 * (int64_t) g2; + int64_t f2g3 = f2 * (int64_t) g3; + int64_t f2g4 = f2 * (int64_t) g4; + int64_t f2g5 = f2 * (int64_t) g5; + int64_t f2g6 = f2 * (int64_t) g6; + int64_t f2g7 = f2 * (int64_t) g7; + int64_t f2g8_19 = f2 * (int64_t) g8_19; + int64_t f2g9_19 = f2 * (int64_t) g9_19; + int64_t f3g0 = f3 * (int64_t) g0; + int64_t f3g1_2 = f3_2 * (int64_t) g1; + int64_t f3g2 = f3 * (int64_t) g2; + int64_t f3g3_2 = f3_2 * (int64_t) g3; + int64_t f3g4 = f3 * (int64_t) g4; + int64_t f3g5_2 = f3_2 * (int64_t) g5; + int64_t f3g6 = f3 * (int64_t) g6; + int64_t f3g7_38 = f3_2 * (int64_t) g7_19; + int64_t f3g8_19 = f3 * (int64_t) g8_19; + int64_t f3g9_38 = f3_2 * (int64_t) g9_19; + int64_t f4g0 = f4 * (int64_t) g0; + int64_t f4g1 = f4 * (int64_t) g1; + int64_t f4g2 = f4 * (int64_t) g2; + int64_t f4g3 = f4 * (int64_t) g3; + int64_t f4g4 = f4 * (int64_t) g4; + int64_t f4g5 = f4 * (int64_t) g5; + int64_t f4g6_19 = f4 * (int64_t) g6_19; + int64_t f4g7_19 = f4 * (int64_t) g7_19; + int64_t f4g8_19 = f4 * (int64_t) g8_19; + int64_t f4g9_19 = f4 * (int64_t) g9_19; + int64_t f5g0 = f5 * (int64_t) g0; + int64_t f5g1_2 = f5_2 * (int64_t) g1; + int64_t f5g2 = f5 * (int64_t) g2; + int64_t f5g3_2 = f5_2 * (int64_t) g3; + int64_t f5g4 = f5 * (int64_t) g4; + int64_t f5g5_38 = f5_2 * (int64_t) g5_19; + int64_t f5g6_19 = f5 * (int64_t) g6_19; + int64_t f5g7_38 = f5_2 * (int64_t) g7_19; + int64_t f5g8_19 = f5 * (int64_t) g8_19; + int64_t f5g9_38 = f5_2 * (int64_t) g9_19; + int64_t f6g0 = f6 * (int64_t) g0; + int64_t f6g1 = f6 * (int64_t) g1; + int64_t f6g2 = f6 * (int64_t) g2; + int64_t f6g3 = f6 * (int64_t) g3; + int64_t f6g4_19 = f6 * (int64_t) g4_19; + int64_t f6g5_19 = f6 * (int64_t) g5_19; + int64_t f6g6_19 = f6 * (int64_t) g6_19; + int64_t f6g7_19 = f6 * (int64_t) g7_19; + int64_t f6g8_19 = f6 * (int64_t) g8_19; + int64_t f6g9_19 = f6 * (int64_t) g9_19; + int64_t f7g0 = f7 * (int64_t) g0; + int64_t f7g1_2 = f7_2 * (int64_t) g1; + int64_t f7g2 = f7 * (int64_t) g2; + int64_t f7g3_38 = f7_2 * (int64_t) g3_19; + int64_t f7g4_19 = f7 * (int64_t) g4_19; + int64_t f7g5_38 = f7_2 * (int64_t) g5_19; + int64_t f7g6_19 = f7 * (int64_t) g6_19; + int64_t f7g7_38 = f7_2 * (int64_t) g7_19; + int64_t f7g8_19 = f7 * (int64_t) g8_19; + int64_t f7g9_38 = f7_2 * (int64_t) g9_19; + int64_t f8g0 = f8 * (int64_t) g0; + int64_t f8g1 = f8 * (int64_t) g1; + int64_t f8g2_19 = f8 * (int64_t) g2_19; + int64_t f8g3_19 = f8 * (int64_t) g3_19; + int64_t f8g4_19 = f8 * (int64_t) g4_19; + int64_t f8g5_19 = f8 * (int64_t) g5_19; + int64_t f8g6_19 = f8 * (int64_t) g6_19; + int64_t f8g7_19 = f8 * (int64_t) g7_19; + int64_t f8g8_19 = f8 * (int64_t) g8_19; + int64_t f8g9_19 = f8 * (int64_t) g9_19; + int64_t f9g0 = f9 * (int64_t) g0; + int64_t f9g1_38 = f9_2 * (int64_t) g1_19; + int64_t f9g2_19 = f9 * (int64_t) g2_19; + int64_t f9g3_38 = f9_2 * (int64_t) g3_19; + int64_t f9g4_19 = f9 * (int64_t) g4_19; + int64_t f9g5_38 = f9_2 * (int64_t) g5_19; + int64_t f9g6_19 = f9 * (int64_t) g6_19; + int64_t f9g7_38 = f9_2 * (int64_t) g7_19; + int64_t f9g8_19 = f9 * (int64_t) g8_19; + int64_t f9g9_38 = f9_2 * (int64_t) g9_19; + int64_t h0 = f0g0+f1g9_38+f2g8_19+f3g7_38+f4g6_19+f5g5_38+f6g4_19+f7g3_38+f8g2_19+f9g1_38; + int64_t h1 = f0g1+f1g0 +f2g9_19+f3g8_19+f4g7_19+f5g6_19+f6g5_19+f7g4_19+f8g3_19+f9g2_19; + int64_t h2 = f0g2+f1g1_2 +f2g0 +f3g9_38+f4g8_19+f5g7_38+f6g6_19+f7g5_38+f8g4_19+f9g3_38; + int64_t h3 = f0g3+f1g2 +f2g1 +f3g0 +f4g9_19+f5g8_19+f6g7_19+f7g6_19+f8g5_19+f9g4_19; + int64_t h4 = f0g4+f1g3_2 +f2g2 +f3g1_2 +f4g0 +f5g9_38+f6g8_19+f7g7_38+f8g6_19+f9g5_38; + int64_t h5 = f0g5+f1g4 +f2g3 +f3g2 +f4g1 +f5g0 +f6g9_19+f7g8_19+f8g7_19+f9g6_19; + int64_t h6 = f0g6+f1g5_2 +f2g4 +f3g3_2 +f4g2 +f5g1_2 +f6g0 +f7g9_38+f8g8_19+f9g7_38; + int64_t h7 = f0g7+f1g6 +f2g5 +f3g4 +f4g3 +f5g2 +f6g1 +f7g0 +f8g9_19+f9g8_19; + int64_t h8 = f0g8+f1g7_2 +f2g6 +f3g5_2 +f4g4 +f5g3_2 +f6g2 +f7g1_2 +f8g0 +f9g9_38; + int64_t h9 = f0g9+f1g8 +f2g7 +f3g6 +f4g5 +f5g4 +f6g3 +f7g2 +f8g1 +f9g0 ; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + + /* + |h0| <= (1.65*1.65*2^52*(1+19+19+19+19)+1.65*1.65*2^50*(38+38+38+38+38)) + i.e. |h0| <= 1.4*2^60; narrower ranges for h2, h4, h6, h8 + |h1| <= (1.65*1.65*2^51*(1+1+19+19+19+19+19+19+19+19)) + i.e. |h1| <= 1.7*2^59; narrower ranges for h3, h5, h7, h9 + */ + + carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + /* |h0| <= 2^25 */ + /* |h4| <= 2^25 */ + /* |h1| <= 1.71*2^59 */ + /* |h5| <= 1.71*2^59 */ + + carry1 = (h1 + (int64_t) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry5 = (h5 + (int64_t) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + /* |h1| <= 2^24; from now on fits into int32 */ + /* |h5| <= 2^24; from now on fits into int32 */ + /* |h2| <= 1.41*2^60 */ + /* |h6| <= 1.41*2^60 */ + + carry2 = (h2 + (int64_t) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry6 = (h6 + (int64_t) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + /* |h2| <= 2^25; from now on fits into int32 unchanged */ + /* |h6| <= 2^25; from now on fits into int32 unchanged */ + /* |h3| <= 1.71*2^59 */ + /* |h7| <= 1.71*2^59 */ + + carry3 = (h3 + (int64_t) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry7 = (h7 + (int64_t) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + /* |h3| <= 2^24; from now on fits into int32 unchanged */ + /* |h7| <= 2^24; from now on fits into int32 unchanged */ + /* |h4| <= 1.72*2^34 */ + /* |h8| <= 1.41*2^60 */ + + carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry8 = (h8 + (int64_t) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + /* |h4| <= 2^25; from now on fits into int32 unchanged */ + /* |h8| <= 2^25; from now on fits into int32 unchanged */ + /* |h5| <= 1.01*2^24 */ + /* |h9| <= 1.71*2^59 */ + + carry9 = (h9 + (int64_t) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + /* |h9| <= 2^24; from now on fits into int32 unchanged */ + /* |h0| <= 1.1*2^39 */ + + carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + /* |h0| <= 2^25; from now on fits into int32 unchanged */ + /* |h1| <= 1.01*2^24 */ + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/* From fe_neg.c */ + +/* +h = -f + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +*/ + +static void fe_neg(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t h0 = -f0; + int32_t h1 = -f1; + int32_t h2 = -f2; + int32_t h3 = -f3; + int32_t h4 = -f4; + int32_t h5 = -f5; + int32_t h6 = -f6; + int32_t h7 = -f7; + int32_t h8 = -f8; + int32_t h9 = -f9; + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/* From fe_sq.c */ + +/* +h = f * f +Can overlap h with f. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + +/* +See fe_mul.c for discussion of implementation strategy. +*/ + +static void fe_sq(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t f0_2 = 2 * f0; + int32_t f1_2 = 2 * f1; + int32_t f2_2 = 2 * f2; + int32_t f3_2 = 2 * f3; + int32_t f4_2 = 2 * f4; + int32_t f5_2 = 2 * f5; + int32_t f6_2 = 2 * f6; + int32_t f7_2 = 2 * f7; + int32_t f5_38 = 38 * f5; /* 1.959375*2^30 */ + int32_t f6_19 = 19 * f6; /* 1.959375*2^30 */ + int32_t f7_38 = 38 * f7; /* 1.959375*2^30 */ + int32_t f8_19 = 19 * f8; /* 1.959375*2^30 */ + int32_t f9_38 = 38 * f9; /* 1.959375*2^30 */ + int64_t f0f0 = f0 * (int64_t) f0; + int64_t f0f1_2 = f0_2 * (int64_t) f1; + int64_t f0f2_2 = f0_2 * (int64_t) f2; + int64_t f0f3_2 = f0_2 * (int64_t) f3; + int64_t f0f4_2 = f0_2 * (int64_t) f4; + int64_t f0f5_2 = f0_2 * (int64_t) f5; + int64_t f0f6_2 = f0_2 * (int64_t) f6; + int64_t f0f7_2 = f0_2 * (int64_t) f7; + int64_t f0f8_2 = f0_2 * (int64_t) f8; + int64_t f0f9_2 = f0_2 * (int64_t) f9; + int64_t f1f1_2 = f1_2 * (int64_t) f1; + int64_t f1f2_2 = f1_2 * (int64_t) f2; + int64_t f1f3_4 = f1_2 * (int64_t) f3_2; + int64_t f1f4_2 = f1_2 * (int64_t) f4; + int64_t f1f5_4 = f1_2 * (int64_t) f5_2; + int64_t f1f6_2 = f1_2 * (int64_t) f6; + int64_t f1f7_4 = f1_2 * (int64_t) f7_2; + int64_t f1f8_2 = f1_2 * (int64_t) f8; + int64_t f1f9_76 = f1_2 * (int64_t) f9_38; + int64_t f2f2 = f2 * (int64_t) f2; + int64_t f2f3_2 = f2_2 * (int64_t) f3; + int64_t f2f4_2 = f2_2 * (int64_t) f4; + int64_t f2f5_2 = f2_2 * (int64_t) f5; + int64_t f2f6_2 = f2_2 * (int64_t) f6; + int64_t f2f7_2 = f2_2 * (int64_t) f7; + int64_t f2f8_38 = f2_2 * (int64_t) f8_19; + int64_t f2f9_38 = f2 * (int64_t) f9_38; + int64_t f3f3_2 = f3_2 * (int64_t) f3; + int64_t f3f4_2 = f3_2 * (int64_t) f4; + int64_t f3f5_4 = f3_2 * (int64_t) f5_2; + int64_t f3f6_2 = f3_2 * (int64_t) f6; + int64_t f3f7_76 = f3_2 * (int64_t) f7_38; + int64_t f3f8_38 = f3_2 * (int64_t) f8_19; + int64_t f3f9_76 = f3_2 * (int64_t) f9_38; + int64_t f4f4 = f4 * (int64_t) f4; + int64_t f4f5_2 = f4_2 * (int64_t) f5; + int64_t f4f6_38 = f4_2 * (int64_t) f6_19; + int64_t f4f7_38 = f4 * (int64_t) f7_38; + int64_t f4f8_38 = f4_2 * (int64_t) f8_19; + int64_t f4f9_38 = f4 * (int64_t) f9_38; + int64_t f5f5_38 = f5 * (int64_t) f5_38; + int64_t f5f6_38 = f5_2 * (int64_t) f6_19; + int64_t f5f7_76 = f5_2 * (int64_t) f7_38; + int64_t f5f8_38 = f5_2 * (int64_t) f8_19; + int64_t f5f9_76 = f5_2 * (int64_t) f9_38; + int64_t f6f6_19 = f6 * (int64_t) f6_19; + int64_t f6f7_38 = f6 * (int64_t) f7_38; + int64_t f6f8_38 = f6_2 * (int64_t) f8_19; + int64_t f6f9_38 = f6 * (int64_t) f9_38; + int64_t f7f7_38 = f7 * (int64_t) f7_38; + int64_t f7f8_38 = f7_2 * (int64_t) f8_19; + int64_t f7f9_76 = f7_2 * (int64_t) f9_38; + int64_t f8f8_19 = f8 * (int64_t) f8_19; + int64_t f8f9_38 = f8 * (int64_t) f9_38; + int64_t f9f9_38 = f9 * (int64_t) f9_38; + int64_t h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38; + int64_t h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38; + int64_t h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19; + int64_t h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38; + int64_t h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38; + int64_t h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38; + int64_t h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19; + int64_t h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; + int64_t h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; + int64_t h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + + carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + + carry1 = (h1 + (int64_t) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry5 = (h5 + (int64_t) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + + carry2 = (h2 + (int64_t) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry6 = (h6 + (int64_t) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + + carry3 = (h3 + (int64_t) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry7 = (h7 + (int64_t) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry8 = (h8 + (int64_t) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + carry9 = (h9 + (int64_t) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + + carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/* From fe_sq2.c */ + +/* +h = 2 * f * f +Can overlap h with f. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + +/* +See fe_mul.c for discussion of implementation strategy. +*/ + +static void fe_sq2(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t f0_2 = 2 * f0; + int32_t f1_2 = 2 * f1; + int32_t f2_2 = 2 * f2; + int32_t f3_2 = 2 * f3; + int32_t f4_2 = 2 * f4; + int32_t f5_2 = 2 * f5; + int32_t f6_2 = 2 * f6; + int32_t f7_2 = 2 * f7; + int32_t f5_38 = 38 * f5; /* 1.959375*2^30 */ + int32_t f6_19 = 19 * f6; /* 1.959375*2^30 */ + int32_t f7_38 = 38 * f7; /* 1.959375*2^30 */ + int32_t f8_19 = 19 * f8; /* 1.959375*2^30 */ + int32_t f9_38 = 38 * f9; /* 1.959375*2^30 */ + int64_t f0f0 = f0 * (int64_t) f0; + int64_t f0f1_2 = f0_2 * (int64_t) f1; + int64_t f0f2_2 = f0_2 * (int64_t) f2; + int64_t f0f3_2 = f0_2 * (int64_t) f3; + int64_t f0f4_2 = f0_2 * (int64_t) f4; + int64_t f0f5_2 = f0_2 * (int64_t) f5; + int64_t f0f6_2 = f0_2 * (int64_t) f6; + int64_t f0f7_2 = f0_2 * (int64_t) f7; + int64_t f0f8_2 = f0_2 * (int64_t) f8; + int64_t f0f9_2 = f0_2 * (int64_t) f9; + int64_t f1f1_2 = f1_2 * (int64_t) f1; + int64_t f1f2_2 = f1_2 * (int64_t) f2; + int64_t f1f3_4 = f1_2 * (int64_t) f3_2; + int64_t f1f4_2 = f1_2 * (int64_t) f4; + int64_t f1f5_4 = f1_2 * (int64_t) f5_2; + int64_t f1f6_2 = f1_2 * (int64_t) f6; + int64_t f1f7_4 = f1_2 * (int64_t) f7_2; + int64_t f1f8_2 = f1_2 * (int64_t) f8; + int64_t f1f9_76 = f1_2 * (int64_t) f9_38; + int64_t f2f2 = f2 * (int64_t) f2; + int64_t f2f3_2 = f2_2 * (int64_t) f3; + int64_t f2f4_2 = f2_2 * (int64_t) f4; + int64_t f2f5_2 = f2_2 * (int64_t) f5; + int64_t f2f6_2 = f2_2 * (int64_t) f6; + int64_t f2f7_2 = f2_2 * (int64_t) f7; + int64_t f2f8_38 = f2_2 * (int64_t) f8_19; + int64_t f2f9_38 = f2 * (int64_t) f9_38; + int64_t f3f3_2 = f3_2 * (int64_t) f3; + int64_t f3f4_2 = f3_2 * (int64_t) f4; + int64_t f3f5_4 = f3_2 * (int64_t) f5_2; + int64_t f3f6_2 = f3_2 * (int64_t) f6; + int64_t f3f7_76 = f3_2 * (int64_t) f7_38; + int64_t f3f8_38 = f3_2 * (int64_t) f8_19; + int64_t f3f9_76 = f3_2 * (int64_t) f9_38; + int64_t f4f4 = f4 * (int64_t) f4; + int64_t f4f5_2 = f4_2 * (int64_t) f5; + int64_t f4f6_38 = f4_2 * (int64_t) f6_19; + int64_t f4f7_38 = f4 * (int64_t) f7_38; + int64_t f4f8_38 = f4_2 * (int64_t) f8_19; + int64_t f4f9_38 = f4 * (int64_t) f9_38; + int64_t f5f5_38 = f5 * (int64_t) f5_38; + int64_t f5f6_38 = f5_2 * (int64_t) f6_19; + int64_t f5f7_76 = f5_2 * (int64_t) f7_38; + int64_t f5f8_38 = f5_2 * (int64_t) f8_19; + int64_t f5f9_76 = f5_2 * (int64_t) f9_38; + int64_t f6f6_19 = f6 * (int64_t) f6_19; + int64_t f6f7_38 = f6 * (int64_t) f7_38; + int64_t f6f8_38 = f6_2 * (int64_t) f8_19; + int64_t f6f9_38 = f6 * (int64_t) f9_38; + int64_t f7f7_38 = f7 * (int64_t) f7_38; + int64_t f7f8_38 = f7_2 * (int64_t) f8_19; + int64_t f7f9_76 = f7_2 * (int64_t) f9_38; + int64_t f8f8_19 = f8 * (int64_t) f8_19; + int64_t f8f9_38 = f8 * (int64_t) f9_38; + int64_t f9f9_38 = f9 * (int64_t) f9_38; + int64_t h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38; + int64_t h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38; + int64_t h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19; + int64_t h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38; + int64_t h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38; + int64_t h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38; + int64_t h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19; + int64_t h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; + int64_t h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; + int64_t h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + + h0 += h0; + h1 += h1; + h2 += h2; + h3 += h3; + h4 += h4; + h5 += h5; + h6 += h6; + h7 += h7; + h8 += h8; + h9 += h9; + + carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + + carry1 = (h1 + (int64_t) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry5 = (h5 + (int64_t) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + + carry2 = (h2 + (int64_t) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry6 = (h6 + (int64_t) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + + carry3 = (h3 + (int64_t) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry7 = (h7 + (int64_t) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry8 = (h8 + (int64_t) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + carry9 = (h9 + (int64_t) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + + carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/* From fe_sub.c */ + +/* +h = f - g +Can overlap h with f or g. + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +static void fe_sub(fe h, const fe f, const fe g) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t h0 = f0 - g0; + int32_t h1 = f1 - g1; + int32_t h2 = f2 - g2; + int32_t h3 = f3 - g3; + int32_t h4 = f4 - g4; + int32_t h5 = f5 - g5; + int32_t h6 = f6 - g6; + int32_t h7 = f7 - g7; + int32_t h8 = f8 - g8; + int32_t h9 = f9 - g9; + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + +/* From fe_tobytes.c */ + +/* +Preconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + +Write p=2^255-19; q=floor(h/p). +Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). + +Proof: + Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. + Also have |h-2^230 h9|<2^231 so |19 2^(-255)(h-2^230 h9)|<1/4. + + Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). + Then 0<y<1. + + Write r=h-pq. + Have 0<=r<=p-1=2^255-20. + Thus 0<=r+19(2^-255)r<r+19(2^-255)2^255<=2^255-1. + + Write x=r+19(2^-255)r+y. + Then 0<x<2^255 so floor(2^(-255)x) = 0 so floor(q+2^(-255)x) = q. + + Have q+2^(-255)x = 2^(-255)(h + 19 2^(-25) h9 + 2^(-1)) + so floor(2^(-255)(h + 19 2^(-25) h9 + 2^(-1))) = q. +*/ + +void fe_tobytes(unsigned char *s, const fe h) { + int32_t h0 = h[0]; + int32_t h1 = h[1]; + int32_t h2 = h[2]; + int32_t h3 = h[3]; + int32_t h4 = h[4]; + int32_t h5 = h[5]; + int32_t h6 = h[6]; + int32_t h7 = h[7]; + int32_t h8 = h[8]; + int32_t h9 = h[9]; + int32_t q; + int32_t carry0; + int32_t carry1; + int32_t carry2; + int32_t carry3; + int32_t carry4; + int32_t carry5; + int32_t carry6; + int32_t carry7; + int32_t carry8; + int32_t carry9; + + q = (19 * h9 + (((int32_t) 1) << 24)) >> 25; + q = (h0 + q) >> 26; + q = (h1 + q) >> 25; + q = (h2 + q) >> 26; + q = (h3 + q) >> 25; + q = (h4 + q) >> 26; + q = (h5 + q) >> 25; + q = (h6 + q) >> 26; + q = (h7 + q) >> 25; + q = (h8 + q) >> 26; + q = (h9 + q) >> 25; + + /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */ + h0 += 19 * q; + /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */ + + carry0 = h0 >> 26; h1 += carry0; h0 -= carry0 << 26; + carry1 = h1 >> 25; h2 += carry1; h1 -= carry1 << 25; + carry2 = h2 >> 26; h3 += carry2; h2 -= carry2 << 26; + carry3 = h3 >> 25; h4 += carry3; h3 -= carry3 << 25; + carry4 = h4 >> 26; h5 += carry4; h4 -= carry4 << 26; + carry5 = h5 >> 25; h6 += carry5; h5 -= carry5 << 25; + carry6 = h6 >> 26; h7 += carry6; h6 -= carry6 << 26; + carry7 = h7 >> 25; h8 += carry7; h7 -= carry7 << 25; + carry8 = h8 >> 26; h9 += carry8; h8 -= carry8 << 26; + carry9 = h9 >> 25; h9 -= carry9 << 25; + /* h10 = carry9 */ + + /* + Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. + Have h0+...+2^230 h9 between 0 and 2^255-1; + evidently 2^255 h10-2^255 q = 0. + Goal: Output h0+...+2^230 h9. + */ + + s[0] = h0 >> 0; + s[1] = h0 >> 8; + s[2] = h0 >> 16; + s[3] = (h0 >> 24) | (h1 << 2); + s[4] = h1 >> 6; + s[5] = h1 >> 14; + s[6] = (h1 >> 22) | (h2 << 3); + s[7] = h2 >> 5; + s[8] = h2 >> 13; + s[9] = (h2 >> 21) | (h3 << 5); + s[10] = h3 >> 3; + s[11] = h3 >> 11; + s[12] = (h3 >> 19) | (h4 << 6); + s[13] = h4 >> 2; + s[14] = h4 >> 10; + s[15] = h4 >> 18; + s[16] = h5 >> 0; + s[17] = h5 >> 8; + s[18] = h5 >> 16; + s[19] = (h5 >> 24) | (h6 << 1); + s[20] = h6 >> 7; + s[21] = h6 >> 15; + s[22] = (h6 >> 23) | (h7 << 3); + s[23] = h7 >> 5; + s[24] = h7 >> 13; + s[25] = (h7 >> 21) | (h8 << 4); + s[26] = h8 >> 4; + s[27] = h8 >> 12; + s[28] = (h8 >> 20) | (h9 << 6); + s[29] = h9 >> 2; + s[30] = h9 >> 10; + s[31] = h9 >> 18; +} + +/* From ge_add.c */ + +void ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) { + fe t0; + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->YplusX); + fe_mul(r->Y, r->Y, q->YminusX); + fe_mul(r->T, q->T2d, p->T); + fe_mul(r->X, p->Z, q->Z); + fe_add(t0, r->X, r->X); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_add(r->Z, t0, r->T); + fe_sub(r->T, t0, r->T); +} + +/* From ge_double_scalarmult.c, modified */ + +static void slide(signed char *r, const unsigned char *a) { + int i; + int b; + int k; + + for (i = 0; i < 256; ++i) { + r[i] = 1 & (a[i >> 3] >> (i & 7)); + } + + for (i = 0; i < 256; ++i) { + if (r[i]) { + for (b = 1; b <= 6 && i + b < 256; ++b) { + if (r[i + b]) { + if (r[i] + (r[i + b] << b) <= 15) { + r[i] += r[i + b] << b; r[i + b] = 0; + } else if (r[i] - (r[i + b] << b) >= -15) { + r[i] -= r[i + b] << b; + for (k = i + b; k < 256; ++k) { + if (!r[k]) { + r[k] = 1; + break; + } + r[k] = 0; + } + } else + break; + } + } + } + } +} + +void ge_dsm_precomp(ge_dsmp r, const ge_p3 *s) { + ge_p1p1 t; + ge_p3 s2, u; + ge_p3_to_cached(&r[0], s); + ge_p3_dbl(&t, s); ge_p1p1_to_p3(&s2, &t); + ge_add(&t, &s2, &r[0]); ge_p1p1_to_p3(&u, &t); ge_p3_to_cached(&r[1], &u); + ge_add(&t, &s2, &r[1]); ge_p1p1_to_p3(&u, &t); ge_p3_to_cached(&r[2], &u); + ge_add(&t, &s2, &r[2]); ge_p1p1_to_p3(&u, &t); ge_p3_to_cached(&r[3], &u); + ge_add(&t, &s2, &r[3]); ge_p1p1_to_p3(&u, &t); ge_p3_to_cached(&r[4], &u); + ge_add(&t, &s2, &r[4]); ge_p1p1_to_p3(&u, &t); ge_p3_to_cached(&r[5], &u); + ge_add(&t, &s2, &r[5]); ge_p1p1_to_p3(&u, &t); ge_p3_to_cached(&r[6], &u); + ge_add(&t, &s2, &r[6]); ge_p1p1_to_p3(&u, &t); ge_p3_to_cached(&r[7], &u); +} + +/* +r = a * A + b * B +where a = a[0]+256*a[1]+...+256^31 a[31]. +and b = b[0]+256*b[1]+...+256^31 b[31]. +B is the Ed25519 base point (x,4/5) with x positive. +*/ + +void ge_double_scalarmult_base_vartime(ge_p2 *r, const unsigned char *a, const ge_p3 *A, const unsigned char *b) { + signed char aslide[256]; + signed char bslide[256]; + ge_dsmp Ai; /* A, 3A, 5A, 7A, 9A, 11A, 13A, 15A */ + ge_p1p1 t; + ge_p3 u; + int i; + + slide(aslide, a); + slide(bslide, b); + ge_dsm_precomp(Ai, A); + + ge_p2_0(r); + + for (i = 255; i >= 0; --i) { + if (aslide[i] || bslide[i]) break; + } + + for (; i >= 0; --i) { + ge_p2_dbl(&t, r); + + if (aslide[i] > 0) { + ge_p1p1_to_p3(&u, &t); + ge_add(&t, &u, &Ai[aslide[i]/2]); + } else if (aslide[i] < 0) { + ge_p1p1_to_p3(&u, &t); + ge_sub(&t, &u, &Ai[(-aslide[i])/2]); + } + + if (bslide[i] > 0) { + ge_p1p1_to_p3(&u, &t); + ge_madd(&t, &u, &ge_Bi[bslide[i]/2]); + } else if (bslide[i] < 0) { + ge_p1p1_to_p3(&u, &t); + ge_msub(&t, &u, &ge_Bi[(-bslide[i])/2]); + } + + ge_p1p1_to_p2(r, &t); + } +} + +/* From ge_frombytes.c, modified */ + +int ge_frombytes_vartime(ge_p3 *h, const unsigned char *s) { + fe u; + fe v; + fe vxx; + fe check; + + /* From fe_frombytes.c */ + + int64_t h0 = load_4(s); + int64_t h1 = load_3(s + 4) << 6; + int64_t h2 = load_3(s + 7) << 5; + int64_t h3 = load_3(s + 10) << 3; + int64_t h4 = load_3(s + 13) << 2; + int64_t h5 = load_4(s + 16); + int64_t h6 = load_3(s + 20) << 7; + int64_t h7 = load_3(s + 23) << 5; + int64_t h8 = load_3(s + 26) << 4; + int64_t h9 = (load_3(s + 29) & 8388607) << 2; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + + /* Validate the number to be canonical */ + if (h9 == 33554428 && h8 == 268435440 && h7 == 536870880 && h6 == 2147483520 && + h5 == 4294967295 && h4 == 67108860 && h3 == 134217720 && h2 == 536870880 && + h1 == 1073741760 && h0 >= 4294967277) { + return -1; + } + + carry9 = (h9 + (int64_t) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + carry1 = (h1 + (int64_t) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry3 = (h3 + (int64_t) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry5 = (h5 + (int64_t) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + carry7 = (h7 + (int64_t) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry2 = (h2 + (int64_t) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry6 = (h6 + (int64_t) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + carry8 = (h8 + (int64_t) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + h->Y[0] = h0; + h->Y[1] = h1; + h->Y[2] = h2; + h->Y[3] = h3; + h->Y[4] = h4; + h->Y[5] = h5; + h->Y[6] = h6; + h->Y[7] = h7; + h->Y[8] = h8; + h->Y[9] = h9; + + /* End fe_frombytes.c */ + + fe_1(h->Z); + fe_sq(u, h->Y); + fe_mul(v, u, fe_d); + fe_sub(u, u, h->Z); /* u = y^2-1 */ + fe_add(v, v, h->Z); /* v = dy^2+1 */ + + fe_divpowm1(h->X, u, v); /* x = uv^3(uv^7)^((q-5)/8) */ + + fe_sq(vxx, h->X); + fe_mul(vxx, vxx, v); + fe_sub(check, vxx, u); /* vx^2-u */ + if (fe_isnonzero(check)) { + fe_add(check, vxx, u); /* vx^2+u */ + if (fe_isnonzero(check)) { + return -1; + } + fe_mul(h->X, h->X, fe_sqrtm1); + } + + if (fe_isnegative(h->X) != (s[31] >> 7)) { + /* If x = 0, the sign must be positive */ + if (!fe_isnonzero(h->X)) { + return -1; + } + fe_neg(h->X, h->X); + } + + fe_mul(h->T, h->X, h->Y); + return 0; +} + +/* From ge_madd.c */ + +/* +r = p + q +*/ + +static void ge_madd(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) { + fe t0; + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->yplusx); + fe_mul(r->Y, r->Y, q->yminusx); + fe_mul(r->T, q->xy2d, p->T); + fe_add(t0, p->Z, p->Z); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_add(r->Z, t0, r->T); + fe_sub(r->T, t0, r->T); +} + +/* From ge_msub.c */ + +/* +r = p - q +*/ + +static void ge_msub(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) { + fe t0; + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->yminusx); + fe_mul(r->Y, r->Y, q->yplusx); + fe_mul(r->T, q->xy2d, p->T); + fe_add(t0, p->Z, p->Z); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_sub(r->Z, t0, r->T); + fe_add(r->T, t0, r->T); +} + +/* From ge_p1p1_to_p2.c */ + +/* +r = p +*/ + +void ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p) { + fe_mul(r->X, p->X, p->T); + fe_mul(r->Y, p->Y, p->Z); + fe_mul(r->Z, p->Z, p->T); +} + +/* From ge_p1p1_to_p3.c */ + +/* +r = p +*/ + +void ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p) { + fe_mul(r->X, p->X, p->T); + fe_mul(r->Y, p->Y, p->Z); + fe_mul(r->Z, p->Z, p->T); + fe_mul(r->T, p->X, p->Y); +} + +/* From ge_p2_0.c */ + +static void ge_p2_0(ge_p2 *h) { + fe_0(h->X); + fe_1(h->Y); + fe_1(h->Z); +} + +/* From ge_p2_dbl.c */ + +/* +r = 2 * p +*/ + +void ge_p2_dbl(ge_p1p1 *r, const ge_p2 *p) { + fe t0; + fe_sq(r->X, p->X); + fe_sq(r->Z, p->Y); + fe_sq2(r->T, p->Z); + fe_add(r->Y, p->X, p->Y); + fe_sq(t0, r->Y); + fe_add(r->Y, r->Z, r->X); + fe_sub(r->Z, r->Z, r->X); + fe_sub(r->X, t0, r->Y); + fe_sub(r->T, r->T, r->Z); +} + +/* From ge_p3_0.c */ + +static void ge_p3_0(ge_p3 *h) { + fe_0(h->X); + fe_1(h->Y); + fe_1(h->Z); + fe_0(h->T); +} + +/* From ge_p3_dbl.c */ + +/* +r = 2 * p +*/ + +static void ge_p3_dbl(ge_p1p1 *r, const ge_p3 *p) { + ge_p2 q; + ge_p3_to_p2(&q, p); + ge_p2_dbl(r, &q); +} + +/* From ge_p3_to_cached.c */ + +/* +r = p +*/ + +void ge_p3_to_cached(ge_cached *r, const ge_p3 *p) { + fe_add(r->YplusX, p->Y, p->X); + fe_sub(r->YminusX, p->Y, p->X); + fe_copy(r->Z, p->Z); + fe_mul(r->T2d, p->T, fe_d2); +} + +/* From ge_p3_to_p2.c */ + +/* +r = p +*/ + +void ge_p3_to_p2(ge_p2 *r, const ge_p3 *p) { + fe_copy(r->X, p->X); + fe_copy(r->Y, p->Y); + fe_copy(r->Z, p->Z); +} + +/* From ge_p3_tobytes.c */ + +void ge_p3_tobytes(unsigned char *s, const ge_p3 *h) { + fe recip; + fe x; + fe y; + + fe_invert(recip, h->Z); + fe_mul(x, h->X, recip); + fe_mul(y, h->Y, recip); + fe_tobytes(s, y); + s[31] ^= fe_isnegative(x) << 7; +} + +/* From ge_precomp_0.c */ + +static void ge_precomp_0(ge_precomp *h) { + fe_1(h->yplusx); + fe_1(h->yminusx); + fe_0(h->xy2d); +} + +/* From ge_scalarmult_base.c */ + +static unsigned char equal(signed char b, signed char c) { + unsigned char ub = b; + unsigned char uc = c; + unsigned char x = ub ^ uc; /* 0: yes; 1..255: no */ + uint32_t y = x; /* 0: yes; 1..255: no */ + y -= 1; /* 4294967295: yes; 0..254: no */ + y >>= 31; /* 1: yes; 0: no */ + return y; +} + +static unsigned char negative(signed char b) { + unsigned long long x = b; /* 18446744073709551361..18446744073709551615: yes; 0..255: no */ + x >>= 63; /* 1: yes; 0: no */ + return x; +} + +static void ge_precomp_cmov(ge_precomp *t, const ge_precomp *u, unsigned char b) { + fe_cmov(t->yplusx, u->yplusx, b); + fe_cmov(t->yminusx, u->yminusx, b); + fe_cmov(t->xy2d, u->xy2d, b); +} + +static void select(ge_precomp *t, int pos, signed char b) { + ge_precomp minust; + unsigned char bnegative = negative(b); + unsigned char babs = b - (((-bnegative) & b) << 1); + + ge_precomp_0(t); + ge_precomp_cmov(t, &ge_base[pos][0], equal(babs, 1)); + ge_precomp_cmov(t, &ge_base[pos][1], equal(babs, 2)); + ge_precomp_cmov(t, &ge_base[pos][2], equal(babs, 3)); + ge_precomp_cmov(t, &ge_base[pos][3], equal(babs, 4)); + ge_precomp_cmov(t, &ge_base[pos][4], equal(babs, 5)); + ge_precomp_cmov(t, &ge_base[pos][5], equal(babs, 6)); + ge_precomp_cmov(t, &ge_base[pos][6], equal(babs, 7)); + ge_precomp_cmov(t, &ge_base[pos][7], equal(babs, 8)); + fe_copy(minust.yplusx, t->yminusx); + fe_copy(minust.yminusx, t->yplusx); + fe_neg(minust.xy2d, t->xy2d); + ge_precomp_cmov(t, &minust, bnegative); +} + +/* +h = a * B +where a = a[0]+256*a[1]+...+256^31 a[31] +B is the Ed25519 base point (x,4/5) with x positive. + +Preconditions: + a[31] <= 127 +*/ + +void ge_scalarmult_base(ge_p3 *h, const unsigned char *a) { + signed char e[64]; + signed char carry; + ge_p1p1 r; + ge_p2 s; + ge_precomp t; + int i; + + for (i = 0; i < 32; ++i) { + e[2 * i + 0] = (a[i] >> 0) & 15; + e[2 * i + 1] = (a[i] >> 4) & 15; + } + /* each e[i] is between 0 and 15 */ + /* e[63] is between 0 and 7 */ + + carry = 0; + for (i = 0; i < 63; ++i) { + e[i] += carry; + carry = e[i] + 8; + carry >>= 4; + e[i] -= carry << 4; + } + e[63] += carry; + /* each e[i] is between -8 and 8 */ + + ge_p3_0(h); + for (i = 1; i < 64; i += 2) { + select(&t, i / 2, e[i]); + ge_madd(&r, h, &t); ge_p1p1_to_p3(h, &r); + } + + ge_p3_dbl(&r, h); ge_p1p1_to_p2(&s, &r); + ge_p2_dbl(&r, &s); ge_p1p1_to_p2(&s, &r); + ge_p2_dbl(&r, &s); ge_p1p1_to_p2(&s, &r); + ge_p2_dbl(&r, &s); ge_p1p1_to_p3(h, &r); + + for (i = 0; i < 64; i += 2) { + select(&t, i / 2, e[i]); + ge_madd(&r, h, &t); ge_p1p1_to_p3(h, &r); + } +} + +/* From ge_sub.c */ + +/* +r = p - q +*/ + +void ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) { + fe t0; + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->YminusX); + fe_mul(r->Y, r->Y, q->YplusX); + fe_mul(r->T, q->T2d, p->T); + fe_mul(r->X, p->Z, q->Z); + fe_add(t0, r->X, r->X); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_sub(r->Z, t0, r->T); + fe_add(r->T, t0, r->T); +} + +/* From ge_tobytes.c */ + +void ge_tobytes(unsigned char *s, const ge_p2 *h) { + fe recip; + fe x; + fe y; + + fe_invert(recip, h->Z); + fe_mul(x, h->X, recip); + fe_mul(y, h->Y, recip); + fe_tobytes(s, y); + s[31] ^= fe_isnegative(x) << 7; +} + +/* From sc_reduce.c */ + +/* +Input: + s[0]+256*s[1]+...+256^63*s[63] = s + +Output: + s[0]+256*s[1]+...+256^31*s[31] = s mod l + where l = 2^252 + 27742317777372353535851937790883648493. + Overwrites s in place. +*/ + +void sc_reduce(unsigned char *s) { + int64_t s0 = 2097151 & load_3(s); + int64_t s1 = 2097151 & (load_4(s + 2) >> 5); + int64_t s2 = 2097151 & (load_3(s + 5) >> 2); + int64_t s3 = 2097151 & (load_4(s + 7) >> 7); + int64_t s4 = 2097151 & (load_4(s + 10) >> 4); + int64_t s5 = 2097151 & (load_3(s + 13) >> 1); + int64_t s6 = 2097151 & (load_4(s + 15) >> 6); + int64_t s7 = 2097151 & (load_3(s + 18) >> 3); + int64_t s8 = 2097151 & load_3(s + 21); + int64_t s9 = 2097151 & (load_4(s + 23) >> 5); + int64_t s10 = 2097151 & (load_3(s + 26) >> 2); + int64_t s11 = 2097151 & (load_4(s + 28) >> 7); + int64_t s12 = 2097151 & (load_4(s + 31) >> 4); + int64_t s13 = 2097151 & (load_3(s + 34) >> 1); + int64_t s14 = 2097151 & (load_4(s + 36) >> 6); + int64_t s15 = 2097151 & (load_3(s + 39) >> 3); + int64_t s16 = 2097151 & load_3(s + 42); + int64_t s17 = 2097151 & (load_4(s + 44) >> 5); + int64_t s18 = 2097151 & (load_3(s + 47) >> 2); + int64_t s19 = 2097151 & (load_4(s + 49) >> 7); + int64_t s20 = 2097151 & (load_4(s + 52) >> 4); + int64_t s21 = 2097151 & (load_3(s + 55) >> 1); + int64_t s22 = 2097151 & (load_4(s + 57) >> 6); + int64_t s23 = (load_4(s + 60) >> 3); + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + int64_t carry10; + int64_t carry11; + int64_t carry12; + int64_t carry13; + int64_t carry14; + int64_t carry15; + int64_t carry16; + + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= carry12 << 21; + carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= carry14 << 21; + carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= carry16 << 21; + + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= carry13 << 21; + carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= carry15 << 21; + + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= carry0 << 21; + carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= carry2 << 21; + carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= carry4 << 21; + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + + carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= carry1 << 21; + carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= carry3 << 21; + carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= carry5 << 21; + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + + s[0] = s0 >> 0; + s[1] = s0 >> 8; + s[2] = (s0 >> 16) | (s1 << 5); + s[3] = s1 >> 3; + s[4] = s1 >> 11; + s[5] = (s1 >> 19) | (s2 << 2); + s[6] = s2 >> 6; + s[7] = (s2 >> 14) | (s3 << 7); + s[8] = s3 >> 1; + s[9] = s3 >> 9; + s[10] = (s3 >> 17) | (s4 << 4); + s[11] = s4 >> 4; + s[12] = s4 >> 12; + s[13] = (s4 >> 20) | (s5 << 1); + s[14] = s5 >> 7; + s[15] = (s5 >> 15) | (s6 << 6); + s[16] = s6 >> 2; + s[17] = s6 >> 10; + s[18] = (s6 >> 18) | (s7 << 3); + s[19] = s7 >> 5; + s[20] = s7 >> 13; + s[21] = s8 >> 0; + s[22] = s8 >> 8; + s[23] = (s8 >> 16) | (s9 << 5); + s[24] = s9 >> 3; + s[25] = s9 >> 11; + s[26] = (s9 >> 19) | (s10 << 2); + s[27] = s10 >> 6; + s[28] = (s10 >> 14) | (s11 << 7); + s[29] = s11 >> 1; + s[30] = s11 >> 9; + s[31] = s11 >> 17; +} + +/* New code */ + +static void fe_divpowm1(fe r, const fe u, const fe v) { + fe v3, uv7, t0, t1, t2; + int i; + + fe_sq(v3, v); + fe_mul(v3, v3, v); /* v3 = v^3 */ + fe_sq(uv7, v3); + fe_mul(uv7, uv7, v); + fe_mul(uv7, uv7, u); /* uv7 = uv^7 */ + + /*fe_pow22523(uv7, uv7);*/ + + /* From fe_pow22523.c */ + + fe_sq(t0, uv7); + fe_sq(t1, t0); + fe_sq(t1, t1); + fe_mul(t1, uv7, t1); + fe_mul(t0, t0, t1); + fe_sq(t0, t0); + fe_mul(t0, t1, t0); + fe_sq(t1, t0); + for (i = 0; i < 4; ++i) { + fe_sq(t1, t1); + } + fe_mul(t0, t1, t0); + fe_sq(t1, t0); + for (i = 0; i < 9; ++i) { + fe_sq(t1, t1); + } + fe_mul(t1, t1, t0); + fe_sq(t2, t1); + for (i = 0; i < 19; ++i) { + fe_sq(t2, t2); + } + fe_mul(t1, t2, t1); + for (i = 0; i < 10; ++i) { + fe_sq(t1, t1); + } + fe_mul(t0, t1, t0); + fe_sq(t1, t0); + for (i = 0; i < 49; ++i) { + fe_sq(t1, t1); + } + fe_mul(t1, t1, t0); + fe_sq(t2, t1); + for (i = 0; i < 99; ++i) { + fe_sq(t2, t2); + } + fe_mul(t1, t2, t1); + for (i = 0; i < 50; ++i) { + fe_sq(t1, t1); + } + fe_mul(t0, t1, t0); + fe_sq(t0, t0); + fe_sq(t0, t0); + fe_mul(t0, t0, uv7); + + /* End fe_pow22523.c */ + /* t0 = (uv^7)^((q-5)/8) */ + fe_mul(t0, t0, v3); + fe_mul(r, t0, u); /* u^(m+1)v^(-(m+1)) */ +} + +static void ge_cached_0(ge_cached *r) { + fe_1(r->YplusX); + fe_1(r->YminusX); + fe_1(r->Z); + fe_0(r->T2d); +} + +static void ge_cached_cmov(ge_cached *t, const ge_cached *u, unsigned char b) { + fe_cmov(t->YplusX, u->YplusX, b); + fe_cmov(t->YminusX, u->YminusX, b); + fe_cmov(t->Z, u->Z, b); + fe_cmov(t->T2d, u->T2d, b); +} + +/* Assumes that a[31] <= 127 */ +void ge_scalarmult(ge_p2 *r, const unsigned char *a, const ge_p3 *A) { + signed char e[64]; + int carry, carry2, i; + ge_cached Ai[8]; /* 1 * A, 2 * A, ..., 8 * A */ + ge_p1p1 t; + ge_p3 u; + + carry = 0; /* 0..1 */ + for (i = 0; i < 31; i++) { + carry += a[i]; /* 0..256 */ + carry2 = (carry + 8) >> 4; /* 0..16 */ + e[2 * i] = carry - (carry2 << 4); /* -8..7 */ + carry = (carry2 + 8) >> 4; /* 0..1 */ + e[2 * i + 1] = carry2 - (carry << 4); /* -8..7 */ + } + carry += a[31]; /* 0..128 */ + carry2 = (carry + 8) >> 4; /* 0..8 */ + e[62] = carry - (carry2 << 4); /* -8..7 */ + e[63] = carry2; /* 0..8 */ + + ge_p3_to_cached(&Ai[0], A); + for (i = 0; i < 7; i++) { + ge_add(&t, A, &Ai[i]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[i + 1], &u); + } + + ge_p2_0(r); + for (i = 63; i >= 0; i--) { + signed char b = e[i]; + unsigned char bnegative = negative(b); + unsigned char babs = b - (((-bnegative) & b) << 1); + ge_cached cur, minuscur; + ge_p2_dbl(&t, r); + ge_p1p1_to_p2(r, &t); + ge_p2_dbl(&t, r); + ge_p1p1_to_p2(r, &t); + ge_p2_dbl(&t, r); + ge_p1p1_to_p2(r, &t); + ge_p2_dbl(&t, r); + ge_p1p1_to_p3(&u, &t); + ge_cached_0(&cur); + ge_cached_cmov(&cur, &Ai[0], equal(babs, 1)); + ge_cached_cmov(&cur, &Ai[1], equal(babs, 2)); + ge_cached_cmov(&cur, &Ai[2], equal(babs, 3)); + ge_cached_cmov(&cur, &Ai[3], equal(babs, 4)); + ge_cached_cmov(&cur, &Ai[4], equal(babs, 5)); + ge_cached_cmov(&cur, &Ai[5], equal(babs, 6)); + ge_cached_cmov(&cur, &Ai[6], equal(babs, 7)); + ge_cached_cmov(&cur, &Ai[7], equal(babs, 8)); + fe_copy(minuscur.YplusX, cur.YminusX); + fe_copy(minuscur.YminusX, cur.YplusX); + fe_copy(minuscur.Z, cur.Z); + fe_neg(minuscur.T2d, cur.T2d); + ge_cached_cmov(&cur, &minuscur, bnegative); + ge_add(&t, &u, &cur); + ge_p1p1_to_p2(r, &t); + } +} + +void ge_double_scalarmult_precomp_vartime(ge_p2 *r, const unsigned char *a, const ge_p3 *A, const unsigned char *b, const ge_dsmp Bi) { + signed char aslide[256]; + signed char bslide[256]; + ge_dsmp Ai; /* A, 3A, 5A, 7A, 9A, 11A, 13A, 15A */ + ge_p1p1 t; + ge_p3 u; + int i; + + slide(aslide, a); + slide(bslide, b); + ge_dsm_precomp(Ai, A); + + ge_p2_0(r); + + for (i = 255; i >= 0; --i) { + if (aslide[i] || bslide[i]) break; + } + + for (; i >= 0; --i) { + ge_p2_dbl(&t, r); + + if (aslide[i] > 0) { + ge_p1p1_to_p3(&u, &t); + ge_add(&t, &u, &Ai[aslide[i]/2]); + } else if (aslide[i] < 0) { + ge_p1p1_to_p3(&u, &t); + ge_sub(&t, &u, &Ai[(-aslide[i])/2]); + } + + if (bslide[i] > 0) { + ge_p1p1_to_p3(&u, &t); + ge_add(&t, &u, &Bi[bslide[i]/2]); + } else if (bslide[i] < 0) { + ge_p1p1_to_p3(&u, &t); + ge_sub(&t, &u, &Bi[(-bslide[i])/2]); + } + + ge_p1p1_to_p2(r, &t); + } +} + +void ge_mul8(ge_p1p1 *r, const ge_p2 *t) { + ge_p2 u; + ge_p2_dbl(r, t); + ge_p1p1_to_p2(&u, r); + ge_p2_dbl(r, &u); + ge_p1p1_to_p2(&u, r); + ge_p2_dbl(r, &u); +} + +void ge_fromfe_frombytes_vartime(ge_p2 *r, const unsigned char *s) { + fe u, v, w, x, y, z; + unsigned char sign; + + /* From fe_frombytes.c */ + + int64_t h0 = load_4(s); + int64_t h1 = load_3(s + 4) << 6; + int64_t h2 = load_3(s + 7) << 5; + int64_t h3 = load_3(s + 10) << 3; + int64_t h4 = load_3(s + 13) << 2; + int64_t h5 = load_4(s + 16); + int64_t h6 = load_3(s + 20) << 7; + int64_t h7 = load_3(s + 23) << 5; + int64_t h8 = load_3(s + 26) << 4; + int64_t h9 = load_3(s + 29) << 2; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + + carry9 = (h9 + (int64_t) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + carry1 = (h1 + (int64_t) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry3 = (h3 + (int64_t) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry5 = (h5 + (int64_t) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + carry7 = (h7 + (int64_t) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry2 = (h2 + (int64_t) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry6 = (h6 + (int64_t) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + carry8 = (h8 + (int64_t) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + u[0] = h0; + u[1] = h1; + u[2] = h2; + u[3] = h3; + u[4] = h4; + u[5] = h5; + u[6] = h6; + u[7] = h7; + u[8] = h8; + u[9] = h9; + + /* End fe_frombytes.c */ + + fe_sq2(v, u); /* 2 * u^2 */ + fe_1(w); + fe_add(w, v, w); /* w = 2 * u^2 + 1 */ + fe_sq(x, w); /* w^2 */ + fe_mul(y, fe_ma2, v); /* -2 * A^2 * u^2 */ + fe_add(x, x, y); /* x = w^2 - 2 * A^2 * u^2 */ + fe_divpowm1(r->X, w, x); /* (w / x)^(m + 1) */ + fe_sq(y, r->X); + fe_mul(x, y, x); + fe_sub(y, w, x); + fe_copy(z, fe_ma); + if (fe_isnonzero(y)) { + fe_add(y, w, x); + if (fe_isnonzero(y)) { + goto negative; + } else { + fe_mul(r->X, r->X, fe_fffb1); + } + } else { + fe_mul(r->X, r->X, fe_fffb2); + } + fe_mul(r->X, r->X, u); /* u * sqrt(2 * A * (A + 2) * w / x) */ + fe_mul(z, z, v); /* -2 * A * u^2 */ + sign = 0; + goto setsign; +negative: + fe_mul(x, x, fe_sqrtm1); + fe_sub(y, w, x); + if (fe_isnonzero(y)) { + assert((fe_add(y, w, x), !fe_isnonzero(y))); + fe_mul(r->X, r->X, fe_fffb3); + } else { + fe_mul(r->X, r->X, fe_fffb4); + } + /* r->X = sqrt(A * (A + 2) * w / x) */ + /* z = -A */ + sign = 1; +setsign: + if (fe_isnegative(r->X) != sign) { + assert(fe_isnonzero(r->X)); + fe_neg(r->X, r->X); + } + fe_add(r->Z, z, w); + fe_sub(r->Y, z, w); + fe_mul(r->X, r->X, r->Z); +#if !defined(NDEBUG) + { + fe check_x, check_y, check_iz, check_v; + fe_invert(check_iz, r->Z); + fe_mul(check_x, r->X, check_iz); + fe_mul(check_y, r->Y, check_iz); + fe_sq(check_x, check_x); + fe_sq(check_y, check_y); + fe_mul(check_v, check_x, check_y); + fe_mul(check_v, fe_d, check_v); + fe_add(check_v, check_v, check_x); + fe_sub(check_v, check_v, check_y); + fe_1(check_x); + fe_add(check_v, check_v, check_x); + assert(!fe_isnonzero(check_v)); + } +#endif +} + +void sc_0(unsigned char *s) { + int i; + for (i = 0; i < 32; i++) { + s[i] = 0; + } +} + +void sc_reduce32(unsigned char *s) { + int64_t s0 = 2097151 & load_3(s); + int64_t s1 = 2097151 & (load_4(s + 2) >> 5); + int64_t s2 = 2097151 & (load_3(s + 5) >> 2); + int64_t s3 = 2097151 & (load_4(s + 7) >> 7); + int64_t s4 = 2097151 & (load_4(s + 10) >> 4); + int64_t s5 = 2097151 & (load_3(s + 13) >> 1); + int64_t s6 = 2097151 & (load_4(s + 15) >> 6); + int64_t s7 = 2097151 & (load_3(s + 18) >> 3); + int64_t s8 = 2097151 & load_3(s + 21); + int64_t s9 = 2097151 & (load_4(s + 23) >> 5); + int64_t s10 = 2097151 & (load_3(s + 26) >> 2); + int64_t s11 = (load_4(s + 28) >> 7); + int64_t s12 = 0; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + int64_t carry10; + int64_t carry11; + + carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= carry0 << 21; + carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= carry2 << 21; + carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= carry4 << 21; + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + + carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= carry1 << 21; + carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= carry3 << 21; + carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= carry5 << 21; + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + + s[0] = s0 >> 0; + s[1] = s0 >> 8; + s[2] = (s0 >> 16) | (s1 << 5); + s[3] = s1 >> 3; + s[4] = s1 >> 11; + s[5] = (s1 >> 19) | (s2 << 2); + s[6] = s2 >> 6; + s[7] = (s2 >> 14) | (s3 << 7); + s[8] = s3 >> 1; + s[9] = s3 >> 9; + s[10] = (s3 >> 17) | (s4 << 4); + s[11] = s4 >> 4; + s[12] = s4 >> 12; + s[13] = (s4 >> 20) | (s5 << 1); + s[14] = s5 >> 7; + s[15] = (s5 >> 15) | (s6 << 6); + s[16] = s6 >> 2; + s[17] = s6 >> 10; + s[18] = (s6 >> 18) | (s7 << 3); + s[19] = s7 >> 5; + s[20] = s7 >> 13; + s[21] = s8 >> 0; + s[22] = s8 >> 8; + s[23] = (s8 >> 16) | (s9 << 5); + s[24] = s9 >> 3; + s[25] = s9 >> 11; + s[26] = (s9 >> 19) | (s10 << 2); + s[27] = s10 >> 6; + s[28] = (s10 >> 14) | (s11 << 7); + s[29] = s11 >> 1; + s[30] = s11 >> 9; + s[31] = s11 >> 17; +} + +void sc_add(unsigned char *s, const unsigned char *a, const unsigned char *b) { + int64_t a0 = 2097151 & load_3(a); + int64_t a1 = 2097151 & (load_4(a + 2) >> 5); + int64_t a2 = 2097151 & (load_3(a + 5) >> 2); + int64_t a3 = 2097151 & (load_4(a + 7) >> 7); + int64_t a4 = 2097151 & (load_4(a + 10) >> 4); + int64_t a5 = 2097151 & (load_3(a + 13) >> 1); + int64_t a6 = 2097151 & (load_4(a + 15) >> 6); + int64_t a7 = 2097151 & (load_3(a + 18) >> 3); + int64_t a8 = 2097151 & load_3(a + 21); + int64_t a9 = 2097151 & (load_4(a + 23) >> 5); + int64_t a10 = 2097151 & (load_3(a + 26) >> 2); + int64_t a11 = (load_4(a + 28) >> 7); + int64_t b0 = 2097151 & load_3(b); + int64_t b1 = 2097151 & (load_4(b + 2) >> 5); + int64_t b2 = 2097151 & (load_3(b + 5) >> 2); + int64_t b3 = 2097151 & (load_4(b + 7) >> 7); + int64_t b4 = 2097151 & (load_4(b + 10) >> 4); + int64_t b5 = 2097151 & (load_3(b + 13) >> 1); + int64_t b6 = 2097151 & (load_4(b + 15) >> 6); + int64_t b7 = 2097151 & (load_3(b + 18) >> 3); + int64_t b8 = 2097151 & load_3(b + 21); + int64_t b9 = 2097151 & (load_4(b + 23) >> 5); + int64_t b10 = 2097151 & (load_3(b + 26) >> 2); + int64_t b11 = (load_4(b + 28) >> 7); + int64_t s0 = a0 + b0; + int64_t s1 = a1 + b1; + int64_t s2 = a2 + b2; + int64_t s3 = a3 + b3; + int64_t s4 = a4 + b4; + int64_t s5 = a5 + b5; + int64_t s6 = a6 + b6; + int64_t s7 = a7 + b7; + int64_t s8 = a8 + b8; + int64_t s9 = a9 + b9; + int64_t s10 = a10 + b10; + int64_t s11 = a11 + b11; + int64_t s12 = 0; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + int64_t carry10; + int64_t carry11; + + carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= carry0 << 21; + carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= carry2 << 21; + carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= carry4 << 21; + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + + carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= carry1 << 21; + carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= carry3 << 21; + carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= carry5 << 21; + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + + s[0] = s0 >> 0; + s[1] = s0 >> 8; + s[2] = (s0 >> 16) | (s1 << 5); + s[3] = s1 >> 3; + s[4] = s1 >> 11; + s[5] = (s1 >> 19) | (s2 << 2); + s[6] = s2 >> 6; + s[7] = (s2 >> 14) | (s3 << 7); + s[8] = s3 >> 1; + s[9] = s3 >> 9; + s[10] = (s3 >> 17) | (s4 << 4); + s[11] = s4 >> 4; + s[12] = s4 >> 12; + s[13] = (s4 >> 20) | (s5 << 1); + s[14] = s5 >> 7; + s[15] = (s5 >> 15) | (s6 << 6); + s[16] = s6 >> 2; + s[17] = s6 >> 10; + s[18] = (s6 >> 18) | (s7 << 3); + s[19] = s7 >> 5; + s[20] = s7 >> 13; + s[21] = s8 >> 0; + s[22] = s8 >> 8; + s[23] = (s8 >> 16) | (s9 << 5); + s[24] = s9 >> 3; + s[25] = s9 >> 11; + s[26] = (s9 >> 19) | (s10 << 2); + s[27] = s10 >> 6; + s[28] = (s10 >> 14) | (s11 << 7); + s[29] = s11 >> 1; + s[30] = s11 >> 9; + s[31] = s11 >> 17; +} + +void sc_sub(unsigned char *s, const unsigned char *a, const unsigned char *b) { + int64_t a0 = 2097151 & load_3(a); + int64_t a1 = 2097151 & (load_4(a + 2) >> 5); + int64_t a2 = 2097151 & (load_3(a + 5) >> 2); + int64_t a3 = 2097151 & (load_4(a + 7) >> 7); + int64_t a4 = 2097151 & (load_4(a + 10) >> 4); + int64_t a5 = 2097151 & (load_3(a + 13) >> 1); + int64_t a6 = 2097151 & (load_4(a + 15) >> 6); + int64_t a7 = 2097151 & (load_3(a + 18) >> 3); + int64_t a8 = 2097151 & load_3(a + 21); + int64_t a9 = 2097151 & (load_4(a + 23) >> 5); + int64_t a10 = 2097151 & (load_3(a + 26) >> 2); + int64_t a11 = (load_4(a + 28) >> 7); + int64_t b0 = 2097151 & load_3(b); + int64_t b1 = 2097151 & (load_4(b + 2) >> 5); + int64_t b2 = 2097151 & (load_3(b + 5) >> 2); + int64_t b3 = 2097151 & (load_4(b + 7) >> 7); + int64_t b4 = 2097151 & (load_4(b + 10) >> 4); + int64_t b5 = 2097151 & (load_3(b + 13) >> 1); + int64_t b6 = 2097151 & (load_4(b + 15) >> 6); + int64_t b7 = 2097151 & (load_3(b + 18) >> 3); + int64_t b8 = 2097151 & load_3(b + 21); + int64_t b9 = 2097151 & (load_4(b + 23) >> 5); + int64_t b10 = 2097151 & (load_3(b + 26) >> 2); + int64_t b11 = (load_4(b + 28) >> 7); + int64_t s0 = a0 - b0; + int64_t s1 = a1 - b1; + int64_t s2 = a2 - b2; + int64_t s3 = a3 - b3; + int64_t s4 = a4 - b4; + int64_t s5 = a5 - b5; + int64_t s6 = a6 - b6; + int64_t s7 = a7 - b7; + int64_t s8 = a8 - b8; + int64_t s9 = a9 - b9; + int64_t s10 = a10 - b10; + int64_t s11 = a11 - b11; + int64_t s12 = 0; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + int64_t carry10; + int64_t carry11; + + carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= carry0 << 21; + carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= carry2 << 21; + carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= carry4 << 21; + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + + carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= carry1 << 21; + carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= carry3 << 21; + carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= carry5 << 21; + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + + s[0] = s0 >> 0; + s[1] = s0 >> 8; + s[2] = (s0 >> 16) | (s1 << 5); + s[3] = s1 >> 3; + s[4] = s1 >> 11; + s[5] = (s1 >> 19) | (s2 << 2); + s[6] = s2 >> 6; + s[7] = (s2 >> 14) | (s3 << 7); + s[8] = s3 >> 1; + s[9] = s3 >> 9; + s[10] = (s3 >> 17) | (s4 << 4); + s[11] = s4 >> 4; + s[12] = s4 >> 12; + s[13] = (s4 >> 20) | (s5 << 1); + s[14] = s5 >> 7; + s[15] = (s5 >> 15) | (s6 << 6); + s[16] = s6 >> 2; + s[17] = s6 >> 10; + s[18] = (s6 >> 18) | (s7 << 3); + s[19] = s7 >> 5; + s[20] = s7 >> 13; + s[21] = s8 >> 0; + s[22] = s8 >> 8; + s[23] = (s8 >> 16) | (s9 << 5); + s[24] = s9 >> 3; + s[25] = s9 >> 11; + s[26] = (s9 >> 19) | (s10 << 2); + s[27] = s10 >> 6; + s[28] = (s10 >> 14) | (s11 << 7); + s[29] = s11 >> 1; + s[30] = s11 >> 9; + s[31] = s11 >> 17; +} + +/* +Input: + a[0]+256*a[1]+...+256^31*a[31] = a + b[0]+256*b[1]+...+256^31*b[31] = b + c[0]+256*c[1]+...+256^31*c[31] = c + +Output: + s[0]+256*s[1]+...+256^31*s[31] = (c-ab) mod l + where l = 2^252 + 27742317777372353535851937790883648493. +*/ + +void sc_mulsub(unsigned char *s, const unsigned char *a, const unsigned char *b, const unsigned char *c) { + int64_t a0 = 2097151 & load_3(a); + int64_t a1 = 2097151 & (load_4(a + 2) >> 5); + int64_t a2 = 2097151 & (load_3(a + 5) >> 2); + int64_t a3 = 2097151 & (load_4(a + 7) >> 7); + int64_t a4 = 2097151 & (load_4(a + 10) >> 4); + int64_t a5 = 2097151 & (load_3(a + 13) >> 1); + int64_t a6 = 2097151 & (load_4(a + 15) >> 6); + int64_t a7 = 2097151 & (load_3(a + 18) >> 3); + int64_t a8 = 2097151 & load_3(a + 21); + int64_t a9 = 2097151 & (load_4(a + 23) >> 5); + int64_t a10 = 2097151 & (load_3(a + 26) >> 2); + int64_t a11 = (load_4(a + 28) >> 7); + int64_t b0 = 2097151 & load_3(b); + int64_t b1 = 2097151 & (load_4(b + 2) >> 5); + int64_t b2 = 2097151 & (load_3(b + 5) >> 2); + int64_t b3 = 2097151 & (load_4(b + 7) >> 7); + int64_t b4 = 2097151 & (load_4(b + 10) >> 4); + int64_t b5 = 2097151 & (load_3(b + 13) >> 1); + int64_t b6 = 2097151 & (load_4(b + 15) >> 6); + int64_t b7 = 2097151 & (load_3(b + 18) >> 3); + int64_t b8 = 2097151 & load_3(b + 21); + int64_t b9 = 2097151 & (load_4(b + 23) >> 5); + int64_t b10 = 2097151 & (load_3(b + 26) >> 2); + int64_t b11 = (load_4(b + 28) >> 7); + int64_t c0 = 2097151 & load_3(c); + int64_t c1 = 2097151 & (load_4(c + 2) >> 5); + int64_t c2 = 2097151 & (load_3(c + 5) >> 2); + int64_t c3 = 2097151 & (load_4(c + 7) >> 7); + int64_t c4 = 2097151 & (load_4(c + 10) >> 4); + int64_t c5 = 2097151 & (load_3(c + 13) >> 1); + int64_t c6 = 2097151 & (load_4(c + 15) >> 6); + int64_t c7 = 2097151 & (load_3(c + 18) >> 3); + int64_t c8 = 2097151 & load_3(c + 21); + int64_t c9 = 2097151 & (load_4(c + 23) >> 5); + int64_t c10 = 2097151 & (load_3(c + 26) >> 2); + int64_t c11 = (load_4(c + 28) >> 7); + int64_t s0; + int64_t s1; + int64_t s2; + int64_t s3; + int64_t s4; + int64_t s5; + int64_t s6; + int64_t s7; + int64_t s8; + int64_t s9; + int64_t s10; + int64_t s11; + int64_t s12; + int64_t s13; + int64_t s14; + int64_t s15; + int64_t s16; + int64_t s17; + int64_t s18; + int64_t s19; + int64_t s20; + int64_t s21; + int64_t s22; + int64_t s23; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + int64_t carry10; + int64_t carry11; + int64_t carry12; + int64_t carry13; + int64_t carry14; + int64_t carry15; + int64_t carry16; + int64_t carry17; + int64_t carry18; + int64_t carry19; + int64_t carry20; + int64_t carry21; + int64_t carry22; + + s0 = c0 - a0*b0; + s1 = c1 - (a0*b1 + a1*b0); + s2 = c2 - (a0*b2 + a1*b1 + a2*b0); + s3 = c3 - (a0*b3 + a1*b2 + a2*b1 + a3*b0); + s4 = c4 - (a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0); + s5 = c5 - (a0*b5 + a1*b4 + a2*b3 + a3*b2 + a4*b1 + a5*b0); + s6 = c6 - (a0*b6 + a1*b5 + a2*b4 + a3*b3 + a4*b2 + a5*b1 + a6*b0); + s7 = c7 - (a0*b7 + a1*b6 + a2*b5 + a3*b4 + a4*b3 + a5*b2 + a6*b1 + a7*b0); + s8 = c8 - (a0*b8 + a1*b7 + a2*b6 + a3*b5 + a4*b4 + a5*b3 + a6*b2 + a7*b1 + a8*b0); + s9 = c9 - (a0*b9 + a1*b8 + a2*b7 + a3*b6 + a4*b5 + a5*b4 + a6*b3 + a7*b2 + a8*b1 + a9*b0); + s10 = c10 - (a0*b10 + a1*b9 + a2*b8 + a3*b7 + a4*b6 + a5*b5 + a6*b4 + a7*b3 + a8*b2 + a9*b1 + a10*b0); + s11 = c11 - (a0*b11 + a1*b10 + a2*b9 + a3*b8 + a4*b7 + a5*b6 + a6*b5 + a7*b4 + a8*b3 + a9*b2 + a10*b1 + a11*b0); + s12 = -(a1*b11 + a2*b10 + a3*b9 + a4*b8 + a5*b7 + a6*b6 + a7*b5 + a8*b4 + a9*b3 + a10*b2 + a11*b1); + s13 = -(a2*b11 + a3*b10 + a4*b9 + a5*b8 + a6*b7 + a7*b6 + a8*b5 + a9*b4 + a10*b3 + a11*b2); + s14 = -(a3*b11 + a4*b10 + a5*b9 + a6*b8 + a7*b7 + a8*b6 + a9*b5 + a10*b4 + a11*b3); + s15 = -(a4*b11 + a5*b10 + a6*b9 + a7*b8 + a8*b7 + a9*b6 + a10*b5 + a11*b4); + s16 = -(a5*b11 + a6*b10 + a7*b9 + a8*b8 + a9*b7 + a10*b6 + a11*b5); + s17 = -(a6*b11 + a7*b10 + a8*b9 + a9*b8 + a10*b7 + a11*b6); + s18 = -(a7*b11 + a8*b10 + a9*b9 + a10*b8 + a11*b7); + s19 = -(a8*b11 + a9*b10 + a10*b9 + a11*b8); + s20 = -(a9*b11 + a10*b10 + a11*b9); + s21 = -(a10*b11 + a11*b10); + s22 = -a11*b11; + s23 = 0; + + carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= carry0 << 21; + carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= carry2 << 21; + carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= carry4 << 21; + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= carry12 << 21; + carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= carry14 << 21; + carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= carry16 << 21; + carry18 = (s18 + (1<<20)) >> 21; s19 += carry18; s18 -= carry18 << 21; + carry20 = (s20 + (1<<20)) >> 21; s21 += carry20; s20 -= carry20 << 21; + carry22 = (s22 + (1<<20)) >> 21; s23 += carry22; s22 -= carry22 << 21; + + carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= carry1 << 21; + carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= carry3 << 21; + carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= carry5 << 21; + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= carry13 << 21; + carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= carry15 << 21; + carry17 = (s17 + (1<<20)) >> 21; s18 += carry17; s17 -= carry17 << 21; + carry19 = (s19 + (1<<20)) >> 21; s20 += carry19; s19 -= carry19 << 21; + carry21 = (s21 + (1<<20)) >> 21; s22 += carry21; s21 -= carry21 << 21; + + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= carry12 << 21; + carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= carry14 << 21; + carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= carry16 << 21; + + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= carry13 << 21; + carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= carry15 << 21; + + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= carry0 << 21; + carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= carry2 << 21; + carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= carry4 << 21; + carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21; + carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21; + carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21; + + carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= carry1 << 21; + carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= carry3 << 21; + carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= carry5 << 21; + carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21; + carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21; + carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + + carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21; + carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21; + carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21; + carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21; + carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21; + carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21; + carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21; + carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21; + carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21; + carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21; + carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21; + + s[0] = s0 >> 0; + s[1] = s0 >> 8; + s[2] = (s0 >> 16) | (s1 << 5); + s[3] = s1 >> 3; + s[4] = s1 >> 11; + s[5] = (s1 >> 19) | (s2 << 2); + s[6] = s2 >> 6; + s[7] = (s2 >> 14) | (s3 << 7); + s[8] = s3 >> 1; + s[9] = s3 >> 9; + s[10] = (s3 >> 17) | (s4 << 4); + s[11] = s4 >> 4; + s[12] = s4 >> 12; + s[13] = (s4 >> 20) | (s5 << 1); + s[14] = s5 >> 7; + s[15] = (s5 >> 15) | (s6 << 6); + s[16] = s6 >> 2; + s[17] = s6 >> 10; + s[18] = (s6 >> 18) | (s7 << 3); + s[19] = s7 >> 5; + s[20] = s7 >> 13; + s[21] = s8 >> 0; + s[22] = s8 >> 8; + s[23] = (s8 >> 16) | (s9 << 5); + s[24] = s9 >> 3; + s[25] = s9 >> 11; + s[26] = (s9 >> 19) | (s10 << 2); + s[27] = s10 >> 6; + s[28] = (s10 >> 14) | (s11 << 7); + s[29] = s11 >> 1; + s[30] = s11 >> 9; + s[31] = s11 >> 17; +} + +/* Assumes that a != INT64_MIN */ +static int64_t signum(int64_t a) { + return (a >> 63) - ((-a) >> 63); +} + +int sc_check(const unsigned char *s) { + int64_t s0 = load_4(s); + int64_t s1 = load_4(s + 4); + int64_t s2 = load_4(s + 8); + int64_t s3 = load_4(s + 12); + int64_t s4 = load_4(s + 16); + int64_t s5 = load_4(s + 20); + int64_t s6 = load_4(s + 24); + int64_t s7 = load_4(s + 28); + return (signum(1559614444 - s0) + (signum(1477600026 - s1) << 1) + (signum(2734136534 - s2) << 2) + (signum(350157278 - s3) << 3) + (signum(-s4) << 4) + (signum(-s5) << 5) + (signum(-s6) << 6) + (signum(268435456 - s7) << 7)) >> 8; +} + +int sc_isnonzero(const unsigned char *s) { + return (((int) (s[0] | s[1] | s[2] | s[3] | s[4] | s[5] | s[6] | s[7] | s[8] | + s[9] | s[10] | s[11] | s[12] | s[13] | s[14] | s[15] | s[16] | s[17] | + s[18] | s[19] | s[20] | s[21] | s[22] | s[23] | s[24] | s[25] | s[26] | + s[27] | s[28] | s[29] | s[30] | s[31]) - 1) >> 8) + 1; +} \ No newline at end of file diff --git a/source-code/RuffCT-java/c/crypto-ops.h b/source-code/RuffCT-java/c/crypto-ops.h new file mode 100644 index 0000000..9a802ff --- /dev/null +++ b/source-code/RuffCT-java/c/crypto-ops.h @@ -0,0 +1,153 @@ +// Copyright (c) 2014-2017, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers + +#pragma once + +/* From fe.h */ + +typedef int32_t fe[10]; + +/* From ge.h */ + +typedef struct { + fe X; + fe Y; + fe Z; +} ge_p2; + +typedef struct { + fe X; + fe Y; + fe Z; + fe T; +} ge_p3; + +typedef struct { + fe X; + fe Y; + fe Z; + fe T; +} ge_p1p1; + +typedef struct { + fe yplusx; + fe yminusx; + fe xy2d; +} ge_precomp; + +typedef struct { + fe YplusX; + fe YminusX; + fe Z; + fe T2d; +} ge_cached; + +/* From ge_add.c */ + +void ge_add(ge_p1p1 *, const ge_p3 *, const ge_cached *); + +/* From ge_double_scalarmult.c, modified */ + +typedef ge_cached ge_dsmp[8]; +extern const ge_precomp ge_Bi[8]; +void ge_dsm_precomp(ge_dsmp r, const ge_p3 *s); +void ge_double_scalarmult_base_vartime(ge_p2 *, const unsigned char *, const ge_p3 *, const unsigned char *); + +/* From ge_frombytes.c, modified */ + +extern const fe fe_sqrtm1; +extern const fe fe_d; +int ge_frombytes_vartime(ge_p3 *, const unsigned char *); + +/* From ge_p1p1_to_p2.c */ + +void ge_p1p1_to_p2(ge_p2 *, const ge_p1p1 *); + +/* From ge_p1p1_to_p3.c */ + +void ge_p1p1_to_p3(ge_p3 *, const ge_p1p1 *); + +/* From ge_p2_dbl.c */ + +void ge_p2_dbl(ge_p1p1 *, const ge_p2 *); + +/* From ge_p3_to_cached.c */ + +extern const fe fe_d2; +void ge_p3_to_cached(ge_cached *, const ge_p3 *); + +/* From ge_p3_to_p2.c */ + +void ge_p3_to_p2(ge_p2 *, const ge_p3 *); + +/* From ge_p3_tobytes.c */ + +void ge_p3_tobytes(unsigned char *, const ge_p3 *); + +/* From ge_scalarmult_base.c */ + +extern const ge_precomp ge_base[32][8]; +void ge_scalarmult_base(ge_p3 *, const unsigned char *); + +/* From ge_tobytes.c */ + +void ge_tobytes(unsigned char *, const ge_p2 *); + +/* From sc_reduce.c */ + +void sc_reduce(unsigned char *); + +/* New code */ + +void ge_scalarmult(ge_p2 *, const unsigned char *, const ge_p3 *); +void ge_double_scalarmult_precomp_vartime(ge_p2 *, const unsigned char *, const ge_p3 *, const unsigned char *, const ge_dsmp); +void ge_mul8(ge_p1p1 *, const ge_p2 *); +extern const fe fe_ma2; +extern const fe fe_ma; +extern const fe fe_fffb1; +extern const fe fe_fffb2; +extern const fe fe_fffb3; +extern const fe fe_fffb4; +void ge_fromfe_frombytes_vartime(ge_p2 *, const unsigned char *); +void sc_0(unsigned char *); +void sc_reduce32(unsigned char *); +void sc_add(unsigned char *, const unsigned char *, const unsigned char *); +void sc_sub(unsigned char *, const unsigned char *, const unsigned char *); +void sc_mulsub(unsigned char *, const unsigned char *, const unsigned char *, const unsigned char *); +int sc_check(const unsigned char *); +int sc_isnonzero(const unsigned char *); /* Doesn't normalize */ + +// internal +uint64_t load_3(const unsigned char *in); +uint64_t load_4(const unsigned char *in); +void ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q); +void fe_add(fe h, const fe f, const fe g); +void fe_tobytes(unsigned char *, const fe); +void fe_invert(fe out, const fe z); \ No newline at end of file diff --git a/source-code/RuffCT-java/c/how_monero_hodl_jni_CryptoOpsUtil.c b/source-code/RuffCT-java/c/how_monero_hodl_jni_CryptoOpsUtil.c new file mode 100644 index 0000000..5a93fe9 --- /dev/null +++ b/source-code/RuffCT-java/c/how_monero_hodl_jni_CryptoOpsUtil.c @@ -0,0 +1,87 @@ +#include "how_monero_hodl_jni_CryptoOpsUtil.h" +#include <unistd.h> +#include <stdint.h> +#include "crypto-ops.h" + +JNIEXPORT jbyteArray JNICALL Java_how_monero_hodl_jni_CryptoOpsUtil_scalarMult + (JNIEnv *env, jclass cls, jbyteArray pointBytes, jbyteArray scalarBytes) { + + jbyte* pointBytesBuf = (*env)->GetByteArrayElements(env, pointBytes, NULL); + jbyte* scalarBytesBuf = (*env)->GetByteArrayElements(env, scalarBytes, NULL); + + ge_p3 pointp3; + ge_p2 pointp2; + ge_p2 pointp2result; + + ge_frombytes_vartime(&pointp3, (const unsigned char *) pointBytesBuf); + + ge_p3_to_p2(&pointp2, &pointp3); + + ge_scalarmult(&pointp2result, (const unsigned char *) scalarBytesBuf, &pointp3); + + unsigned char resultBytes[32]; + ge_tobytes(resultBytes, &pointp2result); + + + jbyteArray returnData = (*env)->NewByteArray(env, 32); + (*env)->SetByteArrayRegion(env, returnData, 0, 32, (jbyte *) resultBytes); + + return returnData; + +} + +//void ge_scalarmult_base(ge_p3 *h, const unsigned char *a) { +JNIEXPORT jbyteArray JNICALL Java_how_monero_hodl_jni_CryptoOpsUtil_scalarMultBase + (JNIEnv *env, jclass cls, jbyteArray scalarBytes) { + + jbyte* scalarBytesBuf = (*env)->GetByteArrayElements(env, scalarBytes, NULL); + + ge_p3 pointp3result; + ge_p2 pointp2result; + + ge_scalarmult_base(&pointp3result, (const unsigned char *) scalarBytesBuf); + + ge_p3_to_p2(&pointp2result, &pointp3result); + + unsigned char resultBytes[32]; + ge_tobytes(resultBytes, &pointp2result); + + + jbyteArray returnData = (*env)->NewByteArray(env, 32); + (*env)->SetByteArrayRegion(env, returnData, 0, 32, (jbyte *) resultBytes); + + return returnData; + +} + + + + +//ge_double_scalarmult_base_vartime(ge_p2 *r, const unsigned char *a, const ge_p3 *A, const unsigned char *b) +//r = a * A + b * B +JNIEXPORT jbyteArray JNICALL Java_how_monero_hodl_jni_CryptoOpsUtil_doubleScalarMultBaseVartime + (JNIEnv *env, jclass cls, jbyteArray aScalarBytes, jbyteArray pointBytes, jbyteArray bScalarBytes) { + + jbyte* pointBytesBuf = (*env)->GetByteArrayElements(env, pointBytes, NULL); + jbyte* aScalarBytesBuf = (*env)->GetByteArrayElements(env, aScalarBytes, NULL); + jbyte* bScalarBytesBuf = (*env)->GetByteArrayElements(env, bScalarBytes, NULL); + + ge_p3 pointp3; + ge_p2 pointp2; + ge_p2 pointp2result; + + ge_frombytes_vartime(&pointp3, (const unsigned char *) pointBytesBuf); + + ge_double_scalarmult_base_vartime(&pointp2result, (const unsigned char *) aScalarBytesBuf, &pointp3, (const unsigned char *) bScalarBytesBuf); + + unsigned char resultBytes[32]; + ge_tobytes(resultBytes, &pointp2result); + + + jbyteArray returnData = (*env)->NewByteArray(env, 32); + (*env)->SetByteArrayRegion(env, returnData, 0, 32, (jbyte *) resultBytes); + + return returnData; + +} + diff --git a/source-code/RuffCT-java/c/how_monero_hodl_jni_CryptoOpsUtil.h b/source-code/RuffCT-java/c/how_monero_hodl_jni_CryptoOpsUtil.h new file mode 100644 index 0000000..036a416 --- /dev/null +++ b/source-code/RuffCT-java/c/how_monero_hodl_jni_CryptoOpsUtil.h @@ -0,0 +1,29 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class how_monero_hodl_jni_CryptoOpsUtil */ + +#ifndef _Included_how_monero_hodl_jni_CryptoOpsUtil +#define _Included_how_monero_hodl_jni_CryptoOpsUtil +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: how_monero_hodl_jni_CryptoOpsUtil + * Method: scalarMult + * Signature: ([B[B)[B + */ +JNIEXPORT jbyteArray JNICALL Java_how_monero_hodl_jni_CryptoOpsUtil_scalarMult + (JNIEnv *, jclass, jbyteArray, jbyteArray); + +/* + * Class: how_monero_hodl_jni_CryptoOpsUtil + * Method: doubleScalarMultBaseVartime + * Signature: ([B[B[B)[B + */ +JNIEXPORT jbyteArray JNICALL Java_how_monero_hodl_jni_CryptoOpsUtil_doubleScalarMultBaseVartime + (JNIEnv *, jclass, jbyteArray, jbyteArray, jbyteArray); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/source-code/RuffCT-java/c/warnings.h b/source-code/RuffCT-java/c/warnings.h new file mode 100644 index 0000000..df5c7d1 --- /dev/null +++ b/source-code/RuffCT-java/c/warnings.h @@ -0,0 +1,30 @@ +#pragma once + +#if defined(_MSC_VER) + +#define PUSH_WARNINGS __pragma(warning(push)) +#define POP_WARNINGS __pragma(warning(pop)) +#define DISABLE_VS_WARNINGS(w) __pragma(warning(disable: w)) +#define DISABLE_GCC_WARNING(w) +#define DISABLE_CLANG_WARNING(w) +#define DISABLE_GCC_AND_CLANG_WARNING(w) + +#else + +#include <boost/preprocessor/stringize.hpp> + +#define PUSH_WARNINGS _Pragma("GCC diagnostic push") +#define POP_WARNINGS _Pragma("GCC diagnostic pop") +#define DISABLE_VS_WARNINGS(w) + +#if defined(__clang__) +#define DISABLE_GCC_WARNING(w) +#define DISABLE_CLANG_WARNING DISABLE_GCC_AND_CLANG_WARNING +#else +#define DISABLE_GCC_WARNING DISABLE_GCC_AND_CLANG_WARNING +#define DISABLE_CLANG_WARNING(w) +#endif + +#define DISABLE_GCC_AND_CLANG_WARNING(w) _Pragma(BOOST_PP_STRINGIZE(GCC diagnostic ignored BOOST_PP_STRINGIZE(-W##w))) + +#endif diff --git a/source-code/RuffCT-java/doc/readme.txt b/source-code/RuffCT-java/doc/readme.txt new file mode 100644 index 0000000..bb328ce --- /dev/null +++ b/source-code/RuffCT-java/doc/readme.txt @@ -0,0 +1,19 @@ +Instructions for compiling the Ed25519 native library +----------------------------------------------------- + +Note: You don't need to do any of this if you don't want to. The code will automatically fall back to a pure Java Ed25519 implementation. + + +To compile the JNI C library: + +cd <path to RuffCT-java/c directory> + +# replace <OS> with darwin on OSX, or with linux on Linux. +gcc -fPIC -c how_monero_hodl_jni_CryptoOpsUtil.c crypto-ops.c crypto-ops-data.c -I /<path to jdk>/include/<OS>/ -I /<path to jdk>/include + +gcc -dynamiclib -o libcryptoopsutil.jnilib how_monero_hodl_jni_CryptoOpsUtil.o crypto-ops.o crypto-ops-data.o -framework JavaVM + +When running Java code that uses this JNI library, provide the following command line argument: + +-Djava.library.path=/<path to directory containing libcryptoopsutil.jnilib> + diff --git a/source-code/RuffCT-java/lib/commons-codec-1.10.jar b/source-code/RuffCT-java/lib/commons-codec-1.10.jar new file mode 100644 index 0000000000000000000000000000000000000000..1d7417c4031324cc6577a306cde57ae220f55523 GIT binary patch literal 284184 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�@`CoND>D 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%0AwK_sw$c<OH+4j&x;cX@c=K%1=AURB*7Pw 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 literal 0 HcmV?d00001 diff --git a/source-code/RuffCT-java/lib/commons-pool2-2.4.2.jar b/source-code/RuffCT-java/lib/commons-pool2-2.4.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..fdf8b6faafa2fdbbc8fc6e24595c623232abaec6 GIT binary patch literal 111969 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%0As8V_kq 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 RKp=v@E0`(Xd=M3U;D2!62ipJu literal 0 HcmV?d00001 diff --git a/source-code/RuffCT-java/src/com/joemelsha/crypto/hash/Keccak.java b/source-code/RuffCT-java/src/com/joemelsha/crypto/hash/Keccak.java new file mode 100755 index 0000000..1162750 --- /dev/null +++ b/source-code/RuffCT-java/src/com/joemelsha/crypto/hash/Keccak.java @@ -0,0 +1,449 @@ +package com.joemelsha.crypto.hash; + +import java.nio.*; + +/** + * @author Joseph Robert Melsha (jrmelsha@olivet.edu) + * + * Source: https://github.com/jrmelsha/keccak + * Created: Jun 23, 2016 + * + * Copyright 2016 Joseph Robert Melsha + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +public class Keccak { + private static final int MAX_STATE_SIZE = 1600; + private static final int MAX_STATE_SIZE_WORDS = MAX_STATE_SIZE / 64; + + protected int rateSizeBits, digestSizeBits; + private long[] state = new long[MAX_STATE_SIZE_WORDS]; + private int rateBits; + private boolean padded; + + public Keccak(int digestSizeBits) { + reset(digestSizeBits); + } + + public Keccak(Keccak other) { + System.arraycopy(other.state, 0, state, 0, other.state.length); + rateBits = other.rateBits; + rateSizeBits = other.rateSizeBits; + digestSizeBits = other.digestSizeBits; + padded = other.padded; + } + + @Override + public String toString() { + return "Keccak-" + digestSizeBits; + } + + public int rateSize() { + return rateSizeBits >>> 3; + } + + public int digestSize() { + return digestSizeBits >>> 3; + } + + public void reset() { + reset(rateSizeBits, digestSizeBits); + } + + protected int rateSizeBitsFor(int digestSizeBits) { + //@formatter:off + switch (digestSizeBits) { + case 288: return 1024; + case 128: return 1344; + case 224: return 1152; + case 256: return 1088; + case 384: return 832; + case 512: return 576; + default: throw new IllegalArgumentException("Invalid digestSizeBits: " + digestSizeBits + " ⊄ { 128, 224, 256, 288, 384, 512 }"); + } + //@formatter:on + } + + public void reset(int digestSizeBits) { + reset(rateSizeBitsFor(digestSizeBits), digestSizeBits); + } + + protected void reset(int rateSizebits, int digestSizeBits) { + if (rateSizebits + digestSizeBits * 2 != MAX_STATE_SIZE) + throw new IllegalArgumentException("Invalid rateSizebits + digestSizeBits * 2: " + rateSizebits + " + " + digestSizeBits + " * 2 != " + MAX_STATE_SIZE); + if (rateSizebits <= 0 || (rateSizebits & 0x3f) > 0) + throw new IllegalArgumentException("Invalid rateSizebits: " + rateSizebits); + + for (int i = 0; i < MAX_STATE_SIZE_WORDS; ++i) + state[i] = 0; + rateBits = 0; + + rateSizeBits = rateSizebits; + this.digestSizeBits = digestSizeBits; + padded = false; + } + + public void update(byte in) { + updateBits(in & 0xff, 8); + } + + public void update(byte[] in) { + update(ByteBuffer.wrap(in)); + } + + public void update(byte[] in, int offset, int length) { + update(ByteBuffer.wrap(in, offset, length)); + } + + public void update(ByteBuffer in) { + int inBytes = in.remaining(); + if (inBytes <= 0) + return; + + if (padded) + throw new IllegalStateException("Cannot update while padded"); + + int rateBits = this.rateBits; + if ((rateBits & 0x7) > 0) //this could be implemented but would introduce considerable performance degradation - also, it's never technically possible. + throw new IllegalStateException("Cannot update while in bit-mode"); + + long[] state = this.state; + int rateBytes = rateBits >>> 3; + + int rateBytesWord = rateBytes & 0x7; + if (rateBytesWord > 0) { + //logically must have space at this point + int c = 8 - rateBytesWord; + if (c > inBytes) + c = inBytes; + int i = rateBytes >>> 3; + long w = state[i]; + rateBytes += c; + inBytes -= c; + rateBytesWord <<= 3; + c = rateBytesWord + (c << 3); + do { + w ^= (long) (in.get() & 0xff) << rateBytesWord; + rateBytesWord += 8; + } while (rateBytesWord < c); + state[i] = w; + + if (inBytes > 0) { + this.rateBits = rateBytes << 3; + return; + } + } + + int rateWords = rateBytes >>> 3; + int rateSizeWords = rateSizeBits >>> 6; + + int inWords = inBytes >>> 3; + if (inWords > 0) { + ByteOrder order = in.order(); + try { + in.order(ByteOrder.LITTLE_ENDIAN); + do { + if (rateWords >= rateSizeWords) { + Keccak.keccak(state); + rateWords = 0; + } + int c = rateSizeWords - rateWords; + if (c > inWords) + c = inWords; + inWords -= c; + c += rateWords; + do { + state[rateWords] ^= in.getLong(); + rateWords++; + } while (rateWords < c); + } while (inWords > 0); + } finally { + in.order(order); + } + inBytes &= 0x7; + if (inBytes <= 0) { + this.rateBits = rateWords << 6; + return; + } + } + + if (rateWords >= rateSizeWords) { + Keccak.keccak(state); + rateWords = 0; + } + long w = state[rateWords]; + inBytes <<= 3; + int i = 0; + do { + w ^= (long) (in.get() & 0xff) << i; + i += 8; + } while (i < inBytes); + state[rateWords] = w; + + this.rateBits = (rateWords << 6) | inBytes; + } + + protected void updateBits(long in, int inBits) { + if (inBits < 0 || inBits > 64) + throw new IllegalArgumentException("Invalid valueBits: " + 0 + " < " + inBits + " > " + 64); + + if (inBits <= 0) + return; + + if (padded) + throw new IllegalStateException("Cannot update while padded"); + + long[] state = this.state; + int rateBits = this.rateBits; + int rateBitsWord = rateBits & 0x3f; + if (rateBitsWord > 0) { + //logically must have space at this point + int c = 64 - rateBitsWord; + if (c > inBits) + c = inBits; + state[rateBits >>> 6] ^= (in & (-1L >>> c)) << rateBitsWord; + rateBits += c; + inBits -= c; + if (inBits <= 0) { + this.rateBits = rateBits; + return; + } + in >>>= c; + } + if (rateBits >= rateSizeBits) { + Keccak.keccak(state); + rateBits = 0; + } + state[rateBits >>> 6] ^= in & (-1L >>> inBits); + this.rateBits = rateBits + inBits; + } + + public ByteBuffer digest() { + return digest(digestSize()); + } + + public ByteBuffer digest(int outSize) { + return digest(outSize, false); + } + + public ByteBuffer digest(int outSize, boolean direct) { + ByteBuffer buffer = direct ? ByteBuffer.allocateDirect(outSize) : ByteBuffer.allocate(outSize); + digest(buffer); + buffer.flip(); + return buffer; + } + + public byte[] digestArray() { + return digestArray(digestSize()); + } + + public byte[] digestArray(int outSize) { + byte[] array = new byte[outSize]; + digest(array, 0, outSize); + return array; + } + + public void digest(byte[] out) { + digest(ByteBuffer.wrap(out)); + } + + public void digest(byte[] out, int offset, int length) { + digest(ByteBuffer.wrap(out, offset, length)); + } + + public void digest(ByteBuffer out) { + int outBytes = out.remaining(); + if (outBytes <= 0) + return; + + long[] state = this.state; + int rateBits = this.rateBits; + int rateBytes; + if (!padded) { + pad(); + padded = true; + rateBits = 0; + rateBytes = 0; + } else { + if ((rateBits & 0x7) > 0) + throw new IllegalStateException("Cannot digest while in bit-mode"); //this could be implemented but would introduce considerable performance degradation - also, it's never technically possible. + + rateBytes = rateBits >>> 3; + int rateBytesWord = rateBytes & 0x7; + if (rateBytesWord > 0) { + int c = 8 - rateBytesWord; + if (c > outBytes) + c = outBytes; + long w = state[rateBytes >>> 3]; + outBytes -= c; + rateBytes += c; + rateBytesWord <<= 3; + c = (c << 3) + rateBytesWord; + do { + out.put((byte) (w >>> rateBytesWord)); + rateBytesWord += 8; + } while (rateBytesWord < c); + if (outBytes <= 0) { + this.rateBits = rateBytes << 3; + return; + } + } + } + + int rateSizeWords = rateSizeBits >>> 6; + int rateWords = rateBytes >>> 3; + + int outWords = outBytes >>> 3; + if (outWords > 0) { + ByteOrder order = out.order(); + try { + out.order(ByteOrder.LITTLE_ENDIAN); + do { + if (rateWords >= rateSizeWords) { + squeeze(); + rateWords = 0; + } + int c = rateSizeWords - rateWords; + if (c > outWords) + c = outWords; + outWords -= c; + c += rateWords; + do { + out.putLong(state[rateWords]); + rateWords++; + } while (rateWords < c); + } while (outWords > 0); + } finally { + out.order(order); + } + outBytes &= 0x7; + if (outBytes <= 0) { + this.rateBits = rateWords << 6; + return; + } + } + + if (rateWords >= rateSizeWords) { + squeeze(); + rateWords = 0; + } + long w = state[rateWords]; + outBytes <<= 3; + int i = 0; + do { + out.put((byte) (w >>> i)); + i += 8; + } while (i < outBytes); + this.rateBits = (rateWords << 6) | outBytes; + } + + protected void squeeze() { + Keccak.keccak(state); + } + + protected void pad() { + updateBits(0x1, 1); + if (rateBits >= rateSizeBits) { + Keccak.keccak(state); + rateBits = 0; + } + rateBits = rateSizeBits - 1; + updateBits(0x1, 1); + Keccak.keccak(state); + } + + /** + * @formatter:off + */ + private static void keccak(long[] a) { + //@formatter:off + int c, i; + long x, a_10_; + long x0, x1, x2, x3, x4; + long t0, t1, t2, t3, t4; + long c0, c1, c2, c3, c4; + long[] rc = RC; + + i = 0; + do { + //theta (precalculation part) + c0 = a[0] ^ a[5 + 0] ^ a[10 + 0] ^ a[15 + 0] ^ a[20 + 0]; + c1 = a[1] ^ a[5 + 1] ^ a[10 + 1] ^ a[15 + 1] ^ a[20 + 1]; + c2 = a[2] ^ a[5 + 2] ^ a[10 + 2] ^ a[15 + 2] ^ a[20 + 2]; + c3 = a[3] ^ a[5 + 3] ^ a[10 + 3] ^ a[15 + 3] ^ a[20 + 3]; + c4 = a[4] ^ a[5 + 4] ^ a[10 + 4] ^ a[15 + 4] ^ a[20 + 4]; + + t0 = (c0 << 1) ^ (c0 >>> (64 - 1)) ^ c3; + t1 = (c1 << 1) ^ (c1 >>> (64 - 1)) ^ c4; + t2 = (c2 << 1) ^ (c2 >>> (64 - 1)) ^ c0; + t3 = (c3 << 1) ^ (c3 >>> (64 - 1)) ^ c1; + t4 = (c4 << 1) ^ (c4 >>> (64 - 1)) ^ c2; + + //theta (xorring part) + rho + pi + a[ 0] ^= t1; + x = a[ 1] ^ t2; a_10_ = (x << 1) | (x >>> (64 - 1)); + x = a[ 6] ^ t2; a[ 1] = (x << 44) | (x >>> (64 - 44)); + x = a[ 9] ^ t0; a[ 6] = (x << 20) | (x >>> (64 - 20)); + x = a[22] ^ t3; a[ 9] = (x << 61) | (x >>> (64 - 61)); + + x = a[14] ^ t0; a[22] = (x << 39) | (x >>> (64 - 39)); + x = a[20] ^ t1; a[14] = (x << 18) | (x >>> (64 - 18)); + x = a[ 2] ^ t3; a[20] = (x << 62) | (x >>> (64 - 62)); + x = a[12] ^ t3; a[ 2] = (x << 43) | (x >>> (64 - 43)); + x = a[13] ^ t4; a[12] = (x << 25) | (x >>> (64 - 25)); + + x = a[19] ^ t0; a[13] = (x << 8) | (x >>> (64 - 8)); + x = a[23] ^ t4; a[19] = (x << 56) | (x >>> (64 - 56)); + x = a[15] ^ t1; a[23] = (x << 41) | (x >>> (64 - 41)); + x = a[ 4] ^ t0; a[15] = (x << 27) | (x >>> (64 - 27)); + x = a[24] ^ t0; a[ 4] = (x << 14) | (x >>> (64 - 14)); + + x = a[21] ^ t2; a[24] = (x << 2) | (x >>> (64 - 2)); + x = a[ 8] ^ t4; a[21] = (x << 55) | (x >>> (64 - 55)); + x = a[16] ^ t2; a[ 8] = (x << 45) | (x >>> (64 - 45)); + x = a[ 5] ^ t1; a[16] = (x << 36) | (x >>> (64 - 36)); + x = a[ 3] ^ t4; a[ 5] = (x << 28) | (x >>> (64 - 28)); + + x = a[18] ^ t4; a[ 3] = (x << 21) | (x >>> (64 - 21)); + x = a[17] ^ t3; a[18] = (x << 15) | (x >>> (64 - 15)); + x = a[11] ^ t2; a[17] = (x << 10) | (x >>> (64 - 10)); + x = a[ 7] ^ t3; a[11] = (x << 6) | (x >>> (64 - 6)); + x = a[10] ^ t1; a[ 7] = (x << 3) | (x >>> (64 - 3)); + a[10] = a_10_; + + //chi + c = 0; + do { + x0 = a[c + 0]; x1 = a[c + 1]; x2 = a[c + 2]; x3 = a[c + 3]; x4 = a[c + 4]; + a[c + 0] = x0 ^ ((~x1) & x2); + a[c + 1] = x1 ^ ((~x2) & x3); + a[c + 2] = x2 ^ ((~x3) & x4); + a[c + 3] = x3 ^ ((~x4) & x0); + a[c + 4] = x4 ^ ((~x0) & x1); + + c += 5; + } while (c < 25); + + //iota + a[0] ^= rc[i]; + + i++; + } while (i < 24); + //@formatter:on + } + + private static final long[] RC = { 0x0000000000000001L, 0x0000000000008082L, 0x800000000000808AL, 0x8000000080008000L, 0x000000000000808BL, 0x0000000080000001L, 0x8000000080008081L, + 0x8000000000008009L, 0x000000000000008AL, 0x0000000000000088L, 0x0000000080008009L, 0x000000008000000AL, 0x000000008000808BL, 0x800000000000008BL, + 0x8000000000008089L, 0x8000000000008003L, 0x8000000000008002L, 0x8000000000000080L, 0x000000000000800AL, 0x800000008000000AL, 0x8000000080008081L, + 0x8000000000008080L, 0x0000000080000001L, 0x8000000080008008L }; +} \ No newline at end of file diff --git a/source-code/RuffCT-java/src/how/monero/hodl/crypto/CryptoUtil.java b/source-code/RuffCT-java/src/how/monero/hodl/crypto/CryptoUtil.java new file mode 100644 index 0000000..266eb04 --- /dev/null +++ b/source-code/RuffCT-java/src/how/monero/hodl/crypto/CryptoUtil.java @@ -0,0 +1,155 @@ +package how.monero.hodl.crypto; + +import com.joemelsha.crypto.hash.Keccak; +import how.monero.hodl.util.ExceptionAdapter; +import org.apache.commons.pool2.BasePooledObjectFactory; +import org.apache.commons.pool2.PooledObject; +import org.apache.commons.pool2.impl.DefaultPooledObject; +import org.apache.commons.pool2.impl.GenericObjectPool; +import org.nem.core.crypto.ed25519.arithmetic.*; + +import java.math.BigInteger; +import java.security.SecureRandom; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import static how.monero.hodl.crypto.HashToPoint.hashToPoint; +import static how.monero.hodl.util.ByteUtil.*; + +public class CryptoUtil { + + public static GenericObjectPool<Keccak> keccakPool = new GenericObjectPool<Keccak>(new BasePooledObjectFactory<Keccak>() { + + @Override + public PooledObject<Keccak> wrap(Keccak keccak) { + return new DefaultPooledObject<>(keccak); + } + + @Override + public Keccak create() throws Exception { + return new Keccak(256); + } + }); + + public static final Ed25519GroupElement G = Ed25519Group.BASE_POINT; + public static final Ed25519GroupElement H = new Ed25519EncodedGroupElement(hexToBytes("8b655970153799af2aeadc9ff1add0ea6c7251d54154cfa92c173a0dd39c1f94")).decode(); + static { + H.precomputeForScalarMultiplication(); + } + + public static Scalar hashToScalar(byte[] a) { + return new Scalar(scReduce32(fastHash(a))); + } + + public static byte[] fastHash(byte[] a) { + try { + Keccak keccak = keccakPool.borrowObject(); + try { + keccak.reset(); + keccak.update(a); + return keccak.digestArray(); + } finally { + keccakPool.returnObject(keccak); + } + } catch (Exception e) { + throw ExceptionAdapter.toRuntimeException(e); + } + } + + public static BigInteger l = BigInteger.valueOf(2).pow(252).add(new BigInteger("27742317777372353535851937790883648493")); + + public static byte[] scReduce32(byte[] a) { + byte[] r = getBigIntegerFromUnsignedLittleEndianByteArray(a).mod(l).toByteArray(); + return ensure32BytesAndConvertToLittleEndian(r); + } + + public static byte[] ensure32BytesAndConvertToLittleEndian(byte[] r) { + byte[] s = new byte[32]; + if(r.length>32) System.arraycopy(r, 1, s, 0, s.length); + else System.arraycopy(r, 0, s, 32 - r.length, r.length); + reverseByteArrayInPlace(s); + return s; + } + + public static BigInteger getBigIntegerFromUnsignedLittleEndianByteArray(byte[] a1) { + byte[] a = new byte[a1.length]; + System.arraycopy(a1, 0, a, 0, 32); + reverseByteArrayInPlace(a); + byte[] a2 = new byte[33]; + System.arraycopy(a, 0, a2, 1, 32); + return new BigInteger(a2); + } + public static byte[] getUnsignedLittleEndianByteArrayFromBigInteger(BigInteger n) { + byte[] a = n.toByteArray(); + byte[] a2 = new byte[32]; + System.arraycopy(a, 0, a2, 32-a.length, a.length); + reverseByteArrayInPlace(a2); + return a2; + } + + public static final Random random = new SecureRandom(); + public static byte[] randomPointAsBytes() { + return randomPoint().encode().getRaw(); + } + public static Ed25519GroupElement randomPoint() { + return Ed25519Group.BASE_POINT.scalarMultiply(Scalar.randomScalar()); + } + public static byte[] randomMessage(int len) { + byte[] m = new byte[len]; + random.nextBytes(m); + return m; + } + + public static byte[] toBytes(Ed25519GroupElement[] a) { + byte[] r = new byte[0]; + for(Ed25519GroupElement ai : a) r = concat(r, ai.encode().getRaw()); + return r; + } + + public static Scalar sumArray(Scalar[] a) { + Scalar r = Scalar.ZERO; + for(Scalar ai : a) r = r.add(ai); + return r; + } + + + + public static PointPair COMeg(Scalar xAmount, Scalar rMask) { + return new PointPair(G.scalarMultiply(xAmount).add(getHpnGLookup(1).scalarMultiply(rMask).toCached()), G.scalarMultiply(rMask)); + } + + public static Ed25519GroupElement COMp(Scalar xAmount, Scalar rMask) { + return G.scalarMultiply(xAmount).add(getHpnGLookup(1).scalarMultiply(rMask).toCached()); + } + + public static Ed25519GroupElement COMb(Scalar[][] x, Scalar r) { + int m = x.length; + int n = x[0].length; + Ed25519GroupElement A = G.scalarMultiply(r); + for(int j=0; j<m; j++) { + for(int i=0; i<n; i++) { + A = A.toP3().add(getHpnGLookup(j * n + i + 1).scalarMultiply(x[j][i]).toCached()); + } + } + return A; + } + + + public static Map<Integer, Ed25519GroupElement> HpnGLookup = new HashMap<>(); + + public static Ed25519GroupElement getHpnGLookup(int n) { + if(!HpnGLookup.containsKey(n)) { + Ed25519GroupElement HpnG = hashToPoint(G.scalarMultiply(Scalar.intToScalar(n))); + //HpnG.precomputeForScalarMultiplication(); // try precomputed vs non-precomputed to check best performance + HpnGLookup.put(n, HpnG); + } + return HpnGLookup.get(n); + } + + public static PointPair ENCeg(Ed25519GroupElement X, Scalar r) { + return new PointPair(getHpnGLookup(1).scalarMultiply(r).toP3().add(X.toCached()), G.scalarMultiply(r)); + } + + +} diff --git a/source-code/RuffCT-java/src/how/monero/hodl/crypto/HashToPoint.java b/source-code/RuffCT-java/src/how/monero/hodl/crypto/HashToPoint.java new file mode 100644 index 0000000..2a463e6 --- /dev/null +++ b/source-code/RuffCT-java/src/how/monero/hodl/crypto/HashToPoint.java @@ -0,0 +1,136 @@ +package how.monero.hodl.crypto; + +import org.nem.core.crypto.ed25519.arithmetic.Ed25519EncodedGroupElement; +import org.nem.core.crypto.ed25519.arithmetic.Ed25519GroupElement; +import org.nem.core.utils.ArrayUtils; + +import java.math.BigInteger; + +import static how.monero.hodl.crypto.CryptoUtil.*; +import static how.monero.hodl.util.ByteUtil.*; + +public class HashToPoint { + + private static BigInteger b = BigInteger.valueOf(256); + private static BigInteger q = BigInteger.valueOf(2).pow(255).subtract(BigInteger.valueOf(19)); + private static BigInteger p = q; + private static BigInteger l = BigInteger.valueOf(2).pow(252).add(new BigInteger("27742317777372353535851937790883648493")); + private static BigInteger I = expmod(BigInteger.valueOf(2), (q.subtract(BigInteger.ONE)).divide(BigInteger.valueOf(4)), q); + + + public static Ed25519GroupElement hashToPoint(Ed25519GroupElement a) { + return hashToPoint(a.encode().getRaw()); + } + + public static Ed25519GroupElement hashToPoint(byte[] a) { + + byte[] hash = fastHash(a); + + BigInteger u = ArrayUtils.toBigInteger(hash).mod(q); + + BigInteger A = BigInteger.valueOf(486662); + + BigInteger sqrtm1 = ed25519Sqroot(BigInteger.valueOf(-1)); + + BigInteger w = (BigInteger.valueOf(2).multiply(u).multiply(u).add(BigInteger.ONE)).mod(q); + BigInteger xp = w.multiply(w).subtract(BigInteger.valueOf(2).multiply(A).multiply(A).multiply(u).multiply(u)).mod(q); + + BigInteger b = w.multiply(ed25519Inv(xp)); + BigInteger e = (q.add(BigInteger.valueOf(3)).divide(BigInteger.valueOf(8))); + BigInteger rx = expmod(b, e, q); + + BigInteger x = rx.multiply(rx).multiply(w.multiply(w).subtract(BigInteger.valueOf(2).multiply(A).multiply(A).multiply(u).multiply(u))).mod(q); + + BigInteger y = (BigInteger.valueOf(2).multiply(u).multiply(u).add(BigInteger.ONE).subtract(x)).mod(q); + + BigInteger z; + + boolean negative = false; + if (!y.equals(BigInteger.ZERO)) { + y = (w.add(x)).mod(q); + if (!y.equals(BigInteger.ZERO)) { + negative = true; + } else { + rx = rx.multiply(BigInteger.valueOf(-1)).multiply(ed25519Sqroot(BigInteger.valueOf(-2).multiply(A).multiply((A.add(BigInteger.valueOf(2)))))).mod(q); + negative = false; + } + } else { + rx = rx.multiply(BigInteger.valueOf(-1)).multiply(ed25519Sqroot(BigInteger.valueOf(2).multiply(A).multiply((A.add(BigInteger.valueOf(2)))))).mod(q); + } + + BigInteger sign; + if (!negative) { + rx = (rx.multiply(u)).mod(q); + z = (BigInteger.valueOf(-2).multiply(A).multiply(u).multiply(u)).mod(q); + sign = BigInteger.ZERO; + } else { + z = BigInteger.valueOf(-1).multiply(A); + x = x.multiply(sqrtm1).mod(q); + y = (w.subtract(x)).mod(q); + if (!y.equals(BigInteger.ZERO)) { + rx = rx.multiply(ed25519Sqroot(BigInteger.valueOf(-1).multiply(sqrtm1).multiply(A).multiply((A.add(BigInteger.valueOf(2)))))).mod(q); + } else { + rx = rx.multiply(BigInteger.valueOf(-1)).multiply(ed25519Sqroot(sqrtm1.multiply(A).multiply((A.add(BigInteger.valueOf(2)))))).mod(q); + } + sign = BigInteger.ONE; + } + if(!(rx.mod(BigInteger.valueOf(2)).equals(sign))) { + rx = rx.mod(q).negate(); + } + BigInteger rz = (z.add(w)).mod(q); + BigInteger ry = (z.subtract(w)).mod(q); + rx = (rx.multiply(rz)).mod(q); + + Ed25519GroupElement P = pointCompress(rx, ry, rz); + Ed25519GroupElement P8 = P.toP2().dbl().toP2().dbl().toP2().dbl().toP3(); + return P8; + + } + + private static Ed25519GroupElement pointCompress(BigInteger P0, BigInteger P1, BigInteger P2) { + BigInteger zinv = modpInv(P2); + BigInteger x = P0.multiply(zinv).mod(p); + BigInteger y = P1.multiply(zinv).mod(p); + + BigInteger r = y.or((x.and(BigInteger.ONE)).shiftLeft(255)); + + byte[] a = r.toByteArray(); + + byte[] b = new byte[32]; + + if(a.length>32) System.arraycopy(a, a.length-32, b, 0, 32); + else if(a.length<32) System.arraycopy(a, 0, b, 32-a.length, a.length); + else System.arraycopy(a, 0, b, 0, 32); + + reverseByteArrayInPlace(b); + return new Ed25519EncodedGroupElement(b).decode(); + } + + private static BigInteger modpInv(BigInteger x) { + return x.modPow(p.subtract(BigInteger.valueOf(2)), p); + } + + private static BigInteger ed25519Inv(BigInteger x) { + return expmod(x, q.subtract(BigInteger.valueOf(2)), q); + } + + private static BigInteger ed25519Sqroot(BigInteger xx) { + BigInteger x = expmod(xx, q.add(BigInteger.valueOf(3)).divide(BigInteger.valueOf(8)), q); + if (!x.multiply(x).subtract(xx).mod(q).equals(BigInteger.ZERO)) { + x = x.multiply(I).mod(q); + } + if (!x.multiply(x).subtract(xx).mod(q).equals(BigInteger.ZERO)) { + throw new RuntimeException("no square root!"); + } + return x; + } + + private static BigInteger expmod(BigInteger b, BigInteger e, BigInteger m) { + if (e.equals(BigInteger.ZERO)) return BigInteger.ONE; + BigInteger t = expmod(b, e.divide(BigInteger.valueOf(2)), m).pow(2).mod(m); + if(e.and(BigInteger.ONE).equals(BigInteger.ONE)) t = (t.multiply(b)).mod(m); + return t; + } + + +} diff --git a/source-code/RuffCT-java/src/how/monero/hodl/crypto/PointPair.java b/source-code/RuffCT-java/src/how/monero/hodl/crypto/PointPair.java new file mode 100644 index 0000000..eda3388 --- /dev/null +++ b/source-code/RuffCT-java/src/how/monero/hodl/crypto/PointPair.java @@ -0,0 +1,37 @@ +package how.monero.hodl.crypto; + +import org.nem.core.crypto.ed25519.arithmetic.Ed25519GroupElement; + +import static how.monero.hodl.util.ByteUtil.*; + +public class PointPair { + public Ed25519GroupElement P1; + public Ed25519GroupElement P2; + public PointPair(Ed25519GroupElement P1, Ed25519GroupElement P2) { + this.P1 = P1; + this.P2 = P2; + } + public byte[] toBytes() { + return concat(P1.encode().getRaw(), P2.encode().getRaw()); + } + public PointPair add(PointPair a) { + return new PointPair(P1.toP3().add(a.P1.toP3().toCached()), P2.toP3().add(a.P2.toP3().toCached())); + } + public PointPair subtract(PointPair a) { + return new PointPair(P1.toP3().subtract(a.P1.toCached()), P2.toP3().subtract(a.P2.toCached())); + } + public PointPair multiply(Scalar n) { + return new PointPair(P1.toP3().scalarMultiply(n), P2.toP3().scalarMultiply(n)); + } + + public boolean equals(PointPair obj) { + return P1.toP3().equals(obj.P1.toP3()) && P2.toP3().equals(obj.P2.toP3()); + } + + @Override + public String toString() { + return "(P1: " + bytesToHex(P1.encode().getRaw()) + ", P2: " + P2 + ")"; + } + +} + diff --git a/source-code/RuffCT-java/src/how/monero/hodl/crypto/Scalar.java b/source-code/RuffCT-java/src/how/monero/hodl/crypto/Scalar.java new file mode 100644 index 0000000..0f23602 --- /dev/null +++ b/source-code/RuffCT-java/src/how/monero/hodl/crypto/Scalar.java @@ -0,0 +1,100 @@ +package how.monero.hodl.crypto; + +import how.monero.hodl.util.ByteUtil; +import org.nem.core.crypto.ed25519.arithmetic.Ed25519EncodedFieldElement; +import org.nem.core.crypto.ed25519.arithmetic.Ed25519FieldElement; + +import java.math.BigInteger; +import java.util.Arrays; + +import static how.monero.hodl.crypto.CryptoUtil.*; +import static how.monero.hodl.util.ByteUtil.*; + +public class Scalar { + + public final static Scalar ZERO = intToScalar(0); + public final static Scalar ONE = intToScalar(1); + public final static Scalar TWO = intToScalar(2); + public final static Scalar MINUS_ONE = intToScalar(-1); + + // use only for small numbers + public static Scalar intToScalar(int a) { + return new Scalar(scReduce32(getUnsignedLittleEndianByteArrayFromBigInteger(BigInteger.valueOf(a).mod(l)))); + } + + public byte[] bytes; + public Scalar(byte[] bytes) { + this.bytes = bytes; + } + public Scalar(String hex) { + this.bytes = ByteUtil.hexToBytes(hex); + } + public Scalar(BigInteger a) { + this(scReduce32(getUnsignedLittleEndianByteArrayFromBigInteger(a.mod(l)))); + } + public Ed25519EncodedFieldElement toEd25519EncodedFieldElement() { + return new Ed25519EncodedFieldElement(bytes); + } + public Ed25519FieldElement toEd25519FieldElement() { + return new Ed25519EncodedFieldElement(bytes).decode(); + } + + public static Scalar randomScalar() { + byte[] s = new byte[32]; + random.nextBytes(s); + s = CryptoUtil.scReduce32(s); + return new Scalar(s); + } + + @Override + public String toString() { + return bytesToHex(bytes); + } + + public BigInteger toBigInteger() { + return getBigIntegerFromUnsignedLittleEndianByteArray(this.bytes); + } + + @Override + public boolean equals(Object obj) { + return Arrays.equals(this.bytes, ((Scalar)obj).bytes); + } + + public static BigInteger[] scalarArrayToBigIntegerArray(Scalar[] a) { + BigInteger[] r = new BigInteger[a.length]; + for(int i=0; i<a.length; i++) r[i] = a[i].toBigInteger(); + return r; + } + + public static void printScalarArray(Scalar[] a) { + for(int i=0; i<a.length; i++) { + System.out.print(a[i].toBigInteger()+""); + if(i==a.length-1) System.out.println(""); + else System.out.print(", "); + } + } + + public static Scalar[] bigIntegerArrayToScalarArray(BigInteger[] a) { + int len = a.length; + Scalar[] r = new Scalar[len]; + for(int i=0; i<len; i++) { + r[i] = new Scalar(a[i]); + } + return r; + } + + public Scalar add(Scalar a) { return new Scalar(ensure32BytesAndConvertToLittleEndian(getBigIntegerFromUnsignedLittleEndianByteArray(this.bytes).add(getBigIntegerFromUnsignedLittleEndianByteArray(a.bytes)).mod(l).toByteArray())); } + public Scalar sub(Scalar a) { return new Scalar(ensure32BytesAndConvertToLittleEndian(getBigIntegerFromUnsignedLittleEndianByteArray(this.bytes).subtract(getBigIntegerFromUnsignedLittleEndianByteArray(a.bytes)).mod(l).toByteArray())); } + public Scalar mul(Scalar a) { return new Scalar(ensure32BytesAndConvertToLittleEndian(getBigIntegerFromUnsignedLittleEndianByteArray(this.bytes).multiply(getBigIntegerFromUnsignedLittleEndianByteArray(a.bytes)).mod(l).toByteArray())); } + public Scalar sq() { return new Scalar(ensure32BytesAndConvertToLittleEndian(getBigIntegerFromUnsignedLittleEndianByteArray(this.bytes).multiply(getBigIntegerFromUnsignedLittleEndianByteArray(this.bytes)).mod(l).toByteArray())); } + + public Scalar pow(int b) { + Scalar result = Scalar.ONE; + for(int i=0; i<b; i++) { + result = result.mul(this); + } + return result; + } + + +} diff --git a/source-code/RuffCT-java/src/how/monero/hodl/crypto/ScalarPair.java b/source-code/RuffCT-java/src/how/monero/hodl/crypto/ScalarPair.java new file mode 100644 index 0000000..70dccca --- /dev/null +++ b/source-code/RuffCT-java/src/how/monero/hodl/crypto/ScalarPair.java @@ -0,0 +1,12 @@ +package how.monero.hodl.crypto; + +import org.nem.core.crypto.ed25519.arithmetic.Ed25519FieldElement; + +public class ScalarPair { + Ed25519FieldElement p1; + Ed25519FieldElement p2; + public ScalarPair(Ed25519FieldElement p1, Ed25519FieldElement p2) { + this.p1 = p1; + this.p2 = p2; + } + } diff --git a/source-code/RuffCT-java/src/how/monero/hodl/cursor/BootleRuffingCursor.java b/source-code/RuffCT-java/src/how/monero/hodl/cursor/BootleRuffingCursor.java new file mode 100644 index 0000000..9c932c9 --- /dev/null +++ b/source-code/RuffCT-java/src/how/monero/hodl/cursor/BootleRuffingCursor.java @@ -0,0 +1,38 @@ +package how.monero.hodl.cursor; + +import how.monero.hodl.crypto.PointPair; +import how.monero.hodl.crypto.Scalar; +import org.nem.core.crypto.ed25519.arithmetic.Ed25519EncodedFieldElement; +import org.nem.core.crypto.ed25519.arithmetic.Ed25519EncodedGroupElement; +import org.nem.core.crypto.ed25519.arithmetic.Ed25519FieldElement; +import org.nem.core.crypto.ed25519.arithmetic.Ed25519GroupElement; + +public class BootleRuffingCursor extends Cursor { + public byte[] data; + + public BootleRuffingCursor(byte[] data) { + super(data); + } + + public Ed25519GroupElement readGroupElement() { + return new Ed25519EncodedGroupElement(readBytes(32)).decode(); + } + public Ed25519FieldElement readFieldElement() { + return new Ed25519EncodedFieldElement(readBytes(32)).decode(); + } + public PointPair[] readPointPairArray(int len) { + PointPair[] result = new PointPair[len]; + for(int i=0; i<len; i++) result[i] = new PointPair(readGroupElement(), readGroupElement()); + return result; + } + public Scalar[][] readScalar2DArray(int m, int n) { + Scalar[][] result = new Scalar[m][n]; + for(int j=0; j<m; j++) { + for(int i=0; i<n; i++) { + result[j][i] = readScalar(); + } + } + return result; + } + +} diff --git a/source-code/RuffCT-java/src/how/monero/hodl/cursor/Cursor.java b/source-code/RuffCT-java/src/how/monero/hodl/cursor/Cursor.java new file mode 100644 index 0000000..2f63e3b --- /dev/null +++ b/source-code/RuffCT-java/src/how/monero/hodl/cursor/Cursor.java @@ -0,0 +1,75 @@ +package how.monero.hodl.cursor; + +import how.monero.hodl.crypto.Scalar; + +import java.math.BigInteger; + +public class Cursor { + + public int pos = 0; + protected byte[] data; + public Cursor(byte[] data) { + this.data = data; + } + + public long readVarInt() { + + long result = 0; + int c = 0; + + while(true) { + boolean isLastByteInVarInt = true; + int i = Byte.toUnsignedInt(data[pos]); + if(i>=128) { + isLastByteInVarInt = false; + i-=128; + } + result += Math.round(i * Math.pow(128, c)); + c++; + pos++; + if(isLastByteInVarInt) break; + } + return result; + } + public BigInteger readVarIntAsBigInteger() { + + BigInteger result = BigInteger.ZERO; + int c = 0; + + while(true) { + boolean isLastByteInVarInt = true; + int i = Byte.toUnsignedInt(data[pos]); + if(i>=128) { + isLastByteInVarInt = false; + i-=128; + } + result = result.add(BigInteger.valueOf(Math.round(i * Math.pow(128, c)))); + c++; + pos++; + if(isLastByteInVarInt) break; + } + return result; + } + + public byte[] readBytes(int len) { + byte[] bytes = new byte[len]; + System.arraycopy(data, pos, bytes, 0, len); + pos+=len; + return bytes; + } + public Scalar readScalar() { + return new Scalar(readBytes(32)); + } + + + public int readByte() { + pos++; + return Byte.toUnsignedInt(data[pos-1]); + } + + public byte[] readKey() { + return readBytes(32); + } + + +} diff --git a/source-code/RuffCT-java/src/how/monero/hodl/jni/CryptoOpsUtil.java b/source-code/RuffCT-java/src/how/monero/hodl/jni/CryptoOpsUtil.java new file mode 100644 index 0000000..7e89feb --- /dev/null +++ b/source-code/RuffCT-java/src/how/monero/hodl/jni/CryptoOpsUtil.java @@ -0,0 +1,11 @@ +package how.monero.hodl.jni; + +public class CryptoOpsUtil { + + static { System.loadLibrary("cryptoopsutil"); } + + public static native byte[] scalarMult(byte[] point, byte[] scalar); + public static native byte[] scalarMultBase(byte[] scalar); + public static native byte[] doubleScalarMultBaseVartime(byte[] aScalar, byte[] point, byte[] bScalar); + +} diff --git a/source-code/RuffCT-java/src/how/monero/hodl/ringSignature/BootleRuffing.java b/source-code/RuffCT-java/src/how/monero/hodl/ringSignature/BootleRuffing.java new file mode 100644 index 0000000..e8dcd33 --- /dev/null +++ b/source-code/RuffCT-java/src/how/monero/hodl/ringSignature/BootleRuffing.java @@ -0,0 +1,560 @@ +package how.monero.hodl.ringSignature; + +import how.monero.hodl.crypto.PointPair; +import how.monero.hodl.crypto.Scalar; +import how.monero.hodl.cursor.BootleRuffingCursor; +import how.monero.hodl.util.VarInt; +import org.nem.core.crypto.ed25519.arithmetic.*; + +import java.math.BigInteger; +import java.util.HashMap; +import java.util.Map; + +import static how.monero.hodl.crypto.CryptoUtil.*; +import static how.monero.hodl.crypto.HashToPoint.hashToPoint; +import static how.monero.hodl.crypto.Scalar.bigIntegerArrayToScalarArray; +import static how.monero.hodl.crypto.Scalar.randomScalar; +import static how.monero.hodl.util.ByteUtil.*; + + +public class BootleRuffing { + + public static class SK { + public Scalar r; + public Scalar r1; + public SK(Scalar r, Scalar r1) { + this.r = r; this.r1 = r1; + } + + @Override + public String toString() { + return "(r: " + bytesToHex(r) + ", r1: " + bytesToHex(r1) + ")"; + } + } + + public static KeyGenResult KEYGEN() { + SK sk = new SK(randomScalar(), randomScalar()); + Ed25519GroupElement ki = G.scalarMultiply(sk.r1); + PointPair pk = ENCeg(ki, sk.r); + return new KeyGenResult(sk, ki, pk); + } + public static class KeyGenResult { + public SK sk; + public Ed25519GroupElement ki; + public PointPair pk = null; + public KeyGenResult(SK sk, Ed25519GroupElement ki, PointPair pk) { + this.sk = sk; this.ki = ki; this.pk = pk; + } + + @Override + public String toString() { + return "sk: " + sk.toString() + ", ki: " + bytesToHex(ki.encode().getRaw()) + ", pk: " + (pk==null ? "(no pk)" : "pk: " + pk); + } + } + + public static class F { + public Ed25519GroupElement[] ki; + public PointPair[][] pk; + public Ed25519GroupElement[] co; + public Ed25519GroupElement co1; + byte[] M; + public F(Ed25519GroupElement[] ki, PointPair[][] pk, Ed25519GroupElement[] co, Ed25519GroupElement co1, byte[] M) { + this.ki = ki; this.pk = pk; this.co = co; this.co1 = co1; this.M = M; + } + byte[] toBytes() { + byte[] r = new byte[0]; + for(int i=0; i<ki.length; i++) r = concat(r, ki[i].encode().getRaw()); + for(int i=0; i<pk.length; i++) for(int j=0; j<pk[i].length; j++) r = concat(r, pk[i][j].toBytes()); + for(int i=0; i<co.length; i++) r = concat(r, co[i].encode().getRaw()); + r = concat(r, co1.encode().getRaw()); + r = concat(r, M); + return r; + } + } + + public static SpendSignature SPEND(SpendParams sp) { + + int iAsterisk = sp.iAsterisk; + PointPair[][] pk = sp.pk; + SK[] sk = sp.sk; + Ed25519GroupElement[] ki = sp.ki; + Ed25519GroupElement[] co = sp.co; + byte[] M = sp.M; + Scalar s = sp.s; + int decompositionBase = sp.decompositionBase; + int decompositionExponent = sp.decompositionExponent; + + Ed25519GroupElement co1 = G.scalarMultiply(s); + F f = new F(ki, pk, co, co1, M); + SubResult cf1 = SUB(f); + Scalar s1 = s; + for(int i=0; i<sk.length; i++) s1 = s1.add(sk[i].r.mul(cf1.f[i])); + Proof2 sigma1 = PROVE2(cf1.c, iAsterisk, s1, pk.length, decompositionBase, decompositionExponent); + + Scalar[] r1 = new Scalar[sk.length]; + for(int i=0; i<r1.length; i++) r1[i] = sk[i].r1; + + Multisignature.Signature sigma2 = Multisignature.sign(concat(sigma1.toBytes(decompositionBase, decompositionExponent), f.toBytes()), r1, null); + return new SpendSignature(decompositionBase, decompositionExponent, co1, sigma1, sigma2); + } + + public static class SpendSignature { + public int decompositionBase; + public int decompositionExponent; + public Ed25519GroupElement co1; + public Proof2 sigma1; + Multisignature.Signature sigma2; + public SpendSignature(int decompositionBase, int decompositionExponent, Ed25519GroupElement co1, Proof2 sigma1, Multisignature.Signature sigma2) { + this.decompositionBase = decompositionBase; this.decompositionExponent = decompositionExponent; this.co1 = co1; this.sigma1 = sigma1; this.sigma2 = sigma2; + } + public byte[] toBytes() { + byte[] result; + result = concat(VarInt.writeVarInt(decompositionBase), VarInt.writeVarInt(decompositionExponent)); + result = concat(result, co1.encode().getRaw(), sigma1.toBytes(decompositionBase, decompositionExponent), sigma2.toBytes()); + return result; + } + public static SpendSignature fromBytes(byte[] a) { + BootleRuffingCursor cursor = new BootleRuffingCursor(a); + int decompositionBase = (int) cursor.readVarInt(); + int decompositionExponent = (int) cursor.readVarInt(); + return new SpendSignature(decompositionBase, decompositionExponent, + cursor.readGroupElement(), + new Proof2( + new Proof1(cursor.readGroupElement(), cursor.readGroupElement(), cursor.readGroupElement(), + cursor.readScalar2DArray(decompositionExponent, decompositionBase-1), cursor.readScalar(), cursor.readScalar(), null), + cursor.readGroupElement(), + cursor.readPointPairArray(decompositionExponent), cursor.readScalar()), + new Multisignature.Signature(cursor.readGroupElement(), cursor.readScalar())); + } + } + + public static SubResult SUB(F fin) { + int L = fin.pk.length; // inputs + int N = fin.pk[0].length; // ring size + PointPair[] pkz = new PointPair[L]; + Scalar[] f = new Scalar[L]; + for(int j=0; j<L; j++) { + pkz[j] = new PointPair(fin.ki[j], Ed25519Group.ZERO_P3); + f[j] = hashToScalar(concat(fin.ki[j].encode().getRaw(), fin.toBytes(), longToLittleEndianUint32ByteArray(j))); + } + PointPair[] c = new PointPair[N]; + for(int i=0; i<N; i++) { + c[i] = new PointPair(fin.co[i], fin.co1); + for(int j=0; j<L; j++) { + c[i] = c[i].add( (fin.pk[j][i].subtract(pkz[j])).multiply(f[j]) ); + } + } + return new SubResult(c, f); + } + public static class SubResult { + public PointPair[] c; + public Scalar[] f; + public SubResult(PointPair[] c, Scalar[] f) { + this.c = c; this.f = f; + } + } + + public static Proof1 PROVE1(Scalar[][] b, Scalar r) { + + int m = b.length; // decompositionExponent + int n = b[0].length; // decompositionBase + + Scalar rA = randomScalar(); + Scalar rC = randomScalar(); + Scalar rD = randomScalar(); + + Scalar[][] a = new Scalar[m][n]; + for(int j=0; j<m; j++) { + for(int i=1; i<n; i++) { + a[j][i] = randomScalar(); + } + } + + for(int j=0; j<m; j++) { + a[j][0] = Scalar.ZERO; + for(int i=1; i<n; i++) { + a[j][0] = a[j][0].sub(a[j][i]); + } + } + + Ed25519GroupElement A = COMb(a, rA); + + Scalar[][] c = new Scalar[m][n]; + Scalar[][] d = new Scalar[m][n]; + for(int j=0; j<m; j++) { + for(int i=0; i<n; i++) { + c[j][i] = a[j][i].mul(Scalar.ONE.sub(b[j][i].mul(Scalar.TWO))); + d[j][i] = a[j][i].sq().mul(Scalar.MINUS_ONE); + } + } + + Ed25519GroupElement C = COMb(c, rC); + Ed25519GroupElement D = COMb(d, rD); + + Scalar x = hashToScalar(concat(A.encode().getRaw(), C.encode().getRaw(), D.encode().getRaw())); + + Scalar[][] f = new Scalar[m][n]; + for(int j=0; j<m; j++) { + for(int i=0; i<n; i++) { + f[j][i] = b[j][i].mul(x).add(a[j][i]); + } + } + + Scalar[][] fTrimmed = new Scalar[m][n-1]; + for(int j=0; j<m; j++) { + for(int i=1; i<n; i++) { + fTrimmed[j][i-1] = f[j][i]; + } + } + + Scalar zA = r.mul(x).add(rA); + Scalar zC = rC.mul(x).add(rD); + + return new Proof1(A, C, D, fTrimmed, zA, zC, a); + } + + public static class Proof1 { + public Ed25519GroupElement A; + public Ed25519GroupElement C; + public Ed25519GroupElement D; + private Scalar[][] fTrimmed; + private Scalar zA; + private Scalar zC; + public transient Scalar[][] a; + + private Proof1(Ed25519GroupElement A, Ed25519GroupElement C, Ed25519GroupElement D, Scalar[][] fTrimmed, + Scalar zA, Scalar zC, Scalar[][] a) { + this.A = A; this.C = C; this.D = D; this.fTrimmed = fTrimmed; this.zA = zA; this.zC = zC; this.a = a; + } + private byte[] toBytes(int decompositionBase, int decompositionExponent) { + byte[] result = concat(A.encode().getRaw(), C.encode().getRaw(), D.encode().getRaw()); + for(int j=0; j<decompositionExponent; j++) { + for(int i=0; i<decompositionBase-1; i++) { + result = concat(result, fTrimmed[j][i].bytes); + } + } + result = concat(result, zA.bytes, zC.bytes); + return result; + } + } + + public static Proof2 PROVE2(PointPair[] co, int iAsterisk, Scalar r, int inputs, int decompositionBase, int decompositionExponent) { + + int ringSize = (int) Math.pow(decompositionBase, decompositionExponent); + + Scalar[] u = new Scalar[decompositionExponent]; + for(int k=0; k<decompositionExponent; k++) u[k] = randomScalar(); + + Scalar rB = randomScalar(); + + int[] iAsteriskSequence = nAryDecompose(decompositionBase, iAsterisk, decompositionExponent); + + Scalar[][] d = new Scalar[decompositionExponent][decompositionBase]; + for(int j=0; j<decompositionExponent; j++) { + for(int i=0; i<decompositionBase; i++) { + d[j][i] = Scalar.intToScalar(delta(iAsteriskSequence[j], i)); + } + } + + Ed25519GroupElement B = COMb(d, rB); + + Proof1 P = PROVE1(d, rB); + + Scalar[][] coefs = COEFS(P.a, iAsterisk); + + PointPair[] G = new PointPair[decompositionExponent]; + + for(int k=0; k<decompositionExponent; k++) { + G[k] = ENCeg(Ed25519Group.ZERO_P3, u[k]); + for (int i = 0; i < ringSize; i++) { + G[k] = G[k].add(co[i].multiply(coefs[i][k])); + } + } + + byte[] bytes = concat(P.A.encode().getRaw(), P.C.encode().getRaw(), P.D.encode().getRaw()); + Scalar x1 = hashToScalar(bytes); + + Scalar z = r.mul(x1.pow(decompositionExponent)); + for(int i=decompositionExponent-1; i>=0; i--) { + z = z.sub(u[i].mul(x1.pow(i))); + } + return new Proof2(P, B, G, z); + } + + + public static class Proof2 { + Proof1 P; + public Ed25519GroupElement B; + public PointPair[] G; + public Scalar z; + + private Proof2(Proof1 P, Ed25519GroupElement B, PointPair[] G, Scalar z) { + this.P = P; + this.B = B; + this.G = G; + this.z = z; + } + + private byte[] toBytes(int decompositionBase, int decompositionExponent) { + byte[] bytes; + bytes = concat(P.toBytes(decompositionBase, decompositionExponent), B.encode().getRaw()); + for(PointPair g : G) bytes = concat(bytes, g.toBytes()); + bytes = concat(bytes, z.bytes); + return bytes; + } + + } + + private static int delta(int j, int i) { + return j==i ? 1 : 0; + } + private static int intPow(int a, int b) { + return (int) Math.round(Math.pow(a, b)); + } + public static int[] nAryDecompose(int base, int n, int decompositionExponent) { + int[] r = new int[decompositionExponent]; + for(int i=decompositionExponent-1; i>=0; i--) { + int basePow = intPow(base, i); + r[i] = n / basePow; + n-=basePow*r[i]; + } + return r; + } + + public static boolean VALID1(Ed25519GroupElement B, Proof1 P) { + boolean abcdOnCurve = + P.A.satisfiesCurveEquation() + && B.satisfiesCurveEquation() + && P.C.satisfiesCurveEquation() + && P.D.satisfiesCurveEquation(); + if(!abcdOnCurve) { + System.out.println("VALID1: ABCD not on curve"); + return false; + } + + int m = P.fTrimmed.length; + int n = P.fTrimmed[0].length + 1; + + Scalar[][] f = new Scalar[m][n]; + for(int j=0; j<m; j++) { + for(int i=1; i<n; i++) { + f[j][i] = P.fTrimmed[j][i-1]; + } + } + + Scalar x = hashToScalar(concat(P.A.encode().getRaw(), P.C.encode().getRaw(), P.D.encode().getRaw())); + + for(int j=0; j<m; j++) { + f[j][0] = x; + for(int i=1; i<n; i++) { + f[j][0] = f[j][0].sub(f[j][i]); + } + } + + Scalar[][] f1 = new Scalar[m][n]; + for(int j=0; j<m; j++) { + for(int i=0; i<n; i++) { + f1[j][i] = f[j][i].mul(x.sub(f[j][i])); + } + } + + for(int j=0; j<m; j++) { + Scalar colSum = x; + for(int i=1; i<n; i++) { + colSum = colSum.sub(f[j][i]); + } + if(!f[j][0].equals(colSum)) { + System.out.println("VALID1: FAILED For each j=0, ..., m-1, f[j][0] == x-f[j][1]-f[j][2]- ... -f[j][n-1]"); + return false; + } + } + + if(!B.toP3().scalarMultiply(x).toP3().add(P.A.toP3().toCached()).equals(COMb(f, P.zA))) { + System.out.println("VALID1: FAILED xB + A == COMp(f[0][0], ..., f[m-1][n-1]; z[A])"); + return false; + } + if(!P.C.toP3().scalarMultiply(x).toP3().add(P.D.toP3().toCached()).equals(COMb(f1, P.zC))) { + System.out.println("VALID1: FAILED xC + D == COMp(f'[0][0], ..., f'[m-1][n-1]; z[C])"); + return false; + } + + return true; + + } + + public static boolean VALID2(int decompositionBase, Proof2 P1, PointPair[] co) { + + boolean abcdOnCurve = + P1.P.A.satisfiesCurveEquation() + && P1.B.satisfiesCurveEquation() + && P1.P.C.satisfiesCurveEquation() + && P1.P.D.satisfiesCurveEquation(); + if(!abcdOnCurve) { + System.out.println("VALID2: FAILED: ABCD not on curve"); + return false; + } + + if(!VALID1(P1.B, P1.P)) { + System.out.println("VALID2: FAILED: VALID1 failed"); + return false; + } + + Scalar x1 = hashToScalar(concat(P1.P.A.encode().getRaw(), P1.P.C.encode().getRaw(), P1.P.D.encode().getRaw())); + + int decompositionExponent = P1.P.fTrimmed.length; + Scalar[][] f = new Scalar[decompositionExponent][decompositionBase]; + for(int j=0; j<decompositionExponent; j++) { + for(int i=1; i<decompositionBase; i++) { + f[j][i] = P1.P.fTrimmed[j][i-1]; + } + } + + int ringSize = (int) Math.pow(decompositionBase, decompositionExponent); + + PointPair c = ENCeg(Ed25519Group.ZERO_P3, P1.z); + + Scalar x = hashToScalar(concat(P1.P.A.encode().getRaw(), P1.P.C.encode().getRaw(), P1.P.D.encode().getRaw())); + for(int j=0; j<decompositionExponent; j++) { + f[j][0] = x; + for(int i=1; i<decompositionBase; i++) { + f[j][0] = f[j][0].sub(f[j][i]); + } + } + + Scalar[] g = new Scalar[ringSize]; + g[0] = f[0][0]; + for(int j=1; j<decompositionExponent; j++) { + g[0] = g[0].mul(f[j][0]); + } + + PointPair c1 = co[0].multiply(g[0]); + for(int i=1; i<ringSize; i++) { + int[] iSequence = nAryDecompose(decompositionBase, i, decompositionExponent); + g[i] = f[0][iSequence[0]]; + for(int j=1; j<decompositionExponent; j++) { + g[i] = g[i].mul(f[j][iSequence[j]]); + } + c1 = c1.add(co[i].multiply(g[i])); + } + + for(int k=0; k<decompositionExponent; k++) { + c1 = c1.subtract(P1.G[k].multiply(x1.pow(k))); + } + + + boolean result = c1.equals(c); + if(!result) { + System.out.println("VALID2: FAILED: c' != c"); + System.out.println("c: (" + bytesToHex(c.P1.encode().getRaw()) + ", " + bytesToHex(c.P2.encode().getRaw())); + System.out.println("c': (" + bytesToHex(c1.P1.encode().getRaw()) + ", " + bytesToHex(c1.P2.encode().getRaw())); + } + return result; + + } + + public static boolean VER(Ed25519GroupElement[] ki, PointPair[][] pk, Ed25519GroupElement[] co, Ed25519GroupElement co1, byte[] M, SpendSignature spendSignature) { + + F f = new F(ki, pk, co, co1, M); + + SubResult cf1 = SUB(f); + + if(!Multisignature.verify(concat(spendSignature.sigma1.toBytes(spendSignature.decompositionBase, spendSignature.decompositionExponent), f.toBytes()), ki, spendSignature.sigma2)) { + System.out.println("Multisignature.verify failed"); + return false; + } + + if(!VALID2(spendSignature.decompositionBase, spendSignature.sigma1, cf1.c)) { + System.out.println("VALID2 failed"); + return false; + } + + return true; + } + + public static class Output { + public SK sk; + public Ed25519GroupElement ki; + public PointPair pk; + + public Scalar mask; + public Ed25519GroupElement co; + public BigInteger amount; + public static Output genRandomOutput(BigInteger amount) { + Output o = new Output(); + KeyGenResult keyGenResult = KEYGEN(); + o.sk = keyGenResult.sk; + o.pk = keyGenResult.pk; + o.ki = keyGenResult.ki; + o.amount = amount; + o.mask = randomScalar(); + o.co = COMp(new Scalar(o.amount), o.mask); + return o; + } + } + + public static Scalar[][] COEFS(Scalar[][] a, int iAsterisk) { + int decompositionBase = a[0].length; // n + int decompositionExponent = a.length; // m + int ringSize = (int) Math.pow(decompositionBase, decompositionExponent); // N = n^m + + int[] iAsteriskSequence = nAryDecompose(decompositionBase, iAsterisk, decompositionExponent); + + Scalar[][] coefList = new Scalar[ringSize][decompositionExponent]; + + for(int k=0; k<ringSize; k++) { + int[] kSequence = nAryDecompose(decompositionBase, k, decompositionExponent); + coefList[k] = new Scalar[]{ + a[0][kSequence[0]], + Scalar.intToScalar(delta(iAsteriskSequence[0], kSequence[0])) + }; + + for(int j=1; j<decompositionExponent; j++) { + coefList[k] = COEFPROD(coefList[k], new Scalar[]{ + a[j][kSequence[j]], + Scalar.intToScalar(delta(iAsteriskSequence[j], kSequence[j])) + }); + } + } + for(int k=0; k<ringSize; k++) { + coefList[k] = trimScalarArray(coefList[k], decompositionExponent, decompositionExponent); + } + return coefList; + } + + private static Scalar[] trimScalarArray(Scalar[] a, int len, int indexWhere1ValueCanBeTrimmed) { + Scalar[] r = new Scalar[len]; + for(int i=0; i<a.length; i++) { + if(i<len) r[i] = a[i]; + else { + if(i==indexWhere1ValueCanBeTrimmed) { + if(!(a[i].equals(Scalar.ZERO) || a[i].equals(Scalar.ONE))) throw new RuntimeException("Attempt to trim non-zero or non-one in column " + i + ": value: " + a[i].toBigInteger()); + } + else { + if(!(a[i].equals(Scalar.ZERO))) throw new RuntimeException("Attempt to trim non-zero in column " + i + ": value: " + a[i].toBigInteger()); + } + } + } + return r; + } + + public static Scalar[] COEFPROD(Scalar[] c, Scalar[] d) { + int maxLen = Math.max(c.length, d.length); + int resultLen = 2*maxLen-1; + BigInteger[] result = new BigInteger[resultLen]; + + for (int i = 0; i<resultLen; i++) result[i] = BigInteger.ZERO; + for (int i=0; i<maxLen; i++) + { + for (int j=0; j<maxLen; j++) { + result[i+j] = result[i+j].add(getBigIntegerAtArrayIndex(c, i).multiply(getBigIntegerAtArrayIndex(d, j))); + } + } + return bigIntegerArrayToScalarArray(result); + } + + private static BigInteger getBigIntegerAtArrayIndex(Scalar[] a, int index) { + if(index>=a.length) return BigInteger.ZERO; + else return a[index].toBigInteger(); + } + +} diff --git a/source-code/RuffCT-java/src/how/monero/hodl/ringSignature/Multisignature.java b/source-code/RuffCT-java/src/how/monero/hodl/ringSignature/Multisignature.java new file mode 100644 index 0000000..4c0c02f --- /dev/null +++ b/source-code/RuffCT-java/src/how/monero/hodl/ringSignature/Multisignature.java @@ -0,0 +1,114 @@ +package how.monero.hodl.ringSignature; + +import how.monero.hodl.crypto.Scalar; +import org.nem.core.crypto.ed25519.arithmetic.Ed25519GroupElement; + +import java.util.*; + +import static how.monero.hodl.crypto.Scalar.randomScalar; +import static how.monero.hodl.util.ByteUtil.bytesToHex; +import static how.monero.hodl.util.ByteUtil.concat; +import static how.monero.hodl.crypto.CryptoUtil.*; + +public class Multisignature { + + public static Ed25519GroupElement[] lexicographicalSort(Ed25519GroupElement[] X) { + SortedMap<String, Ed25519GroupElement> hexToPoint = new TreeMap<>(); + for(Ed25519GroupElement Xi : X) hexToPoint.put(bytesToHex(Xi.encode().getRaw()), Xi); + return hexToPoint.values().stream().toArray(Ed25519GroupElement[]::new); + } + + /* + VER*: Take as input a message M, public keys L' = X[1], ..., X[n], and a + signature sigma = (R,s). + 1) Compute L* = H(L') + 2) For each i=1,2,...,n, compute c[i] = Hs(X[i], R, L*, M) + 3) Accept if and only if sG = R + c[1]*X[1] + ... + c[n]*X[n] + */ + public static boolean verify(byte[] M, Ed25519GroupElement[] X, Signature signature) { + int n = X.length; + + Scalar XAsterisk = hashToScalar(toBytes(lexicographicalSort(X))); + + Scalar[] c = new Scalar[n]; + for(int i=0; i<n; i++) { + c[i] = hashToScalar(concat(X[i].encode().getRaw(), signature.R.encode().getRaw(), XAsterisk.bytes, M)); + } + Ed25519GroupElement sG = G.scalarMultiply(signature.s); + Ed25519GroupElement sG1 = signature.R; + for(int i=0; i<n; i++) sG1 = sG1.toP3().add(X[i].scalarMultiply(c[i]).toCached()); + return sG.equals(sG1); + } + + /* + SIG*: Take as input a message M and a list of private keys L = x[0], x[1], + ..., x[n-1]. Let L' be the associated list of public keys X[0], ..., X[n-1], and + assume L' is lexicographically ordered. + 1) Compute L* = H(L'). + 2) For each i=0,1,...,n-1, select r[i] at random from Zq. + 3) Compute r=r[0]+r[1]+...+r[n-1] and R=rG. + 4) For each i=0,1,...,n-1: + i) Compute c[i] := Hs(X[i], R, L*, M) + ii) Compute s[i] := r[i] + x[i]*c[i] + 5) Compute s = s[1] + ... + s[n]. + 6) Output the signature sigma = (R, s) + */ + public static Signature sign(byte[] M, Scalar[] x, Ed25519GroupElement[] X) { + int n = x.length; + if(X==null) { + X = new Ed25519GroupElement[n]; + for(int i=0; i<n; i++) { + X[i] = G.scalarMultiply(x[i]); + } + + } + Scalar XAsterisk = hashToScalar(toBytes(lexicographicalSort(X))); + + Scalar[] rArray = new Scalar[n]; + for(int i=0; i<n; i++) rArray[i] = randomScalar(); + Scalar r = sumArray(rArray); + + Ed25519GroupElement R = G.scalarMultiply(r); + Scalar[] c = new Scalar[n]; + Scalar[] sArray = new Scalar[n]; + for(int i=0; i<n; i++) { + c[i] = hashToScalar(concat(X[i].encode().getRaw(), R.encode().getRaw(), XAsterisk.bytes, M)); + sArray[i] = rArray[i].add(x[i].mul(c[i])); + } + Scalar s = sumArray(sArray); + return new Signature(R, s); + } + + public static class Signature { + Ed25519GroupElement R; + Scalar s; + public Signature(Ed25519GroupElement R, Scalar s) { + this.R = R; this.s = s; + } + public byte[] toBytes() { + return concat(R.encode().getRaw(), s.bytes); + } + } + + /* + KEYGEN*: Each user selects x at random from Zq. The secret key is x. The + public key is X=xG. Output (sk,pk) = (x,X). + */ + public static KeyPair keygen() { + Scalar x = randomScalar(); + Ed25519GroupElement X = G.scalarMultiply(x); + return new KeyPair(x, X); + } + public static class KeyPair { + public Scalar x; + public Ed25519GroupElement X; + public KeyPair(Scalar x, Ed25519GroupElement X) { + this.x = x; this.X = X; + } + } + + + + + +} diff --git a/source-code/RuffCT-java/src/how/monero/hodl/ringSignature/SpendParams.java b/source-code/RuffCT-java/src/how/monero/hodl/ringSignature/SpendParams.java new file mode 100644 index 0000000..2d40c94 --- /dev/null +++ b/source-code/RuffCT-java/src/how/monero/hodl/ringSignature/SpendParams.java @@ -0,0 +1,19 @@ +package how.monero.hodl.ringSignature; + +import how.monero.hodl.crypto.PointPair; +import how.monero.hodl.crypto.Scalar; +import org.nem.core.crypto.ed25519.arithmetic.Ed25519GroupElement; + +public class SpendParams { + + public int iAsterisk; + public PointPair[][] pk; + public BootleRuffing.SK[] sk; + public Ed25519GroupElement[] ki; + public Ed25519GroupElement[] co; + public byte[] M; + public Scalar s; + public int decompositionBase; + public int decompositionExponent; + +} diff --git a/source-code/RuffCT-java/src/how/monero/hodl/util/ByteUtil.java b/source-code/RuffCT-java/src/how/monero/hodl/util/ByteUtil.java new file mode 100644 index 0000000..e3301ad --- /dev/null +++ b/source-code/RuffCT-java/src/how/monero/hodl/util/ByteUtil.java @@ -0,0 +1,83 @@ +package how.monero.hodl.util; + +import how.monero.hodl.crypto.Scalar; + +public class ByteUtil { + + public static String byteToHex(int v) { + byte[] array = new byte[1]; + array[0] = (byte) v; + return bytesToHex(array); + } + + final protected static char[] hexArray = "0123456789abcdef".toCharArray(); + public static String bytesToHex(Scalar a) { + return bytesToHex(a.bytes); + } + public static String bytesToHex(byte[] bytes) { + char[] hexChars = new char[bytes.length * 2]; + for ( int j = 0; j < bytes.length; j++ ) { + int v = bytes[j] & 0xFF; + hexChars[j * 2] = hexArray[v >>> 4]; + hexChars[j * 2 + 1] = hexArray[v & 0x0F]; + } + return new String(hexChars); + } + + public static byte[] hexToBytes(String s) { + int len = s.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + + Character.digit(s.charAt(i+1), 16)); + } + return data; + } + + public static void reverseByteArrayInPlace(byte[] array) { + for(int i = 0; i < array.length / 2; i++) + { + byte temp = array[i]; + array[i] = array[array.length - i - 1]; + array[array.length - i - 1] = temp; + } + } + + public static byte[] concat(byte a, byte[] b) { + byte[] r = new byte[1+b.length]; + r[0] = a; + System.arraycopy(b, 0, r, 1, b.length); + return r; + } + public static byte[] concat(byte[] a, byte[] b) { + byte[] r = new byte[a.length+b.length]; + System.arraycopy(a, 0, r, 0, a.length); + System.arraycopy(b, 0, r, a.length, b.length); + return r; + } + public static byte[] concat(byte[] a, byte[] b, byte[] c) { + return concat(concat(a, b), c); + } + public static byte[] concat(byte[] a, byte[] b, byte[] c, byte[] d) { + return concat(concat(a, b), concat(c, d)); + } + + public static byte[] subarray(byte[] a, int start, int end) { + byte[] r = new byte[end-start]; + System.arraycopy(a, start, r, 0, r.length); + return r; + } + + public static byte[] xor(byte[] a, byte[] b) { + byte[] r = new byte[a.length]; + for(int i=0; i<r.length; i++) r[i] = (byte) (a[i] ^ b[i]); + return r; + } + + public static byte[] longToLittleEndianUint32ByteArray(long value) { + byte[] array = new byte[4]; + for (int i=3; i>=0; i--) array[i] = (byte) (value >> i*8); + return array; + } + +} diff --git a/source-code/RuffCT-java/src/how/monero/hodl/util/ExceptionAdapter.java b/source-code/RuffCT-java/src/how/monero/hodl/util/ExceptionAdapter.java new file mode 100644 index 0000000..4628fdd --- /dev/null +++ b/source-code/RuffCT-java/src/how/monero/hodl/util/ExceptionAdapter.java @@ -0,0 +1,8 @@ +package how.monero.hodl.util; + +public class ExceptionAdapter { + public static RuntimeException toRuntimeException(Exception e) { + if(RuntimeException.class.isInstance(e)) return (RuntimeException) e; + else return new RuntimeException(e); + } +} diff --git a/source-code/RuffCT-java/src/how/monero/hodl/util/VarInt.java b/source-code/RuffCT-java/src/how/monero/hodl/util/VarInt.java new file mode 100644 index 0000000..ef21a50 --- /dev/null +++ b/source-code/RuffCT-java/src/how/monero/hodl/util/VarInt.java @@ -0,0 +1,45 @@ +package how.monero.hodl.util; + +public class VarInt { + + public static byte[] writeVarInt(long value) { + byte[] data = new byte[8]; + int pos = 0; + + while ((value & 0xFFFFFF80) != 0L) { + data[pos] = (byte) ((value & 0x7F) | 0x80); + pos++; + value >>>= 7; + } + data[pos] = (byte) (value & 0x7F); + pos++; + + byte[] result = new byte[pos]; + System.arraycopy(data, 0, result, 0, pos); + return result; + } + + public static long readVarInt(byte[] data) { + + long result = 0; + int c = 0; + int pos = 0; + + while(true) { + boolean isLastByteInVarInt = true; + int i = Byte.toUnsignedInt(data[pos]); + if(i>=128) { + isLastByteInVarInt = false; + i-=128; + } + result += Math.round(i * Math.pow(128, c)); + c++; + pos++; + if(isLastByteInVarInt) break; + } + + return result; + } + + +} diff --git a/source-code/RuffCT-java/src/org/nem/core/crypto/Curve.java b/source-code/RuffCT-java/src/org/nem/core/crypto/Curve.java new file mode 100755 index 0000000..5c89399 --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/crypto/Curve.java @@ -0,0 +1,30 @@ +package org.nem.core.crypto; + +import java.math.BigInteger; + +/** + * Interface for getting information for a curve. + */ +public interface Curve { + + /** + * Gets the name of the curve. + * + * @return The name of the curve. + */ + String getName(); + + /** + * Gets the group order. + * + * @return The group order. + */ + BigInteger getGroupOrder(); + + /** + * Gets the group order / 2. + * + * @return The group order / 2. + */ + BigInteger getHalfGroupOrder(); +} diff --git a/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/Ed25519Curve.java b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/Ed25519Curve.java new file mode 100755 index 0000000..f49a61f --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/Ed25519Curve.java @@ -0,0 +1,41 @@ +package org.nem.core.crypto.ed25519; + +import org.nem.core.crypto.ed25519.arithmetic.Ed25519Group; + +import java.math.BigInteger; + +/** + * Class that wraps the elliptic curve Ed25519. + */ +public class Ed25519Curve implements org.nem.core.crypto.Curve { + + private static final Ed25519Curve ED25519; + + static { + ED25519 = new Ed25519Curve(); + } + + @Override + public String getName() { + return "ed25519"; + } + + @Override + public BigInteger getGroupOrder() { + return Ed25519Group.GROUP_ORDER; + } + + @Override + public BigInteger getHalfGroupOrder() { + return Ed25519Group.GROUP_ORDER.shiftRight(1); + } + + /** + * Gets the Ed25519 instance. + * + * @return The Ed25519 instance. + */ + public static Ed25519Curve ed25519() { + return ED25519; + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/CoordinateSystem.java b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/CoordinateSystem.java new file mode 100755 index 0000000..29d6df1 --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/CoordinateSystem.java @@ -0,0 +1,37 @@ +package org.nem.core.crypto.ed25519.arithmetic; + +/** + * Available coordinate systems for a group element. + */ +public enum CoordinateSystem { + + /** + * Affine coordinate system (x, y). + */ + AFFINE, + + /** + * Projective coordinate system (X:Y:Z) satisfying x=X/Z, y=Y/Z. + */ + P2, + + /** + * Extended projective coordinate system (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT. + */ + P3, + + /** + * Completed coordinate system ((X:Z), (Y:T)) satisfying x=X/Z, y=Y/T. + */ + P1xP1, + + /** + * Precomputed coordinate system (y+x, y-x, 2dxy). + */ + PRECOMPUTED, + + /** + * Cached coordinate system (Y+X, Y-X, Z, 2dT). + */ + CACHED +} diff --git a/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519EncodedFieldElement.java b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519EncodedFieldElement.java new file mode 100755 index 0000000..5acc2ef --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519EncodedFieldElement.java @@ -0,0 +1,1005 @@ +package org.nem.core.crypto.ed25519.arithmetic; + +import org.nem.core.utils.*; + +import java.util.Arrays; + +/** + * Represents a field element of the finite field with p=2^255-19 elements. + * The value of the field element is held in 2^8 bit representation, i.e. in a byte array. + * The length of the array must be 32 or 64. + */ +public class Ed25519EncodedFieldElement { + private final byte[] zero; + private final byte[] values; + + /** + * Creates a new encoded field element. + * + * @param values The byte array that holds the values. + */ + public Ed25519EncodedFieldElement(final byte[] values) { + switch (values.length) { + case 32: + this.zero = Ed25519Field.ZERO_SHORT; + break; + case 64: + this.zero = Ed25519Field.ZERO_LONG; + break; + default: + throw new IllegalArgumentException("Invalid 2^8 bit representation."); + } + + this.values = values; + } + + /** + * Gets the underlying byte array. + * + * @return The byte array. + */ + public byte[] getRaw() { + return this.values; + } + + /** + * Return true if this is in {1,3,5,...,q-2} + * Return false if this is in {0,2,4,...,q-1} + * <br> + * Preconditions: + * |x| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + * + * @return true if this is in {1,3,5,...,q-2}, false otherwise. + */ + public boolean isNegative() { + return (this.values[0] & 1) != 0; + } + + /** + * Gets a value indicating whether or not the field element is non-zero. + * + * @return 1 if it is non-zero, 0 otherwise. + */ + public boolean isNonZero() { + return 0 == ArrayUtils.isEqualConstantTime(this.values, this.zero); + } + + /** + * Decodes this encoded (32 byte) representation to a field element in its 10 byte 2^25.5 representation. + * The most significant bit is discarded. + * + * @return The field element in its 2^25.5 bit representation. + */ + public Ed25519FieldElement decode() { + long h0 = fourBytesToLong(this.values, 0); + long h1 = threeBytesToLong(this.values, 4) << 6; + long h2 = threeBytesToLong(this.values, 7) << 5; + long h3 = threeBytesToLong(this.values, 10) << 3; + long h4 = threeBytesToLong(this.values, 13) << 2; + long h5 = fourBytesToLong(this.values, 16); + long h6 = threeBytesToLong(this.values, 20) << 7; + long h7 = threeBytesToLong(this.values, 23) << 5; + long h8 = threeBytesToLong(this.values, 26) << 4; + long h9 = (threeBytesToLong(this.values, 29) & 0x7FFFFF) << 2; + final long carry0; + final long carry1; + final long carry2; + final long carry3; + final long carry4; + final long carry5; + final long carry6; + final long carry7; + final long carry8; + final long carry9; + + // Remember: 2^255 congruent 19 modulo p + carry9 = (h9 + (long)(1 << 24)) >> 25; + h0 += carry9 * 19; + h9 -= carry9 << 25; + carry1 = (h1 + (long)(1 << 24)) >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry3 = (h3 + (long)(1 << 24)) >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry5 = (h5 + (long)(1 << 24)) >> 25; + h6 += carry5; + h5 -= carry5 << 25; + carry7 = (h7 + (long)(1 << 24)) >> 25; + h8 += carry7; + h7 -= carry7 << 25; + + carry0 = (h0 + (long)(1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry2 = (h2 + (long)(1 << 25)) >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry4 = (h4 + (long)(1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry6 = (h6 + (long)(1 << 25)) >> 26; + h7 += carry6; + h6 -= carry6 << 26; + carry8 = (h8 + (long)(1 << 25)) >> 26; + h9 += carry8; + h8 -= carry8 << 26; + + final int[] h = new int[10]; + h[0] = (int)h0; + h[1] = (int)h1; + h[2] = (int)h2; + h[3] = (int)h3; + h[4] = (int)h4; + h[5] = (int)h5; + h[6] = (int)h6; + h[7] = (int)h7; + h[8] = (int)h8; + h[9] = (int)h9; + + return new Ed25519FieldElement(h); + } + + /** + * Reduces this encoded field element (64 bytes) modulo the group order q. + * + * @return Encoded field element (32 bytes). + */ + public Ed25519EncodedFieldElement modQ() { + // s0, ..., s22 have 21 bits, s23 has 29 bits + long s0 = 0x1FFFFF & threeBytesToLong(this.values, 0); + long s1 = 0x1FFFFF & (fourBytesToLong(this.values, 2) >> 5); + long s2 = 0x1FFFFF & (threeBytesToLong(this.values, 5) >> 2); + long s3 = 0x1FFFFF & (fourBytesToLong(this.values, 7) >> 7); + long s4 = 0x1FFFFF & (fourBytesToLong(this.values, 10) >> 4); + long s5 = 0x1FFFFF & (threeBytesToLong(this.values, 13) >> 1); + long s6 = 0x1FFFFF & (fourBytesToLong(this.values, 15) >> 6); + long s7 = 0x1FFFFF & (threeBytesToLong(this.values, 18) >> 3); + long s8 = 0x1FFFFF & threeBytesToLong(this.values, 21); + long s9 = 0x1FFFFF & (fourBytesToLong(this.values, 23) >> 5); + long s10 = 0x1FFFFF & (threeBytesToLong(this.values, 26) >> 2); + long s11 = 0x1FFFFF & (fourBytesToLong(this.values, 28) >> 7); + long s12 = 0x1FFFFF & (fourBytesToLong(this.values, 31) >> 4); + long s13 = 0x1FFFFF & (threeBytesToLong(this.values, 34) >> 1); + long s14 = 0x1FFFFF & (fourBytesToLong(this.values, 36) >> 6); + long s15 = 0x1FFFFF & (threeBytesToLong(this.values, 39) >> 3); + long s16 = 0x1FFFFF & threeBytesToLong(this.values, 42); + long s17 = 0x1FFFFF & (fourBytesToLong(this.values, 44) >> 5); + final long s18 = 0x1FFFFF & (threeBytesToLong(this.values, 47) >> 2); + final long s19 = 0x1FFFFF & (fourBytesToLong(this.values, 49) >> 7); + final long s20 = 0x1FFFFF & (fourBytesToLong(this.values, 52) >> 4); + final long s21 = 0x1FFFFF & (threeBytesToLong(this.values, 55) >> 1); + final long s22 = 0x1FFFFF & (fourBytesToLong(this.values, 57) >> 6); + final long s23 = (fourBytesToLong(this.values, 60) >> 3); + long carry0; + long carry1; + long carry2; + long carry3; + long carry4; + long carry5; + long carry6; + long carry7; + long carry8; + long carry9; + long carry10; + long carry11; + final long carry12; + final long carry13; + final long carry14; + final long carry15; + final long carry16; + + /** + * Lots of magic numbers :) + * To understand what's going on below, note that + * + * (1) q = 2^252 + q0 where q0 = 27742317777372353535851937790883648493. + * (2) s11 is the coefficient of 2^(11*21), s23 is the coefficient of 2^(^23*21) and 2^252 = 2^((23-11) * 21)). + * (3) 2^252 congruent -q0 modulo q. + * (4) -q0 = 666643 * 2^0 + 470296 * 2^21 + 654183 * 2^(2*21) - 997805 * 2^(3*21) + 136657 * 2^(4*21) - 683901 * 2^(5*21) + * + * Thus + * s23 * 2^(23*11) = s23 * 2^(12*21) * 2^(11*21) = s3 * 2^252 * 2^(11*21) congruent + * s23 * (666643 * 2^0 + 470296 * 2^21 + 654183 * 2^(2*21) - 997805 * 2^(3*21) + 136657 * 2^(4*21) - 683901 * 2^(5*21)) * 2^(11*21) modulo q = + * s23 * (666643 * 2^(11*21) + 470296 * 2^(12*21) + 654183 * 2^(13*21) - 997805 * 2^(14*21) + 136657 * 2^(15*21) - 683901 * 2^(16*21)). + * + * The same procedure is then applied for s22,...,s18. + */ + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + + /** + * Time to reduce the coefficient in order not to get an overflow. + */ + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry12 = (s12 + (1 << 20)) >> 21; + s13 += carry12; + s12 -= carry12 << 21; + carry14 = (s14 + (1 << 20)) >> 21; + s15 += carry14; + s14 -= carry14 << 21; + carry16 = (s16 + (1 << 20)) >> 21; + s17 += carry16; + s16 -= carry16 << 21; + + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + carry13 = (s13 + (1 << 20)) >> 21; + s14 += carry13; + s13 -= carry13 << 21; + carry15 = (s15 + (1 << 20)) >> 21; + s16 += carry15; + s15 -= carry15 << 21; + + /** + * Continue with above procedure. + */ + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + /** + * Reduce coefficients again. + */ + carry0 = (s0 + (1 << 20)) >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry2 = (s2 + (1 << 20)) >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry4 = (s4 + (1 << 20)) >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + + carry1 = (s1 + (1 << 20)) >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry3 = (s3 + (1 << 20)) >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry5 = (s5 + (1 << 20)) >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry11 = s11 >> 21; + s12 += carry11; + s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + + // s0, ..., s11 got 21 bits each. + final byte[] result = new byte[32]; + result[0] = (byte)(s0); + result[1] = (byte)(s0 >> 8); + result[2] = (byte)((s0 >> 16) | (s1 << 5)); + result[3] = (byte)(s1 >> 3); + result[4] = (byte)(s1 >> 11); + result[5] = (byte)((s1 >> 19) | (s2 << 2)); + result[6] = (byte)(s2 >> 6); + result[7] = (byte)((s2 >> 14) | (s3 << 7)); + result[8] = (byte)(s3 >> 1); + result[9] = (byte)(s3 >> 9); + result[10] = (byte)((s3 >> 17) | (s4 << 4)); + result[11] = (byte)(s4 >> 4); + result[12] = (byte)(s4 >> 12); + result[13] = (byte)((s4 >> 20) | (s5 << 1)); + result[14] = (byte)(s5 >> 7); + result[15] = (byte)((s5 >> 15) | (s6 << 6)); + result[16] = (byte)(s6 >> 2); + result[17] = (byte)(s6 >> 10); + result[18] = (byte)((s6 >> 18) | (s7 << 3)); + result[19] = (byte)(s7 >> 5); + result[20] = (byte)(s7 >> 13); + result[21] = (byte)(s8); + result[22] = (byte)(s8 >> 8); + result[23] = (byte)((s8 >> 16) | (s9 << 5)); + result[24] = (byte)(s9 >> 3); + result[25] = (byte)(s9 >> 11); + result[26] = (byte)((s9 >> 19) | (s10 << 2)); + result[27] = (byte)(s10 >> 6); + result[28] = (byte)((s10 >> 14) | (s11 << 7)); + result[29] = (byte)(s11 >> 1); + result[30] = (byte)(s11 >> 9); + result[31] = (byte)(s11 >> 17); + + return new Ed25519EncodedFieldElement(result); + } + + /** + * Multiplies this encoded field element with another and adds a third. + * The result is reduced modulo the group order. + * <br> + * See the comments in the method modQ() for an explanation of the algorithm. + * + * @param b The encoded field element which is multiplied with this. + * @param c The third encoded field element which is added. + * @return The encoded field element (32 bytes). + */ + public Ed25519EncodedFieldElement multiplyAndAddModQ(final Ed25519EncodedFieldElement b, final Ed25519EncodedFieldElement c) { + final long a0 = 0x1FFFFF & threeBytesToLong(this.values, 0); + final long a1 = 0x1FFFFF & (fourBytesToLong(this.values, 2) >> 5); + final long a2 = 0x1FFFFF & (threeBytesToLong(this.values, 5) >> 2); + final long a3 = 0x1FFFFF & (fourBytesToLong(this.values, 7) >> 7); + final long a4 = 0x1FFFFF & (fourBytesToLong(this.values, 10) >> 4); + final long a5 = 0x1FFFFF & (threeBytesToLong(this.values, 13) >> 1); + final long a6 = 0x1FFFFF & (fourBytesToLong(this.values, 15) >> 6); + final long a7 = 0x1FFFFF & (threeBytesToLong(this.values, 18) >> 3); + final long a8 = 0x1FFFFF & threeBytesToLong(this.values, 21); + final long a9 = 0x1FFFFF & (fourBytesToLong(this.values, 23) >> 5); + final long a10 = 0x1FFFFF & (threeBytesToLong(this.values, 26) >> 2); + final long a11 = (fourBytesToLong(this.values, 28) >> 7); + final long b0 = 0x1FFFFF & threeBytesToLong(b.values, 0); + final long b1 = 0x1FFFFF & (fourBytesToLong(b.values, 2) >> 5); + final long b2 = 0x1FFFFF & (threeBytesToLong(b.values, 5) >> 2); + final long b3 = 0x1FFFFF & (fourBytesToLong(b.values, 7) >> 7); + final long b4 = 0x1FFFFF & (fourBytesToLong(b.values, 10) >> 4); + final long b5 = 0x1FFFFF & (threeBytesToLong(b.values, 13) >> 1); + final long b6 = 0x1FFFFF & (fourBytesToLong(b.values, 15) >> 6); + final long b7 = 0x1FFFFF & (threeBytesToLong(b.values, 18) >> 3); + final long b8 = 0x1FFFFF & threeBytesToLong(b.values, 21); + final long b9 = 0x1FFFFF & (fourBytesToLong(b.values, 23) >> 5); + final long b10 = 0x1FFFFF & (threeBytesToLong(b.values, 26) >> 2); + final long b11 = (fourBytesToLong(b.values, 28) >> 7); + final long c0 = 0x1FFFFF & threeBytesToLong(c.values, 0); + final long c1 = 0x1FFFFF & (fourBytesToLong(c.values, 2) >> 5); + final long c2 = 0x1FFFFF & (threeBytesToLong(c.values, 5) >> 2); + final long c3 = 0x1FFFFF & (fourBytesToLong(c.values, 7) >> 7); + final long c4 = 0x1FFFFF & (fourBytesToLong(c.values, 10) >> 4); + final long c5 = 0x1FFFFF & (threeBytesToLong(c.values, 13) >> 1); + final long c6 = 0x1FFFFF & (fourBytesToLong(c.values, 15) >> 6); + final long c7 = 0x1FFFFF & (threeBytesToLong(c.values, 18) >> 3); + final long c8 = 0x1FFFFF & threeBytesToLong(c.values, 21); + final long c9 = 0x1FFFFF & (fourBytesToLong(c.values, 23) >> 5); + final long c10 = 0x1FFFFF & (threeBytesToLong(c.values, 26) >> 2); + final long c11 = (fourBytesToLong(c.values, 28) >> 7); + long s0; + long s1; + long s2; + long s3; + long s4; + long s5; + long s6; + long s7; + long s8; + long s9; + long s10; + long s11; + long s12; + long s13; + long s14; + long s15; + long s16; + long s17; + long s18; + long s19; + long s20; + long s21; + long s22; + long s23; + long carry0; + long carry1; + long carry2; + long carry3; + long carry4; + long carry5; + long carry6; + long carry7; + long carry8; + long carry9; + long carry10; + long carry11; + long carry12; + long carry13; + long carry14; + long carry15; + long carry16; + final long carry17; + final long carry18; + final long carry19; + final long carry20; + final long carry21; + final long carry22; + + s0 = c0 + a0 * b0; + s1 = c1 + a0 * b1 + a1 * b0; + s2 = c2 + a0 * b2 + a1 * b1 + a2 * b0; + s3 = c3 + a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0; + s4 = c4 + a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0; + s5 = c5 + a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0; + s6 = c6 + a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0; + s7 = c7 + a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 + a6 * b1 + a7 * b0; + s8 = c8 + a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 + a6 * b2 + a7 * b1 + a8 * b0; + s9 = c9 + a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 + a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0; + s10 = c10 + a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 + a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0; + s11 = c11 + a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 + a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0; + s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + a7 * b5 + a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1; + s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + a8 * b5 + a9 * b4 + a10 * b3 + a11 * b2; + s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + a9 * b5 + a10 * b4 + a11 * b3; + s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + a10 * b5 + a11 * b4; + s16 = a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5; + s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6; + s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7; + s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8; + s20 = a9 * b11 + a10 * b10 + a11 * b9; + s21 = a10 * b11 + a11 * b10; + s22 = a11 * b11; + s23 = 0; + + carry0 = (s0 + (1 << 20)) >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry2 = (s2 + (1 << 20)) >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry4 = (s4 + (1 << 20)) >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry12 = (s12 + (1 << 20)) >> 21; + s13 += carry12; + s12 -= carry12 << 21; + carry14 = (s14 + (1 << 20)) >> 21; + s15 += carry14; + s14 -= carry14 << 21; + carry16 = (s16 + (1 << 20)) >> 21; + s17 += carry16; + s16 -= carry16 << 21; + carry18 = (s18 + (1 << 20)) >> 21; + s19 += carry18; + s18 -= carry18 << 21; + carry20 = (s20 + (1 << 20)) >> 21; + s21 += carry20; + s20 -= carry20 << 21; + carry22 = (s22 + (1 << 20)) >> 21; + s23 += carry22; + s22 -= carry22 << 21; + + carry1 = (s1 + (1 << 20)) >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry3 = (s3 + (1 << 20)) >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry5 = (s5 + (1 << 20)) >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + carry13 = (s13 + (1 << 20)) >> 21; + s14 += carry13; + s13 -= carry13 << 21; + carry15 = (s15 + (1 << 20)) >> 21; + s16 += carry15; + s15 -= carry15 << 21; + carry17 = (s17 + (1 << 20)) >> 21; + s18 += carry17; + s17 -= carry17 << 21; + carry19 = (s19 + (1 << 20)) >> 21; + s20 += carry19; + s19 -= carry19 << 21; + carry21 = (s21 + (1 << 20)) >> 21; + s22 += carry21; + s21 -= carry21 << 21; + + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry12 = (s12 + (1 << 20)) >> 21; + s13 += carry12; + s12 -= carry12 << 21; + carry14 = (s14 + (1 << 20)) >> 21; + s15 += carry14; + s14 -= carry14 << 21; + carry16 = (s16 + (1 << 20)) >> 21; + s17 += carry16; + s16 -= carry16 << 21; + + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + carry13 = (s13 + (1 << 20)) >> 21; + s14 += carry13; + s13 -= carry13 << 21; + carry15 = (s15 + (1 << 20)) >> 21; + s16 += carry15; + s15 -= carry15 << 21; + + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = (s0 + (1 << 20)) >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry2 = (s2 + (1 << 20)) >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry4 = (s4 + (1 << 20)) >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + + carry1 = (s1 + (1 << 20)) >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry3 = (s3 + (1 << 20)) >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry5 = (s5 + (1 << 20)) >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry11 = s11 >> 21; + s12 += carry11; + s11 -= carry11 << 21; + + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + + final byte[] result = new byte[32]; + result[0] = (byte)(s0); + result[1] = (byte)(s0 >> 8); + result[2] = (byte)((s0 >> 16) | (s1 << 5)); + result[3] = (byte)(s1 >> 3); + result[4] = (byte)(s1 >> 11); + result[5] = (byte)((s1 >> 19) | (s2 << 2)); + result[6] = (byte)(s2 >> 6); + result[7] = (byte)((s2 >> 14) | (s3 << 7)); + result[8] = (byte)(s3 >> 1); + result[9] = (byte)(s3 >> 9); + result[10] = (byte)((s3 >> 17) | (s4 << 4)); + result[11] = (byte)(s4 >> 4); + result[12] = (byte)(s4 >> 12); + result[13] = (byte)((s4 >> 20) | (s5 << 1)); + result[14] = (byte)(s5 >> 7); + result[15] = (byte)((s5 >> 15) | (s6 << 6)); + result[16] = (byte)(s6 >> 2); + result[17] = (byte)(s6 >> 10); + result[18] = (byte)((s6 >> 18) | (s7 << 3)); + result[19] = (byte)(s7 >> 5); + result[20] = (byte)(s7 >> 13); + result[21] = (byte)(s8); + result[22] = (byte)(s8 >> 8); + result[23] = (byte)((s8 >> 16) | (s9 << 5)); + result[24] = (byte)(s9 >> 3); + result[25] = (byte)(s9 >> 11); + result[26] = (byte)((s9 >> 19) | (s10 << 2)); + result[27] = (byte)(s10 >> 6); + result[28] = (byte)((s10 >> 14) | (s11 << 7)); + result[29] = (byte)(s11 >> 1); + result[30] = (byte)(s11 >> 9); + result[31] = (byte)(s11 >> 17); + + return new Ed25519EncodedFieldElement(result); + } + + private static long threeBytesToLong(final byte[] in, int offset) { + int result = in[offset++] & 0xff; + result |= (in[offset++] & 0xff) << 8; + result |= (in[offset] & 0xff) << 16; + return result; + } + + private static long fourBytesToLong(final byte[] in, int offset) { + int result = in[offset++] & 0xff; + result |= (in[offset++] & 0xff) << 8; + result |= (in[offset++] & 0xff) << 16; + result |= in[offset] << 24; + return ((long)result) & 0xffffffffL; + } + + @Override + public int hashCode() { + return Arrays.hashCode(this.values); + } + + @Override + public boolean equals(final Object obj) { + if (!(obj instanceof Ed25519EncodedFieldElement)) { + return false; + } + + final Ed25519EncodedFieldElement encoded = (Ed25519EncodedFieldElement)obj; + return 1 == ArrayUtils.isEqualConstantTime(this.values, encoded.values); + } + + @Override + public String toString() { + return HexEncoder.getString(this.values); + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519EncodedGroupElement.java b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519EncodedGroupElement.java new file mode 100755 index 0000000..b8cb4ec --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519EncodedGroupElement.java @@ -0,0 +1,129 @@ +package org.nem.core.crypto.ed25519.arithmetic; + +import org.nem.core.utils.ArrayUtils; + +import java.util.Arrays; + +public class Ed25519EncodedGroupElement { + + private final byte[] values; + + /** + * Creates a new encoded group element. + * + * @param values The values. + */ + public Ed25519EncodedGroupElement(final byte[] values) { + if (32 != values.length) { + throw new IllegalArgumentException("Invalid encoded group element."); + } + + this.values = values; + } + + /** + * Gets the underlying byte array. + * + * @return The byte array. + */ + public byte[] getRaw() { + return this.values; + } + + /** + * Decodes this encoded group element and returns a new group element in P3 coordinates. + * + * @return The group element. + */ + public Ed25519GroupElement decode() { + final Ed25519FieldElement x = this.getAffineX(); + final Ed25519FieldElement y = this.getAffineY(); + return Ed25519GroupElement.p3(x, y, Ed25519Field.ONE, x.multiply(y)); + } + + /** + * Gets the affine x-coordinate. + * x is recovered in the following way (p = field size): + * <br> + * x = sign(x) * sqrt((y^2 - 1) / (d * y^2 + 1)) = sign(x) * sqrt(u / v) with u = y^2 - 1 and v = d * y^2 + 1. + * Setting β = (u * v^3) * (u * v^7)^((p - 5) / 8) one has β^2 = +-(u / v). + * If v * β = -u multiply β with i=sqrt(-1). + * Set x := β. + * If sign(x) != bit 255 of s then negate x. + * + * @return the affine x-coordinate. + */ + public Ed25519FieldElement getAffineX() { + Ed25519FieldElement x; + final Ed25519FieldElement y; + final Ed25519FieldElement ySquare; + final Ed25519FieldElement u; + final Ed25519FieldElement v; + final Ed25519FieldElement vxSquare; + Ed25519FieldElement checkForZero; + y = this.getAffineY(); + ySquare = y.square(); + + // u = y^2 - 1 + u = ySquare.subtract(Ed25519Field.ONE); + + // v = d * y^2 + 1 + v = ySquare.multiply(Ed25519Field.D).add(Ed25519Field.ONE); + + // x = sqrt(u / v) + x = Ed25519FieldElement.sqrt(u, v); + + vxSquare = x.square().multiply(v); + checkForZero = vxSquare.subtract(u); + if (checkForZero.isNonZero()) { + checkForZero = vxSquare.add(u); + if (checkForZero.isNonZero()) { + throw new IllegalArgumentException("not a valid Ed25519EncodedGroupElement."); + } + + x = x.multiply(Ed25519Field.I); + } + + if ((x.isNegative() ? 1 : 0) != ArrayUtils.getBit(this.values, 255)) { + x = x.negate(); + } + + return x; + } + + /** + * Gets the affine y-coordinate. + * + * @return the affine y-coordinate. + */ + public Ed25519FieldElement getAffineY() { + // The affine y-coordinate is in bits 0 to 254. + // Since the decode() method of Ed25519EncodedFieldElement ignores bit 255, + // we can use that method without problems. + final Ed25519EncodedFieldElement encoded = new Ed25519EncodedFieldElement(this.values); + return encoded.decode(); + } + + @Override + public int hashCode() { + return Arrays.hashCode(this.values); + } + + @Override + public boolean equals(final Object obj) { + if (!(obj instanceof Ed25519EncodedGroupElement)) { + return false; + } + + final Ed25519EncodedGroupElement encoded = (Ed25519EncodedGroupElement)obj; + return 1 == ArrayUtils.isEqualConstantTime(this.values, encoded.values); + } + + @Override + public String toString() { + return String.format( + "x=%s\ny=%s\n", + this.getAffineX().toString(), + this.getAffineY().toString()); + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519Field.java b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519Field.java new file mode 100755 index 0000000..12ac16c --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519Field.java @@ -0,0 +1,43 @@ +package org.nem.core.crypto.ed25519.arithmetic; + +import org.nem.core.utils.*; + +import java.math.BigInteger; + +/** + * Represents the underlying finite field for Ed25519. + * The field has p = 2^255 - 19 elements. + */ +public class Ed25519Field { + + /** + * P: 2^255 - 19 + */ + public static final BigInteger P = new BigInteger(HexEncoder.getBytes("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed")); + public static final Ed25519FieldElement ZERO = getFieldElement(0); + public static final Ed25519FieldElement ONE = getFieldElement(1); + public static final Ed25519FieldElement TWO = getFieldElement(2); + public static final Ed25519FieldElement D = getD(); + public static final Ed25519FieldElement D_Times_TWO = D.multiply(TWO); + public static final byte[] ZERO_SHORT = new byte[32]; + public static final byte[] ZERO_LONG = new byte[64]; + + /** + * I ^ 2 = -1 + */ + public static final Ed25519FieldElement I = new Ed25519EncodedFieldElement(HexEncoder.getBytes( + "b0a00e4a271beec478e42fad0618432fa7d7fb3d99004d2b0bdfc14f8024832b")).decode(); + + private static Ed25519FieldElement getFieldElement(final int value) { + final int[] f = new int[10]; + f[0] = value; + return new Ed25519FieldElement(f); + } + + private static Ed25519FieldElement getD() { + final BigInteger d = new BigInteger("-121665") + .multiply(new BigInteger("121666").modInverse(Ed25519Field.P)) + .mod(Ed25519Field.P); + return new Ed25519EncodedFieldElement(ArrayUtils.toByteArray(d, 32)).decode(); + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519FieldElement.java b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519FieldElement.java new file mode 100755 index 0000000..b611c81 --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519FieldElement.java @@ -0,0 +1,1026 @@ +package org.nem.core.crypto.ed25519.arithmetic; + +import java.util.Arrays; + +/** + * Represents a element of the finite field with p=2^255-19 elements. + * <p> + * values[0] ... values[9], represent the integer <br> + * values[0] + 2^26 * values[1] + 2^51 * values[2] + 2^77 * values[3] + 2^102 * values[4] + ... + 2^230 * values[9]. <br> + * Bounds on each values[i] vary depending on context. + * </p> + * This implementation is based on the ref10 implementation of SUPERCOP. + */ +public class Ed25519FieldElement { + private final int[] values; + + /** + * Creates a field element. + * + * @param values The 2^25.5 bit representation of the field element. + */ + public Ed25519FieldElement(final int[] values) { + if (values.length != 10) { + throw new IllegalArgumentException("Invalid 2^25.5 bit representation."); + } + + this.values = values; + } + + /** + * Gets the underlying int array. + * + * @return The int array. + */ + public int[] getRaw() { + return this.values; + } + + /** + * Gets a value indicating whether or not the field element is non-zero. + * + * @return 1 if it is non-zero, 0 otherwise. + */ + public boolean isNonZero() { + return this.encode().isNonZero(); + } + + /** + * Adds the given field element to this and returns the result. + * <b>h = this + g</b> + * <pre> + * Preconditions: + * |this| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + * |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + * Postconditions: + * |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + * </pre> + * + * @param g The field element to add. + * @return The field element this + val. + */ + public Ed25519FieldElement add(final Ed25519FieldElement g) { + final int[] gValues = g.values; + final int[] h = new int[10]; + for (int i = 0; i < 10; i++) { + h[i] = this.values[i] + gValues[i]; + } + + return new Ed25519FieldElement(h); + } + + /** + * Subtract the given field element from this and returns the result. + * <b>h = this - g</b> + * <pre> + * Preconditions: + * |this| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + * |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + * Postconditions: + * |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + * </pre> + * + * @param g The field element to subtract. + * @return The field element this - val. + */ + public Ed25519FieldElement subtract(final Ed25519FieldElement g) { + final int[] gValues = g.values; + final int[] h = new int[10]; + for (int i = 0; i < 10; i++) { + h[i] = this.values[i] - gValues[i]; + } + + return new Ed25519FieldElement(h); + } + + /** + * Negates this field element and return the result. + * <b>h = -this</b> + * <pre> + * Preconditions: + * |this| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + * Postconditions: + * |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + * </pre> + * + * @return The field element (-1) * this. + */ + public Ed25519FieldElement negate() { + final int[] h = new int[10]; + for (int i = 0; i < 10; i++) { + h[i] = -this.values[i]; + } + + return new Ed25519FieldElement(h); + } + + /** + * Multiplies this field element with the given field element and returns the result. + * <b>h = this * g</b> + * Preconditions: + * <pre> + * |this| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + * |g| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + * Postconditions: + * |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. + * </pre> + * Notes on implementation strategy: + * <br> + * Using schoolbook multiplication. Karatsuba would save a little in some + * cost models. + * <br> + * Most multiplications by 2 and 19 are 32-bit precomputations; cheaper than + * 64-bit postcomputations. + * <br> + * There is one remaining multiplication by 19 in the carry chain; one *19 + * precomputation can be merged into this, but the resulting data flow is + * considerably less clean. + * <br> + * There are 12 carries below. 10 of them are 2-way parallelizable and + * vectorizable. Can get away with 11 carries, but then data flow is much + * deeper. + * <br> + * With tighter constraints on inputs can squeeze carries into int32. + * + * @param g The field element to multiply. + * @return The (reasonably reduced) field element this * val. + */ + public Ed25519FieldElement multiply(final Ed25519FieldElement g) { + final int[] gValues = g.values; + final int f0 = this.values[0]; + final int f1 = this.values[1]; + final int f2 = this.values[2]; + final int f3 = this.values[3]; + final int f4 = this.values[4]; + final int f5 = this.values[5]; + final int f6 = this.values[6]; + final int f7 = this.values[7]; + final int f8 = this.values[8]; + final int f9 = this.values[9]; + final int g0 = gValues[0]; + final int g1 = gValues[1]; + final int g2 = gValues[2]; + final int g3 = gValues[3]; + final int g4 = gValues[4]; + final int g5 = gValues[5]; + final int g6 = gValues[6]; + final int g7 = gValues[7]; + final int g8 = gValues[8]; + final int g9 = gValues[9]; + final int g1_19 = 19 * g1; /* 1.959375*2^29 */ + final int g2_19 = 19 * g2; /* 1.959375*2^30; still ok */ + final int g3_19 = 19 * g3; + final int g4_19 = 19 * g4; + final int g5_19 = 19 * g5; + final int g6_19 = 19 * g6; + final int g7_19 = 19 * g7; + final int g8_19 = 19 * g8; + final int g9_19 = 19 * g9; + final int f1_2 = 2 * f1; + final int f3_2 = 2 * f3; + final int f5_2 = 2 * f5; + final int f7_2 = 2 * f7; + final int f9_2 = 2 * f9; + final long f0g0 = f0 * (long)g0; + final long f0g1 = f0 * (long)g1; + final long f0g2 = f0 * (long)g2; + final long f0g3 = f0 * (long)g3; + final long f0g4 = f0 * (long)g4; + final long f0g5 = f0 * (long)g5; + final long f0g6 = f0 * (long)g6; + final long f0g7 = f0 * (long)g7; + final long f0g8 = f0 * (long)g8; + final long f0g9 = f0 * (long)g9; + final long f1g0 = f1 * (long)g0; + final long f1g1_2 = f1_2 * (long)g1; + final long f1g2 = f1 * (long)g2; + final long f1g3_2 = f1_2 * (long)g3; + final long f1g4 = f1 * (long)g4; + final long f1g5_2 = f1_2 * (long)g5; + final long f1g6 = f1 * (long)g6; + final long f1g7_2 = f1_2 * (long)g7; + final long f1g8 = f1 * (long)g8; + final long f1g9_38 = f1_2 * (long)g9_19; + final long f2g0 = f2 * (long)g0; + final long f2g1 = f2 * (long)g1; + final long f2g2 = f2 * (long)g2; + final long f2g3 = f2 * (long)g3; + final long f2g4 = f2 * (long)g4; + final long f2g5 = f2 * (long)g5; + final long f2g6 = f2 * (long)g6; + final long f2g7 = f2 * (long)g7; + final long f2g8_19 = f2 * (long)g8_19; + final long f2g9_19 = f2 * (long)g9_19; + final long f3g0 = f3 * (long)g0; + final long f3g1_2 = f3_2 * (long)g1; + final long f3g2 = f3 * (long)g2; + final long f3g3_2 = f3_2 * (long)g3; + final long f3g4 = f3 * (long)g4; + final long f3g5_2 = f3_2 * (long)g5; + final long f3g6 = f3 * (long)g6; + final long f3g7_38 = f3_2 * (long)g7_19; + final long f3g8_19 = f3 * (long)g8_19; + final long f3g9_38 = f3_2 * (long)g9_19; + final long f4g0 = f4 * (long)g0; + final long f4g1 = f4 * (long)g1; + final long f4g2 = f4 * (long)g2; + final long f4g3 = f4 * (long)g3; + final long f4g4 = f4 * (long)g4; + final long f4g5 = f4 * (long)g5; + final long f4g6_19 = f4 * (long)g6_19; + final long f4g7_19 = f4 * (long)g7_19; + final long f4g8_19 = f4 * (long)g8_19; + final long f4g9_19 = f4 * (long)g9_19; + final long f5g0 = f5 * (long)g0; + final long f5g1_2 = f5_2 * (long)g1; + final long f5g2 = f5 * (long)g2; + final long f5g3_2 = f5_2 * (long)g3; + final long f5g4 = f5 * (long)g4; + final long f5g5_38 = f5_2 * (long)g5_19; + final long f5g6_19 = f5 * (long)g6_19; + final long f5g7_38 = f5_2 * (long)g7_19; + final long f5g8_19 = f5 * (long)g8_19; + final long f5g9_38 = f5_2 * (long)g9_19; + final long f6g0 = f6 * (long)g0; + final long f6g1 = f6 * (long)g1; + final long f6g2 = f6 * (long)g2; + final long f6g3 = f6 * (long)g3; + final long f6g4_19 = f6 * (long)g4_19; + final long f6g5_19 = f6 * (long)g5_19; + final long f6g6_19 = f6 * (long)g6_19; + final long f6g7_19 = f6 * (long)g7_19; + final long f6g8_19 = f6 * (long)g8_19; + final long f6g9_19 = f6 * (long)g9_19; + final long f7g0 = f7 * (long)g0; + final long f7g1_2 = f7_2 * (long)g1; + final long f7g2 = f7 * (long)g2; + final long f7g3_38 = f7_2 * (long)g3_19; + final long f7g4_19 = f7 * (long)g4_19; + final long f7g5_38 = f7_2 * (long)g5_19; + final long f7g6_19 = f7 * (long)g6_19; + final long f7g7_38 = f7_2 * (long)g7_19; + final long f7g8_19 = f7 * (long)g8_19; + final long f7g9_38 = f7_2 * (long)g9_19; + final long f8g0 = f8 * (long)g0; + final long f8g1 = f8 * (long)g1; + final long f8g2_19 = f8 * (long)g2_19; + final long f8g3_19 = f8 * (long)g3_19; + final long f8g4_19 = f8 * (long)g4_19; + final long f8g5_19 = f8 * (long)g5_19; + final long f8g6_19 = f8 * (long)g6_19; + final long f8g7_19 = f8 * (long)g7_19; + final long f8g8_19 = f8 * (long)g8_19; + final long f8g9_19 = f8 * (long)g9_19; + final long f9g0 = f9 * (long)g0; + final long f9g1_38 = f9_2 * (long)g1_19; + final long f9g2_19 = f9 * (long)g2_19; + final long f9g3_38 = f9_2 * (long)g3_19; + final long f9g4_19 = f9 * (long)g4_19; + final long f9g5_38 = f9_2 * (long)g5_19; + final long f9g6_19 = f9 * (long)g6_19; + final long f9g7_38 = f9_2 * (long)g7_19; + final long f9g8_19 = f9 * (long)g8_19; + final long f9g9_38 = f9_2 * (long)g9_19; + + /** + * Remember: 2^255 congruent 19 modulo p. + * h = h0 * 2^0 + h1 * 2^26 + h2 * 2^(26+25) + h3 * 2^(26+25+26) + ... + h9 * 2^(5*26+5*25). + * So to get the real number we would have to multiply the coefficients with the corresponding powers of 2. + * To get an idea what is going on below, look at the calculation of h0: + * h0 is the coefficient to the power 2^0 so it collects (sums) all products that have the power 2^0. + * f0 * g0 really is f0 * 2^0 * g0 * 2^0 = (f0 * g0) * 2^0. + * f1 * g9 really is f1 * 2^26 * g9 * 2^230 = f1 * g9 * 2^256 = 2 * f1 * g9 * 2^255 congruent 2 * 19 * f1 * g9 * 2^0 modulo p. + * f2 * g8 really is f2 * 2^51 * g8 * 2^204 = f2 * g8 * 2^255 congruent 19 * f2 * g8 * 2^0 modulo p. + * and so on... + */ + long h0 = f0g0 + f1g9_38 + f2g8_19 + f3g7_38 + f4g6_19 + f5g5_38 + f6g4_19 + f7g3_38 + f8g2_19 + f9g1_38; + long h1 = f0g1 + f1g0 + f2g9_19 + f3g8_19 + f4g7_19 + f5g6_19 + f6g5_19 + f7g4_19 + f8g3_19 + f9g2_19; + long h2 = f0g2 + f1g1_2 + f2g0 + f3g9_38 + f4g8_19 + f5g7_38 + f6g6_19 + f7g5_38 + f8g4_19 + f9g3_38; + long h3 = f0g3 + f1g2 + f2g1 + f3g0 + f4g9_19 + f5g8_19 + f6g7_19 + f7g6_19 + f8g5_19 + f9g4_19; + long h4 = f0g4 + f1g3_2 + f2g2 + f3g1_2 + f4g0 + f5g9_38 + f6g8_19 + f7g7_38 + f8g6_19 + f9g5_38; + long h5 = f0g5 + f1g4 + f2g3 + f3g2 + f4g1 + f5g0 + f6g9_19 + f7g8_19 + f8g7_19 + f9g6_19; + long h6 = f0g6 + f1g5_2 + f2g4 + f3g3_2 + f4g2 + f5g1_2 + f6g0 + f7g9_38 + f8g8_19 + f9g7_38; + long h7 = f0g7 + f1g6 + f2g5 + f3g4 + f4g3 + f5g2 + f6g1 + f7g0 + f8g9_19 + f9g8_19; + long h8 = f0g8 + f1g7_2 + f2g6 + f3g5_2 + f4g4 + f5g3_2 + f6g2 + f7g1_2 + f8g0 + f9g9_38; + long h9 = f0g9 + f1g8 + f2g7 + f3g6 + f4g5 + f5g4 + f6g3 + f7g2 + f8g1 + f9g0; + long carry0; + final long carry1; + final long carry2; + final long carry3; + long carry4; + final long carry5; + final long carry6; + final long carry7; + final long carry8; + final long carry9; + + /** + * |h0| <= (1.65*1.65*2^52*(1+19+19+19+19)+1.65*1.65*2^50*(38+38+38+38+38)) + * i.e. |h0| <= 1.4*2^60; narrower ranges for h2, h4, h6, h8 + * |h1| <= (1.65*1.65*2^51*(1+1+19+19+19+19+19+19+19+19)) + * i.e. |h1| <= 1.7*2^59; narrower ranges for h3, h5, h7, h9 + */ + + carry0 = (h0 + (long)(1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry4 = (h4 + (long)(1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + /* |h0| <= 2^25 */ + /* |h4| <= 2^25 */ + /* |h1| <= 1.71*2^59 */ + /* |h5| <= 1.71*2^59 */ + + carry1 = (h1 + (long)(1 << 24)) >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry5 = (h5 + (long)(1 << 24)) >> 25; + h6 += carry5; + h5 -= carry5 << 25; + /* |h1| <= 2^24; from now on fits into int32 */ + /* |h5| <= 2^24; from now on fits into int32 */ + /* |h2| <= 1.41*2^60 */ + /* |h6| <= 1.41*2^60 */ + + carry2 = (h2 + (long)(1 << 25)) >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry6 = (h6 + (long)(1 << 25)) >> 26; + h7 += carry6; + h6 -= carry6 << 26; + /* |h2| <= 2^25; from now on fits into int32 unchanged */ + /* |h6| <= 2^25; from now on fits into int32 unchanged */ + /* |h3| <= 1.71*2^59 */ + /* |h7| <= 1.71*2^59 */ + + carry3 = (h3 + (long)(1 << 24)) >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry7 = (h7 + (long)(1 << 24)) >> 25; + h8 += carry7; + h7 -= carry7 << 25; + /* |h3| <= 2^24; from now on fits into int32 unchanged */ + /* |h7| <= 2^24; from now on fits into int32 unchanged */ + /* |h4| <= 1.72*2^34 */ + /* |h8| <= 1.41*2^60 */ + + carry4 = (h4 + (long)(1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry8 = (h8 + (long)(1 << 25)) >> 26; + h9 += carry8; + h8 -= carry8 << 26; + /* |h4| <= 2^25; from now on fits into int32 unchanged */ + /* |h8| <= 2^25; from now on fits into int32 unchanged */ + /* |h5| <= 1.01*2^24 */ + /* |h9| <= 1.71*2^59 */ + + carry9 = (h9 + (long)(1 << 24)) >> 25; + h0 += carry9 * 19; + h9 -= carry9 << 25; + /* |h9| <= 2^24; from now on fits into int32 unchanged */ + /* |h0| <= 1.1*2^39 */ + + carry0 = (h0 + (long)(1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + /* |h0| <= 2^25; from now on fits into int32 unchanged */ + /* |h1| <= 1.01*2^24 */ + + final int[] h = new int[10]; + h[0] = (int)h0; + h[1] = (int)h1; + h[2] = (int)h2; + h[3] = (int)h3; + h[4] = (int)h4; + h[5] = (int)h5; + h[6] = (int)h6; + h[7] = (int)h7; + h[8] = (int)h8; + h[9] = (int)h9; + + return new Ed25519FieldElement(h); + } + + /** + * Squares this field element and returns the result. + * <b>h = this * this</b> + * <pre> + * Preconditions: + * |this| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + * Postconditions: + * |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. + * </pre> + * See multiply for discussion of implementation strategy. + * + * @return The square of this field element. + */ + public Ed25519FieldElement square() { + return this.squareAndOptionalDouble(false); + } + + /** + * Squares this field element, multiplies by two and returns the result. + * <b>h = 2 * this * this</b> + * <pre> + * Preconditions: + * |this| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + * Postconditions: + * |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. + * </pre> + * See multiply for discussion of implementation strategy. + * + * @return The square of this field element times 2. + */ + public Ed25519FieldElement squareAndDouble() { + return this.squareAndOptionalDouble(true); + } + + /** + * Squares this field element, optionally multiplies by two and returns the result. + * <b>h = 2 * this * this</b> if dbl is true or + * <b>h = this * this</b> if dbl is false. + * <pre> + * Preconditions: + * |this| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + * Postconditions: + * |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. + * </pre> + * See multiply for discussion of implementation strategy. + * + * @return The square of this field element times 2. + */ + private Ed25519FieldElement squareAndOptionalDouble(final boolean dbl) { + final int f0 = this.values[0]; + final int f1 = this.values[1]; + final int f2 = this.values[2]; + final int f3 = this.values[3]; + final int f4 = this.values[4]; + final int f5 = this.values[5]; + final int f6 = this.values[6]; + final int f7 = this.values[7]; + final int f8 = this.values[8]; + final int f9 = this.values[9]; + final int f0_2 = 2 * f0; + final int f1_2 = 2 * f1; + final int f2_2 = 2 * f2; + final int f3_2 = 2 * f3; + final int f4_2 = 2 * f4; + final int f5_2 = 2 * f5; + final int f6_2 = 2 * f6; + final int f7_2 = 2 * f7; + final int f5_38 = 38 * f5; /* 1.959375*2^30 */ + final int f6_19 = 19 * f6; /* 1.959375*2^30 */ + final int f7_38 = 38 * f7; /* 1.959375*2^30 */ + final int f8_19 = 19 * f8; /* 1.959375*2^30 */ + final int f9_38 = 38 * f9; /* 1.959375*2^30 */ + final long f0f0 = f0 * (long)f0; + final long f0f1_2 = f0_2 * (long)f1; + final long f0f2_2 = f0_2 * (long)f2; + final long f0f3_2 = f0_2 * (long)f3; + final long f0f4_2 = f0_2 * (long)f4; + final long f0f5_2 = f0_2 * (long)f5; + final long f0f6_2 = f0_2 * (long)f6; + final long f0f7_2 = f0_2 * (long)f7; + final long f0f8_2 = f0_2 * (long)f8; + final long f0f9_2 = f0_2 * (long)f9; + final long f1f1_2 = f1_2 * (long)f1; + final long f1f2_2 = f1_2 * (long)f2; + final long f1f3_4 = f1_2 * (long)f3_2; + final long f1f4_2 = f1_2 * (long)f4; + final long f1f5_4 = f1_2 * (long)f5_2; + final long f1f6_2 = f1_2 * (long)f6; + final long f1f7_4 = f1_2 * (long)f7_2; + final long f1f8_2 = f1_2 * (long)f8; + final long f1f9_76 = f1_2 * (long)f9_38; + final long f2f2 = f2 * (long)f2; + final long f2f3_2 = f2_2 * (long)f3; + final long f2f4_2 = f2_2 * (long)f4; + final long f2f5_2 = f2_2 * (long)f5; + final long f2f6_2 = f2_2 * (long)f6; + final long f2f7_2 = f2_2 * (long)f7; + final long f2f8_38 = f2_2 * (long)f8_19; + final long f2f9_38 = f2 * (long)f9_38; + final long f3f3_2 = f3_2 * (long)f3; + final long f3f4_2 = f3_2 * (long)f4; + final long f3f5_4 = f3_2 * (long)f5_2; + final long f3f6_2 = f3_2 * (long)f6; + final long f3f7_76 = f3_2 * (long)f7_38; + final long f3f8_38 = f3_2 * (long)f8_19; + final long f3f9_76 = f3_2 * (long)f9_38; + final long f4f4 = f4 * (long)f4; + final long f4f5_2 = f4_2 * (long)f5; + final long f4f6_38 = f4_2 * (long)f6_19; + final long f4f7_38 = f4 * (long)f7_38; + final long f4f8_38 = f4_2 * (long)f8_19; + final long f4f9_38 = f4 * (long)f9_38; + final long f5f5_38 = f5 * (long)f5_38; + final long f5f6_38 = f5_2 * (long)f6_19; + final long f5f7_76 = f5_2 * (long)f7_38; + final long f5f8_38 = f5_2 * (long)f8_19; + final long f5f9_76 = f5_2 * (long)f9_38; + final long f6f6_19 = f6 * (long)f6_19; + final long f6f7_38 = f6 * (long)f7_38; + final long f6f8_38 = f6_2 * (long)f8_19; + final long f6f9_38 = f6 * (long)f9_38; + final long f7f7_38 = f7 * (long)f7_38; + final long f7f8_38 = f7_2 * (long)f8_19; + final long f7f9_76 = f7_2 * (long)f9_38; + final long f8f8_19 = f8 * (long)f8_19; + final long f8f9_38 = f8 * (long)f9_38; + final long f9f9_38 = f9 * (long)f9_38; + long h0 = f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38; + long h1 = f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38; + long h2 = f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19; + long h3 = f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38; + long h4 = f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38; + long h5 = f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38; + long h6 = f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19; + long h7 = f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38; + long h8 = f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38; + long h9 = f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2; + long carry0; + final long carry1; + final long carry2; + final long carry3; + long carry4; + final long carry5; + final long carry6; + final long carry7; + final long carry8; + final long carry9; + + if (dbl) { + h0 += h0; + h1 += h1; + h2 += h2; + h3 += h3; + h4 += h4; + h5 += h5; + h6 += h6; + h7 += h7; + h8 += h8; + h9 += h9; + } + + carry0 = (h0 + (long)(1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry4 = (h4 + (long)(1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + + carry1 = (h1 + (long)(1 << 24)) >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry5 = (h5 + (long)(1 << 24)) >> 25; + h6 += carry5; + h5 -= carry5 << 25; + + carry2 = (h2 + (long)(1 << 25)) >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry6 = (h6 + (long)(1 << 25)) >> 26; + h7 += carry6; + h6 -= carry6 << 26; + + carry3 = (h3 + (long)(1 << 24)) >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry7 = (h7 + (long)(1 << 24)) >> 25; + h8 += carry7; + h7 -= carry7 << 25; + + carry4 = (h4 + (long)(1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry8 = (h8 + (long)(1 << 25)) >> 26; + h9 += carry8; + h8 -= carry8 << 26; + + carry9 = (h9 + (long)(1 << 24)) >> 25; + h0 += carry9 * 19; + h9 -= carry9 << 25; + + carry0 = (h0 + (long)(1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + + final int[] h = new int[10]; + h[0] = (int)h0; + h[1] = (int)h1; + h[2] = (int)h2; + h[3] = (int)h3; + h[4] = (int)h4; + h[5] = (int)h5; + h[6] = (int)h6; + h[7] = (int)h7; + h[8] = (int)h8; + h[9] = (int)h9; + return new Ed25519FieldElement(h); + } + + /** + * Invert this field element and return the result. + * The inverse is found via Fermat's little theorem: + * a^p congruent a mod p and therefore a^(p-2) congruent a^-1 mod p + * + * @return The inverse of this field element. + */ + public Ed25519FieldElement invert() { + Ed25519FieldElement f0, f1; + + // comments describe how exponent is created + + // 2 == 2 * 1 + f0 = this.square(); + + // 9 == 9 + f1 = this.pow2to9(); + + // 11 == 9 + 2 + f0 = f0.multiply(f1); + + // 2^252 - 2^2 + f1 = this.pow2to252sub4(); + + // 2^255 - 2^5 + for (int i = 1; i < 4; ++i) { + f1 = f1.square(); + } + + // 2^255 - 21 + return f1.multiply(f0); + } + + /** + * Computes this field element to the power of (2^9) and returns the result. + * + * @return This field element to the power of (2^9). + */ + private Ed25519FieldElement pow2to9() { + Ed25519FieldElement f; + + // 2 == 2 * 1 + f = this.square(); + + // 4 == 2 * 2 + f = f.square(); + + // 8 == 2 * 4 + f = f.square(); + + // 9 == 1 + 8 + return this.multiply(f); + } + + /** + * Computes this field element to the power of (2^252 - 4) and returns the result. + * This is a helper function for calculating the square root. + * + * @return This field element to the power of (2^252 - 4). + */ + private Ed25519FieldElement pow2to252sub4() { + Ed25519FieldElement f0, f1, f2; + + // 2 == 2 * 1 + f0 = this.square(); + + // 9 + f1 = this.pow2to9(); + + // 11 == 9 + 2 + f0 = f0.multiply(f1); + + // 22 == 2 * 11 + f0 = f0.square(); + + // 31 == 22 + 9 + f0 = f1.multiply(f0); + + // 2^6 - 2^1 + f1 = f0.square(); + + // 2^10 - 2^5 + for (int i = 1; i < 5; ++i) { + f1 = f1.square(); + } + + // 2^10 - 2^0 + f0 = f1.multiply(f0); + + // 2^11 - 2^1 + f1 = f0.square(); + + // 2^20 - 2^10 + for (int i = 1; i < 10; ++i) { + f1 = f1.square(); + } + + // 2^20 - 2^0 + f1 = f1.multiply(f0); + + // 2^21 - 2^1 + f2 = f1.square(); + + // 2^40 - 2^20 + for (int i = 1; i < 20; ++i) { + f2 = f2.square(); + } + + // 2^40 - 2^0 + f1 = f2.multiply(f1); + + // 2^41 - 2^1 + f1 = f1.square(); + + // 2^50 - 2^10 + for (int i = 1; i < 10; ++i) { + f1 = f1.square(); + } + + // 2^50 - 2^0 + f0 = f1.multiply(f0); + + // 2^51 - 2^1 + f1 = f0.square(); + + // 2^100 - 2^50 + for (int i = 1; i < 50; ++i) { + f1 = f1.square(); + } + + // 2^100 - 2^0 + f1 = f1.multiply(f0); + + // 2^101 - 2^1 + f2 = f1.square(); + + // 2^200 - 2^100 + for (int i = 1; i < 100; ++i) { + f2 = f2.square(); + } + + // 2^200 - 2^0 + f1 = f2.multiply(f1); + + // 2^201 - 2^1 + f1 = f1.square(); + + // 2^250 - 2^50 + for (int i = 1; i < 50; ++i) { + f1 = f1.square(); + } + + // 2^250 - 2^0 + f0 = f1.multiply(f0); + + // 2^251 - 2^1 + f0 = f0.square(); + + // 2^252 - 2^2 + return f0.square(); + } + + /** + * Calculates and returns one of the square roots of u / v. + * <pre>{@code + * x = (u * v^3) * (u * v^7)^((p - 5) / 8) ==> x^2 = +-(u / v). + * }</pre> + * Note that this means x can be sqrt(u / v), -sqrt(u / v), +i * sqrt(u / v), -i * sqrt(u / v). + * + * @param u The nominator of the fraction. + * @param v The denominator of the fraction. + * @return The square root of u / v. + */ + public static Ed25519FieldElement sqrt(final Ed25519FieldElement u, final Ed25519FieldElement v) { + Ed25519FieldElement x; + final Ed25519FieldElement v3; + + // v3 = v^3 + v3 = v.square().multiply(v); + + // x = (v3^2) * v * u = u * v^7 + x = v3.square().multiply(v).multiply(u); + + // x = (u * v^7)^((q - 5) / 8) + x = x.pow2to252sub4().multiply(x); // 2^252 - 3 + + // x = u * v^3 * (u * v^7)^((q - 5) / 8) + x = v3.multiply(u).multiply(x); + + return x; + } + + /** + * Reduce this field element modulo field size p = 2^255 - 19 and return the result. + * The idea for the modulo p reduction algorithm is as follows: + * <pre> + * {@code + * Assumption: + * p = 2^255 - 19 + * h = h0 + 2^25 * h1 + 2^(26+25) * h2 + ... + 2^230 * h9 where 0 <= |hi| < 2^27 for all i=0,...,9. + * h congruent r modulo p, i.e. h = r + q * p for some suitable 0 <= r < p and an integer q. + * <br> + * Then q = [2^-255 * (h + 19 * 2^-25 * h9 + 1/2)] where [x] = floor(x). + * <br> + * Proof: + * We begin with some very raw estimation for the bounds of some expressions: + * |h| < 2^230 * 2^30 = 2^260 ==> |r + q * p| < 2^260 ==> |q| < 2^10. + * ==> -1/4 <= a := 19^2 * 2^-255 * q < 1/4. + * |h - 2^230 * h9| = |h0 + ... + 2^204 * h8| < 2^204 * 2^30 = 2^234. + * ==> -1/4 <= b := 19 * 2^-255 * (h - 2^230 * h9) < 1/4 + * Therefore 0 < 1/2 - a - b < 1. + * Set x := r + 19 * 2^-255 * r + 1/2 - a - b then + * 0 <= x < 255 - 20 + 19 + 1 = 2^255 ==> 0 <= 2^-255 * x < 1. Since q is an integer we have + * [q + 2^-255 * x] = q (1) + * Have a closer look at x: + * x = h - q * (2^255 - 19) + 19 * 2^-255 * (h - q * (2^255 - 19)) + 1/2 - 19^2 * 2^-255 * q - 19 * 2^-255 * (h - 2^230 * h9) + * = h - q * 2^255 + 19 * q + 19 * 2^-255 * h - 19 * q + 19^2 * 2^-255 * q + 1/2 - 19^2 * 2^-255 * q - 19 * 2^-255 * h + 19 * 2^-25 * h9 + * = h + 19 * 2^-25 * h9 + 1/2 - q^255. + * Inserting the expression for x into (1) we get the desired expression for q. + * } + * </pre> + * + * @return The mod p reduced field element; + */ + private Ed25519FieldElement modP() { + int h0 = this.values[0]; + int h1 = this.values[1]; + int h2 = this.values[2]; + int h3 = this.values[3]; + int h4 = this.values[4]; + int h5 = this.values[5]; + int h6 = this.values[6]; + int h7 = this.values[7]; + int h8 = this.values[8]; + int h9 = this.values[9]; + int q; + final int carry0; + final int carry1; + final int carry2; + final int carry3; + final int carry4; + final int carry5; + final int carry6; + final int carry7; + final int carry8; + final int carry9; + + // Calculate q + q = (19 * h9 + (1 << 24)) >> 25; + q = (h0 + q) >> 26; + q = (h1 + q) >> 25; + q = (h2 + q) >> 26; + q = (h3 + q) >> 25; + q = (h4 + q) >> 26; + q = (h5 + q) >> 25; + q = (h6 + q) >> 26; + q = (h7 + q) >> 25; + q = (h8 + q) >> 26; + q = (h9 + q) >> 25; + + // r = h - q * p = h - 2^255 * q + 19 * q + // First add 19 * q then discard the bit 255 + h0 += 19 * q; + + carry0 = h0 >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry1 = h1 >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry2 = h2 >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry3 = h3 >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry4 = h4 >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry5 = h5 >> 25; + h6 += carry5; + h5 -= carry5 << 25; + carry6 = h6 >> 26; + h7 += carry6; + h6 -= carry6 << 26; + carry7 = h7 >> 25; + h8 += carry7; + h7 -= carry7 << 25; + carry8 = h8 >> 26; + h9 += carry8; + h8 -= carry8 << 26; + carry9 = h9 >> 25; + h9 -= carry9 << 25; + + final int[] h = new int[10]; + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; + + return new Ed25519FieldElement(h); + } + + /** + * Encodes a given field element in its 32 byte 2^8 bit representation. This is done in two steps. + * Step 1: Reduce the value of the field element modulo p. + * Step 2: Convert the field element to the 32 byte representation. + * + * @return Encoded field element (32 bytes). + */ + public Ed25519EncodedFieldElement encode() { + // Step 1: + final Ed25519FieldElement g = this.modP(); + final int[] gValues = g.getRaw(); + final int h0 = gValues[0]; + final int h1 = gValues[1]; + final int h2 = gValues[2]; + final int h3 = gValues[3]; + final int h4 = gValues[4]; + final int h5 = gValues[5]; + final int h6 = gValues[6]; + final int h7 = gValues[7]; + final int h8 = gValues[8]; + final int h9 = gValues[9]; + + // Step 2: + final byte[] s = new byte[32]; + s[0] = (byte)(h0); + s[1] = (byte)(h0 >> 8); + s[2] = (byte)(h0 >> 16); + s[3] = (byte)((h0 >> 24) | (h1 << 2)); + s[4] = (byte)(h1 >> 6); + s[5] = (byte)(h1 >> 14); + s[6] = (byte)((h1 >> 22) | (h2 << 3)); + s[7] = (byte)(h2 >> 5); + s[8] = (byte)(h2 >> 13); + s[9] = (byte)((h2 >> 21) | (h3 << 5)); + s[10] = (byte)(h3 >> 3); + s[11] = (byte)(h3 >> 11); + s[12] = (byte)((h3 >> 19) | (h4 << 6)); + s[13] = (byte)(h4 >> 2); + s[14] = (byte)(h4 >> 10); + s[15] = (byte)(h4 >> 18); + s[16] = (byte)(h5); + s[17] = (byte)(h5 >> 8); + s[18] = (byte)(h5 >> 16); + s[19] = (byte)((h5 >> 24) | (h6 << 1)); + s[20] = (byte)(h6 >> 7); + s[21] = (byte)(h6 >> 15); + s[22] = (byte)((h6 >> 23) | (h7 << 3)); + s[23] = (byte)(h7 >> 5); + s[24] = (byte)(h7 >> 13); + s[25] = (byte)((h7 >> 21) | (h8 << 4)); + s[26] = (byte)(h8 >> 4); + s[27] = (byte)(h8 >> 12); + s[28] = (byte)((h8 >> 20) | (h9 << 6)); + s[29] = (byte)(h9 >> 2); + s[30] = (byte)(h9 >> 10); + s[31] = (byte)(h9 >> 18); + + return new Ed25519EncodedFieldElement(s); + } + + /** + * Return true if this is in {1,3,5,...,q-2} + * Return false if this is in {0,2,4,...,q-1} + * <pre> + * Preconditions: + * |x| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + * </pre> + * + * @return true if this is in {1,3,5,...,q-2}, false otherwise. + */ + public boolean isNegative() { + return this.encode().isNegative(); + } + + @Override + public int hashCode() { + return Arrays.hashCode(this.values); + } + + @Override + public boolean equals(final Object obj) { + if (!(obj instanceof Ed25519FieldElement)) { + return false; + } + + final Ed25519FieldElement f = (Ed25519FieldElement)obj; + return this.encode().equals(f.encode()); + } + + @Override + public String toString() { + return this.encode().toString(); + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519Group.java b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519Group.java new file mode 100755 index 0000000..ca222e0 --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519Group.java @@ -0,0 +1,36 @@ +package org.nem.core.crypto.ed25519.arithmetic; + +import org.nem.core.utils.HexEncoder; + +import java.math.BigInteger; + +/** + * Represents the underlying group for Ed25519. + */ +public class Ed25519Group { + + /** + * 2^252 - 27742317777372353535851937790883648493 + */ + public static final BigInteger GROUP_ORDER = BigInteger.ONE.shiftLeft(252).add(new BigInteger("27742317777372353535851937790883648493")); + + /** + * <pre>{@code + * (x, 4/5); x > 0 + * }</pre> + */ + public static final Ed25519GroupElement BASE_POINT = getBasePoint(); + + // different representations of zero + public static final Ed25519GroupElement ZERO_P3 = Ed25519GroupElement.p3(Ed25519Field.ZERO, Ed25519Field.ONE, Ed25519Field.ONE, Ed25519Field.ZERO); + public static final Ed25519GroupElement ZERO_P2 = Ed25519GroupElement.p2(Ed25519Field.ZERO, Ed25519Field.ONE, Ed25519Field.ONE); + public static final Ed25519GroupElement ZERO_PRECOMPUTED = Ed25519GroupElement.precomputed(Ed25519Field.ONE, Ed25519Field.ONE, Ed25519Field.ZERO); + + private static Ed25519GroupElement getBasePoint() { + final byte[] rawEncodedGroupElement = HexEncoder.getBytes("5866666666666666666666666666666666666666666666666666666666666666"); + final Ed25519GroupElement basePoint = new Ed25519EncodedGroupElement(rawEncodedGroupElement).decode(); + basePoint.precomputeForScalarMultiplication(); + basePoint.precomputeForDoubleScalarMultiplication(); + return basePoint; + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519GroupElement.java b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519GroupElement.java new file mode 100755 index 0000000..19a7d58 --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/crypto/ed25519/arithmetic/Ed25519GroupElement.java @@ -0,0 +1,1012 @@ +package org.nem.core.crypto.ed25519.arithmetic; + +import how.monero.hodl.crypto.Scalar; +import how.monero.hodl.jni.CryptoOpsUtil; +import org.nem.core.utils.ByteUtils; + +import java.io.Serializable; +import java.util.*; + +/** + * A point on the ED25519 curve which represents a group element. + * This implementation is based on the ref10 implementation of SUPERCOP. + * <br> + * Literature: + * [1] Daniel J. Bernstein, Niels Duif, Tanja Lange, Peter Schwabe and Bo-Yin Yang : High-speed high-security signatures + * [2] Huseyin Hisil, Kenneth Koon-Ho Wong, Gary Carter, Ed Dawson: Twisted Edwards Curves Revisited + * [3] Daniel J. Bernsteina, Tanja Lange: A complete set of addition laws for incomplete Edwards curves + * [4] Daniel J. Bernstein, Peter Birkner, Marc Joye, Tanja Lange and Christiane Peters: Twisted Edwards Curves + * [5] Christiane Pascale Peters: Curves, Codes, and Cryptography (PhD thesis) + * [6] Daniel J. Bernstein, Peter Birkner, Tanja Lange and Christiane Peters: Optimizing double-base elliptic-curve single-scalar multiplication + */ +public class Ed25519GroupElement implements Serializable { + + private final CoordinateSystem coordinateSystem; + @SuppressWarnings("NonConstantFieldWithUpperCaseName") + private final Ed25519FieldElement X; + @SuppressWarnings("NonConstantFieldWithUpperCaseName") + private final Ed25519FieldElement Y; + @SuppressWarnings("NonConstantFieldWithUpperCaseName") + private final Ed25519FieldElement Z; + @SuppressWarnings("NonConstantFieldWithUpperCaseName") + private final Ed25519FieldElement T; + + /** + * Precomputed table for a single scalar multiplication. + */ + private Ed25519GroupElement[][] precomputedForSingle; + + /** + * Precomputed table for a double scalar multiplication + */ + private Ed25519GroupElement[] precomputedForDouble; + + //region constructors + + /** + * Creates a new group element using the AFFINE coordinate system. + * + * @param x The x coordinate. + * @param y The y coordinate. + * @param Z The Z coordinate. + * @return The group element using the P2 coordinate system. + */ + public static Ed25519GroupElement affine( + final Ed25519FieldElement x, + final Ed25519FieldElement y, + final Ed25519FieldElement Z) { + return new Ed25519GroupElement(CoordinateSystem.AFFINE, x, y, Z, null); + } + + /** + * Creates a new group element using the P2 coordinate system. + * + * @param X The X coordinate. + * @param Y The Y coordinate. + * @param Z The Z coordinate. + * @return The group element using the P2 coordinate system. + */ + public static Ed25519GroupElement p2( + final Ed25519FieldElement X, + final Ed25519FieldElement Y, + final Ed25519FieldElement Z) { + return new Ed25519GroupElement(CoordinateSystem.P2, X, Y, Z, null); + } + + /** + * Creates a new group element using the P3 coordinate system. + * + * @param X The X coordinate. + * @param Y The Y coordinate. + * @param Z The Z coordinate. + * @param T The T coordinate. + * @return The group element using the P3 coordinate system. + */ + public static Ed25519GroupElement p3( + final Ed25519FieldElement X, + final Ed25519FieldElement Y, + final Ed25519FieldElement Z, + final Ed25519FieldElement T) { + return new Ed25519GroupElement(CoordinateSystem.P3, X, Y, Z, T); + } + + /** + * Creates a new group element using the P1xP1 coordinate system. + * + * @param X The X coordinate. + * @param Y The Y coordinate. + * @param Z The Z coordinate. + * @param T The T coordinate. + * @return The group element using the P1xP1 coordinate system. + */ + public static Ed25519GroupElement p1xp1( + final Ed25519FieldElement X, + final Ed25519FieldElement Y, + final Ed25519FieldElement Z, + final Ed25519FieldElement T) { + return new Ed25519GroupElement(CoordinateSystem.P1xP1, X, Y, Z, T); + } + + /** + * Creates a new group element using the PRECOMPUTED coordinate system. + * + * @param yPlusx The y + x value. + * @param yMinusx The y - x value. + * @param xy2d The 2 * d * x * y value. + * @return The group element using the PRECOMPUTED coordinate system. + */ + public static Ed25519GroupElement precomputed( + final Ed25519FieldElement yPlusx, + final Ed25519FieldElement yMinusx, + final Ed25519FieldElement xy2d) { + //noinspection SuspiciousNameCombination + return new Ed25519GroupElement(CoordinateSystem.PRECOMPUTED, yPlusx, yMinusx, xy2d, null); + } + + /** + * Creates a new group element using the CACHED coordinate system. + * + * @param YPlusX The Y + X value. + * @param YMinusX The Y - X value. + * @param Z The Z coordinate. + * @param T2d The 2 * d * T value. + * @return The group element using the CACHED coordinate system. + */ + public static Ed25519GroupElement cached( + final Ed25519FieldElement YPlusX, + final Ed25519FieldElement YMinusX, + final Ed25519FieldElement Z, + final Ed25519FieldElement T2d) { + return new Ed25519GroupElement(CoordinateSystem.CACHED, YPlusX, YMinusX, Z, T2d); + } + + /** + * Creates a group element for a curve. + * + * @param coordinateSystem The coordinate system used for the group element. + * @param X The X coordinate. + * @param Y The Y coordinate. + * @param Z The Z coordinate. + * @param T The T coordinate. + */ + public Ed25519GroupElement( + final CoordinateSystem coordinateSystem, + final Ed25519FieldElement X, + final Ed25519FieldElement Y, + final Ed25519FieldElement Z, + final Ed25519FieldElement T) { + this.coordinateSystem = coordinateSystem; + this.X = X; + this.Y = Y; + this.Z = Z; + this.T = T; + } + + //endregion + + //region accessors + + /** + * Gets the coordinate system for the group element. + * + * @return The coordinate system. + */ + public CoordinateSystem getCoordinateSystem() { + return this.coordinateSystem; + } + + /** + * Gets the X value of the group element. + * This is for most coordinate systems the projective X coordinate. + * + * @return The X value. + */ + public Ed25519FieldElement getX() { + return this.X; + } + + /** + * Gets the Y value of the group element. + * This is for most coordinate systems the projective Y coordinate. + * + * @return The Y value. + */ + public Ed25519FieldElement getY() { + return this.Y; + } + + /** + * Gets the Z value of the group element. + * This is for most coordinate systems the projective Z coordinate. + * + * @return The Z value. + */ + public Ed25519FieldElement getZ() { + return this.Z; + } + + /** + * Gets the T value of the group element. + * This is for most coordinate systems the projective T coordinate. + * + * @return The T value. + */ + public Ed25519FieldElement getT() { + return this.T; + } + + /** + * Gets a value indicating whether or not the group element has a + * precomputed table for double scalar multiplication. + * + * @return true if it has the table, false otherwise. + */ + public boolean isPrecomputedForDoubleScalarMultiplication() { + return null != this.precomputedForDouble; + } + + /** + * Gets the table with the precomputed group elements for single scalar multiplication. + * + * @return The precomputed table. + */ + public Ed25519GroupElement[][] getPrecomputedForSingle() { + return this.precomputedForSingle; + } + + /** + * Gets the table with the precomputed group elements for double scalar multiplication. + * + * @return The precomputed table. + */ + public Ed25519GroupElement[] getPrecomputedForDouble() { + return this.precomputedForDouble; + } + + //endregion + + /** + * Converts the group element to an encoded point on the curve. + * + * @return The encoded point as byte array. + */ + public Ed25519EncodedGroupElement encode() { + switch (this.coordinateSystem) { + case P2: + case P3: + final Ed25519FieldElement inverse = this.Z.invert(); + final Ed25519FieldElement x = this.X.multiply(inverse); + final Ed25519FieldElement y = this.Y.multiply(inverse); + final byte[] s = y.encode().getRaw(); + s[s.length - 1] |= (x.isNegative() ? (byte)0x80 : 0); + + return new Ed25519EncodedGroupElement(s); + default: + return this.toP2().encode(); + } + } + + /** + * Converts the group element to the P2 coordinate system. + * + * @return The group element in the P2 coordinate system. + */ + public Ed25519GroupElement toP2() { + return this.toCoordinateSystem(CoordinateSystem.P2); + } + + /** + * Converts the group element to the P3 coordinate system. + * + * @return The group element in the P3 coordinate system. + */ + public Ed25519GroupElement toP3() { + return this.toCoordinateSystem(CoordinateSystem.P3); + } + + /** + * Converts the group element to the CACHED coordinate system. + * + * @return The group element in the CACHED coordinate system. + */ + public Ed25519GroupElement toCached() { + return this.toCoordinateSystem(CoordinateSystem.CACHED); + } + + /** + * Convert a Ed25519GroupElement from one coordinate system to another. + * <br> + * Supported conversions: + * - P3 -> P2 + * - P3 -> CACHED (1 multiply, 1 add, 1 subtract) + * - P1xP1 -> P2 (3 multiply) + * - P1xP1 -> P3 (4 multiply) + * + * @param newCoordinateSystem The coordinate system to convert to. + * @return A new group element in the new coordinate system. + */ + private Ed25519GroupElement toCoordinateSystem(final CoordinateSystem newCoordinateSystem) { + switch (this.coordinateSystem) { + case P2: + switch (newCoordinateSystem) { + case P2: + return p2(this.X, this.Y, this.Z); + default: + throw new IllegalArgumentException(); + } + case P3: + switch (newCoordinateSystem) { + case P2: + return p2(this.X, this.Y, this.Z); + case P3: + return p3(this.X, this.Y, this.Z, this.T); + case CACHED: + return cached(this.Y.add(this.X), this.Y.subtract(this.X), this.Z, this.T.multiply(Ed25519Field.D_Times_TWO)); + default: + throw new IllegalArgumentException(); + } + case P1xP1: + switch (newCoordinateSystem) { + case P2: + return p2(this.X.multiply(this.T), this.Y.multiply(this.Z), this.Z.multiply(this.T)); + case P3: + return p3(this.X.multiply(this.T), this.Y.multiply(this.Z), this.Z.multiply(this.T), this.X.multiply(this.Y)); + case P1xP1: + return p1xp1(this.X, this.Y, this.Z, this.T); + default: + throw new IllegalArgumentException(); + } + case PRECOMPUTED: + switch (newCoordinateSystem) { + case PRECOMPUTED: + //noinspection SuspiciousNameCombination + return precomputed(this.X, this.Y, this.Z); + default: + throw new IllegalArgumentException(); + } + case CACHED: + switch (newCoordinateSystem) { + case CACHED: + return cached(this.X, this.Y, this.Z, this.T); + default: + throw new IllegalArgumentException(); + } + default: + throw new UnsupportedOperationException(); + } + } + + /** + * Precomputes the group elements needed to speed up a scalar multiplication. + */ + public void precomputeForScalarMultiplication() { + if (null != this.precomputedForSingle) { + return; + } + + Ed25519GroupElement Bi = this; + this.precomputedForSingle = new Ed25519GroupElement[32][8]; + + for (int i = 0; i < 32; i++) { + Ed25519GroupElement Bij = Bi; + for (int j = 0; j < 8; j++) { + final Ed25519FieldElement inverse = Bij.Z.invert(); + final Ed25519FieldElement x = Bij.X.multiply(inverse); + final Ed25519FieldElement y = Bij.Y.multiply(inverse); + this.precomputedForSingle[i][j] = precomputed(y.add(x), y.subtract(x), x.multiply(y).multiply(Ed25519Field.D_Times_TWO)); + Bij = Bij.add(Bi.toCached()).toP3(); + } + // Only every second summand is precomputed (16^2 = 256). + for (int k = 0; k < 8; k++) { + Bi = Bi.add(Bi.toCached()).toP3(); + } + } + } + + /** + * Precomputes the group elements used to speed up a double scalar multiplication. + */ + public void precomputeForDoubleScalarMultiplication() { + if (null != this.precomputedForDouble) { + return; + } + Ed25519GroupElement Bi = this; + this.precomputedForDouble = new Ed25519GroupElement[8]; + for (int i = 0; i < 8; i++) { + final Ed25519FieldElement inverse = Bi.Z.invert(); + final Ed25519FieldElement x = Bi.X.multiply(inverse); + final Ed25519FieldElement y = Bi.Y.multiply(inverse); + this.precomputedForDouble[i] = precomputed(y.add(x), y.subtract(x), x.multiply(y).multiply(Ed25519Field.D_Times_TWO)); + Bi = this.add(this.add(Bi.toCached()).toP3().toCached()).toP3(); + } + } + + /** + * Doubles a given group element p in P^2 or P^3 coordinate system and returns the result in P x P coordinate system. + * r = 2 * p where p = (X : Y : Z) or p = (X : Y : Z : T) + * <br> + * r in P x P coordinate system: + * <br> + * r = ((X' : Z'), (Y' : T')) where + * X' = (X + Y)^2 - (Y^2 + X^2) + * Y' = Y^2 + X^2 + * Z' = y^2 - X^2 + * T' = 2 * Z^2 - (y^2 - X^2) + * <br> + * r converted from P x P to P^2 coordinate system: + * <br> + * r = (X'' : Y'' : Z'') where + * X'' = X' * T' = ((X + Y)^2 - Y^2 - X^2) * (2 * Z^2 - (y^2 - X^2)) + * Y'' = Y' * Z' = (Y^2 + X^2) * (y^2 - X^2) + * Z'' = Z' * T' = (y^2 - X^2) * (2 * Z^2 - (y^2 - X^2)) + * <br> + * Formula for the P^2 coordinate system is in agreement with the formula given in [4] page 12 (with a = -1) + * (up to a common factor -1 which does not matter): + * <br> + * B = (X + Y)^2; C = X^2; D = Y^2; E = -C = -X^2; F := E + D = Y^2 - X^2; H = Z^2; J = F − 2 * H; + * X3 = (B − C − D) · J = X' * (-T'); + * Y3 = F · (E − D) = Z' * (-Y'); + * Z3 = F · J = Z' * (-T'). + * + * @return The doubled group element in the P x P coordinate system. + */ + public Ed25519GroupElement dbl() { + switch (this.coordinateSystem) { + case P2: + case P3: + final Ed25519FieldElement XSquare; + final Ed25519FieldElement YSquare; + final Ed25519FieldElement B; + final Ed25519FieldElement A; + final Ed25519FieldElement ASquare; + final Ed25519FieldElement YSquarePlusXSquare; + final Ed25519FieldElement YSquareMinusXSquare; + XSquare = this.X.square(); + YSquare = this.Y.square(); + B = this.Z.squareAndDouble(); + A = this.X.add(this.Y); + ASquare = A.square(); + YSquarePlusXSquare = YSquare.add(XSquare); + YSquareMinusXSquare = YSquare.subtract(XSquare); + return p1xp1(ASquare.subtract(YSquarePlusXSquare), YSquarePlusXSquare, YSquareMinusXSquare, B.subtract(YSquareMinusXSquare)); + default: + throw new UnsupportedOperationException(); + } + } + + /** + * Ed25519GroupElement addition using the twisted Edwards addition law for extended coordinates. + * this must be given in P^3 coordinate system and g in PRECOMPUTED coordinate system. + * r = this + g where this = (X1 : Y1 : Z1 : T1), g = (g.X, g.Y, g.Z) = (Y2/Z2 + X2/Z2, Y2/Z2 - X2/Z2, 2 * d * X2/Z2 * Y2/Z2) + * <br> + * r in P x P coordinate system: + * <br> + * r = ((X' : Z'), (Y' : T')) where + * X' = (Y1 + X1) * g.X - (Y1 - X1) * q.Y = ((Y1 + X1) * (Y2 + X2) - (Y1 - X1) * (Y2 - X2)) * 1/Z2 + * Y' = (Y1 + X1) * g.X + (Y1 - X1) * q.Y = ((Y1 + X1) * (Y2 + X2) + (Y1 - X1) * (Y2 - X2)) * 1/Z2 + * Z' = 2 * Z1 + T1 * g.Z = 2 * Z1 + T1 * 2 * d * X2 * Y2 * 1/Z2^2 = (2 * Z1 * Z2 + 2 * d * T1 * T2) * 1/Z2 + * T' = 2 * Z1 - T1 * g.Z = 2 * Z1 - T1 * 2 * d * X2 * Y2 * 1/Z2^2 = (2 * Z1 * Z2 - 2 * d * T1 * T2) * 1/Z2 + * <br> + * Formula for the P x P coordinate system is in agreement with the formula given in + * file ge25519.c method add_p1p1() in ref implementation. + * Setting A = (Y1 - X1) * (Y2 - X2), B = (Y1 + X1) * (Y2 + X2), C = 2 * d * T1 * T2, D = 2 * Z1 * Z2 we get + * X' = (B - A) * 1/Z2 + * Y' = (B + A) * 1/Z2 + * Z' = (D + C) * 1/Z2 + * T' = (D - C) * 1/Z2 + * <br> + * r converted from P x P to P^2 coordinate system: + * <br> + * r = (X'' : Y'' : Z'' : T'') where + * X'' = X' * T' = (B - A) * (D - C) * 1/Z2^2 + * Y'' = Y' * Z' = (B + A) * (D + C) * 1/Z2^2 + * Z'' = Z' * T' = (D + C) * (D - C) * 1/Z2^2 + * T'' = X' * Y' = (B - A) * (B + A) * 1/Z2^2 + * <br> + * Formula above for the P^2 coordinate system is in agreement with the formula given in [2] page 6 + * (the common factor 1/Z2^2 does not matter) + * E = B - A, F = D - C, G = D + C, H = B + A + * X3 = E * F = (B - A) * (D - C); + * Y3 = G * H = (D + C) * (B + A); + * Z3 = F * G = (D - C) * (D + C); + * T3 = E * H = (B - A) * (B + A); + * + * @param g The group element to add. + * @return The resulting group element in the P x P coordinate system. + */ + private Ed25519GroupElement precomputedAdd(final Ed25519GroupElement g) { + if (this.coordinateSystem != CoordinateSystem.P3) { + throw new UnsupportedOperationException(); + } + if (g.coordinateSystem != CoordinateSystem.PRECOMPUTED) { + throw new IllegalArgumentException(); + } + + final Ed25519FieldElement YPlusX; + final Ed25519FieldElement YMinusX; + final Ed25519FieldElement A; + final Ed25519FieldElement B; + final Ed25519FieldElement C; + final Ed25519FieldElement D; + YPlusX = this.Y.add(this.X); + YMinusX = this.Y.subtract(this.X); + A = YPlusX.multiply(g.X); + B = YMinusX.multiply(g.Y); + C = g.Z.multiply(this.T); + D = this.Z.add(this.Z); + + return p1xp1(A.subtract(B), A.add(B), D.add(C), D.subtract(C)); + } + + /** + * Ed25519GroupElement subtraction using the twisted Edwards addition law for extended coordinates. + * this must be given in P^3 coordinate system and g in PRECOMPUTED coordinate system. + * r = this - g where this = (X1 : Y1 : Z1 : T1), g = (g.X, g.Y, g.Z) = (Y2/Z2 + X2/Z2, Y2/Z2 - X2/Z2, 2 * d * X2/Z2 * Y2/Z2) + * <br> + * Negating g means negating the value of X2 and T2 (the latter is irrelevant here). + * The formula is in accordance to the above addition. + * + * @param g he group element to subtract. + * @return The result in the P x P coordinate system. + */ + private Ed25519GroupElement precomputedSubtract(final Ed25519GroupElement g) { + if (this.coordinateSystem != CoordinateSystem.P3) { + throw new UnsupportedOperationException(); + } + if (g.coordinateSystem != CoordinateSystem.PRECOMPUTED) { + throw new IllegalArgumentException(); + } + + final Ed25519FieldElement YPlusX; + final Ed25519FieldElement YMinusX; + final Ed25519FieldElement A; + final Ed25519FieldElement B; + final Ed25519FieldElement C; + final Ed25519FieldElement D; + YPlusX = this.Y.add(this.X); + YMinusX = this.Y.subtract(this.X); + A = YPlusX.multiply(g.Y); + B = YMinusX.multiply(g.X); + C = g.Z.multiply(this.T); + D = this.Z.add(this.Z); + + return p1xp1(A.subtract(B), A.add(B), D.subtract(C), D.add(C)); + } + + /** + * Ed25519GroupElement addition using the twisted Edwards addition law for extended coordinates. + * this must be given in P^3 coordinate system and g in CACHED coordinate system. + * r = this + g where this = (X1 : Y1 : Z1 : T1), g = (g.X, g.Y, g.Z, g.T) = (Y2 + X2, Y2 - X2, Z2, 2 * d * T2) + * <br> + * r in P x P coordinate system.: + * X' = (Y1 + X1) * (Y2 + X2) - (Y1 - X1) * (Y2 - X2) + * Y' = (Y1 + X1) * (Y2 + X2) + (Y1 - X1) * (Y2 - X2) + * Z' = 2 * Z1 * Z2 + 2 * d * T1 * T2 + * T' = 2 * Z1 * T2 - 2 * d * T1 * T2 + * <br> + * Setting A = (Y1 - X1) * (Y2 - X2), B = (Y1 + X1) * (Y2 + X2), C = 2 * d * T1 * T2, D = 2 * Z1 * Z2 we get + * X' = (B - A) + * Y' = (B + A) + * Z' = (D + C) + * T' = (D - C) + * <br> + * Same result as in precomputedAdd() (up to a common factor which does not matter). + * + * @param g The group element to add. + * @return The result in the P x P coordinate system. + */ + public Ed25519GroupElement add(final Ed25519GroupElement g) { + if (this.coordinateSystem != CoordinateSystem.P3) { + throw new UnsupportedOperationException(); + } + if (g.coordinateSystem != CoordinateSystem.CACHED) { + throw new IllegalArgumentException(); + } + + final Ed25519FieldElement YPlusX; + final Ed25519FieldElement YMinusX; + final Ed25519FieldElement ZSquare; + final Ed25519FieldElement A; + final Ed25519FieldElement B; + final Ed25519FieldElement C; + final Ed25519FieldElement D; + YPlusX = this.Y.add(this.X); + YMinusX = this.Y.subtract(this.X); + A = YPlusX.multiply(g.X); + B = YMinusX.multiply(g.Y); + C = g.T.multiply(this.T); + ZSquare = this.Z.multiply(g.Z); + D = ZSquare.add(ZSquare); + + return p1xp1(A.subtract(B), A.add(B), D.add(C), D.subtract(C)); + } + + /** + * Ed25519GroupElement subtraction using the twisted Edwards addition law for extended coordinates. + * <br> + * Negating g means negating the value of the coordinate X2 and T2. + * The formula is in accordance to the above addition. + * + * @param g The group element to subtract. + * @return The result in the P x P coordinate system. + */ + public Ed25519GroupElement subtract(final Ed25519GroupElement g) { + if (this.coordinateSystem != CoordinateSystem.P3) { + throw new UnsupportedOperationException(); + } + if (g.coordinateSystem != CoordinateSystem.CACHED) { + throw new IllegalArgumentException(); + } + + final Ed25519FieldElement YPlusX; + final Ed25519FieldElement YMinusX; + final Ed25519FieldElement ZSquare; + final Ed25519FieldElement A; + final Ed25519FieldElement B; + final Ed25519FieldElement C; + final Ed25519FieldElement D; + YPlusX = this.Y.add(this.X); + YMinusX = this.Y.subtract(this.X); + A = YPlusX.multiply(g.Y); + B = YMinusX.multiply(g.X); + C = g.T.multiply(this.T); + ZSquare = this.Z.multiply(g.Z); + D = ZSquare.add(ZSquare); + + return p1xp1(A.subtract(B), A.add(B), D.subtract(C), D.add(C)); + } + + /** + * Negates this group element by subtracting it from the neutral group element. + * (only used in MathUtils so it doesn't have to be fast) + * + * @return The negative of this group element. + */ + public Ed25519GroupElement negate() { + if (this.coordinateSystem != CoordinateSystem.P3) { + throw new UnsupportedOperationException(); + } + + return Ed25519Group.ZERO_P3.subtract(this.toCached()).toP3(); + } + + @Override + public int hashCode() { + return this.encode().hashCode(); + } + + @Override + public boolean equals(final Object obj) { + if (!(obj instanceof Ed25519GroupElement)) { + return false; + } + Ed25519GroupElement ge = (Ed25519GroupElement)obj; + if (!this.coordinateSystem.equals(ge.coordinateSystem)) { + try { + ge = ge.toCoordinateSystem(this.coordinateSystem); + } catch (final Exception e) { + return false; + } + } + switch (this.coordinateSystem) { + case P2: + case P3: + if (this.Z.equals(ge.Z)) { + return this.X.equals(ge.X) && this.Y.equals(ge.Y); + } + + final Ed25519FieldElement x1 = this.X.multiply(ge.Z); + final Ed25519FieldElement y1 = this.Y.multiply(ge.Z); + final Ed25519FieldElement x2 = ge.X.multiply(this.Z); + final Ed25519FieldElement y2 = ge.Y.multiply(this.Z); + + return x1.equals(x2) && y1.equals(y2); + case P1xP1: + return this.toP2().equals(ge); + case PRECOMPUTED: + return this.X.equals(ge.X) && this.Y.equals(ge.Y) && this.Z.equals(ge.Z); + case CACHED: + if (this.Z.equals(ge.Z)) { + return this.X.equals(ge.X) && this.Y.equals(ge.Y) && this.T.equals(ge.T); + } + + final Ed25519FieldElement x3 = this.X.multiply(ge.Z); + final Ed25519FieldElement y3 = this.Y.multiply(ge.Z); + final Ed25519FieldElement t3 = this.T.multiply(ge.Z); + final Ed25519FieldElement x4 = ge.X.multiply(this.Z); + final Ed25519FieldElement y4 = ge.Y.multiply(this.Z); + final Ed25519FieldElement t4 = ge.T.multiply(this.Z); + + return x3.equals(x4) && y3.equals(y4) && t3.equals(t4); + default: + //return false; + throw new RuntimeException("Coordinate system problem"); + } + } + + /** + * Convert a to 2^16 bit representation. + * + * @param encoded The encode field element. + * @return 64 bytes, each between -8 and 7 + */ + private static byte[] toRadix16(final Ed25519EncodedFieldElement encoded) { + final byte[] a = encoded.getRaw(); + final byte[] e = new byte[64]; + int i; + for (i = 0; i < 32; i++) { + e[2 * i] = (byte)(a[i] & 15); + e[2 * i + 1] = (byte)((a[i] >> 4) & 15); + } + /* each e[i] is between 0 and 15 */ + /* e[63] is between 0 and 7 */ + int carry = 0; + for (i = 0; i < 63; i++) { + e[i] += carry; + carry = e[i] + 8; + carry >>= 4; + e[i] -= carry << 4; + } + e[63] += carry; + + return e; + } + + /** + * Constant-time conditional move. + * Replaces this with u if b == 1. + * Replaces this with this if b == 0. + * + * @param u The group element to return if b == 1. + * @param b in {0, 1} + * @return u if b == 1; this if b == 0; null otherwise. + */ + private Ed25519GroupElement cmov(final Ed25519GroupElement u, final int b) { + Ed25519GroupElement ret = null; + for (int i = 0; i < b; i++) { + // Only for b == 1 + ret = u; + } + for (int i = 0; i < 1 - b; i++) { + // Only for b == 0 + ret = this; + } + return ret; + } + + /** + * Look up 16^i r_i B in the precomputed table. + * No secret array indices, no secret branching. + * Constant time. + * <br> + * Must have previously precomputed. + * + * @param pos = i/2 for i in {0, 2, 4,..., 62} + * @param b = r_i + * @return The Ed25519GroupElement + */ + private Ed25519GroupElement select(final int pos, final int b) { + // Is r_i negative? + final int bNegative = ByteUtils.isNegativeConstantTime(b); + // |r_i| + final int bAbs = b - (((-bNegative) & b) << 1); + + // 16^i |r_i| B + final Ed25519GroupElement t = Ed25519Group.ZERO_PRECOMPUTED + .cmov(this.precomputedForSingle[pos][0], ByteUtils.isEqualConstantTime(bAbs, 1)) + .cmov(this.precomputedForSingle[pos][1], ByteUtils.isEqualConstantTime(bAbs, 2)) + .cmov(this.precomputedForSingle[pos][2], ByteUtils.isEqualConstantTime(bAbs, 3)) + .cmov(this.precomputedForSingle[pos][3], ByteUtils.isEqualConstantTime(bAbs, 4)) + .cmov(this.precomputedForSingle[pos][4], ByteUtils.isEqualConstantTime(bAbs, 5)) + .cmov(this.precomputedForSingle[pos][5], ByteUtils.isEqualConstantTime(bAbs, 6)) + .cmov(this.precomputedForSingle[pos][6], ByteUtils.isEqualConstantTime(bAbs, 7)) + .cmov(this.precomputedForSingle[pos][7], ByteUtils.isEqualConstantTime(bAbs, 8)); + // -16^i |r_i| B + //noinspection SuspiciousNameCombination + final Ed25519GroupElement tMinus = precomputed(t.Y, t.X, t.Z.negate()); + // 16^i r_i B + return t.cmov(tMinus, bNegative); + } + + public static int precomps = 0; + public static int scalarMults = 0; + public static int scalarBaseMults = 0; + + public Ed25519GroupElement scalarMultiply(final Ed25519EncodedFieldElement a) { + return scalarMultiply(a, true); + } + /** + * h = a * B where a = a[0]+256*a[1]+...+256^31 a[31] and + * B is this point. If its lookup table has not been precomputed, it + * will be at the start of the method (and cached for later calls). + * Constant time. + * + * @param a The encoded field element. + * @return The resulting group element. + */ + public static String lineRecordingSourceFile = null; + public static boolean enableLineRecording = false; + private static boolean noNativeLibraryAvailable = false; + public static Map<Integer, Integer> lineNumberCallFrequencyMap = new TreeMap<>((a,b)->a.compareTo(b)); + public Ed25519GroupElement scalarMultiply(final Ed25519EncodedFieldElement a, boolean useNativeImplementation) { + + if(enableLineRecording) { + Optional<StackTraceElement> optionalCaller = Arrays.stream(new Exception().getStackTrace()).filter(e -> e.getFileName().equals(lineRecordingSourceFile)).findFirst(); + if (optionalCaller.isPresent()) { + StackTraceElement caller = optionalCaller.get(); + lineNumberCallFrequencyMap.putIfAbsent(caller.getLineNumber(), 0); + lineNumberCallFrequencyMap.computeIfPresent(caller.getLineNumber(), (key, oldValue) -> oldValue + 1); + } + } + + scalarMults++; + + if(this==Ed25519Group.BASE_POINT) scalarBaseMults++; + + try { + if(!noNativeLibraryAvailable && this==Ed25519Group.BASE_POINT) return new Ed25519EncodedGroupElement(CryptoOpsUtil.scalarMultBase(a.getRaw())).decode(); + } + catch (java.lang.UnsatisfiedLinkError e) { + System.err.println("WARNING: No C library available for native Ed25519"); + noNativeLibraryAvailable = true; + } + + + if(precomputedForSingle==null) { + + // there is only a performance advantage to using native code if the element has not been precomputed + if(useNativeImplementation && !noNativeLibraryAvailable) { + try { + return new Ed25519EncodedGroupElement(CryptoOpsUtil.scalarMult(this.encode().getRaw(), a.getRaw())).decode(); + } + catch (java.lang.UnsatisfiedLinkError e) { + System.err.println("WARNING: No C library available for native Ed25519"); + noNativeLibraryAvailable = true; + } + } + + precomps++; + precomputeForScalarMultiplication(); + } + + Ed25519GroupElement g; + int i; + final byte[] e = toRadix16(a); + Ed25519GroupElement h = Ed25519Group.ZERO_P3; + for (i = 1; i < 64; i += 2) { + g = this.select(i / 2, e[i]); + h = h.precomputedAdd(g).toP3(); + } + + h = h.dbl().toP2().dbl().toP2().dbl().toP2().dbl().toP3(); + + for (i = 0; i < 64; i += 2) { + g = this.select(i / 2, e[i]); + h = h.precomputedAdd(g).toP3(); + } + + return h; + } + + public Ed25519GroupElement scalarMultiply(final Ed25519FieldElement a) { + return scalarMultiply(a.encode()); + } + public Ed25519GroupElement scalarMultiply(final byte[] a) { + return scalarMultiply(new Ed25519EncodedFieldElement(a)); + } + public Ed25519GroupElement scalarMultiply(final Scalar a) { + return scalarMultiply(a, true); + } + public Ed25519GroupElement scalarMultiply(final Scalar a, boolean useNativeImplementation) { + return scalarMultiply(new Ed25519EncodedFieldElement(a.bytes), useNativeImplementation); + } + + /** + * Calculates a sliding-windows base 2 representation for a given encoded field element a. + * To learn more about it see [6] page 8. + * <br> + * Output: r which satisfies + * a = r0 * 2^0 + r1 * 2^1 + ... + r255 * 2^255 with ri in {-15, -13, -11, -9, -7, -5, -3, -1, 0, 1, 3, 5, 7, 9, 11, 13, 15} + * <br> + * Method is package private only so that tests run. + * + * @param encoded The encoded field element. + * @return The byte array r in the above described form. + */ + private static byte[] slide(final Ed25519EncodedFieldElement encoded) { + final byte[] a = encoded.getRaw(); + final byte[] r = new byte[256]; + + // Put each bit of 'a' into a separate byte, 0 or 1 + for (int i = 0; i < 256; ++i) { + r[i] = (byte)(1 & (a[i >> 3] >> (i & 7))); + } + + // Note: r[i] will always be odd. + for (int i = 0; i < 256; ++i) { + if (r[i] != 0) { + for (int b = 1; b <= 6 && i + b < 256; ++b) { + // Accumulate bits if possible + if (r[i + b] != 0) { + if (r[i] + (r[i + b] << b) <= 15) { + r[i] += r[i + b] << b; + r[i + b] = 0; + } else if (r[i] - (r[i + b] << b) >= -15) { + r[i] -= r[i + b] << b; + for (int k = i + b; k < 256; ++k) { + if (r[k] == 0) { + r[k] = 1; + break; + } + r[k] = 0; + } + } else { + break; + } + } + } + } + } + + return r; + } + + /** + * r = b * B - a * A where + * a and b are encoded field elements and + * B is this point. + * A must have been previously precomputed for double scalar multiplication. + * + * @param A in P3 coordinate system. + * @param a = The first encoded field element. + * @param b = The second encoded field element. + * @return The resulting group element. + */ + public Ed25519GroupElement doubleScalarMultiplyVariableTime( + final Ed25519GroupElement A, + final Ed25519EncodedFieldElement a, + final Ed25519EncodedFieldElement b) { + final byte[] aSlide = slide(a); + final byte[] bSlide = slide(b); + Ed25519GroupElement r = Ed25519Group.ZERO_P2; + + int i; + for (i = 255; i >= 0; --i) { + if (aSlide[i] != 0 || bSlide[i] != 0) { + break; + } + } + + for (; i >= 0; --i) { + Ed25519GroupElement t = r.dbl(); + + if (aSlide[i] > 0) { + t = t.toP3().precomputedSubtract(A.precomputedForDouble[aSlide[i] / 2]); + } else if (aSlide[i] < 0) { + t = t.toP3().precomputedAdd(A.precomputedForDouble[(-aSlide[i]) / 2]); + } + + if (bSlide[i] > 0) { + t = t.toP3().precomputedAdd(this.precomputedForDouble[bSlide[i] / 2]); + } else if (bSlide[i] < 0) { + t = t.toP3().precomputedSubtract(this.precomputedForDouble[(-bSlide[i]) / 2]); + } + + r = t.toP2(); + } + + return r; + } + + /** + * Verify that the group element satisfies the curve equation. + * + * @return true if the group element satisfies the curve equation, false otherwise. + */ + public boolean satisfiesCurveEquation() { + switch (this.coordinateSystem) { + case P2: + case P3: + final Ed25519FieldElement inverse = this.Z.invert(); + final Ed25519FieldElement x = this.X.multiply(inverse); + final Ed25519FieldElement y = this.Y.multiply(inverse); + final Ed25519FieldElement xSquare = x.square(); + final Ed25519FieldElement ySquare = y.square(); + final Ed25519FieldElement dXSquareYSquare = Ed25519Field.D.multiply(xSquare).multiply(ySquare); + return Ed25519Field.ONE.add(dXSquareYSquare).add(xSquare).equals(ySquare); + + default: + return this.toP2().satisfiesCurveEquation(); + } + } + + @Override + public String toString() { + return String.format( + "X=%s\nY=%s\nZ=%s\nT=%s\n", + this.X.toString(), + this.Y.toString(), + this.Z.toString(), + this.T.toString()); + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/utils/AbstractTwoLevelMap.java b/source-code/RuffCT-java/src/org/nem/core/utils/AbstractTwoLevelMap.java new file mode 100755 index 0000000..30fdfea --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/utils/AbstractTwoLevelMap.java @@ -0,0 +1,74 @@ +package org.nem.core.utils; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * A two-level map of items. + * <br> + * Items are automatically created on access. + * Item associations are order-dependent. + */ +public abstract class AbstractTwoLevelMap<TKey, TValue> { + private final Map<TKey, Map<TKey, TValue>> impl = new ConcurrentHashMap<>(); + + /** + * Gets the TValue associated with key1 and key2. + * + * @param key1 The first key. + * @param key2 The second key. + * @return The value associated with key and key2. + */ + public TValue getItem(final TKey key1, final TKey key2) { + final Map<TKey, TValue> keyOneValues = this.getItems(key1); + + TValue value = keyOneValues.get(key2); + if (null == value) { + value = this.createValue(); + keyOneValues.put(key2, value); + } + + return value; + } + + /** + * Gets the (TKey, TValue) map associated with key. + * + * @param key The first key. + * @return The map associated with key. + */ + public Map<TKey, TValue> getItems(final TKey key) { + Map<TKey, TValue> keyValues = this.impl.get(key); + if (null == keyValues) { + keyValues = new ConcurrentHashMap<>(); + this.impl.put(key, keyValues); + } + + return keyValues; + } + + /** + * Removes a key from the map. + * + * @param key The key to remove. + */ + public void remove(final TKey key) { + this.impl.remove(key); + } + + /** + * Gets the key set of this map. + * + * @return The key set. + */ + public Set<TKey> keySet() { + return this.impl.keySet(); + } + + /** + * Creates a new blank value. + * + * @return A new value. + */ + protected abstract TValue createValue(); +} diff --git a/source-code/RuffCT-java/src/org/nem/core/utils/ArrayUtils.java b/source-code/RuffCT-java/src/org/nem/core/utils/ArrayUtils.java new file mode 100755 index 0000000..5e9170c --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/utils/ArrayUtils.java @@ -0,0 +1,156 @@ +package org.nem.core.utils; + +import java.math.BigInteger; + +/** + * Static class that contains a handful of array helper functions. + */ +public class ArrayUtils { + + /** + * Creates duplicate of given array + * + * @param src The array to duplicate. + * @return A copy of the array. + */ + public static byte[] duplicate(final byte[] src) { + final byte[] result = new byte[src.length]; + System.arraycopy(src, 0, result, 0, src.length); + return result; + } + + /** + * Concatenates byte arrays and returns the result. + * + * @param arrays The arrays. + * @return A single array containing all elements in all arrays. + */ + public static byte[] concat(final byte[]... arrays) { + int totalSize = 0; + for (final byte[] array : arrays) { + totalSize += array.length; + } + + int startIndex = 0; + final byte[] result = new byte[totalSize]; + for (final byte[] array : arrays) { + System.arraycopy(array, 0, result, startIndex, array.length); + startIndex += array.length; + } + + return result; + } + + /** + * Splits a single array into two arrays. + * + * @param bytes The input array. + * @param splitIndex The index at which the array should be split. + * @return Two arrays split at the splitIndex. + * The first array will contain the first splitIndex elements. + * The second array will contain all trailing elements. + */ + public static byte[][] split(final byte[] bytes, final int splitIndex) { + if (splitIndex < 0 || bytes.length < splitIndex) { + throw new IllegalArgumentException("split index is out of range"); + } + + final byte[] lhs = new byte[splitIndex]; + final byte[] rhs = new byte[bytes.length - splitIndex]; + + System.arraycopy(bytes, 0, lhs, 0, lhs.length); + System.arraycopy(bytes, splitIndex, rhs, 0, rhs.length); + return new byte[][] { lhs, rhs }; + } + + /** + * Converts a BigInteger to a little endian byte array. + * + * @param value The value to convert. + * @param numBytes The number of bytes in the destination array. + * @return The resulting little endian byte array. + */ + public static byte[] toByteArray(final BigInteger value, final int numBytes) { + final byte[] outputBytes = new byte[numBytes]; + final byte[] bigIntegerBytes = value.toByteArray(); + + int copyStartIndex = (0x00 == bigIntegerBytes[0]) ? 1 : 0; + int numBytesToCopy = bigIntegerBytes.length - copyStartIndex; + if (numBytesToCopy > numBytes) { + copyStartIndex += numBytesToCopy - numBytes; + numBytesToCopy = numBytes; + } + + for (int i = 0; i < numBytesToCopy; ++i) { + outputBytes[i] = bigIntegerBytes[copyStartIndex + numBytesToCopy - i - 1]; + } + + return outputBytes; + } + + /** + * Converts a little endian byte array to a BigInteger. + * + * @param bytes The bytes to convert. + * @return The resulting BigInteger. + */ + public static BigInteger toBigInteger(final byte[] bytes) { + final byte[] bigEndianBytes = new byte[bytes.length + 1]; + for (int i = 0; i < bytes.length; ++i) { + bigEndianBytes[i + 1] = bytes[bytes.length - i - 1]; + } + + return new BigInteger(bigEndianBytes); + } + + /** + * Constant-time byte[] comparison. The constant time behavior eliminates side channel attacks. + * + * @param b An array. + * @param c An array. + * @return 1 if b and c are equal, 0 otherwise. + */ + public static int isEqualConstantTime(final byte[] b, final byte[] c) { + int result = 0; + result |= b.length - c.length; + for (int i = 0; i < b.length; i++) { + result |= b[i] ^ c[i]; + } + + return ByteUtils.isEqualConstantTime(result, 0); + } + + /** + * NON constant-time lexicographical byte[] comparison. + * + * @param b first of arrays to compare. + * @param c second of arrays to compare. + * @return 1, -1, or 0 depending on comparison result. + */ + public static int compare(final byte[] b, final byte[] c) { + int result = b.length - c.length; + if (0 != result) { + return result; + } + + for (int i = 0; i < b.length; i++) { + result = b[i] - c[i]; + if (0 != result) { + return result; + } + } + + return 0; + } + + /** + * Gets the i'th bit of a byte array. + * + * @param h The byte array. + * @param i The bit index. + * @return The value of the i'th bit in h + */ + public static int getBit(final byte[] h, final int i) { + return (h[i >> 3] >> (i & 7)) & 1; + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/utils/Base32Encoder.java b/source-code/RuffCT-java/src/org/nem/core/utils/Base32Encoder.java new file mode 100755 index 0000000..74b33d6 --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/utils/Base32Encoder.java @@ -0,0 +1,37 @@ +package org.nem.core.utils; + +import org.apache.commons.codec.binary.Base32; + +/** + * Static class that contains utility functions for converting Base32 strings to and from bytes. + */ +public class Base32Encoder { + + /** + * Converts a string to a byte array. + * + * @param base32String The input Base32 string. + * @return The output byte array. + */ + public static byte[] getBytes(final String base32String) { + final Base32 codec = new Base32(); + final byte[] encodedBytes = StringEncoder.getBytes(base32String); + if (!codec.isInAlphabet(encodedBytes, true)) { + throw new IllegalArgumentException("malformed base32 string passed to getBytes"); + } + + return codec.decode(encodedBytes); + } + + /** + * Converts a byte array to a Base32 string. + * + * @param bytes The input byte array. + * @return The output Base32 string. + */ + public static String getString(final byte[] bytes) { + final Base32 codec = new Base32(); + final byte[] decodedBytes = codec.encode(bytes); + return StringEncoder.getString(decodedBytes); + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/utils/Base64Encoder.java b/source-code/RuffCT-java/src/org/nem/core/utils/Base64Encoder.java new file mode 100755 index 0000000..e8aeaf1 --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/utils/Base64Encoder.java @@ -0,0 +1,37 @@ +package org.nem.core.utils; + +import org.apache.commons.codec.binary.Base64; + +/** + * Static class that contains utility functions for converting Base64 strings to and from bytes. + */ +public class Base64Encoder { + + /** + * Converts a string to a byte array. + * + * @param base64String The input Base64 string. + * @return The output byte array. + */ + public static byte[] getBytes(final String base64String) { + final Base64 codec = new Base64(); + final byte[] encodedBytes = StringEncoder.getBytes(base64String); + if (!codec.isInAlphabet(encodedBytes, true)) { + throw new IllegalArgumentException("malformed base64 string passed to getBytes"); + } + + return codec.decode(encodedBytes); + } + + /** + * Converts a byte array to a Base64 string. + * + * @param bytes The input byte array. + * @return The output Base64 string. + */ + public static String getString(final byte[] bytes) { + final Base64 codec = new Base64(); + final byte[] decodedBytes = codec.encode(bytes); + return StringEncoder.getString(decodedBytes); + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/utils/ByteUtils.java b/source-code/RuffCT-java/src/org/nem/core/utils/ByteUtils.java new file mode 100755 index 0000000..b5087c7 --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/utils/ByteUtils.java @@ -0,0 +1,100 @@ +package org.nem.core.utils; + +import java.nio.ByteBuffer; + +public class ByteUtils { + + /** + * Converts an array of 8 bytes into a long. + * + * @param bytes The bytes. + * @return The long. + */ + public static long bytesToLong(final byte[] bytes) { + final ByteBuffer buffer = ByteBuffer.allocate(8); + buffer.put(bytes, 0, 8); + buffer.flip(); + return buffer.getLong(); + } + + /** + * Converts a long value into an array of 8 bytes. + * + * @param x The long. + * @return The bytes. + */ + public static byte[] longToBytes(final long x) { + final ByteBuffer buffer = ByteBuffer.allocate(8); + buffer.putLong(x); + return buffer.array(); + } + + /** + * Converts an array of 4 bytes into a int. + * + * @param bytes The bytes. + * @return The int. + */ + public static int bytesToInt(final byte[] bytes) { + final ByteBuffer buffer = ByteBuffer.allocate(4); + buffer.put(bytes, 0, 4); + buffer.flip(); + return buffer.getInt(); + } + + /** + * Converts an int value into an array of 4 bytes. + * + * @param x The int. + * @return The bytes. + */ + public static byte[] intToBytes(final int x) { + final ByteBuffer buffer = ByteBuffer.allocate(4); + buffer.putInt(x); + return buffer.array(); + } + + /** + * Constant-time byte comparison. The constant time behavior eliminates side channel attacks. + * + * @param b One byte. + * @param c Another byte. + * @return 1 if b and c are equal, 0 otherwise. + */ + public static int isEqualConstantTime(final int b, final int c) { + int result = 0; + final int xor = b ^ c; + for (int i = 0; i < 8; i++) { + result |= xor >> i; + } + + return (result ^ 0x01) & 0x01; + } + + /** + * Constant-time check if byte is negative. The constant time behavior eliminates side channel attacks. + * + * @param b The byte to check. + * @return 1 if the byte is negative, 0 otherwise. + */ + public static int isNegativeConstantTime(final int b) { + return (b >> 8) & 1; + } + + /** + * Creates a human readable representation of an array of bytes. + * + * @param bytes The bytes. + * @return An string representation of the bytes. + */ + public static String toString(final byte[] bytes) { + final StringBuilder builder = new StringBuilder(); + builder.append("{ "); + for (final byte b : bytes) { + builder.append(String.format("%02X ", (byte)(0xFF & b))); + } + + builder.append("}"); + return builder.toString(); + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/utils/CircularStack.java b/source-code/RuffCT-java/src/org/nem/core/utils/CircularStack.java new file mode 100755 index 0000000..19ff1b9 --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/utils/CircularStack.java @@ -0,0 +1,88 @@ +package org.nem.core.utils; + +import java.util.*; + +/** + * Circular stack is a last in first out buffer with fixed size that replace its oldest element if full. + * The removal order is inverse of insertion order. The iteration order is the same as insertion order. + * <strong>Note that implementation is not synchronized.</strong> + * + * @param <E> Type of elements on the stack. + */ +public class CircularStack<E> implements Iterable<E> { + private final List<E> elements; + private final int limit; + + /** + * Creates circular stack with at most limit elements. + * + * @param limit Maximum number of elements on the stack. + */ + public CircularStack(final int limit) { + this.elements = new ArrayList<>(limit); + this.limit = limit; + } + + /** + * Creates shallow copy in destination. + * + * @param destination CircularStack to which elements should be copied. + */ + public void shallowCopyTo(final CircularStack<E> destination) { + destination.elements.clear(); + destination.pushAll(this); + } + + private void pushAll(final CircularStack<E> rhs) { + int i = 0; + for (final E element : rhs) { + if (i >= rhs.size() - this.limit) { + this.push(element); + } + + ++i; + } + } + + /** + * Adds element to the stack. + * + * @param element Element to be added. + */ + public void push(final E element) { + this.elements.add(element); + if (this.elements.size() > this.limit) { + this.elements.remove(0); + } + } + + /** + * Gets most recently added element. + * + * @return Most recently added element. + */ + public E peek() { + return this.elements.get(this.elements.size() - 1); + } + + /** + * Removes most recently added element. + */ + public void pop() { + this.elements.remove(this.elements.size() - 1); + } + + /** + * Returns size of a stack. + * + * @return Size of a stack (can be smaller than limit). + */ + public int size() { + return this.elements.size(); + } + + @Override + public Iterator<E> iterator() { + return this.elements.iterator(); + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/utils/ExceptionUtils.java b/source-code/RuffCT-java/src/org/nem/core/utils/ExceptionUtils.java new file mode 100755 index 0000000..d1dac1a --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/utils/ExceptionUtils.java @@ -0,0 +1,102 @@ +package org.nem.core.utils; + +import java.util.concurrent.*; +import java.util.function.Function; + +/** + * Static class that contains helper functions for dealing with exceptions. + */ +public class ExceptionUtils { + + private ExceptionUtils() { + } + + /** + * Interface that mimics Runnable but can additionally throw checked exceptions. + */ + public interface CheckedRunnable { + + /** + * Executes the runnable. + * + * @throws Exception Any exception. + */ + void call() throws Exception; + } + + /** + * Propagates checked exceptions as a runtime exception. + * + * @param runnable The checked runnable. + */ + public static void propagateVoid(final CheckedRunnable runnable) { + propagateVoid(runnable, RuntimeException::new); + } + + /** + * Propagates checked exceptions as a specific runtime exception. + * + * @param runnable The checked runnable. + * @param wrap A function that wraps an exception in a runtime exception. + * @param <E> The specific exception type. + */ + public static <E extends RuntimeException> void propagateVoid( + final CheckedRunnable runnable, + final Function<Exception, E> wrap) { + propagate(new CheckedRuntimeToCallableAdapter(runnable), wrap); + } + + /** + * Propagates checked exceptions as a runtime exception. + * + * @param callable The function. + * @param <T> The function return type. + * @return The function result. + */ + public static <T> T propagate(final Callable<T> callable) { + return propagate(callable, RuntimeException::new); + } + + /** + * Propagates checked exceptions as a specific runtime exception. + * + * @param callable The function. + * @param wrap A function that wraps an exception in a runtime exception. + * @param <T> The function return type. + * @param <E> The specific exception type. + * @return The function result. + */ + public static <T, E extends RuntimeException> T propagate( + final Callable<T> callable, + final Function<Exception, E> wrap) { + try { + return callable.call(); + } catch (final ExecutionException e) { + if (RuntimeException.class.isAssignableFrom(e.getCause().getClass())) { + throw (RuntimeException)e.getCause(); + } + throw wrap.apply(e); + } catch (final RuntimeException e) { + throw e; + } catch (final InterruptedException e) { + Thread.currentThread().interrupt(); + throw new IllegalStateException(e); + } catch (final Exception e) { + throw wrap.apply(e); + } + } + + private static class CheckedRuntimeToCallableAdapter implements Callable<Void> { + private final CheckedRunnable runnable; + + public CheckedRuntimeToCallableAdapter(final CheckedRunnable runnable) { + this.runnable = runnable; + } + + @Override + public Void call() throws Exception { + this.runnable.call(); + return null; + } + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/utils/FormatUtils.java b/source-code/RuffCT-java/src/org/nem/core/utils/FormatUtils.java new file mode 100755 index 0000000..5fc4383 --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/utils/FormatUtils.java @@ -0,0 +1,63 @@ +package org.nem.core.utils; + +import java.text.*; +import java.util.Arrays; + +/** + * Static class containing helper functions for formatting. + */ +public class FormatUtils { + + /** + * Gets a default decimal format that should be used for formatting decimal values. + * + * @return A default decimal format. + */ + public static DecimalFormat getDefaultDecimalFormat() { + final DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols(); + decimalFormatSymbols.setDecimalSeparator('.'); + final DecimalFormat format = new DecimalFormat("#0.000", decimalFormatSymbols); + format.setGroupingUsed(false); + return format; + } + + /** + * Gets a decimal format that with the desired number of decimal places. + * + * @param decimalPlaces The number of decimal places. + * @return The desired decimal format. + */ + public static DecimalFormat getDecimalFormat(final int decimalPlaces) { + if (decimalPlaces < 0) { + throw new IllegalArgumentException("decimalPlaces must be non-negative"); + } + + final DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols(); + decimalFormatSymbols.setDecimalSeparator('.'); + final StringBuilder builder = new StringBuilder(); + builder.append("#0"); + + if (decimalPlaces > 0) { + builder.append('.'); + final char[] zeros = new char[decimalPlaces]; + Arrays.fill(zeros, '0'); + builder.append(zeros); + } + + final DecimalFormat format = new DecimalFormat(builder.toString(), decimalFormatSymbols); + format.setGroupingUsed(false); + return format; + } + + /** + * Formats a double value with a given number of decimal places. + * + * @param value The value to format. + * @param decimalPlaces The desired number of decimal places. + * @return The formatted string. + */ + public static String format(final double value, final int decimalPlaces) { + final DecimalFormat formatter = getDecimalFormat(decimalPlaces); + return formatter.format(value); + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/utils/HexEncoder.java b/source-code/RuffCT-java/src/org/nem/core/utils/HexEncoder.java new file mode 100755 index 0000000..a8d380e --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/utils/HexEncoder.java @@ -0,0 +1,57 @@ +package org.nem.core.utils; + +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Hex; + +/** + * Static class that contains utility functions for converting hex strings to and from bytes. + */ +public class HexEncoder { + + /** + * Converts a hex string to a byte array. + * + * @param hexString The input hex string. + * @return The output byte array. + */ + public static byte[] getBytes(final String hexString) { + try { + return getBytesInternal(hexString); + } catch (final DecoderException e) { + throw new IllegalArgumentException(e); + } + } + + /** + * Tries to convert a hex string to a byte array. + * + * @param hexString The input hex string. + * @return The output byte array or null if the input string is malformed. + */ + public static byte[] tryGetBytes(final String hexString) { + try { + return getBytesInternal(hexString); + } catch (final DecoderException e) { + return null; + } + } + + private static byte[] getBytesInternal(final String hexString) throws DecoderException { + final Hex codec = new Hex(); + final String paddedHexString = 0 == hexString.length() % 2 ? hexString : "0" + hexString; + final byte[] encodedBytes = StringEncoder.getBytes(paddedHexString); + return codec.decode(encodedBytes); + } + + /** + * Converts a byte array to a hex string. + * + * @param bytes The input byte array. + * @return The output hex string. + */ + public static String getString(final byte[] bytes) { + final Hex codec = new Hex(); + final byte[] decodedBytes = codec.encode(bytes); + return StringEncoder.getString(decodedBytes); + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/utils/HttpStatus.java b/source-code/RuffCT-java/src/org/nem/core/utils/HttpStatus.java new file mode 100755 index 0000000..dc48d5c --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/utils/HttpStatus.java @@ -0,0 +1,494 @@ +package org.nem.core.utils; + +/* We don't want to get spring dependancy just to get this... */ + +/* + * Copyright 2002-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Java 5 enumeration of HTTP status codes. + * + * @author Arjen Poutsma + * @author Sebastien Deleuze + * @see <a href="http://www.iana.org/assignments/http-status-codes">HTTP Status Code Registry</a> + * @see <a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes">List of HTTP status codes - Wikipedia</a> + */ +public enum HttpStatus { + + // 1xx Informational + + /** + * {@code 100 Continue}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.2.1">HTTP/1.1: Semantics and Content, section 6.2.1</a> + */ + CONTINUE(100, "Continue"), + /** + * {@code 101 Switching Protocols}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.2.2">HTTP/1.1: Semantics and Content, section 6.2.2</a> + */ + SWITCHING_PROTOCOLS(101, "Switching Protocols"), + /** + * {@code 102 Processing}. + * + * @see <a href="http://tools.ietf.org/html/rfc2518#section-10.1">WebDAV</a> + */ + PROCESSING(102, "Processing"), + /** + * {@code 103 Checkpoint}. + * + * @see <a href="http://code.google.com/p/gears/wiki/ResumableHttpRequestsProposal">A proposal for supporting + * resumable POST/PUT HTTP requests in HTTP/1.0</a> + */ + CHECKPOINT(103, "Checkpoint"), + + // 2xx Success + + /** + * {@code 200 OK}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.1">HTTP/1.1: Semantics and Content, section 6.3.1</a> + */ + OK(200, "OK"), + /** + * {@code 201 Created}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.2">HTTP/1.1: Semantics and Content, section 6.3.2</a> + */ + CREATED(201, "Created"), + /** + * {@code 202 Accepted}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.3">HTTP/1.1: Semantics and Content, section 6.3.3</a> + */ + ACCEPTED(202, "Accepted"), + /** + * {@code 203 Non-Authoritative Information}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.4">HTTP/1.1: Semantics and Content, section 6.3.4</a> + */ + NON_AUTHORITATIVE_INFORMATION(203, "Non-Authoritative Information"), + /** + * {@code 204 No Content}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.5">HTTP/1.1: Semantics and Content, section 6.3.5</a> + */ + NO_CONTENT(204, "No Content"), + /** + * {@code 205 Reset Content}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.6">HTTP/1.1: Semantics and Content, section 6.3.6</a> + */ + RESET_CONTENT(205, "Reset Content"), + /** + * {@code 206 Partial Content}. + * + * @see <a href="http://tools.ietf.org/html/rfc7233#section-4.1">HTTP/1.1: Range Requests, section 4.1</a> + */ + PARTIAL_CONTENT(206, "Partial Content"), + /** + * {@code 207 Multi-Status}. + * + * @see <a href="http://tools.ietf.org/html/rfc4918#section-13">WebDAV</a> + */ + MULTI_STATUS(207, "Multi-Status"), + /** + * {@code 208 Already Reported}. + * + * @see <a href="http://tools.ietf.org/html/rfc5842#section-7.1">WebDAV Binding Extensions</a> + */ + ALREADY_REPORTED(208, "Already Reported"), + /** + * {@code 226 IM Used}. + * + * @see <a href="http://tools.ietf.org/html/rfc3229#section-10.4.1">Delta encoding in HTTP</a> + */ + IM_USED(226, "IM Used"), + + // 3xx Redirection + + /** + * {@code 300 Multiple Choices}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.1">HTTP/1.1: Semantics and Content, section 6.4.1</a> + */ + MULTIPLE_CHOICES(300, "Multiple Choices"), + /** + * {@code 301 Moved Permanently}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.2">HTTP/1.1: Semantics and Content, section 6.4.2</a> + */ + MOVED_PERMANENTLY(301, "Moved Permanently"), + /** + * {@code 302 Found}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.3">HTTP/1.1: Semantics and Content, section 6.4.3</a> + */ + FOUND(302, "Found"), + /** + * {@code 302 Moved Temporarily}. + * + * @see <a href="http://tools.ietf.org/html/rfc1945#section-9.3">HTTP/1.0, section 9.3</a> + * @deprecated In favor of {@link #FOUND} which will be returned from {@code HttpStatus.valueOf(302)} + */ + @Deprecated + MOVED_TEMPORARILY(302, "Moved Temporarily"), + /** + * {@code 303 See Other}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.4">HTTP/1.1: Semantics and Content, section 6.4.4</a> + */ + SEE_OTHER(303, "See Other"), + /** + * {@code 304 Not Modified}. + * + * @see <a href="http://tools.ietf.org/html/rfc7232#section-4.1">HTTP/1.1: Conditional Requests, section 4.1</a> + */ + NOT_MODIFIED(304, "Not Modified"), + /** + * {@code 305 Use Proxy}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.5">HTTP/1.1: Semantics and Content, section 6.4.5</a> + * @deprecated due to security concerns regarding in-band configuration of a proxy + */ + @Deprecated + USE_PROXY(305, "Use Proxy"), + /** + * {@code 307 Temporary Redirect}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.7">HTTP/1.1: Semantics and Content, section 6.4.7</a> + */ + TEMPORARY_REDIRECT(307, "Temporary Redirect"), + /** + * {@code 308 Permanent Redirect}. + * + * @see <a href="http://tools.ietf.org/html/rfc7238">RFC 7238</a> + */ + PERMANENT_REDIRECT(308, "Permanent Redirect"), + + // --- 4xx Client Error --- + + /** + * {@code 400 Bad Request}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.1">HTTP/1.1: Semantics and Content, section 6.5.1</a> + */ + BAD_REQUEST(400, "Bad Request"), + /** + * {@code 401 Unauthorized}. + * + * @see <a href="http://tools.ietf.org/html/rfc7235#section-3.1">HTTP/1.1: Authentication, section 3.1</a> + */ + UNAUTHORIZED(401, "Unauthorized"), + /** + * {@code 402 Payment Required}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.2">HTTP/1.1: Semantics and Content, section 6.5.2</a> + */ + PAYMENT_REQUIRED(402, "Payment Required"), + /** + * {@code 403 Forbidden}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.3">HTTP/1.1: Semantics and Content, section 6.5.3</a> + */ + FORBIDDEN(403, "Forbidden"), + /** + * {@code 404 Not Found}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.4">HTTP/1.1: Semantics and Content, section 6.5.4</a> + */ + NOT_FOUND(404, "Not Found"), + /** + * {@code 405 Method Not Allowed}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.5">HTTP/1.1: Semantics and Content, section 6.5.5</a> + */ + METHOD_NOT_ALLOWED(405, "Method Not Allowed"), + /** + * {@code 406 Not Acceptable}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.6">HTTP/1.1: Semantics and Content, section 6.5.6</a> + */ + NOT_ACCEPTABLE(406, "Not Acceptable"), + /** + * {@code 407 Proxy Authentication Required}. + * + * @see <a href="http://tools.ietf.org/html/rfc7235#section-3.2">HTTP/1.1: Authentication, section 3.2</a> + */ + PROXY_AUTHENTICATION_REQUIRED(407, "Proxy Authentication Required"), + /** + * {@code 408 Request Timeout}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.7">HTTP/1.1: Semantics and Content, section 6.5.7</a> + */ + REQUEST_TIMEOUT(408, "Request Timeout"), + /** + * {@code 409 Conflict}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.8">HTTP/1.1: Semantics and Content, section 6.5.8</a> + */ + CONFLICT(409, "Conflict"), + /** + * {@code 410 Gone}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.9">HTTP/1.1: Semantics and Content, section 6.5.9</a> + */ + GONE(410, "Gone"), + /** + * {@code 411 Length Required}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.10">HTTP/1.1: Semantics and Content, section 6.5.10</a> + */ + LENGTH_REQUIRED(411, "Length Required"), + /** + * {@code 412 Precondition failed}. + * + * @see <a href="http://tools.ietf.org/html/rfc7232#section-4.2">HTTP/1.1: Conditional Requests, section 4.2</a> + */ + PRECONDITION_FAILED(412, "Precondition Failed"), + /** + * {@code 413 Payload Too Large}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.11">HTTP/1.1: Semantics and Content, section 6.5.11</a> + * @since 4.1 + */ + PAYLOAD_TOO_LARGE(413, "Payload Too Large"), + /** + * {@code 413 Request Entity Too Large}. + * + * @see <a href="http://tools.ietf.org/html/rfc2616#section-10.4.14">HTTP/1.1, section 10.4.14</a> + * @deprecated In favor of {@link #PAYLOAD_TOO_LARGE} which will be returned from {@code HttpStatus.valueOf(413)} + */ + @Deprecated + REQUEST_ENTITY_TOO_LARGE(413, "Request Entity Too Large"), + /** + * {@code 414 URI Too Long}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.12">HTTP/1.1: Semantics and Content, section 6.5.12</a> + * @since 4.1 + */ + URI_TOO_LONG(414, "URI Too Long"), + /** + * {@code 414 Request-URI Too Long}. + * + * @see <a href="http://tools.ietf.org/html/rfc2616#section-10.4.15">HTTP/1.1, section 10.4.15</a> + * @deprecated In favor of {@link #URI_TOO_LONG} which will be returned from {@code HttpStatus.valueOf(414)} + */ + @Deprecated + REQUEST_URI_TOO_LONG(414, "Request-URI Too Long"), + /** + * {@code 415 Unsupported Media Type}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.13">HTTP/1.1: Semantics and Content, section 6.5.13</a> + */ + UNSUPPORTED_MEDIA_TYPE(415, "Unsupported Media Type"), + /** + * {@code 416 Requested Range Not Satisfiable}. + * + * @see <a href="http://tools.ietf.org/html/rfc7233#section-4.4">HTTP/1.1: Range Requests, section 4.4</a> + */ + REQUESTED_RANGE_NOT_SATISFIABLE(416, "Requested range not satisfiable"), + /** + * {@code 417 Expectation Failed}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.14">HTTP/1.1: Semantics and Content, section 6.5.14</a> + */ + EXPECTATION_FAILED(417, "Expectation Failed"), + /** + * {@code 418 I'm a teapot}. + * + * @see <a href="http://tools.ietf.org/html/rfc2324#section-2.3.2">HTCPCP/1.0</a> + */ + I_AM_A_TEAPOT(418, "I'm a teapot"), + /** + * @deprecated See <a href="http://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt">WebDAV Draft Changes</a> + */ + @Deprecated + INSUFFICIENT_SPACE_ON_RESOURCE(419, "Insufficient Space On Resource"), + /** + * @deprecated See <a href="http://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt">WebDAV Draft Changes</a> + */ + @Deprecated + METHOD_FAILURE(420, "Method Failure"), + /** + * @deprecated See <a href="http://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt">WebDAV Draft Changes</a> + */ + @Deprecated + DESTINATION_LOCKED(421, "Destination Locked"), + /** + * {@code 422 Unprocessable Entity}. + * + * @see <a href="http://tools.ietf.org/html/rfc4918#section-11.2">WebDAV</a> + */ + UNPROCESSABLE_ENTITY(422, "Unprocessable Entity"), + /** + * {@code 423 Locked}. + * + * @see <a href="http://tools.ietf.org/html/rfc4918#section-11.3">WebDAV</a> + */ + LOCKED(423, "Locked"), + /** + * {@code 424 Failed Dependency}. + * + * @see <a href="http://tools.ietf.org/html/rfc4918#section-11.4">WebDAV</a> + */ + FAILED_DEPENDENCY(424, "Failed Dependency"), + /** + * {@code 426 Upgrade Required}. + * + * @see <a href="http://tools.ietf.org/html/rfc2817#section-6">Upgrading to TLS Within HTTP/1.1</a> + */ + UPGRADE_REQUIRED(426, "Upgrade Required"), + /** + * {@code 428 Precondition Required}. + * + * @see <a href="http://tools.ietf.org/html/rfc6585#section-3">Additional HTTP Status Codes</a> + */ + PRECONDITION_REQUIRED(428, "Precondition Required"), + /** + * {@code 429 Too Many Requests}. + * + * @see <a href="http://tools.ietf.org/html/rfc6585#section-4">Additional HTTP Status Codes</a> + */ + TOO_MANY_REQUESTS(429, "Too Many Requests"), + /** + * {@code 431 Request Header Fields Too Large}. + * + * @see <a href="http://tools.ietf.org/html/rfc6585#section-5">Additional HTTP Status Codes</a> + */ + REQUEST_HEADER_FIELDS_TOO_LARGE(431, "Request Header Fields Too Large"), + + // --- 5xx Server Error --- + + /** + * {@code 500 Internal Server Error}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.1">HTTP/1.1: Semantics and Content, section 6.6.1</a> + */ + INTERNAL_SERVER_ERROR(500, "Internal Server Error"), + /** + * {@code 501 Not Implemented}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.2">HTTP/1.1: Semantics and Content, section 6.6.2</a> + */ + NOT_IMPLEMENTED(501, "Not Implemented"), + /** + * {@code 502 Bad Gateway}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.3">HTTP/1.1: Semantics and Content, section 6.6.3</a> + */ + BAD_GATEWAY(502, "Bad Gateway"), + /** + * {@code 503 Service Unavailable}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.4">HTTP/1.1: Semantics and Content, section 6.6.4</a> + */ + SERVICE_UNAVAILABLE(503, "Service Unavailable"), + /** + * {@code 504 Gateway Timeout}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.5">HTTP/1.1: Semantics and Content, section 6.6.5</a> + */ + GATEWAY_TIMEOUT(504, "Gateway Timeout"), + /** + * {@code 505 HTTP Version Not Supported}. + * + * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.6">HTTP/1.1: Semantics and Content, section 6.6.6</a> + */ + HTTP_VERSION_NOT_SUPPORTED(505, "HTTP Version not supported"), + /** + * {@code 506 Variant Also Negotiates} + * + * @see <a href="http://tools.ietf.org/html/rfc2295#section-8.1">Transparent Content Negotiation</a> + */ + VARIANT_ALSO_NEGOTIATES(506, "Variant Also Negotiates"), + /** + * {@code 507 Insufficient Storage} + * + * @see <a href="http://tools.ietf.org/html/rfc4918#section-11.5">WebDAV</a> + */ + INSUFFICIENT_STORAGE(507, "Insufficient Storage"), + /** + * {@code 508 Loop Detected} + * + * @see <a href="http://tools.ietf.org/html/rfc5842#section-7.2">WebDAV Binding Extensions</a> + */ + LOOP_DETECTED(508, "Loop Detected"), + /** + * {@code 509 Bandwidth Limit Exceeded} + */ + BANDWIDTH_LIMIT_EXCEEDED(509, "Bandwidth Limit Exceeded"), + /** + * {@code 510 Not Extended} + * + * @see <a href="http://tools.ietf.org/html/rfc2774#section-7">HTTP Extension Framework</a> + */ + NOT_EXTENDED(510, "Not Extended"), + /** + * {@code 511 Network Authentication Required}. + * + * @see <a href="http://tools.ietf.org/html/rfc6585#section-6">Additional HTTP Status Codes</a> + */ + NETWORK_AUTHENTICATION_REQUIRED(511, "Network Authentication Required"); + + private final int value; + + private final String reasonPhrase; + + HttpStatus(final int value, final String reasonPhrase) { + this.value = value; + this.reasonPhrase = reasonPhrase; + } + + /** + * Return the integer value of this status code. + */ + public int value() { + return this.value; + } + + /** + * Return the reason phrase of this status code. + */ + public String getReasonPhrase() { + return this.reasonPhrase; + } + + /** + * Return a string representation of this status code. + */ + @Override + public String toString() { + return Integer.toString(this.value); + } + + /** + * Return the enum constant of this type with the specified numeric value. + * + * @param statusCode the numeric value of the enum to be returned + * @return the enum constant with the specified numeric value + * @throws IllegalArgumentException if this enum has no constant for the specified numeric value + */ + public static HttpStatus valueOf(final int statusCode) { + for (final HttpStatus status : values()) { + if (status.value == statusCode) { + return status; + } + } + throw new IllegalArgumentException("No matching constant for [" + statusCode + "]"); + } +} \ No newline at end of file diff --git a/source-code/RuffCT-java/src/org/nem/core/utils/LockFile.java b/source-code/RuffCT-java/src/org/nem/core/utils/LockFile.java new file mode 100755 index 0000000..941d015 --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/utils/LockFile.java @@ -0,0 +1,82 @@ +package org.nem.core.utils; + +import java.io.*; +import java.nio.channels.*; + +/** + * Static class that exposes functions for interacting with lock files. + */ +public class LockFile { + + /** + * Tries to acquire a file lock for the specified file. + * + * @param lockFile The lock file. + * @return A handle to the file lock if acquired, or null otherwise. + */ + public static Closeable tryAcquireLock(final File lockFile) { + FileLockHandle handle = null; + try { + handle = new FileLockHandle(lockFile); + + // try to acquire the lock 5 times + for (int i = 0; i < 5; ++i) { + if (handle.tryLock()) { + return handle; + } + + ExceptionUtils.propagateVoid(() -> Thread.sleep(10)); + } + + return null; + } catch (final IOException | OverlappingFileLockException e) { + return null; + } finally { + if (null != handle && null == handle.lock) { + try { + handle.close(); + } catch (final IOException ignored) { + } + } + } + } + + /** + * Determines whether or not the specified file is locked. + * + * @param lockFile The lock file. + * @return true if the file is locked, false otherwise. + */ + public static boolean isLocked(final File lockFile) { + try (final FileLockHandle handle = new FileLockHandle(lockFile)) { + return !handle.tryLock(); + } catch (final OverlappingFileLockException e) { + return true; + } catch (final IOException e) { + return false; + } + } + + private static class FileLockHandle implements Closeable { + private final RandomAccessFile file; + private FileLock lock; + + public FileLockHandle(final File lockFile) throws IOException { + this.file = new RandomAccessFile(lockFile, "rw"); + } + + private boolean tryLock() throws IOException { + this.lock = this.file.getChannel().tryLock(); + return null != this.lock; + } + + @Override + public void close() throws IOException { + if (null != this.lock) { + this.lock.close(); + } + + this.file.close(); + } + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/utils/MustBe.java b/source-code/RuffCT-java/src/org/nem/core/utils/MustBe.java new file mode 100755 index 0000000..cd5e65d --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/utils/MustBe.java @@ -0,0 +1,118 @@ +package org.nem.core.utils; + +import java.util.Collection; +import java.util.regex.Pattern; + +/** + * Helper class for validating parameters. + */ +public class MustBe { + + /** + * Throws an exception if the specified object is null. + * + * @param obj The object. + * @param name The object name. + */ + public static void notNull(final Object obj, final String name) { + if (null == obj) { + final String message = String.format("%s cannot be null", name); + throw new IllegalArgumentException(message); + } + } + + /** + * Throws an exception if the specified string contains no non-whitespace characters. + * + * @param str The string. + * @param name The string name. + * @param maxLength The max length. + */ + public static void notWhitespace(final String str, final String name, final int maxLength) { + if (StringUtils.isNullOrWhitespace(str) || str.length() > maxLength) { + final String message = String.format("%s cannot be null, empty, or whitespace, or have length greater than %d", name, maxLength); + throw new IllegalArgumentException(message); + } + } + + /** + * Throws an exception if the specified string does not match the pattern, is empty, or longer than the max length. + * + * @param str The string. + * @param name The string name. + * @param pattern The pattern to match. + * @param maxLength The max length. + */ + public static void match(final String str, final String name, final Pattern pattern, final int maxLength) { + if (null == str || str.isEmpty() || str.length() > maxLength || !pattern.matcher(str).matches()) { + final String message = String.format("%s does not match the desired pattern", name); + throw new IllegalArgumentException(message); + } + } + + /** + * Throws an exception if the specified integer value is not in the specified inclusive range. + * + * @param value The integer value. + * @param name The value name. + * @param minInclusive The min allowed value (inclusive). + * @param maxInclusive The max allowed value (inclusive). + */ + public static void inRange(final int value, final String name, final int minInclusive, final int maxInclusive) { + inRange((long)value, name, minInclusive, maxInclusive); + } + + /** + * Throws an exception if the specified long value is not in the specified inclusive range. + * + * @param value The long value. + * @param name The value name. + * @param minInclusive The min allowed value (inclusive). + * @param maxInclusive The max allowed value (inclusive). + */ + public static void inRange(final long value, final String name, final long minInclusive, final long maxInclusive) { + if (value < minInclusive || value > maxInclusive) { + final String message = String.format("%s must be between %d and %d inclusive", name, minInclusive, maxInclusive); + throw new IllegalArgumentException(message); + } + } + + /** + * Throws an exception if the specified collection is not empty. + * + * @param collection The collection. + * @param name The collection name. + */ + public static void empty(final Collection<?> collection, final String name) { + if (!collection.isEmpty()) { + final String message = String.format("%s must be empty", name); + throw new IllegalArgumentException(message); + } + } + + /** + * Throws an exception if the specified value is not true. + * + * @param value The value. + * @param name The value name. + */ + public static void trueValue(final boolean value, final String name) { + if (!value) { + final String message = String.format("%s must be true", name); + throw new IllegalArgumentException(message); + } + } + + /** + * Throws an exception if the specified value is not false. + * + * @param value The value. + * @param name The value name. + */ + public static void falseValue(final boolean value, final String name) { + if (value) { + final String message = String.format("%s must be false", name); + throw new IllegalArgumentException(message); + } + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/utils/SetOnce.java b/source-code/RuffCT-java/src/org/nem/core/utils/SetOnce.java new file mode 100755 index 0000000..7704d02 --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/utils/SetOnce.java @@ -0,0 +1,42 @@ +package org.nem.core.utils; + +/** + * Wrapper that allows an object to be set once (or reset and set again). + * + * @param <T> The inner type. + */ +public class SetOnce<T> { + private final T defaultValue; + private T value; + + /** + * Creates a wrapper. + * + * @param defaultValue The default value. + */ + public SetOnce(final T defaultValue) { + this.defaultValue = defaultValue; + } + + /** + * Gets the inner object. + * + * @return The inner object. + */ + public T get() { + return null == this.value ? this.defaultValue : this.value; + } + + /** + * Sets the inner object. + * + * @param value The inner object. + */ + public void set(final T value) { + if (null != this.value && null != value) { + throw new IllegalStateException("cannot change value because it is already set"); + } + + this.value = value; + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/utils/StringEncoder.java b/source-code/RuffCT-java/src/org/nem/core/utils/StringEncoder.java new file mode 100755 index 0000000..25bb127 --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/utils/StringEncoder.java @@ -0,0 +1,31 @@ +package org.nem.core.utils; + +import java.nio.charset.Charset; + +/** + * Static class that contains utility functions for converting strings to and from UTF-8 bytes. + */ +public class StringEncoder { + + private static final Charset ENCODING_CHARSET = Charset.forName("UTF-8"); + + /** + * Converts a string to a UTF-8 byte array. + * + * @param s The input string. + * @return The output byte array. + */ + public static byte[] getBytes(final String s) { + return s.getBytes(ENCODING_CHARSET); + } + + /** + * Converts a UTF-8 byte array to a string. + * + * @param bytes The input byte array. + * @return The output string. + */ + public static String getString(final byte[] bytes) { + return new String(bytes, ENCODING_CHARSET); + } +} diff --git a/source-code/RuffCT-java/src/org/nem/core/utils/StringUtils.java b/source-code/RuffCT-java/src/org/nem/core/utils/StringUtils.java new file mode 100755 index 0000000..b721bc7 --- /dev/null +++ b/source-code/RuffCT-java/src/org/nem/core/utils/StringUtils.java @@ -0,0 +1,50 @@ +package org.nem.core.utils; + +/** + * Static class that contains string utility functions. + */ +public class StringUtils { + + /** + * Determines if the specified string is null or empty. + * + * @param str The string. + * @return true if the string is null or empty. + */ + public static boolean isNullOrEmpty(final String str) { + return null == str || str.isEmpty(); + } + + /** + * Determines if the specified string is null or whitespace. + * + * @param str The string. + * @return true if the string is null or whitespace. + */ + public static boolean isNullOrWhitespace(final String str) { + if (isNullOrEmpty(str)) { + return true; + } + + for (int i = 0; i < str.length(); i++) { + if (!Character.isWhitespace(str.charAt(i))) { + return false; + } + } + + return true; + } + + /** + * Replaces a variable contained in a string with a value. A variable is defined as ${variable}. + * This pattern is replaced by the given value. + * + * @param string String that contains variables. + * @param name Name of the variable to be replaced with its value. + * @param value Value that will replace the variable. + * @return string with value replacing the variable with the given name + */ + public static String replaceVariable(final String string, final String name, final String value) { + return string.replace(String.format("${%s}", name), value); + } +} diff --git a/source-code/RuffCT-java/src/test/how/monero/hodl/BootleRuffingBenchmarks.java b/source-code/RuffCT-java/src/test/how/monero/hodl/BootleRuffingBenchmarks.java new file mode 100644 index 0000000..1db643d --- /dev/null +++ b/source-code/RuffCT-java/src/test/how/monero/hodl/BootleRuffingBenchmarks.java @@ -0,0 +1,126 @@ +package test.how.monero.hodl; + +import how.monero.hodl.ringSignature.SpendParams; +import org.nem.core.crypto.ed25519.arithmetic.Ed25519GroupElement; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static how.monero.hodl.ringSignature.BootleRuffing.*; +import static test.how.monero.hodl.BootleRuffingSpendTest.createTestSpendParams; + +public class BootleRuffingBenchmarks { + + public static void spendTest() throws IOException { + + int[] inputsVariants = new int[]{1, 2, 3, 4, 5, 10, 20}; + int[] decompositionExponentVariants = new int[]{2, 3, 4, 5, 6, 7, 8, 9, 10}; + + List<List<String>> sheet = new ArrayList<>(); + List<String> sheetColTitles = new ArrayList<>(); + sheetColTitles.add("Inputs"); + sheetColTitles.add("Base"); + sheetColTitles.add("Exponent"); + sheetColTitles.add("Ring size"); + sheetColTitles.add("Generation time (ms)"); + sheetColTitles.add("Generation scalar mults"); + sheetColTitles.add("Generation G scalar mults"); + sheetColTitles.add("Verification time (ms)"); + sheetColTitles.add("Verification scalar mults"); + sheetColTitles.add("Verification G scalar mults"); + sheetColTitles.add("Signature length excl. vins (bytes)"); + sheetColTitles.add("MLSAG equiv. length excl. vins (bytes)"); + sheet.add(sheetColTitles); + + int testIterations = 1; + int decompositionBase = 2; + + for(int inputs : inputsVariants) { + for(int decompositionExponent : decompositionExponentVariants) { + + System.out.println("******* inputs: " + inputs + ", decompositionExponent: " + decompositionExponent); + + long startMs = new Date().getTime(); + SpendParams[] sp = new SpendParams[testIterations]; + for (int i=0; i<testIterations; i++) sp[i] = createTestSpendParams(decompositionBase, decompositionExponent, inputs); + long spendParamsGenerationDuration = (new Date().getTime()-startMs); + System.out.println("Spend params generation duration: " + spendParamsGenerationDuration + " ms"); + + startMs = new Date().getTime(); + // create a transaction to spend the outputs, resulting in a signature that proves the authority to send them + SpendSignature[] spendSignature = new SpendSignature[testIterations]; + for (int i=0; i<testIterations; i++) { + Ed25519GroupElement.scalarMults = 0; + Ed25519GroupElement.scalarBaseMults = 0; + spendSignature[i] = SPEND(sp[i]); + } + int spendScalarMults = Ed25519GroupElement.scalarMults; + int spendScalarBaseMults = Ed25519GroupElement.scalarBaseMults; + + long spendSignatureGenerationDuration = (new Date().getTime()-startMs); + System.out.println("Spend signature generation duration: " + spendSignatureGenerationDuration + " ms"); + + byte[][] spendSignatureBytes = new byte[testIterations][]; + spendSignatureBytes[0] = spendSignature[0].toBytes(); + System.out.println("Spend Signature length (bytes):" + spendSignatureBytes[0].length); + + startMs = new Date().getTime(); + + // verify the spend transaction + for (int i=0; i<testIterations; i++) { + Ed25519GroupElement.scalarMults = 0; + Ed25519GroupElement.scalarBaseMults = 0; + boolean verified = VER(sp[i].ki, sp[i].pk, sp[i].co, spendSignature[i].co1, sp[i].M, spendSignature[i]); + System.out.println("verified: " + verified); + } + int verifyScalarMults = Ed25519GroupElement.scalarMults; + int verifyScalarBaseMults = Ed25519GroupElement.scalarBaseMults; + + + long spendSignatureVerificationDuration = (new Date().getTime()-startMs); + System.out.println("Signature verification duration: " + spendSignatureVerificationDuration + " ms"); + + + List<String> sheetCols = new ArrayList<>(); + sheetCols.add(inputs+""); + sheetCols.add(decompositionBase+""); + sheetCols.add(decompositionExponent+""); + sheetCols.add(((int)Math.pow(decompositionBase, decompositionExponent))+""); + sheetCols.add((spendSignatureGenerationDuration/testIterations)+""); + sheetCols.add((spendScalarMults)+""); + sheetCols.add((spendScalarBaseMults)+""); + sheetCols.add((spendSignatureVerificationDuration/testIterations)+""); + sheetCols.add((verifyScalarMults)+""); + sheetCols.add((verifyScalarBaseMults)+""); + sheetCols.add((spendSignatureBytes[0].length)+""); + sheetCols.add((inputs * (32 + 64 * ((int) Math.pow(decompositionBase, decompositionExponent))))+""); + sheet.add(sheetCols); + + } + } + + String csv = ""; + for(List<String> row : sheet) { + for(int i=0; i<row.size(); i++) { + csv+=row.get(i); + if(i!=(row.size()-1)) csv+=","; + else csv+="\n"; + } + } + System.out.println(csv); + Files.write(new File(System.getProperty("user.home"), "bootleruffing-benchmarks.csv").toPath(), csv.getBytes()); + + } + + + public static void main(String[] args) throws Exception { + long startTime = new Date().getTime(); + spendTest(); + System.out.println("\nTotal duration: " + (new Date().getTime()-startTime) + " ms"); + } + +} diff --git a/source-code/RuffCT-java/src/test/how/monero/hodl/BootleRuffingSpendTest.java b/source-code/RuffCT-java/src/test/how/monero/hodl/BootleRuffingSpendTest.java new file mode 100644 index 0000000..d2ff27f --- /dev/null +++ b/source-code/RuffCT-java/src/test/how/monero/hodl/BootleRuffingSpendTest.java @@ -0,0 +1,168 @@ +package test.how.monero.hodl; + +import how.monero.hodl.crypto.PointPair; +import how.monero.hodl.crypto.Scalar; +import how.monero.hodl.ringSignature.SpendParams; +import org.nem.core.crypto.ed25519.arithmetic.Ed25519GroupElement; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; + +import static how.monero.hodl.crypto.CryptoUtil.*; +import static how.monero.hodl.ringSignature.BootleRuffing.*; + +public class BootleRuffingSpendTest { + + public static SpendParams createTestSpendParams(int decompositionBase, int decompositionExponent, int inputs) { + + // ring size must be a power of the decomposition base + int ringSize = (int) Math.pow(decompositionBase, decompositionExponent); + + SpendParams sp = new SpendParams(); + + sp.decompositionBase = decompositionBase; + sp.decompositionExponent = decompositionExponent; + + // The owned inputs that are going to be spent + Output[] realInputs = new Output[inputs]; + for(int i=0; i<inputs; i++) realInputs[i] = Output.genRandomOutput(BigInteger.valueOf((long)(Math.random()*1000+1000))); + + // The new outputs to be created (typically one for the recipient one for change) + BigInteger fee = BigInteger.valueOf(0); //keep fee as zero for now, to avoid overcomplicating things + Output[] outputs = new Output[2]; + outputs[0] = Output.genRandomOutput(realInputs[0].amount.divide(BigInteger.valueOf(2))); + outputs[1] = Output.genRandomOutput(BigInteger.valueOf(Arrays.stream(realInputs).mapToLong(i->i.amount.longValue()).sum()).subtract(fee).subtract(outputs[0].amount)); + + sp.iAsterisk = (int) Math.floor(Math.random()*ringSize); // the ring index of the sender's owned inputs + + // input commitments + // commitments to the amounts of all inputs referenced in the transaction (real inputs and decoys) + Ed25519GroupElement[][] inputCommitments = new Ed25519GroupElement[inputs][ringSize]; + for(int j=0; j<inputs; j++) { + for(int i=0; i<ringSize; i++) { + if(i==sp.iAsterisk) inputCommitments[j][i] = realInputs[j].co; + else inputCommitments[j][i] = randomPoint(); + } + } + + // there is a co commitment for each ring + // each member of co is sum(COMp(input amt i)) - sum(COMp(output amt i)) + sp.co = new Ed25519GroupElement[ringSize]; + for(int i=0; i<ringSize; i++) { + sp.co[i] = inputCommitments[0][i]; + for(int j=1; j<inputs; j++) { + sp.co[i] = sp.co[i].toP3().add(inputCommitments[j][i].toP3().toCached()); + } + for(int k=0; k<outputs.length; k++) { + sp.co[i] = sp.co[i].toP3().subtract(outputs[k].co.toP3().toCached()); + } + } + + // the public keys for every input referenced (including real inputs and decoys) + sp.pk = new PointPair[inputs][ringSize]; + + // the secret key for every real input referenced + sp.sk = new SK[inputs]; + + // the key image for every real input referenced + sp.ki = new Ed25519GroupElement[inputs]; + + for(int j=0; j<inputs; j++) { + for(int i=0; i<ringSize; i++) { + sp.pk[j][i] = (i==sp.iAsterisk) ? realInputs[j].pk : KEYGEN().pk; + } + sp.sk[j] = realInputs[j].sk; + sp.ki[j] = realInputs[j].ki; + } + + // the message being signed is a hash of the transaction, as defined in the C codebase as get_pre_mlsag_hash + sp.M = fastHash(randomMessage(100)); + + sp.s = Scalar.ZERO; + for(int i=0; i<realInputs.length; i++) sp.s = sp.s.add(realInputs[i].mask); + for(int i=0; i<outputs.length; i++) sp.s = sp.s.sub(outputs[i].mask); + + Ed25519GroupElement S = realInputs[0].co; + for(int i=1; i<realInputs.length; i++) S = S.toP3().add(realInputs[i].co.toP3().toCached()); + S = S.toP3().subtract(G.scalarMultiply(new Scalar(fee)).toP3().toCached()); + for(int i=0; i<outputs.length; i++) S = S.toP3().subtract(outputs[i].co.toP3().toCached()); + + Ed25519GroupElement S1 = getHpnGLookup(1).scalarMultiply(sp.s); + + if(!S.toP3().equals(S1)) throw new RuntimeException("S != S'"); + + return sp; + } + + public static void spendTest() { + + boolean pauseAtEachStage = false; + int testIterations = 1; + int decompositionBase = 2; + int decompositionExponent = 8; + int inputs = 2; + + System.out.println("Ring size: " + Math.pow(decompositionBase, decompositionExponent)); + System.out.println("Inputs: " + inputs); + + long startMs = new Date().getTime(); + SpendParams[] sp = new SpendParams[testIterations]; + for (int i=0; i<testIterations; i++) sp[i] = createTestSpendParams(decompositionBase, decompositionExponent, inputs); + System.out.println("Spend params generation duration: " + (new Date().getTime()-startMs) + " ms"); + + if(pauseAtEachStage) { System.out.println("Press enter to continue"); try { System.in.read(); } catch (Exception e) {}; System.out.println("Continuing..."); } + + Ed25519GroupElement.scalarMults = 0; + Ed25519GroupElement.scalarBaseMults = 0; + + startMs = new Date().getTime(); + // create a transaction to spend the outputs, resulting in a signature that proves the authority to send them + SpendSignature[] spendSignature = new SpendSignature[testIterations]; + for (int i=0; i<testIterations; i++) spendSignature[i] = SPEND(sp[i]); + + System.out.println("Spend signature generation duration: " + (new Date().getTime()-startMs) + " ms"); + + byte[][] spendSignatureBytes = new byte[testIterations][]; + for (int i=0; i<testIterations; i++) { + spendSignatureBytes[i] = spendSignature[i].toBytes(); + System.out.println("Spend Signature length (bytes):" + spendSignatureBytes[i].length); + } + + if(pauseAtEachStage) { System.out.println("Press enter to continue"); try { System.in.read(); } catch (Exception e) {}; System.out.println("Continuing..."); } + startMs = new Date().getTime(); + + System.out.println("Spend ScalarMults: " + Ed25519GroupElement.scalarMults); + System.out.println("Spend BaseScalarMults: " + Ed25519GroupElement.scalarBaseMults); + Ed25519GroupElement.scalarMults = 0; + Ed25519GroupElement.scalarBaseMults = 0; + + //Ed25519GroupElement.enableLineRecording = true; + Ed25519GroupElement.lineRecordingSourceFile = "BootleRuffing.java"; + + // verify the spend transaction + for (int i=0; i<testIterations; i++) { + + spendSignature[i] = SpendSignature.fromBytes(spendSignatureBytes[i]); + + boolean verified = VER(sp[i].ki, sp[i].pk, sp[i].co, spendSignature[i].co1, sp[i].M, spendSignature[i]); + System.out.println("verified: " + verified); + } + + System.out.println("Verify ScalarMults: " + Ed25519GroupElement.scalarMults); + System.out.println("Verify BaseScalarMults: " + Ed25519GroupElement.scalarBaseMults); + + System.out.println("Signature verification duration: " + (new Date().getTime()-startMs) + " ms"); + + if(Ed25519GroupElement.enableLineRecording) Ed25519GroupElement.lineNumberCallFrequencyMap.entrySet().stream().forEach(e->{System.out.println("line: " + e.getKey() + ", calls: " + e.getValue());}); + + } + + public static void main(String[] args) { + long startTime = new Date().getTime(); + spendTest(); + System.out.println("Total duration: " + (new Date().getTime()-startTime) + " ms"); + } + +} diff --git a/source-code/RuffCT-java/src/test/how/monero/hodl/Prove1Valid1Test1.java b/source-code/RuffCT-java/src/test/how/monero/hodl/Prove1Valid1Test1.java new file mode 100644 index 0000000..9427c18 --- /dev/null +++ b/source-code/RuffCT-java/src/test/how/monero/hodl/Prove1Valid1Test1.java @@ -0,0 +1,29 @@ +package test.how.monero.hodl; + +import how.monero.hodl.crypto.Scalar; +import org.nem.core.crypto.ed25519.arithmetic.Ed25519GroupElement; + +import static how.monero.hodl.crypto.CryptoUtil.COMb; +import static how.monero.hodl.ringSignature.BootleRuffing.*; + +public class Prove1Valid1Test1 { + + public static void main(String[] args) { + + Scalar[][] b = new Scalar[][] { + new Scalar[]{Scalar.ONE, Scalar.ZERO}, + new Scalar[]{Scalar.ZERO, Scalar.ONE} + }; + + Scalar r = Scalar.ONE; + + Proof1 P = PROVE1(b, r); + + Ed25519GroupElement B = COMb(b, r); + + System.out.println("VALID1 returns " + VALID1(B, P)); + + } + + +} diff --git a/source-code/RuffCT-java/src/test/how/monero/hodl/Prove2Valid2Test1.java b/source-code/RuffCT-java/src/test/how/monero/hodl/Prove2Valid2Test1.java new file mode 100644 index 0000000..a21b373 --- /dev/null +++ b/source-code/RuffCT-java/src/test/how/monero/hodl/Prove2Valid2Test1.java @@ -0,0 +1,37 @@ +package test.how.monero.hodl; + +import how.monero.hodl.crypto.PointPair; +import how.monero.hodl.crypto.Scalar; + +import static how.monero.hodl.crypto.CryptoUtil.COMeg; +import static how.monero.hodl.ringSignature.BootleRuffing.*; + +public class Prove2Valid2Test1 { + + public static void main(String[] args) { + + System.out.println("Test: " + new Object(){}.getClass().getEnclosingClass().getName()); + + // [c[0], c[1]] = [ COMeg(0, r), COMeg(1, s) ] with secret index 0 should PASS + Scalar r = Scalar.ONE; + Scalar s = Scalar.ONE; + + PointPair[] co = new PointPair[]{ + COMeg(Scalar.ZERO, r), + COMeg(Scalar.ONE, s) + }; + + int iAsterisk = 0; + + int inputs = 1; + int decompositionBase = 2; + int decompositionExponent = 1; + + Proof2 P2 = PROVE2(co, iAsterisk, r, inputs, decompositionBase, decompositionExponent); + + System.out.println("VALID2 result: " + VALID2(decompositionBase, P2, co)); + + } + + +} diff --git a/source-code/RuffCT-java/src/test/how/monero/hodl/Prove2Valid2Test1a.java b/source-code/RuffCT-java/src/test/how/monero/hodl/Prove2Valid2Test1a.java new file mode 100644 index 0000000..9f0cee7 --- /dev/null +++ b/source-code/RuffCT-java/src/test/how/monero/hodl/Prove2Valid2Test1a.java @@ -0,0 +1,42 @@ +package test.how.monero.hodl; + +import how.monero.hodl.crypto.PointPair; +import how.monero.hodl.crypto.Scalar; + +import static how.monero.hodl.crypto.CryptoUtil.COMeg; +import static how.monero.hodl.ringSignature.BootleRuffing.*; + +public class Prove2Valid2Test1a { + + public static void main(String[] args) { + + System.out.println("Test: " + new Object(){}.getClass().getEnclosingClass().getName()); + + Scalar r = Scalar.ONE; + + PointPair[] co = new PointPair[]{ + COMeg(Scalar.ONE,Scalar.ONE), + COMeg(Scalar.ONE,Scalar.ONE), + COMeg(Scalar.ONE,Scalar.ONE), + COMeg(Scalar.ONE,Scalar.ONE), + COMeg(Scalar.ONE,Scalar.ONE), + COMeg(Scalar.ZERO, Scalar.ONE), + COMeg(Scalar.ONE,Scalar.ONE), + COMeg(Scalar.ONE,Scalar.ONE), + COMeg(Scalar.ONE,Scalar.ONE), + }; + + int iAsterisk = 5; + + int inputs = 1; + int decompositionBase = 3; + int decompositionExponent = 2; + + Proof2 P2 = PROVE2(co, iAsterisk, r, inputs, decompositionBase, decompositionExponent); + + System.out.println("VALID2 result: " + VALID2(decompositionBase, P2, co)); + + } + + +} diff --git a/source-code/RuffCT-java/src/test/how/monero/hodl/Prove2Valid2Test1b.java b/source-code/RuffCT-java/src/test/how/monero/hodl/Prove2Valid2Test1b.java new file mode 100644 index 0000000..891b464 --- /dev/null +++ b/source-code/RuffCT-java/src/test/how/monero/hodl/Prove2Valid2Test1b.java @@ -0,0 +1,61 @@ +package test.how.monero.hodl; + +import how.monero.hodl.crypto.PointPair; +import how.monero.hodl.crypto.Scalar; +import org.nem.core.crypto.ed25519.arithmetic.Ed25519GroupElement; + +import java.util.Date; + +import static how.monero.hodl.crypto.CryptoUtil.COMeg; +import static how.monero.hodl.ringSignature.BootleRuffing.*; + +public class Prove2Valid2Test1b { + + public static void main(String[] args) { + + System.out.println("Test: " + new Object(){}.getClass().getEnclosingClass().getName()); + + Scalar r = Scalar.ONE; + + for(int k=1; k<=64; k++) { + + System.out.println("---------------------------------------------------------------------------"); + int len = (int) Math.pow(2, k); + PointPair[] co = new PointPair[len]; + for (int i = 0; i < len; i++) co[i] = COMeg(Scalar.intToScalar(i), Scalar.ONE); + + int iAsterisk = 0; + + int inputs = 1; + int decompositionBase = 2; + int decompositionExponent = k; + + System.out.println("k: " + k); + System.out.println("decompositionBase: " + decompositionBase); + System.out.println("decompositionExponent: " + decompositionExponent); + + Ed25519GroupElement.scalarMults = 0; + Ed25519GroupElement.scalarBaseMults = 0; + long startMs = new Date().getTime(); + + Proof2 P2 = PROVE2(co, iAsterisk, r, inputs, decompositionBase, decompositionExponent); + + System.out.println("PROVE2 duration: " + (new Date().getTime() - startMs) + " ms"); + System.out.println("PROVE2 ScalarMults: " + Ed25519GroupElement.scalarMults); + System.out.println("PROVE2 BaseScalarMults: " + Ed25519GroupElement.scalarBaseMults); + Ed25519GroupElement.scalarMults = 0; + Ed25519GroupElement.scalarBaseMults = 0; + startMs = new Date().getTime(); + + System.out.println("VALID2 result: " + VALID2(decompositionBase, P2, co)); + + System.out.println("VALID2 ScalarMults: " + Ed25519GroupElement.scalarMults); + System.out.println("VALID2 BaseScalarMults: " + Ed25519GroupElement.scalarBaseMults); + + System.out.println("VALID2 duration: " + (new Date().getTime() - startMs) + " ms"); + } + + } + + +}