/*
|
* 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_MPA_H
|
#define GUARD_MPA_H
|
|
#include "mpalib.h"
|
|
/************************************************************************\
|
* MACRO DEFINITIONS
|
\************************************************************************/
|
|
#define WORD_SIZE MPA_WORD_SIZE
|
#define BYTES_PER_WORD (MPA_WORD_SIZE >> 3)
|
#define NIBBLES_PER_WORD (MPA_WORD_SIZE >> 2)
|
#define LOG_OF_WORD_SIZE MPA_LOG_OF_WORD_SIZE
|
#define LOG_OF_BYTES_PER_WORD MPA_LOG_OF_BYTES_PER_WORD
|
#define WORD_ALL_BITS_ONE ((mpa_word_t)-1)
|
|
/* number of bytes to hold x bits, x must be positive integer */
|
#define BITS_TO_BYTES(x) (((x)+7) >> 3)
|
/* convert from bytes to bits */
|
#define BYTES_TO_BITS(x) ((x) << 3)
|
|
/* convert from words to bytes */
|
#define WORDS_TO_BYTES(x) ((x) << LOG_OF_BYTES_PER_WORD)
|
/* convert from bytes to minimum number of words needed to hold x bytes */
|
#define BYTES_TO_WORDS(x) (((x) + BYTES_PER_WORD - 1) >> LOG_OF_BYTES_PER_WORD)
|
|
/* convert from bits to words and vice versa */
|
#define WORDS_TO_BITS(x) ((x) * MPA_WORD_SIZE)
|
#define BITS_TO_WORDS(x) (((x) + MPA_WORD_SIZE - 1) / MPA_WORD_SIZE)
|
|
#define __MAX(a, b) ((a) < (b) ? (b) : (a))
|
#define __MIN(a, b) ((a) < (b) ? (a) : (b))
|
|
/* macros to access internal variables in a mpa_numbase */
|
|
#define MPA_NEG_SIGN -1
|
#define MPA_POS_SIGN 1
|
|
#define __mpanum_alloced(x) ((x)->alloc)
|
#define __mpanum_size(x) ((mpa_usize_t)((x)->size >= 0 ? \
|
(x)->size : -(x)->size))
|
#define __mpanum_sign(x) ((x)->size >= 0 ? MPA_POS_SIGN : MPA_NEG_SIGN)
|
|
/* macros to set internal variables in mpa_numbase */
|
|
/* SetSign take either MPA_POS_SIGN or MPA_NEG_SIGN as argument */
|
#define __mpanum_set_sign(x, s) \
|
do { \
|
if (__mpanum_sign(x) != (s)) \
|
(x)->size = -(x)->size; \
|
} while (0)
|
#define __mpanum_is_zero(x) ((x)->size == 0)
|
#define __mpanum_neg(x) ((x)->size = -((x)->size))
|
|
/* Get most significant word of x, call only on non-zero x */
|
#define __mpanum_msw(x) ((x)->d[__mpanum_size(x)-1])
|
#define __mpanum_lsw(x) ((x)->d[0])
|
|
/* Get word idx of x, if idx >= size, return 0
|
* This macro is used in the montgomery multiplication to allow
|
* operands to have shorter alloc than n
|
*/
|
#define __mpanum_get_word(idx, x) ((idx >= __mpanum_size(x)) ? \
|
0 : ((x)->d[idx]))
|
|
/* n = 0..NIBBLES_PER_WORD-1 */
|
#if defined(MPA_LITTLE_ENDIAN)
|
#define NIBBLE_OF_WORD(n, w) (((w) >> ((n) << 2)) & 0xf)
|
#elif defined(MPA_BIG_ENDIAN)
|
#define NIBBLE_OF_WORD(n, w) (((w) >> ((7-(n)) << 2)) & 0xf)
|
#else
|
#error "You must define either MPA_LITTLE_ENDIAN or MPA_BIG_ENDIAN, see mpalib_config.h"
|
#endif
|
|
/* In order to avoid warnings on unused arguments */
|
#ifndef IDENTIFIER_NOT_USED
|
#define IDENTIFIER_NOT_USED(x) (void)(&x)
|
#endif
|
|
/*
|
* Is NULL defined?
|
*/
|
#if !defined(NULL)
|
#define NULL (void *)0
|
#endif
|
|
/*************************************************************
|
*
|
* GLOBAL CONSTANTS AND VARIABLES
|
*
|
*************************************************************/
|
|
/*
|
* defined in mpa_misc.c
|
*/
|
extern const mpa_num_base const_largest_deci_base;
|
extern const mpa_num_base Const_1_LShift_Base;
|
extern const mpa_num_base const_one;
|
|
/*************************************************************
|
*
|
* INTERNAL FUNCTIONS
|
*
|
*************************************************************/
|
|
/*------------------------------------------------------------
|
*
|
* From mpa_mem_static.
|
*
|
*/
|
|
/*------------------------------------------------------------
|
*
|
* From mpa_addsub.c
|
*
|
*/
|
void __mpa_full_adder(mpa_word_t a,
|
mpa_word_t b, mpa_word_t *sum, mpa_word_t *carry);
|
|
void __mpa_full_sub(mpa_word_t a,
|
mpa_word_t b, mpa_word_t *diff, mpa_word_t *carry);
|
|
void __mpa_full_adder_ackum(mpa_word_t *d, mpa_word_t e, mpa_word_t *carry);
|
|
void __mpa_abs_add(mpa_word_t *sum,
|
mpa_usize_t *sum_size,
|
const mpa_word_t *op1,
|
mpa_usize_t op1_size,
|
const mpa_word_t *op2, mpa_usize_t op2_size);
|
|
void __mpa_abs_add_ackum(mpanum dest, const mpanum src);
|
|
void __mpa_abs_sub(mpa_word_t *diff,
|
mpa_usize_t *diff_size,
|
const mpa_word_t *op1,
|
mpa_usize_t op1_size,
|
const mpa_word_t *op2, mpa_usize_t op2_size);
|
|
/*------------------------------------------------------------
|
*
|
* From mpa_cmp.c
|
*
|
*/
|
|
int __mpa_abs_cmp(const mpanum op1, const mpanum op2);
|
|
int __mpa_abs_greater_than(const mpanum op1, const mpanum op2);
|
|
int __mpa_abs_less_than(const mpanum op1, const mpanum op2);
|
|
/*------------------------------------------------------------
|
*
|
* From mpa_mul.c
|
*
|
*/
|
void __mpa_mul_add_word(mpa_word_t a,
|
mpa_word_t b, mpa_word_t *p, mpa_word_t *carry);
|
|
void __mpa_mul_add_word_cum(mpa_word_t a,
|
mpa_word_t b, mpa_word_t *p, mpa_word_t *carry);
|
|
void __mpa_abs_mul_word(mpanum dest, const mpanum op1, mpa_word_t op2);
|
|
void __mpa_abs_mul(mpanum dest, const mpanum op1, const mpanum op2);
|
|
/*------------------------------------------------------------
|
*
|
* From mpa_div.c
|
*
|
*/
|
|
mpa_word_t __mpa_div_dword(mpa_word_t n0,
|
mpa_word_t n1, mpa_word_t d, mpa_word_t *r);
|
|
void __mpa_div_q_r_internal_word(mpanum q,
|
mpanum r,
|
const mpanum op1, const mpa_word_t op2);
|
|
void __mpa_div_q_r(mpanum q,
|
mpanum r,
|
const mpanum op1, const mpanum op2, mpa_scratch_mem pool);
|
|
/*------------------------------------------------------------
|
*
|
* From mpa_shift.c
|
*
|
*/
|
|
void __mpa_shift_words_left(mpanum op, mpa_word_t q);
|
void __mpa_shift_words_right(mpanum op, mpa_word_t q);
|
|
/*------------------------------------------------------------
|
*
|
* From mpa_montgomery.c
|
*
|
*/
|
|
void __mpa_montgomery_sub_ack(mpanum dest, mpanum src);
|
|
void __mpa_montgomery_mul_add(mpanum dest, mpanum src, mpa_word_t w);
|
|
void __mpa_montgomery_mul(mpanum dest,
|
mpanum op1, mpanum op2, mpanum n, mpa_word_t n_inv);
|
|
/*------------------------------------------------------------
|
*
|
* From mpa_misc.c
|
*
|
*/
|
void __mpa_set_unused_digits_to_zero(mpanum n);
|
|
#endif /* include guard */
|