15void recover_fixed_wnaf(
const uint64_t* wnaf,
bool skew, uint64_t& hi, uint64_t& lo,
size_t wnaf_bits)
39 uint64_t
buffer[2]{ 0, 0 };
42 wnaf::fixed_wnaf<1, 5>(
buffer, wnaf, skew, 0);
43 uint64_t recovered_hi = 0;
44 uint64_t recovered_lo = 0;
45 recover_fixed_wnaf(wnaf, skew, recovered_hi, recovered_lo, 5);
46 EXPECT_EQ(recovered_lo, 0UL);
47 EXPECT_EQ(recovered_hi, 0UL);
48 EXPECT_EQ(
buffer[0], recovered_lo);
49 EXPECT_EQ(
buffer[1], recovered_hi);
52TEST(wnaf, WnafTwoBitWindow)
58 constexpr uint32_t window = 2;
59 constexpr uint32_t num_bits = 254;
60 constexpr uint32_t num_quads = (num_bits >> 1) + 1;
61 uint64_t wnaf[num_quads] = { 0 };
63 wnaf::fixed_wnaf<256, 1, window>(&input.
data[0], wnaf, skew, 0);
91 for (uint64_t i : wnaf) {
92 int extracted = 2 * (
static_cast<int>(i) & 1) + 1;
93 bool sign = (i >> 31) == 0;
96 recovered +=
uint256_t(
static_cast<uint64_t
>(extracted)) * four_power;
98 recovered -=
uint256_t(
static_cast<uint64_t
>(extracted)) * four_power;
102 recovered -=
static_cast<uint64_t
>(skew);
103 EXPECT_EQ(recovered, input);
112 wnaf::fixed_wnaf<1, 5>(&
buffer.data[0], wnaf, skew, 0);
113 uint64_t recovered_hi = 0;
114 uint64_t recovered_lo = 0;
115 recover_fixed_wnaf(wnaf, skew, recovered_hi, recovered_lo, 5);
116 EXPECT_EQ(
buffer.data[0], recovered_lo);
117 EXPECT_EQ(
buffer.data[1], recovered_hi);
122 uint64_t rand_buffer[2]{ 1, 0 };
125 wnaf::fixed_wnaf<1, 5>(rand_buffer, wnaf, skew, 0);
126 uint64_t recovered_hi = 0;
127 uint64_t recovered_lo = 0;
128 recover_fixed_wnaf(wnaf, skew, recovered_hi, recovered_lo, 5);
129 EXPECT_EQ(rand_buffer[0], recovered_lo);
130 EXPECT_EQ(rand_buffer[1], recovered_hi);
135 uint64_t rand_buffer[2] = { 0, 1 };
138 wnaf::fixed_wnaf<1, 5>(rand_buffer, wnaf, skew, 0);
139 uint64_t recovered_hi = 0;
140 uint64_t recovered_lo = 0;
141 recover_fixed_wnaf(wnaf, skew, recovered_hi, recovered_lo, 5);
142 EXPECT_EQ(rand_buffer[0], recovered_lo);
143 EXPECT_EQ(rand_buffer[1], recovered_hi);
146TEST(wnaf, WnafFixedWithEndoSplit)
149 k.
data[3] &= 0x0fffffffffffffffUL;
156 uint64_t endo_wnaf[
WNAF_SIZE(5)] = { 0 };
158 bool endo_skew =
false;
159 wnaf::fixed_wnaf<1, 5>(&k1.data[0], wnaf, skew, 0);
160 wnaf::fixed_wnaf<1, 5>(&k2.data[0], endo_wnaf, endo_skew, 0);
162 fr k1_recovered{ 0, 0, 0, 0 };
163 fr k2_recovered{ 0, 0, 0, 0 };
165 recover_fixed_wnaf(wnaf, skew, k1_recovered.data[1], k1_recovered.data[0], 5);
166 recover_fixed_wnaf(endo_wnaf, endo_skew, k2_recovered.data[1], k2_recovered.data[0], 5);
170 result = k2_recovered * lambda;
171 result = k1_recovered - result;
173 EXPECT_EQ(result, k);