]> Git Repo - secp256k1.git/blob - src/num.h
Merge pull request #51
[secp256k1.git] / src / num.h
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.
4
5 #ifndef _SECP256K1_NUM_
6 #define _SECP256K1_NUM_
7
8 #if defined HAVE_CONFIG_H
9 #include "libsecp256k1-config.h"
10 #endif
11
12 #if defined(USE_NUM_GMP)
13 #include "num_gmp.h"
14 #elif defined(USE_NUM_OPENSSL)
15 #include "num_openssl.h"
16 #else
17 #error "Please select num implementation"
18 #endif
19
20 /** Initialize a number. */
21 void static secp256k1_num_init(secp256k1_num_t *r);
22
23 /** Clear a number to prevent the leak of sensitive data. */
24 void static secp256k1_num_clear(secp256k1_num_t *r);
25
26 /** Free a number. */
27 void static secp256k1_num_free(secp256k1_num_t *r);
28
29 /** Copy a number. */
30 void static secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a);
31
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);
35
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);
38
39 /** Set a number equal to a (signed) integer. */
40 void static secp256k1_num_set_int(secp256k1_num_t *r, int a);
41
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);
44
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);
47
48 /** Compare the absolute value of two numbers. */
49 int  static secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b);
50
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);
53
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);
56
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);
59
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);
62
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);
65
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);
69
70 /** Calculate the number of bits in (the absolute value of) a number. */
71 int  static secp256k1_num_bits(const secp256k1_num_t *a);
72
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);
75
76 /** Check whether a number is zero. */
77 int  static secp256k1_num_is_zero(const secp256k1_num_t *a);
78
79 /** Check whether a number is odd. */
80 int  static secp256k1_num_is_odd(const secp256k1_num_t *a);
81
82 /** Check whether a number is strictly negative. */
83 int  static secp256k1_num_is_neg(const secp256k1_num_t *a);
84
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);
87
88 /** Increase a number by 1. */
89 void static secp256k1_num_inc(secp256k1_num_t *r);
90
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);
93
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);
96
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);
99
100 /** Change a number's sign. */
101 void static secp256k1_num_negate(secp256k1_num_t *r);
102
103 #endif
This page took 0.02897 seconds and 4 git commands to generate.