#include #include "dpf.hpp" #include #include #include TEST(ConstrainedCmp, LemmaAdjacentPairs) { // |x0 − x1| = 1 ⇒ local_ccmp = 1{x0 < x1}. EXPECT_EQ(dpf::local_ccmp(0, 1), 1u); EXPECT_EQ(dpf::local_ccmp(1, 0), 0u); EXPECT_EQ(dpf::local_ccmp(2, 3), 1u); EXPECT_EQ(dpf::local_ccmp(3, 2), 0u); EXPECT_EQ(dpf::local_ccmp(100, 101), 1u); EXPECT_EQ(dpf::local_ccmp(101, 100), 0u); // Control-bit pairs used by arith leaf open (t0 ⊕ t1 = 1). EXPECT_EQ(dpf::local_ccmp(0, 1), 1u); // g = t1 EXPECT_EQ(dpf::local_ccmp(1, 0), 0u); // g = t1 } TEST(ConstrainedCmp, RandomAdjacentBatch) { std::mt19937_64 rng{0xC0FFEEULL}; std::uniform_int_distribution dist(0, (1ull << 40) - 2); for (int i = 0; i < 256; ++i) { const std::uint64_t a = dist(rng); const std::uint64_t b = a + 1; EXPECT_EQ(dpf::local_ccmp(a, b), 1u) << a << " < " << b; EXPECT_EQ(dpf::local_ccmp(b, a), 0u) << b << " > " << a; EXPECT_EQ(dpf::local_ccmp_int(a, b), 1u); EXPECT_EQ(dpf::local_ccmp_int(b, a), 0u); } } TEST(ConstrainedCmp, PartyTermsMatchTheAndInputs) { uint8_t z0 = 9, z1 = 9, l = 9; dpf::detail::ccmp_party_terms(0b10, 0, z0, z1, l); EXPECT_EQ(l, 0u); EXPECT_EQ(z0, 1u); EXPECT_EQ(z1, 1u); dpf::detail::ccmp_party_terms(0b11, 1, z0, z1, l); EXPECT_EQ(l, 1u); EXPECT_EQ(z0, 1u); EXPECT_EQ(z1, static_cast(1u ^ 1u ^ 1u)); } TEST(ConstrainedCmp, AdjacentAtTheTopOfUint64) { const std::uint64_t top = std::numeric_limits::max(); EXPECT_EQ(dpf::local_ccmp(top - 1, top), 1u); EXPECT_EQ(dpf::local_ccmp(top, top - 1), 0u); } TEST(ConstrainedCmp, ProtocolHook) { dpf::detail::urandom_pad_rng pads{}; dpf::local_cw_protocol proto{pads}; EXPECT_EQ(proto.open_ccmp(0, 1), 1u); EXPECT_EQ(proto.open_ccmp(1, 0), 0u); }