/*############################################################################ # Copyright 2016-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. ############################################################################*/ #ifndef EPID_COMMON_SRC_COMMITMENT_H_ #define EPID_COMMON_SRC_COMMITMENT_H_ /*! * \file * \brief Commitment hash interface. * \addtogroup EpidCommon * @{ */ #include #include "epid/common/errors.h" #include "epid/common/types.h" typedef struct FiniteField FiniteField; typedef struct EcPoint EcPoint; typedef struct EcGroup EcGroup; typedef struct FfElement FfElement; #pragma pack(1) /// Storage for values to create commitment in Sign and Verify algorithms typedef struct CommitValues { BigNumStr p; ///< Intel(R) EPID2.0 parameter p G1ElemStr g1; ///< Intel(R) EPID2.0 parameter g1 G2ElemStr g2; ///< Intel(R) EPID2.0 parameter g2 G1ElemStr h1; ///< Group public key value h1 G1ElemStr h2; ///< Group public key value h2 G2ElemStr w; ///< Group public key value w G1ElemStr B; ///< Variable B computed in algorithm G1ElemStr K; ///< Variable K computed in algorithm G1ElemStr T; ///< Variable T computed in algorithm G1ElemStr R1; ///< Variable R1 computed in algorithm GtElemStr R2; ///< Variable R2 computed in algorithm } CommitValues; #pragma pack() /// Set group public key related fields from CommitValues structure /*! Set p, g1, g2, h1, h2 and w fields of values argument. \param[in] pub_key Group public key \param[out] values Pointer to CommitValues structure to fill. \returns ::EpidStatus \see CalculateCommitmentHash */ EpidStatus SetKeySpecificCommitValues(GroupPubKey const* pub_key, CommitValues* values); /// Set CommitValues structure fields calculated in algorithm /*! Set B, K, T, R1 and R2 fields of values argument. \param[in] B Value of B to set \param[in] K Value of K to set \param[in] T Value of T to set \param[in] R1 Value of R1 to set \param[in] G1 EcGroup containing element R1 \param[in] R2 Value of R2 to set \param[in] GT FiniteField containing element R2 \param[out] values Pointer to CommitValues structure to fill. \returns ::EpidStatus \see CalculateCommitmentHash */ EpidStatus SetCalculatedCommitValues(G1ElemStr const* B, G1ElemStr const* K, G1ElemStr const* T, EcPoint const* R1, EcGroup* G1, FfElement const* R2, FiniteField* GT, CommitValues* values); /// Calculate Fp.hash(t3 || m) for Sign and Verfiy algorithms /*! Calculate c = Fp.hash(t3 || m) where t3 is Fp.hash(p || g1 || g2 || h1 || h2 || w || B || K || T || R1 || R2). \param[in] values Commit values to hash \param[in] Fp Finite field to perfom hash operation in \param[in] hash_alg Hash algorithm to use \param[in] msg Message to hash \param[in] msg_len Size of msg buffer in bytes \param[out] c Result of calculation \returns ::EpidStatus \see SetKeySpecificCommitValues \see SetCalculatedCommitValues */ EpidStatus CalculateCommitmentHash(CommitValues const* values, FiniteField* Fp, HashAlg hash_alg, void const* msg, size_t msg_len, FfElement* c); /*! @} */ #endif // EPID_COMMON_SRC_COMMITMENT_H_