bitcoin/src/num.h

99 lines
3.9 KiB
C
Raw Normal View History

2013-05-09 09:24:32 -04:00
// Copyright (c) 2013 Pieter Wuille
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
2013-03-07 21:20:41 -03:00
#ifndef _SECP256K1_NUM_
#define _SECP256K1_NUM_
2014-01-18 00:52:33 -03:00
#if defined HAVE_CONFIG_H
#include "libsecp256k1-config.h"
#endif
2013-04-30 10:04:33 -04:00
#if defined(USE_NUM_GMP)
2013-03-13 19:42:39 -03:00
#include "num_gmp.h"
#else
#error "Please select num implementation"
#endif
2013-03-07 21:20:41 -03:00
/** Clear a number to prevent the leak of sensitive data. */
void static secp256k1_num_clear(secp256k1_num_t *r);
2013-04-14 17:17:21 -03:00
/** Copy a number. */
2013-03-24 06:38:35 -03:00
void static secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a);
2013-04-14 17:17:21 -03:00
/** Convert a number's absolute value to a binary big-endian string.
* There must be enough place. */
2013-03-24 06:38:35 -03:00
void static secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num_t *a);
2013-04-14 17:17:21 -03:00
/** Set a number to the value of a binary big-endian string. */
2013-03-24 06:38:35 -03:00
void static secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, unsigned int alen);
2013-04-14 17:17:21 -03:00
/** Set a number equal to a (signed) integer. */
2013-03-24 06:38:35 -03:00
void static secp256k1_num_set_int(secp256k1_num_t *r, int a);
2013-04-14 17:17:21 -03:00
/** Compute a modular inverse. The input must be less than the modulus. */
2013-03-24 06:38:35 -03:00
void static secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *m);
2013-04-14 17:17:21 -03:00
/** Multiply two numbers modulo another. */
2013-03-24 06:38:35 -03:00
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);
2013-04-14 17:17:21 -03:00
/** Compare the absolute value of two numbers. */
2013-03-24 06:38:35 -03:00
int static secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b);
2013-04-14 17:17:21 -03:00
/** Test whether two number are equal (including sign). */
int static secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b);
2013-04-14 17:17:21 -03:00
/** Add two (signed) numbers. */
2013-03-24 06:38:35 -03:00
void static secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
2013-04-14 17:17:21 -03:00
/** Subtract two (signed) numbers. */
2013-03-24 06:38:35 -03:00
void static secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
2013-04-14 17:17:21 -03:00
/** Multiply two (signed) numbers. */
2013-03-24 06:38:35 -03:00
void static secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
2013-04-14 17:17:21 -03:00
/** Divide two (signed) numbers. */
2013-03-24 06:38:35 -03:00
void static secp256k1_num_div(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
2013-04-14 17:17:21 -03:00
2013-04-20 19:58:15 -03:00
/** Replace a number by its remainder modulo m. M's sign is ignored. The result is a number between 0 and m-1,
even if r was negative. */
2013-04-14 17:17:21 -03:00
void static secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m);
/** Calculate the number of bits in (the absolute value of) a number. */
2013-03-24 06:38:35 -03:00
int static secp256k1_num_bits(const secp256k1_num_t *a);
2013-04-14 17:17:21 -03:00
/** Right-shift the passed number by bits bits, and return those bits. */
2013-03-24 06:38:35 -03:00
int static secp256k1_num_shift(secp256k1_num_t *r, int bits);
2013-04-14 17:17:21 -03:00
/** Check whether a number is zero. */
2013-03-24 06:38:35 -03:00
int static secp256k1_num_is_zero(const secp256k1_num_t *a);
2013-04-14 17:17:21 -03:00
/** Check whether a number is odd. */
2013-03-24 06:38:35 -03:00
int static secp256k1_num_is_odd(const secp256k1_num_t *a);
2013-04-14 17:17:21 -03:00
/** Check whether a number is strictly negative. */
2013-03-24 06:38:35 -03:00
int static secp256k1_num_is_neg(const secp256k1_num_t *a);
2013-04-14 17:17:21 -03:00
/** Check whether a particular bit is set in a number. */
2013-03-24 06:38:35 -03:00
int static secp256k1_num_get_bit(const secp256k1_num_t *a, int pos);
2013-04-14 17:17:21 -03:00
/** Increase a number by 1. */
2013-03-24 06:38:35 -03:00
void static secp256k1_num_inc(secp256k1_num_t *r);
2013-04-14 17:17:21 -03:00
/** Set a number equal to the value of a hex string (unsigned). */
2013-03-24 06:38:35 -03:00
void static secp256k1_num_set_hex(secp256k1_num_t *r, const char *a, int alen);
2013-04-14 17:17:21 -03:00
/** Convert (the absolute value of) a number to a hexadecimal string. */
void static secp256k1_num_get_hex(char *r, int rlen, const secp256k1_num_t *a);
2013-04-14 17:17:21 -03:00
/** Split a number into a low and high part. */
2013-03-24 06:38:35 -03:00
void static secp256k1_num_split(secp256k1_num_t *rl, secp256k1_num_t *rh, const secp256k1_num_t *a, int bits);
2013-04-14 17:17:21 -03:00
/** Change a number's sign. */
2013-03-24 06:38:35 -03:00
void static secp256k1_num_negate(secp256k1_num_t *r);
2013-04-14 17:17:21 -03:00
/** Get a bunch of bits from a number. */
int static secp256k1_num_get_bits(const secp256k1_num_t *a, int offset, int count);
2013-03-07 21:20:41 -03:00
#endif