CryptoContext.h 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. #pragma once
  2. #include "openfhe/pke/constants-fwd.h" // PKESchemeFeature
  3. #include "openfhe/pke/cryptocontext-fwd.h" // CryptoContextImpl
  4. #include "openfhe/pke/key/privatekey-fwd.h" // PrivateKeyImpl
  5. #include "openfhe/pke/key/publickey-fwd.h" // PublicKeyImpl
  6. #include "openfhe/pke/scheme/scheme-id.h" // SCHEME
  7. #include "openfhe/pke/schemebase/decrypt-result.h" // DecryptResult
  8. #include "rust/cxx.h" // rust::Fn
  9. #include "SerialMode.h" // SerialMode
  10. namespace lbcrypto
  11. {
  12. class Params;
  13. class CryptoContextBFVRNS;
  14. class CryptoContextBGVRNS;
  15. class CryptoContextCKKSRNS;
  16. template <typename T>
  17. class CCParams;
  18. } // lbcrypto
  19. namespace openfhe
  20. {
  21. struct ComplexPair;
  22. class KeyPairDCRTPoly;
  23. class PrivateKeyDCRTPoly;
  24. class PublicKeyDCRTPoly;
  25. class Plaintext;
  26. class CiphertextDCRTPoly;
  27. class EvalKeyDCRTPoly;
  28. class LWEPrivateKey;
  29. class VectorOfCiphertexts;
  30. using SCHEME = lbcrypto::SCHEME;
  31. using PKESchemeFeature = lbcrypto::PKESchemeFeature;
  32. using Params = lbcrypto::Params;
  33. using ParamsBFVRNS = lbcrypto::CCParams<lbcrypto::CryptoContextBFVRNS>;
  34. using ParamsBGVRNS = lbcrypto::CCParams<lbcrypto::CryptoContextBGVRNS>;
  35. using ParamsCKKSRNS = lbcrypto::CCParams<lbcrypto::CryptoContextCKKSRNS>;
  36. using CryptoContextImpl = lbcrypto::CryptoContextImpl<lbcrypto::DCRTPoly>;
  37. using PublicKeyImpl = lbcrypto::PublicKeyImpl<lbcrypto::DCRTPoly>;
  38. using PrivateKeyImpl = lbcrypto::PrivateKeyImpl<lbcrypto::DCRTPoly>;
  39. using DCRTPolyParams = lbcrypto::DCRTPoly::Params;
  40. using DecryptResult = lbcrypto::DecryptResult;
  41. class CryptoContextDCRTPoly final
  42. {
  43. std::shared_ptr<CryptoContextImpl> m_cryptoContextImplSharedPtr;
  44. public:
  45. friend bool SerializeCryptoContextToFile(const std::string& ccLocation,
  46. const CryptoContextDCRTPoly& cryptoContext, const SerialMode serialMode);
  47. friend bool DeserializeCryptoContextFromFile(const std::string& ccLocation,
  48. CryptoContextDCRTPoly& cryptoContext, const SerialMode serialMode);
  49. friend bool SerializeEvalMultKeyToFile(const std::string& multKeyLocation,
  50. const CryptoContextDCRTPoly& cryptoContext, const SerialMode serialMode);
  51. friend bool SerializeEvalSumKeyToFile(const std::string& sumKeyLocation,
  52. const CryptoContextDCRTPoly& cryptoContext, const SerialMode serialMode);
  53. friend bool SerializeEvalAutomorphismKeyToFile(const std::string& automorphismKeyLocation,
  54. const CryptoContextDCRTPoly& cryptoContext, const SerialMode serialMode);
  55. explicit CryptoContextDCRTPoly() = default;
  56. explicit CryptoContextDCRTPoly(const ParamsBFVRNS& params);
  57. explicit CryptoContextDCRTPoly(const ParamsBGVRNS& params);
  58. explicit CryptoContextDCRTPoly(const ParamsCKKSRNS& params);
  59. CryptoContextDCRTPoly(const CryptoContextDCRTPoly&) = delete;
  60. CryptoContextDCRTPoly(CryptoContextDCRTPoly&&) = delete;
  61. CryptoContextDCRTPoly& operator=(const CryptoContextDCRTPoly&) = delete;
  62. CryptoContextDCRTPoly& operator=(CryptoContextDCRTPoly&&) = delete;
  63. void SetSchemeId(const SCHEME schemeTag) const;
  64. [[nodiscard]] SCHEME GetSchemeId() const;
  65. [[nodiscard]] size_t GetKeyGenLevel() const;
  66. void SetKeyGenLevel(const size_t level) const;
  67. void SetSwkFC(const CiphertextDCRTPoly& FHEWtoCKKSswk) const;
  68. void EvalCompareSwitchPrecompute(const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */,
  69. const bool unit /* false */) const;
  70. [[nodiscard]] uint32_t FindAutomorphismIndex(const uint32_t idx) const;
  71. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> GetSwkFC() const;
  72. void Enable(const PKESchemeFeature feature) const;
  73. void EnableByMask(const uint32_t featureMask) const;
  74. [[nodiscard]] std::unique_ptr<KeyPairDCRTPoly> KeyGen() const;
  75. [[nodiscard]] std::unique_ptr<KeyPairDCRTPoly> MultipartyKeyGen(
  76. const PublicKeyDCRTPoly& publicKey, const bool makeSparse /* false */,
  77. const bool fresh /* false */) const;
  78. [[nodiscard]] std::unique_ptr<PublicKeyDCRTPoly> MultiAddPubKeys(
  79. const PublicKeyDCRTPoly& publicKey1, const PublicKeyDCRTPoly& publicKey2,
  80. const std::string& keyId /* "" */) const;
  81. [[nodiscard]] std::unique_ptr<KeyPairDCRTPoly> SparseKeyGen() const;
  82. void EvalMultKeyGen(const PrivateKeyDCRTPoly& key) const;
  83. void EvalMultKeysGen(const PrivateKeyDCRTPoly& key) const;
  84. void EvalRotateKeyGen(const PrivateKeyDCRTPoly& privateKey,
  85. const std::vector<int32_t>& indexList,
  86. const PublicKeyDCRTPoly& publicKey /* GenNullPublicKey() */) const;
  87. void EvalAtIndexKeyGen(const PrivateKeyDCRTPoly& privateKey,
  88. const std::vector<int32_t>& indexList,
  89. const PublicKeyDCRTPoly& publicKey /* GenNullPublicKey() */) const;
  90. void EvalCKKStoFHEWPrecompute(const double scale /* 1.0 */) const;
  91. [[nodiscard]] uint32_t GetRingDimension() const;
  92. [[nodiscard]] uint32_t GetCyclotomicOrder() const;
  93. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSin(const CiphertextDCRTPoly& ciphertext,
  94. const double a, const double b, const uint32_t degree) const;
  95. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalCos(const CiphertextDCRTPoly& ciphertext,
  96. const double a, const double b, const uint32_t degree) const;
  97. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EncryptByPublicKey(
  98. const PublicKeyDCRTPoly& publicKey, const Plaintext& plaintext) const;
  99. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EncryptByPrivateKey(
  100. const PrivateKeyDCRTPoly& privateKey, const Plaintext& plaintext) const;
  101. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddByCiphertexts(
  102. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
  103. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddByCiphertextAndPlaintext(
  104. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const;
  105. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddByPlaintextAndCiphertext(
  106. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const;
  107. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddByConstAndCiphertext(
  108. const double constant, const CiphertextDCRTPoly& ciphertext) const;
  109. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddByCiphertextAndConst(
  110. const CiphertextDCRTPoly& ciphertext, const double constant) const;
  111. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddMutableByCiphertexts(
  112. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
  113. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddMutableByCiphertextAndPlaintext(
  114. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const;
  115. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddMutableByPlaintextAndCiphertext(
  116. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const;
  117. void EvalAddInPlaceByCiphertexts(const CiphertextDCRTPoly& ciphertext1,
  118. const CiphertextDCRTPoly& ciphertext2) const;
  119. void EvalAddInPlaceByCiphertextAndPlaintext(const CiphertextDCRTPoly& ciphertext,
  120. const Plaintext& plaintext) const;
  121. void EvalAddInPlaceByPlaintextAndCiphertext(const Plaintext& plaintext,
  122. const CiphertextDCRTPoly& ciphertext) const;
  123. void EvalAddInPlaceByCiphertextAndConst(const CiphertextDCRTPoly& ciphertext,
  124. const double constant) const;
  125. void EvalAddInPlaceByConstAndCiphertext(const double constant,
  126. const CiphertextDCRTPoly& ciphertext) const;
  127. void EvalAddMutableInPlace(const CiphertextDCRTPoly& ciphertext1,
  128. const CiphertextDCRTPoly& ciphertext2) const;
  129. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByCiphertexts(
  130. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
  131. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByCiphertextAndPlaintext(
  132. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const;
  133. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByPlaintextAndCiphertext(
  134. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const;
  135. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByConstAndCiphertext(
  136. const double constant, const CiphertextDCRTPoly& ciphertext) const;
  137. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByCiphertextAndConst(
  138. const CiphertextDCRTPoly& ciphertext, const double constant) const;
  139. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubMutableByCiphertexts(
  140. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
  141. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubMutableByCiphertextAndPlaintext(
  142. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const;
  143. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubMutableByPlaintextAndCiphertext(
  144. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const;
  145. void EvalSubInPlaceByCiphertexts(const CiphertextDCRTPoly& ciphertext1,
  146. const CiphertextDCRTPoly& ciphertext2) const;
  147. void EvalSubInPlaceByCiphertextAndConst(const CiphertextDCRTPoly& ciphertext,
  148. const double constant) const;
  149. void EvalSubInPlaceByConstAndCiphertext(const double constant,
  150. const CiphertextDCRTPoly& ciphertext) const;
  151. void EvalSubMutableInPlace(const CiphertextDCRTPoly& ciphertext1,
  152. const CiphertextDCRTPoly& ciphertext2) const;
  153. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByCiphertexts(
  154. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
  155. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByCiphertextAndPlaintext(
  156. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const;
  157. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByPlaintextAndCiphertext(
  158. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const;
  159. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByConstAndCiphertext(
  160. const double constant, const CiphertextDCRTPoly& ciphertext) const;
  161. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByCiphertextAndConst(
  162. const CiphertextDCRTPoly& ciphertext, const double constant) const;
  163. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultMutableByCiphertexts(
  164. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
  165. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultMutableByCiphertextAndPlaintext(
  166. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const;
  167. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultMutableByPlaintextAndCiphertext(
  168. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const;
  169. void EvalMultInPlaceByCiphertextAndConst(const CiphertextDCRTPoly& ciphertext,
  170. const double constant) const;
  171. void EvalMultInPlaceByConstAndCiphertext(const double constant,
  172. const CiphertextDCRTPoly& ciphertext) const;
  173. void EvalMultMutableInPlace(const CiphertextDCRTPoly& ciphertext1,
  174. const CiphertextDCRTPoly& ciphertext2) const;
  175. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultNoRelin(
  176. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
  177. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultAndRelinearize(
  178. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
  179. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalRotate(
  180. const CiphertextDCRTPoly& ciphertext, const int32_t index) const;
  181. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalPoly(
  182. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients) const;
  183. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> KeySwitchDown(
  184. const CiphertextDCRTPoly& ciphertext) const;
  185. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> KeySwitchExt(
  186. const CiphertextDCRTPoly& ciphertext, const bool addFirst) const;
  187. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> Compress(
  188. const CiphertextDCRTPoly& ciphertext, const uint32_t towersLeft /* 1 */) const;
  189. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalNegate(
  190. const CiphertextDCRTPoly& ciphertext) const;
  191. void EvalNegateInPlace(const CiphertextDCRTPoly& ciphertext) const;
  192. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSquare(
  193. const CiphertextDCRTPoly& ciphertext) const;
  194. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSquareMutable(
  195. const CiphertextDCRTPoly& ciphertext) const;
  196. void EvalSquareInPlace(const CiphertextDCRTPoly& ciphertext) const;
  197. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAtIndex(
  198. const CiphertextDCRTPoly& ciphertext, const uint32_t index) const;
  199. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> ComposedEvalMult(
  200. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
  201. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> Relinearize(
  202. const CiphertextDCRTPoly& ciphertext) const;
  203. void RelinearizeInPlace(const CiphertextDCRTPoly& ciphertext) const;
  204. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalChebyshevSeries(
  205. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients,
  206. const double a, const double b) const;
  207. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalChebyshevFunction(
  208. rust::Fn<void(const double x, double& ret)> func, const CiphertextDCRTPoly& ciphertext,
  209. const double a, const double b, const uint32_t degree) const;
  210. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalBootstrap(
  211. const CiphertextDCRTPoly& ciphertext, const uint32_t numIterations /* 1 */,
  212. const uint32_t precision /* 0 */) const;
  213. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> Rescale(
  214. const CiphertextDCRTPoly& ciphertext) const;
  215. void RescaleInPlace(const CiphertextDCRTPoly& ciphertext) const;
  216. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> ModReduce(
  217. const CiphertextDCRTPoly& ciphertext) const;
  218. void ModReduceInPlace(const CiphertextDCRTPoly& ciphertext) const;
  219. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSum(const CiphertextDCRTPoly& ciphertext,
  220. const uint32_t batchSize) const;
  221. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalPolyLinear(
  222. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients) const;
  223. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalPolyPS(
  224. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients) const;
  225. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalChebyshevSeriesLinear(
  226. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients,
  227. const double a, const double b) const;
  228. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalChebyshevSeriesPS(
  229. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients,
  230. const double a, const double b) const;
  231. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalDivide(
  232. const CiphertextDCRTPoly& ciphertext, const double a, const double b,
  233. const uint32_t degree) const;
  234. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> IntMPBootAdjustScale(
  235. const CiphertextDCRTPoly& ciphertext) const;
  236. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalLogistic(
  237. const CiphertextDCRTPoly& ciphertext, const double a, const double b,
  238. const uint32_t degree) const;
  239. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> IntMPBootRandomElementGen(
  240. const PublicKeyDCRTPoly& publicKey) const;
  241. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalCompareSchemeSwitching(
  242. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2,
  243. const uint32_t numCtxts /* 0 */, const uint32_t numSlots /* 0 */,
  244. const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */,
  245. const bool unit /* false */) const;
  246. void EvalBootstrapSetup(const std::vector<uint32_t>& levelBudget /* {5, 4} */,
  247. const std::vector<uint32_t>& dim1 /* {0, 0} */, const uint32_t slots /* 0 */,
  248. const uint32_t correctionFactor /* 0 */, const bool precompute /* true */) const;
  249. void EvalBootstrapKeyGen(const PrivateKeyDCRTPoly& privateKey, const uint32_t slots) const;
  250. void EvalBootstrapPrecompute(const uint32_t slots /* 0 */) const;
  251. [[nodiscard]] std::unique_ptr<DecryptResult> DecryptByPrivateKeyAndCiphertext(
  252. const PrivateKeyDCRTPoly& privateKey, const CiphertextDCRTPoly& ciphertext,
  253. Plaintext& plaintext) const;
  254. [[nodiscard]] std::unique_ptr<DecryptResult> DecryptByCiphertextAndPrivateKey(
  255. const CiphertextDCRTPoly& ciphertext, const PrivateKeyDCRTPoly& privateKey,
  256. Plaintext& plaintext) const;
  257. [[nodiscard]] std::unique_ptr<Plaintext> MakePackedPlaintext(
  258. const std::vector<int64_t>& value, const size_t noiseScaleDeg /* 1 */,
  259. const uint32_t level /* 0 */) const;
  260. [[nodiscard]] std::unique_ptr<Plaintext> MakeStringPlaintext(const std::string& s) const;
  261. [[nodiscard]] std::unique_ptr<Plaintext> MakeCoefPackedPlaintext(
  262. const std::vector<int64_t>& value, const size_t noiseScaleDeg /* 1 */,
  263. const uint32_t level /* 0 */) const;
  264. [[nodiscard]] std::unique_ptr<Plaintext> MakeCKKSPackedPlaintext(
  265. const std::vector<double>& value, const size_t scaleDeg /* 1 */,
  266. const uint32_t level /* 0 */, const std::shared_ptr<DCRTPolyParams> params /* nullptr */,
  267. const uint32_t slots /* 0 */) const;
  268. [[nodiscard]] std::unique_ptr<Plaintext> MakeCKKSPackedPlaintextByVectorOfComplex(
  269. const std::vector<ComplexPair>& value, const size_t scaleDeg /* 1 */,
  270. const uint32_t level /* 0 */, const std::shared_ptr<DCRTPolyParams> params /* nullptr */,
  271. const uint32_t slots /* 0 */) const;
  272. [[nodiscard]] std::unique_ptr<std::vector<uint32_t>> FindAutomorphismIndices(
  273. const std::vector<uint32_t>& idxList) const;
  274. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalInnerProductByCiphertexts(
  275. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2,
  276. const uint32_t batchSize) const;
  277. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalInnerProductByPlaintext(
  278. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext,
  279. const uint32_t batchSize) const;
  280. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> KeySwitch(
  281. const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey) const;
  282. void KeySwitchInPlace(const CiphertextDCRTPoly& ciphertext,
  283. const EvalKeyDCRTPoly& evalKey) const;
  284. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> LevelReduce(
  285. const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey,
  286. const size_t levels /* 1 */) const;
  287. void LevelReduceInPlace(const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey,
  288. const size_t levels /* 1 */) const;
  289. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> ReEncrypt(
  290. const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey,
  291. const PublicKeyDCRTPoly& publicKey /* GenNullPublicKey() */) const;
  292. [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> KeySwitchGen(
  293. const PrivateKeyDCRTPoly& oldPrivateKey, const PrivateKeyDCRTPoly& newPrivateKey) const;
  294. [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> ReKeyGen(const PrivateKeyDCRTPoly& oldPrivateKey,
  295. const PublicKeyDCRTPoly& newPublicKey) const;
  296. [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> MultiKeySwitchGen(
  297. const PrivateKeyDCRTPoly& originalPrivateKey, const PrivateKeyDCRTPoly& newPrivateKey,
  298. const EvalKeyDCRTPoly& evalKey) const;
  299. [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> MultiAddEvalKeys(
  300. const EvalKeyDCRTPoly& evalKey1, const EvalKeyDCRTPoly& evalKey2,
  301. const std::string& keyId /* "" */) const;
  302. [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> MultiMultEvalKey(
  303. const PrivateKeyDCRTPoly& privateKey, const EvalKeyDCRTPoly& evalKey,
  304. const std::string& keyId /* "" */) const;
  305. [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> MultiAddEvalMultKeys(
  306. const EvalKeyDCRTPoly& evalKey1, const EvalKeyDCRTPoly& evalKey2,
  307. const std::string& keyId /* "" */) const;
  308. void EvalSumKeyGen(const PrivateKeyDCRTPoly& privateKey,
  309. const PublicKeyDCRTPoly& publicKey /* GenNullPublicKey() */) const;
  310. void EvalCKKStoFHEWKeyGen(const KeyPairDCRTPoly& keyPair, const LWEPrivateKey& lwesk) const;
  311. void EvalFHEWtoCKKSKeyGen(const KeyPairDCRTPoly& keyPair, const LWEPrivateKey& lwesk,
  312. const uint32_t numSlots /* 0 */, const uint32_t numCtxts /* 0 */,
  313. const uint32_t dim1 /* 0 */, const uint32_t L /* 0 */) const;
  314. void EvalSchemeSwitchingKeyGen(const KeyPairDCRTPoly& keyPair,
  315. const LWEPrivateKey& lwesk) const;
  316. [[nodiscard]] uint64_t GetModulus() const;
  317. [[nodiscard]] uint64_t GetRootOfUnity() const;
  318. [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> MultipartyDecryptLead(
  319. const VectorOfCiphertexts& ciphertextVec, const PrivateKeyDCRTPoly& privateKey) const;
  320. [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> MultipartyDecryptMain(
  321. const VectorOfCiphertexts& ciphertextVec, const PrivateKeyDCRTPoly& privateKey) const;
  322. [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> IntMPBootDecrypt(
  323. const PrivateKeyDCRTPoly& privateKey, const CiphertextDCRTPoly& ciphertext,
  324. const CiphertextDCRTPoly& a) const;
  325. [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> EvalMinSchemeSwitching(
  326. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  327. const uint32_t numValues /* 0 */, const uint32_t numSlots /* 0 */,
  328. const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */) const;
  329. [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> EvalMinSchemeSwitchingAlt(
  330. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  331. const uint32_t numValues /* 0 */, const uint32_t numSlots /* 0 */,
  332. const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */) const;
  333. [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> EvalMaxSchemeSwitching(
  334. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  335. const uint32_t numValues /* 0 */, const uint32_t numSlots /* 0 */,
  336. const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */) const;
  337. [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> EvalMaxSchemeSwitchingAlt(
  338. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  339. const uint32_t numValues /* 0 */, const uint32_t numSlots /* 0 */,
  340. const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */) const;
  341. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddMany(
  342. const VectorOfCiphertexts& ciphertextVec) const;
  343. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultMany(
  344. const VectorOfCiphertexts& ciphertextVec) const;
  345. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMerge(
  346. const VectorOfCiphertexts& ciphertextVec) const;
  347. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> IntMPBootEncrypt(
  348. const PublicKeyDCRTPoly& publicKey, const VectorOfCiphertexts& sharesPair,
  349. const CiphertextDCRTPoly& a, const CiphertextDCRTPoly& ciphertext) const;
  350. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddManyInPlace(
  351. VectorOfCiphertexts& ciphertextVec) const;
  352. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalLinearWSumMutable(
  353. VectorOfCiphertexts& ciphertextVec, const std::vector<double>& constantsVec) const;
  354. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalLinearWSumMutable(
  355. const std::vector<double>& constantsVec, VectorOfCiphertexts& ciphertextVec) const;
  356. [[nodiscard]] std::shared_ptr<CryptoContextImpl> GetInternal() const;
  357. };
  358. // cxx currently does not support static class methods
  359. void ClearEvalMultKeys();
  360. void ClearEvalMultKeysById(const std::string& id);
  361. void ClearEvalMultKeysByCryptoContext(const CryptoContextDCRTPoly& cryptoContext);
  362. void ClearEvalSumKeys();
  363. void ClearEvalSumKeysById(const std::string& id);
  364. void ClearEvalSumKeysByCryptoContext(const CryptoContextDCRTPoly& cryptoContext);
  365. void ClearEvalAutomorphismKeys();
  366. void ClearEvalAutomorphismKeysById(const std::string& id);
  367. void ClearEvalAutomorphismKeysByCryptoContext(const CryptoContextDCRTPoly& cryptoContext);
  368. [[nodiscard]] std::unique_ptr<std::vector<uint32_t>> GetExistingEvalAutomorphismKeyIndices(
  369. const std::string& keyTag);
  370. [[nodiscard]] std::unique_ptr<std::vector<uint32_t>> GetUniqueValues(
  371. const std::vector<uint32_t>& oldValues, const std::vector<uint32_t>& newValues);
  372. [[nodiscard]] std::unique_ptr<CryptoContextDCRTPoly> GenEmptyCryptoContext();
  373. [[nodiscard]] std::unique_ptr<CryptoContextDCRTPoly> GenCryptoContextByParamsBFVRNS(
  374. const ParamsBFVRNS& params);
  375. [[nodiscard]] std::unique_ptr<CryptoContextDCRTPoly> GenCryptoContextByParamsBGVRNS(
  376. const ParamsBGVRNS& params);
  377. [[nodiscard]] std::unique_ptr<CryptoContextDCRTPoly> GenCryptoContextByParamsCKKSRNS(
  378. const ParamsCKKSRNS& params);
  379. } // openfhe