1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    mpi.h
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    by Michael J. Fromberger <sting@linguist.dartmouth.edu>
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Copyright (C) 1998 Michael J. Fromberger, All Rights Reserved
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Arbitrary precision integer arithmetic library
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    $Id: mpi.h,v 1.2 2005/05/05 14:38:47 tom Exp $
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef _H_MPI_
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define _H_MPI_
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "mpi-config.h"
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  MP_LT       -1
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  MP_EQ        0
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  MP_GT        1
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if MP_DEBUG
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#undef MP_IOFUNC
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MP_IOFUNC 1
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if MP_IOFUNC
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <ctype.h>
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <limits.h>
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  MP_NEG  1
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  MP_ZPOS 0
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Included for compatibility... */
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  NEG     MP_NEG
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  ZPOS    MP_ZPOS
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  MP_OKAY          0 /* no error, all is well */
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  MP_YES           0 /* yes (boolean result)  */
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  MP_NO           -1 /* no (boolean result)   */
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  MP_MEM          -2 /* out of memory         */
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  MP_RANGE        -3 /* argument out of range */
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  MP_BADARG       -4 /* invalid parameter     */
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  MP_UNDEF        -5 /* answer is undefined   */
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  MP_LAST_CODE    MP_UNDEF
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "mpi-types.h"
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Included for compatibility... */
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DIGIT_BIT         MP_DIGIT_BIT
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DIGIT_MAX         MP_DIGIT_MAX
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Macros for accessing the mp_int internals           */
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  SIGN(MP)     ((MP)->sign)
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  USED(MP)     ((MP)->used)
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  ALLOC(MP)    ((MP)->alloc)
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  DIGITS(MP)   ((MP)->dp)
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  DIGIT(MP,N)  (MP)->dp[(N)]
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if MP_ARGCHK == 1
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  ARGCHK(X,Y)  {if(!(X)){return (Y);}}
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#elif MP_ARGCHK == 2
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h>
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  ARGCHK(X,Y)  assert(X)
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  ARGCHK(X,Y)  /*  */
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This defines the maximum I/O base (minimum is 2)   */
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MAX_RADIX         64
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct {
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  mp_sign       sign;    /* sign of this quantity      */
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  mp_size       alloc;   /* how many digits allocated  */
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  mp_size       used;    /* how many digits used       */
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  mp_digit     *dp;      /* the digits themselves      */
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} mp_int;
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------------------*/
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Default precision                                                      */
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownunsigned int mp_get_prec(void);
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid         mp_set_prec(unsigned int prec);
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------------------*/
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Memory management                                                      */
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_init(mp_int *mp);
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_init_array(mp_int mp[], int count);
92663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengmp_err mp_init_size(mp_int *mp, mp_size prec);
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_init_copy(mp_int *mp, mp_int *from);
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_copy(mp_int *from, mp_int *to);
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid   mp_exch(mp_int *mp1, mp_int *mp2);
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid   mp_clear(mp_int *mp);
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid   mp_clear_array(mp_int mp[], int count);
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid   mp_zero(mp_int *mp);
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid   mp_set(mp_int *mp, mp_digit d);
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_set_int(mp_int *mp, long z);
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_shrink(mp_int *a);
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------------------*/
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Single digit arithmetic                                                */
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_add_d(mp_int *a, mp_digit d, mp_int *b);
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_sub_d(mp_int *a, mp_digit d, mp_int *b);
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_mul_d(mp_int *a, mp_digit d, mp_int *b);
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_mul_2(mp_int *a, mp_int *c);
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_div_d(mp_int *a, mp_digit d, mp_int *q, mp_digit *r);
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_div_2(mp_int *a, mp_int *c);
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_expt_d(mp_int *a, mp_digit d, mp_int *c);
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------------------*/
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Sign manipulations                                                     */
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_abs(mp_int *a, mp_int *b);
119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmp_err mp_neg(mp_int *a, mp_int *b);
120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------------------*/
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Full arithmetic                                                        */
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_add(mp_int *a, mp_int *b, mp_int *c);
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_sub(mp_int *a, mp_int *b, mp_int *c);
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_mul(mp_int *a, mp_int *b, mp_int *c);
127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmp_err mp_mul_2d(mp_int *a, mp_digit d, mp_int *c);
128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if MP_SQUARE
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_sqr(mp_int *a, mp_int *b);
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define mp_sqr(a, b) mp_mul(a, a, b)
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_div(mp_int *a, mp_int *b, mp_int *q, mp_int *r);
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_div_2d(mp_int *a, mp_digit d, mp_int *q, mp_int *r);
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_expt(mp_int *a, mp_int *b, mp_int *c);
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_2expt(mp_int *a, mp_digit k);
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_sqrt(mp_int *a, mp_int *b);
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------------------*/
140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Modular arithmetic                                                     */
141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if MP_MODARITH
143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengmp_err mp_mod(mp_int *a, mp_int *m, mp_int *c);
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_mod_d(mp_int *a, mp_digit d, mp_digit *c);
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_addmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c);
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_submod(mp_int *a, mp_int *b, mp_int *m, mp_int *c);
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_mulmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c);
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if MP_SQUARE
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_sqrmod(mp_int *a, mp_int *m, mp_int *c);
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define mp_sqrmod(a, m, c) mp_mulmod(a, a, m, c)
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_exptmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c);
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_exptmod_d(mp_int *a, mp_digit d, mp_int *m, mp_int *c);
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* MP_MODARITH */
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------------------*/
158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Comparisons                                                            */
159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint    mp_cmp_z(mp_int *a);
161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint    mp_cmp_d(mp_int *a, mp_digit d);
162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint    mp_cmp(mp_int *a, mp_int *b);
163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint    mp_cmp_mag(mp_int *a, mp_int *b);
164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint    mp_cmp_int(mp_int *a, long z);
165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint    mp_isodd(mp_int *a);
166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint    mp_iseven(mp_int *a);
167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------------------*/
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Number theoretic                                                       */
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if MP_NUMTH
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmp_err mp_gcd(mp_int *a, mp_int *b, mp_int *c);
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmp_err mp_lcm(mp_int *a, mp_int *b, mp_int *c);
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmp_err mp_xgcd(mp_int *a, mp_int *b, mp_int *g, mp_int *x, mp_int *y);
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmp_err mp_invmod(mp_int *a, mp_int *m, mp_int *c);
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif /* end MP_NUMTH */
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*------------------------------------------------------------------------*/
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Input and output                                                       */
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#if MP_IOFUNC
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid   mp_print(mp_int *mp, FILE *ofp);
183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif /* end MP_IOFUNC */
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------------------*/
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Base conversion                                                        */
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define BITS     1
189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define BYTES    CHAR_BIT
190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_read_signed_bin(mp_int *mp, unsigned char *str, int len);
192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint    mp_signed_bin_size(mp_int *mp);
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_to_signed_bin(mp_int *mp, unsigned char *str);
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_read_unsigned_bin(mp_int *mp, unsigned char *str, int len);
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint    mp_unsigned_bin_size(mp_int *mp);
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_to_unsigned_bin(mp_int *mp, unsigned char *str);
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint    mp_count_bits(mp_int *mp);
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if MP_COMPAT_MACROS
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define mp_read_raw(mp, str, len) mp_read_signed_bin((mp), (str), (len))
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define mp_raw_size(mp)           mp_signed_bin_size(mp)
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define mp_toraw(mp, str)         mp_to_signed_bin((mp), (str))
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define mp_read_mag(mp, str, len) mp_read_unsigned_bin((mp), (str), (len))
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define mp_mag_size(mp)           mp_unsigned_bin_size(mp)
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define mp_tomag(mp, str)         mp_to_unsigned_bin((mp), (str))
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_read_radix(mp_int *mp, unsigned char *str, int radix);
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint    mp_radix_size(mp_int *mp, int radix);
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint    mp_value_radix_size(int num, int qty, int radix);
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmp_err mp_toradix(mp_int *mp, unsigned char *str, int radix);
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint    mp_char2value(char ch, int r);
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define mp_tobinary(M, S)  mp_toradix((M), (S), 2)
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define mp_tooctal(M, S)   mp_toradix((M), (S), 8)
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define mp_todecimal(M, S) mp_toradix((M), (S), 10)
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define mp_tohex(M, S)     mp_toradix((M), (S), 16)
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------------------*/
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Error strings                                                          */
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownconst  char  *mp_strerror(mp_err ec);
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* end _H_MPI_ */
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* $Source: /cvs/libtom/libtommath/mtest/mpi.h,v $ */
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* $Revision: 1.2 $ */
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* $Date: 2005/05/05 14:38:47 $ */
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown