secretflow / psi

The repo of Private Set Intersection(PSI) and Private Information Retrieval(PIR) from SecretFlow.
https://www.secretflow.org.cn/docs/psi
Apache License 2.0
26 stars 19 forks source link

[Bug]: OKVS测试无掩盖效果 #144

Closed Yinbenxin closed 2 months ago

Yinbenxin commented 3 months ago

Describe the bug

OKVS中实现的编码和解码逻辑应该是:Key*P=Value,P理论上应该是一个随机数组,但是我在实际测试时发现P中明显存在value数据,请问这本来就这么设计吗?还是我哪里设置有问题?

Steps To Reproduce

bazel run //psi/psi/core/vole_psi/okvs:baxos_test //paxos_test同样存在该问题。 ` namespace psi::psi::okvs {

class BaxosTest : public testing::TestWithParam {};

TEST_P(BaxosTest, WORKS) { size_t items_num = GetParam(); size_t bin_size = items_num / 4; size_t weight = 3; // statistical security parameter size_t ssp = 40;

Baxos baxos; yacl::crypto::Prg prng(yacl::crypto::RandU128());

uint128_t seed; prng.Fill(absl::MakeSpan(&seed, 1));

SPDLOG_INFO("items_num:{}, bin_size:{}", items_num, bin_size);

baxos.Init(items_num, bin_size, weight, ssp, PaxosParam::DenseType::GF128, seed);

SPDLOG_INFO("baxos.size(): {}", baxos.size());

std::vector items(items_num); std::vector values(items_num); std::vector values2(items_num); std::vector p(baxos.size());

prng.Fill(absl::MakeSpan(items.data(), items.size())); prng.Fill(absl::MakeSpan(values.data(), values.size()));

auto start = std::chrono::high_resolution_clock::now(); baxos.Solve(absl::MakeSpan(items), absl::MakeSpan(values), absl::MakeSpan(p)); auto end = std::chrono::high_resolution_clock::now(); std::cout << "baxos.Solve size" << p.size(); std::chrono::duration<double, std::milli> elapsed = end - start; std::cout << "baxos.Solve took " << elapsed.count() << " milliseconds.\n";

for (const auto& innerVec : p) { // for (const auto& element : innerVec) { std::cout << innerVec << " "; // } std::cout << std::endl; }

for (const auto& innerVec : values) { // for (const auto& element : innerVec) { std::cout << innerVec << " "; // } std::cout << std::endl; } size_t k = 0; for (size_t i = 0; i < values.size(); i++) { for (size_t j = 0; j < p.size(); j++) { if (p[j] == values[i]) { // std::cout << "valuesp:" << i << std::endl; k++; } } } std::cout << "count: " << k << std::endl; start = std::chrono::high_resolution_clock::now(); baxos.Decode(absl::MakeSpan(items), absl::MakeSpan(values2), absl::MakeSpan(p)); end = std::chrono::high_resolution_clock::now(); elapsed = end - start; std::cout << "baxos.Decode took " << elapsed.count() << " milliseconds.\n";

if (std::memcmp(values2.data(), values.data(), values.size() * sizeof(uint128_t)) != 0) { for (uint64_t i = 0; i < items_num; ++i) { EXPECT_EQ(std::memcmp(&values[i], &values2[i], sizeof(uint128_t)), 0); } } }

INSTANTIATE_TEST_SUITE_P(Works_Instances, BaxosTest, testing::Values(15));

} // namespace psi::psi::okvs `

结果: ` Running main() from gmock_main.cc [==========] Running 1 test from 1 test suite. [----------] Global test environment set-up. [----------] 1 test from Works_Instances/BaxosTest [ RUN ] Works_Instances/BaxosTest.WORKS/0 [2024-07-05 03:27:56.630] [info] [baxos_test.cc:43] items_num:15, bin_size:3 [2024-07-05 03:27:56.631] [info] [baxos_test.cc:48] baxos.size(): 265 baxos.Solve size265baxos.Solve took 0.084167 milliseconds. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30249581019136461799913703116248529260 0 0 0 0 0 0 0 0 0 0 0 0 0 0 264482226524464365223049826774360018070 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 297070843746093303118528725100684470190 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 319914869819946649309955289809349906505 0 0 326329356209774252584499154986720639053 0 0 0 0 0 0 94857184957107499938021084602682390890 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 282432622376067604239800030988424235940 0 0 0 0 0 0 0 0 0 0 60542127553454401102716789245072047140 75377835026112524672441006935454381434 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36933043176152668205754522843720319017 0 42139514444490055029471643400844337786 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 328152844493251641623901453218272922896 0 0 0 0 0 0 0 0 0 0 0 194629314372862775373800636331631656676 0 0 0 239385172818071565953594850162918447632 0 0 38640883360020630412977397758636309358 0 0 0 0 0 0 0 0 0 0 0 38640883360020630412977397758636309358 194629314372862775373800636331631656676 57143744327010333286401672076945547235 6884410884816999675291523560055973892 297070843746093303118528725100684470190 30249581019136461799913703116248529260 94857184957107499938021084602682390890 282432622376067604239800030988424235940 60542127553454401102716789245072047140 42139514444490055029471643400844337786 75377835026112524672441006935454381434 88767996193783301854506181464606643968 264482226524464365223049826774360018070 36933043176152668205754522843720319017 239385172818071565953594850162918447632 count: 12 baxos.Decode took 0.059291 milliseconds. [ OK ] Works_Instances/BaxosTest.WORKS/0 (1 ms) [----------] 1 test from Works_Instances/BaxosTest (1 ms total)

[----------] Global test environment tear-down [==========] 1 test from 1 test suite ran. (1 ms total) [ PASSED ] 1 test. `

Expected behavior

OKVS生成的P不显示原本value。

Version

0.4.0

Operating system

mac

Hardware Resources

16c16G

qxzhou1010 commented 3 months ago

@Yinbenxin 感谢反馈,我们将尽快确认你提出的问题并给出回复。

qxzhou1010 commented 2 months ago

@Yinbenxin

  1. 注意到你编译目标的路径是bazel run//psi/psi/core/vole_psi/okvs.baxos_test,这是一个比较老版本的PSI的路径,建议使用最新版本的PSI。
  2. 基于你提供的测试用例,在目前的PSI repo下,有编译错误,需要替换RandU128的生成接口为:yacl:crypto::Prg<uint128_t> prng(yacl::crypto::FastRandU128()));
  3. 根据你提供的测试用例,我复现了跟你相同的结果,即OKVS Encode的输出P和Value中存在相等的值。但这并不是一个 Bug,因为OKVS是用来保护key-value pair 中的 key。你可以在上述测试用例中尝试对比PItem的值,理应没有相等的值;此外,也可以参考rr22论文查看OKVS在PSI中的使用方法。