]>
Commit | Line | Data |
---|---|---|
71712b27 GM |
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 | **********************************************************************/ | |
0a433ea2 | 6 | |
abe2d3e8 DR |
7 | #ifndef SECP256K1_NUM_H |
8 | #define SECP256K1_NUM_H | |
b394396b | 9 | |
597128d3 PW |
10 | #ifndef USE_NUM_NONE |
11 | ||
78cd96b1 CF |
12 | #if defined HAVE_CONFIG_H |
13 | #include "libsecp256k1-config.h" | |
14 | #endif | |
15 | ||
42f5e7c5 | 16 | #if defined(USE_NUM_GMP) |
7b292b81 | 17 | #include "num_gmp.h" |
7b292b81 PW |
18 | #else |
19 | #error "Please select num implementation" | |
20 | #endif | |
b394396b | 21 | |
2f9e831d | 22 | /** Copy a number. */ |
dd891e0e | 23 | static void secp256k1_num_copy(secp256k1_num *r, const secp256k1_num *a); |
2f9e831d PW |
24 | |
25 | /** Convert a number's absolute value to a binary big-endian string. | |
26 | * There must be enough place. */ | |
dd891e0e | 27 | static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a); |
2f9e831d PW |
28 | |
29 | /** Set a number to the value of a binary big-endian string. */ | |
dd891e0e | 30 | static void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen); |
2f9e831d | 31 | |
2f9e831d | 32 | /** Compute a modular inverse. The input must be less than the modulus. */ |
dd891e0e | 33 | static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m); |
2f9e831d | 34 | |
efd953a7 PD |
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 | ||
2f9e831d | 38 | /** Compare the absolute value of two numbers. */ |
dd891e0e | 39 | static int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b); |
2f9e831d | 40 | |
1a749b4a | 41 | /** Test whether two number are equal (including sign). */ |
dd891e0e | 42 | static int secp256k1_num_eq(const secp256k1_num *a, const secp256k1_num *b); |
1a749b4a | 43 | |
2f9e831d | 44 | /** Add two (signed) numbers. */ |
dd891e0e | 45 | static void secp256k1_num_add(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); |
2f9e831d PW |
46 | |
47 | /** Subtract two (signed) numbers. */ | |
dd891e0e | 48 | static void secp256k1_num_sub(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); |
2f9e831d PW |
49 | |
50 | /** Multiply two (signed) numbers. */ | |
dd891e0e | 51 | static void secp256k1_num_mul(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); |
2f9e831d | 52 | |
79b0ce6c PW |
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. */ | |
dd891e0e | 55 | static void secp256k1_num_mod(secp256k1_num *r, const secp256k1_num *m); |
2f9e831d | 56 | |
ff8746d4 | 57 | /** Right-shift the passed number by bits bits. */ |
dd891e0e | 58 | static void secp256k1_num_shift(secp256k1_num *r, int bits); |
2f9e831d PW |
59 | |
60 | /** Check whether a number is zero. */ | |
dd891e0e | 61 | static int secp256k1_num_is_zero(const secp256k1_num *a); |
2f9e831d | 62 | |
efd953a7 PD |
63 | /** Check whether a number is one. */ |
64 | static int secp256k1_num_is_one(const secp256k1_num *a); | |
65 | ||
2f9e831d | 66 | /** Check whether a number is strictly negative. */ |
dd891e0e | 67 | static int secp256k1_num_is_neg(const secp256k1_num *a); |
2f9e831d | 68 | |
2f9e831d | 69 | /** Change a number's sign. */ |
dd891e0e | 70 | static void secp256k1_num_negate(secp256k1_num *r); |
2f9e831d | 71 | |
b394396b | 72 | #endif |
597128d3 | 73 | |
abe2d3e8 | 74 | #endif /* SECP256K1_NUM_H */ |