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