/*############################################################################ # 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; }