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 /*! 18 * \file 19 * \brief Epid11NrVerify unit tests. 20 */ 21 22 #include "epid/common-testhelper/epid_gtest-testhelper.h" 23 #include "gtest/gtest.h" 24 25 extern "C" { 26 #include "epid/common/1.1/types.h" 27 #include "epid/verifier/1.1/api.h" 28 #include "epid/verifier/1.1/src/context.h" 29 } 30 31 #include "epid/common-testhelper/1.1/verifier_wrapper-testhelper.h" 32 #include "epid/common-testhelper/errors-testhelper.h" 33 #include "epid/verifier/1.1/unittests/verifier-testhelper.h" 34 35 namespace { 36 37 ///////////////////////////////////////////////////////////////////////// 38 // Simple Errors 39 40 TEST_F(Epid11VerifierTest, NrVerifyFailsGivenNullParameters) { 41 Epid11VerifierCtxObj verifier(this->kPubKeyStr); 42 Epid11Signature const* epid_signature = 43 reinterpret_cast<Epid11Signature const*>( 44 this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data()); 45 Epid11SigRl const* sig_rl = 46 reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data()); 47 EXPECT_EQ(kEpidBadArgErr, 48 Epid11NrVerify(nullptr, &epid_signature->sigma0, this->kMsg0.data(), 49 this->kMsg0.size(), &sig_rl->bk[0], 50 &epid_signature->sigma[0])); 51 52 EXPECT_EQ( 53 kEpidBadArgErr, 54 Epid11NrVerify(verifier, nullptr, this->kMsg0.data(), this->kMsg0.size(), 55 &sig_rl->bk[0], &epid_signature->sigma[0])); 56 57 EXPECT_EQ(kEpidBadArgErr, 58 Epid11NrVerify(verifier, &epid_signature->sigma0, nullptr, 59 this->kMsg0.size(), &sig_rl->bk[0], 60 &epid_signature->sigma[0])); 61 62 EXPECT_EQ( 63 kEpidBadArgErr, 64 Epid11NrVerify(verifier, &epid_signature->sigma0, this->kMsg0.data(), 65 this->kMsg0.size(), nullptr, &epid_signature->sigma[0])); 66 67 EXPECT_EQ( 68 kEpidBadArgErr, 69 Epid11NrVerify(verifier, &epid_signature->sigma0, this->kMsg0.data(), 70 this->kMsg0.size(), &sig_rl->bk[0], nullptr)); 71 } 72 73 ///////////////////////////////////////////////////////////////////// 74 // Reject 75 TEST_F(Epid11VerifierTest, NrVerifyRejectsTotalMsgSizeOutOfRangeOfInt) { 76 Epid11VerifierCtxObj verifier(this->kPubKeyStr); 77 Epid11Signature const* epid_signature = 78 reinterpret_cast<Epid11Signature const*>( 79 this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data()); 80 Epid11SigRl const* sig_rl = 81 reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data()); 82 // Since before hashing some other data will be concatenated to commit 83 // message, passing msg with size==UINT_MAX is causes out of range for 84 // this concatenated msg 85 Epid11NrProof nr_proof = epid_signature->sigma[0]; 86 EXPECT_EQ(kEpidBadArgErr, Epid11NrVerify(verifier, &epid_signature->sigma0, 87 this->kMsg0.data(), 0xffffffff, 88 &sig_rl->bk[0], &nr_proof)); 89 #if (SIZE_MAX >= 0x100000001) // When size_t value allowed to be 0x100000001 90 EXPECT_EQ(kEpidBadArgErr, Epid11NrVerify(verifier, &epid_signature->sigma0, 91 this->kMsg0.data(), 0x100000001, 92 &sig_rl->bk[0], &nr_proof)); 93 #endif 94 } 95 TEST_F(Epid11VerifierTest, NrVerifyRejectsSigWithTNotInG3) { 96 // 4.2.2 step 2 - The verifier verifies that G3.inGroup(T) = true. 97 Epid11VerifierCtxObj verifier(this->kPubKeyStr); 98 Epid11Signature const* epid_signature = 99 reinterpret_cast<Epid11Signature const*>( 100 this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data()); 101 Epid11SigRl const* sig_rl = 102 reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data()); 103 Epid11NrProof nr_proof = epid_signature->sigma[0]; 104 nr_proof.T.x.data.data[0]++; 105 EXPECT_EQ( 106 kEpidBadArgErr, 107 Epid11NrVerify(verifier, &epid_signature->sigma0, this->kMsg0.data(), 108 this->kMsg0.size(), &sig_rl->bk[0], &nr_proof)); 109 } 110 111 TEST_F(Epid11VerifierTest, NrVerifyRejectsSigWithTIdentityOfG3) { 112 // 4.2.2 step 3 - The verifier verifies that G3.isIdentity(T) = false. 113 Epid11VerifierCtxObj verifier(this->kPubKeyStr); 114 Epid11Signature const* epid_signature = 115 reinterpret_cast<Epid11Signature const*>( 116 this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data()); 117 Epid11SigRl const* sig_rl = 118 reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data()); 119 Epid11NrProof nr_proof = epid_signature->sigma[0]; 120 nr_proof.T = this->kG3IdentityStr; 121 EXPECT_EQ( 122 kEpidBadArgErr, 123 Epid11NrVerify(verifier, &epid_signature->sigma0, this->kMsg0.data(), 124 this->kMsg0.size(), &sig_rl->bk[0], &nr_proof)); 125 } 126 127 TEST_F(Epid11VerifierTest, NrVerifyRejectsSigWithSmuNotInRange) { 128 // 4.2.2 step 4 - The verifier verifies that smu, snu in [0, p'-1]. 129 Epid11VerifierCtxObj verifier(this->kPubKeyStr); 130 Epid11Signature const* epid_signature = 131 reinterpret_cast<Epid11Signature const*>( 132 this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data()); 133 Epid11SigRl const* sig_rl = 134 reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data()); 135 Epid11NrProof nr_proof = epid_signature->sigma[0]; 136 nr_proof.smu.data = this->kParamsStr.p.data; 137 EXPECT_EQ( 138 kEpidBadArgErr, 139 Epid11NrVerify(verifier, &epid_signature->sigma0, this->kMsg0.data(), 140 this->kMsg0.size(), &sig_rl->bk[0], &nr_proof)); 141 } 142 143 TEST_F(Epid11VerifierTest, NrVerifyRejectsSigWithSnuNotInRange) { 144 // 4.2.2 step 4 - The verifier verifies that smu, snu in [0, p'-1]. 145 Epid11VerifierCtxObj verifier(this->kPubKeyStr); 146 Epid11Signature const* epid_signature = 147 reinterpret_cast<Epid11Signature const*>( 148 this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data()); 149 Epid11SigRl const* sig_rl = 150 reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data()); 151 Epid11NrProof nr_proof = epid_signature->sigma[0]; 152 nr_proof.snu.data = this->kParamsStr.p.data; 153 EXPECT_EQ( 154 kEpidBadArgErr, 155 Epid11NrVerify(verifier, &epid_signature->sigma0, this->kMsg0.data(), 156 this->kMsg0.size(), &sig_rl->bk[0], &nr_proof)); 157 } 158 159 // 4.2.2 step 5 - The verifier computes nc = (- c) mod p'. 160 // This Step is not testable 161 162 // 4.2.2 step 6 - The verifier computes R1 = G3.multiExp(K, smu, B, snu). 163 // This Step is not testable 164 165 // 4.2.2 step 7 - The verifier computes R2 = G3.multiExp(K', smu, B', snu, 166 // T, nc). 167 // This Step is not testable 168 169 TEST_F(Epid11VerifierTest, NrVerifyRejectsSigWithInvalidCommitment) { 170 // 4.2.2 step 8 - The verifier verifies c = Hash(p' || g3 || B || K || B' || 171 // K' || T || R1 || R2 || mSize || m). 172 Epid11VerifierCtxObj verifier(this->kPubKeyStr); 173 Epid11Signature const* epid_signature = 174 reinterpret_cast<Epid11Signature const*>( 175 this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data()); 176 Epid11SigRl const* sig_rl = 177 reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data()); 178 std::vector<uint8_t> test_msg = this->kMsg0; 179 test_msg[0]++; 180 EXPECT_EQ(kEpidBadArgErr, 181 Epid11NrVerify(verifier, &epid_signature->sigma0, test_msg.data(), 182 test_msg.size(), &sig_rl->bk[0], 183 &epid_signature->sigma[0])); 184 } 185 186 TEST_F(Epid11VerifierTest, NrVerifyRejectsSigWithMismatchCommitmentSize) { 187 // 4.2.2 step 8 - The verifier verifies c = Hash(p' || g3 || B || K || B' || 188 // K' || T || R1 || R2 || mSize || m). 189 Epid11VerifierCtxObj verifier(this->kPubKeyStr); 190 Epid11Signature const* epid_signature = 191 reinterpret_cast<Epid11Signature const*>( 192 this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data()); 193 Epid11SigRl const* sig_rl = 194 reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data()); 195 std::vector<uint8_t> test_msg = this->kMsg0; 196 EXPECT_EQ(kEpidBadArgErr, 197 Epid11NrVerify(verifier, &epid_signature->sigma0, test_msg.data(), 198 test_msg.size() - 1, &sig_rl->bk[0], 199 &epid_signature->sigma[0])); 200 } 201 ///////////////////////////////////////////////////////////////////// 202 // Accept 203 // 4.2.2 step 9 - If all the above verifications succeed, the verifier 204 // outputs true. If any of the above verifications fails, 205 // the verifier aborts and outputs false 206 207 TEST_F(Epid11VerifierTest, NrVerifyAcceptsSigWithRandomBaseName) { 208 Epid11VerifierCtxObj verifier(this->kPubKeyStr); 209 Epid11Signature const* epid_signature = 210 reinterpret_cast<Epid11Signature const*>( 211 this->kSigGrpXMember0Sha256RandbaseMsg0N2One.data()); 212 Epid11SigRl const* sig_rl = 213 reinterpret_cast<Epid11SigRl const*>(this->kSigRl.data()); 214 EXPECT_EQ(kEpidSigValid, 215 Epid11NrVerify(verifier, &epid_signature->sigma0, 216 this->kMsg0.data(), this->kMsg0.size(), 217 &sig_rl->bk[0], &epid_signature->sigma[0])); 218 } 219 220 TEST_F(Epid11VerifierTest, NrVerifyAcceptsMsgContainingAllPossibleBytes) { 221 Epid11VerifierCtxObj verifier(this->kPubKeyStrForMsg0_255); 222 Epid11Signature const* epid_signature = 223 (Epid11Signature*)kSigGrp01Member0Sha256kBsn0Data_0_255.data(); 224 Epid11SigRl const* sig_rl = 225 reinterpret_cast<Epid11SigRl const*>(this->kSigRlForMsg0_255.data()); 226 EXPECT_EQ(kEpidSigValid, 227 Epid11NrVerify(verifier, &epid_signature->sigma0, 228 this->kData_0_255.data(), this->kData_0_255.size(), 229 &sig_rl->bk[0], &epid_signature->sigma[0])); 230 } 231 232 } // namespace 233