CryptoContext.cc 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196
  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"
  7. #include "AssociativeContainerOfOpaqueTypes.h"
  8. #include "Ciphertext.h"
  9. #include "CryptoParametersBase.h"
  10. #include "DCRTPoly.h"
  11. #include "DecryptResult.h"
  12. #include "EncodingParams.h"
  13. #include "EvalKey.h"
  14. #include "KeyPair.h"
  15. #include "LWEPrivateKey.h"
  16. #include "Plaintext.h"
  17. #include "PrivateKey.h"
  18. #include "PublicKey.h"
  19. #include "SchemeBase.h"
  20. #include "SequenceContainerOfOpaqueTypes.h"
  21. namespace openfhe
  22. {
  23. using PlaintextImpl = lbcrypto::PlaintextImpl;
  24. CryptoContextDCRTPoly::CryptoContextDCRTPoly(const ParamsBFVRNS& params)
  25. : m_cryptoContextImplSharedPtr(lbcrypto::GenCryptoContext(params))
  26. { }
  27. CryptoContextDCRTPoly::CryptoContextDCRTPoly(const ParamsBGVRNS& params)
  28. : m_cryptoContextImplSharedPtr(lbcrypto::GenCryptoContext(params))
  29. { }
  30. CryptoContextDCRTPoly::CryptoContextDCRTPoly(const ParamsCKKSRNS& params)
  31. : m_cryptoContextImplSharedPtr(lbcrypto::GenCryptoContext(params))
  32. { }
  33. std::unique_ptr<Plaintext> CryptoContextDCRTPoly::MakeCKKSPackedPlaintextByVectorOfComplex(
  34. const std::vector<ComplexPair>& value, const size_t scaleDeg, const uint32_t level,
  35. const DCRTPolyParams& params, const uint32_t slots) const
  36. {
  37. std::vector<std::complex<double>> v;
  38. v.reserve(value.size());
  39. for (const ComplexPair& elem : value)
  40. {
  41. v.emplace_back(elem.re, elem.im);
  42. }
  43. return std::make_unique<Plaintext>(m_cryptoContextImplSharedPtr->MakeCKKSPackedPlaintext(v,
  44. scaleDeg, level, params.GetInternal(), slots));
  45. }
  46. void CryptoContextDCRTPoly::SetSchemeId(const SCHEME schemeTag) const
  47. {
  48. m_cryptoContextImplSharedPtr->setSchemeId(schemeTag);
  49. }
  50. SCHEME CryptoContextDCRTPoly::GetSchemeId() const
  51. {
  52. return m_cryptoContextImplSharedPtr->getSchemeId();
  53. }
  54. size_t CryptoContextDCRTPoly::GetKeyGenLevel() const
  55. {
  56. return m_cryptoContextImplSharedPtr->GetKeyGenLevel();
  57. }
  58. void CryptoContextDCRTPoly::SetKeyGenLevel(const size_t level) const
  59. {
  60. m_cryptoContextImplSharedPtr->SetKeyGenLevel(level);
  61. }
  62. void CryptoContextDCRTPoly::SetSwkFC(const CiphertextDCRTPoly& FHEWtoCKKSswk) const
  63. {
  64. m_cryptoContextImplSharedPtr->SetSwkFC(FHEWtoCKKSswk.GetInternal());
  65. }
  66. void CryptoContextDCRTPoly::EvalCompareSwitchPrecompute(const uint32_t pLWE,
  67. const double scaleSign, const bool unit) const
  68. {
  69. m_cryptoContextImplSharedPtr->EvalCompareSwitchPrecompute(pLWE, scaleSign, unit);
  70. }
  71. uint32_t CryptoContextDCRTPoly::FindAutomorphismIndex(const uint32_t idx) const
  72. {
  73. return m_cryptoContextImplSharedPtr->FindAutomorphismIndex(idx);
  74. }
  75. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::GetSwkFC() const
  76. {
  77. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->GetSwkFC());
  78. }
  79. void CryptoContextDCRTPoly::Enable(const PKESchemeFeature feature) const
  80. {
  81. m_cryptoContextImplSharedPtr->Enable(feature);
  82. }
  83. void CryptoContextDCRTPoly::EnableByMask(const uint32_t featureMask) const
  84. {
  85. m_cryptoContextImplSharedPtr->Enable(featureMask);
  86. }
  87. std::unique_ptr<KeyPairDCRTPoly> CryptoContextDCRTPoly::KeyGen() const
  88. {
  89. return std::make_unique<KeyPairDCRTPoly>(m_cryptoContextImplSharedPtr->KeyGen());
  90. }
  91. std::unique_ptr<KeyPairDCRTPoly> CryptoContextDCRTPoly::MultipartyKeyGenByPublicKey(
  92. const PublicKeyDCRTPoly& publicKey, const bool makeSparse, const bool fresh) const
  93. {
  94. return std::make_unique<KeyPairDCRTPoly>(m_cryptoContextImplSharedPtr->MultipartyKeyGen(
  95. publicKey.GetInternal(), makeSparse, fresh));
  96. }
  97. std::unique_ptr<PublicKeyDCRTPoly> CryptoContextDCRTPoly::MultiAddPubKeys(
  98. const PublicKeyDCRTPoly& publicKey1, const PublicKeyDCRTPoly& publicKey2,
  99. const std::string& keyId) const
  100. {
  101. return std::make_unique<PublicKeyDCRTPoly>(m_cryptoContextImplSharedPtr->MultiAddPubKeys(
  102. publicKey1.GetInternal(), publicKey2.GetInternal(), keyId));
  103. }
  104. std::unique_ptr<KeyPairDCRTPoly> CryptoContextDCRTPoly::SparseKeyGen() const
  105. {
  106. return std::make_unique<KeyPairDCRTPoly>(m_cryptoContextImplSharedPtr->SparseKeyGen());
  107. }
  108. void CryptoContextDCRTPoly::EvalMultKeyGen(const PrivateKeyDCRTPoly& key) const
  109. {
  110. m_cryptoContextImplSharedPtr->EvalMultKeyGen(key.GetInternal());
  111. }
  112. void CryptoContextDCRTPoly::EvalMultKeysGen(const PrivateKeyDCRTPoly& key) const
  113. {
  114. m_cryptoContextImplSharedPtr->EvalMultKeysGen(key.GetInternal());
  115. }
  116. void CryptoContextDCRTPoly::EvalRotateKeyGen(const PrivateKeyDCRTPoly& privateKey,
  117. const std::vector<int32_t>& indexList, const PublicKeyDCRTPoly& publicKey) const
  118. {
  119. m_cryptoContextImplSharedPtr->EvalRotateKeyGen(privateKey.GetInternal(), indexList,
  120. publicKey.GetInternal());
  121. }
  122. void CryptoContextDCRTPoly::EvalAtIndexKeyGen(const PrivateKeyDCRTPoly& privateKey,
  123. const std::vector<int32_t>& indexList, const PublicKeyDCRTPoly& publicKey) const
  124. {
  125. m_cryptoContextImplSharedPtr->EvalAtIndexKeyGen(privateKey.GetInternal(), indexList,
  126. publicKey.GetInternal());
  127. }
  128. void CryptoContextDCRTPoly::EvalCKKStoFHEWPrecompute(const double scale) const
  129. {
  130. m_cryptoContextImplSharedPtr->EvalCKKStoFHEWPrecompute(scale);
  131. }
  132. std::unique_ptr<Plaintext> CryptoContextDCRTPoly::MakePackedPlaintext(
  133. const std::vector<int64_t>& value, const size_t noiseScaleDeg,
  134. const uint32_t level) const
  135. {
  136. return std::make_unique<Plaintext>(m_cryptoContextImplSharedPtr->MakePackedPlaintext(value,
  137. noiseScaleDeg, level));
  138. }
  139. std::unique_ptr<Plaintext> CryptoContextDCRTPoly::MakeStringPlaintext(const std::string& s) const
  140. {
  141. return std::make_unique<Plaintext>(m_cryptoContextImplSharedPtr->MakeStringPlaintext(s));
  142. }
  143. std::unique_ptr<Plaintext> CryptoContextDCRTPoly::MakeCoefPackedPlaintext(
  144. const std::vector<int64_t>& value, const size_t noiseScaleDeg, const uint32_t level) const
  145. {
  146. return std::make_unique<Plaintext>(m_cryptoContextImplSharedPtr->MakeCoefPackedPlaintext(value,
  147. noiseScaleDeg, level));
  148. }
  149. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EncryptByPublicKey(
  150. const PublicKeyDCRTPoly& publicKey, const Plaintext& plaintext) const
  151. {
  152. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->Encrypt(
  153. publicKey.GetInternal(), plaintext.GetInternal()));
  154. }
  155. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EncryptByPrivateKey(
  156. const PrivateKeyDCRTPoly& privateKey, const Plaintext& plaintext) const
  157. {
  158. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->Encrypt(
  159. privateKey.GetInternal(), plaintext.GetInternal()));
  160. }
  161. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddByCiphertexts(
  162. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  163. {
  164. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAdd(
  165. ciphertext1.GetInternal(), ciphertext2.GetInternal()));
  166. }
  167. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddByCiphertextAndPlaintext(
  168. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
  169. {
  170. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAdd(
  171. ciphertext.GetInternal(), plaintext.GetInternal()));
  172. }
  173. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddByPlaintextAndCiphertext(
  174. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const
  175. {
  176. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAdd(
  177. plaintext.GetInternal(), ciphertext.GetInternal()));
  178. }
  179. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddByConstAndCiphertext(
  180. const double constant, const CiphertextDCRTPoly& ciphertext) const
  181. {
  182. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAdd(
  183. constant, ciphertext.GetInternal()));
  184. }
  185. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddByCiphertextAndConst(
  186. const CiphertextDCRTPoly& ciphertext, const double constant) const
  187. {
  188. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAdd(
  189. ciphertext.GetInternal(), constant));
  190. }
  191. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddMutableByCiphertexts(
  192. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  193. {
  194. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  195. std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
  196. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAddMutable(c1,
  197. c2));
  198. }
  199. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddMutableByCiphertextAndPlaintext(
  200. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
  201. {
  202. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  203. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAddMutable(c,
  204. plaintext.GetInternal()));
  205. }
  206. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddMutableByPlaintextAndCiphertext(
  207. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const
  208. {
  209. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  210. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAddMutable(
  211. plaintext.GetInternal(), c));
  212. }
  213. void CryptoContextDCRTPoly::EvalAddInPlaceByCiphertexts(const CiphertextDCRTPoly& ciphertext1,
  214. const CiphertextDCRTPoly& ciphertext2) const
  215. {
  216. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  217. m_cryptoContextImplSharedPtr->EvalAddInPlace(c1, ciphertext2.GetInternal());
  218. }
  219. void CryptoContextDCRTPoly::EvalAddInPlaceByCiphertextAndPlaintext(
  220. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
  221. {
  222. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  223. m_cryptoContextImplSharedPtr->EvalAddInPlace(c, plaintext.GetInternal());
  224. }
  225. void CryptoContextDCRTPoly::EvalAddInPlaceByPlaintextAndCiphertext(const Plaintext& plaintext,
  226. const CiphertextDCRTPoly& ciphertext) const
  227. {
  228. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  229. m_cryptoContextImplSharedPtr->EvalAddInPlace(plaintext.GetInternal(), c);
  230. }
  231. void CryptoContextDCRTPoly::EvalAddInPlaceByCiphertextAndConst(
  232. const CiphertextDCRTPoly& ciphertext, const double constant) const
  233. {
  234. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  235. m_cryptoContextImplSharedPtr->EvalAddInPlace(c, constant);
  236. }
  237. void CryptoContextDCRTPoly::EvalAddInPlaceByConstAndCiphertext(const double constant,
  238. const CiphertextDCRTPoly& ciphertext) const
  239. {
  240. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  241. m_cryptoContextImplSharedPtr->EvalAddInPlace(constant, c);
  242. }
  243. void CryptoContextDCRTPoly::EvalAddMutableInPlace(const CiphertextDCRTPoly& ciphertext1,
  244. const CiphertextDCRTPoly& ciphertext2) const
  245. {
  246. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  247. std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
  248. m_cryptoContextImplSharedPtr->EvalAddMutableInPlace(c1, c2);
  249. }
  250. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubByCiphertexts(
  251. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  252. {
  253. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSub(
  254. ciphertext1.GetInternal(), ciphertext2.GetInternal()));
  255. }
  256. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubByCiphertextAndPlaintext(
  257. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
  258. {
  259. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSub(
  260. ciphertext.GetInternal(), plaintext.GetInternal()));
  261. }
  262. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubByPlaintextAndCiphertext(
  263. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const
  264. {
  265. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSub(
  266. plaintext.GetInternal(), ciphertext.GetInternal()));
  267. }
  268. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubByConstAndCiphertext(
  269. const double constant, const CiphertextDCRTPoly& ciphertext) const
  270. {
  271. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSub(
  272. constant, ciphertext.GetInternal()));
  273. }
  274. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubByCiphertextAndConst(
  275. const CiphertextDCRTPoly& ciphertext, const double constant) const
  276. {
  277. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSub(
  278. ciphertext.GetInternal(), constant));
  279. }
  280. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubMutableByCiphertexts(
  281. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  282. {
  283. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  284. std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
  285. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSubMutable(c1,
  286. c2));
  287. }
  288. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubMutableByCiphertextAndPlaintext(
  289. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
  290. {
  291. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  292. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSubMutable(c,
  293. plaintext.GetInternal()));
  294. }
  295. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubMutableByPlaintextAndCiphertext(
  296. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const
  297. {
  298. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  299. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSubMutable(
  300. plaintext.GetInternal(), c));
  301. }
  302. void CryptoContextDCRTPoly::EvalSubInPlaceByCiphertexts(const CiphertextDCRTPoly& ciphertext1,
  303. const CiphertextDCRTPoly& ciphertext2) const
  304. {
  305. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  306. m_cryptoContextImplSharedPtr->EvalSubInPlace(c1, ciphertext2.GetInternal());
  307. }
  308. void CryptoContextDCRTPoly::EvalSubInPlaceByCiphertextAndConst(
  309. const CiphertextDCRTPoly& ciphertext, const double constant) const
  310. {
  311. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  312. m_cryptoContextImplSharedPtr->EvalSubInPlace(c, constant);
  313. }
  314. void CryptoContextDCRTPoly::EvalSubInPlaceByConstAndCiphertext(const double constant,
  315. const CiphertextDCRTPoly& ciphertext) const
  316. {
  317. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  318. m_cryptoContextImplSharedPtr->EvalSubInPlace(constant, c);
  319. }
  320. void CryptoContextDCRTPoly::EvalSubMutableInPlace(const CiphertextDCRTPoly& ciphertext1,
  321. const CiphertextDCRTPoly& ciphertext2) const
  322. {
  323. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  324. std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
  325. m_cryptoContextImplSharedPtr->EvalSubMutableInPlace(c1, c2);
  326. }
  327. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultByCiphertexts(
  328. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  329. {
  330. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMult(
  331. ciphertext1.GetInternal(), ciphertext2.GetInternal()));
  332. }
  333. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultByCiphertextAndPlaintext(
  334. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
  335. {
  336. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMult(
  337. ciphertext.GetInternal(), plaintext.GetInternal()));
  338. }
  339. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultByPlaintextAndCiphertext(
  340. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const
  341. {
  342. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMult(
  343. plaintext.GetInternal(), ciphertext.GetInternal()));
  344. }
  345. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultByConstAndCiphertext(
  346. const double constant, const CiphertextDCRTPoly& ciphertext) const
  347. {
  348. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMult(
  349. constant, ciphertext.GetInternal()));
  350. }
  351. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultByCiphertextAndConst(
  352. const CiphertextDCRTPoly& ciphertext, const double constant) const
  353. {
  354. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMult(
  355. ciphertext.GetInternal(), constant));
  356. }
  357. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultMutableByCiphertexts(
  358. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  359. {
  360. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  361. std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
  362. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMultMutable(c1,
  363. c2));
  364. }
  365. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultMutableByCiphertextAndPlaintext(
  366. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
  367. {
  368. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  369. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMultMutable(c,
  370. plaintext.GetInternal()));
  371. }
  372. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultMutableByPlaintextAndCiphertext(
  373. const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const
  374. {
  375. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  376. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMultMutable(
  377. plaintext.GetInternal(), c));
  378. }
  379. void CryptoContextDCRTPoly::EvalMultInPlaceByCiphertextAndConst(
  380. const CiphertextDCRTPoly& ciphertext, const double constant) const
  381. {
  382. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  383. m_cryptoContextImplSharedPtr->EvalMultInPlace(c, constant);
  384. }
  385. void CryptoContextDCRTPoly::EvalMultInPlaceByConstAndCiphertext(const double constant,
  386. const CiphertextDCRTPoly& ciphertext) const
  387. {
  388. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  389. m_cryptoContextImplSharedPtr->EvalMultInPlace(constant, c);
  390. }
  391. void CryptoContextDCRTPoly::EvalMultMutableInPlace(const CiphertextDCRTPoly& ciphertext1,
  392. const CiphertextDCRTPoly& ciphertext2) const
  393. {
  394. std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
  395. std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
  396. m_cryptoContextImplSharedPtr->EvalMultMutableInPlace(c1, c2);
  397. }
  398. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultNoRelin(
  399. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  400. {
  401. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMultNoRelin(
  402. ciphertext1.GetInternal(), ciphertext2.GetInternal()));
  403. }
  404. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultAndRelinearize(
  405. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  406. {
  407. return std::make_unique<CiphertextDCRTPoly>(
  408. m_cryptoContextImplSharedPtr->EvalMultAndRelinearize(ciphertext1.GetInternal(),
  409. ciphertext2.GetInternal()));
  410. }
  411. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalRotate(
  412. const CiphertextDCRTPoly& ciphertext, const int32_t index) const
  413. {
  414. return std::make_unique<CiphertextDCRTPoly>(
  415. m_cryptoContextImplSharedPtr->EvalRotate(ciphertext.GetInternal(), index));
  416. }
  417. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalChebyshevSeries(
  418. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients,
  419. const double a, const double b) const
  420. {
  421. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalChebyshevSeries(
  422. ciphertext.GetInternal(), coefficients, a, b));
  423. }
  424. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalChebyshevFunction(
  425. rust::Fn<void(const double x, double& ret)> func, const CiphertextDCRTPoly& ciphertext,
  426. const double a, const double b, const uint32_t degree) const
  427. {
  428. return std::make_unique<CiphertextDCRTPoly>(
  429. m_cryptoContextImplSharedPtr->EvalChebyshevFunction([&](const double x){
  430. double result; func(x, result); return result; }, ciphertext.GetInternal(), a, b, degree));
  431. }
  432. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalCompareSchemeSwitching(
  433. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2,
  434. const uint32_t numCtxts, const uint32_t numSlots, const uint32_t pLWE, const double scaleSign,
  435. const bool unit) const
  436. {
  437. return std::make_unique<CiphertextDCRTPoly>(
  438. m_cryptoContextImplSharedPtr->EvalCompareSchemeSwitching(ciphertext1.GetInternal(),
  439. ciphertext2.GetInternal(), numCtxts, numSlots, pLWE, scaleSign, unit));
  440. }
  441. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::Rescale(
  442. const CiphertextDCRTPoly& ciphertext) const
  443. {
  444. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->Rescale(
  445. ciphertext.GetInternal()));
  446. }
  447. void CryptoContextDCRTPoly::RescaleInPlace(const CiphertextDCRTPoly& ciphertext) const
  448. {
  449. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  450. m_cryptoContextImplSharedPtr->RescaleInPlace(c);
  451. }
  452. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::ModReduce(
  453. const CiphertextDCRTPoly& ciphertext) const
  454. {
  455. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->ModReduce(
  456. ciphertext.GetInternal()));
  457. }
  458. void CryptoContextDCRTPoly::ModReduceInPlace(const CiphertextDCRTPoly& ciphertext) const
  459. {
  460. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  461. m_cryptoContextImplSharedPtr->ModReduceInPlace(c);
  462. }
  463. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSum(
  464. const CiphertextDCRTPoly& ciphertext, const uint32_t batchSize) const
  465. {
  466. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSum(
  467. ciphertext.GetInternal(), batchSize));
  468. }
  469. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalPolyLinear(
  470. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients) const
  471. {
  472. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalPolyLinear(
  473. ciphertext.GetInternal(), coefficients));
  474. }
  475. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalPolyPS(
  476. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients) const
  477. {
  478. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalPolyPS(
  479. ciphertext.GetInternal(), coefficients));
  480. }
  481. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalChebyshevSeriesLinear(
  482. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients,
  483. const double a, const double b) const
  484. {
  485. return std::make_unique<CiphertextDCRTPoly>(
  486. m_cryptoContextImplSharedPtr->EvalChebyshevSeriesLinear(ciphertext.GetInternal(),
  487. coefficients, a, b));
  488. }
  489. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalChebyshevSeriesPS(
  490. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients,
  491. const double a, const double b) const
  492. {
  493. return std::make_unique<CiphertextDCRTPoly>(
  494. m_cryptoContextImplSharedPtr->EvalChebyshevSeriesPS(ciphertext.GetInternal(), coefficients,
  495. a, b));
  496. }
  497. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalDivide(
  498. const CiphertextDCRTPoly& ciphertext, const double a, const double b,
  499. const uint32_t degree) const
  500. {
  501. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalDivide(
  502. ciphertext.GetInternal(), a, b, degree));
  503. }
  504. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::IntMPBootAdjustScale(
  505. const CiphertextDCRTPoly& ciphertext) const
  506. {
  507. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->IntMPBootAdjustScale(
  508. ciphertext.GetInternal()));
  509. }
  510. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalLogistic(
  511. const CiphertextDCRTPoly& ciphertext, const double a, const double b,
  512. const uint32_t degree) const
  513. {
  514. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalLogistic(
  515. ciphertext.GetInternal(), a, b, degree));
  516. }
  517. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::IntMPBootRandomElementGen(
  518. const PublicKeyDCRTPoly& publicKey) const
  519. {
  520. return std::make_unique<CiphertextDCRTPoly>(
  521. m_cryptoContextImplSharedPtr->IntMPBootRandomElementGen(publicKey.GetInternal()));
  522. }
  523. void CryptoContextDCRTPoly::EvalBootstrapSetup(
  524. const std::vector<uint32_t>& levelBudget, const std::vector<uint32_t>& dim1,
  525. const uint32_t slots, const uint32_t correctionFactor, const bool precompute) const
  526. {
  527. m_cryptoContextImplSharedPtr->EvalBootstrapSetup(levelBudget, dim1, slots, correctionFactor,
  528. precompute);
  529. }
  530. void CryptoContextDCRTPoly::EvalBootstrapKeyGen(const PrivateKeyDCRTPoly& privateKey,
  531. const uint32_t slots) const
  532. {
  533. m_cryptoContextImplSharedPtr->EvalBootstrapKeyGen(privateKey.GetInternal(), slots);
  534. }
  535. void CryptoContextDCRTPoly::EvalBootstrapPrecompute(const uint32_t slots) const
  536. {
  537. m_cryptoContextImplSharedPtr->EvalBootstrapPrecompute(slots);
  538. }
  539. std::unique_ptr<DecryptResult> CryptoContextDCRTPoly::DecryptByPrivateKeyAndCiphertext(
  540. const PrivateKeyDCRTPoly& privateKey, const CiphertextDCRTPoly& ciphertext,
  541. Plaintext& plaintext) const
  542. {
  543. std::shared_ptr<PlaintextImpl> p;
  544. std::unique_ptr<DecryptResult> res = std::make_unique<DecryptResult>(
  545. m_cryptoContextImplSharedPtr->Decrypt(privateKey.GetInternal(), ciphertext.GetInternal(), &p));
  546. plaintext = p;
  547. return res;
  548. }
  549. std::unique_ptr<DecryptResult> CryptoContextDCRTPoly::DecryptByCiphertextAndPrivateKey(
  550. const CiphertextDCRTPoly& ciphertext, const PrivateKeyDCRTPoly& privateKey,
  551. Plaintext& plaintext) const
  552. {
  553. std::shared_ptr<PlaintextImpl> p;
  554. std::unique_ptr<DecryptResult> res = std::make_unique<DecryptResult>(
  555. m_cryptoContextImplSharedPtr->Decrypt(ciphertext.GetInternal(), privateKey.GetInternal(), &p));
  556. plaintext = p;
  557. return res;
  558. }
  559. std::unique_ptr<DecryptResult> CryptoContextDCRTPoly::MultipartyDecryptFusion(
  560. const VectorOfCiphertexts& partialCiphertextVec, Plaintext& plaintext) const
  561. {
  562. std::shared_ptr<PlaintextImpl> p;
  563. std::unique_ptr<DecryptResult> res = std::make_unique<DecryptResult>(
  564. m_cryptoContextImplSharedPtr->MultipartyDecryptFusion(partialCiphertextVec.GetInternal(), &p));
  565. plaintext = p;
  566. return res;
  567. }
  568. uint32_t CryptoContextDCRTPoly::GetRingDimension() const
  569. {
  570. return m_cryptoContextImplSharedPtr->GetRingDimension();
  571. }
  572. uint32_t CryptoContextDCRTPoly::GetCyclotomicOrder() const
  573. {
  574. return m_cryptoContextImplSharedPtr->GetCyclotomicOrder();
  575. }
  576. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSin(
  577. const CiphertextDCRTPoly& ciphertext,
  578. const double a, const double b, const uint32_t degree) const
  579. {
  580. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSin(
  581. ciphertext.GetInternal(), a, b, degree));
  582. }
  583. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalCos(
  584. const CiphertextDCRTPoly& ciphertext,
  585. const double a, const double b, const uint32_t degree) const
  586. {
  587. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalCos(
  588. ciphertext.GetInternal(), a, b, degree));
  589. }
  590. std::unique_ptr<Plaintext> CryptoContextDCRTPoly::MakeCKKSPackedPlaintext(
  591. const std::vector<double>& value, const size_t scaleDeg, const uint32_t level,
  592. const DCRTPolyParams& params, const uint32_t slots) const
  593. {
  594. return std::make_unique<Plaintext>(m_cryptoContextImplSharedPtr->MakeCKKSPackedPlaintext(
  595. value, scaleDeg, level, params.GetInternal(), slots));
  596. }
  597. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalPoly(
  598. const CiphertextDCRTPoly& ciphertext, const std::vector<double>& coefficients) const
  599. {
  600. return std::make_unique<CiphertextDCRTPoly>(
  601. m_cryptoContextImplSharedPtr->EvalPoly(ciphertext.GetInternal(), coefficients));
  602. }
  603. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::KeySwitchDown(
  604. const CiphertextDCRTPoly& ciphertext) const
  605. {
  606. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->KeySwitchDown(
  607. ciphertext.GetInternal()));
  608. }
  609. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::KeySwitchExt(
  610. const CiphertextDCRTPoly& ciphertext, const bool addFirst) const
  611. {
  612. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->KeySwitchExt(
  613. ciphertext.GetInternal(), addFirst));
  614. }
  615. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::Compress(
  616. const CiphertextDCRTPoly& ciphertext, const uint32_t towersLeft) const
  617. {
  618. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->Compress(
  619. ciphertext.GetInternal(), towersLeft));
  620. }
  621. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalNegate(
  622. const CiphertextDCRTPoly& ciphertext) const
  623. {
  624. return std::make_unique<CiphertextDCRTPoly>(
  625. m_cryptoContextImplSharedPtr->EvalNegate(ciphertext.GetInternal()));
  626. }
  627. void CryptoContextDCRTPoly::EvalNegateInPlace(const CiphertextDCRTPoly& ciphertext) const
  628. {
  629. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  630. m_cryptoContextImplSharedPtr->EvalNegateInPlace(c);
  631. }
  632. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSquare(
  633. const CiphertextDCRTPoly& ciphertext) const
  634. {
  635. return std::make_unique<CiphertextDCRTPoly>(
  636. m_cryptoContextImplSharedPtr->EvalSquare(ciphertext.GetInternal()));
  637. }
  638. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSquareMutable(
  639. const CiphertextDCRTPoly& ciphertext) const
  640. {
  641. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  642. return std::make_unique<CiphertextDCRTPoly>(
  643. m_cryptoContextImplSharedPtr->EvalSquareMutable(c));
  644. }
  645. void CryptoContextDCRTPoly::EvalSquareInPlace(const CiphertextDCRTPoly& ciphertext) const
  646. {
  647. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  648. m_cryptoContextImplSharedPtr->EvalSquareInPlace(c);
  649. }
  650. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAtIndex(
  651. const CiphertextDCRTPoly& ciphertext, const uint32_t index) const
  652. {
  653. return std::make_unique<CiphertextDCRTPoly>(
  654. m_cryptoContextImplSharedPtr->EvalAtIndex(ciphertext.GetInternal(), index));
  655. }
  656. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::ComposedEvalMult(
  657. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
  658. {
  659. return std::make_unique<CiphertextDCRTPoly>(
  660. m_cryptoContextImplSharedPtr->ComposedEvalMult(ciphertext1.GetInternal(),
  661. ciphertext2.GetInternal()));
  662. }
  663. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::Relinearize(
  664. const CiphertextDCRTPoly& ciphertext) const
  665. {
  666. return std::make_unique<CiphertextDCRTPoly>(
  667. m_cryptoContextImplSharedPtr->Relinearize(ciphertext.GetInternal()));
  668. }
  669. void CryptoContextDCRTPoly::RelinearizeInPlace(const CiphertextDCRTPoly& ciphertext) const
  670. {
  671. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  672. m_cryptoContextImplSharedPtr->RelinearizeInPlace(c);
  673. }
  674. std::unique_ptr<std::vector<uint32_t>> CryptoContextDCRTPoly::FindAutomorphismIndices(
  675. const std::vector<uint32_t>& idxList) const
  676. {
  677. return std::make_unique<std::vector<uint32_t>>(
  678. m_cryptoContextImplSharedPtr->FindAutomorphismIndices(idxList));
  679. }
  680. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalInnerProductByCiphertexts(
  681. const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2,
  682. const uint32_t batchSize) const
  683. {
  684. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalInnerProduct(
  685. ciphertext1.GetInternal(), ciphertext2.GetInternal(), batchSize));
  686. }
  687. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalInnerProductByPlaintext(
  688. const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext,
  689. const uint32_t batchSize) const
  690. {
  691. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalInnerProduct(
  692. ciphertext.GetInternal(), plaintext.GetInternal(), batchSize));
  693. }
  694. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::KeySwitch(
  695. const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey) const
  696. {
  697. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->KeySwitch(
  698. ciphertext.GetInternal(), evalKey.GetInternal()));
  699. }
  700. void CryptoContextDCRTPoly::KeySwitchInPlace(const CiphertextDCRTPoly& ciphertext,
  701. const EvalKeyDCRTPoly& evalKey) const
  702. {
  703. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  704. m_cryptoContextImplSharedPtr->KeySwitchInPlace(c, evalKey.GetInternal());
  705. }
  706. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::LevelReduce(
  707. const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey,
  708. const size_t levels) const
  709. {
  710. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->LevelReduce(
  711. ciphertext.GetInternal(), evalKey.GetInternal(), levels));
  712. }
  713. void CryptoContextDCRTPoly::LevelReduceInPlace(const CiphertextDCRTPoly& ciphertext,
  714. const EvalKeyDCRTPoly& evalKey, const size_t levels) const
  715. {
  716. std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
  717. m_cryptoContextImplSharedPtr->LevelReduceInPlace(c, evalKey.GetInternal(), levels);
  718. }
  719. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::ReEncrypt(
  720. const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey,
  721. const PublicKeyDCRTPoly& publicKey) const
  722. {
  723. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->ReEncrypt(
  724. ciphertext.GetInternal(), evalKey.GetInternal(), publicKey.GetInternal()));
  725. }
  726. std::unique_ptr<EvalKeyDCRTPoly> CryptoContextDCRTPoly::KeySwitchGen(
  727. const PrivateKeyDCRTPoly& oldPrivateKey, const PrivateKeyDCRTPoly& newPrivateKey) const
  728. {
  729. return std::make_unique<EvalKeyDCRTPoly>(m_cryptoContextImplSharedPtr->KeySwitchGen(
  730. oldPrivateKey.GetInternal(), newPrivateKey.GetInternal()));
  731. }
  732. std::unique_ptr<EvalKeyDCRTPoly> CryptoContextDCRTPoly::ReKeyGen(
  733. const PrivateKeyDCRTPoly& oldPrivateKey, const PublicKeyDCRTPoly& newPublicKey) const
  734. {
  735. return std::make_unique<EvalKeyDCRTPoly>(m_cryptoContextImplSharedPtr->ReKeyGen(
  736. oldPrivateKey.GetInternal(), newPublicKey.GetInternal()));
  737. }
  738. std::unique_ptr<EvalKeyDCRTPoly> CryptoContextDCRTPoly::MultiKeySwitchGen(
  739. const PrivateKeyDCRTPoly& originalPrivateKey, const PrivateKeyDCRTPoly& newPrivateKey,
  740. const EvalKeyDCRTPoly& evalKey) const
  741. {
  742. return std::make_unique<EvalKeyDCRTPoly>(m_cryptoContextImplSharedPtr->MultiKeySwitchGen(
  743. originalPrivateKey.GetInternal(), newPrivateKey.GetInternal(), evalKey.GetInternal()));
  744. }
  745. std::unique_ptr<EvalKeyDCRTPoly> CryptoContextDCRTPoly::MultiAddEvalKeys(
  746. const EvalKeyDCRTPoly& evalKey1, const EvalKeyDCRTPoly& evalKey2,
  747. const std::string& keyId) const
  748. {
  749. return std::make_unique<EvalKeyDCRTPoly>(m_cryptoContextImplSharedPtr->MultiAddEvalKeys(
  750. evalKey1.GetInternal(), evalKey2.GetInternal(), keyId));
  751. }
  752. std::unique_ptr<EvalKeyDCRTPoly> CryptoContextDCRTPoly::MultiMultEvalKey(
  753. const PrivateKeyDCRTPoly& privateKey, const EvalKeyDCRTPoly& evalKey,
  754. const std::string& keyId) const
  755. {
  756. return std::make_unique<EvalKeyDCRTPoly>(m_cryptoContextImplSharedPtr->MultiMultEvalKey(
  757. privateKey.GetInternal(), evalKey.GetInternal(), keyId));
  758. }
  759. std::unique_ptr<EvalKeyDCRTPoly> CryptoContextDCRTPoly::MultiAddEvalMultKeys(
  760. const EvalKeyDCRTPoly& evalKey1, const EvalKeyDCRTPoly& evalKey2,
  761. const std::string& keyId) const
  762. {
  763. return std::make_unique<EvalKeyDCRTPoly>(m_cryptoContextImplSharedPtr->MultiAddEvalMultKeys(
  764. evalKey1.GetInternal(), evalKey2.GetInternal(), keyId));
  765. }
  766. void CryptoContextDCRTPoly::EvalSumKeyGen(const PrivateKeyDCRTPoly& privateKey,
  767. const PublicKeyDCRTPoly& publicKey) const
  768. {
  769. m_cryptoContextImplSharedPtr->EvalSumKeyGen(privateKey.GetInternal(), publicKey.GetInternal());
  770. }
  771. void CryptoContextDCRTPoly::EvalCKKStoFHEWKeyGen(const KeyPairDCRTPoly& keyPair,
  772. const LWEPrivateKey& lwesk) const
  773. {
  774. m_cryptoContextImplSharedPtr->EvalCKKStoFHEWKeyGen({keyPair.GetPublicKey()->GetInternal(),
  775. keyPair.GetPrivateKey()->GetInternal()}, lwesk.GetInternal());
  776. }
  777. void CryptoContextDCRTPoly::EvalFHEWtoCKKSKeyGen(const KeyPairDCRTPoly& keyPair,
  778. const LWEPrivateKey& lwesk, const uint32_t numSlots, const uint32_t numCtxts,
  779. const uint32_t dim1, const uint32_t L) const
  780. {
  781. m_cryptoContextImplSharedPtr->EvalFHEWtoCKKSKeyGen({keyPair.GetPublicKey()->GetInternal(),
  782. keyPair.GetPrivateKey()->GetInternal()}, lwesk.GetInternal(), numSlots, numCtxts, dim1, L);
  783. }
  784. void CryptoContextDCRTPoly::EvalSchemeSwitchingKeyGen(const KeyPairDCRTPoly& keyPair,
  785. const LWEPrivateKey& lwesk) const
  786. {
  787. m_cryptoContextImplSharedPtr->EvalSchemeSwitchingKeyGen({keyPair.GetPublicKey()->GetInternal(),
  788. keyPair.GetPrivateKey()->GetInternal()}, lwesk.GetInternal());
  789. }
  790. uint64_t CryptoContextDCRTPoly::GetModulus() const
  791. {
  792. return m_cryptoContextImplSharedPtr->GetModulus().ConvertToInt();
  793. }
  794. uint64_t CryptoContextDCRTPoly::GetRootOfUnity() const
  795. {
  796. return m_cryptoContextImplSharedPtr->GetRootOfUnity().ConvertToInt();
  797. }
  798. std::unique_ptr<VectorOfCiphertexts> CryptoContextDCRTPoly::MultipartyDecryptLead(
  799. const VectorOfCiphertexts& ciphertextVec, const PrivateKeyDCRTPoly& privateKey) const
  800. {
  801. return std::make_unique<VectorOfCiphertexts>(
  802. m_cryptoContextImplSharedPtr->MultipartyDecryptLead(ciphertextVec.GetInternal(),
  803. privateKey.GetInternal()));
  804. }
  805. std::unique_ptr<VectorOfCiphertexts> CryptoContextDCRTPoly::MultipartyDecryptMain(
  806. const VectorOfCiphertexts& ciphertextVec, const PrivateKeyDCRTPoly& privateKey) const
  807. {
  808. return std::make_unique<VectorOfCiphertexts>(
  809. m_cryptoContextImplSharedPtr->MultipartyDecryptMain(ciphertextVec.GetInternal(),
  810. privateKey.GetInternal()));
  811. }
  812. std::unique_ptr<VectorOfCiphertexts> CryptoContextDCRTPoly::IntMPBootDecrypt(
  813. const PrivateKeyDCRTPoly& privateKey, const CiphertextDCRTPoly& ciphertext,
  814. const CiphertextDCRTPoly& a) const
  815. {
  816. return std::make_unique<VectorOfCiphertexts>(m_cryptoContextImplSharedPtr->IntMPBootDecrypt(
  817. privateKey.GetInternal(), ciphertext.GetInternal(), a.GetInternal()));
  818. }
  819. std::unique_ptr<VectorOfCiphertexts> CryptoContextDCRTPoly::EvalMinSchemeSwitching(
  820. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  821. const uint32_t numValues, const uint32_t numSlots, const uint32_t pLWE,
  822. const double scaleSign) const
  823. {
  824. return std::make_unique<VectorOfCiphertexts>(
  825. m_cryptoContextImplSharedPtr->EvalMinSchemeSwitching(ciphertext.GetInternal(),
  826. publicKey.GetInternal(), numValues, numSlots, pLWE, scaleSign));
  827. }
  828. std::unique_ptr<VectorOfCiphertexts> CryptoContextDCRTPoly::EvalMinSchemeSwitchingAlt(
  829. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  830. const uint32_t numValues, const uint32_t numSlots, const uint32_t pLWE,
  831. const double scaleSign) const
  832. {
  833. return std::make_unique<VectorOfCiphertexts>(
  834. m_cryptoContextImplSharedPtr->EvalMinSchemeSwitchingAlt(ciphertext.GetInternal(),
  835. publicKey.GetInternal(), numValues, numSlots, pLWE, scaleSign));
  836. }
  837. std::unique_ptr<VectorOfCiphertexts> CryptoContextDCRTPoly::EvalMaxSchemeSwitching(
  838. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  839. const uint32_t numValues, const uint32_t numSlots, const uint32_t pLWE,
  840. const double scaleSign) const
  841. {
  842. return std::make_unique<VectorOfCiphertexts>(
  843. m_cryptoContextImplSharedPtr->EvalMaxSchemeSwitching(ciphertext.GetInternal(),
  844. publicKey.GetInternal(), numValues, numSlots, pLWE, scaleSign));
  845. }
  846. std::unique_ptr<VectorOfCiphertexts> CryptoContextDCRTPoly::EvalMaxSchemeSwitchingAlt(
  847. const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey,
  848. const uint32_t numValues, const uint32_t numSlots, const uint32_t pLWE,
  849. const double scaleSign) const
  850. {
  851. return std::make_unique<VectorOfCiphertexts>(
  852. m_cryptoContextImplSharedPtr->EvalMaxSchemeSwitchingAlt(ciphertext.GetInternal(),
  853. publicKey.GetInternal(), numValues, numSlots, pLWE, scaleSign));
  854. }
  855. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddMany(
  856. const VectorOfCiphertexts& ciphertextVec) const
  857. {
  858. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAddMany(
  859. ciphertextVec.GetInternal()));
  860. }
  861. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultMany(
  862. const VectorOfCiphertexts& ciphertextVec) const
  863. {
  864. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMultMany(
  865. ciphertextVec.GetInternal()));
  866. }
  867. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMerge(
  868. const VectorOfCiphertexts& ciphertextVec) const
  869. {
  870. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMerge(
  871. ciphertextVec.GetInternal()));
  872. }
  873. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::IntMPBootEncrypt(
  874. const PublicKeyDCRTPoly& publicKey, const VectorOfCiphertexts& sharesPair,
  875. const CiphertextDCRTPoly& a, const CiphertextDCRTPoly& ciphertext) const
  876. {
  877. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->IntMPBootEncrypt(
  878. publicKey.GetInternal(), sharesPair.GetInternal(), a.GetInternal(),
  879. ciphertext.GetInternal()));
  880. }
  881. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddManyInPlace(
  882. VectorOfCiphertexts& ciphertextVec) const
  883. {
  884. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAddManyInPlace(
  885. ciphertextVec.GetInternal()));
  886. }
  887. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalLinearWSumMutable(
  888. VectorOfCiphertexts& ciphertextVec, const std::vector<double>& constantsVec) const
  889. {
  890. return std::make_unique<CiphertextDCRTPoly>(
  891. m_cryptoContextImplSharedPtr->EvalLinearWSumMutable(ciphertextVec.GetInternal(),
  892. constantsVec));
  893. }
  894. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalLinearWSumMutable(
  895. const std::vector<double>& constantsVec, VectorOfCiphertexts& ciphertextVec) const
  896. {
  897. return std::make_unique<CiphertextDCRTPoly>(
  898. m_cryptoContextImplSharedPtr->EvalLinearWSumMutable(constantsVec,
  899. ciphertextVec.GetInternal()));
  900. }
  901. std::unique_ptr<KeyPairDCRTPoly> CryptoContextDCRTPoly::MultipartyKeyGenByVectorOfPrivateKeys(
  902. const VectorOfPrivateKeys& privateKeyVec) const
  903. {
  904. return std::make_unique<KeyPairDCRTPoly>(m_cryptoContextImplSharedPtr->MultipartyKeyGen(
  905. privateKeyVec.GetInternal()));
  906. }
  907. std::unique_ptr<UnorderedMapFromIndexToDCRTPoly> CryptoContextDCRTPoly::ShareKeys(
  908. const PrivateKeyDCRTPoly& sk, const uint32_t N, const uint32_t threshold, const uint32_t index,
  909. const std::string& shareType) const
  910. {
  911. return std::make_unique<UnorderedMapFromIndexToDCRTPoly>(
  912. m_cryptoContextImplSharedPtr->ShareKeys(sk.GetInternal(), N, threshold, index, shareType));
  913. }
  914. void CryptoContextDCRTPoly::RecoverSharedKey(PrivateKeyDCRTPoly& sk,
  915. UnorderedMapFromIndexToDCRTPoly& sk_shares, const uint32_t N, const uint32_t threshold,
  916. const std::string& shareType) const
  917. {
  918. auto p = sk.GetInternal();
  919. m_cryptoContextImplSharedPtr->RecoverSharedKey(p, sk_shares.GetInternal(), N,
  920. threshold, shareType);
  921. }
  922. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAutomorphism(
  923. const CiphertextDCRTPoly& ciphertext, const uint32_t i,
  924. const MapFromIndexToEvalKey& evalKeyMap) const
  925. {
  926. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAutomorphism(
  927. ciphertext.GetInternal(), i, evalKeyMap.GetInternalMap()));
  928. }
  929. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSumRows(
  930. const CiphertextDCRTPoly& ciphertext, const uint32_t rowSize,
  931. const MapFromIndexToEvalKey& evalSumKeyMap, const uint32_t subringDim) const
  932. {
  933. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSumRows(
  934. ciphertext.GetInternal(), rowSize, evalSumKeyMap.GetInternalMap(), subringDim));
  935. }
  936. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSumCols(
  937. const CiphertextDCRTPoly& ciphertext, const uint32_t rowSize,
  938. const MapFromIndexToEvalKey& evalSumKeyMap) const
  939. {
  940. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSumCols(
  941. ciphertext.GetInternal(), rowSize, evalSumKeyMap.GetInternalMap()));
  942. }
  943. std::unique_ptr<MapFromIndexToEvalKey> CryptoContextDCRTPoly::EvalAutomorphismKeyGen(
  944. const PrivateKeyDCRTPoly& privateKey, const std::vector<uint32_t>& indexList) const
  945. {
  946. return std::make_unique<MapFromIndexToEvalKey>(
  947. m_cryptoContextImplSharedPtr->EvalAutomorphismKeyGen(privateKey.GetInternal(), indexList));
  948. }
  949. std::unique_ptr<MapFromIndexToEvalKey> CryptoContextDCRTPoly::EvalSumRowsKeyGen(
  950. const PrivateKeyDCRTPoly& privateKey, const PublicKeyDCRTPoly& publicKey,
  951. const uint32_t rowSize, const uint32_t subringDim) const
  952. {
  953. return std::make_unique<MapFromIndexToEvalKey>(m_cryptoContextImplSharedPtr->EvalSumRowsKeyGen(
  954. privateKey.GetInternal(), publicKey.GetInternal(), rowSize, subringDim));
  955. }
  956. std::unique_ptr<MapFromIndexToEvalKey> CryptoContextDCRTPoly::EvalSumColsKeyGen(
  957. const PrivateKeyDCRTPoly& privateKey, const PublicKeyDCRTPoly& publicKey) const
  958. {
  959. return std::make_unique<MapFromIndexToEvalKey>(m_cryptoContextImplSharedPtr->EvalSumColsKeyGen(
  960. privateKey.GetInternal(), publicKey.GetInternal()));
  961. }
  962. std::unique_ptr<MapFromIndexToEvalKey> CryptoContextDCRTPoly::MultiEvalAutomorphismKeyGen(
  963. const PrivateKeyDCRTPoly& privateKey, const MapFromIndexToEvalKey& evalKeyMap,
  964. const std::vector<uint32_t>& indexList, const std::string& keyId) const
  965. {
  966. return std::make_unique<MapFromIndexToEvalKey>(
  967. m_cryptoContextImplSharedPtr->MultiEvalAutomorphismKeyGen(privateKey.GetInternal(),
  968. evalKeyMap.GetInternal(), indexList, keyId));
  969. }
  970. std::unique_ptr<MapFromIndexToEvalKey> CryptoContextDCRTPoly::MultiEvalAtIndexKeyGen(
  971. const PrivateKeyDCRTPoly& privateKey, const MapFromIndexToEvalKey& evalKeyMap,
  972. const std::vector<int32_t>& indexList, const std::string& keyId) const
  973. {
  974. return std::make_unique<MapFromIndexToEvalKey>(
  975. m_cryptoContextImplSharedPtr->MultiEvalAtIndexKeyGen(privateKey.GetInternal(),
  976. evalKeyMap.GetInternal(), indexList, keyId));
  977. }
  978. std::unique_ptr<MapFromIndexToEvalKey> CryptoContextDCRTPoly::MultiEvalSumKeyGen(
  979. const PrivateKeyDCRTPoly& privateKey, const MapFromIndexToEvalKey& evalKeyMap,
  980. const std::string& keyId) const
  981. {
  982. return std::make_unique<MapFromIndexToEvalKey>(
  983. m_cryptoContextImplSharedPtr->MultiEvalSumKeyGen(privateKey.GetInternal(),
  984. evalKeyMap.GetInternal(), keyId));
  985. }
  986. std::unique_ptr<MapFromIndexToEvalKey> CryptoContextDCRTPoly::MultiAddEvalSumKeys(
  987. const MapFromIndexToEvalKey& evalKeyMap1, const MapFromIndexToEvalKey& evalKeyMap2,
  988. const std::string& keyId) const
  989. {
  990. return std::make_unique<MapFromIndexToEvalKey>(
  991. m_cryptoContextImplSharedPtr->MultiAddEvalSumKeys(evalKeyMap1.GetInternal(),
  992. evalKeyMap2.GetInternal(), keyId));
  993. }
  994. std::unique_ptr<MapFromIndexToEvalKey> CryptoContextDCRTPoly::MultiAddEvalAutomorphismKeys(
  995. const MapFromIndexToEvalKey& evalKeyMap1, const MapFromIndexToEvalKey& evalKeyMap2,
  996. const std::string& keyId) const
  997. {
  998. return std::make_unique<MapFromIndexToEvalKey>(
  999. m_cryptoContextImplSharedPtr->MultiAddEvalAutomorphismKeys(evalKeyMap1.GetInternal(),
  1000. evalKeyMap2.GetInternal(), keyId));
  1001. }
  1002. std::unique_ptr<VectorOfDCRTPolys> CryptoContextDCRTPoly::EvalFastRotationPrecompute(
  1003. const CiphertextDCRTPoly& ciphertext) const
  1004. {
  1005. return std::make_unique<VectorOfDCRTPolys>(
  1006. m_cryptoContextImplSharedPtr->EvalFastRotationPrecompute(ciphertext.GetInternal()));
  1007. }
  1008. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalFastRotation(
  1009. const CiphertextDCRTPoly& ciphertext, const uint32_t index, const uint32_t m,
  1010. const VectorOfDCRTPolys& digits) const
  1011. {
  1012. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalFastRotation(
  1013. ciphertext.GetInternal(), index, m, digits.GetInternal()));
  1014. }
  1015. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalFastRotationExt(
  1016. const CiphertextDCRTPoly& ciphertext, const uint32_t index, const VectorOfDCRTPolys& digits,
  1017. const bool addFirst) const
  1018. {
  1019. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalFastRotationExt(
  1020. ciphertext.GetInternal(), index, digits.GetInternal(), addFirst));
  1021. }
  1022. std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalFHEWtoCKKS(
  1023. VectorOfLWECiphertexts& LWECiphertexts, const uint32_t numCtxts, const uint32_t numSlots,
  1024. const uint32_t p, const double pmin, const double pmax, const uint32_t dim1) const
  1025. {
  1026. return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalFHEWtoCKKS(
  1027. LWECiphertexts.GetInternal(), numCtxts, numSlots, p, pmin, pmax, dim1));
  1028. }
  1029. std::unique_ptr<VectorOfLWECiphertexts> CryptoContextDCRTPoly::EvalCKKStoFHEW(
  1030. const CiphertextDCRTPoly& ciphertext, const uint32_t numCtxts) const
  1031. {
  1032. return std::make_unique<VectorOfLWECiphertexts>(m_cryptoContextImplSharedPtr->EvalCKKStoFHEW(
  1033. ciphertext.GetInternal(), numCtxts));
  1034. }
  1035. std::unique_ptr<VectorOfCiphertexts> CryptoContextDCRTPoly::IntMPBootAdd(
  1036. VectorOfVectorOfCiphertexts& sharesPairVec) const
  1037. {
  1038. return std::make_unique<VectorOfCiphertexts>(m_cryptoContextImplSharedPtr->IntMPBootAdd(
  1039. sharesPairVec.GetInternal()));
  1040. }
  1041. std::unique_ptr<SchemeBaseDCRTPoly> CryptoContextDCRTPoly::GetScheme() const
  1042. {
  1043. return std::make_unique<SchemeBaseDCRTPoly>(m_cryptoContextImplSharedPtr->GetScheme());
  1044. }
  1045. std::unique_ptr<CryptoParametersBaseDCRTPoly> CryptoContextDCRTPoly::GetCryptoParameters() const
  1046. {
  1047. return std::make_unique<CryptoParametersBaseDCRTPoly>(
  1048. m_cryptoContextImplSharedPtr->GetCryptoParameters());
  1049. }
  1050. std::unique_ptr<EncodingParams> CryptoContextDCRTPoly::GetEncodingParams() const
  1051. {
  1052. return std::make_unique<EncodingParams>(m_cryptoContextImplSharedPtr->GetEncodingParams());
  1053. }
  1054. std::unique_ptr<DCRTPoly> CryptoContextDCRTPoly::KeySwitchDownFirstElement(
  1055. const CiphertextDCRTPoly& ciphertext) const
  1056. {
  1057. return std::make_unique<DCRTPoly>(m_cryptoContextImplSharedPtr->KeySwitchDownFirstElement(
  1058. ciphertext.GetInternal()));
  1059. }
  1060. std::unique_ptr<DCRTPolyParams> CryptoContextDCRTPoly::GetElementParams() const
  1061. {
  1062. return std::make_unique<DCRTPolyParams>(m_cryptoContextImplSharedPtr->GetElementParams());
  1063. }
  1064. std::shared_ptr<CryptoContextImpl> CryptoContextDCRTPoly::GetInternal() const
  1065. {
  1066. return m_cryptoContextImplSharedPtr;
  1067. }
  1068. // cxx currently does not support static class methods
  1069. void ClearEvalMultKeys()
  1070. {
  1071. CryptoContextImpl::ClearEvalMultKeys();
  1072. }
  1073. void ClearEvalMultKeysById(const std::string& id)
  1074. {
  1075. CryptoContextImpl::ClearEvalMultKeys(id);
  1076. }
  1077. void ClearEvalMultKeysByCryptoContext(const CryptoContextDCRTPoly& cryptoContext)
  1078. {
  1079. CryptoContextImpl::ClearEvalMultKeys(cryptoContext.GetInternal());
  1080. }
  1081. void ClearEvalSumKeys()
  1082. {
  1083. CryptoContextImpl::ClearEvalSumKeys();
  1084. }
  1085. void ClearEvalSumKeysById(const std::string& id)
  1086. {
  1087. CryptoContextImpl::ClearEvalSumKeys(id);
  1088. }
  1089. void ClearEvalSumKeysByCryptoContext(const CryptoContextDCRTPoly& cryptoContext)
  1090. {
  1091. CryptoContextImpl::ClearEvalSumKeys(cryptoContext.GetInternal());
  1092. }
  1093. void ClearEvalAutomorphismKeys()
  1094. {
  1095. CryptoContextImpl::ClearEvalAutomorphismKeys();
  1096. }
  1097. void ClearEvalAutomorphismKeysById(const std::string& id)
  1098. {
  1099. CryptoContextImpl::ClearEvalAutomorphismKeys(id);
  1100. }
  1101. void ClearEvalAutomorphismKeysByCryptoContext(const CryptoContextDCRTPoly& cryptoContext)
  1102. {
  1103. CryptoContextImpl::ClearEvalAutomorphismKeys(cryptoContext.GetInternal());
  1104. }
  1105. std::unique_ptr<std::vector<uint32_t>> GetExistingEvalAutomorphismKeyIndices(
  1106. const std::string& keyTag)
  1107. {
  1108. return std::make_unique<std::vector<uint32_t>>(
  1109. CryptoContextImpl::GetExistingEvalAutomorphismKeyIndices(keyTag));
  1110. }
  1111. std::unique_ptr<std::vector<uint32_t>> GetUniqueValues(const std::vector<uint32_t>& oldValues,
  1112. const std::vector<uint32_t>& newValues)
  1113. {
  1114. return std::make_unique<std::vector<uint32_t>>(CryptoContextImpl::GetUniqueValues(oldValues,
  1115. newValues));
  1116. }
  1117. std::unique_ptr<MapFromIndexToEvalKey> GetEvalAutomorphismKeyMap(const std::string& keyID)
  1118. {
  1119. return std::make_unique<MapFromIndexToEvalKey>(
  1120. CryptoContextImpl::GetEvalAutomorphismKeyMapPtr(keyID));
  1121. }
  1122. std::unique_ptr<MapFromIndexToEvalKey> GetCopyOfEvalSumKeyMap(const std::string& id)
  1123. {
  1124. return std::make_unique<MapFromIndexToEvalKey>(
  1125. std::make_shared<std::map<uint32_t, std::shared_ptr<EvalKeyImpl>>>(
  1126. CryptoContextImpl::GetEvalSumKeyMap(id)));
  1127. }
  1128. std::unique_ptr<MapFromIndexToEvalKey> GetEvalAutomorphismKeyMapPtr(const std::string& keyID)
  1129. {
  1130. return std::make_unique<MapFromIndexToEvalKey>(CryptoContextImpl::GetEvalAutomorphismKeyMapPtr(
  1131. keyID));
  1132. }
  1133. void InsertEvalAutomorphismKey(const MapFromIndexToEvalKey& evalKeyMap, const std::string& keyTag)
  1134. {
  1135. CryptoContextImpl::InsertEvalAutomorphismKey(evalKeyMap.GetInternal(), keyTag);
  1136. }
  1137. void InsertEvalSumKey(const MapFromIndexToEvalKey& mapToInsert, const std::string& keyTag)
  1138. {
  1139. CryptoContextImpl::InsertEvalSumKey(mapToInsert.GetInternal(), keyTag);
  1140. }
  1141. std::unique_ptr<VectorOfEvalKeys> GetCopyOfEvalMultKeyVector(const std::string& keyID)
  1142. {
  1143. return std::make_unique<VectorOfEvalKeys>(CryptoContextImpl::GetEvalMultKeyVector(keyID));
  1144. }
  1145. void InsertEvalMultKey(const VectorOfEvalKeys& evalKeyVec)
  1146. {
  1147. CryptoContextImpl::InsertEvalMultKey(evalKeyVec.GetInternal());
  1148. }
  1149. std::unique_ptr<MapFromStringToVectorOfEvalKeys> GetCopyOfAllEvalMultKeys()
  1150. {
  1151. return std::make_unique<MapFromStringToVectorOfEvalKeys>(
  1152. CryptoContextImpl::GetAllEvalMultKeys());
  1153. }
  1154. std::unique_ptr<MapFromStringToMapFromIndexToEvalKey> GetCopyOfAllEvalSumKeys()
  1155. {
  1156. return std::make_unique<MapFromStringToMapFromIndexToEvalKey>(
  1157. CryptoContextImpl::GetAllEvalSumKeys());
  1158. }
  1159. std::unique_ptr<MapFromStringToMapFromIndexToEvalKey> GetCopyOfAllEvalAutomorphismKeys()
  1160. {
  1161. return std::make_unique<MapFromStringToMapFromIndexToEvalKey>(
  1162. CryptoContextImpl::GetAllEvalAutomorphismKeys());
  1163. }
  1164. std::unique_ptr<Plaintext> GetPlaintextForDecrypt(const PlaintextEncodings pte,
  1165. const DCRTPolyParams& evp, const EncodingParams& ep)
  1166. {
  1167. return std::make_unique<Plaintext>(CryptoContextImpl::GetPlaintextForDecrypt(pte,
  1168. evp.GetInternal(), ep.GetInternal()));
  1169. }
  1170. // Generator functions
  1171. std::unique_ptr<CryptoContextDCRTPoly> GenNullCryptoContext()
  1172. {
  1173. return std::make_unique<CryptoContextDCRTPoly>();
  1174. }
  1175. std::unique_ptr<CryptoContextDCRTPoly> GenCryptoContextByParamsBFVRNS(const ParamsBFVRNS& params)
  1176. {
  1177. return std::make_unique<CryptoContextDCRTPoly>(params);
  1178. }
  1179. std::unique_ptr<CryptoContextDCRTPoly> GenCryptoContextByParamsBGVRNS(const ParamsBGVRNS& params)
  1180. {
  1181. return std::make_unique<CryptoContextDCRTPoly>(params);
  1182. }
  1183. std::unique_ptr<CryptoContextDCRTPoly> GenCryptoContextByParamsCKKSRNS(const ParamsCKKSRNS& params)
  1184. {
  1185. return std::make_unique<CryptoContextDCRTPoly>(params);
  1186. }
  1187. } // openfhe