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