]> Git Repo - secp256k1.git/blob - src/num.h
Implement endomorphism optimization for secp256k1_ecmult_const
[secp256k1.git] / src / num.h
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_t *r, const secp256k1_num_t *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_t *a);
28
29 /** Set a number to the value of a binary big-endian string. */
30 static void secp256k1_num_set_bin(secp256k1_num_t *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_t *r, const secp256k1_num_t *a, const secp256k1_num_t *m);
34
35 /** Compare the absolute value of two numbers. */
36 static int secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b);
37
38 /** Test whether two number are equal (including sign). */
39 static int secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b);
40
41 /** Add two (signed) numbers. */
42 static void secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
43
44 /** Subtract two (signed) numbers. */
45 static void secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
46
47 /** Multiply two (signed) numbers. */
48 static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
49
50 /** Replace a number by its remainder modulo m. M's sign is ignored. The result is a number between 0 and m-1,
51     even if r was negative. */
52 static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m);
53
54 /** Right-shift the passed number by bits bits. */
55 static void secp256k1_num_shift(secp256k1_num_t *r, int bits);
56
57 /** Check whether a number is zero. */
58 static int secp256k1_num_is_zero(const secp256k1_num_t *a);
59
60 /** Check whether a number is strictly negative. */
61 static int secp256k1_num_is_neg(const secp256k1_num_t *a);
62
63 /** Change a number's sign. */
64 static void secp256k1_num_negate(secp256k1_num_t *r);
65
66 #endif
67
68 #endif
This page took 0.024417 seconds and 4 git commands to generate.