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 **********************************************************************/
7 #ifndef SECP256K1_NUM_H
8 #define SECP256K1_NUM_H
12 #if defined HAVE_CONFIG_H
13 #include "libsecp256k1-config.h"
16 #if defined(USE_NUM_GMP)
19 #error "Please select num implementation"
23 static void secp256k1_num_copy(secp256k1_num
*r
, const secp256k1_num
*a
);
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
);
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
);
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
);
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
);
38 /** Compare the absolute value of two numbers. */
39 static int secp256k1_num_cmp(const secp256k1_num
*a
, const secp256k1_num
*b
);
41 /** Test whether two number are equal (including sign). */
42 static int secp256k1_num_eq(const secp256k1_num
*a
, const secp256k1_num
*b
);
44 /** Add two (signed) numbers. */
45 static void secp256k1_num_add(secp256k1_num
*r
, const secp256k1_num
*a
, const secp256k1_num
*b
);
47 /** Subtract two (signed) numbers. */
48 static void secp256k1_num_sub(secp256k1_num
*r
, const secp256k1_num
*a
, const secp256k1_num
*b
);
50 /** Multiply two (signed) numbers. */
51 static void secp256k1_num_mul(secp256k1_num
*r
, const secp256k1_num
*a
, const secp256k1_num
*b
);
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
);
57 /** Right-shift the passed number by bits bits. */
58 static void secp256k1_num_shift(secp256k1_num
*r
, int bits
);
60 /** Check whether a number is zero. */
61 static int secp256k1_num_is_zero(const secp256k1_num
*a
);
63 /** Check whether a number is one. */
64 static int secp256k1_num_is_one(const secp256k1_num
*a
);
66 /** Check whether a number is strictly negative. */
67 static int secp256k1_num_is_neg(const secp256k1_num
*a
);
69 /** Change a number's sign. */
70 static void secp256k1_num_negate(secp256k1_num
*r
);
74 #endif /* SECP256K1_NUM_H */