/*############################################################################ # 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 EFq math /*! \file */ #ifndef EPID_MEMBER_TINY_MATH_EFQ_H_ #define EPID_MEMBER_TINY_MATH_EFQ_H_ #include #include "epid/common/bitsupplier.h" #include "epid/common/types.h" /// \cond typedef struct EccPointFq EccPointFq; typedef struct EccPointJacobiFq EccPointJacobiFq; typedef struct FpElem FpElem; typedef struct FqElem FqElem; /// \endcond /// Multiply two points in EFq. /*! This function is mitigated against software side-channel attacks. \param[out] result of multiplying left and right. \param[in] base The first operand to be multiplied. \param[in] exp The second operand to be multiplied. */ void EFqMulSSCM(EccPointJacobiFq* result, EccPointJacobiFq const* base, FpElem const* exp); /// Exponentiate a point in EFq by an element of Fp. /*! \param[out] result target. \param[in] base the base. \param[in] exp the exponent. \returns A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. \returns 1 on success, 0 on failure */ int EFqAffineExp(EccPointFq* result, EccPointFq const* base, FpElem const* exp); /// Sum the results of exponentiating two points in EFq by elements of Fp. /*! \param[out] result target. \param[in] base0 the first base. \param[in] exp0 the first exponent. \param[in] base1 the second base. \param[in] exp1 the second exponent. \returns A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. */ int EFqAffineMultiExp(EccPointFq* result, EccPointFq const* base0, FpElem const* exp0, EccPointFq const* base1, FpElem const* exp1); /// Sum the results of exponentiating two points in EFq by elements of Fp. /*! \param[out] result target. \param[in] base0 the first base. \param[in] exp0 the first exponent. \param[in] base1 the second base. \param[in] exp1 the second exponent. \returns 1 on success, 0 on failure */ void EFqMultiExp(EccPointJacobiFq* result, EccPointJacobiFq const* base0, FpElem const* exp0, EccPointJacobiFq const* base1, FpElem const* exp1); /// Add two points in EFq. /*! \param[out] result of adding left and right. \param[in] left The first operand to be added. \param[in] right The second operand to be added. \returns A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. */ int EFqAffineAdd(EccPointFq* result, EccPointFq const* left, EccPointFq const* right); /// Double a point in EFq. /*! \param[out] result target. \param[in] in the value to double. \returns A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. */ int EFqAffineDbl(EccPointFq* result, EccPointFq const* in); /// Double a point in EFq. /*! \param[out] result target. \param[in] in the value to double. */ void EFqDbl(EccPointJacobiFq* result, EccPointJacobiFq const* in); /// Add two points in EFq. /*! \param[out] result of adding left and right. \param[in] left The first operand to be added. \param[in] right The second operand to be added. */ void EFqAdd(EccPointJacobiFq* result, EccPointJacobiFq const* left, EccPointJacobiFq const* right); /// Generate a random point in EFq. /*! \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 EFqRand(EccPointFq* result, BitSupplier rnd_func, void* rnd_param); /// Set a point's value. /*! \param[out] result target. \param[in] x value to set. \param[in] y value to set. */ void EFqSet(EccPointJacobiFq* result, FqElem const* x, FqElem const* y); /// Test if a point is infinity. /*! \param[in] in the point to test. \returns A value different from zero (i.e., true) indeed the value is infinity. Zero (i.e., false) otherwise. */ int EFqIsInf(EccPointJacobiFq const* in); /// Convert a point from Affine to Jacobi representation. /*! \param[out] result target. \param[in] in value to set. */ void EFqFromAffine(EccPointJacobiFq* result, EccPointFq const* in); /// Convert a point from Jacobi to Affine representation. /*! \param[out] result target. \param[in] in value to set. \returns A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. */ int EFqToAffine(EccPointFq* result, EccPointJacobiFq const* in); /// Negate a point on EFq. /*! \param[out] result the negative of the element. \param[in] in the element to negate. */ void EFqNeg(EccPointJacobiFq* result, EccPointJacobiFq const* in); /// Test if two points on EFq are equal /*! \param[in] left The first operand to be tested. \param[in] right The second operand to be tested. \returns A value different from zero (i.e., true) if indeed the values are equal. Zero (i.e., false) otherwise. */ int EFqEq(EccPointJacobiFq const* left, EccPointJacobiFq const* right); /// Hashes an arbitrary message to a point on EFq. /*! \param[out] result target. \param[in] msg buffer to reinterpret. \param[in] len length of msg in bytes. \param[in] hashalg hash algorithm to use. \returns A value different from zero (i.e., true) if on success. Zero (i.e., false) otherwise. */ int EFqHash(EccPointFq* result, unsigned char const* msg, size_t len, HashAlg hashalg); /// Copy a point's value /*! \param[out] result copy target. \param[in] in copy source. */ void EFqCp(EccPointFq* result, EccPointFq const* in); /// Test if two points on EFq are equal /*! \param[in] left The first operand to be tested. \param[in] right The second operand to be tested. \returns A value different from zero (i.e., true) if indeed the values are equal. Zero (i.e., false) otherwise. */ int EFqEqAffine(EccPointFq const* left, EccPointFq const* right); /// Conditionally Set a point'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 EFqCondSet(EccPointJacobiFq* result, EccPointJacobiFq const* true_val, EccPointJacobiFq const* false_val, int truth_val); /// Copy a point's value /*! \param[out] result copy target. \param[in] in copy source. */ void EFqJCp(EccPointJacobiFq* result, EccPointJacobiFq const* in); /// Set an element's value to infinity. /*! \param[out] result element to set. */ void EFqInf(EccPointJacobiFq* result); /// Test if a point is on EFq. /*! \param[in] in the point to test. \returns A value different from zero (i.e., true) indeed the point is on the curve. Zero (i.e., false) otherwise. */ int EFqOnCurve(EccPointFq const* in); /// Test if a point is on EFq. /*! \param[in] in the point to test. \returns A value different from zero (i.e., true) indeed the point is on the curve. Zero (i.e., false) otherwise. */ int EFqJOnCurve(EccPointJacobiFq const* in); /// Generate a random point in EFq. /*! \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 EFqJRand(EccPointJacobiFq* result, BitSupplier rnd_func, void* rnd_param); #endif // EPID_MEMBER_TINY_MATH_EFQ_H_