diff options
Diffstat (limited to 'lib/libmpa/include/mpalib.h')
-rw-r--r-- | lib/libmpa/include/mpalib.h | 432 |
1 files changed, 432 insertions, 0 deletions
diff --git a/lib/libmpa/include/mpalib.h b/lib/libmpa/include/mpalib.h new file mode 100644 index 0000000..a467e39 --- /dev/null +++ b/lib/libmpa/include/mpalib.h @@ -0,0 +1,432 @@ +/* + * Copyright (c) 2014, STMicroelectronics International N.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef GUARD_MPALIB_H +#define GUARD_MPALIB_H + +/************************************************************* + * + * How functions are exported. + * + *************************************************************/ +#define MPALIB_EXPORT + +/************************************************************* + * + * Include common configuration definitions + * + *************************************************************/ +#include "mpalib_config.h" + +/************************************************************* + * + * TYPE DEFINITIONS + * + *************************************************************/ + +#if defined(MPA_SUPPORT_DWORD_T) +typedef unsigned long long mpa_dword_t; +#endif + +/*! \struct mpa_numbase_struct + * The internal representation of a multi precision integer. + * + * \param alloc The size of the allocated array d in number of mpa_word_t. + * + * \param size The number of used words in *d to represent the number, or + * minus the number if the mpa_numbase is representing a + * negative number. The mpa_numbase + * is representing zero if and only if size == 0. + * + * \param d The digits of the integer. The digits are in radix + * 2^WORD_SIZE. + * The digits are stored in a little endian format, i.e. + * the least significant word_t is stored in d[0]. + * + * \internal ** NOTE ** + * If you change this struct, you must update the const variables + * in mpa_misc.c and mpa_primetest.c + * And the + * MPA_NUMBASE_METADATA_SIZE_IN_U32 + * below. + */ +typedef struct mpa_numbase_struct { + mpa_asize_t alloc; + mpa_usize_t size; + mpa_word_t d[]; +} mpa_num_base; + +/*/ mpanum is the type we use as parameters to function calls in this library */ +typedef mpa_num_base *mpanum; + +/*! + * The Context struct for a Montgomery multiplication + * + * \internal ** NOTE ** + * If you change this struct, you must update the + * MPA_FMM_CONTEXT_METADATA_SIZE_IN_U32 + * below. + * + */ +typedef struct mpa_fmm_context_struct { + mpanum r_ptr; + mpanum r2_ptr; + mpa_word_t n_inv; + uint32_t m[]; +} mpa_fmm_context_base; + +typedef mpa_fmm_context_base *mpa_fmm_context; + +struct mpa_scratch_mem_sync; +typedef void (mpa_scratch_mem_sync_fn)(struct mpa_scratch_mem_sync *sync); + +typedef struct mpa_scratch_mem_struct { + uint32_t size; /* size of the memory pool, in bytes */ + uint32_t bn_bits; /* default size of a temporary variables */ + uint32_t last_offset; /* offset to the last one */ + mpa_scratch_mem_sync_fn *get; + mpa_scratch_mem_sync_fn *put; + struct mpa_scratch_mem_sync *sync; + uint32_t m[]; /* mpa_scratch_item are stored there */ +} mpa_scratch_mem_base; +typedef mpa_scratch_mem_base *mpa_scratch_mem; + +struct mpa_scratch_item { + uint32_t size; /* total size of this item */ + /* the offset of the previous and next mpa_scratch_item */ + uint32_t prev_item_offset; + uint32_t next_item_offset; + /* followed by a mpa_num_base, being the big number to save */ +}; + +/************************************************************* + * + * EXPORTED VARIABLES + * + *************************************************************/ + +/************************************************************* + * + * MACROS + * + *************************************************************/ + +#define MPA_STRING_MODE_HEX_UC 16 +#define MPA_STRING_MODE_HEX_LC 17 + +#define MPA_EVEN_PARITY 0 +#define MPA_ODD_PARITY 1 + +/*! Returns true if the mpanum 'a' is even (zero included) */ +#define mpa_is_even(a) (mpa_parity((a)) == MPA_EVEN_PARITY) +/*! Returns true if the mpanum 'a' is odd */ +#define mpa_is_odd(a) (mpa_parity((a)) == MPA_ODD_PARITY) +/* Short hand for setting the value of 'a' to the value of 'b' */ +#define mpa_set(a, b) mpa_copy((a), (b)) + +/* */ +/* Define how to convert between sizes given in uint32_t and mpa_word_t */ +/* */ +#define ASIZE_TO_U32(x) (((sizeof(mpa_word_t) * (x)) + 3) / 4) +#define U32_TO_ASIZE(x) \ + ((mpa_asize_t)(((4 * (x)) + (sizeof(mpa_word_t) - 1)) / \ + sizeof(mpa_word_t))) + +/************************************************************* + * + * STATIC MEMORY MODE DEFINES + * + *************************************************************/ + +/* + * The number of extra uint32_t in the internal representation. + * This is used in the static memory mode. + * It is chosen to be complient with the requirments of GlobalPlatform. + */ +#define MPA_NUMBASE_METADATA_SIZE_IN_U32 2 + +#define MPA_SCRATCHMEM_METADATA_SIZE_IN_U32 (sizeof(mpa_scratch_mem_base)/ 4) + +/* + * The size (in uint32_t) of the constituent variables + * of mpa_fmm_context apart from m[] + */ + +#define MPA_FMM_CONTEXT_METADATA_SIZE_IN_U32 (sizeof(mpa_fmm_context_base)/4) + +/* + * This macro returns the size of the complete mpa_num_base struct that + * can hold n-bits integers. This is used in the static memory mode. + */ +#define mpa_StaticVarSizeInU32(n) \ + ((((n)+31)/32) + MPA_NUMBASE_METADATA_SIZE_IN_U32) + +/* + * + */ +#define mpa_StaticTempVarSizeInU32(max_bits) \ + (2 * mpa_StaticVarSizeInU32((max_bits)) - \ + MPA_NUMBASE_METADATA_SIZE_IN_U32) + +/* + * + */ +#define mpa_scratch_mem_size_in_U32(nr_temp_vars, max_bits) \ + (((nr_temp_vars) * (mpa_StaticTempVarSizeInU32((max_bits)) + \ + sizeof(struct mpa_scratch_item))) + \ + sizeof(struct mpa_scratch_mem_struct)) + +/* + * + */ +#define mpa_fmm_context_size_in_U32(n) \ + (2 * (mpa_StaticVarSizeInU32((n)) + 2) + \ + MPA_FMM_CONTEXT_METADATA_SIZE_IN_U32) + +/************************************************************* + * + * FUNCTION PROTOTYPES + * + * All externally available functions from this lib. + * + *************************************************************/ + +/* + * From mpa_init.c + */ + +/* + * mpa_init_scratch_mem + * Initiate a chunk of memory to be used as a scratch pool. + * The size of the pool (in uint32_t) must corresponde to the + * size returned by the macro mpa_ScratchMemSizeInU32 + * with the same parameters 'nr_vars' and 'max_bits' + * + * \param pool The pool to initialize + * \param size the size, in bytes, of the pool + * \prama bn_bits default size, in bits, of a big number + * \param get increase reference counter to pool + * \param put decrease reference counter to pool + * \param sync argument to supply to get() and put() + */ +MPALIB_EXPORT void mpa_init_scratch_mem_sync(mpa_scratch_mem pool, size_t size, + uint32_t bn_bits, mpa_scratch_mem_sync_fn get, + mpa_scratch_mem_sync_fn put, + struct mpa_scratch_mem_sync *sync); + +MPALIB_EXPORT void mpa_init_scratch_mem(mpa_scratch_mem pool, size_t size, + uint32_t bn_bits); + + +/* + * mpa_init_static + * Initiate a mpanum to hold an integer of a certain size. + * The parameter 'len' is the return value of the macro + * mpa_StaticVarSizeInU32 called with the max bit size as parameter. + * + * \param src The mpanum to be initialized + * \param len The allocated size in uint32_t of src + */ +MPALIB_EXPORT void mpa_init_static(mpanum src, uint32_t len); + +MPALIB_EXPORT void mpa_init_static_fmm_context(mpa_fmm_context_base *context, + uint32_t len); + +/* + * From mpa_addsub.c + */ +MPALIB_EXPORT void mpa_add(mpanum dest, const mpanum op1, const mpanum op2, + mpa_scratch_mem pool); + +MPALIB_EXPORT void mpa_sub(mpanum dest, const mpanum op1, const mpanum op2, + mpa_scratch_mem pool); + +MPALIB_EXPORT void mpa_add_word(mpanum dest, const mpanum op1, mpa_word_t op2, + mpa_scratch_mem pool); + +MPALIB_EXPORT void mpa_sub_word(mpanum dest, const mpanum op1, mpa_word_t op2, + mpa_scratch_mem pool); + +MPALIB_EXPORT void mpa_neg(mpanum dest, const mpanum src); + +/* + * From mpa_mul.c + */ + +MPALIB_EXPORT void mpa_mul(mpanum dest, const mpanum op1, const mpanum op2, + mpa_scratch_mem pool); + +MPALIB_EXPORT void mpa_mul_word(mpanum dest, const mpanum op1, mpa_word_t op2, + mpa_scratch_mem pool); + +/* + * From mpa_div.c + */ + +MPALIB_EXPORT void mpa_div(mpanum q, mpanum r, + const mpanum op1, const mpanum op2, + mpa_scratch_mem pool); + +/* + * From mpa_modulus.c + */ + +MPALIB_EXPORT void mpa_mod(mpanum dest, const mpanum op, const mpanum n, + mpa_scratch_mem pool); + +MPALIB_EXPORT void mpa_add_mod(mpanum dest, const mpanum op1, const mpanum op2, + const mpanum n, mpa_scratch_mem pool); + +MPALIB_EXPORT void mpa_sub_mod(mpanum dest, const mpanum op1, const mpanum op2, + const mpanum n, mpa_scratch_mem pool); + +MPALIB_EXPORT void mpa_mul_mod(mpanum dest, const mpanum op1, const mpanum op2, + const mpanum n, mpa_scratch_mem pool); + +MPALIB_EXPORT int mpa_inv_mod(mpanum dest, const mpanum op, const mpanum n, + mpa_scratch_mem pool); + +/* + * From mpa_cmp.c + */ + +MPALIB_EXPORT int32_t mpa_cmp(const mpanum op1, const mpanum op2); + +MPALIB_EXPORT int32_t mpa_cmp_short(const mpanum op1, int32_t op2); + +/* + * From mpa_conv.c + */ + +MPALIB_EXPORT void mpa_set_S32(mpanum dest, int32_t short_val); + +MPALIB_EXPORT int32_t mpa_get_S32(int32_t *dest, mpanum src); + +MPALIB_EXPORT void mpa_set_word(mpanum dest, mpa_word_t src); + +MPALIB_EXPORT mpa_word_t mpa_get_word(mpanum src); + +/* + * From mpa_shift.c + */ + +MPALIB_EXPORT void mpa_shift_left(mpanum dest, const mpanum src, + mpa_word_t steps); + +MPALIB_EXPORT void mpa_shift_right(mpanum dest, const mpanum src, + mpa_word_t steps); + +/* + * From mpa_gcd.c + */ +MPALIB_EXPORT void mpa_gcd(mpanum dest, const mpanum src1, const mpanum src2, + mpa_scratch_mem pool); + +MPALIB_EXPORT void mpa_extended_gcd(mpanum gcd, mpanum dest1, mpanum dest2, + const mpanum src1, const mpanum src2, + mpa_scratch_mem pool); + +/* + * From mpa_io.c + */ +MPALIB_EXPORT int mpa_get_str_size(void); + +MPALIB_EXPORT int mpa_set_str(mpanum dest, const char *digitstr); + +MPALIB_EXPORT char *mpa_get_str(char *str, int mode, const mpanum n); + +MPALIB_EXPORT int mpa_set_oct_str(mpanum dest, const uint8_t *buffer, + size_t buffer_len, bool negative); + +MPALIB_EXPORT int mpa_get_oct_str(uint8_t *buffer, size_t *buffer_len, + const mpanum n); + +/* + * From mpa_expmod.c + */ +MPALIB_EXPORT void mpa_exp_mod(mpanum dest, const mpanum op1, const mpanum op2, + const mpanum n, const mpanum r_modn, + const mpanum r2_modn, const mpa_word_t n_inv, + mpa_scratch_mem pool); + +/* + * From mpa_misc.c + */ + +MPALIB_EXPORT void mpa_wipe(mpanum src); + +MPALIB_EXPORT void mpa_copy(mpanum dest, const mpanum src); + +MPALIB_EXPORT void mpa_abs(mpanum dest, const mpanum src); + +MPALIB_EXPORT int mpa_highest_bit_index(const mpanum src); + +MPALIB_EXPORT uint32_t mpa_get_bit(const mpanum src, uint32_t idx); + +MPALIB_EXPORT int mpa_can_hold(mpanum dest, const mpanum src); + +MPALIB_EXPORT int mpa_parity(const mpanum src); + +MPALIB_EXPORT mpanum mpa_constant_one(void); + +/* + * From mpa_Random.c + */ + +typedef uint32_t (*random_generator_cb)(void *buf, size_t blen); + +MPALIB_EXPORT void mpa_set_random_generator(random_generator_cb callback); + +MPALIB_EXPORT void mpa_get_random(mpanum dest, mpanum limit); + +/* + * From mpa_montgomery.c + */ +MPALIB_EXPORT int mpa_compute_fmm_context(const mpanum modulus, mpanum r_modn, + mpanum r2_modn, mpa_word_t *n_inv, + mpa_scratch_mem pool); + +MPALIB_EXPORT void mpa_montgomery_mul(mpanum dest, mpanum op1, mpanum op2, + mpanum n, mpa_word_t n_inv, + mpa_scratch_mem pool); + +/* + * From mpa_mem_static.c + */ +MPALIB_EXPORT mpanum mpa_alloc_static_temp_var(mpanum *var, + mpa_scratch_mem pool); +MPALIB_EXPORT mpanum mpa_alloc_static_temp_var_size(int size_bits, + mpanum *var, + mpa_scratch_mem pool); +MPALIB_EXPORT void mpa_free_static_temp_var(mpanum *var, mpa_scratch_mem pool); + +/* + * From mpa_primetest.c + */ +MPALIB_EXPORT int mpa_is_prob_prime(mpanum n, int conf_level, + mpa_scratch_mem pool); + +#endif /* include guard */ |