github.com/ethereum/go-ethereum@v1.16.1/crypto/secp256k1/libsecp256k1/src/ecmult.h (about)

     1  /***********************************************************************
     2   * Copyright (c) 2013, 2014, 2017 Pieter Wuille, Andrew Poelstra       *
     3   * Distributed under the MIT software license, see the accompanying    *
     4   * file COPYING or https://www.opensource.org/licenses/mit-license.php.*
     5   ***********************************************************************/
     6  
     7  #ifndef SECP256K1_ECMULT_H
     8  #define SECP256K1_ECMULT_H
     9  
    10  #include "group.h"
    11  #include "scalar.h"
    12  #include "scratch.h"
    13  
    14  #ifndef ECMULT_WINDOW_SIZE
    15  #  define ECMULT_WINDOW_SIZE 15
    16  #  ifdef DEBUG_CONFIG
    17  #     pragma message DEBUG_CONFIG_MSG("ECMULT_WINDOW_SIZE undefined, assuming default value")
    18  #  endif
    19  #endif
    20  
    21  #ifdef DEBUG_CONFIG
    22  #  pragma message DEBUG_CONFIG_DEF(ECMULT_WINDOW_SIZE)
    23  #endif
    24  
    25  /* No one will ever need more than a window size of 24. The code might
    26   * be correct for larger values of ECMULT_WINDOW_SIZE but this is not
    27   * tested.
    28   *
    29   * The following limitations are known, and there are probably more:
    30   * If WINDOW_G > 27 and size_t has 32 bits, then the code is incorrect
    31   * because the size of the memory object that we allocate (in bytes)
    32   * will not fit in a size_t.
    33   * If WINDOW_G > 31 and int has 32 bits, then the code is incorrect
    34   * because certain expressions will overflow.
    35   */
    36  #if ECMULT_WINDOW_SIZE < 2 || ECMULT_WINDOW_SIZE > 24
    37  #  error Set ECMULT_WINDOW_SIZE to an integer in range [2..24].
    38  #endif
    39  
    40  /** The number of entries a table with precomputed multiples needs to have. */
    41  #define ECMULT_TABLE_SIZE(w) (1L << ((w)-2))
    42  
    43  /** Double multiply: R = na*A + ng*G */
    44  static void secp256k1_ecmult(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng);
    45  
    46  typedef int (secp256k1_ecmult_multi_callback)(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *data);
    47  
    48  /**
    49   * Multi-multiply: R = inp_g_sc * G + sum_i ni * Ai.
    50   * Chooses the right algorithm for a given number of points and scratch space
    51   * size. Resets and overwrites the given scratch space. If the points do not
    52   * fit in the scratch space the algorithm is repeatedly run with batches of
    53   * points. If no scratch space is given then a simple algorithm is used that
    54   * simply multiplies the points with the corresponding scalars and adds them up.
    55   * Returns: 1 on success (including when inp_g_sc is NULL and n is 0)
    56   *          0 if there is not enough scratch space for a single point or
    57   *          callback returns 0
    58   */
    59  static int secp256k1_ecmult_multi_var(const secp256k1_callback* error_callback, secp256k1_scratch *scratch, secp256k1_gej *r, const secp256k1_scalar *inp_g_sc, secp256k1_ecmult_multi_callback cb, void *cbdata, size_t n);
    60  
    61  #endif /* SECP256K1_ECMULT_H */