/*############################################################################
# Copyright 2016 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 Epid11CheckPrivRlEntry implementation.
*/
#include "epid/verifier/1.1/api.h"
#include "epid/verifier/1.1/src/context.h"
EpidStatus Epid11CheckPrivRlEntry(Epid11VerifierCtx const* ctx,
Epid11BasicSignature const* sig,
FpElemStr const* f) {
EpidStatus result = kEpidErr;
EcPoint* b = NULL;
EcPoint* k = NULL;
EcPoint* t5 = NULL;
EcGroup* G3 = NULL;
if (!ctx || !sig || !f) {
return kEpidBadArgErr;
}
if (!ctx->epid11_params || !ctx->epid11_params->G3) {
return kEpidBadArgErr;
}
do {
// Section 4.1.2 Step 31. The verifier computes t5 = G3.exp(B, f)
// and verifies that G3.isEqual(t5, K) = false
bool compare_result = false;
G3 = ctx->epid11_params->G3;
result = NewEcPoint(G3, &b);
if (kEpidNoErr != result) {
result = kEpidMathErr;
break;
}
result = NewEcPoint(G3, &k);
if (kEpidNoErr != result) {
result = kEpidMathErr;
break;
}
result = NewEcPoint(G3, &t5);
if (kEpidNoErr != result) {
result = kEpidMathErr;
break;
}
result = ReadEcPoint(G3, &sig->B, sizeof(sig->B), b);
if (kEpidNoErr != result) {
result = kEpidMathErr;
break;
}
result = ReadEcPoint(G3, &sig->K, sizeof(sig->K), k);
if (kEpidNoErr != result) {
result = kEpidMathErr;
break;
}
result = EcExp(G3, b, (BigNumStr const*)f, t5);
if (kEpidNoErr != result) {
result = kEpidMathErr;
break;
}
result = EcIsEqual(G3, t5, k, &compare_result);
if (kEpidNoErr != result) {
result = kEpidMathErr;
break;
}
// if t5 == k, sig revoked in PrivRl
if (compare_result) {
result = kEpidSigRevokedInPrivRl;
} else {
result = kEpidNoErr;
}
} while (0);
DeleteEcPoint(&t5);
DeleteEcPoint(&k);
DeleteEcPoint(&b);
return result;
}