1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* LibTomMath, multiple-precision integer library -- Tom St Denis
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LibTomMath is a library that provides multiple-precision
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * integer arithmetic as well as number theoretic functionality.
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The library was designed directly after the MPI library by
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Michael Fromberger but has been written from scratch with
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * additional optimizations in place.
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The library is free for all purposes without any express
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * guarantee it works.
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Tom St Denis, tomstdenis@gmail.com, http://math.libtomcrypt.com
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef BN_H_
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define BN_H_
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <stdio.h>
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <string.h>
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <stdlib.h>
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <ctype.h>
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <limits.h>
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "tommath_class.h"
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef MIN
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #define MIN(x,y) ((x)<(y)?(x):(y))
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef MAX
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #define MAX(x,y) ((x)>(y)?(x):(y))
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef __cplusplus
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectextern "C" {
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* C++ compilers don't like assigning void * to mp_digit * */
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define  OPT_CAST(x)  (x *)
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* C on the other hand doesn't care */
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define  OPT_CAST(x)
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* detect 64-bit mode if possible */
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if defined(__x86_64__)
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #if !(defined(MP_64BIT) && defined(MP_16BIT) && defined(MP_8BIT))
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      #define MP_64BIT
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #endif
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* some default configurations.
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * A "mp_digit" must be able to hold DIGIT_BIT + 1 bits
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * A "mp_word" must be able to hold 2*DIGIT_BIT + 1 bits
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * At the very least a mp_digit must be able to hold 7 bits
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * [any size beyond that is ok provided it doesn't overflow the data type]
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MP_8BIT
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   typedef unsigned char      mp_digit;
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   typedef unsigned short     mp_word;
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#elif defined(MP_16BIT)
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   typedef unsigned short     mp_digit;
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   typedef unsigned long      mp_word;
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#elif defined(MP_64BIT)
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* for GCC only on supported platforms */
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef CRYPT
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   typedef unsigned long long ulong64;
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   typedef signed long long   long64;
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   typedef unsigned long      mp_digit;
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   typedef unsigned long      mp_word __attribute__ ((mode(TI)));
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #define DIGIT_BIT          60
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* this is the default case, 28-bit digits */
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* this is to make porting into LibTomCrypt easier :-) */
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef CRYPT
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #if defined(_MSC_VER) || defined(__BORLANDC__)
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      typedef unsigned __int64   ulong64;
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      typedef signed __int64     long64;
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #else
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      typedef unsigned long long ulong64;
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      typedef signed long long   long64;
91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #endif
92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   typedef unsigned long      mp_digit;
95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   typedef ulong64            mp_word;
96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MP_31BIT
98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* this is an extension that uses 31-bit digits */
99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #define DIGIT_BIT          31
100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* default case is 28-bit digits, defines MP_28BIT as a handy macro to test */
102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #define DIGIT_BIT          28
103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #define MP_28BIT
104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* define heap macros */
108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef CRYPT
109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* default to libc stuff */
110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #ifndef XMALLOC
111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       #define XMALLOC  malloc
112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       #define XFREE    free
113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       #define XREALLOC realloc
114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       #define XCALLOC  calloc
115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #else
116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      /* prototypes for our heap functions */
117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      extern void *XMALLOC(size_t n);
118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      extern void *XREALLOC(void *p, size_t n);
119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      extern void *XCALLOC(size_t n, size_t s);
120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      extern void XFREE(void *p);
121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #endif
122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* otherwise the bits per digit is calculated automatically from the size of a mp_digit */
126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef DIGIT_BIT
127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #define DIGIT_BIT     ((int)((CHAR_BIT * sizeof(mp_digit) - 1)))  /* bits per digit */
128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define MP_DIGIT_BIT     DIGIT_BIT
131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define MP_MASK          ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define MP_DIGIT_MAX     MP_MASK
133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* equalities */
135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define MP_LT        -1   /* less than */
136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define MP_EQ         0   /* equal to */
137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define MP_GT         1   /* greater than */
138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define MP_ZPOS       0   /* positive integer */
140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define MP_NEG        1   /* negative */
141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define MP_OKAY       0   /* ok result */
143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define MP_MEM        -2  /* out of mem */
144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define MP_VAL        -3  /* invalid input */
145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define MP_RANGE      MP_VAL
146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define MP_YES        1   /* yes response */
148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define MP_NO         0   /* no response */
149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Primality generation flags */
151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LTM_PRIME_BBS      0x0001 /* BBS style prime */
152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LTM_PRIME_SAFE     0x0002 /* Safe prime (p-1)/2 == prime */
153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define LTM_PRIME_2MSB_ON  0x0008 /* force 2nd MSB to 1 */
154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projecttypedef int           mp_err;
156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* you'll have to tune these... */
158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectextern int KARATSUBA_MUL_CUTOFF,
159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           KARATSUBA_SQR_CUTOFF,
160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           TOOM_MUL_CUTOFF,
161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           TOOM_SQR_CUTOFF;
162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* define this to use lower memory usage routines (exptmods mostly) */
164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* #define MP_LOW_MEM */
165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* default precision */
167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef MP_PREC
168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #ifndef MP_LOW_MEM
169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      #define MP_PREC                 32     /* default digits of precision */
170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #else
171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      #define MP_PREC                 8      /* default digits of precision */
172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #endif
173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */
176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define MP_WARRAY               (1 << (sizeof(mp_word) * CHAR_BIT - 2 * DIGIT_BIT + 1))
177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* the infamous mp_int structure */
179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projecttypedef struct  {
180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    int used, alloc, sign;
181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    mp_digit *dp;
182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} mp_int;
183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* callback for mp_prime_random, should fill dst with random bytes and return how many read [upto len] */
185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projecttypedef int ltm_prime_callback(unsigned char *dst, int len, void *dat);
186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define USED(m)    ((m)->used)
189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define DIGIT(m,k) ((m)->dp[(k)])
190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define SIGN(m)    ((m)->sign)
191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* error code to char* string */
193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectchar *mp_error_to_string(int code);
194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* ---> init and deinit bignum functions <--- */
196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* init a bignum */
197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_init(mp_int *a);
198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* free a bignum */
200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid mp_clear(mp_int *a);
201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* init a null terminated series of arguments */
203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_init_multi(mp_int *mp, ...);
204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* clear a null terminated series of arguments */
206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid mp_clear_multi(mp_int *mp, ...);
207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* exchange two ints */
209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid mp_exch(mp_int *a, mp_int *b);
210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* shrink ram required for a bignum */
212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_shrink(mp_int *a);
213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* grow an int to a given size */
215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_grow(mp_int *a, int size);
216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* init to a given number of digits */
218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_init_size(mp_int *a, int size);
219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* ---> Basic Manipulations <--- */
221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO)
222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define mp_iseven(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 0)) ? MP_YES : MP_NO)
223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define mp_isodd(a)  (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? MP_YES : MP_NO)
224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* set to zero */
226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid mp_zero(mp_int *a);
227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* set to a digit */
229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid mp_set(mp_int *a, mp_digit b);
230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* set a 32-bit const */
232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_set_int(mp_int *a, unsigned long b);
233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* get a 32-bit value */
235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectunsigned long mp_get_int(mp_int * a);
236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* initialize and set a digit */
238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_init_set (mp_int * a, mp_digit b);
239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* initialize and set 32-bit value */
241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_init_set_int (mp_int * a, unsigned long b);
242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* copy, b = a */
244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_copy(mp_int *a, mp_int *b);
245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* inits and copies, a = b */
247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_init_copy(mp_int *a, mp_int *b);
248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
249f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* trim unused digits */
250f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid mp_clamp(mp_int *a);
251f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
252f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* ---> digit manipulation <--- */
253f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
254f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* right shift by "b" digits */
255f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid mp_rshd(mp_int *a, int b);
256f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
257f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* left shift by "b" digits */
258f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_lshd(mp_int *a, int b);
259f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
260f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a / 2**b */
261f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_div_2d(mp_int *a, int b, mp_int *c, mp_int *d);
262f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
263f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* b = a/2 */
264f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_div_2(mp_int *a, mp_int *b);
265f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
266f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a * 2**b */
267f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_mul_2d(mp_int *a, int b, mp_int *c);
268f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
269f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* b = a*2 */
270f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_mul_2(mp_int *a, mp_int *b);
271f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
272f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a mod 2**d */
273f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_mod_2d(mp_int *a, int b, mp_int *c);
274f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
275f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* computes a = 2**b */
276f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_2expt(mp_int *a, int b);
277f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
278f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Counts the number of lsbs which are zero before the first zero bit */
279f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_cnt_lsb(mp_int *a);
280f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
281f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* I Love Earth! */
282f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
283f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* makes a pseudo-random int of a given size */
284f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_rand(mp_int *a, int digits);
285f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
286f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* ---> binary operations <--- */
287f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a XOR b  */
288f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_xor(mp_int *a, mp_int *b, mp_int *c);
289f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
290f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a OR b */
291f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_or(mp_int *a, mp_int *b, mp_int *c);
292f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
293f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a AND b */
294f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_and(mp_int *a, mp_int *b, mp_int *c);
295f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
296f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* ---> Basic arithmetic <--- */
297f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
298f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* b = -a */
299f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_neg(mp_int *a, mp_int *b);
300f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
301f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* b = |a| */
302f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_abs(mp_int *a, mp_int *b);
303f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
304f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* compare a to b */
305f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_cmp(mp_int *a, mp_int *b);
306f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
307f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* compare |a| to |b| */
308f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_cmp_mag(mp_int *a, mp_int *b);
309f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
310f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a + b */
311f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_add(mp_int *a, mp_int *b, mp_int *c);
312f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
313f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a - b */
314f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_sub(mp_int *a, mp_int *b, mp_int *c);
315f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
316f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a * b */
317f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_mul(mp_int *a, mp_int *b, mp_int *c);
318f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
319f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* b = a*a  */
320f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_sqr(mp_int *a, mp_int *b);
321f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
322f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* a/b => cb + d == a */
323f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_div(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
324f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
325f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a mod b, 0 <= c < b  */
326f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_mod(mp_int *a, mp_int *b, mp_int *c);
327f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
328f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* ---> single digit functions <--- */
329f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
330f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* compare against a single digit */
331f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_cmp_d(mp_int *a, mp_digit b);
332f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
333f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a + b */
334f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_add_d(mp_int *a, mp_digit b, mp_int *c);
335f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
336f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a - b */
337f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_sub_d(mp_int *a, mp_digit b, mp_int *c);
338f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
339f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a * b */
340f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_mul_d(mp_int *a, mp_digit b, mp_int *c);
341f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
342f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* a/b => cb + d == a */
343f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_div_d(mp_int *a, mp_digit b, mp_int *c, mp_digit *d);
344f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
345f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* a/3 => 3c + d == a */
346f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_div_3(mp_int *a, mp_int *c, mp_digit *d);
347f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
348f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a**b */
349f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_expt_d(mp_int *a, mp_digit b, mp_int *c);
350f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
351f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a mod b, 0 <= c < b  */
352f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_mod_d(mp_int *a, mp_digit b, mp_digit *c);
353f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
354f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* ---> number theory <--- */
355f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
356f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* d = a + b (mod c) */
357f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_addmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
358f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
359f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* d = a - b (mod c) */
360f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_submod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
361f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
362f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* d = a * b (mod c) */
363f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
364f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
365f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = a * a (mod b) */
366f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_sqrmod(mp_int *a, mp_int *b, mp_int *c);
367f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
368f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = 1/a (mod b) */
369f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_invmod(mp_int *a, mp_int *b, mp_int *c);
370f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
371f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = (a, b) */
372f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_gcd(mp_int *a, mp_int *b, mp_int *c);
373f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
374f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* produces value such that U1*a + U2*b = U3 */
375f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3);
376f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
377f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* c = [a, b] or (a*b)/(a, b) */
378f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_lcm(mp_int *a, mp_int *b, mp_int *c);
379f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
380f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* finds one of the b'th root of a, such that |c|**b <= |a|
381f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
382f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * returns error if a < 0 and b is even
383f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
384f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_n_root(mp_int *a, mp_digit b, mp_int *c);
385f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
386f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* special sqrt algo */
387f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_sqrt(mp_int *arg, mp_int *ret);
388f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
389f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* is number a square? */
390f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_is_square(mp_int *arg, int *ret);
391f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
392f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* computes the jacobi c = (a | n) (or Legendre if b is prime)  */
393f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_jacobi(mp_int *a, mp_int *n, int *c);
394f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
395f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* used to setup the Barrett reduction for a given modulus b */
396f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_reduce_setup(mp_int *a, mp_int *b);
397f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
398f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Barrett Reduction, computes a (mod b) with a precomputed value c
399f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
400f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Assumes that 0 < a <= b*b, note if 0 > a > -(b*b) then you can merely
401f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * compute the reduction as -1 * mp_reduce(mp_abs(a)) [pseudo code].
402f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
403f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_reduce(mp_int *a, mp_int *b, mp_int *c);
404f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
405f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* setups the montgomery reduction */
406f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_montgomery_setup(mp_int *a, mp_digit *mp);
407f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
408f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* computes a = B**n mod b without division or multiplication useful for
409f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * normalizing numbers in a Montgomery system.
410f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
411f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_montgomery_calc_normalization(mp_int *a, mp_int *b);
412f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
413f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* computes x/R == x (mod N) via Montgomery Reduction */
414f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp);
415f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
416f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* returns 1 if a is a valid DR modulus */
417f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_dr_is_modulus(mp_int *a);
418f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
419f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* sets the value of "d" required for mp_dr_reduce */
420f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid mp_dr_setup(mp_int *a, mp_digit *d);
421f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
422f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* reduces a modulo b using the Diminished Radix method */
423f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_dr_reduce(mp_int *a, mp_int *b, mp_digit mp);
424f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
425f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* returns true if a can be reduced with mp_reduce_2k */
426f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_reduce_is_2k(mp_int *a);
427f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
428f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* determines k value for 2k reduction */
429f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_reduce_2k_setup(mp_int *a, mp_digit *d);
430f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
431f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* reduces a modulo b where b is of the form 2**p - k [0 <= a] */
432f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d);
433f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
434f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* returns true if a can be reduced with mp_reduce_2k_l */
435f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_reduce_is_2k_l(mp_int *a);
436f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
437f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* determines k value for 2k reduction */
438f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_reduce_2k_setup_l(mp_int *a, mp_int *d);
439f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
440f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* reduces a modulo b where b is of the form 2**p - k [0 <= a] */
441f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d);
442f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
443f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* d = a**b (mod c) */
444f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_exptmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
445f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
446f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* ---> Primes <--- */
447f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
448f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* number of primes */
449f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef MP_8BIT
450f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #define PRIME_SIZE      31
451f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
452f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   #define PRIME_SIZE      256
453f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
454f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
455f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* table of first PRIME_SIZE primes */
456f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectextern const mp_digit ltm_prime_tab[];
457f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
458f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* result=1 if a is divisible by one of the first PRIME_SIZE primes */
459f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_prime_is_divisible(mp_int *a, int *result);
460f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
461f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* performs one Fermat test of "a" using base "b".
462f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Sets result to 0 if composite or 1 if probable prime
463f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
464f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_prime_fermat(mp_int *a, mp_int *b, int *result);
465f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
466f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* performs one Miller-Rabin test of "a" using base "b".
467f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Sets result to 0 if composite or 1 if probable prime
468f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
469f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_prime_miller_rabin(mp_int *a, mp_int *b, int *result);
470f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
471f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* This gives [for a given bit size] the number of trials required
472f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * such that Miller-Rabin gives a prob of failure lower than 2^-96
473f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
474f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_prime_rabin_miller_trials(int size);
475f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
476f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* performs t rounds of Miller-Rabin on "a" using the first
477f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * t prime bases.  Also performs an initial sieve of trial
478f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * division.  Determines if "a" is prime with probability
479f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * of error no more than (1/4)**t.
480f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
481f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Sets result to 1 if probably prime, 0 otherwise
482f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
483f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_prime_is_prime(mp_int *a, int t, int *result);
484f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
485f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* finds the next prime after the number "a" using "t" trials
486f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * of Miller-Rabin.
487f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
488f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * bbs_style = 1 means the prime must be congruent to 3 mod 4
489f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
490f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_prime_next_prime(mp_int *a, int t, int bbs_style);
491f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
492f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* makes a truly random prime of a given size (bytes),
493f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * call with bbs = 1 if you want it to be congruent to 3 mod 4
494f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
495f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * You have to supply a callback which fills in a buffer with random bytes.  "dat" is a parameter you can
496f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * have passed to the callback (e.g. a state or something).  This function doesn't use "dat" itself
497f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * so it can be NULL
498f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
499f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The prime generated will be larger than 2^(8*size).
500f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
501f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define mp_prime_random(a, t, size, bbs, cb, dat) mp_prime_random_ex(a, t, ((size) * 8) + 1, (bbs==1)?LTM_PRIME_BBS:0, cb, dat)
502f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
503f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* makes a truly random prime of a given size (bits),
504f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
505f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Flags are as follows:
506f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
507f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *   LTM_PRIME_BBS      - make prime congruent to 3 mod 4
508f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *   LTM_PRIME_SAFE     - make sure (p-1)/2 is prime as well (implies LTM_PRIME_BBS)
509f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *   LTM_PRIME_2MSB_OFF - make the 2nd highest bit zero
510f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *   LTM_PRIME_2MSB_ON  - make the 2nd highest bit one
511f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
512f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * You have to supply a callback which fills in a buffer with random bytes.  "dat" is a parameter you can
513f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * have passed to the callback (e.g. a state or something).  This function doesn't use "dat" itself
514f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * so it can be NULL
515f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
516f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
517f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback cb, void *dat);
518f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
519f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* ---> radix conversion <--- */
520f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_count_bits(mp_int *a);
521f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
522f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_unsigned_bin_size(mp_int *a);
523f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_read_unsigned_bin(mp_int *a, const unsigned char *b, int c);
524f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_to_unsigned_bin(mp_int *a, unsigned char *b);
525f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_to_unsigned_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen);
526f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
527f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_signed_bin_size(mp_int *a);
528f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_read_signed_bin(mp_int *a, const unsigned char *b, int c);
529f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_to_signed_bin(mp_int *a,  unsigned char *b);
530f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_to_signed_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen);
531f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
532f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_read_radix(mp_int *a, const char *str, int radix);
533f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_toradix(mp_int *a, char *str, int radix);
534f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_toradix_n(mp_int * a, char *str, int radix, int maxlen);
535f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_radix_size(mp_int *a, int radix, int *size);
536f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
537f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_fread(mp_int *a, int radix, FILE *stream);
538f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_fwrite(mp_int *a, int radix, FILE *stream);
539f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
540f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define mp_read_raw(mp, str, len) mp_read_signed_bin((mp), (str), (len))
541f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define mp_raw_size(mp)           mp_signed_bin_size(mp)
542f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define mp_toraw(mp, str)         mp_to_signed_bin((mp), (str))
543f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define mp_read_mag(mp, str, len) mp_read_unsigned_bin((mp), (str), (len))
544f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define mp_mag_size(mp)           mp_unsigned_bin_size(mp)
545f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define mp_tomag(mp, str)         mp_to_unsigned_bin((mp), (str))
546f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
547f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define mp_tobinary(M, S)  mp_toradix((M), (S), 2)
548f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define mp_tooctal(M, S)   mp_toradix((M), (S), 8)
549f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define mp_todecimal(M, S) mp_toradix((M), (S), 10)
550f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define mp_tohex(M, S)     mp_toradix((M), (S), 16)
551f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
552f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* lowlevel functions, do not call! */
553f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint s_mp_add(mp_int *a, mp_int *b, mp_int *c);
554f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint s_mp_sub(mp_int *a, mp_int *b, mp_int *c);
555f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define s_mp_mul(a, b, c) s_mp_mul_digs(a, b, c, (a)->used + (b)->used + 1)
556f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint fast_s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs);
557f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs);
558f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint fast_s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs);
559f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs);
560f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint fast_s_mp_sqr(mp_int *a, mp_int *b);
561f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint s_mp_sqr(mp_int *a, mp_int *b);
562f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_karatsuba_mul(mp_int *a, mp_int *b, mp_int *c);
563f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_toom_mul(mp_int *a, mp_int *b, mp_int *c);
564f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_karatsuba_sqr(mp_int *a, mp_int *b);
565f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_toom_sqr(mp_int *a, mp_int *b);
566f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint fast_mp_invmod(mp_int *a, mp_int *b, mp_int *c);
567f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c);
568f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint fast_mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp);
569f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_exptmod_fast(mp_int *G, mp_int *X, mp_int *P, mp_int *Y, int mode);
570f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int mode);
571f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid bn_reverse(unsigned char *s, int len);
572f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
573f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectextern const char *mp_s_rmap;
574f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
575f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef __cplusplus
576f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
577f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
578f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
579f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
580f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
581f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
582f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtommath/tommath.h,v $ */
583f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.8 $ */
584f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/03/31 14:18:44 $ */
585