/*############################################################################
# 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.
############################################################################*/
/*!
* \file
* \brief EpidCheckPrivRlEntry implementation.
*/
#include "epid/verifier/api.h"
#include "epid/verifier/src/context.h"
EpidStatus EpidCheckPrivRlEntry(VerifierCtx const* ctx,
BasicSignature const* sig, FpElemStr const* f) {
EpidStatus result = kEpidErr;
EcPoint* b = NULL;
EcPoint* k = NULL;
EcPoint* t4 = NULL;
EcGroup* G1 = NULL;
FfElement* ff_elem = NULL;
if (!ctx || !sig || !f) {
return kEpidBadArgErr;
}
if (!ctx->epid2_params || !ctx->epid2_params->G1) {
return kEpidBadArgErr;
}
do {
// Section 4.1.2 Step 4.b For i = 0, ... , n1-1, the verifier computes t4
// =G1.exp(B, f[i]) and verifies that G1.isEqual(t4, K) = false.
bool compare_result = false;
FiniteField* Fp = ctx->epid2_params->Fp;
G1 = ctx->epid2_params->G1;
result = NewFfElement(Fp, &ff_elem);
if (kEpidNoErr != result) {
break;
}
result = NewEcPoint(G1, &b);
if (kEpidNoErr != result) {
break;
}
result = NewEcPoint(G1, &k);
if (kEpidNoErr != result) {
break;
}
result = NewEcPoint(G1, &t4);
if (kEpidNoErr != result) {
break;
}
// ReadFfElement checks that the value f is in the field
result = ReadFfElement(Fp, (BigNumStr const*)f, sizeof(BigNumStr), ff_elem);
if (kEpidNoErr != result) {
break;
}
result = ReadEcPoint(G1, &sig->B, sizeof(sig->B), b);
if (kEpidNoErr != result) {
break;
}
result = ReadEcPoint(G1, &sig->K, sizeof(sig->K), k);
if (kEpidNoErr != result) {
break;
}
result = EcExp(G1, b, (BigNumStr const*)f, t4);
if (kEpidNoErr != result) {
break;
}
result = EcIsEqual(G1, t4, k, &compare_result);
if (kEpidNoErr != result) {
break;
}
// if t4 == k, sig revoked in PrivRl
if (compare_result) {
result = kEpidSigRevokedInPrivRl;
} else {
result = kEpidNoErr;
}
} while (0);
DeleteFfElement(&ff_elem);
DeleteEcPoint(&t4);
DeleteEcPoint(&k);
DeleteEcPoint(&b);
return result;
}