1 // Copyright (c) 2013 Pieter Wuille
2 // Distributed under the MIT/X11 software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 #ifndef _SECP256K1_NUM_
6 #define _SECP256K1_NUM_
8 #if defined HAVE_CONFIG_H
9 #include "libsecp256k1-config.h"
12 #if defined(USE_NUM_GMP)
14 #elif defined(USE_NUM_OPENSSL)
15 #include "num_openssl.h"
17 #error "Please select num implementation"
20 /** Initialize a number. */
21 void static secp256k1_num_init(secp256k1_num_t *r);
23 /** Clear a number to prevent the leak of sensitive data. */
24 void static secp256k1_num_clear(secp256k1_num_t *r);
27 void static secp256k1_num_free(secp256k1_num_t *r);
30 void static secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a);
32 /** Convert a number's absolute value to a binary big-endian string.
33 * There must be enough place. */
34 void static secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num_t *a);
36 /** Set a number to the value of a binary big-endian string. */
37 void static secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, unsigned int alen);
39 /** Set a number equal to a (signed) integer. */
40 void static secp256k1_num_set_int(secp256k1_num_t *r, int a);
42 /** Compute a modular inverse. The input must be less than the modulus. */
43 void static secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *m);
45 /** Multiply two numbers modulo another. */
46 void static secp256k1_num_mod_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b, const secp256k1_num_t *m);
48 /** Compare the absolute value of two numbers. */
49 int static secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b);
51 /** Test whether two number are equal (including sign). */
52 int static secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b);
54 /** Add two (signed) numbers. */
55 void static secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
57 /** Subtract two (signed) numbers. */
58 void static secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
60 /** Multiply two (signed) numbers. */
61 void static secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
63 /** Divide two (signed) numbers. */
64 void static secp256k1_num_div(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
66 /** Replace a number by its remainder modulo m. M's sign is ignored. The result is a number between 0 and m-1,
67 even if r was negative. */
68 void static secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m);
70 /** Calculate the number of bits in (the absolute value of) a number. */
71 int static secp256k1_num_bits(const secp256k1_num_t *a);
73 /** Right-shift the passed number by bits bits, and return those bits. */
74 int static secp256k1_num_shift(secp256k1_num_t *r, int bits);
76 /** Check whether a number is zero. */
77 int static secp256k1_num_is_zero(const secp256k1_num_t *a);
79 /** Check whether a number is odd. */
80 int static secp256k1_num_is_odd(const secp256k1_num_t *a);
82 /** Check whether a number is strictly negative. */
83 int static secp256k1_num_is_neg(const secp256k1_num_t *a);
85 /** Check whether a particular bit is set in a number. */
86 int static secp256k1_num_get_bit(const secp256k1_num_t *a, int pos);
88 /** Increase a number by 1. */
89 void static secp256k1_num_inc(secp256k1_num_t *r);
91 /** Set a number equal to the value of a hex string (unsigned). */
92 void static secp256k1_num_set_hex(secp256k1_num_t *r, const char *a, int alen);
94 /** Convert (the absolute value of) a number to a hexadecimal string. */
95 void static secp256k1_num_get_hex(char *r, int rlen, const secp256k1_num_t *a);
97 /** Split a number into a low and high part. */
98 void static secp256k1_num_split(secp256k1_num_t *rl, secp256k1_num_t *rh, const secp256k1_num_t *a, int bits);
100 /** Change a number's sign. */
101 void static secp256k1_num_negate(secp256k1_num_t *r);