context-test.cc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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 unit tests.
  19. */
  20. #include <cstring>
  21. #include <vector>
  22. #include "gtest/gtest.h"
  23. #include "epid/common-testhelper/prng-testhelper.h"
  24. #include "epid/member/unittests/member-testhelper.h"
  25. extern "C" {
  26. #include "epid/member/api.h"
  27. #include "epid/member/src/context.h"
  28. }
  29. bool operator==(MemberPrecomp const& lhs, MemberPrecomp const& rhs) {
  30. return 0 == std::memcmp(&lhs, &rhs, sizeof(lhs));
  31. }
  32. namespace {
  33. //////////////////////////////////////////////////////////////////////////
  34. // EpidMemberDelete Tests
  35. TEST_F(EpidMemberTest, DeleteWorksGivenNullMemberCtx) {
  36. EpidMemberDelete(nullptr);
  37. MemberCtx* member_ctx = nullptr;
  38. EpidMemberDelete(&member_ctx);
  39. }
  40. TEST_F(EpidMemberTest, DeleteNullsMemberCtx) {
  41. MemberCtx* ctx = nullptr;
  42. Prng my_prng;
  43. EpidMemberCreate(nullptr, &this->kMemberPrivateKey, &this->kMemberPrecomp,
  44. &Prng::Generate, &my_prng, &ctx);
  45. EpidMemberDelete(&ctx);
  46. EXPECT_EQ(nullptr, ctx);
  47. }
  48. //////////////////////////////////////////////////////////////////////////
  49. // EpidMemberCreate Tests
  50. // test that create fails if any mandatory parameters are NULL
  51. TEST_F(EpidMemberTest, CreateFailsGivenNullParameters) {
  52. MemberCtx* member_ctx = nullptr;
  53. Prng my_prng;
  54. EXPECT_EQ(
  55. kEpidBadArgErr,
  56. EpidMemberCreate(nullptr, &this->kMemberPrivateKey, &this->kMemberPrecomp,
  57. &Prng::Generate, &my_prng, &member_ctx));
  58. EpidMemberDelete(&member_ctx);
  59. EXPECT_EQ(
  60. kEpidBadArgErr,
  61. EpidMemberCreate(&this->kGroupPublicKey, nullptr, &this->kMemberPrecomp,
  62. &Prng::Generate, &my_prng, &member_ctx));
  63. EpidMemberDelete(&member_ctx);
  64. EXPECT_EQ(
  65. kEpidBadArgErr,
  66. EpidMemberCreate(&this->kGroupPublicKey, &this->kMemberPrivateKey,
  67. &this->kMemberPrecomp, nullptr, &my_prng, &member_ctx));
  68. EpidMemberDelete(&member_ctx);
  69. EXPECT_EQ(kEpidBadArgErr,
  70. EpidMemberCreate(&this->kGroupPublicKey, &this->kMemberPrivateKey,
  71. &this->kMemberPrecomp, &Prng::Generate, &my_prng,
  72. nullptr));
  73. EpidMemberDelete(nullptr);
  74. }
  75. // test that create succeeds with valid parameters
  76. TEST_F(EpidMemberTest, CreateSucceedsGivenValidParameters) {
  77. MemberCtx* member_ctx = nullptr;
  78. Prng my_prng;
  79. // pass the whole list of parameters
  80. EXPECT_EQ(kEpidNoErr,
  81. EpidMemberCreate(&this->kGroupPublicKey, &this->kMemberPrivateKey,
  82. &this->kMemberPrecomp, &Prng::Generate, &my_prng,
  83. &member_ctx));
  84. EpidMemberDelete(&member_ctx);
  85. // pass the whole list of parameters but member_precomp
  86. EXPECT_EQ(kEpidNoErr,
  87. EpidMemberCreate(&this->kGroupPublicKey, &this->kMemberPrivateKey,
  88. nullptr, &Prng::Generate, &my_prng, &member_ctx));
  89. EpidMemberDelete(&member_ctx);
  90. }
  91. // test that create succeeds with valid IKGF given parameters
  92. TEST_F(EpidMemberTest, CreateSucceedsGivenValidParametersUsingIKGFData) {
  93. const GroupPubKey grp_public_key = {
  94. #include "epid/common-testhelper/testdata/ikgf/groupa/pubkey.inc"
  95. };
  96. const PrivKey mbr_private_key = {
  97. #include "epid/common-testhelper/testdata/ikgf/groupa/member0/mprivkey.inc"
  98. };
  99. const MemberPrecomp mbr_precomp = {
  100. #include "epid/common-testhelper/testdata/ikgf/groupa/member0/mprecomp.inc"
  101. };
  102. MemberCtx* member_ctx = nullptr;
  103. Prng my_prng;
  104. // pass the whole list of parameters
  105. EXPECT_EQ(kEpidNoErr,
  106. EpidMemberCreate(&grp_public_key, &mbr_private_key, &mbr_precomp,
  107. &Prng::Generate, &my_prng, &member_ctx));
  108. EpidMemberDelete(&member_ctx);
  109. // pass the whole list of parameters but member_precomp
  110. EXPECT_EQ(kEpidNoErr,
  111. EpidMemberCreate(&grp_public_key, &mbr_private_key, nullptr,
  112. &Prng::Generate, &my_prng, &member_ctx));
  113. EpidMemberDelete(&member_ctx);
  114. }
  115. TEST_F(EpidMemberTest, CreateFailsForInvalidGroupPubKey) {
  116. MemberCtx* member_ctx = nullptr;
  117. Prng my_prng;
  118. GroupPubKey gpk_h1 = this->kGroupPublicKey;
  119. gpk_h1.h1.x.data.data[0]++;
  120. EXPECT_EQ(
  121. kEpidBadArgErr,
  122. EpidMemberCreate(&gpk_h1, &this->kMemberPrivateKey, &this->kMemberPrecomp,
  123. &Prng::Generate, &my_prng, &member_ctx));
  124. EpidMemberDelete(&member_ctx);
  125. GroupPubKey gpk_h2 = this->kGroupPublicKey;
  126. gpk_h2.h2.x.data.data[0]++;
  127. EXPECT_EQ(
  128. kEpidBadArgErr,
  129. EpidMemberCreate(&gpk_h2, &this->kMemberPrivateKey, &this->kMemberPrecomp,
  130. &Prng::Generate, &my_prng, &member_ctx));
  131. EpidMemberDelete(&member_ctx);
  132. GroupPubKey gpk_w = this->kGroupPublicKey;
  133. gpk_w.w.x[0].data.data[0]++;
  134. EXPECT_EQ(
  135. kEpidBadArgErr,
  136. EpidMemberCreate(&gpk_w, &this->kMemberPrivateKey, &this->kMemberPrecomp,
  137. &Prng::Generate, &my_prng, &member_ctx));
  138. EpidMemberDelete(&member_ctx);
  139. }
  140. TEST_F(EpidMemberTest, CreateFailsForInvalidPrivateKey) {
  141. MemberCtx* member_ctx = nullptr;
  142. Prng my_prng;
  143. PrivKey pk_A = this->kMemberPrivateKey;
  144. pk_A.A.x.data.data[0]++;
  145. EXPECT_EQ(
  146. kEpidBadArgErr,
  147. EpidMemberCreate(&this->kGroupPublicKey, &pk_A, &this->kMemberPrecomp,
  148. &Prng::Generate, &my_prng, &member_ctx));
  149. EpidMemberDelete(&member_ctx);
  150. }
  151. //////////////////////////////////////////////////////////////////////////
  152. // EpidMemberSetHashAlg
  153. TEST_F(EpidMemberTest, SetHashAlgFailsGivenNullPtr) {
  154. EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(nullptr, kSha256));
  155. }
  156. TEST_F(EpidMemberTest, SetHashAlgCanSetValidAlgorithm) {
  157. Prng my_prng;
  158. MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
  159. &Prng::Generate, &my_prng);
  160. EXPECT_EQ(kEpidNoErr, EpidMemberSetHashAlg(member_ctx, kSha256));
  161. EXPECT_EQ(kEpidNoErr, EpidMemberSetHashAlg(member_ctx, kSha384));
  162. EXPECT_EQ(kEpidNoErr, EpidMemberSetHashAlg(member_ctx, kSha512));
  163. }
  164. TEST_F(EpidMemberTest, SetHashAlgFailsForNonSupportedAlgorithm) {
  165. Prng my_prng;
  166. MemberCtxObj member_ctx(this->kGroupPublicKey, this->kMemberPrivateKey,
  167. &Prng::Generate, &my_prng);
  168. EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(member_ctx, kSha512_256));
  169. EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(member_ctx, kSha3_256));
  170. EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(member_ctx, kSha3_384));
  171. EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(member_ctx, kSha3_512));
  172. EXPECT_EQ(kEpidBadArgErr, EpidMemberSetHashAlg(member_ctx, (HashAlg)-1));
  173. }
  174. //////////////////////////////////////////////////////////////////////////
  175. // EpidRegisterBaseName
  176. TEST_F(EpidMemberTest, RegisterBaseNameFailsGivenNullPtr) {
  177. Prng my_prng;
  178. MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
  179. this->kMemberPrecomp, &Prng::Generate, &my_prng);
  180. std::vector<uint8_t> basename = {'_', 'b', 'a', 's', 'e', 'n', 'a', 'm', 'e'};
  181. EXPECT_EQ(kEpidBadArgErr,
  182. EpidRegisterBaseName(member, nullptr, basename.size()));
  183. EXPECT_EQ(kEpidBadArgErr,
  184. EpidRegisterBaseName(nullptr, basename.data(), basename.size()));
  185. }
  186. TEST_F(EpidMemberTest, RegisterBaseNameFailsGivenDuplicateBaseName) {
  187. Prng my_prng;
  188. MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
  189. this->kMemberPrecomp, &Prng::Generate, &my_prng);
  190. std::vector<uint8_t> basename = {'d', 'b', 'a', 's', 'e', 'n', 'a', 'm', 'e'};
  191. EXPECT_EQ(kEpidNoErr,
  192. EpidRegisterBaseName(member, basename.data(), basename.size()));
  193. EXPECT_EQ(kEpidDuplicateErr,
  194. EpidRegisterBaseName(member, basename.data(), basename.size()));
  195. }
  196. TEST_F(EpidMemberTest, RegisterBaseNameFailsGivenInvalidBaseName) {
  197. Prng my_prng;
  198. MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
  199. this->kMemberPrecomp, &Prng::Generate, &my_prng);
  200. std::vector<uint8_t> basename = {};
  201. std::vector<uint8_t> basename2 = {'b', 's', 'n'};
  202. EXPECT_EQ(kEpidBadArgErr,
  203. EpidRegisterBaseName(member, basename.data(), basename.size()));
  204. EXPECT_EQ(kEpidBadArgErr, EpidRegisterBaseName(member, basename2.data(), 0));
  205. }
  206. TEST_F(EpidMemberTest, RegisterBaseNameSucceedsGivenUniqueBaseName) {
  207. Prng my_prng;
  208. MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
  209. this->kMemberPrecomp, &Prng::Generate, &my_prng);
  210. std::vector<uint8_t> basename = {'b', 's', 'n', '0', '1'};
  211. EXPECT_EQ(kEpidNoErr,
  212. EpidRegisterBaseName(member, basename.data(), basename.size()));
  213. }
  214. //////////////////////////////////////////////////////////////////////////
  215. // EpidMemberWritePrecomp
  216. TEST_F(EpidMemberTest, MemberWritePrecompFailsGivenNullPointer) {
  217. MemberPrecomp precomp;
  218. Prng my_prng;
  219. MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
  220. this->kMemberPrecomp, &Prng::Generate, &my_prng);
  221. MemberCtx* ctx = member;
  222. EXPECT_EQ(kEpidBadArgErr, EpidMemberWritePrecomp(nullptr, &precomp));
  223. EXPECT_EQ(kEpidBadArgErr, EpidMemberWritePrecomp(ctx, nullptr));
  224. }
  225. TEST_F(EpidMemberTest, MemberWritePrecompSucceedGivenValidArgument) {
  226. MemberPrecomp precomp;
  227. Prng my_prng;
  228. MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
  229. this->kMemberPrecomp, &Prng::Generate, &my_prng);
  230. MemberCtx* ctx = member;
  231. EXPECT_EQ(kEpidNoErr, EpidMemberWritePrecomp(ctx, &precomp));
  232. MemberPrecomp expected_precomp = this->kMemberPrecomp;
  233. EXPECT_EQ(expected_precomp, precomp);
  234. MemberCtxObj member2(this->kGroupPublicKey, this->kMemberPrivateKey,
  235. &Prng::Generate, &my_prng);
  236. MemberCtx* ctx2 = member2;
  237. EXPECT_EQ(kEpidNoErr, EpidMemberWritePrecomp(ctx2, &precomp));
  238. EXPECT_EQ(expected_precomp, precomp);
  239. }
  240. TEST_F(EpidMemberTest, DefaultHashAlgIsSha512) {
  241. Prng my_prng;
  242. MemberCtxObj member(this->kGroupPublicKey, this->kMemberPrivateKey,
  243. this->kMemberPrecomp, &Prng::Generate, &my_prng);
  244. MemberCtx* ctx = member;
  245. EXPECT_EQ(kSha512, ctx->hash_alg);
  246. }
  247. } // namespace