summaryrefslogtreecommitdiff
path: root/lib/libmpa/include/mpalib.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libmpa/include/mpalib.h')
-rw-r--r--lib/libmpa/include/mpalib.h432
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 */