iPXE
Typedefs | Functions | Variables
bigint.h File Reference

Big integer support. More...

#include <stdint.h>
#include <string.h>

Go to the source code of this file.

Typedefs

typedef uint32_t bigint_element_t
 Element of a big integer. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static __attribute__ ((always_inline)) void bigint_init_raw(uint32_t *value0
 Initialise big integer. More...
 
__asm__ __volatile__ ("\n1:\n\t" "movb -1(%3,%1), %%al\n\t" "stosb\n\t" "loop 1b\n\t" "xorl %%eax, %%eax\n\t" "mov %4, %1\n\t" "rep stosb\n\t" :"=&D"(discard_D), "=&c"(discard_c), "+m"(*value) :"r"(data), "g"(pad_len), "0"(value0), "1"(len) :"eax")
 
__asm__ __volatile__ ("xor %0, %0\n\t" "\n1:\n\t" "lodsl\n\t" "adcl %%eax, (%4,%0,4)\n\t" "inc %0\n\t" "loop 1b\n\t" :"=&r"(index), "=&S"(discard_S), "=&c"(discard_c), "+m"(*value) :"r"(value0), "1"(addend0), "2"(size) :"eax")
 
__asm__ __volatile__ ("xor %0, %0\n\t" "\n1:\n\t" "lodsl\n\t" "sbbl %%eax, (%4,%0,4)\n\t" "inc %0\n\t" "loop 1b\n\t" :"=&r"(index), "=&S"(discard_S), "=&c"(discard_c), "+m"(*value) :"r"(value0), "1"(subtrahend0), "2"(size) :"eax")
 
__asm__ __volatile__ ("xor %0, %0\n\t" "\n1:\n\t" "rcll $1, (%3,%0,4)\n\t" "inc %0\n\t" "loop 1b\n\t" :"=&r"(index), "=&c"(discard_c), "+m"(*value) :"r"(value0), "1"(size))
 
__asm__ __volatile__ ("clc\n\t" "\n1:\n\t" "rcrl $1, -4(%2,%0,4)\n\t" "loop 1b\n\t" :"=&c"(discard_c), "+m"(*value) :"r"(value0), "0"(size))
 
static __attribute__ ((always_inline, pure)) int bigint_is_zero_raw(const uint32_t *value0
 Test if big integer is equal to zero. More...
 
__asm__ __volatile__ ("xor %0, %0\n\t" "repe scasl\n\t" "sete %b0\n\t" :"=&a"(result), "=&D"(discard_D), "=&c"(discard_c) :"1"(value0), "2"(size))
 
__asm__ __volatile__ ("\n1:\n\t" "movl -4(%3, %1, 4), %k2\n\t" "cmpl -4(%4, %1, 4), %k2\n\t" "loope 1b\n\t" "setae %b0\n\t" :"=q"(result), "=&c"(discard_c), "=&r"(discard_tmp) :"r"(value0), "r"(reference0), "0"(0), "1"(size))
 
 return (value->element[index] &(1<< subindex))
 
__asm__ __volatile__ ("\n1:\n\t" "bsrl -4(%2,%1,4), %0\n\t" "loopz 1b\n\t" "rol %1\n\t" "rol %1\n\t" "leal 1(%k0,%k1,8), %k0\n\t" "jnz 2f\n\t" "xor %0, %0\n\t" "\n2:\n\t" :"=&r"(result), "=&c"(discard_c) :"r"(value0), "1"(size))
 
__asm__ __volatile__ ("rep movsl\n\t" "xorl %%eax, %%eax\n\t" "mov %4, %2\n\t" "rep stosl\n\t" :"=&D"(discard_D), "=&S"(discard_S), "=&c"(discard_c), "+m"(*dest) :"g"(pad_size), "0"(dest0), "1"(source0), "2"(source_size) :"eax")
 
__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")
 
__asm__ __volatile__ ("\n1:\n\t" "movb -1(%3,%1), %%al\n\t" "stosb\n\t" "loop 1b\n\t" :"=&D"(discard_D), "=&c"(discard_c), "+m"(*out_bytes) :"r"(value0), "0"(out), "1"(len) :"eax")
 
void bigint_multiply_raw (const uint32_t *multiplicand0, unsigned int multiplicand_size, const uint32_t *multiplier0, unsigned int multiplier_size, uint32_t *value0)
 Multiply big integers. More...
 

Variables

static unsigned int size
 
static unsigned int const void * data
 
static unsigned int const void size_t len
 
long pad_len = ( sizeof ( *value ) - len )
 
void * discard_D
 
long discard_c
 
static uint32_tvalue0
 
long index = ( bit / ( 8 * sizeof ( value->element[0] ) ) )
 
void * discard_S
 
int result
 
static const uint32_treference0
 
long discard_tmp
 
static unsigned int unsigned int bit
 
unsigned int subindex = ( bit % ( 8 * sizeof ( value->element[0] ) ) )
 
static unsigned int source_size
 
static unsigned int uint32_tdest0
 
static unsigned int uint32_t unsigned int dest_size
 
long pad_size = ( dest_size - source_size )
 
static unsigned int source_size __unused
 
static unsigned int size void * out
 

Detailed Description

Big integer support.

Definition in file bigint.h.

Typedef Documentation

◆ bigint_element_t

Element of a big integer.

Definition at line 15 of file bigint.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ __attribute__() [1/2]

static __attribute__ ( (always_inline)  )
inlinestatic

Initialise big integer.

Finalise big integer.

Shrink big integer.

Grow big integer.

Find highest bit set in big integer.

Test if bit is set in big integer.

Rotate big integer right.

Rotate big integer left.

Subtract big integers.

Add big integers.

Parameters
value0Element 0 of big integer to initialise
sizeNumber of elements
dataRaw data
lenLength of raw data
addend0Element 0 of big integer to add
value0Element 0 of big integer to be added to
sizeNumber of elements
subtrahend0Element 0 of big integer to subtract
value0Element 0 of big integer to be subtracted from
sizeNumber of elements
value0Element 0 of big integer
sizeNumber of elements
value0Element 0 of big integer
sizeNumber of elements
bitBit to test
Return values
is_setBit is set
Parameters
value0Element 0 of big integer
sizeNumber of elements
Return values
max_bitHighest bit set + 1 (or 0 if no bits set)
Parameters
source0Element 0 of source big integer
source_sizeNumber of elements in source big integer
dest0Element 0 of destination big integer
dest_sizeNumber of elements in destination big integer
value0Element 0 of big integer to finalise
sizeNumber of elements
outOutput buffer
lenLength of output buffer

◆ __volatile__() [1/11]

__asm__ __volatile__ ( "\n1:\n\t" "movb 1%3,%1,
%%al\n\t" "stosb\n\t" "loop 1b\n\t" "xorl %%  eax,
%%eax\n\t" "mov %  4 
)

◆ __volatile__() [2/11]

__asm__ __volatile__ ( "xor %  0,
%0\n\t" "\n1:\n\t" "lodsl\n\t" "adcl %%  eax 
)

◆ __volatile__() [3/11]

__asm__ __volatile__ ( "xor %  0,
%0\n\t" "\n1:\n\t" "lodsl\n\t" "sbbl %%  eax 
)

◆ __volatile__() [4/11]

__asm__ __volatile__ ( "xor %  0,
%0\n\t" "\n1:\n\t" "rcll  $1 
)

◆ __volatile__() [5/11]

__asm__ __volatile__ ( "clc\n\t" "\n1:\n\t" "rcrl  $1)

◆ __attribute__() [2/2]

static __attribute__ ( (always_inline, pure)  ) const
inlinestatic

Test if big integer is equal to zero.

Compare big integers.

Parameters
value0Element 0 of big integer
sizeNumber of elements
Return values
is_zeroBig integer is equal to zero
Parameters
value0Element 0 of big integer
reference0Element 0 of reference big integer
sizeNumber of elements
Return values
geqBig integer is greater than or equal to the reference

◆ __volatile__() [6/11]

__asm__ __volatile__ ( "xor %  0)

◆ __volatile__() [7/11]

__asm__ __volatile__ ( "\n1:\n\t" "movl -  4%3, %1, 4,
%k2\n\t" "cmpl -  4%4, %1, 4 
)

◆ return()

return ( value->element &  (1<< subindex)[index])

◆ __volatile__() [8/11]

__asm__ __volatile__ ( "\n1:\n\t" "bsrl -  4%2,%1,4,
%0\n\t" "loopz 1b\n\t" "rol %1\n\t" "rol %1\n\t" "leal   1%k0,%k1, 8,
%k0\n\t" "jnz 2f\n\t" "xor %  0 
)

◆ __volatile__() [9/11]

__asm__ __volatile__ ( "rep movsl\n\t" "xorl %%  eax,
%%eax\n\t" "mov %  4 
)

◆ __volatile__() [10/11]

__asm__ __volatile__ ( )

◆ __volatile__() [11/11]

__asm__ __volatile__ ( "\n1:\n\t" "movb 1%3,%1)

◆ bigint_multiply_raw()

void bigint_multiply_raw ( const uint32_t multiplicand0,
unsigned int  multiplicand_size,
const uint32_t multiplier0,
unsigned int  multiplier_size,
uint32_t result0 
)

Multiply big integers.

Parameters
multiplicand0Element 0 of big integer to be multiplied
multiplicand_sizeNumber of elements in multiplicand
multiplier0Element 0 of big integer to be multiplied
multiplier_sizeNumber of elements in multiplier
result0Element 0 of big integer to hold result

Definition at line 44 of file x86_bigint.c.

48  {
49  unsigned int result_size = ( multiplicand_size + multiplier_size );
50  const bigint_t ( multiplicand_size ) __attribute__ (( may_alias ))
51  *multiplicand = ( ( const void * ) multiplicand0 );
52  const bigint_t ( multiplier_size ) __attribute__ (( may_alias ))
53  *multiplier = ( ( const void * ) multiplier0 );
54  bigint_t ( result_size ) __attribute__ (( may_alias ))
55  *result = ( ( void * ) result0 );
56  unsigned int i;
57  unsigned int j;
58  uint32_t multiplicand_element;
59  uint32_t multiplier_element;
60  uint32_t *result_elements;
61  uint32_t discard_a;
62  uint32_t discard_d;
63  long index;
64 
65  /* Zero result */
66  memset ( result, 0, sizeof ( *result ) );
67 
68  /* Multiply integers one element at a time */
69  for ( i = 0 ; i < multiplicand_size ; i++ ) {
70  multiplicand_element = multiplicand->element[i];
71  for ( j = 0 ; j < multiplier_size ; j++ ) {
72  multiplier_element = multiplier->element[j];
73  result_elements = &result->element[ i + j ];
74  /* Perform a single multiply, and add the
75  * resulting double-element into the result,
76  * carrying as necessary. The carry can
77  * never overflow beyond the end of the
78  * result, since:
79  *
80  * a < 2^{n}, b < 2^{m} => ab < 2^{n+m}
81  */
82  __asm__ __volatile__ ( "mull %5\n\t"
83  "addl %%eax, (%6,%2,4)\n\t"
84  "adcl %%edx, 4(%6,%2,4)\n\t"
85  "\n1:\n\t"
86  "adcl $0, 8(%6,%2,4)\n\t"
87  "inc %2\n\t"
88  /* Does not affect CF */
89  "jc 1b\n\t"
90  : "=&a" ( discard_a ),
91  "=&d" ( discard_d ),
92  "=&r" ( index ),
93  "+m" ( *result )
94  : "0" ( multiplicand_element ),
95  "g" ( multiplier_element ),
96  "r" ( result_elements ),
97  "2" ( 0 ) );
98  }
99  }
100 }
#define __attribute__(x)
Definition: compiler.h:10
static const void const void void * result
Definition: crypto.h:335
uint8_t multiplier
Port multiplier number.
Definition: edd.h:32
__asm__ __volatile__("\n1:\n\t" "movb -1(%3,%1), %%al\n\t" "stosb\n\t" "loop 1b\n\t" "xorl %%eax, %%eax\n\t" "mov %4, %1\n\t" "rep stosb\n\t" :"=&D"(discard_D), "=&c"(discard_c), "+m"(*value) :"r"(data), "g"(pad_len), "0"(value0), "1"(len) :"eax")
unsigned int uint32_t
Definition: stdint.h:12
__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")
uint64_t index
Index of the first segment within the content.
Definition: pccrc.h:21
typedef bigint_t(X25519_SIZE) x25519_t
An X25519 unsigned big integer used in internal calculations.
void * memset(void *dest, int character, size_t len) __nonnull

References __asm__(), __attribute__, __volatile__(), bigint_t(), index, memset(), multiplier, and result.

Variable Documentation

◆ size

unsigned int size
Initial value:
{
bigint_t ( size ) __attribute__ (( may_alias )) *value =
( ( void * ) value0 )
static uint32_t * value0
Definition: bigint.h:57
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
static __attribute__((always_inline)) void bigint_init_raw(uint32_t *value0
Initialise big integer.
static unsigned int size
Definition: bigint.h:26
typedef bigint_t(X25519_SIZE) x25519_t
An X25519 unsigned big integer used in internal calculations.

Definition at line 26 of file bigint.h.

◆ data

unsigned int const void* data

Definition at line 26 of file bigint.h.

◆ len

unsigned int size void size_t len
Initial value:
{
bigint_t ( size ) __attribute__ (( may_alias )) *value =
( ( void * ) value0 )
static uint32_t * value0
Definition: bigint.h:57
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
static __attribute__((always_inline)) void bigint_init_raw(uint32_t *value0
Initialise big integer.
static unsigned int size
Definition: bigint.h:26
typedef bigint_t(X25519_SIZE) x25519_t
An X25519 unsigned big integer used in internal calculations.

Definition at line 27 of file bigint.h.

◆ pad_len

long pad_len = ( sizeof ( *value ) - len )

◆ discard_D

void * discard_D

◆ discard_c

long discard_c

◆ value0

static uint32_t * value0

◆ index

unsigned int index = ( bit / ( 8 * sizeof ( value->element[0] ) ) )

Definition at line 61 of file bigint.h.

◆ discard_S

void * discard_S

◆ result

return result

Definition at line 160 of file bigint.h.

◆ reference0

const uint32_t* reference0

Definition at line 180 of file bigint.h.

Referenced by bigint_is_geq_sample().

◆ discard_tmp

long discard_tmp

Definition at line 183 of file bigint.h.

◆ bit

unsigned int unsigned int bit
Initial value:
{
const bigint_t ( size ) __attribute__ (( may_alias )) *value =
( ( const void * ) value0 )
static uint32_t * value0
Definition: bigint.h:57
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
static __attribute__((always_inline)) void bigint_init_raw(uint32_t *value0
Initialise big integer.
static unsigned int size
Definition: bigint.h:26
typedef bigint_t(X25519_SIZE) x25519_t
An X25519 unsigned big integer used in internal calculations.

Definition at line 208 of file bigint.h.

Referenced by _tg3_flag(), _tg3_flag_clear(), _tg3_flag_set(), arbel_bitmask_alloc(), arbel_bitmask_free(), ath5k_hw_bitswap(), b44_wait_bit(), base64_decode(), base64_encode(), bigint_bit_is_set_sample(), bitmap_set(), bitmap_test(), cpuid_exec(), deflate_init(), des_generate(), des_permute(), hermon_bitmask_alloc(), hermon_bitmask_free(), hub_clear_changes(), i2c_recv_bit(), i2c_send_bit(), isqrt(), linda_i2c_write_bit(), mii_bit_xfer(), qib7322_i2c_write_bit(), spi_bit_transfer(), vmbus_signal_monitor(), vxgetlink(), vxsetlink(), x25519_ladder(), and x25519_step().

◆ subindex

unsigned int subindex = ( bit % ( 8 * sizeof ( value->element[0] ) ) )

Definition at line 212 of file bigint.h.

◆ source_size

unsigned int source_size

Definition at line 252 of file bigint.h.

Referenced by bigint_grow_sample(), bigint_shrink_sample(), and efi_load_image_wrapper().

◆ dest0

static unsigned int source_size uint32_t * dest0

Definition at line 252 of file bigint.h.

Referenced by bigint_copy_sample(), bigint_grow_sample(), and bigint_shrink_sample().

◆ dest_size

static unsigned int source_size uint32_t unsigned int dest_size
Initial value:
{
bigint_t ( dest_size ) __attribute__ (( may_alias )) *dest =
( ( void * ) dest0 )
static unsigned int uint32_t unsigned int dest_size
Definition: bigint.h:253
static void * dest
Definition: strings.h:176
static __attribute__((always_inline)) void bigint_init_raw(uint32_t *value0
Initialise big integer.
static unsigned int uint32_t * dest0
Definition: bigint.h:252
typedef bigint_t(X25519_SIZE) x25519_t
An X25519 unsigned big integer used in internal calculations.

Definition at line 253 of file bigint.h.

Referenced by bigint_grow_sample(), and bigint_shrink_sample().

◆ pad_size

long pad_size = ( dest_size - source_size )

Definition at line 256 of file bigint.h.

◆ __unused

unsigned int size __unused

Definition at line 281 of file bigint.h.

◆ out

unsigned int size void* out

Definition at line 306 of file bigint.h.