context.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. /*############################################################################
  2. # Copyright 2016-2017 Intel Corporation
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. ############################################################################*/
  16. /*!
  17. * \file
  18. * \brief Verifier context implementation.
  19. */
  20. #include "epid/verifier/src/context.h"
  21. #include <string.h>
  22. #include "epid/common/math/pairing.h"
  23. #include "epid/common/src/endian_convert.h"
  24. #include "epid/common/src/epid2params.h"
  25. #include "epid/common/src/memory.h"
  26. #include "epid/common/src/sigrlvalid.h"
  27. #include "epid/verifier/api.h"
  28. /// Handle SDK Error with Break
  29. #define BREAK_ON_EPID_ERROR(ret) \
  30. if (kEpidNoErr != (ret)) { \
  31. break; \
  32. }
  33. /// create Verifier precomp of the VerifierCtx
  34. static EpidStatus DoPrecomputation(VerifierCtx* ctx);
  35. /// Read Verifier precomp
  36. static EpidStatus ReadPrecomputation(VerifierPrecomp const* precomp_str,
  37. VerifierCtx* ctx);
  38. /// Internal function to prove if group based revocation list is valid
  39. static bool IsGroupRlValid(GroupRl const* group_rl, size_t grp_rl_size) {
  40. const size_t kMinGroupRlSize = sizeof(GroupRl) - sizeof(GroupId);
  41. size_t input_grp_rl_size = 0;
  42. if (!group_rl || grp_rl_size < kMinGroupRlSize) {
  43. return false;
  44. }
  45. if (ntohl(group_rl->n3) > (SIZE_MAX - kMinGroupRlSize) / sizeof(GroupId)) {
  46. return false;
  47. }
  48. input_grp_rl_size = kMinGroupRlSize + (ntohl(group_rl->n3) * sizeof(GroupId));
  49. if (input_grp_rl_size != grp_rl_size) {
  50. return false;
  51. }
  52. return true;
  53. }
  54. /// Internal function to verify if private key based revocation list is valid
  55. static bool IsPrivRlValid(GroupId const* gid, PrivRl const* priv_rl,
  56. size_t priv_rl_size) {
  57. const size_t kMinPrivRlSize = sizeof(PrivRl) - sizeof(FpElemStr);
  58. size_t input_priv_rl_size = 0;
  59. if (!gid || !priv_rl || kMinPrivRlSize > priv_rl_size) {
  60. return false;
  61. }
  62. if (ntohl(priv_rl->n1) >
  63. (SIZE_MAX - kMinPrivRlSize) / sizeof(priv_rl->f[0])) {
  64. return false;
  65. }
  66. // sanity check of input PrivRl size
  67. input_priv_rl_size =
  68. kMinPrivRlSize + ntohl(priv_rl->n1) * sizeof(priv_rl->f[0]);
  69. if (input_priv_rl_size != priv_rl_size) {
  70. return false;
  71. }
  72. // verify that gid given and gid in PrivRl match
  73. if (0 != memcmp(gid, &priv_rl->gid, sizeof(*gid))) {
  74. return false;
  75. }
  76. return true;
  77. }
  78. /// Internal function to verify if verifier revocation list is valid
  79. static bool IsVerifierRlValid(GroupId const* gid, VerifierRl const* ver_rl,
  80. size_t ver_rl_size) {
  81. const size_t kMinVerifierRlSize = sizeof(VerifierRl) - sizeof(G1ElemStr);
  82. size_t expected_verifier_rl_size = 0;
  83. if (!gid || !ver_rl || kMinVerifierRlSize > ver_rl_size) {
  84. return false;
  85. }
  86. if (ntohl(ver_rl->n4) >
  87. (SIZE_MAX - kMinVerifierRlSize) / sizeof(ver_rl->K[0])) {
  88. return false;
  89. }
  90. // sanity check of input VerifierRl size
  91. expected_verifier_rl_size =
  92. kMinVerifierRlSize + ntohl(ver_rl->n4) * sizeof(ver_rl->K[0]);
  93. if (expected_verifier_rl_size != ver_rl_size) {
  94. return false;
  95. }
  96. // verify that gid in public key and gid in SigRl match
  97. if (0 != memcmp(gid, &ver_rl->gid, sizeof(*gid))) {
  98. return false;
  99. }
  100. return true;
  101. }
  102. EpidStatus EpidVerifierCreate(GroupPubKey const* pubkey,
  103. VerifierPrecomp const* precomp,
  104. VerifierCtx** ctx) {
  105. EpidStatus result = kEpidErr;
  106. VerifierCtx* verifier_ctx = NULL;
  107. if (!pubkey || !ctx) {
  108. return kEpidBadArgErr;
  109. }
  110. do {
  111. // Allocate memory for VerifierCtx
  112. verifier_ctx = SAFE_ALLOC(sizeof(VerifierCtx));
  113. if (!verifier_ctx) {
  114. result = kEpidMemAllocErr;
  115. break;
  116. }
  117. // set the default hash algorithm
  118. verifier_ctx->hash_alg = kSha512;
  119. #ifdef TPM_TSS // if build for TSS, make Sha256 default
  120. verifier_ctx->hash_alg = kSha256;
  121. #endif
  122. // Internal representation of Epid2Params
  123. result = CreateEpid2Params(&verifier_ctx->epid2_params);
  124. if (kEpidNoErr != result) {
  125. break;
  126. }
  127. // Internal representation of Group Pub Key
  128. result = CreateGroupPubKey(pubkey, verifier_ctx->epid2_params->G1,
  129. verifier_ctx->epid2_params->G2,
  130. &verifier_ctx->pub_key);
  131. if (kEpidNoErr != result) {
  132. break;
  133. }
  134. // Store group public key strings for later use
  135. result = SetKeySpecificCommitValues(pubkey, &verifier_ctx->commit_values);
  136. if (kEpidNoErr != result) {
  137. break;
  138. }
  139. // Allocate verifier_ctx->e12
  140. result = NewFfElement(verifier_ctx->epid2_params->GT, &verifier_ctx->e12);
  141. if (kEpidNoErr != result) {
  142. break;
  143. }
  144. // Allocate verifier_ctx->e22
  145. result = NewFfElement(verifier_ctx->epid2_params->GT, &verifier_ctx->e22);
  146. if (kEpidNoErr != result) {
  147. break;
  148. }
  149. // Allocate verifier_ctx->e2w
  150. result = NewFfElement(verifier_ctx->epid2_params->GT, &verifier_ctx->e2w);
  151. if (kEpidNoErr != result) {
  152. break;
  153. }
  154. // Allocate verifier_ctx->eg12
  155. result = NewFfElement(verifier_ctx->epid2_params->GT, &verifier_ctx->eg12);
  156. if (kEpidNoErr != result) {
  157. break;
  158. }
  159. // precomputation
  160. if (precomp != NULL) {
  161. result = ReadPrecomputation(precomp, verifier_ctx);
  162. } else {
  163. result = DoPrecomputation(verifier_ctx);
  164. }
  165. if (kEpidNoErr != result) {
  166. break;
  167. }
  168. verifier_ctx->sig_rl = NULL;
  169. verifier_ctx->group_rl = NULL;
  170. verifier_ctx->priv_rl = NULL;
  171. verifier_ctx->verifier_rl = NULL;
  172. verifier_ctx->was_verifier_rl_updated = false;
  173. verifier_ctx->basename_hash = NULL;
  174. verifier_ctx->basename = NULL;
  175. verifier_ctx->basename_len = 0;
  176. *ctx = verifier_ctx;
  177. result = kEpidNoErr;
  178. } while (0);
  179. if (kEpidNoErr != result && verifier_ctx) {
  180. DeleteFfElement(&verifier_ctx->eg12);
  181. DeleteFfElement(&verifier_ctx->e2w);
  182. DeleteFfElement(&verifier_ctx->e22);
  183. DeleteFfElement(&verifier_ctx->e12);
  184. DeleteEpid2Params(&verifier_ctx->epid2_params);
  185. DeleteGroupPubKey(&verifier_ctx->pub_key);
  186. SAFE_FREE(verifier_ctx);
  187. }
  188. return result;
  189. }
  190. void EpidVerifierDelete(VerifierCtx** ctx) {
  191. if (ctx && *ctx) {
  192. DeleteFfElement(&(*ctx)->eg12);
  193. DeleteFfElement(&(*ctx)->e2w);
  194. DeleteFfElement(&(*ctx)->e22);
  195. DeleteFfElement(&(*ctx)->e12);
  196. DeleteGroupPubKey(&(*ctx)->pub_key);
  197. DeleteEpid2Params(&(*ctx)->epid2_params);
  198. (*ctx)->priv_rl = NULL;
  199. (*ctx)->sig_rl = NULL;
  200. (*ctx)->group_rl = NULL;
  201. SAFE_FREE((*ctx)->verifier_rl);
  202. DeleteEcPoint(&(*ctx)->basename_hash);
  203. SAFE_FREE((*ctx)->basename);
  204. (*ctx)->basename_len = 0;
  205. SAFE_FREE(*ctx);
  206. }
  207. }
  208. EpidStatus EpidVerifierWritePrecomp(VerifierCtx const* ctx,
  209. VerifierPrecomp* precomp) {
  210. EpidStatus result = kEpidErr;
  211. FfElement* e12 = NULL; // an element in GT
  212. FfElement* e22 = NULL; // an element in GT
  213. FfElement* e2w = NULL; // an element in GT
  214. FfElement* eg12 = NULL; // an element in GT
  215. FiniteField* GT = NULL; // Finite field GT(Fq12 )
  216. if (!ctx) {
  217. return kEpidBadArgErr;
  218. }
  219. if (!precomp) {
  220. return kEpidBadArgErr;
  221. }
  222. if (!ctx->e12 || !ctx->e22 || !ctx->e2w || !ctx->eg12 || !ctx->epid2_params ||
  223. !ctx->epid2_params->GT || !ctx->pub_key) {
  224. return kEpidBadArgErr;
  225. }
  226. e12 = ctx->e12;
  227. e22 = ctx->e22;
  228. e2w = ctx->e2w;
  229. eg12 = ctx->eg12;
  230. GT = ctx->epid2_params->GT;
  231. precomp->gid = ctx->pub_key->gid;
  232. result = WriteFfElement(GT, e12, &(precomp->e12), sizeof(precomp->e12));
  233. if (kEpidNoErr != result) {
  234. return result;
  235. }
  236. result = WriteFfElement(GT, e22, &(precomp->e22), sizeof(precomp->e22));
  237. if (kEpidNoErr != result) {
  238. return result;
  239. }
  240. result = WriteFfElement(GT, e2w, &(precomp->e2w), sizeof(precomp->e2w));
  241. if (kEpidNoErr != result) {
  242. return result;
  243. }
  244. result = WriteFfElement(GT, eg12, &(precomp->eg12), sizeof(precomp->eg12));
  245. if (kEpidNoErr != result) {
  246. return result;
  247. }
  248. return result;
  249. }
  250. EpidStatus EpidVerifierSetPrivRl(VerifierCtx* ctx, PrivRl const* priv_rl,
  251. size_t priv_rl_size) {
  252. if (!ctx || !priv_rl || !ctx->pub_key) {
  253. return kEpidBadArgErr;
  254. }
  255. if (!IsPrivRlValid(&ctx->pub_key->gid, priv_rl, priv_rl_size)) {
  256. return kEpidBadArgErr;
  257. }
  258. // Do not set an older version of priv rl
  259. if (ctx->priv_rl) {
  260. unsigned int current_ver = 0;
  261. unsigned int incoming_ver = 0;
  262. current_ver = ntohl(ctx->priv_rl->version);
  263. incoming_ver = ntohl(priv_rl->version);
  264. if (current_ver >= incoming_ver) {
  265. return kEpidBadArgErr;
  266. }
  267. }
  268. ctx->priv_rl = priv_rl;
  269. return kEpidNoErr;
  270. }
  271. EpidStatus EpidVerifierSetSigRl(VerifierCtx* ctx, SigRl const* sig_rl,
  272. size_t sig_rl_size) {
  273. if (!ctx || !sig_rl || !ctx->pub_key) {
  274. return kEpidBadArgErr;
  275. }
  276. if (!IsSigRlValid(&ctx->pub_key->gid, sig_rl, sig_rl_size)) {
  277. return kEpidBadArgErr;
  278. }
  279. // Do not set an older version of sig rl
  280. if (ctx->sig_rl) {
  281. unsigned int current_ver = 0;
  282. unsigned int incoming_ver = 0;
  283. current_ver = ntohl(ctx->sig_rl->version);
  284. incoming_ver = ntohl(sig_rl->version);
  285. if (current_ver >= incoming_ver) {
  286. return kEpidBadArgErr;
  287. }
  288. }
  289. ctx->sig_rl = sig_rl;
  290. return kEpidNoErr;
  291. }
  292. EpidStatus EpidVerifierSetGroupRl(VerifierCtx* ctx, GroupRl const* grp_rl,
  293. size_t grp_rl_size) {
  294. if (!ctx || !grp_rl || !ctx->pub_key) {
  295. return kEpidBadArgErr;
  296. }
  297. if (!IsGroupRlValid(grp_rl, grp_rl_size)) {
  298. return kEpidBadArgErr;
  299. }
  300. // Do not set an older version of group rl
  301. if (ctx->group_rl) {
  302. unsigned int current_ver = 0;
  303. unsigned int incoming_ver = 0;
  304. current_ver = ntohl(ctx->group_rl->version);
  305. incoming_ver = ntohl(grp_rl->version);
  306. if (current_ver >= incoming_ver) {
  307. return kEpidBadArgErr;
  308. }
  309. }
  310. ctx->group_rl = grp_rl;
  311. return kEpidNoErr;
  312. }
  313. EpidStatus EpidVerifierSetVerifierRl(VerifierCtx* ctx, VerifierRl const* ver_rl,
  314. size_t ver_rl_size) {
  315. VerifierRl* verifier_rl = NULL;
  316. EpidStatus res = kEpidErr;
  317. EcPoint* B = NULL;
  318. bool cmp_result = false;
  319. EcGroup* G1 = NULL;
  320. if (!ctx || !ver_rl || !ctx->pub_key || !ctx->epid2_params ||
  321. !ctx->epid2_params->G1) {
  322. return kEpidBadArgErr;
  323. }
  324. if (!IsVerifierRlValid(&ctx->pub_key->gid, ver_rl, ver_rl_size)) {
  325. return kEpidBadArgErr;
  326. }
  327. // if random basename
  328. if (!ctx->basename_hash) {
  329. return kEpidInconsistentBasenameSetErr;
  330. }
  331. // Do not set an older version of verifier rl
  332. if (ctx->verifier_rl) {
  333. unsigned int current_ver = 0;
  334. unsigned int incoming_ver = 0;
  335. current_ver = ntohl(ctx->verifier_rl->version);
  336. incoming_ver = ntohl(ver_rl->version);
  337. if (current_ver >= incoming_ver) {
  338. return kEpidBadArgErr;
  339. }
  340. }
  341. do {
  342. G1 = ctx->epid2_params->G1;
  343. res = NewEcPoint(G1, &B);
  344. BREAK_ON_EPID_ERROR(res);
  345. res = ReadEcPoint(G1, &(ver_rl->B), sizeof(ver_rl->B), B);
  346. BREAK_ON_EPID_ERROR(res);
  347. // verify B = G1.hash(bsn)
  348. res = EcIsEqual(G1, ctx->basename_hash, B, &cmp_result);
  349. BREAK_ON_EPID_ERROR(res);
  350. if (true != cmp_result) {
  351. res = kEpidBadArgErr;
  352. break;
  353. }
  354. verifier_rl = SAFE_ALLOC(ver_rl_size);
  355. if (!verifier_rl) {
  356. res = kEpidMemAllocErr;
  357. break;
  358. }
  359. if (0 != memcpy_S(verifier_rl, ver_rl_size, ver_rl, ver_rl_size)) {
  360. res = kEpidBadArgErr;
  361. break;
  362. }
  363. res = kEpidNoErr;
  364. } while (0);
  365. DeleteEcPoint(&B);
  366. SAFE_FREE(ctx->verifier_rl);
  367. if (kEpidNoErr == res) {
  368. ctx->verifier_rl = verifier_rl;
  369. ctx->was_verifier_rl_updated = false;
  370. }
  371. return res;
  372. }
  373. size_t EpidGetVerifierRlSize(VerifierCtx const* ctx) {
  374. size_t empty_size = 0;
  375. if (!ctx || !ctx->basename_hash) return 0;
  376. empty_size = sizeof(VerifierRl) - sizeof(((VerifierRl*)0)->K[0]);
  377. if (!ctx->verifier_rl) return empty_size;
  378. return empty_size +
  379. ntohl(ctx->verifier_rl->n4) * sizeof(ctx->verifier_rl->K[0]);
  380. }
  381. EpidStatus EpidWriteVerifierRl(VerifierCtx const* ctx, VerifierRl* ver_rl,
  382. size_t ver_rl_size) {
  383. EpidStatus res = kEpidErr;
  384. size_t real_ver_rl_size = 0;
  385. if (!ctx || !ver_rl || !ctx->pub_key || !ctx->epid2_params ||
  386. !ctx->epid2_params->G1) {
  387. return kEpidBadArgErr;
  388. }
  389. real_ver_rl_size = EpidGetVerifierRlSize(ctx);
  390. if (real_ver_rl_size == 0) {
  391. return kEpidErr;
  392. }
  393. if (real_ver_rl_size != ver_rl_size) {
  394. return kEpidBadArgErr;
  395. }
  396. if (ctx->verifier_rl) {
  397. // serialize
  398. if (0 !=
  399. memcpy_S(ver_rl, ver_rl_size, ctx->verifier_rl, real_ver_rl_size)) {
  400. return kEpidBadArgErr;
  401. }
  402. // update rl version if it has changed
  403. if (ctx->was_verifier_rl_updated) {
  404. uint32_t prior_rl_version = ntohl(ver_rl->version);
  405. *((uint32_t*)(&ver_rl->version)) = htonl(prior_rl_version + 1);
  406. ((VerifierCtx*)ctx)->was_verifier_rl_updated = false;
  407. }
  408. } else {
  409. // write empty rl
  410. res = WriteEcPoint(ctx->epid2_params->G1, ctx->basename_hash, &(ver_rl->B),
  411. sizeof(ver_rl->B));
  412. if (kEpidNoErr != res) {
  413. return res;
  414. }
  415. ver_rl->gid = ctx->pub_key->gid;
  416. memset(&ver_rl->version, 0, sizeof(ver_rl->version));
  417. memset(&ver_rl->n4, 0, sizeof(ver_rl->n4));
  418. }
  419. return kEpidNoErr;
  420. }
  421. EpidStatus EpidBlacklistSig(VerifierCtx* ctx, EpidSignature const* sig,
  422. size_t sig_len, void const* msg, size_t msg_len) {
  423. EpidStatus result = kEpidErr;
  424. VerifierRl* ver_rl = NULL;
  425. if (!ctx || !sig || (!msg && msg_len > 0) || !ctx->epid2_params ||
  426. !ctx->epid2_params->G1) {
  427. return kEpidBadArgErr;
  428. }
  429. if (sig_len < sizeof(EpidSignature) - sizeof(((EpidSignature*)0)->sigma[0])) {
  430. return kEpidBadArgErr;
  431. }
  432. if (!ctx->basename_hash) {
  433. return kEpidInconsistentBasenameSetErr;
  434. }
  435. do {
  436. EcGroup* G1 = ctx->epid2_params->G1;
  437. uint32_t n4 = 0;
  438. result = EpidVerify(ctx, sig, sig_len, msg, msg_len);
  439. BREAK_ON_EPID_ERROR(result);
  440. if (!ctx->verifier_rl) {
  441. ver_rl = SAFE_ALLOC(sizeof(VerifierRl));
  442. if (!ver_rl) {
  443. result = kEpidMemAllocErr;
  444. break;
  445. }
  446. // write empty rl
  447. ver_rl->gid = ctx->pub_key->gid;
  448. result =
  449. WriteEcPoint(G1, ctx->basename_hash, &(ver_rl->B), sizeof(ver_rl->B));
  450. BREAK_ON_EPID_ERROR(result);
  451. } else {
  452. uint32_t prior_rl_version = ntohl(ctx->verifier_rl->version);
  453. n4 = ntohl(ctx->verifier_rl->n4);
  454. if (prior_rl_version == UINT32_MAX || n4 == UINT32_MAX) {
  455. result = kEpidBadArgErr;
  456. break;
  457. }
  458. ver_rl = SAFE_REALLOC(
  459. ctx->verifier_rl,
  460. EpidGetVerifierRlSize(ctx) + sizeof(((VerifierRl*)0)->K[0]));
  461. if (!ver_rl) {
  462. result = kEpidMemAllocErr;
  463. break;
  464. }
  465. }
  466. ctx->was_verifier_rl_updated = true;
  467. ++n4;
  468. ver_rl->K[n4 - 1] = sig->sigma0.K;
  469. *((uint32_t*)(&ver_rl->n4)) = htonl(n4);
  470. ctx->verifier_rl = ver_rl;
  471. result = kEpidNoErr;
  472. } while (0);
  473. if (kEpidNoErr != result) SAFE_FREE(ver_rl);
  474. return result;
  475. }
  476. EpidStatus EpidVerifierSetHashAlg(VerifierCtx* ctx, HashAlg hash_alg) {
  477. EpidStatus result = kEpidErr;
  478. if (!ctx) {
  479. return kEpidBadArgErr;
  480. }
  481. if (kSha256 != hash_alg && kSha384 != hash_alg && kSha512 != hash_alg &&
  482. kSha512_256 != hash_alg)
  483. return kEpidBadArgErr;
  484. if (ctx->hash_alg != hash_alg) {
  485. HashAlg previous_hash_alg = ctx->hash_alg;
  486. ctx->hash_alg = hash_alg;
  487. result = EpidVerifierSetBasename(ctx, ctx->basename, ctx->basename_len);
  488. if (kEpidNoErr != result) {
  489. ctx->hash_alg = previous_hash_alg;
  490. return result;
  491. }
  492. }
  493. result = kEpidNoErr;
  494. return result;
  495. }
  496. EpidStatus EpidVerifierSetBasename(VerifierCtx* ctx, void const* basename,
  497. size_t basename_len) {
  498. EpidStatus result = kEpidErr;
  499. EcPoint* basename_hash = NULL;
  500. uint8_t* basename_buffer = NULL;
  501. if (!ctx || !ctx->epid2_params || !ctx->epid2_params->G1) {
  502. return kEpidBadArgErr;
  503. }
  504. if (!basename && basename_len > 0) {
  505. return kEpidBadArgErr;
  506. }
  507. if (!basename) {
  508. DeleteEcPoint(&ctx->basename_hash);
  509. ctx->basename_hash = NULL;
  510. ctx->was_verifier_rl_updated = false;
  511. SAFE_FREE(ctx->basename);
  512. ctx->basename_len = 0;
  513. return kEpidNoErr;
  514. }
  515. do {
  516. size_t i = 0;
  517. EcGroup* G1 = ctx->epid2_params->G1;
  518. result = NewEcPoint(G1, &basename_hash);
  519. if (kEpidNoErr != result) {
  520. break;
  521. }
  522. result =
  523. EcHash(G1, basename, basename_len, ctx->hash_alg, basename_hash, NULL);
  524. if (kEpidNoErr != result) {
  525. break;
  526. }
  527. if (basename_len > 0) {
  528. basename_buffer = SAFE_ALLOC(basename_len);
  529. if (!basename_buffer) {
  530. result = kEpidMemAllocErr;
  531. break;
  532. }
  533. }
  534. SAFE_FREE(ctx->verifier_rl);
  535. DeleteEcPoint(&ctx->basename_hash);
  536. ctx->basename_hash = basename_hash;
  537. SAFE_FREE(ctx->basename);
  538. ctx->basename = basename_buffer;
  539. ctx->basename_len = basename_len;
  540. for (i = 0; i < basename_len; i++) {
  541. ctx->basename[i] = ((uint8_t*)basename)[i];
  542. }
  543. result = kEpidNoErr;
  544. } while (0);
  545. if (kEpidNoErr != result) {
  546. DeleteEcPoint(&basename_hash);
  547. SAFE_FREE(basename_buffer);
  548. }
  549. return result;
  550. }
  551. static EpidStatus DoPrecomputation(VerifierCtx* ctx) {
  552. EpidStatus result = kEpidErr;
  553. FfElement* e12 = NULL;
  554. FfElement* e22 = NULL;
  555. FfElement* e2w = NULL;
  556. FfElement* eg12 = NULL;
  557. Epid2Params_* params = NULL;
  558. GroupPubKey_* pub_key = NULL;
  559. PairingState* ps_ctx = NULL;
  560. if (!ctx) {
  561. return kEpidBadArgErr;
  562. }
  563. if (!ctx->epid2_params || !ctx->epid2_params->GT ||
  564. !ctx->epid2_params->pairing_state || !ctx->pub_key || !ctx->e12 ||
  565. !ctx->e22 || !ctx->e2w || !ctx->eg12) {
  566. return kEpidBadArgErr;
  567. }
  568. pub_key = ctx->pub_key;
  569. params = ctx->epid2_params;
  570. e12 = ctx->e12;
  571. e22 = ctx->e22;
  572. e2w = ctx->e2w;
  573. eg12 = ctx->eg12;
  574. ps_ctx = params->pairing_state;
  575. // do precomputation
  576. // 1. The verifier computes e12 = pairing(h1, g2).
  577. result = Pairing(ps_ctx, pub_key->h1, params->g2, e12);
  578. if (kEpidNoErr != result) {
  579. return result;
  580. }
  581. // 2. The verifier computes e22 = pairing(h2, g2).
  582. result = Pairing(ps_ctx, pub_key->h2, params->g2, e22);
  583. if (kEpidNoErr != result) {
  584. return result;
  585. }
  586. // 3. The verifier computes e2w = pairing(h2, w).
  587. result = Pairing(ps_ctx, pub_key->h2, pub_key->w, e2w);
  588. if (kEpidNoErr != result) {
  589. return result;
  590. }
  591. // 4. The verifier computes eg12 = pairing(g1, g2).
  592. result = Pairing(ps_ctx, params->g1, params->g2, eg12);
  593. if (kEpidNoErr != result) {
  594. return result;
  595. }
  596. return kEpidNoErr;
  597. }
  598. static EpidStatus ReadPrecomputation(VerifierPrecomp const* precomp_str,
  599. VerifierCtx* ctx) {
  600. EpidStatus result = kEpidErr;
  601. FfElement* e12 = NULL;
  602. FfElement* e22 = NULL;
  603. FfElement* e2w = NULL;
  604. FfElement* eg12 = NULL;
  605. FiniteField* GT = NULL;
  606. Epid2Params_* params = NULL;
  607. if (!ctx) {
  608. return kEpidBadArgErr;
  609. }
  610. if (!ctx->epid2_params || !ctx->epid2_params->GT || !ctx->e12 || !ctx->e22 ||
  611. !ctx->e2w || !ctx->eg12 || !ctx->pub_key) {
  612. return kEpidBadArgErr;
  613. }
  614. if (0 !=
  615. memcmp(&precomp_str->gid, &ctx->pub_key->gid, sizeof(precomp_str->gid))) {
  616. return kEpidBadArgErr;
  617. }
  618. params = ctx->epid2_params;
  619. GT = params->GT;
  620. e12 = ctx->e12;
  621. e22 = ctx->e22;
  622. e2w = ctx->e2w;
  623. eg12 = ctx->eg12;
  624. result = ReadFfElement(GT, &precomp_str->e12, sizeof(precomp_str->e12), e12);
  625. if (kEpidNoErr != result) {
  626. return result;
  627. }
  628. result = ReadFfElement(GT, &precomp_str->e22, sizeof(precomp_str->e22), e22);
  629. if (kEpidNoErr != result) {
  630. return result;
  631. }
  632. result = ReadFfElement(GT, &precomp_str->e2w, sizeof(precomp_str->e2w), e2w);
  633. if (kEpidNoErr != result) {
  634. return result;
  635. }
  636. result =
  637. ReadFfElement(GT, &precomp_str->eg12, sizeof(precomp_str->eg12), eg12);
  638. if (kEpidNoErr != result) {
  639. return result;
  640. }
  641. return kEpidNoErr;
  642. }