123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- /*############################################################################
- # Copyright 2017 Intel Corporation
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- ############################################################################*/
- /// Definition of Large Integer math
- /*! \file */
- #ifndef EPID_MEMBER_TINY_MATH_VLI_H_
- #define EPID_MEMBER_TINY_MATH_VLI_H_
- #include <stdint.h>
- #include "epid/common/bitsupplier.h"
- /// \cond
- typedef struct VeryLargeInt VeryLargeInt;
- typedef struct VeryLargeIntProduct VeryLargeIntProduct;
- /// \endcond
- /// Add two large integers.
- /*!
- \param[out] result target.
- \param[in] left The first operand to be added.
- \param[in] right The second operand to be added.
- \returns the carry portion of the addition.
- */
- uint32_t VliAdd(VeryLargeInt* result, VeryLargeInt const* left,
- VeryLargeInt const* right);
- /// Multiply two large integers.
- /*!
- \param[out] result of multiplying left and right.
- \param[in] left The first operand to be multiplied.
- \param[in] right The second operand to be multiplied.
- */
- void VliMul(VeryLargeIntProduct* result, VeryLargeInt const* left,
- VeryLargeInt const* right);
- /// Right shift a large integers.
- /*!
- \param[out] result target.
- \param[in] in The value to be shifted.
- \param[in] shift The number of bits to shift.
- */
- void VliRShift(VeryLargeInt* result, VeryLargeInt const* in, uint32_t shift);
- /// Subtract two large integers.
- /*!
- \param[out] result target.
- \param[in] left The operand to be subtracted from.
- \param[in] right The operand to subtract.
- \returns 1 on success, 0 on failure
- */
- uint32_t VliSub(VeryLargeInt* result, VeryLargeInt const* left,
- VeryLargeInt const* right);
- /// Set a large integer's value.
- /*!
- \param[out] result target.
- \param[in] in value to set.
- */
- void VliSet(VeryLargeInt* result, VeryLargeInt const* in);
- /// Clear a large integer's value.
- /*!
- \param[out] result value to clear.
- */
- void VliClear(VeryLargeInt* result);
- /// Test if a large integer is zero.
- /*!
- \param[in] in the value to test.
- \returns A value different from zero (i.e., true) if indeed
- the value is zero. Zero (i.e., false) otherwise.
- */
- int VliIsZero(VeryLargeInt const* in);
- /// Conditionally Set a large inter's value to one of two values.
- /*!
- \param[out] result target.
- \param[in] true_val value to set if condition is true.
- \param[in] false_val value to set if condition is false.
- \param[in] truth_val value of condition.
- */
- void VliCondSet(VeryLargeInt* result, VeryLargeInt const* true_val,
- VeryLargeInt const* false_val, int truth_val);
- /// Test the value of a bit in a large integer.
- /*!
- \param[in] in the value to test.
- \param[in] bit the bit index.
- \returns value of the bit (1 or 0).
- */
- uint32_t VliTestBit(VeryLargeInt const* in, uint32_t bit);
- /// Generate a random large integer.
- /*!
- \param[in] result the random value.
- \param[in] rnd_func Random number generator.
- \param[in] rnd_param Pass through context data for rnd_func.
- \returns A value different from zero (i.e., true) if on success.
- Zero (i.e., false) otherwise.
- */
- int VliRand(VeryLargeInt* result, BitSupplier rnd_func, void* rnd_param);
- /// compare two large integers.
- /*!
- \param[in] left the left hand value.
- \param[in] right the right hand value.
- \returns the sign of left - right
- */
- int VliCmp(VeryLargeInt const* left, VeryLargeInt const* right);
- /// Add two large integers modulo a value.
- /*!
- \param[out] result target.
- \param[in] left The first operand to be added.
- \param[in] right The second operand to be added.
- \param[in] mod The modulo.
- */
- void VliModAdd(VeryLargeInt* result, VeryLargeInt const* left,
- VeryLargeInt const* right, VeryLargeInt const* mod);
- /// Subtract two large integers modulo a value.
- /*!
- \param[out] result target.
- \param[in] left The operand to be subtracted from.
- \param[in] right The operand to subtract.
- \param[in] mod The modulo.
- */
- void VliModSub(VeryLargeInt* result, VeryLargeInt const* left,
- VeryLargeInt const* right, VeryLargeInt const* mod);
- /// Multiply two large integers modulo a value.
- /*!
- \param[out] result target.
- \param[in] left The first operand to be multiplied.
- \param[in] right The second operand to be multiplied.
- \param[in] mod The modulo.
- */
- void VliModMul(VeryLargeInt* result, VeryLargeInt const* left,
- VeryLargeInt const* right, VeryLargeInt const* mod);
- /// Exponentiate a large integer modulo a value.
- /*!
- \param[out] result target.
- \param[in] base the base.
- \param[in] exp the exponent.
- \param[in] mod The modulo.
- */
- void VliModExp(VeryLargeInt* result, VeryLargeInt const* base,
- VeryLargeInt const* exp, VeryLargeInt const* mod);
- /// Invert a large integer modulo a value.
- /*!
- \param[out] result target.
- \param[in] input the value to invert.
- \param[in] mod The modulo.
- */
- void VliModInv(VeryLargeInt* result, VeryLargeInt const* input,
- VeryLargeInt const* mod);
- /// Square a large integer modulo a value.
- /*!
- \param[out] result target.
- \param[in] input the base.
- \param[in] mod The modulo.
- */
- void VliModSquare(VeryLargeInt* result, VeryLargeInt const* input,
- VeryLargeInt const* mod);
- /// Reduce a value to a modulo.
- /*!
- \param[out] result target.
- \param[in] input the base.
- \param[in] mod The modulo.
- \warning This function makes significant assumptions about
- the range of values input
- */
- void VliModBarrett(VeryLargeInt* result, VeryLargeIntProduct const* input,
- VeryLargeInt const* mod);
- #endif // EPID_MEMBER_TINY_MATH_VLI_H_
|