From cfbcb6ca6167f2f90ffdd34394050e48715d1dd5 Mon Sep 17 00:00:00 2001 From: Isis Lovecruft Date: Mon, 30 Dec 2019 22:05:01 +0000 Subject: [PATCH] Implement conversions between basepoint table sizes. This is useful for programs/protocol which can do some heuristics or learning-based approach towards optimising the table size based on the number of uses of e.g. a public key, the second basepoint in a Pedersen commitment, etc., i.e. the first time a public key is used to verify a signature, the usual variable-time basepoint multiscalar multiplication is used, however after 1000 verifications, the table size is upgraded, and again after 10000 verifications, etc. --- src/edwards.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/edwards.rs b/src/edwards.rs index 40b2b5e..b64e4a3 100644 --- a/src/edwards.rs +++ b/src/edwards.rs @@ -911,6 +911,29 @@ impl_basepoint_table! {Name = EdwardsBasepointTableRadix256, LookupTable = Looku // it. pub type EdwardsBasepointTableRadix16 = EdwardsBasepointTable; +macro_rules! impl_basepoint_table_conversions { + (LHS = $lhs:ty, RHS = $rhs:ty) => { + impl<'a> From<&'a $lhs> for $rhs { + fn from(table: &'a $lhs) -> $rhs { + <$rhs>::create(&table.basepoint()) + } + } + + impl<'a> From<&'a $rhs> for $lhs { + fn from(table: &'a $rhs) -> $lhs { + <$lhs>::create(&table.basepoint()) + } + } + } +} + +impl_basepoint_table_conversions!{LHS = EdwardsBasepointTableRadix16, RHS = EdwardsBasepointTableRadix64} +impl_basepoint_table_conversions!{LHS = EdwardsBasepointTableRadix16, RHS = EdwardsBasepointTableRadix128} +impl_basepoint_table_conversions!{LHS = EdwardsBasepointTableRadix16, RHS = EdwardsBasepointTableRadix256} +impl_basepoint_table_conversions!{LHS = EdwardsBasepointTableRadix64, RHS = EdwardsBasepointTableRadix128} +impl_basepoint_table_conversions!{LHS = EdwardsBasepointTableRadix64, RHS = EdwardsBasepointTableRadix256} +impl_basepoint_table_conversions!{LHS = EdwardsBasepointTableRadix128, RHS = EdwardsBasepointTableRadix256} + impl EdwardsPoint { /// Multiply by the cofactor: return \\([8]P\\). pub fn mul_by_cofactor(&self) -> EdwardsPoint {