// Part of the Concrete Compiler Project, under the BSD3 License with Zama // Exceptions. See // https://github.com/zama-ai/concrete-compiler-internal/blob/main/LICENSE.txt // for license information. #ifndef CONCRETELANG_CLIENTLIB_EVALUATION_KEYS_H_ #define CONCRETELANG_CLIENTLIB_EVALUATION_KEYS_H_ #include #include "concrete-core-ffi.h" #include "concretelang/Common/Error.h" typedef struct LweCircuitBootstrapPrivateFunctionalPackingKeyswitchKeys64 LweCircuitBootstrapPrivateFunctionalPackingKeyswitchKeys64; int destroy_lwe_circuit_bootstrap_private_functional_packing_keyswitch_keys_u64( LweCircuitBootstrapPrivateFunctionalPackingKeyswitchKeys64 *); namespace concretelang { namespace clientlib { // ============================================= /// Wrapper for `LweKeyswitchKey64` so that it cleans up properly. class LweKeyswitchKey { private: LweKeyswitchKey64 *ksk; protected: friend std::ostream &operator<<(std::ostream &ostream, const LweKeyswitchKey &wrappedKsk); friend std::istream &operator>>(std::istream &istream, LweKeyswitchKey &wrappedKsk); public: LweKeyswitchKey(LweKeyswitchKey64 *ksk) : ksk{ksk} {} LweKeyswitchKey(LweKeyswitchKey &other) = delete; LweKeyswitchKey(LweKeyswitchKey &&other) : ksk{other.ksk} { other.ksk = nullptr; } ~LweKeyswitchKey() { if (this->ksk != nullptr) { CAPI_ASSERT_ERROR(destroy_lwe_keyswitch_key_u64(this->ksk)); this->ksk = nullptr; } } LweKeyswitchKey64 *get() { return this->ksk; } }; // ============================================= /// Wrapper for `LweBootstrapKey64` so that it cleans up properly. class LweBootstrapKey { private: LweBootstrapKey64 *bsk; protected: friend std::ostream &operator<<(std::ostream &ostream, const LweBootstrapKey &wrappedBsk); friend std::istream &operator>>(std::istream &istream, LweBootstrapKey &wrappedBsk); public: LweBootstrapKey(LweBootstrapKey64 *bsk) : bsk{bsk} {} LweBootstrapKey(LweBootstrapKey &other) = delete; LweBootstrapKey(LweBootstrapKey &&other) : bsk{other.bsk} { other.bsk = nullptr; } ~LweBootstrapKey() { if (this->bsk != nullptr) { CAPI_ASSERT_ERROR(destroy_lwe_bootstrap_key_u64(this->bsk)); this->bsk = nullptr; } } LweBootstrapKey64 *get() { return this->bsk; } }; // ============================================= /// Wrapper for `LweCircuitBootstrapPrivateFunctionalPackingKeyswitchKeys64` so /// that it cleans up properly. class PackingKeyswitchKey { private: LweCircuitBootstrapPrivateFunctionalPackingKeyswitchKeys64 *key; protected: friend std::ostream &operator<<(std::ostream &ostream, const PackingKeyswitchKey &wrappedFpksk); friend std::istream &operator>>(std::istream &istream, PackingKeyswitchKey &wrappedFpksk); public: PackingKeyswitchKey( LweCircuitBootstrapPrivateFunctionalPackingKeyswitchKeys64 *key) : key{key} {} PackingKeyswitchKey(PackingKeyswitchKey &other) = delete; PackingKeyswitchKey(PackingKeyswitchKey &&other) : key{other.key} { other.key = nullptr; } ~PackingKeyswitchKey() { if (this->key != nullptr) { CAPI_ASSERT_ERROR( destroy_lwe_circuit_bootstrap_private_functional_packing_keyswitch_keys_u64( this->key)); this->key = nullptr; } } LweCircuitBootstrapPrivateFunctionalPackingKeyswitchKeys64 *get() { return this->key; } }; // ============================================= /// Evalution keys required for execution. class EvaluationKeys { private: std::shared_ptr sharedKsk; std::shared_ptr sharedBsk; std::shared_ptr sharedFpksk; protected: friend std::ostream &operator<<(std::ostream &ostream, const EvaluationKeys &evaluationKeys); friend std::istream &operator>>(std::istream &istream, EvaluationKeys &evaluationKeys); public: EvaluationKeys() : sharedKsk{std::shared_ptr(nullptr)}, sharedBsk{std::shared_ptr(nullptr)} {} EvaluationKeys(std::shared_ptr sharedKsk, std::shared_ptr sharedBsk, std::shared_ptr sharedFpksk) : sharedKsk{sharedKsk}, sharedBsk{sharedBsk}, sharedFpksk{sharedFpksk} {} LweKeyswitchKey64 *getKsk() { return this->sharedKsk->get(); } LweBootstrapKey64 *getBsk() { return this->sharedBsk->get(); } LweCircuitBootstrapPrivateFunctionalPackingKeyswitchKeys64 *getFpksk() { return this->sharedFpksk->get(); }; }; // ============================================= } // namespace clientlib } // namespace concretelang #endif