nrverify-test.cc 13 KB

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