CryptoContext.h 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. #pragma once
  2. #include "openfhe/core/lattice/hal/lat-backend.h"
  3. #include "openfhe/pke/constants.h"
  4. #include "openfhe/pke/cryptocontext-fwd.h"
  5. #include "openfhe/pke/scheme/scheme-id.h"
  6. #include "rust/cxx.h"
  7. namespace lbcrypto
  8. {
  9. class Params;
  10. class CryptoContextBFVRNS;
  11. class CryptoContextBGVRNS;
  12. class CryptoContextCKKSRNS;
  13. template <typename T>
  14. class CCParams;
  15. } // lbcrypto
  16. namespace openfhe
  17. {
  18. struct ComplexPair;
  19. class CiphertextDCRTPoly;
  20. class CryptoParametersBaseDCRTPoly;
  21. class DCRTPoly;
  22. class DCRTPolyParams;
  23. class DecryptResult;
  24. class EncodingParams;
  25. class EvalKeyDCRTPoly;
  26. class KeyPairDCRTPoly;
  27. class LWEPrivateKey;
  28. class MapFromIndexToEvalKey;
  29. class MapFromStringToMapFromIndexToEvalKey;
  30. class MapFromStringToVectorOfEvalKeys;
  31. class Plaintext;
  32. class PrivateKeyDCRTPoly;
  33. class PublicKeyDCRTPoly;
  34. class SchemeBaseDCRTPoly;
  35. class UnorderedMapFromIndexToDCRTPoly;
  36. class VectorOfCiphertexts;
  37. class VectorOfDCRTPolys;
  38. class VectorOfEvalKeys;
  39. class VectorOfLWECiphertexts;
  40. class VectorOfPrivateKeys;
  41. class VectorOfVectorOfCiphertexts;
  42. using CryptoContextImpl = lbcrypto::CryptoContextImpl<lbcrypto::DCRTPoly>;
  43. using Params = lbcrypto::Params;
  44. using ParamsBFVRNS = lbcrypto::CCParams<lbcrypto::CryptoContextBFVRNS>;
  45. using ParamsBGVRNS = lbcrypto::CCParams<lbcrypto::CryptoContextBGVRNS>;
  46. using ParamsCKKSRNS = lbcrypto::CCParams<lbcrypto::CryptoContextCKKSRNS>;
  47. using PKESchemeFeature = lbcrypto::PKESchemeFeature;
  48. using PlaintextEncodings = lbcrypto::PlaintextEncodings;
  49. using SCHEME = lbcrypto::SCHEME;
  50. class CryptoContextDCRTPoly final
  51. {
  52. std::shared_ptr<CryptoContextImpl> m_cryptoContextImplSharedPtr;
  53. public:
  54. CryptoContextDCRTPoly() = default;
  55. explicit CryptoContextDCRTPoly(const ParamsBFVRNS& params);
  56. explicit CryptoContextDCRTPoly(const ParamsBGVRNS& params);
  57. explicit CryptoContextDCRTPoly(const ParamsCKKSRNS& params);
  58. CryptoContextDCRTPoly(const CryptoContextDCRTPoly&) = delete;
  59. CryptoContextDCRTPoly(CryptoContextDCRTPoly&&) = delete;
  60. CryptoContextDCRTPoly& operator=(const CryptoContextDCRTPoly&) = delete;
  61. CryptoContextDCRTPoly& operator=(CryptoContextDCRTPoly&&) = delete;
  62. void SetSchemeId(const SCHEME schemeTag) const;
  63. [[nodiscard]] SCHEME GetSchemeId() const;
  64. [[nodiscard]] size_t GetKeyGenLevel() const;
  65. void SetKeyGenLevel(const size_t level) const;
  66. void SetSwkFC(const CiphertextDCRTPoly& FHEWtoCKKSswk) const;
  67. void EvalCompareSwitchPrecompute(const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */,
  68. const bool unit /* false */) const;
  69. [[nodiscard]] uint32_t FindAutomorphismIndex(const uint32_t idx) const;
  70. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> GetSwkFC() const;
  71. void EnableByFeature(const PKESchemeFeature feature) const;
  72. void EnableByMask(const uint32_t featureMask) const;
  73. [[nodiscard]] std::unique_ptr<KeyPairDCRTPoly> KeyGen() const;
  74. [[nodiscard]] std::unique_ptr<KeyPairDCRTPoly> MultipartyKeyGenByPublicKey(
  75. const PublicKeyDCRTPoly& publicKey, const bool makeSparse /* false */,
  76. const bool fresh /* false */) const;
  77. [[nodiscard]] std::unique_ptr<PublicKeyDCRTPoly> MultiAddPubKeys(
  78. const PublicKeyDCRTPoly& publicKey1, const PublicKeyDCRTPoly& publicKey2,
  79. const std::string& keyId /* "" */) const;
  80. [[nodiscard]] std::unique_ptr<KeyPairDCRTPoly> SparseKeyGen() const;
  81. void EvalMultKeyGen(const PrivateKeyDCRTPoly& key) const;
  82. void EvalMultKeysGen(const PrivateKeyDCRTPoly& key) const;
  83. void EvalRotateKeyGen(const PrivateKeyDCRTPoly& privateKey,
  84. const std::vector<int32_t>& indexList,
  85. const PublicKeyDCRTPoly& publicKey /* GenNullPublicKeyDCRTPoly() */) const;
  86. void EvalAtIndexKeyGen(const PrivateKeyDCRTPoly& privateKey,
  87. const std::vector<int32_t>& indexList,
  88. const PublicKeyDCRTPoly& publicKey /* GenNullPublicKeyDCRTPoly() */) const;
  89. void EvalCKKStoFHEWPrecompute(const double scale /* 1.0 */) const;
  90. [[nodiscard]] uint32_t GetRingDimension() const;
  91. [[nodiscard]] uint32_t GetCyclotomicOrder() const;
  92. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSin(const CiphertextDCRTPoly& ciphertext,
  93. const double a, const double b, const uint32_t degree) const;
  94. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalCos(const CiphertextDCRTPoly& ciphertext,
  95. const double a, const double b, const uint32_t degree) const;
  96. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EncryptByPublicKey(
  97. const PublicKeyDCRTPoly& publicKey, const Plaintext& plaintext) const;
  98. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EncryptByPrivateKey(
  99. const PrivateKeyDCRTPoly& privateKey, const Plaintext& plaintext) const;
  100. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddByCiphertexts(
  101. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
  102. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddByCiphertextAndPlaintext(
  103. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const;
  104. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddByPlaintextAndCiphertext(
  105. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const;
  106. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddByConstAndCiphertext(
  107. const double constant, const CiphertextDCRTPoly& ciphertext) const;
  108. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddByCiphertextAndConst(
  109. const CiphertextDCRTPoly& ciphertext, const double constant) const;
  110. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddMutableByCiphertexts(
  111. CiphertextDCRTPoly& ciphertext1, CiphertextDCRTPoly& ciphertext2) const;
  112. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddMutableByCiphertextAndPlaintext(
  113. CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const;
  114. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddMutableByPlaintextAndCiphertext(
  115. const Plaintext& plaintext, CiphertextDCRTPoly& ciphertext) const;
  116. void EvalAddInPlaceByCiphertexts(CiphertextDCRTPoly& ciphertext1,
  117. const CiphertextDCRTPoly& ciphertext2) const;
  118. void EvalAddInPlaceByCiphertextAndPlaintext(CiphertextDCRTPoly& ciphertext,
  119. const Plaintext& plaintext) const;
  120. void EvalAddInPlaceByPlaintextAndCiphertext(const Plaintext& plaintext,
  121. CiphertextDCRTPoly& ciphertext) const;
  122. void EvalAddInPlaceByCiphertextAndConst(CiphertextDCRTPoly& ciphertext,
  123. const double constant) const;
  124. void EvalAddInPlaceByConstAndCiphertext(const double constant,
  125. CiphertextDCRTPoly& ciphertext) const;
  126. void EvalAddMutableInPlace(CiphertextDCRTPoly& ciphertext1,
  127. CiphertextDCRTPoly& ciphertext2) const;
  128. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByCiphertexts(
  129. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
  130. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByCiphertextAndPlaintext(
  131. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const;
  132. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByPlaintextAndCiphertext(
  133. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const;
  134. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByConstAndCiphertext(
  135. const double constant, const CiphertextDCRTPoly& ciphertext) const;
  136. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByCiphertextAndConst(
  137. const CiphertextDCRTPoly& ciphertext, const double constant) const;
  138. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubMutableByCiphertexts(
  139. CiphertextDCRTPoly& ciphertext1, CiphertextDCRTPoly& ciphertext2) const;
  140. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubMutableByCiphertextAndPlaintext(
  141. CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const;
  142. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubMutableByPlaintextAndCiphertext(
  143. const Plaintext& plaintext, CiphertextDCRTPoly& ciphertext) const;
  144. void EvalSubInPlaceByCiphertexts(CiphertextDCRTPoly& ciphertext1,
  145. const CiphertextDCRTPoly& ciphertext2) const;
  146. void EvalSubInPlaceByCiphertextAndConst(CiphertextDCRTPoly& ciphertext,
  147. const double constant) const;
  148. void EvalSubInPlaceByConstAndCiphertext(const double constant,
  149. CiphertextDCRTPoly& ciphertext) const;
  150. void EvalSubMutableInPlace(CiphertextDCRTPoly& ciphertext1,
  151. CiphertextDCRTPoly& ciphertext2) const;
  152. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByCiphertexts(
  153. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
  154. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByCiphertextAndPlaintext(
  155. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const;
  156. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByPlaintextAndCiphertext(
  157. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const;
  158. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByConstAndCiphertext(
  159. const double constant, const CiphertextDCRTPoly& ciphertext) const;
  160. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByCiphertextAndConst(
  161. const CiphertextDCRTPoly& ciphertext, const double constant) const;
  162. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultMutableByCiphertexts(
  163. CiphertextDCRTPoly& ciphertext1, CiphertextDCRTPoly& ciphertext2) const;
  164. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultMutableByCiphertextAndPlaintext(
  165. CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const;
  166. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultMutableByPlaintextAndCiphertext(
  167. const Plaintext& plaintext, CiphertextDCRTPoly& ciphertext) const;
  168. void EvalMultInPlaceByCiphertextAndConst(CiphertextDCRTPoly& ciphertext,
  169. const double constant) const;
  170. void EvalMultInPlaceByConstAndCiphertext(const double constant,
  171. CiphertextDCRTPoly& ciphertext) const;
  172. void EvalMultMutableInPlace(CiphertextDCRTPoly& ciphertext1,
  173. CiphertextDCRTPoly& ciphertext2) const;
  174. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultNoRelin(
  175. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
  176. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultAndRelinearize(
  177. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
  178. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalRotate(
  179. const CiphertextDCRTPoly& ciphertext, const int32_t index) const;
  180. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalPoly(
  181. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients) const;
  182. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> KeySwitchDown(
  183. const CiphertextDCRTPoly& ciphertext) const;
  184. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> KeySwitchExt(
  185. const CiphertextDCRTPoly& ciphertext, const bool addFirst) const;
  186. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> Compress(
  187. const CiphertextDCRTPoly& ciphertext, const uint32_t towersLeft /* 1 */) const;
  188. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalNegate(
  189. const CiphertextDCRTPoly& ciphertext) const;
  190. void EvalNegateInPlace(CiphertextDCRTPoly& ciphertext) const;
  191. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSquare(
  192. const CiphertextDCRTPoly& ciphertext) const;
  193. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSquareMutable(
  194. CiphertextDCRTPoly& ciphertext) const;
  195. void EvalSquareInPlace(CiphertextDCRTPoly& ciphertext) const;
  196. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAtIndex(
  197. const CiphertextDCRTPoly& ciphertext, const uint32_t index) const;
  198. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> ComposedEvalMult(
  199. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
  200. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> Relinearize(
  201. const CiphertextDCRTPoly& ciphertext) const;
  202. void RelinearizeInPlace(CiphertextDCRTPoly& ciphertext) const;
  203. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalChebyshevSeries(
  204. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients,
  205. const double a, const double b) const;
  206. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalChebyshevFunction(
  207. rust::Fn<void(const double x, double& ret)> func, const CiphertextDCRTPoly& ciphertext,
  208. const double a, const double b, const uint32_t degree) const;
  209. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalBootstrap(
  210. const CiphertextDCRTPoly& ciphertext, const uint32_t numIterations /* 1 */,
  211. const uint32_t precision /* 0 */) const;
  212. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> Rescale(
  213. const CiphertextDCRTPoly& ciphertext) const;
  214. void RescaleInPlace(CiphertextDCRTPoly& ciphertext) const;
  215. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> ModReduce(
  216. const CiphertextDCRTPoly& ciphertext) const;
  217. void ModReduceInPlace(CiphertextDCRTPoly& ciphertext) const;
  218. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSum(const CiphertextDCRTPoly& ciphertext,
  219. const uint32_t batchSize) const;
  220. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalPolyLinear(
  221. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients) const;
  222. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalPolyPS(
  223. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients) const;
  224. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalChebyshevSeriesLinear(
  225. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients,
  226. const double a, const double b) const;
  227. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalChebyshevSeriesPS(
  228. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients,
  229. const double a, const double b) const;
  230. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalDivide(
  231. const CiphertextDCRTPoly& ciphertext, const double a, const double b,
  232. const uint32_t degree) const;
  233. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> IntMPBootAdjustScale(
  234. const CiphertextDCRTPoly& ciphertext) const;
  235. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalLogistic(
  236. const CiphertextDCRTPoly& ciphertext, const double a, const double b,
  237. const uint32_t degree) const;
  238. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> IntMPBootRandomElementGen(
  239. const PublicKeyDCRTPoly& publicKey) const;
  240. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalCompareSchemeSwitching(
  241. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2,
  242. const uint32_t numCtxts /* 0 */, const uint32_t numSlots /* 0 */,
  243. const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */,
  244. const bool unit /* false */) const;
  245. void EvalBootstrapSetup(const std::vector<uint32_t>& levelBudget /* {5, 4} */,
  246. const std::vector<uint32_t>& dim1 /* {0, 0} */, const uint32_t slots /* 0 */,
  247. const uint32_t correctionFactor /* 0 */, const bool precompute /* true */) const;
  248. void EvalBootstrapKeyGen(const PrivateKeyDCRTPoly& privateKey, const uint32_t slots) const;
  249. void EvalBootstrapPrecompute(const uint32_t slots /* 0 */) const;
  250. [[nodiscard]] std::unique_ptr<DecryptResult> DecryptByPrivateKeyAndCiphertext(
  251. const PrivateKeyDCRTPoly& privateKey, const CiphertextDCRTPoly& ciphertext,
  252. Plaintext& plaintext) const;
  253. [[nodiscard]] std::unique_ptr<DecryptResult> DecryptByCiphertextAndPrivateKey(
  254. const CiphertextDCRTPoly& ciphertext, const PrivateKeyDCRTPoly& privateKey,
  255. Plaintext& plaintext) const;
  256. [[nodiscard]] std::unique_ptr<DecryptResult> MultipartyDecryptFusion(
  257. const VectorOfCiphertexts& partialCiphertextVec, Plaintext& plaintext) const;
  258. [[nodiscard]] std::unique_ptr<Plaintext> MakePackedPlaintext(
  259. const std::vector<int64_t>& value, const size_t noiseScaleDeg /* 1 */,
  260. const uint32_t level /* 0 */) const;
  261. [[nodiscard]] std::unique_ptr<Plaintext> MakeStringPlaintext(const std::string& s) const;
  262. [[nodiscard]] std::unique_ptr<Plaintext> MakeCoefPackedPlaintext(
  263. const std::vector<int64_t>& value, const size_t noiseScaleDeg /* 1 */,
  264. const uint32_t level /* 0 */) const;
  265. [[nodiscard]] std::unique_ptr<Plaintext> MakeCKKSPackedPlaintextByVectorOfDouble(
  266. const std::vector<double>& value, const size_t scaleDeg /* 1 */,
  267. const uint32_t level /* 0 */, const DCRTPolyParams& params /* GenNullDCRTPolyParams() */,
  268. const uint32_t slots /* 0 */) const;
  269. [[nodiscard]] std::unique_ptr<Plaintext> MakeCKKSPackedPlaintextByVectorOfComplex(
  270. const std::vector<ComplexPair>& value, const size_t scaleDeg /* 1 */,
  271. const uint32_t level /* 0 */, const DCRTPolyParams& params /* GenNullDCRTPolyParams() */,
  272. const uint32_t slots /* 0 */) const;
  273. [[nodiscard]] std::unique_ptr<std::vector<uint32_t>> FindAutomorphismIndices(
  274. const std::vector<uint32_t>& idxList) const;
  275. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalInnerProductByCiphertexts(
  276. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2,
  277. const uint32_t batchSize) const;
  278. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalInnerProductByCiphertextAndPlaintext(
  279. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext,
  280. const uint32_t batchSize) const;
  281. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalInnerProductByPlaintextAndCiphertext(
  282. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext,
  283. const uint32_t batchSize) const;
  284. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> KeySwitch(
  285. const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey) const;
  286. void KeySwitchInPlace(CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey) const;
  287. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> LevelReduce(
  288. const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey,
  289. const size_t levels /* 1 */) const;
  290. void LevelReduceInPlace(CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey,
  291. const size_t levels /* 1 */) const;
  292. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> ReEncrypt(
  293. const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey,
  294. const PublicKeyDCRTPoly& publicKey /* GenNullPublicKeyDCRTPoly() */) const;
  295. [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> KeySwitchGen(
  296. const PrivateKeyDCRTPoly& oldPrivateKey, const PrivateKeyDCRTPoly& newPrivateKey) const;
  297. [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> ReKeyGen(
  298. const PrivateKeyDCRTPoly& oldPrivateKey, const PublicKeyDCRTPoly& newPublicKey) const;
  299. [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> MultiKeySwitchGen(
  300. const PrivateKeyDCRTPoly& originalPrivateKey, const PrivateKeyDCRTPoly& newPrivateKey,
  301. const EvalKeyDCRTPoly& evalKey) const;
  302. [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> MultiAddEvalKeys(
  303. const EvalKeyDCRTPoly& evalKey1, const EvalKeyDCRTPoly& evalKey2,
  304. const std::string& keyId /* "" */) const;
  305. [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> MultiMultEvalKey(
  306. const PrivateKeyDCRTPoly& privateKey, const EvalKeyDCRTPoly& evalKey,
  307. const std::string& keyId /* "" */) const;
  308. [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> MultiAddEvalMultKeys(
  309. const EvalKeyDCRTPoly& evalKey1, const EvalKeyDCRTPoly& evalKey2,
  310. const std::string& keyId /* "" */) const;
  311. void EvalSumKeyGen(const PrivateKeyDCRTPoly& privateKey,
  312. const PublicKeyDCRTPoly& publicKey /* GenNullPublicKeyDCRTPoly() */) const;
  313. void EvalCKKStoFHEWKeyGen(const KeyPairDCRTPoly& keyPair, const LWEPrivateKey& lwesk) const;
  314. void EvalFHEWtoCKKSKeyGen(const KeyPairDCRTPoly& keyPair, const LWEPrivateKey& lwesk,
  315. const uint32_t numSlots /* 0 */, const uint32_t numCtxts /* 0 */,
  316. const uint32_t dim1 /* 0 */, const uint32_t L /* 0 */) const;
  317. void EvalSchemeSwitchingKeyGen(const KeyPairDCRTPoly& keyPair,
  318. const LWEPrivateKey& lwesk) const;
  319. [[nodiscard]] uint64_t GetModulus() const;
  320. [[nodiscard]] uint64_t GetRootOfUnity() const;
  321. [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> MultipartyDecryptLead(
  322. const VectorOfCiphertexts& ciphertextVec, const PrivateKeyDCRTPoly& privateKey) const;
  323. [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> MultipartyDecryptMain(
  324. const VectorOfCiphertexts& ciphertextVec, const PrivateKeyDCRTPoly& privateKey) const;
  325. [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> IntMPBootDecrypt(
  326. const PrivateKeyDCRTPoly& privateKey, const CiphertextDCRTPoly& ciphertext,
  327. const CiphertextDCRTPoly& a) const;
  328. [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> EvalMinSchemeSwitching(
  329. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  330. const uint32_t numValues /* 0 */, const uint32_t numSlots /* 0 */,
  331. const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */) const;
  332. [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> EvalMinSchemeSwitchingAlt(
  333. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  334. const uint32_t numValues /* 0 */, const uint32_t numSlots /* 0 */,
  335. const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */) const;
  336. [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> EvalMaxSchemeSwitching(
  337. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  338. const uint32_t numValues /* 0 */, const uint32_t numSlots /* 0 */,
  339. const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */) const;
  340. [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> EvalMaxSchemeSwitchingAlt(
  341. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  342. const uint32_t numValues /* 0 */, const uint32_t numSlots /* 0 */,
  343. const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */) const;
  344. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddMany(
  345. const VectorOfCiphertexts& ciphertextVec) const;
  346. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultMany(
  347. const VectorOfCiphertexts& ciphertextVec) const;
  348. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMerge(
  349. const VectorOfCiphertexts& ciphertextVec) const;
  350. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> IntMPBootEncrypt(
  351. const PublicKeyDCRTPoly& publicKey, const VectorOfCiphertexts& sharesPair,
  352. const CiphertextDCRTPoly& a, const CiphertextDCRTPoly& ciphertext) const;
  353. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddManyInPlace(
  354. VectorOfCiphertexts& ciphertextVec) const;
  355. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalLinearWSumMutable(
  356. VectorOfCiphertexts& ciphertextVec, const std::vector<double>& constantsVec) const;
  357. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalLinearWSumMutable(
  358. const std::vector<double>& constantsVec, VectorOfCiphertexts& ciphertextVec) const;
  359. [[nodiscard]] std::unique_ptr<KeyPairDCRTPoly> MultipartyKeyGenByVectorOfPrivateKeys(
  360. const VectorOfPrivateKeys& privateKeyVec) const;
  361. [[nodiscard]] std::unique_ptr<UnorderedMapFromIndexToDCRTPoly> ShareKeys(
  362. const PrivateKeyDCRTPoly& sk, const uint32_t N, const uint32_t threshold,
  363. const uint32_t index, const std::string& shareType) const;
  364. void RecoverSharedKey(PrivateKeyDCRTPoly& sk, UnorderedMapFromIndexToDCRTPoly& sk_shares,
  365. const uint32_t N, const uint32_t threshold, const std::string& shareType) const;
  366. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAutomorphism(
  367. const CiphertextDCRTPoly& ciphertext, const uint32_t i,
  368. const MapFromIndexToEvalKey& evalKeyMap) const;
  369. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSumRows(
  370. const CiphertextDCRTPoly& ciphertext, const uint32_t rowSize,
  371. const MapFromIndexToEvalKey& evalSumKeyMap, const uint32_t subringDim /* 0 */) const;
  372. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSumCols(
  373. const CiphertextDCRTPoly& ciphertext, const uint32_t rowSize,
  374. const MapFromIndexToEvalKey& evalSumKeyMap) const;
  375. [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> EvalAutomorphismKeyGen(
  376. const PrivateKeyDCRTPoly& privateKey, const std::vector<uint32_t>& indexList) const;
  377. [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> EvalSumRowsKeyGen(
  378. const PrivateKeyDCRTPoly& privateKey,
  379. const PublicKeyDCRTPoly& publicKey /* GenNullPublicKeyDCRTPoly() */,
  380. const uint32_t rowSize /* 0 */, const uint32_t subringDim /* 0 */) const;
  381. [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> EvalSumColsKeyGen(
  382. const PrivateKeyDCRTPoly& privateKey,
  383. const PublicKeyDCRTPoly& publicKey /* GenNullPublicKeyDCRTPoly() */) const;
  384. [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> MultiEvalAutomorphismKeyGen(
  385. const PrivateKeyDCRTPoly& privateKey, const MapFromIndexToEvalKey& evalKeyMap,
  386. const std::vector<uint32_t>& indexList, const std::string& keyId /* "" */) const;
  387. [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> MultiEvalAtIndexKeyGen(
  388. const PrivateKeyDCRTPoly& privateKey, const MapFromIndexToEvalKey& evalKeyMap,
  389. const std::vector<int32_t>& indexList, const std::string& keyId /* "" */) const;
  390. [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> MultiEvalSumKeyGen(
  391. const PrivateKeyDCRTPoly& privateKey, const MapFromIndexToEvalKey& evalKeyMap,
  392. const std::string& keyId /* "" */) const;
  393. [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> MultiAddEvalSumKeys(
  394. const MapFromIndexToEvalKey& evalKeyMap1, const MapFromIndexToEvalKey& evalKeyMap2,
  395. const std::string& keyId /* "" */) const;
  396. [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> MultiAddEvalAutomorphismKeys(
  397. const MapFromIndexToEvalKey& evalKeyMap1, const MapFromIndexToEvalKey& evalKeyMap2,
  398. const std::string& keyId /* "" */) const;
  399. [[nodiscard]] std::unique_ptr<VectorOfDCRTPolys> EvalFastRotationPrecompute(
  400. const CiphertextDCRTPoly& ciphertext) const;
  401. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalFastRotation(
  402. const CiphertextDCRTPoly& ciphertext, const uint32_t index, const uint32_t m,
  403. const VectorOfDCRTPolys& digits) const;
  404. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalFastRotationExt(
  405. const CiphertextDCRTPoly& ciphertext, const uint32_t index,
  406. const VectorOfDCRTPolys& digits, const bool addFirst) const;
  407. [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalFHEWtoCKKS(
  408. VectorOfLWECiphertexts& LWECiphertexts, const uint32_t numCtxts /* 0 */,
  409. const uint32_t numSlots /* 0 */, const uint32_t p /* 4 */, const double pmin /* 0.0 */,
  410. const double pmax /* 2.0 */, const uint32_t dim1 /* 0 */) const;
  411. [[nodiscard]] std::unique_ptr<VectorOfLWECiphertexts> EvalCKKStoFHEW(
  412. const CiphertextDCRTPoly& ciphertext, const uint32_t numCtxts /* 0 */) const;
  413. [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> IntMPBootAdd(
  414. VectorOfVectorOfCiphertexts& sharesPairVec) const;
  415. [[nodiscard]] std::unique_ptr<SchemeBaseDCRTPoly> GetScheme() const;
  416. [[nodiscard]] std::unique_ptr<CryptoParametersBaseDCRTPoly> GetCryptoParameters() const;
  417. [[nodiscard]] std::unique_ptr<EncodingParams> GetEncodingParams() const;
  418. [[nodiscard]] std::unique_ptr<DCRTPoly> KeySwitchDownFirstElement(
  419. const CiphertextDCRTPoly& ciphertext) const;
  420. [[nodiscard]] std::unique_ptr<DCRTPolyParams> GetElementParams() const;
  421. [[nodiscard]] std::shared_ptr<CryptoContextImpl>& GetRef() noexcept;
  422. [[nodiscard]] const std::shared_ptr<CryptoContextImpl>& GetRef() const noexcept;
  423. };
  424. // cxx currently does not support static class methods
  425. void DCRTPolyClearEvalMultKeys();
  426. void DCRTPolyClearEvalMultKeysById(const std::string& id);
  427. void DCRTPolyClearEvalMultKeysByCryptoContext(const CryptoContextDCRTPoly& cryptoContext);
  428. void DCRTPolyClearEvalSumKeys();
  429. void DCRTPolyClearEvalSumKeysById(const std::string& id);
  430. void DCRTPolyClearEvalSumKeysByCryptoContext(const CryptoContextDCRTPoly& cryptoContext);
  431. void DCRTPolyClearEvalAutomorphismKeys();
  432. void DCRTPolyClearEvalAutomorphismKeysById(const std::string& id);
  433. void DCRTPolyClearEvalAutomorphismKeysByCryptoContext(const CryptoContextDCRTPoly& cryptoContext);
  434. [[nodiscard]] std::unique_ptr<std::vector<uint32_t>> DCRTPolyGetExistingEvalAutomorphismKeyIndices(
  435. const std::string& keyTag);
  436. [[nodiscard]] std::unique_ptr<std::vector<uint32_t>> DCRTPolyGetUniqueValues(
  437. const std::vector<uint32_t>& oldValues, const std::vector<uint32_t>& newValues);
  438. [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> DCRTPolyGetEvalAutomorphismKeyMap(
  439. const std::string& keyID);
  440. [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> DCRTPolyGetCopyOfEvalSumKeyMap(
  441. const std::string& id);
  442. [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> DCRTPolyGetEvalAutomorphismKeyMapPtr(
  443. const std::string& keyID);
  444. void DCRTPolyInsertEvalAutomorphismKey(const MapFromIndexToEvalKey& evalKeyMap,
  445. const std::string& keyTag /* "" */);
  446. void DCRTPolyInsertEvalSumKey(const MapFromIndexToEvalKey& mapToInsert,
  447. const std::string& keyTag /* "" */);
  448. [[nodiscard]] std::unique_ptr<VectorOfEvalKeys> DCRTPolyGetCopyOfEvalMultKeyVector(
  449. const std::string& keyID);
  450. void DCRTPolyInsertEvalMultKey(const VectorOfEvalKeys& evalKeyVec);
  451. [[nodiscard]] std::unique_ptr<MapFromStringToVectorOfEvalKeys> DCRTPolyGetCopyOfAllEvalMultKeys();
  452. [[nodiscard]] std::unique_ptr<MapFromStringToMapFromIndexToEvalKey>
  453. DCRTPolyGetCopyOfAllEvalSumKeys();
  454. [[nodiscard]] std::unique_ptr<MapFromStringToMapFromIndexToEvalKey>
  455. DCRTPolyGetCopyOfAllEvalAutomorphismKeys();
  456. [[nodiscard]] std::unique_ptr<Plaintext> DCRTPolyGetPlaintextForDecrypt(
  457. const PlaintextEncodings pte, const DCRTPolyParams& evp, const EncodingParams& ep);
  458. // Generator functions
  459. [[nodiscard]] std::unique_ptr<CryptoContextDCRTPoly> DCRTPolyGenNullCryptoContext();
  460. [[nodiscard]] std::unique_ptr<CryptoContextDCRTPoly> DCRTPolyGenCryptoContextByParamsBFVRNS(
  461. const ParamsBFVRNS& params);
  462. [[nodiscard]] std::unique_ptr<CryptoContextDCRTPoly> DCRTPolyGenCryptoContextByParamsBGVRNS(
  463. const ParamsBGVRNS& params);
  464. [[nodiscard]] std::unique_ptr<CryptoContextDCRTPoly> DCRTPolyGenCryptoContextByParamsCKKSRNS(
  465. const ParamsCKKSRNS& params);
  466. } // openfhe