iPXE
bigint.h
Go to the documentation of this file.
1#ifndef _BITS_BIGINT_H
2#define _BITS_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 <stdint.h>
13
14/** Element of a big integer */
16
17/**
18 * Add big integers
19 *
20 * @v addend0 Element 0 of big integer to add
21 * @v value0 Element 0 of big integer to be added to
22 * @v size Number of elements
23 * @ret carry Carry flag
24 */
25static inline __attribute__ (( always_inline )) int
27 unsigned int size ) {
28 bigint_t ( size ) __attribute__ (( may_alias )) *value =
29 ( ( void * ) value0 );
30 long index;
31 void *discard_S;
33 int carry;
34
35 __asm__ __volatile__ ( "xor %0, %0\n\t" /* Zero %0 and clear CF */
36 "\n1:\n\t"
37 "lodsl\n\t"
38 "adcl %%eax, (%5,%0,4)\n\t"
39 "inc %0\n\t" /* Does not affect CF */
40 "loop 1b\n\t"
41 : "=&r" ( index ), "=&S" ( discard_S ),
42 "=&c" ( discard_c ), "=@ccc" ( carry ),
43 "+m" ( *value )
44 : "r" ( value0 ), "1" ( addend0 ), "2" ( size )
45 : "eax" );
46 return carry;
47}
48
49/**
50 * Subtract big integers
51 *
52 * @v subtrahend0 Element 0 of big integer to subtract
53 * @v value0 Element 0 of big integer to be subtracted from
54 * @v size Number of elements
55 * @ret borrow Borrow flag
56 */
57static inline __attribute__ (( always_inline )) int
58bigint_subtract_raw ( const uint32_t *subtrahend0, uint32_t *value0,
59 unsigned int size ) {
60 bigint_t ( size ) __attribute__ (( may_alias )) *value =
61 ( ( void * ) value0 );
62 long index;
63 void *discard_S;
64 long discard_c;
65 int borrow;
66
67 __asm__ __volatile__ ( "xor %0, %0\n\t" /* Zero %0 and clear CF */
68 "\n1:\n\t"
69 "lodsl\n\t"
70 "sbbl %%eax, (%5,%0,4)\n\t"
71 "inc %0\n\t" /* Does not affect CF */
72 "loop 1b\n\t"
73 : "=&r" ( index ), "=&S" ( discard_S ),
74 "=&c" ( discard_c ), "=@ccc" ( borrow ),
75 "+m" ( *value )
76 : "r" ( value0 ), "1" ( subtrahend0 ),
77 "2" ( size )
78 : "eax" );
79 return borrow;
80}
81
82/**
83 * Shift big integer left
84 *
85 * @v value0 Element 0 of big integer
86 * @v size Number of elements
87 * @ret out Bit shifted out
88 */
89static inline __attribute__ (( always_inline )) int
90bigint_shl_raw ( uint32_t *value0, unsigned int size ) {
91 bigint_t ( size ) __attribute__ (( may_alias )) *value =
92 ( ( void * ) value0 );
93 long index;
94 long discard_c;
95 int out;
96
97 __asm__ __volatile__ ( "xor %0, %0\n\t" /* Zero %0 and clear CF */
98 "\n1:\n\t"
99 "rcll $1, (%4,%0,4)\n\t"
100 "inc %0\n\t" /* Does not affect CF */
101 "loop 1b\n\t"
102 : "=&r" ( index ), "=&c" ( discard_c ),
103 "=@ccc" ( out ), "+m" ( *value )
104 : "r" ( value0 ), "1" ( size ) );
105 return out;
106}
107
108/**
109 * Shift big integer right
110 *
111 * @v value0 Element 0 of big integer
112 * @v size Number of elements
113 * @ret out Bit shifted out
114 */
115static inline __attribute__ (( always_inline )) int
116bigint_shr_raw ( uint32_t *value0, unsigned int size ) {
117 bigint_t ( size ) __attribute__ (( may_alias )) *value =
118 ( ( void * ) value0 );
119 long discard_c;
120 int out;
121
123 "\n1:\n\t"
124 "rcrl $1, -4(%3,%0,4)\n\t"
125 "loop 1b\n\t"
126 : "=&c" ( discard_c ), "=@ccc" ( out ),
127 "+m" ( *value )
128 : "r" ( value0 ), "0" ( size ) );
129 return out;
130}
131
132/**
133 * Grow big integer
134 *
135 * @v source0 Element 0 of source big integer
136 * @v source_size Number of elements in source big integer
137 * @v dest0 Element 0 of destination big integer
138 * @v dest_size Number of elements in destination big integer
139 */
140static inline __attribute__ (( always_inline )) void
141bigint_grow_raw ( const uint32_t *source0, unsigned int source_size,
142 uint32_t *dest0, unsigned int dest_size ) {
143 bigint_t ( dest_size ) __attribute__ (( may_alias )) *dest =
144 ( ( void * ) dest0 );
147 void *discard_S;
148 long discard_c;
149
150 __asm__ __volatile__ ( "rep movsl\n\t"
151 "xorl %%eax, %%eax\n\t"
152 "mov %4, %2\n\t"
153 "rep stosl\n\t"
154 : "=&D" ( discard_D ), "=&S" ( discard_S ),
155 "=&c" ( discard_c ), "+m" ( *dest )
156 : "g" ( pad_size ), "0" ( dest0 ),
157 "1" ( source0 ), "2" ( source_size )
158 : "eax" );
159}
160
161/**
162 * Shrink big integer
163 *
164 * @v source0 Element 0 of source big integer
165 * @v source_size Number of elements in source big integer
166 * @v dest0 Element 0 of destination big integer
167 * @v dest_size Number of elements in destination big integer
168 */
169static inline __attribute__ (( always_inline )) void
170bigint_shrink_raw ( const uint32_t *source0, unsigned int source_size __unused,
171 uint32_t *dest0, unsigned int dest_size ) {
172 bigint_t ( dest_size ) __attribute__ (( may_alias )) *dest =
173 ( ( void * ) dest0 );
174 void *discard_D;
175 void *discard_S;
176 long discard_c;
177
178 __asm__ __volatile__ ( "rep movsl\n\t"
179 : "=&D" ( discard_D ), "=&S" ( discard_S ),
180 "=&c" ( discard_c ), "+m" ( *dest )
181 : "0" ( dest0 ), "1" ( source0 ),
182 "2" ( dest_size )
183 : "eax" );
184}
185
186/**
187 * Multiply big integer elements
188 *
189 * @v multiplicand Multiplicand element
190 * @v multiplier Multiplier element
191 * @v result Result element
192 * @v carry Carry element
193 */
194static inline __attribute__ (( always_inline )) void
197 uint32_t discard_a;
198
199 __asm__ __volatile__ ( /* Perform multiplication */
200 "mull %3\n\t"
201 /* Accumulate carry */
202 "addl %5, %0\n\t"
203 "adcl $0, %1\n\t"
204 /* Accumulate result */
205 "addl %0, %2\n\t"
206 "adcl $0, %1\n\t"
207 : "=&a" ( discard_a ),
208 "=&d" ( *carry ),
209 "+m" ( *result )
210 : "g" ( multiplicand ),
211 "0" ( multiplier ),
212 "r" ( *carry ) );
213}
214
215#endif /* _BITS_BIGINT_H */
__be32 out[4]
Definition CIB_PRM.h:8
pseudo_bit_t value[0x00020]
Definition arbel.h:2
uint16_t result
Definition hyperv.h:33
unsigned int uint32_t
Definition stdint.h:12
__asm__ __volatile__("rep movsl\n\t" :"=&D"(discard_D), "=&S"(discard_S), "=&c"(discard_c), "+m"(*dest) :"0"(dest0), "1"(source0), "2"(dest_size) :"eax")
long pad_size
Definition bigint.h:145
static const uint32_t multiplier
Port multiplier number.
Definition bigint.h:195
long index
Definition bigint.h:30
void * discard_D
Definition bigint.h:146
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
long discard_c
Definition bigint.h:32
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
int borrow
Definition bigint.h:65
void * discard_S
Definition bigint.h:31
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" retur dest)
Definition string.h:151
#define __unused
Declare a variable or data structure as unused.
Definition compiler.h:598
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_shrink_raw(const bigint_element_t *source0, unsigned int source_size, bigint_element_t *dest0, unsigned int dest_size)
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_multiply_one(const bigint_element_t multiplicand, const bigint_element_t multiplier, bigint_element_t *result, bigint_element_t *carry)
int bigint_add_raw(const bigint_element_t *addend0, bigint_element_t *value0, unsigned int size)
#define bigint_t(size)
Define a big-integer type.
Definition bigint.h:21
int bigint_shl_raw(bigint_element_t *value0, unsigned int size)
int bigint_shr_raw(bigint_element_t *value0, unsigned int size)
__asm__(".section \".rodata\", \"a\", " PROGBITS "\n\t" "\nprivate_key_data:\n\t" ".size private_key_data, ( . - private_key_data )\n\t" ".equ private_key_len, ( . - private_key_data )\n\t" ".previous\n\t")