/****h* silcmath/silcmp.h * * NAME * * silcmp.h * * COPYRIGHT * * Author: Pekka Riikonen * * Copyright (C) 1997 - 2000 Pekka Riikonen * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * ***/ #ifndef SILCMP_H #define SILCMP_H #include "gmp.h" #if 1 /* SILC MP library definitions. We use GNU MP library as default MP library. However, to make possible future changes easier (SILC might have its own MP library in the future) we implement our own MP API with simple macros. */ typedef MP_INT SilcInt; #define silc_mp_abs(a, b) mpz_abs((a), (b)) #define silc_mp_add(a, b, c) mpz_add((a), (b), (c)) #define silc_mp_add_ui(a, b, c) mpz_add_ui((a), (b), (c)) #define silc_mp_and(a, b, c) mpz_and((a), (b), (c)) #define silc_mp_cdiv_q(a, b, c) mpz_cdiv_q((a), (b), (c)) #define silc_mp_cdiv_q_ui(a, b, c) mpz_cdiv_q_ui((a), (b), (c)) #define silc_mp_cdiv_r(a, b, c) mpz_cdiv_r((a), (b), (c)) #define silc_mp_cdiv_r_ui(a, b, c) mpz_cdiv_r_ui((a), (b), (c)) #define silc_mp_cdiv_ui(a, b) mpz_cdiv_ui((a), (b)) #define silc_mp_clear(a) mpz_clear((a)) #define silc_mp_clrbit(a, b) mpz_clrbit((a), (b)) #define silc_mp_cmp(a, b) mpz_cmp((a), (b)) #define silc_mp_cmp_si(a, b) mpz_cmp_si((a), (b)) #define silc_mp_cmp_ui(a, b) mpz_cmp_ui((a), (b)) #define silc_mp_com(a, b) mpz_com((a), (b)) #define silc_mp_divexact(a, b, c) mpz_divexact((a), (b), (c)) #define silc_mp_div(a, b, c) mpz_div((a), (b), (c)) #define silc_mp_div_ui(a, b, c) mpz_div_ui((a), (b), (c)) #define silc_mp_fdiv_ui(a, b) mpz_fdiv_ui((a), (b)) #define silc_mp_fdiv_q(a, b, c) mpz_fdiv_q((a), (b), (c)) #define silc_mp_fdiv_q_2exp(a, b, c) mpz_fdiv_q_2exp((a), (b), (c)) #define silc_mp_fdiv_q_ui(a, b, c) mpz_fdiv_q_ui((a), (b), (c)) #define silc_mp_fdiv_qr(a, b, c, d) mpz_fdiv_qr((a), (b), (c), (d)) #define silc_mp_fdiv_qr_ui(a, b, c, d) mpz_fdiv_qr_ui((a), (b), (c), (d)) #define silc_mp_fdiv_r(a, b, c) mpz_fdiv_r((a), (b), (c)) #define silc_mp_fdiv_r_2exp(a, b, c) mpz_fdiv_r_2exp((a), (b), (c)) #define silc_mp_fdiv_r_ui(a, b, c) mpz_fdiv_r_ui((a), (b), (c)) #define silc_mp_fdiv_ui(a, b) mpz_fdiv_ui((a), (b)) #define silc_mp_gcd(a, b, c) mpz_gcd((a), (b), (c)) #define silc_mp_gcd_ui(a, b, c) mpz_gcd_ui((a), (b), (c)) #define silc_mp_gcdext(a, b, c, d, e) mpz_gcdext((a), (b), (c), (d), (e)) #define silc_mp_get_ui(a) mpz_get_ui((a)) #define silc_mp_init(a) mpz_init((a)) #define silc_mp_init_set(a, b) mpz_init_set((a), (b)) #define silc_mp_init_set_d(a, b) mpz_init_set_d((a), (b)) #define silc_mp_init_set_si(a, b) mpz_init_set_si((a), (b)) #define silc_mp_init_set_str(a, b, c) mpz_init_set_str((a), (b), (c)) #define silc_mp_init_set_ui(a, b) mpz_init_set_ui((a), (b)) #define silc_mp_invert(a, b, c) mpz_invert((a), (b), (c)) #define silc_mp_ior(a, b, c) mpz_ior((a), (b), (c)) #define silc_mp_mod(a, b, c) mpz_mod((a), (b), (c)) #define silc_mp_mod_2exp(a, b, c) mpz_mod_2exp((a), (b), (c)) #define silc_mp_mod_ui(a, b, c) mpz_mod_ui((a), (b), (c)) #define silc_mp_mul(a, b, c) mpz_mul((a), (b), (c)) #define silc_mp_mul_2exp(a, b, c) mpz_mul_2exp((a), (b), (c)) #define silc_mp_mul_ui(a, b, c) mpz_mul_ui((a), (b), (c)) #define silc_mp_neg(a, b) mpz_neg((a), (b)) #define silc_mp_pow_ui(a, b, c) mpz_pow_ui((a), (b), (c)) #define silc_mp_powm(a, b, c, d) mpz_powm((a), (b), (c), (d)) #define silc_mp_powm_ui(a, b, c, d) mpz_powm_ui((a), (b), (c), (d)) #define silc_mp_probab_prime_p(a, b) mpz_probab_prime_p((a), (b)) #define silc_mp_set(a, b) mpz_set((a), (b)) #define silc_mp_set_d(a, b) mpz_set_d((a), (b)) #define silc_mp_set_f(a, b) mpz_set_f((a), (b)) #define silc_mp_set_q(a, b) mpz_set_q((a), (b)) #define silc_mp_set_si(a, b) mpz_set_si((a), (b)) #define silc_mp_set_str(a, b, c) mpz_set_str((a), (b), (c)) #define silc_mp_set_ui(a, b) mpz_set_ui((a), (b)) #define silc_mp_setbit(a, b) mpz_setbit((a), (b)) #define silc_mp_size(a) mpz_size((a)) #define silc_mp_sizeinbase(a, b) mpz_sizeinbase((a), (b)) #define silc_mp_sqrt(a, b) mpz_sqrt((a), (b)) #define silc_mp_sqrtrem(a, b, c) mpz_sqrtrem((a), (b), (c)) #define silc_mp_sub(a, b, c) mpz_sub((a), (b), (c)) #define silc_mp_sub_ui(a, b, c) mpz_sub_ui((a), (b), (c)) #define silc_mp_tdiv_ui(a, b) mpz_tdiv_ui((a), (b)) #define silc_mp_tdiv_q(a, b, c) mpz_tdiv_q((a), (b), (c)) #define silc_mp_tdiv_q_2exp(a, b, c) mpz_tdiv_q_2exp((a), (b), (c)) #define silc_mp_tdiv_q_ui(a, b, c) mpz_tdiv_q_ui((a), (b), (c)) #define silc_mp_tdiv_qr(a, b, c, d) mpz_tdiv_qr((a), (b), (c), (d)) #define silc_mp_tdiv_qr_ui(a, b, c, d) mpz_tdiv_qr_ui((a), (b), (c), (d)) #define silc_mp_tdiv_r(a, b, c) mpz_tdiv_r((a), (b), (c)) #define silc_mp_tdiv_r_2exp(a, b, c) mpz_tdiv_r_2exp((a), (b), (c)) #define silc_mp_tdiv_r_ui(a, b, c) mpz_tdiv_r_ui((a), (b), (c)) #define silc_mp_tdiv_ui(a, b) mpz_tdiv_ui((a), (b)) #define silc_mp_ui_pow_ui(a, b, c) mpz_ui_pow_ui((a), (b), (c)) #define silc_mp_get_str(a, b, c) mpz_get_str((a), (b), (c)) #define silc_mp_out_str(a, b, c) mpz_out_str((a), (b), (c)) #else /* SILC MP Library Interface. This interface defines the arbitrary precision arithmetic routines for SILC. Currently the actual routines are implemented separately, usually by some other MP library. The interface is generic but is mainly intended for crypto usage. This interface is used by SILC routines that needs big numbers, such as RSA implementation, Diffie-Hellman implementation etc. */ /* XXX Move this to implementation specific files */ #define SILC_MP_INT MP_INT /****d* silcmath/SilcMPAPI/SilcMPInt * * NAME * * typedef SILC_MP_INT SilcMPInt; * * DESCRIPTION * * The SILC MP Integer definition. This is the actual MP integer. * The type is defined as SILC_MP_INT as it is implementation specific * and is unknown to the application. * * SOURCE */ typedef SILC_MP_INT SilcMPInt; /***/ /****f* silcmath/SilcMPAPI/silc_mp_alloc * * SYNOPSIS * * void silc_mp_init(SilcMPInt mp); * * DESCRIPTION * * Initializes the SilcMPInt *that is the actual MP Integer. * This must be called before any of the silc_mp_ routines can be * used. The integer is uninitialized with the silc_mp_uninit function. * ***/ void silc_mp_init(SilcMPInt *mp); /****f* silcmath/SilcMPAPI/silc_mp_free * * SYNOPSIS * * void silc_mp_uninit(SilcMPInt *mp); * * DESCRIPTION * * Uninitializes the MP Integer. * ***/ void silc_mp_uninit(SilcMPInt *mp); /****f* silcmath/SilcMPAPI/silc_mp_abs * * SYNOPSIS * * void silc_mp_abs(SilcMPInt *src, SilcMPInt *dst); * * DESCRIPTION * * Assign the absolute value of `src' to `dst'. * ***/ void silc_mp_abs(SilcMPInt *dst, SilcMPInt *src); /****f* silcmath/SilcMPAPI/silc_mp_add * * SYNOPSIS * * void silc_mp_add(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); * * DESCRIPTION * * Add two integers `mp1' and `mp2' and save the result to `dst'. * ***/ void silc_mp_add(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); /****f* silcmath/SilcMPAPI/silc_mp_add_ui * * SYNOPSIS * * void silc_mp_add_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui); * * DESCRIPTION * * Add two integers `mp1' and unsigned word `ui' and save the result * to `dst'. * ***/ void silc_mp_add_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui); /****f* silcmath/SilcMPAPI/silc_mp_and * * SYNOPSIS * * void silc_mp_and(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); * * DESCRIPTION * * Logical and operator. The result is saved to `dst'. * ***/ void silc_mp_and(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); /****f* silcmath/SilcMPAPI/silc_mp_cmp * * SYNOPSIS * * int silc_mp_cmp(SilcMPInt *mp1, SilcMPInt *mp2); * * DESCRIPTION * * Compare `mp1' and `mp2'. Returns posivite, zero, or negative * if `mp1' > `mp2', `mp1' == `mp2', or `mp1' < `mp2', respectively. * ***/ int silc_mp_cmp(SilcMPInt *mp1, SilcMPInt *mp2); /****f* silcmath/SilcMPAPI/silc_mp_cmp_si * * SYNOPSIS * * int silc_mp_cmp_si(SilcMPInt *mp1, int32 si); * * DESCRIPTION * * Compare `mp1' and single word `si'. Returns posivite, zero, or negative * if `mp1' > `si', `mp1' == `si', or `mp1' < `si', respectively. * ***/ int silc_mp_cmp_si(SilcMPInt *mp1, int32 si); /****f* silcmath/SilcMPAPI/silc_mp_cmp_ui * * SYNOPSIS * * int silc_mp_cmp_ui(SilcMPInt *mp1, uint32 ui); * * DESCRIPTION * * Compare `mp1' and unsigned word `ui'. Returns posivite, zero, or * negative if `mp1' > `ui', `mp1' == `ui', or `mp1' < `ui', * respectively. * ***/ int silc_mp_cmp_ui(SilcMPInt *mp1, uint32 ui); /****f* silcmath/SilcMPAPI/silc_mp_div * * SYNOPSIS * * void silc_mp_div(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); * * DESCRIPTION * * Divide the `mp1' and `mp2' and save the result to the `dst'. This * is equivalent to dst = mp1 / mp2; * ***/ void silc_mp_div(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); /****f* silcmath/SilcMPAPI/silc_mp_div_ui * * SYNOPSIS * * void silc_mp_div(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); * * DESCRIPTION * * Divide the `mp1' and unsigned word `ui' and save the result to the * `dst'. This is equivalent to dst = mp1 / ui; * ***/ void silc_mp_div_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui); /****f* silcmath/SilcMPAPI/silc_mp_div_qr * * SYNOPSIS * * void silc_mp_div_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1, * SilcMPInt *mp2); * * DESCRIPTION * * Divide the `mp1' and `mp2' and save the quotient to the `q' and * the remainder to the `r'. This is equivalent to the q = mp1 / mp2, * r = mp1 mod mp2 (or mp1 = mp2 * q + r). If the `q' or `r' is NULL * then the operation is omitted. * ***/ void silc_mp_div_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1, SilcMPInt *mp2); /****f* silcmath/SilcMPAPI/silc_mp_div_2exp * * SYNOPSIS * * void silc_mp_div_2exp(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); * * DESCRIPTION * * Divide the `mp1' with 2 ** `exp' and save the result to `dst'. * This is equivalent to dst = mp1 / (2 ^ exp). * ***/ void silc_mp_div_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp); /****f* silcmath/SilcMPAPI/silc_mp_div_2exp * * SYNOPSIS * * void silc_mp_div_2exp(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); * * DESCRIPTION * * Divide the `mp1' with 2 ** `exp' and save the quotient to `q' and * the remainder to `r'. This is equivalent to q = mp1 / (2 ^ exp), * r = mp1 mod (2 ^ exp). If the `q' or `r' is NULL then the operation * is omitted. * ***/ void silc_mp_div_2exp_qr(SilcMPInt *q, SilcMPInt *r, SilcMPInt *mp1, uint32 exp); /****f* silcmath/SilcMPAPI/silc_mp_gcd * * SYNOPSIS * * void silc_mp_gcd(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); * * DESCRIPTION * * Calculate the greatest common divisor of the integers `mp1' and `mp2' * and save the result to `dst'. * ***/ void silc_mp_gcd(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); /****f* silcmath/SilcMPAPI/silc_mp_gcdext * * SYNOPSIS * * void silc_mp_gcdext(SilcMPInt *g, SilcMPInt *s, SilcMPInt *t, SilcMPInt *mp1, * SilcMPInt *mp2); * * DESCRIPTION * * Calculate the extended greatest common divisor `g', `s' and `t' such * that g = mp1 * s + mp2 * + t. * ***/ void silc_mp_gcdext(SilcMPInt *g, SilcMPInt *s, SilcMPInt *t, SilcMPInt *mp1, SilcMPInt *mp2); /****f* silcmath/SilcMPAPI/silc_mp_get_ui * * SYNOPSIS * * uint32 silc_mp_get_ui(SilcMPInt *mp); * * DESCRIPTION * * Returns the least significant unsigned word from `mp'. * ***/ uint32 silc_mp_get_ui(SilcMPInt *mp); /****f* silcmath/SilcMPAPI/silc_mp_get_str * * SYNOPSIS * * void silc_mp_get_str(char *str, SilcMPInt *mp, int base); * * DESCRIPTION * * Converts integer `mp' into a string of base `base'. The `str' * must already have space allocated. The function returns the same * as `str' or NULL on error. * ***/ char *silc_mp_get_str(char *str, SilcMPInt *mp, int base); /****f* silcmath/SilcMPAPI/silc_mp_or * * SYNOPSIS * * void silc_mp_or(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); * * DESCRIPTION * * Logical inclusive OR operator. The result is saved to `dst'. * ***/ void silc_mp_or(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); /****f* silcmath/SilcMPAPI/silc_mp_mod * * SYNOPSIS * * void silc_mp_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); * * DESCRIPTION * * Mathematical MOD function. Produces the remainder of `mp1' and `mp2' * and saves the result to `dst'. This is equivalent to dst = mp1 mod mp2. * The same result can also be get with silc_mp_div_qr as that function * returns the remainder as well. * ***/ void silc_mp_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); /****f* silcmath/SilcMPAPI/silc_mp_mod_ui * * SYNOPSIS * * void silc_mp_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui); * * DESCRIPTION * * Mathematical MOD function. Produces the remainder of `mp1' and * unsigned word `ui' and saves the result to `dst'. This is equivalent * to dst = mp1 mod ui. * ***/ void silc_mp_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui); /****f* silcmath/SilcMPAPI/silc_mp_mod_2exp * * SYNOPSIS * * void silc_mp_mod_2exp(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); * * DESCRIPTION * * Computes the remainder of `mp1' with 2 ** `exp' and saves the * result to `dst'. This is equivalent to dst = mp1 mod (2 ^ exp). * The same result can also be get with silc_mp_div_2exp_qr as that * function returns the remainder as well. * ***/ void silc_mp_mod_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui); /****f* silcmath/SilcMPAPI/silc_mp_mul * * SYNOPSIS * * void silc_mp_mul(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); * * DESCRIPTION * * Multiply two integers `mp1' and `mp2' and save the result to `dst'. * ***/ void silc_mp_mul(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); /****f* silcmath/SilcMPAPI/silc_mp_mul_ui * * SYNOPSIS * * void silc_mp_mul(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); * * DESCRIPTION * * Multiply integer `mp1' and unsigned word `ui' and save the result * to `dst'. * ***/ void silc_mp_mul_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui); /****f* silcmath/SilcMPAPI/silc_mp_mul_2exp * * SYNOPSIS * * void silc_mp_mul_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp); * * DESCRIPTION * * Multiply integers `mp1' with 2 ** `exp' and save the result to * `dst'. This is equivalent to dst = mp1 * (2 ^ exp). * ***/ void silc_mp_mul_2exp(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp); /****f* silcmath/SilcMPAPI/silc_mp_neg * * SYNOPSIS * * void silc_mp_neg(SilcMPInt *dst, SilcMPInt *src); * * DESCRIPTION * * Negate `src' and save the result to `dst'. * ***/ void silc_mp_neg(SilcMPInt *dst, SilcMPInt *src); /****f* silcmath/SilcMPAPI/silc_mp_pow * * SYNOPSIS * * void silc_mp_pow(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp); * * DESCRIPTION * * Compute `mp1' ** `exp' and save the result to `dst'. This is * equivalent to dst = mp1 ^ exp. * ***/ void silc_mp_pow(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp); /****f* silcmath/SilcMPAPI/silc_mp_pow_ui * * SYNOPSIS * * void silc_mp_pow_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp); * * DESCRIPTION * * Compute `mp1' ** `exp' and save the result to `dst'. This is * equivalent to dst = mp1 ^ exp. * ***/ void silc_mp_pow_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp); /****f* silcmath/SilcMPAPI/silc_mp_pow_mod * * SYNOPSIS * * void silc_mp_pow_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp, * SilcMPInt *mod); * * DESCRIPTION * * Compute (`mp1' ** `exp') mod `mod' and save the result to `dst'. * This is equivalent to dst = (mp1 ^ exp) mod mod. * ***/ void silc_mp_pow_mod(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *exp, SilcMPInt *mod); /****f* silcmath/SilcMPAPI/silc_mp_pow_mod_ui * * SYNOPSIS * * void silc_mp_pow_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp, * SilcMPInt *mod); * * DESCRIPTION * * Compute (`mp1' ** `exp') mod `mod' and save the result to `dst'. * This is equivalent to dst = (mp1 ^ exp) mod mod. * ***/ void silc_mp_pow_mod_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 exp, SilcMPInt *mod); /****f* silcmath/SilcMPAPI/silc_mp_modinv * * SYNOPSIS * * void silc_mp_modinv(SilcMPInt *inv, SilcMPInt *a, SilcMPInt *n); * * DESCRIPTION * * Find multiplicative inverse using Euclid's extended algorithm. * Computes inverse such that a * inv mod n = 1, where 0 < a < n. * Algorithm goes like this: * * g(0) = n v(0) = 0 * g(1) = a v(1) = 1 * * y = g(i-1) / g(i) * g(i+1) = g(i-1) - y * g(i) = g(i)-1 mod g(i) * v(i+1) = v(i-1) - y * v(i) * * do until g(i) = 0, then inverse = v(i-1). If inverse is negative then n, * is added to inverse making it positive again. (Sometimes the algorithm * has a variable u defined too and it behaves just like v, except that * initalize values are swapped (i.e. u(0) = 1, u(1) = 0). However, u is * not needed by the algorithm so it does not have to be included.) * ***/ void silc_mp_modinv(SilcMPInt *inv, SilcMPInt *a, SilcMPInt *n); /****f* silcmath/SilcMPAPI/silc_mp_mp2bin * * SYNOPSIS * * unsigned char *silc_mp_mp2bin(SilcMPInt *val, uint32 len, * uint32 *ret_len); * * DESCRIPTION * * Encodes MP integer into binary data. Returns allocated data that * must be free'd by the caller. If `len' is provided the destination * buffer is allocated that large. If zero then the size is approximated. * ***/ unsigned char *silc_mp_mp2bin(SilcMPInt *val, uint32 len, uint32 *ret_len); /****f* silcmath/SilcMPAPI/silc_mp_mp2bin_noalloc * * SYNOPSIS * * void silc_mp_mp2bin_noalloc(SilcMPInt val, unsigned char *dst, * uint32 dst_len); * * DESCRIPTION * * Same as silc_mp_mp2bin but does not allocate any memory. The * encoded data is returned into `dst' and it's length to the `ret_len'. * ***/ void silc_mp_mp2bin_noalloc(SilcMPInt val, unsigned char *dst, uint32 dst_len); /****f* silcmath/SilcMPAPI/silc_mp_bin2mp * * SYNOPSIS * * void silc_mp_bin2mp(unsigned char *data, uint32 len, SilcMPInt *ret); * * DESCRIPTION * * Decodes binary data into MP integer. The integer sent as argument * must be initialized. * ***/ void silc_mp_bin2mp(unsigned char *data, uint32 len, SilcMPInt *ret); /****f* silcmath/SilcMPAPI/silc_mp_set * * SYNOPSIS * * void silc_mp_set(SilcMPInt *dst, SilcMPInt *src); * * DESCRIPTION * * Set `dst' integer from `src' integer. * ***/ void silc_mp_set(SilcMPInt *dst, SilcMPInt *src); void silc_mp_set_ui(SilcMPInt *dst, uint32 ui); void silc_mp_set_ui64(SilcMPInt *dst, uint64 ui); void silc_mp_set_si(SilcMPInt *dst, uint32 ui); void silc_mp_set_si64(SilcMPInt *dst, uint64 ui); void silc_mp_set_str(SilcMPInt *dst, const char *str, int base); size_t silc_mp_size(SilcMPInt *mp); size_t silc_mp_sizeinbase(SilcMPInt *mp, int base); void silc_mp_sqrt(SilcMPInt *dst, SilcMPInt *src); void silc_mp_sub(SilcMPInt *dst, SilcMPInt *mp1, SilcMPInt *mp2); void silc_mp_sub_ui(SilcMPInt *dst, SilcMPInt *mp1, uint32 ui); #endif /* 1 */ #endif