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