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
9FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
10FILE_SECBOOT ( PERMITTED );
11
12#include <assert.h>
13#include <stdint.h>
14
15/**
16 * Define a big-integer type
17 *
18 * @v size Number of elements
19 * @ret bigint_t Big integer type
20 */
21#define bigint_t( size ) \
22 struct { \
23 bigint_element_t element[ (size) ]; \
24 }
25
26/**
27 * Determine number of elements required for a big-integer type
28 *
29 * @v len Maximum length of big integer, in bytes
30 * @ret size Number of elements
31 */
32#define bigint_required_size( len ) \
33 ( (len) ? ( ( (len) + sizeof ( bigint_element_t ) - 1 ) / \
34 sizeof ( bigint_element_t ) ) : 1 )
35
36/**
37 * Determine number of elements in big-integer type
38 *
39 * @v bigint Big integer
40 * @ret size Number of elements
41 */
42#define bigint_size( bigint ) \
43 ( sizeof ( *(bigint) ) / sizeof ( (bigint)->element[0] ) )
44
45/**
46 * Transcribe big integer (for debugging)
47 *
48 * @v value Big integer to be transcribed
49 * @ret string Big integer in string form (may be abbreviated)
50 */
51#define bigint_ntoa( value ) ( { \
52 unsigned int size = bigint_size (value); \
53 bigint_ntoa_raw ( (value)->element, size ); \
54 } )
55
56/**
57 * Initialise big integer
58 *
59 * @v value Big integer to initialise
60 * @v data Raw data
61 * @v len Length of raw data
62 */
63#define bigint_init( value, data, len ) do { \
64 unsigned int size = bigint_size (value); \
65 assert ( (len) <= ( size * sizeof ( (value)->element[0] ) ) ); \
66 bigint_init_raw ( (value)->element, size, (data), (len) ); \
67 } while ( 0 )
68
69/**
70 * Finalise big integer
71 *
72 * @v value Big integer to finalise
73 * @v out Output buffer
74 * @v len Length of output buffer
75 */
76#define bigint_done( value, out, len ) do { \
77 unsigned int size = bigint_size (value); \
78 bigint_done_raw ( (value)->element, size, (out), (len) ); \
79 } while ( 0 )
80
81/**
82 * Add big integers
83 *
84 * @v addend Big integer to add
85 * @v value Big integer to be added to
86 * @ret carry Carry out
87 */
88#define bigint_add( addend, value ) ( { \
89 unsigned int size = bigint_size (addend); \
90 bigint_add_raw ( (addend)->element, (value)->element, size ); \
91 } )
92
93/**
94 * Subtract big integers
95 *
96 * @v subtrahend Big integer to subtract
97 * @v value Big integer to be subtracted from
98 * @ret borrow Borrow out
99 */
100#define bigint_subtract( subtrahend, value ) ( { \
101 unsigned int size = bigint_size (subtrahend); \
102 bigint_subtract_raw ( (subtrahend)->element, (value)->element, \
103 size ); \
104 } )
105
106/**
107 * Shift big integer left
108 *
109 * @v value Big integer
110 * @ret out Bit shifted out
111 */
112#define bigint_shl( value ) ( { \
113 unsigned int size = bigint_size (value); \
114 bigint_shl_raw ( (value)->element, size ); \
115 } )
116
117/**
118 * Shift big integer right
119 *
120 * @v value Big integer
121 * @ret out Bit shifted out
122 */
123#define bigint_shr( value ) ( { \
124 unsigned int size = bigint_size (value); \
125 bigint_shr_raw ( (value)->element, size ); \
126 } )
127
128/**
129 * Test if big integer is equal to zero
130 *
131 * @v value Big integer
132 * @v size Number of elements
133 * @ret is_zero Big integer is equal to zero
134 */
135#define bigint_is_zero( value ) ( { \
136 unsigned int size = bigint_size (value); \
137 bigint_is_zero_raw ( (value)->element, size ); } )
138
139/**
140 * Compare big integers
141 *
142 * @v value Big integer
143 * @v reference Reference big integer
144 * @ret geq Big integer is greater than or equal to the reference
145 */
146#define bigint_is_geq( value, reference ) ( { \
147 unsigned int size = bigint_size (value); \
148 bigint_is_geq_raw ( (value)->element, (reference)->element, \
149 size ); } )
150
151/**
152 * Set bit in big integer
153 *
154 * @v value Big integer
155 * @v bit Bit to set
156 */
157#define bigint_set_bit( value, bit ) do { \
158 unsigned int size = bigint_size (value); \
159 bigint_set_bit_raw ( (value)->element, size, bit ); \
160 } while ( 0 )
161
162/**
163 * Clear bit in big integer
164 *
165 * @v value Big integer
166 * @v bit Bit to set
167 */
168#define bigint_clear_bit( value, bit ) do { \
169 unsigned int size = bigint_size (value); \
170 bigint_clear_bit_raw ( (value)->element, size, bit ); \
171 } while ( 0 )
172
173/**
174 * Test if bit is set in big integer
175 *
176 * @v value Big integer
177 * @v bit Bit to test
178 * @ret is_set Bit is set
179 */
180#define bigint_bit_is_set( value, bit ) ( { \
181 unsigned int size = bigint_size (value); \
182 bigint_bit_is_set_raw ( (value)->element, size, bit ); } )
183
184/**
185 * Test if most significant bit is set in big integer
186 *
187 * @v value Big integer
188 * @ret is_set Most significant bit is set
189 */
190#define bigint_msb_is_set( value ) ( { \
191 unsigned int size = bigint_size (value); \
192 bigint_msb_is_set_raw ( (value)->element, size ); } )
193
194/**
195 * Find highest bit set in big integer
196 *
197 * @v value Big integer
198 * @ret max_bit Highest bit set + 1 (or 0 if no bits set)
199 */
200#define bigint_max_set_bit( value ) ( { \
201 unsigned int size = bigint_size (value); \
202 bigint_max_set_bit_raw ( (value)->element, size ); } )
203
204/**
205 * Grow big integer
206 *
207 * @v source Source big integer
208 * @v dest Destination big integer
209 */
210#define bigint_grow( source, dest ) do { \
211 unsigned int source_size = bigint_size (source); \
212 unsigned int dest_size = bigint_size (dest); \
213 bigint_grow_raw ( (source)->element, source_size, \
214 (dest)->element, dest_size ); \
215 } while ( 0 )
216
217/**
218 * Shrink big integer
219 *
220 * @v source Source big integer
221 * @v dest Destination big integer
222 */
223#define bigint_shrink( source, dest ) do { \
224 unsigned int source_size = bigint_size (source); \
225 unsigned int dest_size = bigint_size (dest); \
226 bigint_shrink_raw ( (source)->element, source_size, \
227 (dest)->element, dest_size ); \
228 } while ( 0 )
229
230/**
231 * Copy big integer
232 *
233 * @v source Source big integer
234 * @v dest Destination big integer
235 */
236#define bigint_copy( source, dest ) do { \
237 build_assert ( sizeof ( *(source) ) == sizeof ( *(dest) ) ); \
238 bigint_shrink ( (source), (dest) ); \
239 } while ( 0 )
240
241/**
242 * Conditionally swap big integers (in constant time)
243 *
244 * @v first Big integer to be conditionally swapped
245 * @v second Big integer to be conditionally swapped
246 * @v swap Swap first and second big integers
247 */
248#define bigint_swap( first, second, swap ) do { \
249 unsigned int size = bigint_size (first); \
250 bigint_swap_raw ( (first)->element, (second)->element, size, \
251 (swap) ); \
252 } while ( 0 )
253
254/**
255 * Multiply big integers
256 *
257 * @v multiplicand Big integer to be multiplied
258 * @v multiplier Big integer to be multiplied
259 * @v result Big integer to hold result
260 */
261#define bigint_multiply( multiplicand, multiplier, result ) do { \
262 unsigned int multiplicand_size = bigint_size (multiplicand); \
263 unsigned int multiplier_size = bigint_size (multiplier); \
264 bigint_multiply_raw ( (multiplicand)->element, \
265 multiplicand_size, (multiplier)->element, \
266 multiplier_size, (result)->element ); \
267 } while ( 0 )
268
269/**
270 * Reduce big integer R^2 modulo N
271 *
272 * @v modulus Big integer modulus
273 * @v result Big integer to hold result
274 */
275#define bigint_reduce( modulus, result ) do { \
276 unsigned int size = bigint_size (modulus); \
277 bigint_reduce_raw ( (modulus)->element, (result)->element, \
278 size ); \
279 } while ( 0 )
280
281/**
282 * Compute inverse of odd big integer modulo any power of two
283 *
284 * @v invertend Odd big integer to be inverted
285 * @v inverse Big integer to hold result
286 */
287#define bigint_mod_invert( invertend, inverse ) do { \
288 unsigned int size = bigint_size ( inverse ); \
289 bigint_mod_invert_raw ( (invertend)->element, \
290 (inverse)->element, size ); \
291 } while ( 0 )
292
293/**
294 * Perform relaxed Montgomery reduction (REDC) of a big integer
295 *
296 * @v modulus Big integer odd modulus
297 * @v value Big integer to be reduced
298 * @v result Big integer to hold result
299 * @ret carry Carry out
300 */
301#define bigint_montgomery_relaxed( modulus, value, result ) ( { \
302 unsigned int size = bigint_size (modulus); \
303 bigint_montgomery_relaxed_raw ( (modulus)->element, \
304 (value)->element, \
305 (result)->element, size ); \
306 } )
307
308/**
309 * Perform classic Montgomery reduction (REDC) of a big integer
310 *
311 * @v modulus Big integer odd modulus
312 * @v value Big integer to be reduced
313 * @v result Big integer to hold result
314 */
315#define bigint_montgomery( modulus, value, result ) do { \
316 unsigned int size = bigint_size (modulus); \
317 bigint_montgomery_raw ( (modulus)->element, (value)->element, \
318 (result)->element, size ); \
319 } while ( 0 )
320
321/**
322 * Perform generalised exponentiation via a Montgomery ladder
323 *
324 * @v result Big integer result (initialised to identity element)
325 * @v multiple Big integer multiple (initialised to generator)
326 * @v exponent Big integer exponent
327 * @v op Montgomery ladder commutative operation
328 * @v ctx Operation context (if needed)
329 * @v tmp Temporary working space (if needed)
330 */
331#define bigint_ladder( result, multiple, exponent, op, ctx, tmp ) do { \
332 unsigned int size = bigint_size (result); \
333 unsigned int exponent_size = bigint_size (exponent); \
334 bigint_ladder_raw ( (result)->element, (multiple)->element, \
335 size, (exponent)->element, exponent_size, \
336 (op), (ctx), (tmp) ); \
337 } while ( 0 )
338
339/**
340 * Perform modular exponentiation of big integers
341 *
342 * @v base Big integer base
343 * @v modulus Big integer modulus
344 * @v exponent Big integer exponent
345 * @v result Big integer to hold result
346 * @v tmp Temporary working space
347 */
348#define bigint_mod_exp( base, modulus, exponent, result, tmp ) do { \
349 unsigned int size = bigint_size (base); \
350 unsigned int exponent_size = bigint_size (exponent); \
351 bigint_mod_exp_raw ( (base)->element, (modulus)->element, \
352 (exponent)->element, (result)->element, \
353 size, exponent_size, tmp ); \
354 } while ( 0 )
355
356/**
357 * Calculate temporary working space required for moduluar exponentiation
358 *
359 * @v modulus Big integer modulus
360 * @ret len Length of temporary working space
361 */
362#define bigint_mod_exp_tmp_len( modulus ) \
363 sizeof ( struct { typeof ( *(modulus) ) temp[4]; } )
364
365#include <bits/bigint.h>
366
367/**
368 * A big integer Montgomery ladder commutative operation
369 *
370 * @v operand Element 0 of first input operand (may overlap result)
371 * @v result Element 0 of second input operand and result
372 * @v size Number of elements in operands and result
373 * @v ctx Operation context (if needed)
374 * @v tmp Temporary working space (if needed)
375 */
376typedef void ( bigint_ladder_op_t ) ( const bigint_element_t *operand0,
377 bigint_element_t *result0,
378 unsigned int size, const void *ctx,
379 void *tmp );
380
381/**
382 * Set bit in big integer
383 *
384 * @v value0 Element 0 of big integer
385 * @v size Number of elements
386 * @v bit Bit to set
387 */
388static inline __attribute__ (( always_inline )) void
389bigint_set_bit_raw ( bigint_element_t *value0, unsigned int size,
390 unsigned int bit ) {
391 bigint_t ( size ) __attribute__ (( may_alias )) *value =
392 ( ( void * ) value0 );
393 unsigned int index = ( bit / ( 8 * sizeof ( value->element[0] ) ) );
394 unsigned int subindex = ( bit % ( 8 * sizeof ( value->element[0] ) ) );
395
396 value->element[index] |= ( 1UL << subindex );
397}
398
399/**
400 * Clear bit in big integer
401 *
402 * @v value0 Element 0 of big integer
403 * @v size Number of elements
404 * @v bit Bit to clear
405 */
406static inline __attribute__ (( always_inline )) void
407bigint_clear_bit_raw ( bigint_element_t *value0, unsigned int size,
408 unsigned int bit ) {
409 bigint_t ( size ) __attribute__ (( may_alias )) *value =
410 ( ( void * ) value0 );
411 unsigned int index = ( bit / ( 8 * sizeof ( value->element[0] ) ) );
412 unsigned int subindex = ( bit % ( 8 * sizeof ( value->element[0] ) ) );
413
414 value->element[index] &= ~( 1UL << subindex );
415}
416
417/**
418 * Test if bit is set in big integer
419 *
420 * @v value0 Element 0 of big integer
421 * @v size Number of elements
422 * @v bit Bit to test
423 * @ret is_set Bit is set
424 */
425static inline __attribute__ (( always_inline )) int
427 unsigned int bit ) {
428 const bigint_t ( size ) __attribute__ (( may_alias )) *value =
429 ( ( const void * ) value0 );
430 unsigned int index = ( bit / ( 8 * sizeof ( value->element[0] ) ) );
431 unsigned int subindex = ( bit % ( 8 * sizeof ( value->element[0] ) ) );
432
433 return ( !! ( value->element[index] & ( 1UL << subindex ) ) );
434}
435
436/**
437 * Test if most significant bit is set in big integer
438 *
439 * @v value0 Element 0 of big integer
440 * @v size Number of elements
441 * @ret is_set Most significant bit is set
442 */
443static inline __attribute__ (( always_inline )) int
444bigint_msb_is_set_raw ( const bigint_element_t *value0, unsigned int size ) {
445 const bigint_t ( size ) __attribute__ (( may_alias )) *value =
446 ( ( const void * ) value0 );
447 unsigned int index = ( size - 1 );
448 unsigned int subindex = ( ( 8 * sizeof ( value->element[0] ) ) - 1 );
449
450 return ( !! ( value->element[index] & ( 1UL << subindex ) ) );
451}
452
453const char * bigint_ntoa_raw ( const bigint_element_t *value0,
454 unsigned int size );
455void bigint_init_raw ( bigint_element_t *value0, unsigned int size,
456 const void *data, size_t len );
457void bigint_done_raw ( const bigint_element_t *value0, unsigned int size,
458 void *out, size_t len );
459int bigint_add_raw ( const bigint_element_t *addend0,
460 bigint_element_t *value0, unsigned int size );
461int bigint_subtract_raw ( const bigint_element_t *subtrahend0,
462 bigint_element_t *value0, unsigned int size );
465int bigint_is_zero_raw ( const bigint_element_t *value0, unsigned int size );
467 const bigint_element_t *reference0,
468 unsigned int size );
470 unsigned int bit );
472 unsigned int size );
473void bigint_grow_raw ( const bigint_element_t *source0,
474 unsigned int source_size, bigint_element_t *dest0,
475 unsigned int dest_size );
477 unsigned int source_size, bigint_element_t *dest0,
478 unsigned int dest_size );
479void bigint_swap_raw ( bigint_element_t *first0, bigint_element_t *second0,
480 unsigned int size, int swap );
481void bigint_multiply_one ( const bigint_element_t multiplicand,
485void bigint_multiply_raw ( const bigint_element_t *multiplicand0,
486 unsigned int multiplicand_size,
487 const bigint_element_t *multiplier0,
488 unsigned int multiplier_size,
489 bigint_element_t *result0 );
490void bigint_reduce_raw ( const bigint_element_t *modulus0,
491 bigint_element_t *result0, unsigned int size );
492void bigint_mod_invert_raw ( const bigint_element_t *invertend0,
493 bigint_element_t *inverse0, unsigned int size );
496 bigint_element_t *result0,
497 unsigned int size );
498void bigint_montgomery_raw ( const bigint_element_t *modulus0,
500 bigint_element_t *result0, unsigned int size );
501void bigint_ladder_raw ( bigint_element_t *result0,
502 bigint_element_t *multiple0, unsigned int size,
503 const bigint_element_t *exponent0,
504 unsigned int exponent_size, bigint_ladder_op_t *op,
505 const void *ctx, void *tmp );
506void bigint_mod_exp_ladder ( const bigint_element_t *multiplier0,
507 bigint_element_t *result0, unsigned int size,
508 const void *ctx, void *tmp );
509void bigint_mod_exp_raw ( const bigint_element_t *base0,
510 const bigint_element_t *modulus0,
511 const bigint_element_t *exponent0,
512 bigint_element_t *result0,
513 unsigned int size, unsigned int exponent_size,
514 void *tmp );
515
516#endif /* _IPXE_BIGINT_H */
struct golan_eq_context ctx
Definition CIB_PRM.h:0
__be32 out[4]
Definition CIB_PRM.h:8
pseudo_bit_t value[0x00020]
Definition arbel.h:2
uint16_t result
Definition hyperv.h:33
Big integer support.
static const uint32_t multiplier
Port multiplier number.
Definition bigint.h:195
long index
Definition bigint.h:30
uint32_t bigint_element_t
Element of a big integer.
Definition bigint.h:15
int carry
Definition bigint.h:33
static uint32_t * value0
Definition bigint.h:26
static unsigned int source_size
Definition bigint.h:141
static unsigned int uint32_t unsigned int dest_size
Definition bigint.h:142
static unsigned int uint32_t * dest0
Definition bigint.h:142
Assertions.
ring len
Length.
Definition dwmac.h:226
uint8_t data[48]
Additional event data.
Definition ena.h:11
uint16_t size
Buffer size.
Definition dwmac.h:3
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:921
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:951
#define __attribute__(x)
Definition compiler.h:10
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:886
int bigint_is_geq_raw(const bigint_element_t *value0, const bigint_element_t *reference0, unsigned int size)
Compare big integers.
Definition bigint.c:168
unsigned int subindex
Definition bigint.h:394
void bigint_shrink_raw(const bigint_element_t *source0, unsigned int source_size, bigint_element_t *dest0, unsigned int dest_size)
int bigint_montgomery_relaxed_raw(const bigint_element_t *modulus0, bigint_element_t *value0, bigint_element_t *result0, unsigned int size)
Perform relaxed Montgomery reduction (REDC) of a big integer.
Definition bigint.c:622
int bigint_subtract_raw(const bigint_element_t *subtrahend0, bigint_element_t *value0, unsigned int size)
void bigint_grow_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)
Finalise big integer.
Definition bigint.c:121
int bigint_bit_is_set_raw(const bigint_element_t *value0, unsigned int size, unsigned int bit)
void bigint_multiply_one(const bigint_element_t multiplicand, const bigint_element_t multiplier, bigint_element_t *result, bigint_element_t *carry)
void bigint_mod_invert_raw(const bigint_element_t *invertend0, bigint_element_t *inverse0, unsigned int size)
Compute inverse of odd big integer modulo any power of two.
Definition bigint.c:452
int bigint_add_raw(const bigint_element_t *addend0, bigint_element_t *value0, unsigned int size)
static unsigned int unsigned int bit
Definition bigint.h:390
const char * bigint_ntoa_raw(const bigint_element_t *value0, unsigned int size)
Transcribe big integer (for debugging).
Definition bigint.c:50
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 bigint.c:252
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:226
int bigint_is_zero_raw(const bigint_element_t *value0, unsigned int size)
Test if big integer is equal to zero.
Definition bigint.c:147
void bigint_reduce_raw(const bigint_element_t *modulus0, bigint_element_t *result0, unsigned int size)
Reduce big integer R^2 modulo N.
Definition bigint.c:323
void bigint_montgomery_raw(const bigint_element_t *modulus0, bigint_element_t *value0, bigint_element_t *result0, unsigned int size)
Perform classic Montgomery reduction (REDC) of a big integer.
Definition bigint.c:699
#define bigint_t(size)
Define a big-integer type.
Definition bigint.h:21
void bigint_mod_exp_ladder(const bigint_element_t *multiplier0, bigint_element_t *result0, unsigned int size, const void *ctx, void *tmp)
Perform modular multiplication as part of a Montgomery ladder.
Definition bigint.c:854
void bigint_init_raw(bigint_element_t *value0, unsigned int size, const void *data, size_t len)
Initialise big integer.
Definition bigint.c:94
int bigint_max_set_bit_raw(const bigint_element_t *value0, unsigned int size)
Find highest bit set in big integer.
Definition bigint.c:196
int bigint_shl_raw(bigint_element_t *value0, unsigned int size)
void bigint_ladder_op_t(const bigint_element_t *operand0, bigint_element_t *result0, unsigned int size, const void *ctx, void *tmp)
A big integer Montgomery ladder commutative operation.
Definition bigint.h:376
int bigint_shr_raw(bigint_element_t *value0, unsigned int size)
void bigint_ladder_raw(bigint_element_t *result0, bigint_element_t *multiple0, unsigned int size, const bigint_element_t *exponent0, unsigned int exponent_size, bigint_ladder_op_t *op, const void *ctx, void *tmp)
Perform generalised exponentiation via a Montgomery ladder.
Definition bigint.c:766
unsigned long tmp
Definition linux_pci.h:65
static uint16_t struct vmbus_xfer_pages_operations * op
Definition netvsc.h:327