PolarSSL v1.2.12
Main Page
Modules
Data Structures
Files
File List
Globals
include
polarssl
bignum.h
Go to the documentation of this file.
1
27
#ifndef POLARSSL_BIGNUM_H
28
#define POLARSSL_BIGNUM_H
29
30
#include <stdio.h>
31
#include <string.h>
32
33
#include "
config.h
"
34
35
#ifdef _MSC_VER
36
#include <basetsd.h>
37
#if (_MSC_VER <= 1200)
38
typedef
signed
short
int16_t;
39
typedef
unsigned
short
uint16_t;
40
#else
41
typedef
INT16 int16_t;
42
typedef
UINT16 uint16_t;
43
#endif
44
typedef
INT32 int32_t;
45
typedef
INT64 int64_t;
46
typedef
UINT32 uint32_t;
47
typedef
UINT64 uint64_t;
48
#else
49
#include <inttypes.h>
50
#endif
51
52
#define POLARSSL_ERR_MPI_FILE_IO_ERROR -0x0002
53
#define POLARSSL_ERR_MPI_BAD_INPUT_DATA -0x0004
54
#define POLARSSL_ERR_MPI_INVALID_CHARACTER -0x0006
55
#define POLARSSL_ERR_MPI_BUFFER_TOO_SMALL -0x0008
56
#define POLARSSL_ERR_MPI_NEGATIVE_VALUE -0x000A
57
#define POLARSSL_ERR_MPI_DIVISION_BY_ZERO -0x000C
58
#define POLARSSL_ERR_MPI_NOT_ACCEPTABLE -0x000E
59
#define POLARSSL_ERR_MPI_MALLOC_FAILED -0x0010
61
#define MPI_CHK(f) if( ( ret = f ) != 0 ) goto cleanup
62
63
/*
64
* Maximum size MPIs are allowed to grow to in number of limbs.
65
*/
66
#define POLARSSL_MPI_MAX_LIMBS 10000
67
68
#if !defined(POLARSSL_CONFIG_OPTIONS)
69
/*
70
* Maximum window size used for modular exponentiation. Default: 6
71
* Minimum value: 1. Maximum value: 6.
72
*
73
* Result is an array of ( 2 << POLARSSL_MPI_WINDOW_SIZE ) MPIs used
74
* for the sliding window calculation. (So 64 by default)
75
*
76
* Reduction in size, reduces speed.
77
*/
78
#define POLARSSL_MPI_WINDOW_SIZE 6
80
/*
81
* Maximum size of MPIs allowed in bits and bytes for user-MPIs.
82
* ( Default: 512 bytes => 4096 bits, Maximum tested: 2048 bytes => 16384 bits )
83
*
84
* Note: Calculations can results temporarily in larger MPIs. So the number
85
* of limbs required (POLARSSL_MPI_MAX_LIMBS) is higher.
86
*/
87
#define POLARSSL_MPI_MAX_SIZE 512
89
#endif
/* !POLARSSL_CONFIG_OPTIONS */
90
91
#define POLARSSL_MPI_MAX_BITS ( 8 * POLARSSL_MPI_MAX_SIZE )
93
/*
94
* When reading from files with mpi_read_file() and writing to files with
95
* mpi_write_file() the buffer should have space
96
* for a (short) label, the MPI (in the provided radix), the newline
97
* characters and the '\0'.
98
*
99
* By default we assume at least a 10 char label, a minimum radix of 10
100
* (decimal) and a maximum of 4096 bit numbers (1234 decimal chars).
101
* Autosized at compile time for at least a 10 char label, a minimum radix
102
* of 10 (decimal) for a number of POLARSSL_MPI_MAX_BITS size.
103
*
104
* This used to be statically sized to 1250 for a maximum of 4096 bit
105
* numbers (1234 decimal chars).
106
*
107
* Calculate using the formula:
108
* POLARSSL_MPI_RW_BUFFER_SIZE = ceil(POLARSSL_MPI_MAX_BITS / ln(10) * ln(2)) +
109
* LabelSize + 6
110
*/
111
#define POLARSSL_MPI_MAX_BITS_SCALE100 ( 100 * POLARSSL_MPI_MAX_BITS )
112
#define LN_2_DIV_LN_10_SCALE100 332
113
#define POLARSSL_MPI_RW_BUFFER_SIZE ( ((POLARSSL_MPI_MAX_BITS_SCALE100 + LN_2_DIV_LN_10_SCALE100 - 1) / LN_2_DIV_LN_10_SCALE100) + 10 + 6 )
114
115
/*
116
* Define the base integer type, architecture-wise
117
*/
118
#if defined(POLARSSL_HAVE_INT8)
119
typedef
signed
char
t_sint
;
120
typedef
unsigned
char
t_uint
;
121
typedef
uint16_t
t_udbl
;
122
#define POLARSSL_HAVE_UDBL
123
#else
124
#if defined(POLARSSL_HAVE_INT16)
125
typedef
int16_t
t_sint
;
126
typedef
uint16_t
t_uint
;
127
typedef
uint32_t
t_udbl
;
128
#define POLARSSL_HAVE_UDBL
129
#else
130
#if ( defined(_MSC_VER) && defined(_M_AMD64) )
131
typedef
int64_t
t_sint
;
132
typedef
uint64_t
t_uint
;
133
#else
134
#if ( defined(__GNUC__) && ( \
135
defined(__amd64__) || defined(__x86_64__) || \
136
defined(__ppc64__) || defined(__powerpc64__) || \
137
defined(__ia64__) || defined(__alpha__) || \
138
(defined(__sparc__) && defined(__arch64__)) || \
139
defined(__s390x__) ) )
140
typedef
int64_t
t_sint
;
141
typedef
uint64_t
t_uint
;
142
typedef
unsigned
int
t_udbl
__attribute__((mode(TI)));
143
#define POLARSSL_HAVE_UDBL
144
#else
145
typedef
int32_t
t_sint
;
146
typedef
uint32_t
t_uint
;
147
#if ( defined(_MSC_VER) && defined(_M_IX86) )
148
typedef
uint64_t
t_udbl
;
149
#define POLARSSL_HAVE_UDBL
150
#else
151
#if defined( POLARSSL_HAVE_LONGLONG )
152
typedef
unsigned
long
long
t_udbl
;
153
#define POLARSSL_HAVE_UDBL
154
#endif
155
#endif
156
#endif
157
#endif
158
#endif
/* POLARSSL_HAVE_INT16 */
159
#endif
/* POLARSSL_HAVE_INT8 */
160
164
typedef
struct
165
{
166
int
s
;
167
size_t
n
;
168
t_uint *
p
;
169
}
170
mpi
;
171
172
#ifdef __cplusplus
173
extern
"C"
{
174
#endif
175
181
void
mpi_init
(
mpi
*X );
182
188
void
mpi_free
(
mpi
*X );
189
199
int
mpi_grow
(
mpi
*X,
size_t
nblimbs );
200
210
int
mpi_copy
(
mpi
*X,
const
mpi
*Y );
211
218
void
mpi_swap
(
mpi
*X,
mpi
*Y );
219
229
int
mpi_lset
(
mpi
*X, t_sint z );
230
239
int
mpi_get_bit
(
const
mpi
*X,
size_t
pos );
240
255
int
mpi_set_bit
(
mpi
*X,
size_t
pos,
unsigned
char
val );
256
265
size_t
mpi_lsb
(
const
mpi
*X );
266
275
size_t
mpi_msb
(
const
mpi
*X );
276
282
size_t
mpi_size
(
const
mpi
*X );
283
293
int
mpi_read_string
(
mpi
*X,
int
radix,
const
char
*s );
294
310
int
mpi_write_string
(
const
mpi
*X,
int
radix,
char
*s,
size_t
*slen );
311
312
#if defined(POLARSSL_FS_IO)
313
324
int
mpi_read_file
(
mpi
*X,
int
radix, FILE *fin );
325
338
int
mpi_write_file
(
const
char
*p,
const
mpi
*X,
int
radix, FILE *fout );
339
#endif
/* POLARSSL_FS_IO */
340
351
int
mpi_read_binary
(
mpi
*X,
const
unsigned
char
*
buf
,
size_t
buflen );
352
365
int
mpi_write_binary
(
const
mpi
*X,
unsigned
char
*buf,
size_t
buflen );
366
376
int
mpi_shift_l
(
mpi
*X,
size_t
count );
377
387
int
mpi_shift_r
(
mpi
*X,
size_t
count );
388
399
int
mpi_cmp_abs
(
const
mpi
*X,
const
mpi
*Y );
400
411
int
mpi_cmp_mpi
(
const
mpi
*X,
const
mpi
*Y );
412
423
int
mpi_cmp_int
(
const
mpi
*X, t_sint z );
424
435
int
mpi_add_abs
(
mpi
*X,
const
mpi
*A,
const
mpi
*B );
436
447
int
mpi_sub_abs
(
mpi
*X,
const
mpi
*A,
const
mpi
*B );
448
459
int
mpi_add_mpi
(
mpi
*X,
const
mpi
*A,
const
mpi
*B );
460
471
int
mpi_sub_mpi
(
mpi
*X,
const
mpi
*A,
const
mpi
*B );
472
483
int
mpi_add_int
(
mpi
*X,
const
mpi
*A, t_sint b );
484
495
int
mpi_sub_int
(
mpi
*X,
const
mpi
*A, t_sint b );
496
507
int
mpi_mul_mpi
(
mpi
*X,
const
mpi
*A,
const
mpi
*B );
508
522
int
mpi_mul_int
(
mpi
*X,
const
mpi
*A, t_sint b );
523
538
int
mpi_div_mpi
(
mpi
*Q,
mpi
*R,
const
mpi
*A,
const
mpi
*B );
539
554
int
mpi_div_int
(
mpi
*Q,
mpi
*R,
const
mpi
*A, t_sint b );
555
568
int
mpi_mod_mpi
(
mpi
*R,
const
mpi
*A,
const
mpi
*B );
569
582
int
mpi_mod_int
( t_uint *r,
const
mpi
*A, t_sint b );
583
602
int
mpi_exp_mod
(
mpi
*X,
const
mpi
*A,
const
mpi
*E,
const
mpi
*N,
mpi
*_RR );
603
615
int
mpi_fill_random
(
mpi
*X,
size_t
size,
616
int
(*f_rng)(
void
*,
unsigned
char
*,
size_t
),
617
void
*p_rng );
618
629
int
mpi_gcd
(
mpi
*G,
const
mpi
*A,
const
mpi
*B );
630
643
int
mpi_inv_mod
(
mpi
*X,
const
mpi
*A,
const
mpi
*N );
644
656
int
mpi_is_prime
(
mpi
*X,
657
int
(*f_rng)(
void
*,
unsigned
char
*,
size_t
),
658
void
*p_rng );
659
673
int
mpi_gen_prime
(
mpi
*X,
size_t
nbits,
int
dh_flag,
674
int
(*f_rng)(
void
*,
unsigned
char
*,
size_t
),
675
void
*p_rng );
676
682
int
mpi_self_test
(
int
verbose );
683
684
#ifdef __cplusplus
685
}
686
#endif
687
688
#endif
/* bignum.h */
Generated on Mon Dec 1 2014 13:11:26 for PolarSSL v1.2.12 by
1.8.3.1