| /*############################################################################ |
| # 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 <stddef.h> |
| |
| #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_ |