context.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. /*############################################################################
  2. # Copyright 2016 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 Member context implementation.
  19. */
  20. #include <string.h>
  21. #include "epid/member/api.h"
  22. #include "epid/member/src/context.h"
  23. #include "epid/member/src/privkey.h"
  24. #include "epid/common/src/memory.h"
  25. /// Perform pre-computation and store in context
  26. static EpidStatus DoPrecomputation(MemberCtx* ctx);
  27. /// Read Member precomp
  28. static EpidStatus ReadPrecomputation(MemberPrecomp const* precomp_str,
  29. MemberCtx* ctx);
  30. EpidStatus EpidMemberCreate(GroupPubKey const* pub_key, PrivKey const* priv_key,
  31. MemberPrecomp const* precomp, BitSupplier rnd_func,
  32. void* rnd_param, MemberCtx** ctx) {
  33. EpidStatus result = kEpidErr;
  34. MemberCtx* member_ctx = NULL;
  35. if (!pub_key || !priv_key || !rnd_func || !ctx) {
  36. return kEpidBadArgErr;
  37. }
  38. // The member verifies that gid in public key and in private key
  39. // match. If mismatch, abort and return operation failed.
  40. if (memcmp(&pub_key->gid, &priv_key->gid, sizeof(GroupId))) {
  41. return kEpidBadArgErr;
  42. }
  43. // Allocate memory for VerifierCtx
  44. member_ctx = SAFE_ALLOC(sizeof(MemberCtx));
  45. if (!member_ctx) {
  46. return kEpidMemAllocErr;
  47. }
  48. do {
  49. // set the default hash algorithm to sha512
  50. member_ctx->hash_alg = kSha512;
  51. // Internal representation of Epid2Params
  52. result = CreateEpid2Params(&member_ctx->epid2_params);
  53. if (kEpidNoErr != result) {
  54. break;
  55. }
  56. // Internal representation of Group Pub Key
  57. result =
  58. CreateGroupPubKey(pub_key, member_ctx->epid2_params->G1,
  59. member_ctx->epid2_params->G2, &member_ctx->pub_key);
  60. if (kEpidNoErr != result) {
  61. break;
  62. }
  63. // Internal representation of Member Priv Key
  64. result = CreatePrivKey(priv_key, member_ctx->epid2_params->G1,
  65. member_ctx->epid2_params->Fp, &member_ctx->priv_key);
  66. if (kEpidNoErr != result) {
  67. break;
  68. }
  69. // Allocate member_ctx->e12
  70. result = NewFfElement(member_ctx->epid2_params->GT, &member_ctx->e12);
  71. if (kEpidNoErr != result) {
  72. break;
  73. }
  74. // Allocate member_ctx->e22
  75. result = NewFfElement(member_ctx->epid2_params->GT, &member_ctx->e22);
  76. if (kEpidNoErr != result) {
  77. break;
  78. }
  79. // Allocate member_ctx->e2w
  80. result = NewFfElement(member_ctx->epid2_params->GT, &member_ctx->e2w);
  81. if (kEpidNoErr != result) {
  82. break;
  83. }
  84. // Allocate member_ctx->ea2
  85. result = NewFfElement(member_ctx->epid2_params->GT, &member_ctx->ea2);
  86. if (kEpidNoErr != result) {
  87. break;
  88. }
  89. // precomputation
  90. if (precomp != NULL) {
  91. result = ReadPrecomputation(precomp, member_ctx);
  92. } else {
  93. result = DoPrecomputation(member_ctx);
  94. }
  95. if (kEpidNoErr != result) {
  96. break;
  97. }
  98. result = SetKeySpecificCommitValues(pub_key, &member_ctx->commit_values);
  99. if (kEpidNoErr != result) {
  100. break;
  101. }
  102. member_ctx->rnd_func = rnd_func;
  103. member_ctx->rnd_param = rnd_param;
  104. member_ctx->allowed_basenames = NULL;
  105. if (!CreateStack(sizeof(PreComputedSignature), &member_ctx->presigs)) {
  106. result = kEpidMemAllocErr;
  107. break;
  108. }
  109. *ctx = member_ctx;
  110. result = kEpidNoErr;
  111. } while (0);
  112. if (kEpidNoErr != result) {
  113. DeleteFfElement(&member_ctx->ea2);
  114. DeleteFfElement(&member_ctx->e2w);
  115. DeleteFfElement(&member_ctx->e22);
  116. DeleteFfElement(&member_ctx->e12);
  117. DeleteEpid2Params(&member_ctx->epid2_params);
  118. DeleteGroupPubKey(&member_ctx->pub_key);
  119. DeletePrivKey(&member_ctx->priv_key);
  120. DeleteStack(&member_ctx->presigs);
  121. SAFE_FREE(member_ctx);
  122. }
  123. return (result);
  124. }
  125. void EpidMemberDelete(MemberCtx** ctx) {
  126. if (ctx && *ctx) {
  127. DeleteGroupPubKey(&(*ctx)->pub_key);
  128. DeleteFfElement(&(*ctx)->e12);
  129. DeleteFfElement(&(*ctx)->e22);
  130. DeleteFfElement(&(*ctx)->e2w);
  131. DeleteFfElement(&(*ctx)->ea2);
  132. DeleteEpid2Params(&(*ctx)->epid2_params);
  133. DeletePrivKey(&(*ctx)->priv_key);
  134. DeleteBasenames(&(*ctx)->allowed_basenames);
  135. DeleteStack(&(*ctx)->presigs);
  136. SAFE_FREE(*ctx);
  137. }
  138. }
  139. EpidStatus EpidMemberWritePrecomp(MemberCtx const* ctx,
  140. MemberPrecomp* precomp) {
  141. EpidStatus result = kEpidErr;
  142. FfElement* e12 = NULL; // an element in GT
  143. FfElement* e22 = NULL; // an element in GT
  144. FfElement* e2w = NULL; // an element in GT
  145. FfElement* ea2 = NULL; // an element in GT
  146. FiniteField* GT = NULL; // Finite field GT(Fq12 )
  147. if (!ctx) {
  148. return kEpidBadArgErr;
  149. }
  150. if (!precomp) {
  151. return kEpidBadArgErr;
  152. }
  153. if (!ctx->e12 || !ctx->e22 || !ctx->e2w || !ctx->ea2 || !ctx->epid2_params ||
  154. !(ctx->epid2_params->GT)) {
  155. return kEpidBadArgErr;
  156. }
  157. e12 = ctx->e12;
  158. e22 = ctx->e22;
  159. e2w = ctx->e2w;
  160. ea2 = ctx->ea2;
  161. GT = ctx->epid2_params->GT;
  162. result = WriteFfElement(GT, e12, &(precomp->e12), sizeof(precomp->e12));
  163. if (kEpidNoErr != result) {
  164. return result;
  165. }
  166. result = WriteFfElement(GT, e22, &(precomp->e22), sizeof(precomp->e22));
  167. if (kEpidNoErr != result) {
  168. return result;
  169. }
  170. result = WriteFfElement(GT, e2w, &(precomp->e2w), sizeof(precomp->e2w));
  171. if (kEpidNoErr != result) {
  172. return result;
  173. }
  174. result = WriteFfElement(GT, ea2, &(precomp->ea2), sizeof(precomp->ea2));
  175. if (kEpidNoErr != result) {
  176. return result;
  177. }
  178. return result;
  179. }
  180. EpidStatus EpidMemberSetHashAlg(MemberCtx* ctx, HashAlg hash_alg) {
  181. if (!ctx) return kEpidBadArgErr;
  182. if (kSha256 != hash_alg && kSha384 != hash_alg && kSha512 != hash_alg)
  183. return kEpidBadArgErr;
  184. ctx->hash_alg = hash_alg;
  185. return kEpidNoErr;
  186. }
  187. EpidStatus EpidRegisterBaseName(MemberCtx* ctx, void const* basename,
  188. size_t basename_len) {
  189. EpidStatus result = kEpidErr;
  190. if (basename_len == 0) {
  191. return kEpidBadArgErr;
  192. }
  193. if (!ctx || !basename) {
  194. return kEpidBadArgErr;
  195. }
  196. if (ContainsBasename(ctx->allowed_basenames, basename, basename_len)) {
  197. return kEpidDuplicateErr;
  198. }
  199. result = AddBasename(&ctx->allowed_basenames, basename, basename_len);
  200. return result;
  201. }
  202. void DeleteBasenames(AllowedBasename** rootnode) {
  203. if (rootnode && *rootnode) {
  204. AllowedBasename* currentnode = *rootnode;
  205. while (currentnode) {
  206. AllowedBasename* deletenode = currentnode;
  207. currentnode = currentnode->next;
  208. SAFE_FREE(deletenode);
  209. }
  210. *rootnode = NULL;
  211. }
  212. }
  213. EpidStatus AddBasename(AllowedBasename** rootnode, void const* basename,
  214. size_t length) {
  215. EpidStatus result = kEpidErr;
  216. AllowedBasename* newnode = NULL;
  217. AllowedBasename* currentnode = NULL;
  218. if (length > (SIZE_MAX - sizeof(AllowedBasename)) + 1) {
  219. return kEpidBadArgErr;
  220. }
  221. if (!basename) {
  222. return kEpidBadArgErr;
  223. }
  224. newnode = SAFE_ALLOC(sizeof(AllowedBasename) + (length - 1));
  225. if (!newnode) {
  226. return kEpidMemAllocErr;
  227. }
  228. newnode->next = NULL;
  229. newnode->length = length;
  230. // Memory copy is used to copy a flexible array
  231. if (0 != memcpy_S(newnode->name, length, basename, length)) {
  232. SAFE_FREE(newnode);
  233. return kEpidBadArgErr;
  234. }
  235. if (*rootnode == NULL) {
  236. *rootnode = newnode;
  237. return kEpidNoErr;
  238. }
  239. currentnode = *rootnode;
  240. while (currentnode->next != NULL) {
  241. currentnode = currentnode->next;
  242. }
  243. currentnode->next = newnode;
  244. result = kEpidNoErr;
  245. return result;
  246. }
  247. bool ContainsBasename(AllowedBasename const* rootnode, void const* basename,
  248. size_t length) {
  249. if (length != 0) {
  250. while (rootnode != NULL) {
  251. if (rootnode->length == length) {
  252. if (!memcmp(rootnode->name, basename, length)) {
  253. return true;
  254. }
  255. }
  256. rootnode = rootnode->next;
  257. }
  258. }
  259. return false;
  260. }
  261. EpidStatus EpidAddPreSigs(MemberCtx* ctx, size_t number_presigs,
  262. PreComputedSignature* presigs) {
  263. PreComputedSignature* new_presigs;
  264. if (!ctx) return kEpidBadArgErr;
  265. if (!ctx->presigs) return kEpidBadArgErr;
  266. if (0 == number_presigs) return kEpidNoErr;
  267. if (number_presigs > SIZE_MAX / sizeof(PreComputedSignature))
  268. return kEpidBadArgErr; // integer overflow
  269. new_presigs =
  270. (PreComputedSignature*)StackPushN(ctx->presigs, number_presigs, presigs);
  271. if (!new_presigs) return kEpidMemAllocErr;
  272. if (presigs) {
  273. memset(presigs, 0, number_presigs * sizeof(PreComputedSignature));
  274. } else {
  275. size_t i;
  276. for (i = 0; i < number_presigs; i++) {
  277. EpidStatus sts = EpidComputePreSig(ctx, &new_presigs[i]);
  278. if (kEpidNoErr != sts) {
  279. // roll back pre-computed-signature pool
  280. StackPopN(ctx->presigs, number_presigs, 0);
  281. return sts;
  282. }
  283. }
  284. }
  285. return kEpidNoErr;
  286. }
  287. size_t EpidGetNumPreSigs(MemberCtx const* ctx) {
  288. return (ctx && ctx->presigs) ? StackGetSize(ctx->presigs) : (size_t)0;
  289. }
  290. EpidStatus EpidWritePreSigs(MemberCtx* ctx, PreComputedSignature* presigs,
  291. size_t number_presigs) {
  292. if (!ctx || (!presigs && (0 != number_presigs))) return kEpidBadArgErr;
  293. if (!ctx->presigs) return kEpidBadArgErr;
  294. if (0 == number_presigs) return kEpidNoErr;
  295. return StackPopN(ctx->presigs, number_presigs, presigs) ? kEpidNoErr
  296. : kEpidBadArgErr;
  297. }
  298. static EpidStatus DoPrecomputation(MemberCtx* ctx) {
  299. EpidStatus result = kEpidErr;
  300. FfElement* e12 = NULL;
  301. FfElement* e22 = NULL;
  302. FfElement* e2w = NULL;
  303. FfElement* ea2 = NULL;
  304. Epid2Params_* params = NULL;
  305. GroupPubKey_* pub_key = NULL;
  306. PairingState* ps_ctx = NULL;
  307. if (!ctx) {
  308. return kEpidBadArgErr;
  309. }
  310. if (!ctx->epid2_params || !ctx->epid2_params->GT ||
  311. !ctx->epid2_params->pairing_state || !ctx->pub_key || !ctx->priv_key ||
  312. !ctx->e12 || !ctx->e22 || !ctx->e2w || !ctx->ea2) {
  313. return kEpidBadArgErr;
  314. }
  315. pub_key = ctx->pub_key;
  316. params = ctx->epid2_params;
  317. e12 = ctx->e12;
  318. e22 = ctx->e22;
  319. e2w = ctx->e2w;
  320. ea2 = ctx->ea2;
  321. ps_ctx = params->pairing_state;
  322. // do precomputation
  323. // 1. The member computes e12 = pairing(h1, g2).
  324. result = Pairing(ps_ctx, e12, pub_key->h1, params->g2);
  325. if (kEpidNoErr != result) {
  326. return result;
  327. }
  328. // 2. The member computes e22 = pairing(h2, g2).
  329. result = Pairing(ps_ctx, e22, pub_key->h2, params->g2);
  330. if (kEpidNoErr != result) {
  331. return result;
  332. }
  333. // 3. The member computes e2w = pairing(h2, w).
  334. result = Pairing(ps_ctx, e2w, pub_key->h2, pub_key->w);
  335. if (kEpidNoErr != result) {
  336. return result;
  337. }
  338. // 4. The member computes ea2 = pairing(A, g2).
  339. result = Pairing(ps_ctx, ea2, ctx->priv_key->A, params->g2);
  340. if (kEpidNoErr != result) {
  341. return result;
  342. }
  343. return kEpidNoErr;
  344. }
  345. static EpidStatus ReadPrecomputation(MemberPrecomp const* precomp_str,
  346. MemberCtx* ctx) {
  347. EpidStatus result = kEpidErr;
  348. FfElement* e12 = NULL;
  349. FfElement* e22 = NULL;
  350. FfElement* e2w = NULL;
  351. FfElement* ea2 = NULL;
  352. FiniteField* GT = NULL;
  353. Epid2Params_* params = NULL;
  354. if (!ctx || !precomp_str) {
  355. return kEpidBadArgErr;
  356. }
  357. if (!ctx->epid2_params || !ctx->epid2_params->GT || !ctx->e12 || !ctx->e22 ||
  358. !ctx->e2w || !ctx->ea2) {
  359. return kEpidBadArgErr;
  360. }
  361. params = ctx->epid2_params;
  362. GT = params->GT;
  363. e12 = ctx->e12;
  364. e22 = ctx->e22;
  365. e2w = ctx->e2w;
  366. ea2 = ctx->ea2;
  367. result = ReadFfElement(GT, &precomp_str->e12, sizeof(precomp_str->e12), e12);
  368. if (kEpidNoErr != result) {
  369. return result;
  370. }
  371. result = ReadFfElement(GT, &precomp_str->e22, sizeof(precomp_str->e22), e22);
  372. if (kEpidNoErr != result) {
  373. return result;
  374. }
  375. result = ReadFfElement(GT, &precomp_str->e2w, sizeof(precomp_str->e2w), e2w);
  376. if (kEpidNoErr != result) {
  377. return result;
  378. }
  379. result = ReadFfElement(GT, &precomp_str->ea2, sizeof(precomp_str->ea2), ea2);
  380. if (kEpidNoErr != result) {
  381. return result;
  382. }
  383. return kEpidNoErr;
  384. }