nrverify-test.cc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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 NrVerify unit tests.
  19. */
  20. #include "gtest/gtest.h"
  21. extern "C" {
  22. #include "epid/verifier/api.h"
  23. }
  24. #include "epid/verifier/unittests/verifier-testhelper.h"
  25. #include "epid/common-testhelper/verifier_wrapper-testhelper.h"
  26. #include "epid/common-testhelper/errors-testhelper.h"
  27. namespace {
  28. /////////////////////////////////////////////////////////////////////////
  29. // Simple Errors
  30. TEST_F(EpidVerifierTest, NrVerifyFailsGivenNullParameters) {
  31. VerifierCtxObj verifier(this->kGrp01Key);
  32. EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
  33. this->kSigGrp01Member0Sha256RandombaseTest0.data());
  34. SigRl const* sig_rl =
  35. reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
  36. EXPECT_EQ(kEpidBadArgErr,
  37. EpidNrVerify(nullptr, &epid_signature->sigma0, this->kTest0.data(),
  38. this->kTest0.size(), &sig_rl->bk[0],
  39. &epid_signature->sigma[0]));
  40. EXPECT_EQ(kEpidBadArgErr, EpidNrVerify(verifier, nullptr, this->kTest0.data(),
  41. this->kTest0.size(), &sig_rl->bk[0],
  42. &epid_signature->sigma[0]));
  43. EXPECT_EQ(kEpidBadArgErr,
  44. EpidNrVerify(verifier, &epid_signature->sigma0, nullptr,
  45. this->kTest0.size(), &sig_rl->bk[0],
  46. &epid_signature->sigma[0]));
  47. EXPECT_EQ(
  48. kEpidBadArgErr,
  49. EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
  50. this->kTest0.size(), nullptr, &epid_signature->sigma[0]));
  51. EXPECT_EQ(kEpidBadArgErr,
  52. EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
  53. this->kTest0.size(), &sig_rl->bk[0], nullptr));
  54. }
  55. /////////////////////////////////////////////////////////////////////
  56. // Reject
  57. TEST_F(EpidVerifierTest, NrVerifyRejectsSigWithTNotInG1) {
  58. // * 4.2.2 step 1 - The verifier verifies that G1.inGroup(T) = true.
  59. // result must be kEpidBadArgErr
  60. VerifierCtxObj verifier(this->kGrp01Key);
  61. EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
  62. this->kSigGrp01Member0Sha256RandombaseTest0.data());
  63. SigRl const* sig_rl =
  64. reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
  65. NrProof nr_proof = epid_signature->sigma[0];
  66. nr_proof.T.x.data.data[0]++;
  67. EXPECT_EQ(kEpidBadArgErr,
  68. EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
  69. this->kTest0.size(), &sig_rl->bk[0], &nr_proof));
  70. }
  71. TEST_F(EpidVerifierTest, NrVerifyRejectsSigWithTIdentityOfG1) {
  72. // * 4.2.2 step 2 - The verifier verifies that G1.isIdentity(T) = false.
  73. // result must be kEpidBadArgErr
  74. VerifierCtxObj verifier(this->kGrp01Key);
  75. EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
  76. this->kSigGrp01Member0Sha256RandombaseTest0.data());
  77. SigRl const* sig_rl =
  78. reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
  79. NrProof nr_proof = epid_signature->sigma[0];
  80. nr_proof.T = this->kG1IdentityStr;
  81. EXPECT_EQ(kEpidBadArgErr,
  82. EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
  83. this->kTest0.size(), &sig_rl->bk[0], &nr_proof));
  84. }
  85. TEST_F(EpidVerifierTest, NrVerifyRejectsSigWithCNotInRange) {
  86. // * 4.2.2 step 3 - The verifier verifies that c, smu, snu in [0, p-1].
  87. // result must be kEpidBadArgErr
  88. VerifierCtxObj verifier(this->kGrp01Key);
  89. EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
  90. this->kSigGrp01Member0Sha256RandombaseTest0.data());
  91. SigRl const* sig_rl =
  92. reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
  93. NrProof nr_proof = epid_signature->sigma[0];
  94. nr_proof.c.data = this->kParamsStr.p.data;
  95. EXPECT_EQ(kEpidBadArgErr,
  96. EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
  97. this->kTest0.size(), &sig_rl->bk[0], &nr_proof));
  98. }
  99. TEST_F(EpidVerifierTest, NrVerifyRejectsSigWithSmuNotInRange) {
  100. // * 4.2.2 step 3 - The verifier verifies that c, smu, snu in [0, p-1].
  101. // result must be kEpidBadArgErr
  102. VerifierCtxObj verifier(this->kGrp01Key);
  103. EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
  104. this->kSigGrp01Member0Sha256RandombaseTest0.data());
  105. SigRl const* sig_rl =
  106. reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
  107. NrProof nr_proof = epid_signature->sigma[0];
  108. nr_proof.smu.data = this->kParamsStr.p.data;
  109. EXPECT_EQ(kEpidBadArgErr,
  110. EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
  111. this->kTest0.size(), &sig_rl->bk[0], &nr_proof));
  112. }
  113. TEST_F(EpidVerifierTest, NrVerifyRejectsSigWithSnuNotInRange) {
  114. // * 4.2.2 step 3 - The verifier verifies that c, smu, snu in [0, p-1].
  115. // result must be kEpidBadArgErr
  116. VerifierCtxObj verifier(this->kGrp01Key);
  117. EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
  118. this->kSigGrp01Member0Sha256RandombaseTest0.data());
  119. SigRl const* sig_rl =
  120. reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
  121. NrProof nr_proof = epid_signature->sigma[0];
  122. nr_proof.snu.data = this->kParamsStr.p.data;
  123. EXPECT_EQ(kEpidBadArgErr,
  124. EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
  125. this->kTest0.size(), &sig_rl->bk[0], &nr_proof));
  126. }
  127. // 4.2.2 step 4 - The verifier computes nc = (- c) mod p.
  128. // This Step is not testable
  129. // 4.2.2 step 5 - The verifier computes R1 = G1.multiExp(K, smu, B, snu).
  130. // This Step is not testable
  131. // 4.2.2 step 6 - The verifier computes R2 = G1.multiExp(K', smu, B', snu,
  132. // T, nc).
  133. // This Step is not testable
  134. TEST_F(EpidVerifierTest, NrVerifyRejectsSigWithInvalidCommitment) {
  135. // * 4.2.2 step 7 - The verifier verifies c = Fp.hash(p || g1 || B || K ||
  136. // B' || K' || T || R1 || R2 || m).
  137. // Refer to Section 7.1 for hash operation over a
  138. // prime field.
  139. // result must be kEpidBadArgErr
  140. VerifierCtxObj verifier(this->kGrp01Key);
  141. EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
  142. this->kSigGrp01Member0Sha256RandombaseTest0.data());
  143. SigRl const* sig_rl =
  144. reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
  145. std::vector<uint8_t> test_msg = this->kTest0;
  146. test_msg[0]++;
  147. EXPECT_EQ(
  148. kEpidBadArgErr,
  149. EpidNrVerify(verifier, &epid_signature->sigma0, test_msg.data(),
  150. test_msg.size(), &sig_rl->bk[0], &epid_signature->sigma[0]));
  151. }
  152. TEST_F(EpidVerifierTest, NrVerifyRejectsSigWithValidCommitmentDiffHashAlg) {
  153. // * 4.2.2 step 7 - The verifier verifies c = Fp.hash(p || g1 || B || K ||
  154. // B' || K' || T || R1 || R2 || m).
  155. // Refer to Section 7.1 for hash operation over a
  156. // prime field.
  157. // result must be kEpidBadArgErr
  158. VerifierCtxObj verifier(this->kGrp01Key);
  159. EpidSignature const* epid_signature_sha256 =
  160. reinterpret_cast<EpidSignature const*>(
  161. this->kSigGrp01Member0Sha256RandombaseTest0.data());
  162. EpidSignature const* epid_signature_sha384 =
  163. reinterpret_cast<EpidSignature const*>(
  164. this->kSigGrp01Member0Sha384RandombaseTest0.data());
  165. SigRl const* sig_rl =
  166. reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
  167. THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha384));
  168. EXPECT_EQ(kEpidBadArgErr,
  169. EpidNrVerify(verifier, &epid_signature_sha256->sigma0,
  170. this->kTest0.data(), this->kTest0.size(),
  171. &sig_rl->bk[0], &epid_signature_sha256->sigma[0]));
  172. THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512));
  173. EXPECT_EQ(kEpidBadArgErr,
  174. EpidNrVerify(verifier, &epid_signature_sha384->sigma0,
  175. this->kTest0.data(), this->kTest0.size(),
  176. &sig_rl->bk[0], &epid_signature_sha384->sigma[0]));
  177. }
  178. /////////////////////////////////////////////////////////////////////
  179. // Accept
  180. // 4.2.2 step 8 - If all the above verifications succeed, the verifier
  181. // outputs true. If any of the above verifications fails,
  182. // the verifier aborts and outputs false
  183. TEST_F(EpidVerifierTest, NrVerifyAcceptsSigWithRandomBaseNameSha256) {
  184. VerifierCtxObj verifier(this->kGrp01Key);
  185. EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
  186. this->kSigGrp01Member0Sha256RandombaseTest0.data());
  187. SigRl const* sig_rl =
  188. reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
  189. THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
  190. EXPECT_EQ(kEpidSigValid,
  191. EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
  192. this->kTest0.size(), &sig_rl->bk[0],
  193. &epid_signature->sigma[0]));
  194. }
  195. TEST_F(EpidVerifierTest,
  196. NrVerifyAcceptsSigWithRandomBaseNameSha256UsingIkgfData) {
  197. VerifierCtxObj verifier(this->kPubKeyIkgfStr);
  198. EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
  199. this->kSigMember0Sha256RandombaseMsg0Ikgf.data());
  200. SigRl const* sig_rl = reinterpret_cast<SigRl const*>(this->kSigRlIkgf.data());
  201. THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha256));
  202. EXPECT_EQ(kEpidSigValid,
  203. EpidNrVerify(verifier, &epid_signature->sigma0, this->kMsg0.data(),
  204. this->kMsg0.size(), &sig_rl->bk[2],
  205. &epid_signature->sigma[2]));
  206. }
  207. TEST_F(EpidVerifierTest, NrVerifyAcceptsSigWithRandomBaseNameSha384) {
  208. VerifierCtxObj verifier(this->kGrp01Key);
  209. EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
  210. this->kSigGrp01Member0Sha384RandombaseTest0.data());
  211. SigRl const* sig_rl =
  212. reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
  213. THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha384));
  214. EXPECT_EQ(kEpidSigValid,
  215. EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
  216. this->kTest0.size(), &sig_rl->bk[0],
  217. &epid_signature->sigma[0]));
  218. }
  219. TEST_F(EpidVerifierTest, NrVerifyAcceptsSigWithRandomBaseNameSha512) {
  220. VerifierCtxObj verifier(this->kGrp01Key);
  221. EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
  222. this->kSigGrp01Member0Sha512RandombaseTest0.data());
  223. SigRl const* sig_rl =
  224. reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
  225. THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512));
  226. EXPECT_EQ(kEpidSigValid,
  227. EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest0.data(),
  228. this->kTest0.size(), &sig_rl->bk[0],
  229. &epid_signature->sigma[0]));
  230. }
  231. TEST_F(EpidVerifierTest,
  232. DISABLED_NrVerifyAcceptsSigWithRandomBaseNameSha512256) {
  233. VerifierCtxObj verifier(this->kGrp01Key);
  234. EpidSignature const* epid_signature = reinterpret_cast<EpidSignature const*>(
  235. this->kSigGrp01Member0Sha512256RandombaseTest1.data());
  236. SigRl const* sig_rl =
  237. reinterpret_cast<SigRl const*>(this->kGrp01SigRl.data());
  238. THROW_ON_EPIDERR(EpidVerifierSetHashAlg(verifier, kSha512_256));
  239. EXPECT_EQ(kEpidSigValid,
  240. EpidNrVerify(verifier, &epid_signature->sigma0, this->kTest1.data(),
  241. this->kTest1.size(), &sig_rl->bk[0],
  242. &epid_signature->sigma[0]));
  243. }
  244. } // namespace