From 399a9db478813a0cf97b41e9faef51efa88b2b54 Mon Sep 17 00:00:00 2001 From: Henry de Valence Date: Thu, 16 Nov 2017 11:14:46 -0800 Subject: [PATCH] Generate AFFINE_ODD_MULTIPLES_OF_BASEPOINT at compile time --- build.rs | 16 +++++++++++- src/constants_32bit.rs | 48 ------------------------------------ src/constants_64bit.rs | 55 ------------------------------------------ src/edwards.rs | 1 + 4 files changed, 16 insertions(+), 104 deletions(-) diff --git a/build.rs b/build.rs index 4917687..f7040ac 100644 --- a/build.rs +++ b/build.rs @@ -1,5 +1,6 @@ #![cfg_attr(feature = "nightly", feature(i128_type))] #![allow(unused_variables)] +#![allow(non_snake_case)] #![allow(dead_code)] extern crate core; @@ -87,5 +88,18 @@ use edwards::EdwardsBasepointTable; /// The table is defined so `constants::base[i][j-1] = j*(16^2i)*B`, /// for `0 ≤ i < 32`, `1 ≤ j < 9`. pub const ED25519_BASEPOINT_TABLE: EdwardsBasepointTable = {:?}; - \n\n", &table).as_bytes()).unwrap(); + \n\n", &table).as_bytes()).unwrap(); + + // Now generate AFFINE_ODD_MULTIPLES_OF_BASEPOINT + let B = &constants::ED25519_BASEPOINT_POINT; + let B2 = B.double(); + let mut odd_multiples = [B.to_affine_niels(); 8]; + for i in 0..7 { + odd_multiples[i+1] = (&B2 + &odd_multiples[i]).to_extended().to_affine_niels(); + } + + f.write_all(format!("\n +/// Odd multiples of the basepoint `[B, 3B, 5B, 7B, 9B, 11B, 13B, 15B]`. +pub(crate) const AFFINE_ODD_MULTIPLES_OF_BASEPOINT: [AffineNielsPoint; 8] = {:?}; + \n\n", &odd_multiples).as_bytes()).unwrap(); } diff --git a/src/constants_32bit.rs b/src/constants_32bit.rs index 730cce5..9fbf670 100644 --- a/src/constants_32bit.rs +++ b/src/constants_32bit.rs @@ -12,12 +12,9 @@ //! and useful field elements like `sqrt(-1)`), as well as //! lookup tables of pre-computed points. -#![allow(non_snake_case)] - use field_32bit::FieldElement32; use scalar_32bit::Scalar32; use edwards::ExtendedPoint; -use edwards::AffineNielsPoint; /// Edwards `d` value, equal to `-121665/121666 mod p`. pub(crate) const EDWARDS_D: FieldElement32 = FieldElement32([ @@ -148,48 +145,3 @@ pub const EIGHT_TORSION: [ExtendedPoint; 8] = [ T: FieldElement32([25262188, 11972680, -11716002, 5869612, 18193162, -16297739, -20670665, 8559098, -3541543, 5011181]) }, ]; - -/// Odd multiples of the basepoint `[B, 3B, 5B, 7B, 9B, 11B, 13B, 15B]`. -pub(crate) const AFFINE_ODD_MULTIPLES_OF_BASEPOINT: [AffineNielsPoint; 8] = [ - AffineNielsPoint{ - y_plus_x: FieldElement32([25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605]), - y_minus_x: FieldElement32([-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378]), - xy2d: FieldElement32([-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546]), - }, - AffineNielsPoint{ - y_plus_x: FieldElement32([15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024]), - y_minus_x: FieldElement32([16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574]), - xy2d: FieldElement32([30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357]), - }, - AffineNielsPoint{ - y_plus_x: FieldElement32([10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380]), - y_minus_x: FieldElement32([4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306]), - xy2d: FieldElement32([19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942]), - }, - AffineNielsPoint{ - y_plus_x: FieldElement32([5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766]), - y_minus_x: FieldElement32([-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701]), - xy2d: FieldElement32([28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300]), - }, - AffineNielsPoint{ - y_plus_x: FieldElement32([-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877]), - y_minus_x: FieldElement32([-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951]), - xy2d: FieldElement32([4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784]), - }, - AffineNielsPoint{ - y_plus_x: FieldElement32([-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436]), - y_minus_x: FieldElement32([25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918]), - xy2d: FieldElement32([23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877]), - }, - AffineNielsPoint{ - y_plus_x: FieldElement32([-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800]), - y_minus_x: FieldElement32([-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305]), - xy2d: FieldElement32([-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300]), - }, - AffineNielsPoint{ - y_plus_x: FieldElement32([-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876]), - y_minus_x: FieldElement32([-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619]), - xy2d: FieldElement32([-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683]), - }, -]; - diff --git a/src/constants_64bit.rs b/src/constants_64bit.rs index 4ef0718..c9d6b4a 100644 --- a/src/constants_64bit.rs +++ b/src/constants_64bit.rs @@ -12,12 +12,9 @@ //! and useful field elements like `sqrt(-1)`), as well as //! lookup tables of pre-computed points. -#![allow(non_snake_case)] - use field_64bit::FieldElement64; use scalar_64bit::Scalar64; use edwards::ExtendedPoint; -use edwards::AffineNielsPoint; /// Edwards `d` value, equal to `-121665/121666 mod p`. pub(crate) const EDWARDS_D: FieldElement64 = FieldElement64([929955233495203, 466365720129213, 1662059464998953, 2033849074728123, 1442794654840575]); @@ -133,55 +130,3 @@ pub const EIGHT_TORSION: [ExtendedPoint; 8] = [ T: FieldElement64([803472979097708, 393902981724766, 1158077081819914, 574391322974006, 336294660666841]), } ]; - -/// Odd multiples of the basepoint `[B, 3B, 5B, 7B, 9B, 11B, 13B, 15B]`. -pub(crate) const AFFINE_ODD_MULTIPLES_OF_BASEPOINT: [AffineNielsPoint; 8] = [ - AffineNielsPoint { - y_plus_x: FieldElement64([1288382639258501, 245678601348599, 269427782077623, 1462984067271730, 137412439391563]), - y_minus_x: FieldElement64([62697248952638, 204681361388450, 631292143396476, 338455783676468, 1213667448819585]), - xy2d: FieldElement64([301289933810280, 1259582250014073, 1422107436869536, 796239922652654, 1953934009299142]), - } - , - AffineNielsPoint { - y_plus_x: FieldElement64([1601611775252272, 1720807796594148, 1132070835939856, 1260455018889551, 2147779492816911]), - y_minus_x: FieldElement64([316559037616741, 2177824224946892, 1459442586438991, 1461528397712656, 751590696113597]), - xy2d: FieldElement64([1850748884277385, 1200145853858453, 1068094770532492, 672251375690438, 1586055907191707]), - } - , - AffineNielsPoint { - y_plus_x: FieldElement64([769950342298419, 132954430919746, 844085933195555, 974092374476333, 726076285546016]), - y_minus_x: FieldElement64([425251763115706, 608463272472562, 442562545713235, 837766094556764, 374555092627893]), - xy2d: FieldElement64([1086255230780037, 274979815921559, 1960002765731872, 929474102396301, 1190409889297339]), - } - , - AffineNielsPoint { - y_plus_x: FieldElement64([665000864555967, 2065379846933859, 370231110385876, 350988370788628, 1233371373142985]), - y_minus_x: FieldElement64([2019367628972465, 676711900706637, 110710997811333, 1108646842542025, 517791959672113]), - xy2d: FieldElement64([965130719900578, 247011430587952, 526356006571389, 91986625355052, 2157223321444601]), - } - , - AffineNielsPoint { - y_plus_x: FieldElement64([1802695059465007, 1664899123557221, 593559490740857, 2160434469266659, 927570450755031]), - y_minus_x: FieldElement64([1725674970513508, 1933645953859181, 1542344539275782, 1767788773573747, 1297447965928905]), - xy2d: FieldElement64([1381809363726107, 1430341051343062, 2061843536018959, 1551778050872521, 2036394857967624]), - } - , - AffineNielsPoint { - y_plus_x: FieldElement64([1970894096313054, 528066325833207, 1619374932191227, 2207306624415883, 1169170329061080]), - y_minus_x: FieldElement64([2070390218572616, 1458919061857835, 624171843017421, 1055332792707765, 433987520732508]), - xy2d: FieldElement64([893653801273833, 1168026499324677, 1242553501121234, 1306366254304474, 1086752658510815]), - } - , - AffineNielsPoint { - y_plus_x: FieldElement64([213454002618221, 939771523987438, 1159882208056014, 317388369627517, 621213314200687]), - y_minus_x: FieldElement64([1971678598905747, 338026507889165, 762398079972271, 655096486107477, 42299032696322]), - xy2d: FieldElement64([177130678690680, 1754759263300204, 1864311296286618, 1180675631479880, 1292726903152791]), - } - , - AffineNielsPoint { - y_plus_x: FieldElement64([1913163449625248, 460779200291993, 2193883288642314, 1008900146920800, 1721983679009502]), - y_minus_x: FieldElement64([1070401523076875, 1272492007800961, 1910153608563310, 2075579521696771, 1191169788841221]), - xy2d: FieldElement64([692896803108118, 500174642072499, 2068223309439677, 1162190621851337, 1426986007309901]), - } -]; - diff --git a/src/edwards.rs b/src/edwards.rs index 9e68f05..8b6ecc0 100644 --- a/src/edwards.rs +++ b/src/edwards.rs @@ -1228,6 +1228,7 @@ pub mod vartime { /// Given a point `A` and scalars `a` and `b`, compute the point /// `aA+bB`, where `B` is the Ed25519 basepoint (i.e., `B = (x,4/5)` /// with x positive). + #[cfg(feature="precomputed_tables")] pub fn double_scalar_mult_basepoint(a: &Scalar, A: &ExtendedPoint, b: &Scalar) -> ExtendedPoint {