xbmc
bigint_impl.h
1 /*
2  * Copyright (c) 2007, Cameron Rich
3  *
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  * * Redistributions of source code must retain the above copyright notice,
10  * this list of conditions and the following disclaimer.
11  * * Redistributions in binary form must reproduce the above copyright notice,
12  * this list of conditions and the following disclaimer in the documentation
13  * and/or other materials provided with the distribution.
14  * * Neither the name of the axTLS project nor the names of its contributors
15  * may be used to endorse or promote products derived from this software
16  * without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #ifndef BIGINT_IMPL_HEADER
32 #define BIGINT_IMPL_HEADER
33 
34 /* Maintain a number of precomputed variables when doing reduction */
35 #define BIGINT_M_OFFSET 0
36 #ifdef CONFIG_BIGINT_CRT
37 #define BIGINT_P_OFFSET 1
38 #define BIGINT_Q_OFFSET 2
39 #define BIGINT_NUM_MODS 3
40 #else
41 #define BIGINT_NUM_MODS 1
42 #endif
43 
44 /* Architecture specific functions for big ints */
45 #if defined(CONFIG_INTEGER_8BIT)
46 #define COMP_RADIX 256U
47 #define COMP_MAX 0xFFFFU
48 #define COMP_BIT_SIZE 8
49 #define COMP_BYTE_SIZE 1
50 #define COMP_NUM_NIBBLES 2
51 typedef uint8_t comp;
52 typedef uint16_t long_comp;
53 typedef int16_t slong_comp;
54 #elif defined(CONFIG_INTEGER_16BIT)
55 #define COMP_RADIX 65536U
56 #define COMP_MAX 0xFFFFFFFFU
57 #define COMP_BIT_SIZE 16
58 #define COMP_BYTE_SIZE 2
59 #define COMP_NUM_NIBBLES 4
60 typedef uint16_t comp;
61 typedef uint32_t long_comp;
62 typedef int32_t slong_comp;
63 #else /* regular 32 bit */
64 #ifdef WIN32
65 #define COMP_RADIX 4294967296i64
66 #define COMP_MAX 0xFFFFFFFFFFFFFFFFui64
67 #else
68 #define COMP_RADIX 4294967296ULL
69 #define COMP_MAX 0xFFFFFFFFFFFFFFFFULL
70 #endif
71 #define COMP_BIT_SIZE 32
72 #define COMP_BYTE_SIZE 4
73 #define COMP_NUM_NIBBLES 8
74 typedef uint32_t comp;
75 typedef uint64_t long_comp;
76 typedef int64_t slong_comp;
77 #endif
78 
83 struct _bigint
84 {
85  struct _bigint* next;
86  short size;
87  short max_comps;
88  int refs;
89  comp* comps;
90 };
91 
92 typedef struct _bigint bigint;
98 typedef struct
99 {
103  bigint *bi_mod[BIGINT_NUM_MODS];
105 #if defined(CONFIG_BIGINT_MONTGOMERY)
106  bigint *bi_RR_mod_m[BIGINT_NUM_MODS];
107  bigint *bi_R_mod_m[BIGINT_NUM_MODS];
108  comp N0_dash[BIGINT_NUM_MODS];
109 #elif defined(CONFIG_BIGINT_BARRETT)
110  bigint *bi_mu[BIGINT_NUM_MODS];
111 #endif
112  bigint *bi_normalised_mod[BIGINT_NUM_MODS];
113  bigint **g;
114  int window;
118 #ifdef CONFIG_BIGINT_MONTGOMERY
119  uint8_t use_classical;
120 #endif
121  uint8_t mod_offset;
122 } BI_CTX;
123 
124 #ifndef WIN32
125 #define max(a,b) ((a)>(b)?(a):(b))
126 #define min(a,b) ((a)<(b)?(a):(b))
127 #endif
128 
129 #define PERMANENT 0x7FFF55AA
131 #endif
int free_count
Number of free bigints.
Definition: bigint_impl.h:116
int refs
An internal reference count.
Definition: bigint_impl.h:88
int active_count
Number of active bigints.
Definition: bigint_impl.h:115
bigint * free_list
Bigints not used.
Definition: bigint_impl.h:101
struct _bigint * next
The next bigint in the cache.
Definition: bigint_impl.h:85
short max_comps
The heapsize allocated for this bigint.
Definition: bigint_impl.h:87
bigint * active_list
Bigints currently used.
Definition: bigint_impl.h:100
short size
The number of components in this bigint.
Definition: bigint_impl.h:86
bigint * bi_radix
The radix used.
Definition: bigint_impl.h:102
uint8_t mod_offset
The mod offset we are using.
Definition: bigint_impl.h:121
int window
The size of the sliding window.
Definition: bigint_impl.h:114
A big integer basic object.
Definition: bigint_impl.h:83
comp * comps
A ptr to the actual component data.
Definition: bigint_impl.h:89
bigint ** g
Used by sliding-window.
Definition: bigint_impl.h:113
Maintains the state of the cache, and a number of variables used in reduction.
Definition: bigint_impl.h:98