Implementation blueprint for Microsoft SEAL code
This commit is contained in:
parent
ff8386e903
commit
93acf2839c
@ -51,6 +51,7 @@ using ciphertext = int;
|
|||||||
class bfv_exception : public std::exception {
|
class bfv_exception : public std::exception {
|
||||||
public:
|
public:
|
||||||
enum class REASON {
|
enum class REASON {
|
||||||
|
CTX_NOT_IMPLEMENTED,
|
||||||
CTX_NO_PRIVATE,
|
CTX_NO_PRIVATE,
|
||||||
CTX_NO_PUBLIC,
|
CTX_NO_PUBLIC,
|
||||||
CTX_ARITHMETIC,
|
CTX_ARITHMETIC,
|
||||||
@ -105,6 +106,34 @@ Additionally, a graph of running operations is maintained to handle data depende
|
|||||||
Only when data is required to actually be present (e.g. decrypt), does the implementation wait
|
Only when data is required to actually be present (e.g. decrypt), does the implementation wait
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// BFV implementation using Microsoft SEAL
|
||||||
|
|
||||||
|
struct seal_context : public context {
|
||||||
|
seal_context();
|
||||||
|
~seal_context();
|
||||||
|
|
||||||
|
void new_components(int components) override;
|
||||||
|
void has_components(int components) const override;
|
||||||
|
void clone_components(int components, std::shared_ptr<context>& ptr) const override;
|
||||||
|
void allocate(ciphertext& ct) override;
|
||||||
|
void free(ciphertext ct) override;
|
||||||
|
void serialize(ciphertext ct, void* buf, std::size_t& n) const override;
|
||||||
|
void deserialize(ciphertext ct, const void* buf, std::size_t n) const override;
|
||||||
|
void encrypt(const plaintext& pt, ciphertext ct) const override;
|
||||||
|
void decrypt(ciphertext ct, plaintext& pt) const override;
|
||||||
|
void add_cipher_plain(ciphertext a, const plaintext& b, ciphertext res) const override;
|
||||||
|
void add_cipher_cipher(ciphertext a, ciphertext b, ciphertext res) const override;
|
||||||
|
void sub_cipher_plain(ciphertext a, const plaintext& b, ciphertext res) const override;
|
||||||
|
void sub_cipher_cipher(ciphertext a, ciphertext b, ciphertext res) const override;
|
||||||
|
void mul_cipher_plain(ciphertext a, const plaintext& b, ciphertext res) const override;
|
||||||
|
void mul_cipher_cipher(ciphertext a, ciphertext b, ciphertext res) const override;
|
||||||
|
void rot_cipher_rows(ciphertext ct, int r, ciphertext res) const override;
|
||||||
|
void swap_cipher_rows(ciphertext ct, ciphertext res) const override;
|
||||||
|
void noise_budget(ciphertext ct, std::size_t& budget) const override;
|
||||||
|
private:
|
||||||
|
int m_id;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
activate_context(std::shared_ptr<bfv::context> ctx) -> thread local pointer is set
|
activate_context(std::shared_ptr<bfv::context> ctx) -> thread local pointer is set
|
||||||
Raw ciphertext and plaintext classes always have the full 8192 coefficients (defined in context as static constexpr)
|
Raw ciphertext and plaintext classes always have the full 8192 coefficients (defined in context as static constexpr)
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
target_sources(homcert PRIVATE bfv.cpp)
|
target_sources(homcert PRIVATE bfv.cpp seal_bfv.cpp)
|
||||||
|
|||||||
@ -13,4 +13,4 @@ const char* bfv_exception::what() const noexcept {
|
|||||||
return m_message.c_str();
|
return m_message.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
}
|
||||||
|
|||||||
175
src/seal_bfv.cpp
Normal file
175
src/seal_bfv.cpp
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
#include <bfv.hpp>
|
||||||
|
|
||||||
|
#ifdef HOMCERT_BFV_SEAL
|
||||||
|
|
||||||
|
namespace homcert::bfv {
|
||||||
|
|
||||||
|
seal_context::seal_context() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
seal_context::~seal_context() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::new_components(int components) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::has_components(int components) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::clone_components(int components, std::shared_ptr<context>& ptr) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::allocate(ciphertext& ct) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::free(ciphertext ct) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::serialize(ciphertext ct, void* buf, std::size_t& n) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::deserialize(ciphertext ct, const void* buf, std::size_t n) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::encrypt(const plaintext& pt, ciphertext ct) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::decrypt(ciphertext ct, plaintext& pt) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::add_cipher_plain(ciphertext a, const plaintext& b, ciphertext res) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::add_cipher_cipher(ciphertext a, ciphertext b, ciphertext res) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::sub_cipher_plain(ciphertext a, const plaintext& b, ciphertext res) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::sub_cipher_cipher(ciphertext a, ciphertext b, ciphertext res) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::mul_cipher_plain(ciphertext a, const plaintext& b, ciphertext res) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::mul_cipher_cipher(ciphertext a, ciphertext b, ciphertext res) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::rot_cipher_rows(ciphertext ct, int r, ciphertext res) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::swap_cipher_rows(ciphertext ct, ciphertext res) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::noise_budget(ciphertext ct, std::size_t& budget) const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
namespace homcert::bfv {
|
||||||
|
|
||||||
|
seal_context::seal_context() {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
seal_context::~seal_context() {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::new_components(int components) {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::has_components(int components) const {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::clone_components(int components, std::shared_ptr<context>& ptr) const {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::allocate(ciphertext& ct) {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::free(ciphertext ct) {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::serialize(ciphertext ct, void* buf, std::size_t& n) const {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::deserialize(ciphertext ct, const void* buf, std::size_t n) const {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::encrypt(const plaintext& pt, ciphertext ct) const {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::decrypt(ciphertext ct, plaintext& pt) const {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::add_cipher_plain(ciphertext a, const plaintext& b, ciphertext res) const {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::add_cipher_cipher(ciphertext a, ciphertext b, ciphertext res) const {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::sub_cipher_plain(ciphertext a, const plaintext& b, ciphertext res) const {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::sub_cipher_cipher(ciphertext a, ciphertext b, ciphertext res) const {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::mul_cipher_plain(ciphertext a, const plaintext& b, ciphertext res) const {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::mul_cipher_cipher(ciphertext a, ciphertext b, ciphertext res) const {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::rot_cipher_rows(ciphertext ct, int r, ciphertext res) const {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::swap_cipher_rows(ciphertext ct, ciphertext res) const {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void seal_context::noise_budget(ciphertext ct, std::size_t& budget) const {
|
||||||
|
throw bfv_exception(bfv_exception::REASON::CTX_NOT_IMPLEMENTED, "BFV context for Microsoft SEAL is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -1,6 +1,6 @@
|
|||||||
find_package(GTest REQUIRED)
|
find_package(GTest REQUIRED)
|
||||||
|
|
||||||
if (HOMCERT_BFV_SEAL)
|
if (HOMCERT_BFV_SEAL)
|
||||||
add_executable(test_bfv bfv/main.cpp)
|
add_executable(test_bfv_seal bfv/bfv_seal.cpp)
|
||||||
target_link_libraries(test_bfv PRIVATE homcert GTest::GTest)
|
target_link_libraries(test_bfv_seal PRIVATE homcert GTest::GTest)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@ -7,15 +7,14 @@
|
|||||||
|
|
||||||
using namespace homcert;
|
using namespace homcert;
|
||||||
|
|
||||||
class BFV : public ::testing::Test {
|
class BFV_SEAL : public ::testing::Test {
|
||||||
protected:
|
protected:
|
||||||
std::shared_ptr<bfv::context> m_context;
|
inline static std::shared_ptr<bfv::context> CTX0;
|
||||||
};
|
|
||||||
|
|
||||||
class BFV_SEAL : public BFV {
|
|
||||||
protected:
|
|
||||||
static void SetUpTestSuite() {
|
static void SetUpTestSuite() {
|
||||||
// GTEST_SKIP() << "Test environment not available";
|
CTX0 = std::make_shared<bfv::seal_context>();
|
||||||
|
if (!CTX0)
|
||||||
|
GTEST_SKIP() << "Microsoft SEAL BFV implementation is not available!";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void TearDownTestSuite() {}
|
static void TearDownTestSuite() {}
|
||||||
Loading…
Reference in New Issue
Block a user