// Part of the Concrete Compiler Project, under the BSD3 License with Zama // Exceptions. See // https://github.com/zama-ai/concrete/blob/main/LICENSE.txt // for license information. #ifndef CONCRETELANG_SERVERLIB_SERVER_LAMBDA_H #define CONCRETELANG_SERVERLIB_SERVER_LAMBDA_H #include "boost/outcome.h" #include "concrete-protocol.capnp.h" #include "concretelang/Common/Error.h" #include "concretelang/Common/Keysets.h" #include "concretelang/Common/Protocol.h" #include "concretelang/Common/Transformers.h" #include "concretelang/Common/Values.h" #include "llvm/ADT/ArrayRef.h" #include #include #include #include #include using concretelang::keysets::ServerKeyset; using concretelang::transformers::ArgTransformer; using concretelang::transformers::ReturnTransformer; using concretelang::transformers::TransformerFactory; using concretelang::values::Value; namespace concretelang { namespace serverlib { /// A smart pointer to a dynamic module. class DynamicModule { friend class ServerCircuit; public: ~DynamicModule(); static Result> open(const std::string &outputPath); private: void *libraryHandle; }; class ServerCircuit { friend class ServerProgram; public: /// Call the circuit with public arguments. Result> call(const ServerKeyset &serverKeyset, std::vector &args); /// Simulate the circuit with public arguments. Result> simulate(std::vector &args); /// Returns the name of this circuit. std::string getName(); private: ServerCircuit() = default; static Result fromDynamicModule(const Message &circuitInfo, std::shared_ptr dynamicModule, bool useSimulation); void invoke(const ServerKeyset &serverKeyset); Message circuitInfo; bool useSimulation; void (*func)(void *...); std::shared_ptr dynamicModule; std::vector argTransformers; std::vector returnTransformers; std::vector argsBuffer; std::vector returnsBuffer; std::vector argDescriptorSizes; std::vector returnDescriptorSizes; size_t argRawSize; size_t returnRawSize; }; /// ServerProgram contains multiple class ServerProgram { public: /// Loads a server program from a shared lib path essentially. static Result load(const Message &programInfo, const std::string &outputPath, bool useSimulation); Result getServerCircuit(const std::string &circuitName); private: ServerProgram() = default; std::vector serverCircuits; }; } // namespace serverlib } // namespace concretelang #endif