XenevaOS
Loading...
Searching...
No Matches
bignum_core.h
Go to the documentation of this file.
1
63/*
64 * Copyright The Mbed TLS Contributors
65 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
66 */
67
68#ifndef MBEDTLS_BIGNUM_CORE_H
69#define MBEDTLS_BIGNUM_CORE_H
70
71#include "common.h"
72
73#include "mbedtls/bignum.h"
74
76
77#define ciL (sizeof(mbedtls_mpi_uint))
78#define biL (ciL << 3)
79#define biH (ciL << 2)
81/*
82 * Convert between bits/chars and number of limbs
83 * Divide first in order to avoid potential overflows
84 */
85#define BITS_TO_LIMBS(i) ((i) / biL + ((i) % biL != 0))
86#define CHARS_TO_LIMBS(i) ((i) / ciL + ((i) % ciL != 0))
87/* Get a specific byte, without range checks. */
88#define GET_BYTE(X, i) \
89 (((X)[(i) / ciL] >> (((i) % ciL) * 8)) & 0xff)
90
91/* Constants to identify whether a value is public or secret. If a parameter is marked as secret by
92 * this constant, the function must be constant time with respect to the parameter.
93 *
94 * This is only needed for functions with the _optionally_safe postfix. All other functions have
95 * fixed behavior that can't be changed at runtime and are constant time with respect to their
96 * parameters as prescribed by their documentation or by conventions in their module's documentation.
97 *
98 * Parameters should be named X_public where X is the name of the
99 * corresponding input parameter.
100 *
101 * Implementation should always check using
102 * if (X_public == MBEDTLS_MPI_IS_PUBLIC) {
103 * // unsafe path
104 * } else {
105 * // safe path
106 * }
107 * not the other way round, in order to prevent misuse. (That is, if a value
108 * other than the two below is passed, default to the safe path.)
109 *
110 * The value of MBEDTLS_MPI_IS_PUBLIC is chosen in a way that is unlikely to happen by accident, but
111 * which can be used as an immediate value in a Thumb2 comparison (for code size). */
112#define MBEDTLS_MPI_IS_PUBLIC 0x2a2a2a2a
113#define MBEDTLS_MPI_IS_SECRET 0
114#if defined(MBEDTLS_TEST_HOOKS) && !defined(MBEDTLS_THREADING_C)
115// Default value for testing that is neither MBEDTLS_MPI_IS_PUBLIC nor MBEDTLS_MPI_IS_SECRET
116#define MBEDTLS_MPI_IS_TEST 1
117#endif
118
129
140size_t mbedtls_mpi_core_bitlen(const mbedtls_mpi_uint *A, size_t A_limbs);
141
149 size_t A_limbs);
150
164 const mbedtls_mpi_uint *A,
165 size_t A_limbs);
166
182 const mbedtls_mpi_uint *B,
183 size_t limbs);
184
203 const mbedtls_mpi_uint *A,
204 size_t limbs,
206
224 size_t limbs,
226
242 size_t X_limbs,
243 const unsigned char *input,
244 size_t input_length);
245
264 size_t X_limbs,
265 const unsigned char *input,
266 size_t input_length);
267
284 size_t A_limbs,
285 unsigned char *output,
286 size_t output_length);
287
304 size_t A_limbs,
305 unsigned char *output,
306 size_t output_length);
307
321 size_t count);
322
336 size_t count);
337
356 const mbedtls_mpi_uint *A,
357 const mbedtls_mpi_uint *B,
358 size_t limbs);
359
391 const mbedtls_mpi_uint *A,
392 size_t limbs,
393 unsigned cond);
394
414 const mbedtls_mpi_uint *A,
415 const mbedtls_mpi_uint *B,
416 size_t limbs);
417
440 const mbedtls_mpi_uint *A, size_t A_limbs,
442
460 const mbedtls_mpi_uint *A, size_t A_limbs,
461 const mbedtls_mpi_uint *B, size_t B_limbs);
462
473
510 const mbedtls_mpi_uint *A,
511 const mbedtls_mpi_uint *B, size_t B_limbs,
512 const mbedtls_mpi_uint *N, size_t AN_limbs,
514
531 const mbedtls_mpi *N);
532
533#if defined(MBEDTLS_TEST_HOOKS)
546void mbedtls_mpi_core_ct_uint_table_lookup(mbedtls_mpi_uint *dest,
547 const mbedtls_mpi_uint *table,
548 size_t limbs,
549 size_t count,
550 size_t index);
551#endif /* MBEDTLS_TEST_HOOKS */
552
573 size_t bytes,
574 int (*f_rng)(void *, unsigned char *, size_t),
575 void *p_rng);
576
609 const mbedtls_mpi_uint *N,
610 size_t limbs,
611 int (*f_rng)(void *, unsigned char *, size_t),
612 void *p_rng);
613
631size_t mbedtls_mpi_core_exp_mod_working_limbs(size_t AN_limbs, size_t E_limbs);
632
663 const mbedtls_mpi_uint *A,
664 const mbedtls_mpi_uint *N, size_t AN_limbs,
665 const mbedtls_mpi_uint *E, size_t E_limbs,
666 const mbedtls_mpi_uint *RR,
668
697 const mbedtls_mpi_uint *A,
698 const mbedtls_mpi_uint *N, size_t AN_limbs,
699 const mbedtls_mpi_uint *E, size_t E_limbs,
700 const mbedtls_mpi_uint *RR,
702
716 const mbedtls_mpi_uint *A,
718 size_t limbs);
719
731 size_t limbs);
732
745static inline size_t mbedtls_mpi_core_montmul_working_limbs(size_t AN_limbs)
746{
747 return 2 * AN_limbs + 1;
748}
749
782 const mbedtls_mpi_uint *A,
783 const mbedtls_mpi_uint *N,
784 size_t AN_limbs,
786 const mbedtls_mpi_uint *rr,
788
819 const mbedtls_mpi_uint *A,
820 const mbedtls_mpi_uint *N,
821 size_t AN_limbs,
824
825#endif /* MBEDTLS_BIGNUM_CORE_H */
#define index(str, chr)
Definition string.h:66
#define X(a)
size_t a
Definition main.cpp:156
size_t b
Definition main.cpp:156
Multi-precision integer library.
uint32_t mbedtls_mpi_uint
The type of machine digits in a bignum, called limbs.
Definition bignum.h:170
void mbedtls_mpi_core_to_mont_rep(mbedtls_mpi_uint *X, const mbedtls_mpi_uint *A, const mbedtls_mpi_uint *N, size_t AN_limbs, mbedtls_mpi_uint mm, const mbedtls_mpi_uint *rr, mbedtls_mpi_uint *T)
mbedtls_mpi_uint mbedtls_mpi_core_mla(mbedtls_mpi_uint *X, size_t X_limbs, const mbedtls_mpi_uint *A, size_t A_limbs, mbedtls_mpi_uint b)
Perform a fixed-size multiply accumulate operation: X += b * A.
int mbedtls_mpi_core_write_be(const mbedtls_mpi_uint *A, size_t A_limbs, unsigned char *output, size_t output_length)
void mbedtls_mpi_core_shift_r(mbedtls_mpi_uint *X, size_t limbs, size_t count)
Shift an MPI in-place right by a number of bits.
mbedtls_ct_condition_t mbedtls_mpi_core_lt_ct(const mbedtls_mpi_uint *A, const mbedtls_mpi_uint *B, size_t limbs)
Check if one unsigned MPI is less than another in constant time.
mbedtls_mpi_uint mbedtls_mpi_core_sub(mbedtls_mpi_uint *X, const mbedtls_mpi_uint *A, const mbedtls_mpi_uint *B, size_t limbs)
Subtract two fixed-size large unsigned integers, returning the borrow.
void mbedtls_mpi_core_bigendian_to_host(mbedtls_mpi_uint *A, size_t A_limbs)
mbedtls_ct_condition_t mbedtls_mpi_core_check_zero_ct(const mbedtls_mpi_uint *A, size_t limbs)
Determine if a given MPI has the value 0 in constant time with respect to the value (but not with res...
void mbedtls_mpi_core_from_mont_rep(mbedtls_mpi_uint *X, const mbedtls_mpi_uint *A, const mbedtls_mpi_uint *N, size_t AN_limbs, mbedtls_mpi_uint mm, mbedtls_mpi_uint *T)
mbedtls_mpi_uint mbedtls_mpi_core_add_if(mbedtls_mpi_uint *X, const mbedtls_mpi_uint *A, size_t limbs, unsigned cond)
Conditional addition of two fixed-size large unsigned integers, returning the carry.
int mbedtls_mpi_core_read_be(mbedtls_mpi_uint *X, size_t X_limbs, const unsigned char *input, size_t input_length)
void mbedtls_mpi_core_exp_mod(mbedtls_mpi_uint *X, const mbedtls_mpi_uint *A, const mbedtls_mpi_uint *N, size_t AN_limbs, const mbedtls_mpi_uint *E, size_t E_limbs, const mbedtls_mpi_uint *RR, mbedtls_mpi_uint *T)
Perform a modular exponentiation with secret exponent: X = A^E mod N, where A is already in Montgomer...
mbedtls_mpi_uint mbedtls_mpi_core_add(mbedtls_mpi_uint *X, const mbedtls_mpi_uint *A, const mbedtls_mpi_uint *B, size_t limbs)
Add two fixed-size large unsigned integers, returning the carry.
void mbedtls_mpi_core_exp_mod_unsafe(mbedtls_mpi_uint *X, const mbedtls_mpi_uint *A, const mbedtls_mpi_uint *N, size_t AN_limbs, const mbedtls_mpi_uint *E, size_t E_limbs, const mbedtls_mpi_uint *RR, mbedtls_mpi_uint *T)
Perform a modular exponentiation with public or secret exponent: X = A^E mod N, where A is already in...
void mbedtls_mpi_core_mul(mbedtls_mpi_uint *X, const mbedtls_mpi_uint *A, size_t A_limbs, const mbedtls_mpi_uint *B, size_t B_limbs)
Perform a known-size multiplication.
void mbedtls_mpi_core_cond_swap(mbedtls_mpi_uint *X, mbedtls_mpi_uint *Y, size_t limbs, mbedtls_ct_condition_t swap)
Perform a safe conditional swap of two MPIs which doesn't reveal whether the swap was done or not.
int mbedtls_mpi_core_get_mont_r2_unsafe(mbedtls_mpi *X, const mbedtls_mpi *N)
Calculate the square of the Montgomery constant. (Needed for conversion and operations in Montgomery ...
void mbedtls_mpi_core_shift_l(mbedtls_mpi_uint *X, size_t limbs, size_t count)
Shift an MPI in-place left by a number of bits.
void mbedtls_mpi_core_cond_assign(mbedtls_mpi_uint *X, const mbedtls_mpi_uint *A, size_t limbs, mbedtls_ct_condition_t assign)
Perform a safe conditional copy of an MPI which doesn't reveal whether assignment was done or not.
mbedtls_mpi_uint mbedtls_mpi_core_sub_int(mbedtls_mpi_uint *X, const mbedtls_mpi_uint *A, mbedtls_mpi_uint b, size_t limbs)
Subtract unsigned integer from known-size large unsigned integers. Return the borrow.
int mbedtls_mpi_core_read_le(mbedtls_mpi_uint *X, size_t X_limbs, const unsigned char *input, size_t input_length)
size_t mbedtls_mpi_core_clz(mbedtls_mpi_uint a)
int mbedtls_mpi_core_write_le(const mbedtls_mpi_uint *A, size_t A_limbs, unsigned char *output, size_t output_length)
size_t mbedtls_mpi_core_bitlen(const mbedtls_mpi_uint *A, size_t A_limbs)
int mbedtls_mpi_core_fill_random(mbedtls_mpi_uint *X, size_t X_limbs, size_t bytes, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
Fill an integer with a number of random bytes.
void mbedtls_mpi_core_montmul(mbedtls_mpi_uint *X, const mbedtls_mpi_uint *A, const mbedtls_mpi_uint *B, size_t B_limbs, const mbedtls_mpi_uint *N, size_t AN_limbs, mbedtls_mpi_uint mm, mbedtls_mpi_uint *T)
Montgomery multiplication: X = A * B * R^-1 mod N (HAC 14.36)
mbedtls_mpi_uint mbedtls_mpi_core_montmul_init(const mbedtls_mpi_uint *N)
Calculate initialisation value for fast Montgomery modular multiplication.
mbedtls_ct_condition_t mbedtls_mpi_core_uint_le_mpi(mbedtls_mpi_uint min, const mbedtls_mpi_uint *A, size_t A_limbs)
Compare a machine integer with an MPI.
size_t mbedtls_mpi_core_exp_mod_working_limbs(size_t AN_limbs, size_t E_limbs)
Returns the number of limbs of working memory required for a call to mbedtls_mpi_core_exp_mod().
int mbedtls_mpi_core_random(mbedtls_mpi_uint *X, mbedtls_mpi_uint min, const mbedtls_mpi_uint *N, size_t limbs, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
uint32_t * table
Definition codec_8859.c:24
Utility macros for internal use in the library.
size_t mbedtls_ct_condition_t
Definition constant_time_internal.h:67
@ B
Definition element-type.h:28
@ A
Definition element-type.h:28
#define swap(a, b)
Definition minmax.h:73
#define min(a, b)
Definition minmax.h:24
MPI structure.
Definition bignum.h:208
struct VirtioInputEvent * input
Definition virtiokbd.c:46