From 0825e974362ee5e62f44e08fae08dbb10e48383c Mon Sep 17 00:00:00 2001 From: moneromooo-monero Date: Tue, 24 Jul 2018 20:26:43 +0100 Subject: [PATCH] multiexp: fix wrong Bos-Coster result for 1 non trivial input Reported by QuarksLab. --- src/ringct/multiexp.cc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/ringct/multiexp.cc b/src/ringct/multiexp.cc index f9ef9e422..b05840322 100644 --- a/src/ringct/multiexp.cc +++ b/src/ringct/multiexp.cc @@ -222,17 +222,21 @@ rct::key bos_coster_heap_conv_robust(std::vector data) points = heap.size(); if (points == 0) return rct::identity(); + + auto Comp = [&](size_t e0, size_t e1) { return data[e0].scalar < data[e1].scalar; }; + std::make_heap(heap.begin(), heap.end(), Comp); + if (points < 2) { + std::pop_heap(heap.begin(), heap.end(), Comp); + size_t index1 = heap.back(); ge_p2 p2; - ge_scalarmult(&p2, data[0].scalar.bytes, &data[0].point); + ge_scalarmult(&p2, data[index1].scalar.bytes, &data[index1].point); rct::key res; ge_tobytes(res.bytes, &p2); return res; } - auto Comp = [&](size_t e0, size_t e1) { return data[e0].scalar < data[e1].scalar; }; - std::make_heap(heap.begin(), heap.end(), Comp); MULTIEXP_PERF(PERF_TIMER_STOP(setup)); MULTIEXP_PERF(PERF_TIMER_START_UNIT(loop, 1000000));