Botan 3.13.0
Crypto and TLS for C&
ffi_mp.cpp File Reference
#include <botan/ffi.h>
#include <botan/assert.h>
#include <botan/numthry.h>
#include <botan/internal/barrett.h>
#include <botan/internal/divide.h>
#include <botan/internal/ffi_mp.h>
#include <botan/internal/ffi_rng.h>
#include <botan/internal/ffi_util.h>
#include <botan/internal/mem_utils.h>
#include <botan/internal/mod_inv.h>

Go to the source code of this file.

Functions

int botan_mp_add (botan_mp_t result, const botan_mp_t x, const botan_mp_t y)
int botan_mp_add_u32 (botan_mp_t result, const botan_mp_t x, uint32_t y)
int botan_mp_clear (botan_mp_t mp)
int botan_mp_clear_bit (botan_mp_t mp, size_t bit)
int botan_mp_cmp (int *result, const botan_mp_t x_w, const botan_mp_t y_w)
int botan_mp_destroy (botan_mp_t mp)
int botan_mp_div (botan_mp_t quotient, botan_mp_t remainder, const botan_mp_t x, const botan_mp_t y)
int botan_mp_equal (const botan_mp_t x_w, const botan_mp_t y_w)
int botan_mp_flip_sign (botan_mp_t mp)
int botan_mp_from_bin (botan_mp_t mp, const uint8_t bin[], size_t bin_len)
int botan_mp_gcd (botan_mp_t out, const botan_mp_t x, const botan_mp_t y)
int botan_mp_get_bit (const botan_mp_t mp, size_t bit)
int botan_mp_init (botan_mp_t *mp_out)
int botan_mp_is_even (const botan_mp_t mp)
int botan_mp_is_negative (const botan_mp_t mp)
int botan_mp_is_odd (const botan_mp_t mp)
int botan_mp_is_positive (const botan_mp_t mp)
int botan_mp_is_prime (const botan_mp_t mp, botan_rng_t rng, size_t test_prob)
int botan_mp_is_zero (const botan_mp_t mp)
int botan_mp_lshift (botan_mp_t out, const botan_mp_t in, size_t shift)
int botan_mp_mod_inverse (botan_mp_t out, const botan_mp_t in, const botan_mp_t modulus)
int botan_mp_mod_mul (botan_mp_t out, const botan_mp_t x, const botan_mp_t y, const botan_mp_t modulus)
int botan_mp_mul (botan_mp_t result, const botan_mp_t x, const botan_mp_t y)
int botan_mp_num_bits (const botan_mp_t mp, size_t *bits)
int botan_mp_num_bytes (const botan_mp_t mp, size_t *bytes)
int botan_mp_powmod (botan_mp_t out, const botan_mp_t base, const botan_mp_t exponent, const botan_mp_t modulus)
int botan_mp_rand_bits (botan_mp_t rand_out, botan_rng_t rng, size_t bits)
int botan_mp_rand_range (botan_mp_t rand_out, botan_rng_t rng, const botan_mp_t lower, const botan_mp_t upper)
int botan_mp_rshift (botan_mp_t out, const botan_mp_t in, size_t shift)
int botan_mp_set_bit (botan_mp_t mp, size_t bit)
int botan_mp_set_from_int (botan_mp_t mp, int initial_value)
int botan_mp_set_from_mp (botan_mp_t dest, const botan_mp_t source)
int botan_mp_set_from_radix_str (botan_mp_t mp, const char *str, size_t radix)
int botan_mp_set_from_str (botan_mp_t mp, const char *str)
int botan_mp_sub (botan_mp_t result, const botan_mp_t x, const botan_mp_t y)
int botan_mp_sub_u32 (botan_mp_t result, const botan_mp_t x, uint32_t y)
int botan_mp_swap (botan_mp_t x_w, botan_mp_t y_w)
int botan_mp_to_bin (const botan_mp_t mp, uint8_t vec[])
int botan_mp_to_hex (const botan_mp_t mp, char *out)
int botan_mp_to_str (const botan_mp_t mp, uint8_t radix, char *out, size_t *out_len)
int botan_mp_to_uint32 (const botan_mp_t mp, uint32_t *val)
int botan_mp_view_bin (const botan_mp_t mp, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_mp_view_hex (const botan_mp_t mp, botan_view_ctx ctx, botan_view_str_fn view)
int botan_mp_view_str (const botan_mp_t mp, uint8_t radix, botan_view_ctx ctx, botan_view_str_fn view)

Function Documentation

◆ botan_mp_add()

int botan_mp_add ( botan_mp_t result,
botan_mp_t x,
botan_mp_t y )

Set result to x + y

Parameters
resultset to the sum
xthe first addend
ythe second addend
Returns
0 on success, a negative value on failure

Definition at line 161 of file ffi_mp.cpp.

161 {
162 return BOTAN_FFI_VISIT(result, [=](auto& res) {
163 if(result == x) {
164 res += safe_get(y);
165 } else {
166 res = safe_get(x) + safe_get(y);
167 }
168 });
169}
#define BOTAN_FFI_VISIT(obj, lambda)
Definition ffi_util.h:158
T & safe_get(botan_struct< T, M > *p)
Definition ffi_util.h:79

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_add_u32()

int botan_mp_add_u32 ( botan_mp_t result,
botan_mp_t x,
uint32_t y )

Set result to x + y

Parameters
resultset to the sum
xthe first addend
ythe second addend
Returns
0 on success, a negative value on failure

Definition at line 181 of file ffi_mp.cpp.

181 {
182 return BOTAN_FFI_VISIT(result, [=](auto& res) {
183 if(result == x) {
184 res += static_cast<Botan::word>(y);
185 } else {
186 res = safe_get(x) + static_cast<Botan::word>(y);
187 }
188 });
189}
std::conditional_t< HasNative64BitRegisters, std::uint64_t, uint32_t > word
The native machine word, used as the limb type for multiprecision integers.
Definition types.h:131

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_clear()

int botan_mp_clear ( botan_mp_t mp)

Set the MPI to zero

Definition at line 35 of file ffi_mp.cpp.

35 {
36 return BOTAN_FFI_VISIT(mp, [](auto& bn) { bn.clear(); });
37}

References BOTAN_FFI_VISIT.

◆ botan_mp_clear_bit()

int botan_mp_clear_bit ( botan_mp_t n,
size_t bit )

Clear the specified bit

Definition at line 298 of file ffi_mp.cpp.

298 {
299 return BOTAN_FFI_VISIT(mp, [=](auto& n) { n.clear_bit(bit); });
300}

References BOTAN_FFI_VISIT.

◆ botan_mp_cmp()

int botan_mp_cmp ( int * result,
botan_mp_t x,
botan_mp_t y )

Compare two integers

Parameters
resultset to -1 if x < y, 0 if x == y, 1 if x > y
xthe first integer
ythe second integer
Returns
0 on success, a negative value on failure

Definition at line 235 of file ffi_mp.cpp.

235 {
236 if(result == nullptr) {
238 }
239 return BOTAN_FFI_VISIT(x_w, [=](auto& x) { *result = x.cmp(safe_get(y_w)); });
240}
@ BOTAN_FFI_ERROR_NULL_POINTER
Definition ffi.h:131

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_destroy()

int botan_mp_destroy ( botan_mp_t mp)

Destroy (deallocate) an MPI

Returns
0 if success, error if invalid object handle

Definition at line 157 of file ffi_mp.cpp.

157 {
158 return BOTAN_FFI_CHECKED_DELETE(mp);
159}
#define BOTAN_FFI_CHECKED_DELETE(o)
Definition ffi_util.h:188

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_mp_div()

int botan_mp_div ( botan_mp_t quotient,
botan_mp_t remainder,
botan_mp_t x,
botan_mp_t y )

Divide x by y, producing both the quotient and the remainder

Parameters
quotientset to x / y
remainderset to x % y
xthe dividend
ythe divisor, which must not be zero
Returns
0 on success, a negative value on failure

Definition at line 211 of file ffi_mp.cpp.

211 {
212 return BOTAN_FFI_VISIT(quotient, [=](auto& q) {
215 safe_get(remainder) = r;
216 });
217}
void vartime_divide(const BigInt &x, const BigInt &y_arg, BigInt &q_out, BigInt &r_out)
Definition divide.cpp:332

References BOTAN_FFI_VISIT, Botan_FFI::safe_get(), and Botan::vartime_divide().

◆ botan_mp_equal()

int botan_mp_equal ( botan_mp_t x,
botan_mp_t y )

Test if two integers are equal

Parameters
xthe first integer
ythe second integer
Returns
1 if x == y, 0 if x != y, or a negative value on error

Definition at line 219 of file ffi_mp.cpp.

219 {
220 return BOTAN_FFI_VISIT(x_w, [=](const auto& x) -> int { return x == safe_get(y_w); });
221}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_flip_sign()

int botan_mp_flip_sign ( botan_mp_t mp)

Negate the MPI, ie replace it by its additive inverse

Parameters
Big Integer (Low-Level)the integer to negate, modified in place
Returns
0 on success, a negative value on failure

Definition at line 80 of file ffi_mp.cpp.

80 {
81 return BOTAN_FFI_VISIT(mp, [](auto& bn) { bn.flip_sign(); });
82}

References BOTAN_FFI_VISIT.

◆ botan_mp_from_bin()

int botan_mp_from_bin ( botan_mp_t mp,
const uint8_t vec[],
size_t vec_len )

Set an MP to the big-endian binary value

Parameters
Big Integer (Low-Level)the integer to set
vecthe big-endian encoding to decode
vec_lenlength of vec in bytes
Returns
0 on success, a negative value on failure

Definition at line 84 of file ffi_mp.cpp.

84 {
85 if(bin_len > 0 && bin == nullptr) {
87 }
88 return BOTAN_FFI_VISIT(mp, [=](auto& bn) { bn._assign_from_bytes({bin, bin_len}); });
89}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mp_gcd()

int botan_mp_gcd ( botan_mp_t out,
botan_mp_t x,
botan_mp_t y )

Set out to the greatest common divisor of x and y

Parameters
outset to gcd(x, y)
xthe first integer
ythe second integer
Returns
0 on success, a negative value on failure

Definition at line 282 of file ffi_mp.cpp.

282 {
283 return BOTAN_FFI_VISIT(out, [=](auto& o) { o = Botan::gcd(safe_get(x), safe_get(y)); });
284}
BigInt gcd(const BigInt &a, const BigInt &b)
Definition numthry.cpp:220

References BOTAN_FFI_VISIT, Botan::gcd(), and Botan_FFI::safe_get().

◆ botan_mp_get_bit()

int botan_mp_get_bit ( botan_mp_t n,
size_t bit )

Returns 0 if specified bit of n is not set Returns 1 if specified bit of n is set Returns negative number on error

Definition at line 290 of file ffi_mp.cpp.

290 {
291 return BOTAN_FFI_VISIT(mp, [=](const auto& n) -> int { return n.get_bit(bit); });
292}

References BOTAN_FFI_VISIT.

◆ botan_mp_init()

int botan_mp_init ( botan_mp_t * mp)

Initialize an MPI

Definition at line 24 of file ffi_mp.cpp.

24 {
25 return ffi_guard_thunk(__func__, [=]() -> int {
26 if(mp_out == nullptr) {
28 }
29
30 auto mp = std::make_unique<Botan::BigInt>();
31 return ffi_new_object(mp_out, std::move(mp));
32 });
33}
BOTAN_FFI_ERROR ffi_new_object(T *obj, Args &&... args)
Definition ffi_util.h:178
int ffi_guard_thunk(const char *func_name, T thunk)
Definition ffi_util.h:95

References BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_mp_is_even()

int botan_mp_is_even ( botan_mp_t mp)

Return 1 iff mp is even

Parameters
Big Integer (Low-Level)the integer to test
Returns
1 if even, 0 if odd, or a negative value on error

Definition at line 231 of file ffi_mp.cpp.

231 {
232 return BOTAN_FFI_VISIT(mp, [](const auto& bn) -> int { return bn.is_even(); });
233}

References BOTAN_FFI_VISIT.

◆ botan_mp_is_negative()

int botan_mp_is_negative ( botan_mp_t mp)

Return 1 iff mp is less than 0

Definition at line 72 of file ffi_mp.cpp.

72 {
73 return BOTAN_FFI_VISIT(mp, [](const auto& bn) { return bn.signum() < 0 ? 1 : 0; });
74}

References BOTAN_FFI_VISIT.

◆ botan_mp_is_odd()

int botan_mp_is_odd ( botan_mp_t mp)

Return 1 iff mp is odd

Parameters
Big Integer (Low-Level)the integer to test
Returns
1 if odd, 0 if even, or a negative value on error

Definition at line 227 of file ffi_mp.cpp.

227 {
228 return BOTAN_FFI_VISIT(mp, [](const auto& bn) -> int { return bn.is_odd(); });
229}

References BOTAN_FFI_VISIT.

◆ botan_mp_is_positive()

int botan_mp_is_positive ( botan_mp_t mp)

This function should have been named mp_is_non_negative. Returns 1 iff mp is greater than or equal to zero. Use botan_mp_is_negative to detect negative numbers, botan_mp_is_zero to check for zero.

Definition at line 76 of file ffi_mp.cpp.

76 {
77 return BOTAN_FFI_VISIT(mp, [](const auto& bn) { return bn.signum() >= 0 ? 1 : 0; });
78}

References BOTAN_FFI_VISIT.

◆ botan_mp_is_prime()

int botan_mp_is_prime ( botan_mp_t n,
botan_rng_t rng,
size_t test_prob )

Returns 0 if n is not prime Returns 1 if n is prime Returns negative number on error

Definition at line 286 of file ffi_mp.cpp.

286 {
287 return BOTAN_FFI_VISIT(mp, [=](const auto& n) { return (Botan::is_prime(n, safe_get(rng), test_prob)) ? 1 : 0; });
288}
bool is_prime(const BigInt &n, RandomNumberGenerator &rng, size_t prob, bool is_random)
Definition numthry.cpp:381

References BOTAN_FFI_VISIT, Botan::is_prime(), and Botan_FFI::safe_get().

◆ botan_mp_is_zero()

int botan_mp_is_zero ( botan_mp_t mp)

Return 1 iff mp is equal to zero

Parameters
Big Integer (Low-Level)the integer to test
Returns
1 if zero, 0 if not, or a negative value on error

Definition at line 223 of file ffi_mp.cpp.

223 {
224 return BOTAN_FFI_VISIT(mp, [](const auto& bn) -> int { return bn.is_zero(); });
225}

References BOTAN_FFI_VISIT.

◆ botan_mp_lshift()

int botan_mp_lshift ( botan_mp_t out,
botan_mp_t in,
size_t shift )

Set out to in shifted left by the specified number of bits

Parameters
outset to the shifted value
inthe integer to shift
shiftthe number of bits to shift by
Returns
0 on success, a negative value on failure

Definition at line 252 of file ffi_mp.cpp.

252 {
253 return BOTAN_FFI_VISIT(out, [=](auto& o) { o = safe_get(in) << shift; });
254}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_mod_inverse()

int botan_mp_mod_inverse ( botan_mp_t out,
botan_mp_t in,
botan_mp_t modulus )

Set out to the inverse of in modulo the specified modulus. If no inverse exists, out is set to zero.

Parameters
outset to the modular inverse
inthe value to invert
modulusthe modulus
Returns
0 on success, a negative value on failure

Definition at line 260 of file ffi_mp.cpp.

260 {
261 return BOTAN_FFI_VISIT(out, [=](auto& o) {
263 });
264}
static BigInt zero()
Definition bigint.h:50
std::optional< BigInt > inverse_mod_general(const BigInt &x, const BigInt &mod)
Definition mod_inv.cpp:179

References BOTAN_FFI_VISIT, Botan::inverse_mod_general(), Botan_FFI::safe_get(), and Botan::BigInt::zero().

◆ botan_mp_mod_mul()

int botan_mp_mod_mul ( botan_mp_t result,
botan_mp_t x,
botan_mp_t y,
botan_mp_t mod )

Set result to (x * y) % mod

Parameters
resultset to the modular product
xthe first factor
ythe second factor
modthe modulus, which must be positive
Returns
0 on success, a negative value on failure

Definition at line 266 of file ffi_mp.cpp.

266 {
267 return BOTAN_FFI_VISIT(out, [=](auto& o) {
269 o = reducer.multiply(safe_get(x), safe_get(y));
270 });
271}
static Barrett_Reduction for_secret_modulus(const BigInt &m)
Definition barrett.cpp:23

References BOTAN_FFI_VISIT, Botan::Barrett_Reduction::for_secret_modulus(), and Botan_FFI::safe_get().

◆ botan_mp_mul()

int botan_mp_mul ( botan_mp_t result,
botan_mp_t x,
botan_mp_t y )

Set result to x * y

Parameters
resultset to the product
xthe first factor
ythe second factor
Returns
0 on success, a negative value on failure

Definition at line 201 of file ffi_mp.cpp.

201 {
202 return BOTAN_FFI_VISIT(result, [=](auto& res) {
203 if(result == x) {
204 res *= safe_get(y);
205 } else {
206 res = safe_get(x) * safe_get(y);
207 }
208 });
209}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_num_bits()

int botan_mp_num_bits ( botan_mp_t n,
size_t * bits )

Return the number of significant bits in the MPI

Definition at line 302 of file ffi_mp.cpp.

302 {
303 if(bits == nullptr) {
305 }
306 return BOTAN_FFI_VISIT(mp, [=](const auto& n) { *bits = n.bits(); });
307}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mp_num_bytes()

int botan_mp_num_bytes ( botan_mp_t n,
size_t * bytes )

Return the number of significant bytes in the MPI

Definition at line 309 of file ffi_mp.cpp.

309 {
310 if(bytes == nullptr) {
312 }
313 return BOTAN_FFI_VISIT(mp, [=](const auto& n) { *bytes = n.bytes(); });
314}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mp_powmod()

int botan_mp_powmod ( botan_mp_t out,
botan_mp_t base,
botan_mp_t exponent,
botan_mp_t modulus )

Set out to (base^exponent) % modulus

Parameters
outset to the result of the modular exponentiation
Base Typesthe base
exponentthe exponent
modulusthe modulus, which must be positive
Returns
0 on success, a negative value on failure

Definition at line 247 of file ffi_mp.cpp.

247 {
248 return BOTAN_FFI_VISIT(
249 out, [=](auto& o) { o = Botan::power_mod(safe_get(base), safe_get(exponent), safe_get(modulus)); });
250}
BigInt power_mod(const BigInt &base, const BigInt &exp, const BigInt &mod)
Definition numthry.cpp:310

References BOTAN_FFI_VISIT, Botan::power_mod(), and Botan_FFI::safe_get().

◆ botan_mp_rand_bits()

int botan_mp_rand_bits ( botan_mp_t rand_out,
botan_rng_t rng,
size_t bits )

Set rand_out to a random integer of the specified bit length

Parameters
rand_outset to the random integer
Random Number Generatorsa random number generator
bitsthe desired bit length
Returns
0 on success, a negative value on failure

Definition at line 273 of file ffi_mp.cpp.

273 {
274 return BOTAN_FFI_VISIT(rng, [=](auto& r) { safe_get(rand_out).randomize(r, bits); });
275}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_rand_range()

int botan_mp_rand_range ( botan_mp_t rand_out,
botan_rng_t rng,
botan_mp_t lower_bound,
botan_mp_t upper_bound )

Set rand_out to a random integer within the half-open range [lower_bound, upper_bound)

Parameters
rand_outset to the random integer
Random Number Generatorsa random number generator
lower_boundthe inclusive lower bound
upper_boundthe exclusive upper bound
Returns
0 on success, a negative value on failure

Definition at line 277 of file ffi_mp.cpp.

277 {
278 return BOTAN_FFI_VISIT(
279 rng, [=](auto& r) { safe_get(rand_out) = Botan::BigInt::random_integer(r, safe_get(lower), safe_get(upper)); });
280}
static BigInt random_integer(RandomNumberGenerator &rng, const BigInt &min, const BigInt &max)
Definition big_rand.cpp:44

References BOTAN_FFI_VISIT, Botan::BigInt::random_integer(), and Botan_FFI::safe_get().

◆ botan_mp_rshift()

int botan_mp_rshift ( botan_mp_t out,
botan_mp_t in,
size_t shift )

Set out to in shifted right by the specified number of bits

Parameters
outset to the shifted value
inthe integer to shift
shiftthe number of bits to shift by
Returns
0 on success, a negative value on failure

Definition at line 256 of file ffi_mp.cpp.

256 {
257 return BOTAN_FFI_VISIT(out, [=](auto& o) { o = safe_get(in) >> shift; });
258}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_set_bit()

int botan_mp_set_bit ( botan_mp_t n,
size_t bit )

Set the specified bit

Definition at line 294 of file ffi_mp.cpp.

294 {
295 return BOTAN_FFI_VISIT(mp, [=](auto& n) { n.set_bit(bit); });
296}

References BOTAN_FFI_VISIT.

◆ botan_mp_set_from_int()

int botan_mp_set_from_int ( botan_mp_t mp,
int initial_value )

Set the MPI value from an int

Definition at line 39 of file ffi_mp.cpp.

39 {
40 return BOTAN_FFI_VISIT(mp, [=](auto& bn) { bn = Botan::BigInt::from_s32(initial_value); });
41}
static BigInt from_s32(int32_t n)
Definition bigint.cpp:42

References BOTAN_FFI_VISIT, and Botan::BigInt::from_s32().

◆ botan_mp_set_from_mp()

int botan_mp_set_from_mp ( botan_mp_t dest,
botan_mp_t source )

Set the MPI value from another MP object

Definition at line 68 of file ffi_mp.cpp.

68 {
69 return BOTAN_FFI_VISIT(dest, [=](auto& bn) { bn = safe_get(source); });
70}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_set_from_radix_str()

int botan_mp_set_from_radix_str ( botan_mp_t dest,
const char * str,
size_t radix )

Set the MPI value from a string with arbitrary radix. For arbitrary being 10 or 16.

Definition at line 51 of file ffi_mp.cpp.

51 {
52 if(str == nullptr) {
54 }
55
56 return BOTAN_FFI_VISIT(mp, [=](auto& bn) {
57 if(radix != 10 && radix != 16) {
59 }
60
61 bn = Botan::BigInt::from_radix_digits(std::string_view(str), radix);
62 return BOTAN_FFI_SUCCESS;
63 });
64}
static BigInt from_radix_digits(std::string_view digits, size_t radix)
Definition big_code.cpp:125
@ BOTAN_FFI_ERROR_NOT_IMPLEMENTED
Definition ffi.h:138
@ BOTAN_FFI_SUCCESS
Definition ffi.h:114

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, and Botan::BigInt::from_radix_digits().

◆ botan_mp_set_from_str()

int botan_mp_set_from_str ( botan_mp_t dest,
const char * str )

Set the MPI value from a string

Definition at line 43 of file ffi_mp.cpp.

43 {
44 if(str == nullptr) {
46 }
47
48 return BOTAN_FFI_VISIT(mp, [=](auto& bn) { bn = Botan::BigInt(str); });
49}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mp_sub()

int botan_mp_sub ( botan_mp_t result,
botan_mp_t x,
botan_mp_t y )

Set result to x - y

Parameters
resultset to the difference
xthe minuend
ythe subtrahend
Returns
0 on success, a negative value on failure

Definition at line 171 of file ffi_mp.cpp.

171 {
172 return BOTAN_FFI_VISIT(result, [=](auto& res) {
173 if(result == x) {
174 res -= safe_get(y);
175 } else {
176 res = safe_get(x) - safe_get(y);
177 }
178 });
179}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_sub_u32()

int botan_mp_sub_u32 ( botan_mp_t result,
botan_mp_t x,
uint32_t y )

Set result to x - y

Parameters
resultset to the difference
xthe minuend
ythe subtrahend
Returns
0 on success, a negative value on failure

Definition at line 191 of file ffi_mp.cpp.

191 {
192 return BOTAN_FFI_VISIT(result, [=](auto& res) {
193 if(result == x) {
194 res -= static_cast<Botan::word>(y);
195 } else {
196 res = safe_get(x) - static_cast<Botan::word>(y);
197 }
198 });
199}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_swap()

int botan_mp_swap ( botan_mp_t x,
botan_mp_t y )

Swap the values of two integers

Parameters
xthe first integer
ythe second integer
Returns
0 on success, a negative value on failure

Definition at line 242 of file ffi_mp.cpp.

242 {
243 return BOTAN_FFI_VISIT(x_w, [=](auto& x) { x.swap(safe_get(y_w)); });
244}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_to_bin()

int botan_mp_to_bin ( botan_mp_t mp,
uint8_t vec[] )

Convert the MPI to a big-endian binary string. Writes botan_mp_num_bytes to vec

Note that the sign of the integer is ignored here; only the absolute value is copied

Parameters
Big Integer (Low-Level)the integer to encode
vecoutput buffer of at least botan_mp_num_bytes(mp) bytes
Returns
0 on success, a negative value on failure

Definition at line 136 of file ffi_mp.cpp.

136 {
137 if(vec == nullptr) {
139 }
140 return BOTAN_FFI_VISIT(mp, [=](const auto& bn) { bn.serialize_to(std::span{vec, bn.bytes()}); });
141}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mp_to_hex()

int botan_mp_to_hex ( botan_mp_t mp,
char * out )

Convert the MPI to a hex string. Writes up to botan_mp_num_bytes(mp)*2 + 5 bytes

Prefer botan_mp_view_hex

Definition at line 91 of file ffi_mp.cpp.

91 {
92 if(out == nullptr) {
94 }
95 return BOTAN_FFI_VISIT(mp, [=](const auto& bn) {
96 const std::string hex = bn.to_hex_string();
97
98 // Check that we are about to write no more than the documented upper bound
99 const size_t upper_bound = 2 * bn.bytes() + 5;
100 BOTAN_ASSERT_NOMSG(hex.size() + 1 <= upper_bound);
101 std::memcpy(out, hex.c_str(), 1 + hex.size());
102 });
103}
#define BOTAN_ASSERT_NOMSG(expr)
Definition assert.h:75

References BOTAN_ASSERT_NOMSG, BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mp_to_str()

int botan_mp_to_str ( botan_mp_t mp,
uint8_t radix,
char * out,
size_t * out_len )

Convert the MPI to a string. Currently radix == 10 and radix == 16 are supported.

Definition at line 112 of file ffi_mp.cpp.

112 {
113 return BOTAN_FFI_VISIT(mp, [=](const auto& bn) -> int {
114 if(radix == 0 || radix == 10) {
115 return write_str_output(out, out_len, bn.to_dec_string());
116 } else if(radix == 16) {
117 return write_str_output(out, out_len, bn.to_hex_string());
118 } else {
120 }
121 });
122}
@ BOTAN_FFI_ERROR_BAD_PARAMETER
Definition ffi.h:132
int write_str_output(char out[], size_t *out_len, const std::string &str)
Definition ffi_util.h:271

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_VISIT, and Botan_FFI::write_str_output().

◆ botan_mp_to_uint32()

int botan_mp_to_uint32 ( botan_mp_t mp,
uint32_t * val )

Convert the MPI to a uint32_t, if possible. Fails if MPI is negative or too large.

Parameters
Big Integer (Low-Level)the integer to convert
valset to the value of mp
Returns
0 on success, a negative value on failure

Definition at line 150 of file ffi_mp.cpp.

150 {
151 if(val == nullptr) {
153 }
154 return BOTAN_FFI_VISIT(mp, [=](const auto& bn) { *val = bn.to_u32bit(); });
155}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mp_view_bin()

int botan_mp_view_bin ( botan_mp_t mp,
botan_view_ctx ctx,
botan_view_bin_fn view )

View the big-endian binary string encoding of this integer

Note that the sign of the integer is ignored here; only the absolute value is viewed

Parameters
Big Integer (Low-Level)the integer to encode
ctxan application context passed to the view function
viewthe view callback which receives the encoding
Returns
0 on success, a negative value on failure

Definition at line 143 of file ffi_mp.cpp.

143 {
144 return BOTAN_FFI_VISIT(mp, [=](const auto& bn) {
145 const auto bytes = bn.serialize();
146 return invoke_view_callback(view, ctx, bytes);
147 });
148}
int invoke_view_callback(botan_view_bin_fn view, botan_view_ctx ctx, std::span< const uint8_t > buf)
Definition ffi_util.h:190

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

◆ botan_mp_view_hex()

int botan_mp_view_hex ( botan_mp_t mp,
botan_view_ctx ctx,
botan_view_str_fn view )

View the hex string encoding of the MPI.

Definition at line 105 of file ffi_mp.cpp.

105 {
106 return BOTAN_FFI_VISIT(mp, [=](const auto& bn) -> int {
107 const std::string hex = bn.to_hex_string();
108 return invoke_view_callback(view, ctx, hex);
109 });
110}

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

◆ botan_mp_view_str()

int botan_mp_view_str ( botan_mp_t mp,
uint8_t radix,
botan_view_ctx ctx,
botan_view_str_fn view )

View the MPI as a radix-N integer. Currently only radix 10 and radix 16 are supported

Definition at line 124 of file ffi_mp.cpp.

124 {
125 return BOTAN_FFI_VISIT(mp, [=](const auto& bn) -> int {
126 if(radix == 10) {
127 return invoke_view_callback(view, ctx, bn.to_dec_string());
128 } else if(radix == 16) {
129 return invoke_view_callback(view, ctx, bn.to_hex_string());
130 } else {
132 }
133 });
134}

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().