]> Git Repo - secp256k1.git/blame - src/num.h
Implement endomorphism optimization for secp256k1_ecmult_const
[secp256k1.git] / src / num.h
CommitLineData
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
b394396b
PW
7#ifndef _SECP256K1_NUM_
8#define _SECP256K1_NUM_
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. */
a4a43d75 23static void secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a);
2f9e831d
PW
24
25/** Convert a number's absolute value to a binary big-endian string.
26 * There must be enough place. */
a4a43d75 27static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num_t *a);
2f9e831d
PW
28
29/** Set a number to the value of a binary big-endian string. */
a4a43d75 30static void secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, unsigned int alen);
2f9e831d 31
2f9e831d 32/** Compute a modular inverse. The input must be less than the modulus. */
a4a43d75 33static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *m);
2f9e831d 34
2f9e831d 35/** Compare the absolute value of two numbers. */
a4a43d75 36static int secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b);
2f9e831d 37
1a749b4a 38/** Test whether two number are equal (including sign). */
a4a43d75 39static int secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b);
1a749b4a 40
2f9e831d 41/** Add two (signed) numbers. */
a4a43d75 42static void secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
2f9e831d
PW
43
44/** Subtract two (signed) numbers. */
a4a43d75 45static void secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
2f9e831d
PW
46
47/** Multiply two (signed) numbers. */
a4a43d75 48static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
2f9e831d 49
79b0ce6c
PW
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. */
a4a43d75 52static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m);
2f9e831d 53
ff8746d4
PW
54/** Right-shift the passed number by bits bits. */
55static void secp256k1_num_shift(secp256k1_num_t *r, int bits);
2f9e831d
PW
56
57/** Check whether a number is zero. */
a4a43d75 58static int secp256k1_num_is_zero(const secp256k1_num_t *a);
2f9e831d 59
2f9e831d 60/** Check whether a number is strictly negative. */
a4a43d75 61static int secp256k1_num_is_neg(const secp256k1_num_t *a);
2f9e831d 62
2f9e831d 63/** Change a number's sign. */
a4a43d75 64static void secp256k1_num_negate(secp256k1_num_t *r);
2f9e831d 65
b394396b 66#endif
597128d3
PW
67
68#endif
This page took 0.039163 seconds and 4 git commands to generate.