github.com/guiltylotus/go-ethereum@v1.9.7/crypto/secp256k1/libsecp256k1/src/num.h (about)

     1  /**********************************************************************
     2   * Copyright (c) 2013, 2014 Pieter Wuille                             *
     3   * Distributed under the MIT software license, see the accompanying   *
     4   * file COPYING or http://www.opensource.org/licenses/mit-license.php.*
     5   **********************************************************************/
     6  
     7  #ifndef _SECP256K1_NUM_
     8  #define _SECP256K1_NUM_
     9  
    10  #ifndef USE_NUM_NONE
    11  
    12  #if defined HAVE_CONFIG_H
    13  #include "libsecp256k1-config.h"
    14  #endif
    15  
    16  #if defined(USE_NUM_GMP)
    17  #include "num_gmp.h"
    18  #else
    19  #error "Please select num implementation"
    20  #endif
    21  
    22  /** Copy a number. */
    23  static void secp256k1_num_copy(secp256k1_num *r, const secp256k1_num *a);
    24  
    25  /** Convert a number's absolute value to a binary big-endian string.
    26   *  There must be enough place. */
    27  static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a);
    28  
    29  /** Set a number to the value of a binary big-endian string. */
    30  static void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen);
    31  
    32  /** Compute a modular inverse. The input must be less than the modulus. */
    33  static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m);
    34  
    35  /** Compute the jacobi symbol (a|b). b must be positive and odd. */
    36  static int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b);
    37  
    38  /** Compare the absolute value of two numbers. */
    39  static int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b);
    40  
    41  /** Test whether two number are equal (including sign). */
    42  static int secp256k1_num_eq(const secp256k1_num *a, const secp256k1_num *b);
    43  
    44  /** Add two (signed) numbers. */
    45  static void secp256k1_num_add(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b);
    46  
    47  /** Subtract two (signed) numbers. */
    48  static void secp256k1_num_sub(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b);
    49  
    50  /** Multiply two (signed) numbers. */
    51  static void secp256k1_num_mul(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b);
    52  
    53  /** Replace a number by its remainder modulo m. M's sign is ignored. The result is a number between 0 and m-1,
    54      even if r was negative. */
    55  static void secp256k1_num_mod(secp256k1_num *r, const secp256k1_num *m);
    56  
    57  /** Right-shift the passed number by bits. */
    58  static void secp256k1_num_shift(secp256k1_num *r, int bits);
    59  
    60  /** Check whether a number is zero. */
    61  static int secp256k1_num_is_zero(const secp256k1_num *a);
    62  
    63  /** Check whether a number is one. */
    64  static int secp256k1_num_is_one(const secp256k1_num *a);
    65  
    66  /** Check whether a number is strictly negative. */
    67  static int secp256k1_num_is_neg(const secp256k1_num *a);
    68  
    69  /** Change a number's sign. */
    70  static void secp256k1_num_negate(secp256k1_num *r);
    71  
    72  #endif
    73  
    74  #endif