|  | 
|  | 1 | +// Copyright (c) 2025, The Monero Project | 
|  | 2 | +//  | 
|  | 3 | +// All rights reserved. | 
|  | 4 | +//  | 
|  | 5 | +// Redistribution and use in source and binary forms, with or without modification, are | 
|  | 6 | +// permitted provided that the following conditions are met: | 
|  | 7 | +//  | 
|  | 8 | +// 1. Redistributions of source code must retain the above copyright notice, this list of | 
|  | 9 | +//    conditions and the following disclaimer. | 
|  | 10 | +//  | 
|  | 11 | +// 2. Redistributions in binary form must reproduce the above copyright notice, this list | 
|  | 12 | +//    of conditions and the following disclaimer in the documentation and/or other | 
|  | 13 | +//    materials provided with the distribution. | 
|  | 14 | +//  | 
|  | 15 | +// 3. Neither the name of the copyright holder nor the names of its contributors may be | 
|  | 16 | +//    used to endorse or promote products derived from this software without specific | 
|  | 17 | +//    prior written permission. | 
|  | 18 | +//  | 
|  | 19 | +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY | 
|  | 20 | +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | 
|  | 21 | +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL | 
|  | 22 | +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
|  | 23 | +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 
|  | 24 | +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 
|  | 25 | +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | 
|  | 26 | +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF | 
|  | 27 | +// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  | 28 | +//  | 
|  | 29 | +// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers | 
|  | 30 | + | 
|  | 31 | +#pragma once | 
|  | 32 | + | 
|  | 33 | +#include "crypto/crypto.h" | 
|  | 34 | + | 
|  | 35 | +template<bool batched> | 
|  | 36 | +class test_fe_batch_invert | 
|  | 37 | +{ | 
|  | 38 | +public: | 
|  | 39 | +  static const size_t loop_count = 50; | 
|  | 40 | +  static const size_t n_elems = 1000; | 
|  | 41 | + | 
|  | 42 | +  bool init() | 
|  | 43 | +  { | 
|  | 44 | +    m_fes = (fe *) malloc(n_elems * sizeof(fe)); | 
|  | 45 | + | 
|  | 46 | +    for (std::size_t i = 0; i < n_elems; ++i) | 
|  | 47 | +    { | 
|  | 48 | +      crypto::secret_key r; | 
|  | 49 | +      crypto::random32_unbiased((unsigned char*)r.data); | 
|  | 50 | + | 
|  | 51 | +      ge_p3 point; | 
|  | 52 | +      ge_scalarmult_base(&point, (unsigned char*)r.data); | 
|  | 53 | + | 
|  | 54 | +      memcpy(m_fes[i], &point.Y, sizeof(fe)); | 
|  | 55 | +    } | 
|  | 56 | + | 
|  | 57 | +    return true; | 
|  | 58 | +  } | 
|  | 59 | + | 
|  | 60 | +  bool test() | 
|  | 61 | +  { | 
|  | 62 | +    fe *inv_fes = (fe *) malloc(n_elems * sizeof(fe)); | 
|  | 63 | + | 
|  | 64 | +    if (batched) | 
|  | 65 | +      fe_batch_invert(inv_fes, m_fes, n_elems); | 
|  | 66 | +    else | 
|  | 67 | +    { | 
|  | 68 | +      for (std::size_t i = 0; i < n_elems; ++i) | 
|  | 69 | +        fe_invert(inv_fes[i], m_fes[i]); | 
|  | 70 | +    } | 
|  | 71 | + | 
|  | 72 | +    free(inv_fes); | 
|  | 73 | + | 
|  | 74 | +    return true; | 
|  | 75 | +  } | 
|  | 76 | + | 
|  | 77 | +private: | 
|  | 78 | +  fe *m_fes; | 
|  | 79 | +}; | 
0 commit comments