iPXE
bigint.h
Go to the documentation of this file.
1 #ifndef _IPXE_BIGINT_H
2 #define _IPXE_BIGINT_H
3 
4 /** @file
5  *
6  * Big integer support
7  */
8 
9 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
10 
11 #include <assert.h>
12 
13 /**
14  * Define a big-integer type
15  *
16  * @v size Number of elements
17  * @ret bigint_t Big integer type
18  */
19 #define bigint_t( size ) \
20  struct { \
21  bigint_element_t element[ (size) ]; \
22  }
23 
24 /**
25  * Determine number of elements required for a big-integer type
26  *
27  * @v len Maximum length of big integer, in bytes
28  * @ret size Number of elements
29  */
30 #define bigint_required_size( len ) \
31  ( ( (len) + sizeof ( bigint_element_t ) - 1 ) / \
32  sizeof ( bigint_element_t ) )
33 
34 /**
35  * Determine number of elements in big-integer type
36  *
37  * @v bigint Big integer
38  * @ret size Number of elements
39  */
40 #define bigint_size( bigint ) \
41  ( sizeof ( *(bigint) ) / sizeof ( (bigint)->element[0] ) )
42 
43 /**
44  * Initialise big integer
45  *
46  * @v value Big integer to initialise
47  * @v data Raw data
48  * @v len Length of raw data
49  */
50 #define bigint_init( value, data, len ) do { \
51  unsigned int size = bigint_size (value); \
52  assert ( (len) <= ( size * sizeof ( (value)->element[0] ) ) ); \
53  bigint_init_raw ( (value)->element, size, (data), (len) ); \
54  } while ( 0 )
55 
56 /**
57  * Finalise big integer
58  *
59  * @v value Big integer to finalise
60  * @v out Output buffer
61  * @v len Length of output buffer
62  */
63 #define bigint_done( value, out, len ) do { \
64  unsigned int size = bigint_size (value); \
65  bigint_done_raw ( (value)->element, size, (out), (len) ); \
66  } while ( 0 )
67 
68 /**
69  * Add big integers
70  *
71  * @v addend Big integer to add
72  * @v value Big integer to be added to
73  */
74 #define bigint_add( addend, value ) do { \
75  unsigned int size = bigint_size (addend); \
76  bigint_add_raw ( (addend)->element, (value)->element, size ); \
77  } while ( 0 )
78 
79 /**
80  * Subtract big integers
81  *
82  * @v subtrahend Big integer to subtract
83  * @v value Big integer to be subtracted from
84  */
85 #define bigint_subtract( subtrahend, value ) do { \
86  unsigned int size = bigint_size (subtrahend); \
87  bigint_subtract_raw ( (subtrahend)->element, (value)->element, \
88  size ); \
89  } while ( 0 )
90 
91 /**
92  * Rotate big integer left
93  *
94  * @v value Big integer
95  */
96 #define bigint_rol( value ) do { \
97  unsigned int size = bigint_size (value); \
98  bigint_rol_raw ( (value)->element, size ); \
99  } while ( 0 )
100 
101 /**
102  * Rotate big integer right
103  *
104  * @v value Big integer
105  */
106 #define bigint_ror( value ) do { \
107  unsigned int size = bigint_size (value); \
108  bigint_ror_raw ( (value)->element, size ); \
109  } while ( 0 )
110 
111 /**
112  * Test if big integer is equal to zero
113  *
114  * @v value Big integer
115  * @v size Number of elements
116  * @ret is_zero Big integer is equal to zero
117  */
118 #define bigint_is_zero( value ) ( { \
119  unsigned int size = bigint_size (value); \
120  bigint_is_zero_raw ( (value)->element, size ); } )
121 
122 /**
123  * Compare big integers
124  *
125  * @v value Big integer
126  * @v reference Reference big integer
127  * @ret geq Big integer is greater than or equal to the reference
128  */
129 #define bigint_is_geq( value, reference ) ( { \
130  unsigned int size = bigint_size (value); \
131  bigint_is_geq_raw ( (value)->element, (reference)->element, \
132  size ); } )
133 
134 /**
135  * Test if bit is set in big integer
136  *
137  * @v value Big integer
138  * @v bit Bit to test
139  * @ret is_set Bit is set
140  */
141 #define bigint_bit_is_set( value, bit ) ( { \
142  unsigned int size = bigint_size (value); \
143  bigint_bit_is_set_raw ( (value)->element, size, bit ); } )
144 
145 /**
146  * Find highest bit set in big integer
147  *
148  * @v value Big integer
149  * @ret max_bit Highest bit set + 1 (or 0 if no bits set)
150  */
151 #define bigint_max_set_bit( value ) ( { \
152  unsigned int size = bigint_size (value); \
153  bigint_max_set_bit_raw ( (value)->element, size ); } )
154 
155 /**
156  * Grow big integer
157  *
158  * @v source Source big integer
159  * @v dest Destination big integer
160  */
161 #define bigint_grow( source, dest ) do { \
162  unsigned int source_size = bigint_size (source); \
163  unsigned int dest_size = bigint_size (dest); \
164  bigint_grow_raw ( (source)->element, source_size, \
165  (dest)->element, dest_size ); \
166  } while ( 0 )
167 
168 /**
169  * Shrink big integer
170  *
171  * @v source Source big integer
172  * @v dest Destination big integer
173  */
174 #define bigint_shrink( source, dest ) do { \
175  unsigned int source_size = bigint_size (source); \
176  unsigned int dest_size = bigint_size (dest); \
177  bigint_shrink_raw ( (source)->element, source_size, \
178  (dest)->element, dest_size ); \
179  } while ( 0 )
180 
181 /**
182  * Copy big integer
183  *
184  * @v source Source big integer
185  * @v dest Destination big integer
186  */
187 #define bigint_copy( source, dest ) do { \
188  build_assert ( sizeof ( *(source) ) == sizeof ( *(dest) ) ); \
189  bigint_shrink ( (source), (dest) ); \
190  } while ( 0 )
191 
192 /**
193  * Conditionally swap big integers (in constant time)
194  *
195  * @v first Big integer to be conditionally swapped
196  * @v second Big integer to be conditionally swapped
197  * @v swap Swap first and second big integers
198  */
199 #define bigint_swap( first, second, swap ) do { \
200  unsigned int size = bigint_size (first); \
201  bigint_swap_raw ( (first)->element, (second)->element, size, \
202  (swap) ); \
203  } while ( 0 )
204 
205 /**
206  * Multiply big integers
207  *
208  * @v multiplicand Big integer to be multiplied
209  * @v multiplier Big integer to be multiplied
210  * @v result Big integer to hold result
211  */
212 #define bigint_multiply( multiplicand, multiplier, result ) do { \
213  unsigned int multiplicand_size = bigint_size (multiplicand); \
214  unsigned int multiplier_size = bigint_size (multiplier); \
215  bigint_multiply_raw ( (multiplicand)->element, \
216  multiplicand_size, (multiplier)->element, \
217  multiplier_size, (result)->element ); \
218  } while ( 0 )
219 
220 /**
221  * Perform modular multiplication of big integers
222  *
223  * @v multiplicand Big integer to be multiplied
224  * @v multiplier Big integer to be multiplied
225  * @v modulus Big integer modulus
226  * @v result Big integer to hold result
227  * @v tmp Temporary working space
228  */
229 #define bigint_mod_multiply( multiplicand, multiplier, modulus, \
230  result, tmp ) do { \
231  unsigned int size = bigint_size (multiplicand); \
232  bigint_mod_multiply_raw ( (multiplicand)->element, \
233  (multiplier)->element, \
234  (modulus)->element, \
235  (result)->element, size, tmp ); \
236  } while ( 0 )
237 
238 /**
239  * Calculate temporary working space required for moduluar multiplication
240  *
241  * @v modulus Big integer modulus
242  * @ret len Length of temporary working space
243  */
244 #define bigint_mod_multiply_tmp_len( modulus ) ( { \
245  unsigned int size = bigint_size (modulus); \
246  sizeof ( struct { \
247  bigint_t ( size * 2 ) temp_result; \
248  bigint_t ( size * 2 ) temp_modulus; \
249  } ); } )
250 
251 /**
252  * Perform modular exponentiation of big integers
253  *
254  * @v base Big integer base
255  * @v modulus Big integer modulus
256  * @v exponent Big integer exponent
257  * @v result Big integer to hold result
258  * @v tmp Temporary working space
259  */
260 #define bigint_mod_exp( base, modulus, exponent, result, tmp ) do { \
261  unsigned int size = bigint_size (base); \
262  unsigned int exponent_size = bigint_size (exponent); \
263  bigint_mod_exp_raw ( (base)->element, (modulus)->element, \
264  (exponent)->element, (result)->element, \
265  size, exponent_size, tmp ); \
266  } while ( 0 )
267 
268 /**
269  * Calculate temporary working space required for moduluar exponentiation
270  *
271  * @v modulus Big integer modulus
272  * @v exponent Big integer exponent
273  * @ret len Length of temporary working space
274  */
275 #define bigint_mod_exp_tmp_len( modulus, exponent ) ( { \
276  unsigned int size = bigint_size (modulus); \
277  unsigned int exponent_size = bigint_size (exponent); \
278  size_t mod_multiply_len = \
279  bigint_mod_multiply_tmp_len (modulus); \
280  sizeof ( struct { \
281  bigint_t ( size ) temp_base; \
282  bigint_t ( exponent_size ) temp_exponent; \
283  uint8_t mod_multiply[mod_multiply_len]; \
284  } ); } )
285 
286 #include <bits/bigint.h>
287 
288 void bigint_init_raw ( bigint_element_t *value0, unsigned int size,
289  const void *data, size_t len );
290 void bigint_done_raw ( const bigint_element_t *value0, unsigned int size,
291  void *out, size_t len );
292 void bigint_add_raw ( const bigint_element_t *addend0,
293  bigint_element_t *value0, unsigned int size );
294 void bigint_subtract_raw ( const bigint_element_t *subtrahend0,
295  bigint_element_t *value0, unsigned int size );
296 void bigint_rol_raw ( bigint_element_t *value0, unsigned int size );
297 void bigint_ror_raw ( bigint_element_t *value0, unsigned int size );
298 int bigint_is_zero_raw ( const bigint_element_t *value0, unsigned int size );
301  unsigned int size );
302 int bigint_bit_is_set_raw ( const bigint_element_t *value0, unsigned int size,
303  unsigned int bit );
305  unsigned int size );
306 void bigint_grow_raw ( const bigint_element_t *source0,
307  unsigned int source_size, bigint_element_t *dest0,
308  unsigned int dest_size );
309 void bigint_shrink_raw ( const bigint_element_t *source0,
310  unsigned int source_size, bigint_element_t *dest0,
311  unsigned int dest_size );
312 void bigint_swap_raw ( bigint_element_t *first0, bigint_element_t *second0,
313  unsigned int size, int swap );
314 void bigint_multiply_raw ( const bigint_element_t *multiplicand0,
315  unsigned int multiplicand_size,
316  const bigint_element_t *multiplier0,
317  unsigned int multiplier_size,
318  bigint_element_t *result0 );
319 void bigint_mod_multiply_raw ( const bigint_element_t *multiplicand0,
320  const bigint_element_t *multiplier0,
321  const bigint_element_t *modulus0,
322  bigint_element_t *result0,
323  unsigned int size, void *tmp );
324 void bigint_mod_exp_raw ( const bigint_element_t *base0,
325  const bigint_element_t *modulus0,
326  const bigint_element_t *exponent0,
327  bigint_element_t *result0,
328  unsigned int size, unsigned int exponent_size,
329  void *tmp );
330 
331 #endif /* _IPXE_BIGINT_H */
void bigint_grow_raw(const bigint_element_t *source0, unsigned int source_size, bigint_element_t *dest0, unsigned int dest_size)
static const uint32_t * reference0
Definition: bigint.h:180
static unsigned int unsigned int bit
Definition: bigint.h:208
int bigint_max_set_bit_raw(const bigint_element_t *value0, unsigned int size)
void bigint_subtract_raw(const bigint_element_t *subtrahend0, bigint_element_t *value0, unsigned int size)
void bigint_swap_raw(bigint_element_t *first0, bigint_element_t *second0, unsigned int size, int swap)
Conditionally swap big integers (in constant time)
Definition: bigint.c:61
static uint32_t * value0
Definition: bigint.h:57
void bigint_multiply_raw(const bigint_element_t *multiplicand0, unsigned int multiplicand_size, const bigint_element_t *multiplier0, unsigned int multiplier_size, bigint_element_t *result0)
Multiply big integers.
Definition: x86_bigint.c:44
unsigned long tmp
Definition: linux_pci.h:53
static unsigned int const void size_t len
Definition: bigint.h:27
void bigint_rol_raw(bigint_element_t *value0, unsigned int size)
Assertions.
static unsigned int const void * data
Definition: bigint.h:26
void bigint_add_raw(const bigint_element_t *addend0, bigint_element_t *value0, unsigned int size)
uint32_t bigint_element_t
Element of a big integer.
Definition: bigint.h:15
void bigint_init_raw(bigint_element_t *value0, unsigned int size, const void *data, size_t len)
static unsigned int uint32_t unsigned int dest_size
Definition: bigint.h:253
void bigint_mod_multiply_raw(const bigint_element_t *multiplicand0, const bigint_element_t *multiplier0, const bigint_element_t *modulus0, bigint_element_t *result0, unsigned int size, void *tmp)
Perform modular multiplication of big integers.
Definition: bigint.c:88
void bigint_mod_exp_raw(const bigint_element_t *base0, const bigint_element_t *modulus0, const bigint_element_t *exponent0, bigint_element_t *result0, unsigned int size, unsigned int exponent_size, void *tmp)
Perform modular exponentiation of big integers.
Definition: bigint.c:158
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
int bigint_bit_is_set_raw(const bigint_element_t *value0, unsigned int size, unsigned int bit)
static unsigned int source_size
Definition: bigint.h:252
void bigint_shrink_raw(const bigint_element_t *source0, unsigned int source_size, bigint_element_t *dest0, unsigned int dest_size)
void bigint_done_raw(const bigint_element_t *value0, unsigned int size, void *out, size_t len)
static unsigned int size void * out
Definition: bigint.h:306
void bigint_ror_raw(bigint_element_t *value0, unsigned int size)
int bigint_is_zero_raw(const bigint_element_t *value0, unsigned int size)
static unsigned int uint32_t * dest0
Definition: bigint.h:252
static unsigned int size
Definition: bigint.h:26
Big integer support.
int bigint_is_geq_raw(const bigint_element_t *value0, const bigint_element_t *reference0, unsigned int size)