CryptoContext.cc 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965
  1. #include "CryptoContext.h"
  2. #include "openfhe/pke/gen-cryptocontext.h"
  3. #include "openfhe/pke/scheme/bfvrns/gen-cryptocontext-bfvrns.h"
  4. #include "openfhe/pke/scheme/bgvrns/gen-cryptocontext-bgvrns.h"
  5. #include "openfhe/pke/scheme/ckksrns/gen-cryptocontext-ckksrns.h"
  6. #include "openfhe/src/lib.rs.h" // ComplexPair
  7. #include "Ciphertext.h"
  8. #include "KeyPair.h"
  9. #include "Plaintext.h"
  10. #include "PrivateKey.h"
  11. #include "PublicKey.h"
  12. #include "EvalKey.h"
  13. #include "LWEPrivateKey.h"
  14. #include "VectorOfCiphertexts.h"
  15. namespace openfhe
  16. {
  17. using PlaintextImpl = lbcrypto::PlaintextImpl;
  18. CryptoContextDCRTPoly::CryptoContextDCRTPoly(const ParamsBFVRNS& params)
  19. : m_cryptoContextImplSharedPtr(lbcrypto::GenCryptoContext(params))
  20. { }
  21. CryptoContextDCRTPoly::CryptoContextDCRTPoly(const ParamsBGVRNS& params)
  22. : m_cryptoContextImplSharedPtr(lbcrypto::GenCryptoContext(params))
  23. { }
  24. CryptoContextDCRTPoly::CryptoContextDCRTPoly(const ParamsCKKSRNS& params)
  25. : m_cryptoContextImplSharedPtr(lbcrypto::GenCryptoContext(params))
  26. { }
  27. std::unique_ptr<Plaintext> CryptoContextDCRTPoly::MakeCKKSPackedPlaintextByVectorOfComplex(
  28. const std::vector<ComplexPair>& value, const size_t scaleDeg, const uint32_t level,
  29. const std::shared_ptr<DCRTPolyParams> params, const uint32_t slots) const
  30. {
  31. std::vector<std::complex<double>> v;
  32. v.reserve(value.size());
  33. for (const ComplexPair& elem : value)
  34. {
  35. v.emplace_back(elem.re, elem.im);
  36. }
  37. return std::make_unique<Plaintext>(m_cryptoContextImplSharedPtr->MakeCKKSPackedPlaintext(
  38. v, scaleDeg, level, params, slots));
  39. }
  40. void CryptoContextDCRTPoly::SetSchemeId(const SCHEME schemeTag) const
  41. {
  42. m_cryptoContextImplSharedPtr->setSchemeId(schemeTag);
  43. }
  44. SCHEME CryptoContextDCRTPoly::GetSchemeId() const
  45. {
  46. return m_cryptoContextImplSharedPtr->getSchemeId();
  47. }
  48. size_t CryptoContextDCRTPoly::GetKeyGenLevel() const
  49. {
  50. return m_cryptoContextImplSharedPtr->GetKeyGenLevel();
  51. }
  52. void CryptoContextDCRTPoly::SetKeyGenLevel(const size_t level) const
  53. {
  54. m_cryptoContextImplSharedPtr->SetKeyGenLevel(level);
  55. }
  56. void CryptoContextDCRTPoly::SetSwkFC(const CiphertextDCRTPoly& FHEWtoCKKSswk) const
  57. {
  58. m_cryptoContextImplSharedPtr->SetSwkFC(FHEWtoCKKSswk.GetInternal());
  59. }
  60. void CryptoContextDCRTPoly::EvalCompareSwitchPrecompute(const uint32_t pLWE,
  61. const double scaleSign, const bool unit) const
  62. {
  63. m_cryptoContextImplSharedPtr->EvalCompareSwitchPrecompute(pLWE, scaleSign, unit);
  64. }
  65. uint32_t CryptoContextDCRTPoly::FindAutomorphismIndex(const uint32_t idx) const
  66. {
  67. return m_cryptoContextImplSharedPtr->FindAutomorphismIndex(idx);
  68. }
  69. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::GetSwkFC() const
  70. {
  71. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->GetSwkFC());
  72. }
  73. void CryptoContextDCRTPoly::Enable(const PKESchemeFeature feature) const
  74. {
  75. m_cryptoContextImplSharedPtr->Enable(feature);
  76. }
  77. void CryptoContextDCRTPoly::EnableByMask(const uint32_t featureMask) const
  78. {
  79. m_cryptoContextImplSharedPtr->Enable(featureMask);
  80. }
  81. std::unique_ptr<KeyPairDCRTPoly> CryptoContextDCRTPoly::KeyGen() const
  82. {
  83. return std::make_unique<KeyPairDCRTPoly>(m_cryptoContextImplSharedPtr->KeyGen());
  84. }
  85. std::unique_ptr<KeyPairDCRTPoly> CryptoContextDCRTPoly::MultipartyKeyGen(
  86. const PublicKeyDCRTPoly& publicKey, const bool makeSparse, const bool fresh) const
  87. {
  88. return std::make_unique<KeyPairDCRTPoly>(m_cryptoContextImplSharedPtr->MultipartyKeyGen(
  89. publicKey.GetInternal(), makeSparse, fresh));
  90. }
  91. std::unique_ptr<PublicKeyDCRTPoly> CryptoContextDCRTPoly::MultiAddPubKeys(
  92. const PublicKeyDCRTPoly& publicKey1, const PublicKeyDCRTPoly& publicKey2,
  93. const std::string& keyId) const
  94. {
  95. return std::make_unique<PublicKeyDCRTPoly>(m_cryptoContextImplSharedPtr->MultiAddPubKeys(
  96. publicKey1.GetInternal(), publicKey2.GetInternal(), keyId));
  97. }
  98. std::unique_ptr<KeyPairDCRTPoly> CryptoContextDCRTPoly::SparseKeyGen() const
  99. {
  100. return std::make_unique<KeyPairDCRTPoly>(m_cryptoContextImplSharedPtr->SparseKeyGen());
  101. }
  102. void CryptoContextDCRTPoly::EvalMultKeyGen(const PrivateKeyDCRTPoly& key) const
  103. {
  104. m_cryptoContextImplSharedPtr->EvalMultKeyGen(key.GetInternal());
  105. }
  106. void CryptoContextDCRTPoly::EvalMultKeysGen(const PrivateKeyDCRTPoly& key) const
  107. {
  108. m_cryptoContextImplSharedPtr->EvalMultKeysGen(key.GetInternal());
  109. }
  110. void CryptoContextDCRTPoly::EvalRotateKeyGen(const PrivateKeyDCRTPoly& privateKey,
  111. const std::vector<int32_t>& indexList, const PublicKeyDCRTPoly& publicKey) const
  112. {
  113. m_cryptoContextImplSharedPtr->EvalRotateKeyGen(privateKey.GetInternal(), indexList,
  114. publicKey.GetInternal());
  115. }
  116. void CryptoContextDCRTPoly::EvalAtIndexKeyGen(const PrivateKeyDCRTPoly& privateKey,
  117. const std::vector<int32_t>& indexList, const PublicKeyDCRTPoly& publicKey) const
  118. {
  119. m_cryptoContextImplSharedPtr->EvalAtIndexKeyGen(privateKey.GetInternal(), indexList,
  120. publicKey.GetInternal());
  121. }
  122. void CryptoContextDCRTPoly::EvalCKKStoFHEWPrecompute(const double scale) const
  123. {
  124. m_cryptoContextImplSharedPtr->EvalCKKStoFHEWPrecompute(scale);
  125. }
  126. std::unique_ptr<Plaintext> CryptoContextDCRTPoly::MakePackedPlaintext(
  127. const std::vector<int64_t>& value, const size_t noiseScaleDeg,
  128. const uint32_t level) const
  129. {
  130. return std::make_unique<Plaintext>(m_cryptoContextImplSharedPtr->MakePackedPlaintext(value,
  131. noiseScaleDeg, level));
  132. }
  133. std::unique_ptr<Plaintext> CryptoContextDCRTPoly::MakeStringPlaintext(const std::string& s) const
  134. {
  135. return std::make_unique<Plaintext>(m_cryptoContextImplSharedPtr->MakeStringPlaintext(s));
  136. }
  137. std::unique_ptr<Plaintext> CryptoContextDCRTPoly::MakeCoefPackedPlaintext(
  138. const std::vector<int64_t>& value, const size_t noiseScaleDeg, const uint32_t level) const
  139. {
  140. return std::make_unique<Plaintext>(m_cryptoContextImplSharedPtr->MakeCoefPackedPlaintext(value,
  141. noiseScaleDeg, level));
  142. }
  143. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EncryptByPublicKey(
  144. const PublicKeyDCRTPoly& publicKey, const Plaintext& plaintext) const
  145. {
  146. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->Encrypt(
  147. publicKey.GetInternal(), plaintext.GetInternal()));
  148. }
  149. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EncryptByPrivateKey(
  150. const PrivateKeyDCRTPoly& privateKey, const Plaintext& plaintext) const
  151. {
  152. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->Encrypt(
  153. privateKey.GetInternal(), plaintext.GetInternal()));
  154. }
  155. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddByCiphertexts(
  156. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  157. {
  158. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAdd(
  159. ciphertext1.GetInternal(), ciphertext2.GetInternal()));
  160. }
  161. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddByCiphertextAndPlaintext(
  162. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
  163. {
  164. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAdd(
  165. ciphertext.GetInternal(), plaintext.GetInternal()));
  166. }
  167. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddByPlaintextAndCiphertext(
  168. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const
  169. {
  170. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAdd(
  171. plaintext.GetInternal(), ciphertext.GetInternal()));
  172. }
  173. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddByConstAndCiphertext(
  174. const double constant, const CiphertextDCRTPoly& ciphertext) const
  175. {
  176. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAdd(
  177. constant, ciphertext.GetInternal()));
  178. }
  179. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddByCiphertextAndConst(
  180. const CiphertextDCRTPoly& ciphertext, const double constant) const
  181. {
  182. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAdd(
  183. ciphertext.GetInternal(), constant));
  184. }
  185. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddMutableByCiphertexts(
  186. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  187. {
  188. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  189. std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
  190. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAddMutable(
  191. c1, c2));
  192. }
  193. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddMutableByCiphertextAndPlaintext(
  194. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
  195. {
  196. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  197. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAddMutable(c,
  198. plaintext.GetInternal()));
  199. }
  200. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddMutableByPlaintextAndCiphertext(
  201. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const
  202. {
  203. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  204. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAddMutable(
  205. plaintext.GetInternal(), c));
  206. }
  207. void CryptoContextDCRTPoly::EvalAddInPlaceByCiphertexts(const CiphertextDCRTPoly& ciphertext1,
  208. const CiphertextDCRTPoly& ciphertext2) const
  209. {
  210. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  211. m_cryptoContextImplSharedPtr->EvalAddInPlace(c1, ciphertext2.GetInternal());
  212. }
  213. void CryptoContextDCRTPoly::EvalAddInPlaceByCiphertextAndPlaintext(
  214. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
  215. {
  216. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  217. m_cryptoContextImplSharedPtr->EvalAddInPlace(c, plaintext.GetInternal());
  218. }
  219. void CryptoContextDCRTPoly::EvalAddInPlaceByPlaintextAndCiphertext(const Plaintext& plaintext,
  220. const CiphertextDCRTPoly& ciphertext) const
  221. {
  222. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  223. m_cryptoContextImplSharedPtr->EvalAddInPlace(plaintext.GetInternal(), c);
  224. }
  225. void CryptoContextDCRTPoly::EvalAddInPlaceByCiphertextAndConst(
  226. const CiphertextDCRTPoly& ciphertext, const double constant) const
  227. {
  228. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  229. m_cryptoContextImplSharedPtr->EvalAddInPlace(c, constant);
  230. }
  231. void CryptoContextDCRTPoly::EvalAddInPlaceByConstAndCiphertext(const double constant,
  232. const CiphertextDCRTPoly& ciphertext) const
  233. {
  234. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  235. m_cryptoContextImplSharedPtr->EvalAddInPlace(constant, c);
  236. }
  237. void CryptoContextDCRTPoly::EvalAddMutableInPlace(const CiphertextDCRTPoly& ciphertext1,
  238. const CiphertextDCRTPoly& ciphertext2) const
  239. {
  240. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  241. std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
  242. m_cryptoContextImplSharedPtr->EvalAddMutableInPlace(c1, c2);
  243. }
  244. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubByCiphertexts(
  245. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  246. {
  247. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSub(
  248. ciphertext1.GetInternal(), ciphertext2.GetInternal()));
  249. }
  250. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubByCiphertextAndPlaintext(
  251. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
  252. {
  253. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSub(
  254. ciphertext.GetInternal(), plaintext.GetInternal()));
  255. }
  256. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubByPlaintextAndCiphertext(
  257. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const
  258. {
  259. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSub(
  260. plaintext.GetInternal(), ciphertext.GetInternal()));
  261. }
  262. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubByConstAndCiphertext(
  263. const double constant, const CiphertextDCRTPoly& ciphertext) const
  264. {
  265. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSub(
  266. constant, ciphertext.GetInternal()));
  267. }
  268. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubByCiphertextAndConst(
  269. const CiphertextDCRTPoly& ciphertext, const double constant) const
  270. {
  271. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSub(
  272. ciphertext.GetInternal(), constant));
  273. }
  274. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubMutableByCiphertexts(
  275. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  276. {
  277. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  278. std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
  279. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSubMutable(
  280. c1, c2));
  281. }
  282. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubMutableByCiphertextAndPlaintext(
  283. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
  284. {
  285. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  286. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSubMutable(c,
  287. plaintext.GetInternal()));
  288. }
  289. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubMutableByPlaintextAndCiphertext(
  290. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const
  291. {
  292. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  293. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSubMutable(
  294. plaintext.GetInternal(), c));
  295. }
  296. void CryptoContextDCRTPoly::EvalSubInPlaceByCiphertexts(const CiphertextDCRTPoly& ciphertext1,
  297. const CiphertextDCRTPoly& ciphertext2) const
  298. {
  299. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  300. m_cryptoContextImplSharedPtr->EvalSubInPlace(c1, ciphertext2.GetInternal());
  301. }
  302. void CryptoContextDCRTPoly::EvalSubInPlaceByCiphertextAndConst(
  303. const CiphertextDCRTPoly& ciphertext, const double constant) const
  304. {
  305. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  306. m_cryptoContextImplSharedPtr->EvalSubInPlace(c, constant);
  307. }
  308. void CryptoContextDCRTPoly::EvalSubInPlaceByConstAndCiphertext(const double constant,
  309. const CiphertextDCRTPoly& ciphertext) const
  310. {
  311. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  312. m_cryptoContextImplSharedPtr->EvalSubInPlace(constant, c);
  313. }
  314. void CryptoContextDCRTPoly::EvalSubMutableInPlace(const CiphertextDCRTPoly& ciphertext1,
  315. const CiphertextDCRTPoly& ciphertext2) const
  316. {
  317. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  318. std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
  319. m_cryptoContextImplSharedPtr->EvalSubMutableInPlace(c1, c2);
  320. }
  321. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultByCiphertexts(
  322. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  323. {
  324. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMult(
  325. ciphertext1.GetInternal(), ciphertext2.GetInternal()));
  326. }
  327. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultByCiphertextAndPlaintext(
  328. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
  329. {
  330. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMult(
  331. ciphertext.GetInternal(), plaintext.GetInternal()));
  332. }
  333. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultByPlaintextAndCiphertext(
  334. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const
  335. {
  336. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMult(
  337. plaintext.GetInternal(), ciphertext.GetInternal()));
  338. }
  339. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultByConstAndCiphertext(
  340. const double constant, const CiphertextDCRTPoly& ciphertext) const
  341. {
  342. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMult(
  343. constant, ciphertext.GetInternal()));
  344. }
  345. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultByCiphertextAndConst(
  346. const CiphertextDCRTPoly& ciphertext, const double constant) const
  347. {
  348. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMult(
  349. ciphertext.GetInternal(), constant));
  350. }
  351. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultMutableByCiphertexts(
  352. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  353. {
  354. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  355. std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
  356. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMultMutable(
  357. c1, c2));
  358. }
  359. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultMutableByCiphertextAndPlaintext(
  360. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
  361. {
  362. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  363. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMultMutable(c,
  364. plaintext.GetInternal()));
  365. }
  366. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultMutableByPlaintextAndCiphertext(
  367. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const
  368. {
  369. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  370. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMultMutable(
  371. plaintext.GetInternal(), c));
  372. }
  373. void CryptoContextDCRTPoly::EvalMultInPlaceByCiphertextAndConst(
  374. const CiphertextDCRTPoly& ciphertext, const double constant) const
  375. {
  376. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  377. m_cryptoContextImplSharedPtr->EvalMultInPlace(c, constant);
  378. }
  379. void CryptoContextDCRTPoly::EvalMultInPlaceByConstAndCiphertext(const double constant,
  380. const CiphertextDCRTPoly& ciphertext) const
  381. {
  382. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  383. m_cryptoContextImplSharedPtr->EvalMultInPlace(constant, c);
  384. }
  385. void CryptoContextDCRTPoly::EvalMultMutableInPlace(const CiphertextDCRTPoly& ciphertext1,
  386. const CiphertextDCRTPoly& ciphertext2) const
  387. {
  388. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  389. std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
  390. m_cryptoContextImplSharedPtr->EvalMultMutableInPlace(c1, c2);
  391. }
  392. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultNoRelin(
  393. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  394. {
  395. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMultNoRelin(
  396. ciphertext1.GetInternal(), ciphertext2.GetInternal()));
  397. }
  398. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultAndRelinearize(
  399. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  400. {
  401. return std::make_unique<CiphertextDCRTPoly>(
  402. m_cryptoContextImplSharedPtr->EvalMultAndRelinearize(ciphertext1.GetInternal(),
  403. ciphertext2.GetInternal()));
  404. }
  405. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalRotate(
  406. const CiphertextDCRTPoly& ciphertext, const int32_t index) const
  407. {
  408. return std::make_unique<CiphertextDCRTPoly>(
  409. m_cryptoContextImplSharedPtr->EvalRotate(ciphertext.GetInternal(), index));
  410. }
  411. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalChebyshevSeries(
  412. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients,
  413. const double a, const double b) const
  414. {
  415. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalChebyshevSeries(
  416. ciphertext.GetInternal(), coefficients, a, b));
  417. }
  418. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalChebyshevFunction(
  419. rust::Fn<void(const double x, double& ret)> func, const CiphertextDCRTPoly& ciphertext,
  420. const double a, const double b, const uint32_t degree) const
  421. {
  422. return std::make_unique<CiphertextDCRTPoly>(
  423. m_cryptoContextImplSharedPtr->EvalChebyshevFunction([&](const double x){
  424. double result; func(x, result); return result; }, ciphertext.GetInternal(), a, b, degree));
  425. }
  426. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalCompareSchemeSwitching(
  427. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2,
  428. const uint32_t numCtxts, const uint32_t numSlots, const uint32_t pLWE, const double scaleSign,
  429. const bool unit) const
  430. {
  431. return std::make_unique<CiphertextDCRTPoly>(
  432. m_cryptoContextImplSharedPtr->EvalCompareSchemeSwitching(ciphertext1.GetInternal(),
  433. ciphertext2.GetInternal(), numCtxts, numSlots, pLWE, scaleSign, unit));
  434. }
  435. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::Rescale(
  436. const CiphertextDCRTPoly& ciphertext) const
  437. {
  438. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->Rescale(
  439. ciphertext.GetInternal()));
  440. }
  441. void CryptoContextDCRTPoly::RescaleInPlace(const CiphertextDCRTPoly& ciphertext) const
  442. {
  443. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  444. m_cryptoContextImplSharedPtr->RescaleInPlace(c);
  445. }
  446. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::ModReduce(
  447. const CiphertextDCRTPoly& ciphertext) const
  448. {
  449. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->ModReduce(
  450. ciphertext.GetInternal()));
  451. }
  452. void CryptoContextDCRTPoly::ModReduceInPlace(const CiphertextDCRTPoly& ciphertext) const
  453. {
  454. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  455. m_cryptoContextImplSharedPtr->ModReduceInPlace(c);
  456. }
  457. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSum(
  458. const CiphertextDCRTPoly& ciphertext, const uint32_t batchSize) const
  459. {
  460. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSum(
  461. ciphertext.GetInternal(), batchSize));
  462. }
  463. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalPolyLinear(
  464. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients) const
  465. {
  466. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalPolyLinear(
  467. ciphertext.GetInternal(), coefficients));
  468. }
  469. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalPolyPS(
  470. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients) const
  471. {
  472. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalPolyPS(
  473. ciphertext.GetInternal(), coefficients));
  474. }
  475. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalChebyshevSeriesLinear(
  476. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients,
  477. const double a, const double b) const
  478. {
  479. return std::make_unique<CiphertextDCRTPoly>(
  480. m_cryptoContextImplSharedPtr->EvalChebyshevSeriesLinear(ciphertext.GetInternal(),
  481. coefficients, a, b));
  482. }
  483. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalChebyshevSeriesPS(
  484. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients,
  485. const double a, const double b) const
  486. {
  487. return std::make_unique<CiphertextDCRTPoly>(
  488. m_cryptoContextImplSharedPtr->EvalChebyshevSeriesPS(ciphertext.GetInternal(), coefficients,
  489. a, b));
  490. }
  491. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalDivide(
  492. const CiphertextDCRTPoly& ciphertext, const double a, const double b,
  493. const uint32_t degree) const
  494. {
  495. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalDivide(
  496. ciphertext.GetInternal(), a, b, degree));
  497. }
  498. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::IntMPBootAdjustScale(
  499. const CiphertextDCRTPoly& ciphertext) const
  500. {
  501. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->IntMPBootAdjustScale(
  502. ciphertext.GetInternal()));
  503. }
  504. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalLogistic(
  505. const CiphertextDCRTPoly& ciphertext, const double a, const double b,
  506. const uint32_t degree) const
  507. {
  508. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalLogistic(
  509. ciphertext.GetInternal(), a, b, degree));
  510. }
  511. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::IntMPBootRandomElementGen(
  512. const PublicKeyDCRTPoly& publicKey) const
  513. {
  514. return std::make_unique<CiphertextDCRTPoly>(
  515. m_cryptoContextImplSharedPtr->IntMPBootRandomElementGen(publicKey.GetInternal()));
  516. }
  517. void CryptoContextDCRTPoly::EvalBootstrapSetup(
  518. const std::vector<uint32_t>& levelBudget, const std::vector<uint32_t>& dim1,
  519. const uint32_t slots, const uint32_t correctionFactor, const bool precompute) const
  520. {
  521. m_cryptoContextImplSharedPtr->EvalBootstrapSetup(levelBudget, dim1, slots, correctionFactor,
  522. precompute);
  523. }
  524. void CryptoContextDCRTPoly::EvalBootstrapKeyGen(const PrivateKeyDCRTPoly& privateKey,
  525. const uint32_t slots) const
  526. {
  527. m_cryptoContextImplSharedPtr->EvalBootstrapKeyGen(privateKey.GetInternal(), slots);
  528. }
  529. void CryptoContextDCRTPoly::EvalBootstrapPrecompute(const uint32_t slots) const
  530. {
  531. m_cryptoContextImplSharedPtr->EvalBootstrapPrecompute(slots);
  532. }
  533. std::unique_ptr<DecryptResult> CryptoContextDCRTPoly::DecryptByPrivateKeyAndCiphertext(
  534. const PrivateKeyDCRTPoly& privateKey, const CiphertextDCRTPoly& ciphertext,
  535. Plaintext& plaintext) const
  536. {
  537. std::shared_ptr<PlaintextImpl> res;
  538. std::unique_ptr<DecryptResult> result = std::make_unique<DecryptResult>(
  539. m_cryptoContextImplSharedPtr->Decrypt(privateKey.GetInternal(), ciphertext.GetInternal(),
  540. &res));
  541. plaintext = res;
  542. return result;
  543. }
  544. std::unique_ptr<DecryptResult> CryptoContextDCRTPoly::DecryptByCiphertextAndPrivateKey(
  545. const CiphertextDCRTPoly& ciphertext, const PrivateKeyDCRTPoly& privateKey,
  546. Plaintext& plaintext) const
  547. {
  548. std::shared_ptr<PlaintextImpl> res;
  549. std::unique_ptr<DecryptResult> result = std::make_unique<DecryptResult>(
  550. m_cryptoContextImplSharedPtr->Decrypt(ciphertext.GetInternal(), privateKey.GetInternal(),
  551. &res));
  552. plaintext = res;
  553. return result;
  554. }
  555. uint32_t CryptoContextDCRTPoly::GetRingDimension() const
  556. {
  557. return m_cryptoContextImplSharedPtr->GetRingDimension();
  558. }
  559. uint32_t CryptoContextDCRTPoly::GetCyclotomicOrder() const
  560. {
  561. return m_cryptoContextImplSharedPtr->GetCyclotomicOrder();
  562. }
  563. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSin(
  564. const CiphertextDCRTPoly& ciphertext,
  565. const double a, const double b, const uint32_t degree) const
  566. {
  567. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSin(
  568. ciphertext.GetInternal(), a, b, degree));
  569. }
  570. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalCos(
  571. const CiphertextDCRTPoly& ciphertext,
  572. const double a, const double b, const uint32_t degree) const
  573. {
  574. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalCos(
  575. ciphertext.GetInternal(), a, b, degree));
  576. }
  577. std::unique_ptr<Plaintext> CryptoContextDCRTPoly::MakeCKKSPackedPlaintext(
  578. const std::vector<double>& value, const size_t scaleDeg, const uint32_t level,
  579. const std::shared_ptr<DCRTPolyParams> params, const uint32_t slots) const
  580. {
  581. return std::make_unique<Plaintext>(m_cryptoContextImplSharedPtr->MakeCKKSPackedPlaintext(
  582. value, scaleDeg, level, params, slots));
  583. }
  584. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalPoly(
  585. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients) const
  586. {
  587. return std::make_unique<CiphertextDCRTPoly>(
  588. m_cryptoContextImplSharedPtr->EvalPoly(ciphertext.GetInternal(), coefficients));
  589. }
  590. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::KeySwitchDown(
  591. const CiphertextDCRTPoly& ciphertext) const
  592. {
  593. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->KeySwitchDown(
  594. ciphertext.GetInternal()));
  595. }
  596. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::KeySwitchExt(
  597. const CiphertextDCRTPoly& ciphertext, const bool addFirst) const
  598. {
  599. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->KeySwitchExt(
  600. ciphertext.GetInternal(), addFirst));
  601. }
  602. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::Compress(
  603. const CiphertextDCRTPoly& ciphertext, const uint32_t towersLeft) const
  604. {
  605. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->Compress(
  606. ciphertext.GetInternal(), towersLeft));
  607. }
  608. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalNegate(
  609. const CiphertextDCRTPoly& ciphertext) const
  610. {
  611. return std::make_unique<CiphertextDCRTPoly>(
  612. m_cryptoContextImplSharedPtr->EvalNegate(ciphertext.GetInternal()));
  613. }
  614. void CryptoContextDCRTPoly::EvalNegateInPlace(const CiphertextDCRTPoly& ciphertext) const
  615. {
  616. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  617. m_cryptoContextImplSharedPtr->EvalNegateInPlace(c);
  618. }
  619. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSquare(
  620. const CiphertextDCRTPoly& ciphertext) const
  621. {
  622. return std::make_unique<CiphertextDCRTPoly>(
  623. m_cryptoContextImplSharedPtr->EvalSquare(ciphertext.GetInternal()));
  624. }
  625. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSquareMutable(
  626. const CiphertextDCRTPoly& ciphertext) const
  627. {
  628. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  629. return std::make_unique<CiphertextDCRTPoly>(
  630. m_cryptoContextImplSharedPtr->EvalSquareMutable(c));
  631. }
  632. void CryptoContextDCRTPoly::EvalSquareInPlace(const CiphertextDCRTPoly& ciphertext) const
  633. {
  634. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  635. m_cryptoContextImplSharedPtr->EvalSquareInPlace(c);
  636. }
  637. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAtIndex(
  638. const CiphertextDCRTPoly& ciphertext, const uint32_t index) const
  639. {
  640. return std::make_unique<CiphertextDCRTPoly>(
  641. m_cryptoContextImplSharedPtr->EvalAtIndex(ciphertext.GetInternal(), index));
  642. }
  643. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::ComposedEvalMult(
  644. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  645. {
  646. return std::make_unique<CiphertextDCRTPoly>(
  647. m_cryptoContextImplSharedPtr->ComposedEvalMult(ciphertext1.GetInternal(),
  648. ciphertext2.GetInternal()));
  649. }
  650. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::Relinearize(
  651. const CiphertextDCRTPoly& ciphertext) const
  652. {
  653. return std::make_unique<CiphertextDCRTPoly>(
  654. m_cryptoContextImplSharedPtr->Relinearize(ciphertext.GetInternal()));
  655. }
  656. void CryptoContextDCRTPoly::RelinearizeInPlace(const CiphertextDCRTPoly& ciphertext) const
  657. {
  658. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  659. m_cryptoContextImplSharedPtr->RelinearizeInPlace(c);
  660. }
  661. std::unique_ptr<std::vector<uint32_t>> CryptoContextDCRTPoly::FindAutomorphismIndices(
  662. const std::vector<uint32_t>& idxList) const
  663. {
  664. return std::make_unique<std::vector<uint32_t>>(
  665. m_cryptoContextImplSharedPtr->FindAutomorphismIndices(idxList));
  666. }
  667. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalInnerProductByCiphertexts(
  668. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2,
  669. const uint32_t batchSize) const
  670. {
  671. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalInnerProduct(
  672. ciphertext1.GetInternal(), ciphertext2.GetInternal(), batchSize));
  673. }
  674. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalInnerProductByPlaintext(
  675. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext,
  676. const uint32_t batchSize) const
  677. {
  678. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalInnerProduct(
  679. ciphertext.GetInternal(), plaintext.GetInternal(), batchSize));
  680. }
  681. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::KeySwitch(
  682. const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey) const
  683. {
  684. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->KeySwitch(
  685. ciphertext.GetInternal(), evalKey.GetInternal()));
  686. }
  687. void CryptoContextDCRTPoly::KeySwitchInPlace(const CiphertextDCRTPoly& ciphertext,
  688. const EvalKeyDCRTPoly& evalKey) const
  689. {
  690. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  691. m_cryptoContextImplSharedPtr->KeySwitchInPlace(c, evalKey.GetInternal());
  692. }
  693. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::LevelReduce(
  694. const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey,
  695. const size_t levels) const
  696. {
  697. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->LevelReduce(
  698. ciphertext.GetInternal(), evalKey.GetInternal(), levels));
  699. }
  700. void CryptoContextDCRTPoly::LevelReduceInPlace(const CiphertextDCRTPoly& ciphertext,
  701. const EvalKeyDCRTPoly& evalKey, const size_t levels) const
  702. {
  703. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  704. m_cryptoContextImplSharedPtr->LevelReduceInPlace(c, evalKey.GetInternal(), levels);
  705. }
  706. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::ReEncrypt(
  707. const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey,
  708. const PublicKeyDCRTPoly& publicKey) const
  709. {
  710. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->ReEncrypt(
  711. ciphertext.GetInternal(), evalKey.GetInternal(), publicKey.GetInternal()));
  712. }
  713. std::unique_ptr<EvalKeyDCRTPoly> CryptoContextDCRTPoly::KeySwitchGen(
  714. const PrivateKeyDCRTPoly& oldPrivateKey, const PrivateKeyDCRTPoly& newPrivateKey) const
  715. {
  716. return std::make_unique<EvalKeyDCRTPoly>(m_cryptoContextImplSharedPtr->KeySwitchGen(
  717. oldPrivateKey.GetInternal(), newPrivateKey.GetInternal()));
  718. }
  719. std::unique_ptr<EvalKeyDCRTPoly> CryptoContextDCRTPoly::ReKeyGen(
  720. const PrivateKeyDCRTPoly& oldPrivateKey, const PublicKeyDCRTPoly& newPublicKey) const
  721. {
  722. return std::make_unique<EvalKeyDCRTPoly>(m_cryptoContextImplSharedPtr->ReKeyGen(
  723. oldPrivateKey.GetInternal(), newPublicKey.GetInternal()));
  724. }
  725. std::unique_ptr<EvalKeyDCRTPoly> CryptoContextDCRTPoly::MultiKeySwitchGen(
  726. const PrivateKeyDCRTPoly& originalPrivateKey, const PrivateKeyDCRTPoly& newPrivateKey,
  727. const EvalKeyDCRTPoly& evalKey) const
  728. {
  729. return std::make_unique<EvalKeyDCRTPoly>(m_cryptoContextImplSharedPtr->MultiKeySwitchGen(
  730. originalPrivateKey.GetInternal(), newPrivateKey.GetInternal(), evalKey.GetInternal()));
  731. }
  732. std::unique_ptr<EvalKeyDCRTPoly> CryptoContextDCRTPoly::MultiAddEvalKeys(
  733. const EvalKeyDCRTPoly& evalKey1, const EvalKeyDCRTPoly& evalKey2,
  734. const std::string& keyId) const
  735. {
  736. return std::make_unique<EvalKeyDCRTPoly>(m_cryptoContextImplSharedPtr->MultiAddEvalKeys(
  737. evalKey1.GetInternal(), evalKey2.GetInternal(), keyId));
  738. }
  739. std::unique_ptr<EvalKeyDCRTPoly> CryptoContextDCRTPoly::MultiMultEvalKey(
  740. const PrivateKeyDCRTPoly& privateKey, const EvalKeyDCRTPoly& evalKey,
  741. const std::string& keyId) const
  742. {
  743. return std::make_unique<EvalKeyDCRTPoly>(m_cryptoContextImplSharedPtr->MultiMultEvalKey(
  744. privateKey.GetInternal(), evalKey.GetInternal(), keyId));
  745. }
  746. std::unique_ptr<EvalKeyDCRTPoly> CryptoContextDCRTPoly::MultiAddEvalMultKeys(
  747. const EvalKeyDCRTPoly& evalKey1, const EvalKeyDCRTPoly& evalKey2,
  748. const std::string& keyId) const
  749. {
  750. return std::make_unique<EvalKeyDCRTPoly>(m_cryptoContextImplSharedPtr->MultiAddEvalMultKeys(
  751. evalKey1.GetInternal(), evalKey2.GetInternal(), keyId));
  752. }
  753. void CryptoContextDCRTPoly::EvalSumKeyGen(const PrivateKeyDCRTPoly& privateKey,
  754. const PublicKeyDCRTPoly& publicKey) const
  755. {
  756. m_cryptoContextImplSharedPtr->EvalSumKeyGen(privateKey.GetInternal(), publicKey.GetInternal());
  757. }
  758. void CryptoContextDCRTPoly::EvalCKKStoFHEWKeyGen(const KeyPairDCRTPoly& keyPair,
  759. const LWEPrivateKey& lwesk) const
  760. {
  761. m_cryptoContextImplSharedPtr->EvalCKKStoFHEWKeyGen({keyPair.GetPublicKey()->GetInternal(),
  762. keyPair.GetPrivateKey()->GetInternal()}, lwesk.GetInternal());
  763. }
  764. void CryptoContextDCRTPoly::EvalFHEWtoCKKSKeyGen(const KeyPairDCRTPoly& keyPair,
  765. const LWEPrivateKey& lwesk, const uint32_t numSlots, const uint32_t numCtxts,
  766. const uint32_t dim1, const uint32_t L) const
  767. {
  768. m_cryptoContextImplSharedPtr->EvalFHEWtoCKKSKeyGen({keyPair.GetPublicKey()->GetInternal(),
  769. keyPair.GetPrivateKey()->GetInternal()}, lwesk.GetInternal(), numSlots, numCtxts, dim1, L);
  770. }
  771. void CryptoContextDCRTPoly::EvalSchemeSwitchingKeyGen(const KeyPairDCRTPoly& keyPair,
  772. const LWEPrivateKey& lwesk) const
  773. {
  774. m_cryptoContextImplSharedPtr->EvalSchemeSwitchingKeyGen({keyPair.GetPublicKey()->GetInternal(),
  775. keyPair.GetPrivateKey()->GetInternal()}, lwesk.GetInternal());
  776. }
  777. uint64_t CryptoContextDCRTPoly::GetModulus() const
  778. {
  779. return m_cryptoContextImplSharedPtr->GetModulus().ConvertToInt();
  780. }
  781. uint64_t CryptoContextDCRTPoly::GetRootOfUnity() const
  782. {
  783. return m_cryptoContextImplSharedPtr->GetRootOfUnity().ConvertToInt();
  784. }
  785. std::unique_ptr<VectorOfCiphertexts> CryptoContextDCRTPoly::MultipartyDecryptLead(
  786. const VectorOfCiphertexts& ciphertextVec, const PrivateKeyDCRTPoly& privateKey) const
  787. {
  788. return std::make_unique<VectorOfCiphertexts>(
  789. m_cryptoContextImplSharedPtr->MultipartyDecryptLead(ciphertextVec.GetInternal(),
  790. privateKey.GetInternal()));
  791. }
  792. std::unique_ptr<VectorOfCiphertexts> CryptoContextDCRTPoly::MultipartyDecryptMain(
  793. const VectorOfCiphertexts& ciphertextVec, const PrivateKeyDCRTPoly& privateKey) const
  794. {
  795. return std::make_unique<VectorOfCiphertexts>(
  796. m_cryptoContextImplSharedPtr->MultipartyDecryptMain(ciphertextVec.GetInternal(),
  797. privateKey.GetInternal()));
  798. }
  799. std::unique_ptr<VectorOfCiphertexts> CryptoContextDCRTPoly::IntMPBootDecrypt(
  800. const PrivateKeyDCRTPoly& privateKey, const CiphertextDCRTPoly& ciphertext,
  801. const CiphertextDCRTPoly& a) const
  802. {
  803. return std::make_unique<VectorOfCiphertexts>(m_cryptoContextImplSharedPtr->IntMPBootDecrypt(
  804. privateKey.GetInternal(), ciphertext.GetInternal(), a.GetInternal()));
  805. }
  806. std::unique_ptr<VectorOfCiphertexts> CryptoContextDCRTPoly::EvalMinSchemeSwitching(
  807. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  808. const uint32_t numValues, const uint32_t numSlots, const uint32_t pLWE,
  809. const double scaleSign) const
  810. {
  811. return std::make_unique<VectorOfCiphertexts>(
  812. m_cryptoContextImplSharedPtr->EvalMinSchemeSwitching(ciphertext.GetInternal(),
  813. publicKey.GetInternal(), numValues, numSlots, pLWE, scaleSign));
  814. }
  815. std::unique_ptr<VectorOfCiphertexts> CryptoContextDCRTPoly::EvalMinSchemeSwitchingAlt(
  816. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  817. const uint32_t numValues, const uint32_t numSlots, const uint32_t pLWE,
  818. const double scaleSign) const
  819. {
  820. return std::make_unique<VectorOfCiphertexts>(
  821. m_cryptoContextImplSharedPtr->EvalMinSchemeSwitchingAlt(ciphertext.GetInternal(),
  822. publicKey.GetInternal(), numValues, numSlots, pLWE, scaleSign));
  823. }
  824. std::unique_ptr<VectorOfCiphertexts> CryptoContextDCRTPoly::EvalMaxSchemeSwitching(
  825. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  826. const uint32_t numValues, const uint32_t numSlots, const uint32_t pLWE,
  827. const double scaleSign) const
  828. {
  829. return std::make_unique<VectorOfCiphertexts>(
  830. m_cryptoContextImplSharedPtr->EvalMaxSchemeSwitching(ciphertext.GetInternal(),
  831. publicKey.GetInternal(), numValues, numSlots, pLWE, scaleSign));
  832. }
  833. std::unique_ptr<VectorOfCiphertexts> CryptoContextDCRTPoly::EvalMaxSchemeSwitchingAlt(
  834. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  835. const uint32_t numValues, const uint32_t numSlots, const uint32_t pLWE,
  836. const double scaleSign) const
  837. {
  838. return std::make_unique<VectorOfCiphertexts>(
  839. m_cryptoContextImplSharedPtr->EvalMaxSchemeSwitchingAlt(ciphertext.GetInternal(),
  840. publicKey.GetInternal(), numValues, numSlots, pLWE, scaleSign));
  841. }
  842. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddMany(
  843. const VectorOfCiphertexts& ciphertextVec) const
  844. {
  845. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAddMany(
  846. ciphertextVec.GetInternal()));
  847. }
  848. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultMany(
  849. const VectorOfCiphertexts& ciphertextVec) const
  850. {
  851. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMultMany(
  852. ciphertextVec.GetInternal()));
  853. }
  854. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMerge(
  855. const VectorOfCiphertexts& ciphertextVec) const
  856. {
  857. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMerge(
  858. ciphertextVec.GetInternal()));
  859. }
  860. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::IntMPBootEncrypt(
  861. const PublicKeyDCRTPoly& publicKey, const VectorOfCiphertexts& sharesPair,
  862. const CiphertextDCRTPoly& a, const CiphertextDCRTPoly& ciphertext) const
  863. {
  864. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->IntMPBootEncrypt(
  865. publicKey.GetInternal(), sharesPair.GetInternal(), a.GetInternal(),
  866. ciphertext.GetInternal()));
  867. }
  868. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddManyInPlace(
  869. VectorOfCiphertexts& ciphertextVec) const
  870. {
  871. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAddManyInPlace(
  872. ciphertextVec.GetInternal()));
  873. }
  874. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalLinearWSumMutable(
  875. VectorOfCiphertexts& ciphertextVec, const std::vector<double>& constantsVec) const
  876. {
  877. return std::make_unique<CiphertextDCRTPoly>(
  878. m_cryptoContextImplSharedPtr->EvalLinearWSumMutable(ciphertextVec.GetInternal(),
  879. constantsVec));
  880. }
  881. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalLinearWSumMutable(
  882. const std::vector<double>& constantsVec, VectorOfCiphertexts& ciphertextVec) const
  883. {
  884. return std::make_unique<CiphertextDCRTPoly>(
  885. m_cryptoContextImplSharedPtr->EvalLinearWSumMutable(constantsVec,
  886. ciphertextVec.GetInternal()));
  887. }
  888. std::shared_ptr<CryptoContextImpl> CryptoContextDCRTPoly::GetInternal() const
  889. {
  890. return m_cryptoContextImplSharedPtr;
  891. }
  892. // cxx currently does not support static class methods
  893. void ClearEvalMultKeys()
  894. {
  895. CryptoContextImpl::ClearEvalMultKeys();
  896. }
  897. void ClearEvalMultKeysById(const std::string& id)
  898. {
  899. CryptoContextImpl::ClearEvalMultKeys(id);
  900. }
  901. void ClearEvalMultKeysByCryptoContext(const CryptoContextDCRTPoly& cryptoContext)
  902. {
  903. CryptoContextImpl::ClearEvalMultKeys(cryptoContext.GetInternal());
  904. }
  905. void ClearEvalSumKeys()
  906. {
  907. CryptoContextImpl::ClearEvalSumKeys();
  908. }
  909. void ClearEvalSumKeysById(const std::string& id)
  910. {
  911. CryptoContextImpl::ClearEvalSumKeys(id);
  912. }
  913. void ClearEvalSumKeysByCryptoContext(const CryptoContextDCRTPoly& cryptoContext)
  914. {
  915. CryptoContextImpl::ClearEvalSumKeys(cryptoContext.GetInternal());
  916. }
  917. void ClearEvalAutomorphismKeys()
  918. {
  919. CryptoContextImpl::ClearEvalAutomorphismKeys();
  920. }
  921. void ClearEvalAutomorphismKeysById(const std::string& id)
  922. {
  923. CryptoContextImpl::ClearEvalAutomorphismKeys(id);
  924. }
  925. void ClearEvalAutomorphismKeysByCryptoContext(const CryptoContextDCRTPoly& cryptoContext)
  926. {
  927. CryptoContextImpl::ClearEvalAutomorphismKeys(cryptoContext.GetInternal());
  928. }
  929. std::unique_ptr<std::vector<uint32_t>> GetExistingEvalAutomorphismKeyIndices(
  930. const std::string& keyTag)
  931. {
  932. return std::make_unique<std::vector<uint32_t>>(
  933. CryptoContextImpl::GetExistingEvalAutomorphismKeyIndices(keyTag));
  934. }
  935. std::unique_ptr<std::vector<uint32_t>> GetUniqueValues(const std::vector<uint32_t>& oldValues,
  936. const std::vector<uint32_t>& newValues)
  937. {
  938. return std::make_unique<std::vector<uint32_t>>(CryptoContextImpl::GetUniqueValues(oldValues,
  939. newValues));
  940. }
  941. std::unique_ptr<CryptoContextDCRTPoly> GenNullCryptoContext()
  942. {
  943. return std::make_unique<CryptoContextDCRTPoly>();
  944. }
  945. std::unique_ptr<CryptoContextDCRTPoly> GenCryptoContextByParamsBFVRNS(const ParamsBFVRNS& params)
  946. {
  947. return std::make_unique<CryptoContextDCRTPoly>(params);
  948. }
  949. std::unique_ptr<CryptoContextDCRTPoly> GenCryptoContextByParamsBGVRNS(const ParamsBGVRNS& params)
  950. {
  951. return std::make_unique<CryptoContextDCRTPoly>(params);
  952. }
  953. std::unique_ptr<CryptoContextDCRTPoly> GenCryptoContextByParamsCKKSRNS(const ParamsCKKSRNS& params)
  954. {
  955. return std::make_unique<CryptoContextDCRTPoly>(params);
  956. }
  957. } // openfhe