/*############################################################################
# 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.
############################################################################*/
/// Member pre-computation implementation
/*! \file */
#include "epid/member/src/precomp.h"
#include "epid/common/src/epid2params.h"
#include "epid/common/src/grouppubkey.h"
#include "epid/common/types.h"
/// Handle SDK Error with Break
#define BREAK_ON_EPID_ERROR(ret) \
if (kEpidNoErr != (ret)) { \
break; \
}
EpidStatus PrecomputeMemberPairing(Epid2Params_ const* epid2_params,
GroupPubKey const* pub_key,
G1ElemStr const* A_str,
MemberPrecomp* precomp) {
EpidStatus sts = kEpidErr;
GroupPubKey_* pub_key_ = NULL;
EcPoint* A = NULL;
FfElement* e = NULL;
if (!epid2_params || !pub_key || !A_str || !precomp) return kEpidBadArgErr;
do {
EcGroup* G1 = epid2_params->G1;
EcGroup* G2 = epid2_params->G2;
FiniteField* GT = epid2_params->GT;
PairingState* ps_ctx = epid2_params->pairing_state;
EcPoint* g2 = epid2_params->g2;
sts = CreateGroupPubKey(pub_key, G1, G2, &pub_key_);
BREAK_ON_EPID_ERROR(sts);
sts = NewFfElement(GT, &e);
BREAK_ON_EPID_ERROR(sts);
// 1. The member computes e12 = pairing(h1, g2).
sts = Pairing(ps_ctx, pub_key_->h1, g2, e);
BREAK_ON_EPID_ERROR(sts);
sts = WriteFfElement(GT, e, &precomp->e12, sizeof(precomp->e12));
BREAK_ON_EPID_ERROR(sts);
// 2. The member computes e22 = pairing(h2, g2).
sts = Pairing(ps_ctx, pub_key_->h2, g2, e);
BREAK_ON_EPID_ERROR(sts);
sts = WriteFfElement(GT, e, &precomp->e22, sizeof(precomp->e22));
BREAK_ON_EPID_ERROR(sts);
// 3. The member computes e2w = pairing(h2, w).
sts = Pairing(ps_ctx, pub_key_->h2, pub_key_->w, e);
BREAK_ON_EPID_ERROR(sts);
sts = WriteFfElement(GT, e, &precomp->e2w, sizeof(precomp->e2w));
BREAK_ON_EPID_ERROR(sts);
// 4. The member computes ea2 = pairing(A, g2).
sts = NewEcPoint(G1, &A);
BREAK_ON_EPID_ERROR(sts);
sts = ReadEcPoint(G1, A_str, sizeof(*A_str), A);
BREAK_ON_EPID_ERROR(sts);
sts = Pairing(ps_ctx, A, g2, e);
BREAK_ON_EPID_ERROR(sts);
sts = WriteFfElement(GT, e, &precomp->ea2, sizeof(precomp->ea2));
BREAK_ON_EPID_ERROR(sts);
sts = kEpidNoErr;
} while (0);
DeleteGroupPubKey(&pub_key_);
DeleteEcPoint(&A);
DeleteFfElement(&e);
return sts;
}