#pragma once #include "openfhe/core/lattice/hal/lat-backend.h" #include "openfhe/pke/constants.h" #include "openfhe/pke/cryptocontext-fwd.h" #include "openfhe/pke/scheme/scheme-id.h" #include "rust/cxx.h" namespace lbcrypto { class Params; class CryptoContextBFVRNS; class CryptoContextBGVRNS; class CryptoContextCKKSRNS; template class CCParams; } // lbcrypto namespace openfhe { struct ComplexPair; class CiphertextDCRTPoly; class CryptoParametersBaseDCRTPoly; class DCRTPoly; class DCRTPolyParams; class DecryptResult; class EncodingParams; class EvalKeyDCRTPoly; class KeyPairDCRTPoly; class LWEPrivateKey; class MapFromIndexToEvalKey; class MapFromStringToMapFromIndexToEvalKey; class MapFromStringToVectorOfEvalKeys; class Plaintext; class PrivateKeyDCRTPoly; class PublicKeyDCRTPoly; class SchemeBaseDCRTPoly; class UnorderedMapFromIndexToDCRTPoly; class VectorOfCiphertexts; class VectorOfDCRTPolys; class VectorOfEvalKeys; class VectorOfLWECiphertexts; class VectorOfPrivateKeys; class VectorOfVectorOfCiphertexts; using CryptoContextImpl = lbcrypto::CryptoContextImpl; using Params = lbcrypto::Params; using ParamsBFVRNS = lbcrypto::CCParams; using ParamsBGVRNS = lbcrypto::CCParams; using ParamsCKKSRNS = lbcrypto::CCParams; using PKESchemeFeature = lbcrypto::PKESchemeFeature; using PlaintextEncodings = lbcrypto::PlaintextEncodings; using SCHEME = lbcrypto::SCHEME; class CryptoContextDCRTPoly final { std::shared_ptr m_cryptoContextImplSharedPtr; public: CryptoContextDCRTPoly() = default; explicit CryptoContextDCRTPoly(const ParamsBFVRNS& params); explicit CryptoContextDCRTPoly(const ParamsBGVRNS& params); explicit CryptoContextDCRTPoly(const ParamsCKKSRNS& params); CryptoContextDCRTPoly(const CryptoContextDCRTPoly&) = delete; CryptoContextDCRTPoly(CryptoContextDCRTPoly&&) = delete; CryptoContextDCRTPoly& operator=(const CryptoContextDCRTPoly&) = delete; CryptoContextDCRTPoly& operator=(CryptoContextDCRTPoly&&) = delete; void SetSchemeId(const SCHEME schemeTag) const; [[nodiscard]] SCHEME GetSchemeId() const; [[nodiscard]] size_t GetKeyGenLevel() const; void SetKeyGenLevel(const size_t level) const; void SetSwkFC(const CiphertextDCRTPoly& FHEWtoCKKSswk) const; void EvalCompareSwitchPrecompute(const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */, const bool unit /* false */) const; [[nodiscard]] uint32_t FindAutomorphismIndex(const uint32_t idx) const; [[nodiscard]] std::unique_ptr GetSwkFC() const; void EnableByFeature(const PKESchemeFeature feature) const; void EnableByMask(const uint32_t featureMask) const; [[nodiscard]] std::unique_ptr KeyGen() const; [[nodiscard]] std::unique_ptr MultipartyKeyGenByPublicKey( const PublicKeyDCRTPoly& publicKey, const bool makeSparse /* false */, const bool fresh /* false */) const; [[nodiscard]] std::unique_ptr MultiAddPubKeys( const PublicKeyDCRTPoly& publicKey1, const PublicKeyDCRTPoly& publicKey2, const std::string& keyId /* "" */) const; [[nodiscard]] std::unique_ptr SparseKeyGen() const; void EvalMultKeyGen(const PrivateKeyDCRTPoly& key) const; void EvalMultKeysGen(const PrivateKeyDCRTPoly& key) const; void EvalRotateKeyGen(const PrivateKeyDCRTPoly& privateKey, const std::vector& indexList, const PublicKeyDCRTPoly& publicKey /* GenNullPublicKeyDCRTPoly() */) const; void EvalAtIndexKeyGen(const PrivateKeyDCRTPoly& privateKey, const std::vector& indexList, const PublicKeyDCRTPoly& publicKey /* GenNullPublicKeyDCRTPoly() */) const; void EvalCKKStoFHEWPrecompute(const double scale /* 1.0 */) const; [[nodiscard]] uint32_t GetRingDimension() const; [[nodiscard]] uint32_t GetCyclotomicOrder() const; [[nodiscard]] std::unique_ptr EvalSin(const CiphertextDCRTPoly& ciphertext, const double a, const double b, const uint32_t degree) const; [[nodiscard]] std::unique_ptr EvalCos(const CiphertextDCRTPoly& ciphertext, const double a, const double b, const uint32_t degree) const; [[nodiscard]] std::unique_ptr EncryptByPublicKey( const PublicKeyDCRTPoly& publicKey, const Plaintext& plaintext) const; [[nodiscard]] std::unique_ptr EncryptByPrivateKey( const PrivateKeyDCRTPoly& privateKey, const Plaintext& plaintext) const; [[nodiscard]] std::unique_ptr EvalAddByCiphertexts( const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const; [[nodiscard]] std::unique_ptr EvalAddByCiphertextAndPlaintext( const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const; [[nodiscard]] std::unique_ptr EvalAddByPlaintextAndCiphertext( const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr EvalAddByConstAndCiphertext( const double constant, const CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr EvalAddByCiphertextAndConst( const CiphertextDCRTPoly& ciphertext, const double constant) const; [[nodiscard]] std::unique_ptr EvalAddMutableByCiphertexts( CiphertextDCRTPoly& ciphertext1, CiphertextDCRTPoly& ciphertext2) const; [[nodiscard]] std::unique_ptr EvalAddMutableByCiphertextAndPlaintext( CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const; [[nodiscard]] std::unique_ptr EvalAddMutableByPlaintextAndCiphertext( const Plaintext& plaintext, CiphertextDCRTPoly& ciphertext) const; void EvalAddInPlaceByCiphertexts(CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const; void EvalAddInPlaceByCiphertextAndPlaintext(CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const; void EvalAddInPlaceByPlaintextAndCiphertext(const Plaintext& plaintext, CiphertextDCRTPoly& ciphertext) const; void EvalAddInPlaceByCiphertextAndConst(CiphertextDCRTPoly& ciphertext, const double constant) const; void EvalAddInPlaceByConstAndCiphertext(const double constant, CiphertextDCRTPoly& ciphertext) const; void EvalAddMutableInPlace(CiphertextDCRTPoly& ciphertext1, CiphertextDCRTPoly& ciphertext2) const; [[nodiscard]] std::unique_ptr EvalSubByCiphertexts( const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const; [[nodiscard]] std::unique_ptr EvalSubByCiphertextAndPlaintext( const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const; [[nodiscard]] std::unique_ptr EvalSubByPlaintextAndCiphertext( const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr EvalSubByConstAndCiphertext( const double constant, const CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr EvalSubByCiphertextAndConst( const CiphertextDCRTPoly& ciphertext, const double constant) const; [[nodiscard]] std::unique_ptr EvalSubMutableByCiphertexts( CiphertextDCRTPoly& ciphertext1, CiphertextDCRTPoly& ciphertext2) const; [[nodiscard]] std::unique_ptr EvalSubMutableByCiphertextAndPlaintext( CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const; [[nodiscard]] std::unique_ptr EvalSubMutableByPlaintextAndCiphertext( const Plaintext& plaintext, CiphertextDCRTPoly& ciphertext) const; void EvalSubInPlaceByCiphertexts(CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const; void EvalSubInPlaceByCiphertextAndConst(CiphertextDCRTPoly& ciphertext, const double constant) const; void EvalSubInPlaceByConstAndCiphertext(const double constant, CiphertextDCRTPoly& ciphertext) const; void EvalSubMutableInPlace(CiphertextDCRTPoly& ciphertext1, CiphertextDCRTPoly& ciphertext2) const; [[nodiscard]] std::unique_ptr EvalMultByCiphertexts( const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const; [[nodiscard]] std::unique_ptr EvalMultByCiphertextAndPlaintext( const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const; [[nodiscard]] std::unique_ptr EvalMultByPlaintextAndCiphertext( const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr EvalMultByConstAndCiphertext( const double constant, const CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr EvalMultByCiphertextAndConst( const CiphertextDCRTPoly& ciphertext, const double constant) const; [[nodiscard]] std::unique_ptr EvalMultMutableByCiphertexts( CiphertextDCRTPoly& ciphertext1, CiphertextDCRTPoly& ciphertext2) const; [[nodiscard]] std::unique_ptr EvalMultMutableByCiphertextAndPlaintext( CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const; [[nodiscard]] std::unique_ptr EvalMultMutableByPlaintextAndCiphertext( const Plaintext& plaintext, CiphertextDCRTPoly& ciphertext) const; void EvalMultInPlaceByCiphertextAndConst(CiphertextDCRTPoly& ciphertext, const double constant) const; void EvalMultInPlaceByConstAndCiphertext(const double constant, CiphertextDCRTPoly& ciphertext) const; void EvalMultMutableInPlace(CiphertextDCRTPoly& ciphertext1, CiphertextDCRTPoly& ciphertext2) const; [[nodiscard]] std::unique_ptr EvalMultNoRelin( const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const; [[nodiscard]] std::unique_ptr EvalMultAndRelinearize( const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const; [[nodiscard]] std::unique_ptr EvalRotate( const CiphertextDCRTPoly& ciphertext, const int32_t index) const; [[nodiscard]] std::unique_ptr EvalPoly( const CiphertextDCRTPoly& ciphertext, const std::vector& coefficients) const; [[nodiscard]] std::unique_ptr KeySwitchDown( const CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr KeySwitchExt( const CiphertextDCRTPoly& ciphertext, const bool addFirst) const; [[nodiscard]] std::unique_ptr Compress( const CiphertextDCRTPoly& ciphertext, const uint32_t towersLeft /* 1 */) const; [[nodiscard]] std::unique_ptr EvalNegate( const CiphertextDCRTPoly& ciphertext) const; void EvalNegateInPlace(CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr EvalSquare( const CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr EvalSquareMutable( CiphertextDCRTPoly& ciphertext) const; void EvalSquareInPlace(CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr EvalAtIndex( const CiphertextDCRTPoly& ciphertext, const uint32_t index) const; [[nodiscard]] std::unique_ptr ComposedEvalMult( const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const; [[nodiscard]] std::unique_ptr Relinearize( const CiphertextDCRTPoly& ciphertext) const; void RelinearizeInPlace(CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr EvalChebyshevSeries( const CiphertextDCRTPoly& ciphertext, const std::vector& coefficients, const double a, const double b) const; [[nodiscard]] std::unique_ptr EvalChebyshevFunction( rust::Fn func, const CiphertextDCRTPoly& ciphertext, const double a, const double b, const uint32_t degree) const; [[nodiscard]] std::unique_ptr EvalBootstrap( const CiphertextDCRTPoly& ciphertext, const uint32_t numIterations /* 1 */, const uint32_t precision /* 0 */) const; [[nodiscard]] std::unique_ptr Rescale( const CiphertextDCRTPoly& ciphertext) const; void RescaleInPlace(CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr ModReduce( const CiphertextDCRTPoly& ciphertext) const; void ModReduceInPlace(CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr EvalSum(const CiphertextDCRTPoly& ciphertext, const uint32_t batchSize) const; [[nodiscard]] std::unique_ptr EvalPolyLinear( const CiphertextDCRTPoly& ciphertext, const std::vector& coefficients) const; [[nodiscard]] std::unique_ptr EvalPolyPS( const CiphertextDCRTPoly& ciphertext, const std::vector& coefficients) const; [[nodiscard]] std::unique_ptr EvalChebyshevSeriesLinear( const CiphertextDCRTPoly& ciphertext, const std::vector& coefficients, const double a, const double b) const; [[nodiscard]] std::unique_ptr EvalChebyshevSeriesPS( const CiphertextDCRTPoly& ciphertext, const std::vector& coefficients, const double a, const double b) const; [[nodiscard]] std::unique_ptr EvalDivide( const CiphertextDCRTPoly& ciphertext, const double a, const double b, const uint32_t degree) const; [[nodiscard]] std::unique_ptr IntMPBootAdjustScale( const CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr EvalLogistic( const CiphertextDCRTPoly& ciphertext, const double a, const double b, const uint32_t degree) const; [[nodiscard]] std::unique_ptr IntMPBootRandomElementGen( const PublicKeyDCRTPoly& publicKey) const; [[nodiscard]] std::unique_ptr EvalCompareSchemeSwitching( const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2, const uint32_t numCtxts /* 0 */, const uint32_t numSlots /* 0 */, const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */, const bool unit /* false */) const; void EvalBootstrapSetup(const std::vector& levelBudget /* {5, 4} */, const std::vector& dim1 /* {0, 0} */, const uint32_t slots /* 0 */, const uint32_t correctionFactor /* 0 */, const bool precompute /* true */) const; void EvalBootstrapKeyGen(const PrivateKeyDCRTPoly& privateKey, const uint32_t slots) const; void EvalBootstrapPrecompute(const uint32_t slots /* 0 */) const; [[nodiscard]] std::unique_ptr DecryptByPrivateKeyAndCiphertext( const PrivateKeyDCRTPoly& privateKey, const CiphertextDCRTPoly& ciphertext, Plaintext& plaintext) const; [[nodiscard]] std::unique_ptr DecryptByCiphertextAndPrivateKey( const CiphertextDCRTPoly& ciphertext, const PrivateKeyDCRTPoly& privateKey, Plaintext& plaintext) const; [[nodiscard]] std::unique_ptr MultipartyDecryptFusion( const VectorOfCiphertexts& partialCiphertextVec, Plaintext& plaintext) const; [[nodiscard]] std::unique_ptr MakePackedPlaintext( const std::vector<int64_t>& value, const size_t noiseScaleDeg /* 1 */, const uint32_t level /* 0 */) const; [[nodiscard]] std::unique_ptr<Plaintext> MakeStringPlaintext(const std::string& s) const; [[nodiscard]] std::unique_ptr<Plaintext> MakeCoefPackedPlaintext( const std::vector<int64_t>& value, const size_t noiseScaleDeg /* 1 */, const uint32_t level /* 0 */) const; [[nodiscard]] std::unique_ptr<Plaintext> MakeCKKSPackedPlaintextByVectorOfDouble( const std::vector<double>& value, const size_t scaleDeg /* 1 */, const uint32_t level /* 0 */, const DCRTPolyParams& params /* GenNullDCRTPolyParams() */, const uint32_t slots /* 0 */) const; [[nodiscard]] std::unique_ptr<Plaintext> MakeCKKSPackedPlaintextByVectorOfComplex( const std::vector<ComplexPair>& value, const size_t scaleDeg /* 1 */, const uint32_t level /* 0 */, const DCRTPolyParams& params /* GenNullDCRTPolyParams() */, const uint32_t slots /* 0 */) const; [[nodiscard]] std::unique_ptr<std::vector<uint32_t>> FindAutomorphismIndices( const std::vector<uint32_t>& idxList) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalInnerProductByCiphertexts( const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2, const uint32_t batchSize) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalInnerProductByCiphertextAndPlaintext( const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext, const uint32_t batchSize) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalInnerProductByPlaintextAndCiphertext( const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext, const uint32_t batchSize) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> KeySwitch( const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey) const; void KeySwitchInPlace(CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> LevelReduce( const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey, const size_t levels /* 1 */) const; void LevelReduceInPlace(CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey, const size_t levels /* 1 */) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> ReEncrypt( const CiphertextDCRTPoly& ciphertext, const EvalKeyDCRTPoly& evalKey, const PublicKeyDCRTPoly& publicKey /* GenNullPublicKeyDCRTPoly() */) const; [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> KeySwitchGen( const PrivateKeyDCRTPoly& oldPrivateKey, const PrivateKeyDCRTPoly& newPrivateKey) const; [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> ReKeyGen( const PrivateKeyDCRTPoly& oldPrivateKey, const PublicKeyDCRTPoly& newPublicKey) const; [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> MultiKeySwitchGen( const PrivateKeyDCRTPoly& originalPrivateKey, const PrivateKeyDCRTPoly& newPrivateKey, const EvalKeyDCRTPoly& evalKey) const; [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> MultiAddEvalKeys( const EvalKeyDCRTPoly& evalKey1, const EvalKeyDCRTPoly& evalKey2, const std::string& keyId /* "" */) const; [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> MultiMultEvalKey( const PrivateKeyDCRTPoly& privateKey, const EvalKeyDCRTPoly& evalKey, const std::string& keyId /* "" */) const; [[nodiscard]] std::unique_ptr<EvalKeyDCRTPoly> MultiAddEvalMultKeys( const EvalKeyDCRTPoly& evalKey1, const EvalKeyDCRTPoly& evalKey2, const std::string& keyId /* "" */) const; void EvalSumKeyGen(const PrivateKeyDCRTPoly& privateKey, const PublicKeyDCRTPoly& publicKey /* GenNullPublicKeyDCRTPoly() */) const; void EvalCKKStoFHEWKeyGen(const KeyPairDCRTPoly& keyPair, const LWEPrivateKey& lwesk) const; void EvalFHEWtoCKKSKeyGen(const KeyPairDCRTPoly& keyPair, const LWEPrivateKey& lwesk, const uint32_t numSlots /* 0 */, const uint32_t numCtxts /* 0 */, const uint32_t dim1 /* 0 */, const uint32_t L /* 0 */) const; void EvalSchemeSwitchingKeyGen(const KeyPairDCRTPoly& keyPair, const LWEPrivateKey& lwesk) const; [[nodiscard]] uint64_t GetModulus() const; [[nodiscard]] uint64_t GetRootOfUnity() const; [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> MultipartyDecryptLead( const VectorOfCiphertexts& ciphertextVec, const PrivateKeyDCRTPoly& privateKey) const; [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> MultipartyDecryptMain( const VectorOfCiphertexts& ciphertextVec, const PrivateKeyDCRTPoly& privateKey) const; [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> IntMPBootDecrypt( const PrivateKeyDCRTPoly& privateKey, const CiphertextDCRTPoly& ciphertext, const CiphertextDCRTPoly& a) const; [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> EvalMinSchemeSwitching( const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey, const uint32_t numValues /* 0 */, const uint32_t numSlots /* 0 */, const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */) const; [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> EvalMinSchemeSwitchingAlt( const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey, const uint32_t numValues /* 0 */, const uint32_t numSlots /* 0 */, const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */) const; [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> EvalMaxSchemeSwitching( const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey, const uint32_t numValues /* 0 */, const uint32_t numSlots /* 0 */, const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */) const; [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> EvalMaxSchemeSwitchingAlt( const CiphertextDCRTPoly& ciphertext, const PublicKeyDCRTPoly& publicKey, const uint32_t numValues /* 0 */, const uint32_t numSlots /* 0 */, const uint32_t pLWE /* 0 */, const double scaleSign /* 1.0 */) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddMany( const VectorOfCiphertexts& ciphertextVec) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultMany( const VectorOfCiphertexts& ciphertextVec) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMerge( const VectorOfCiphertexts& ciphertextVec) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> IntMPBootEncrypt( const PublicKeyDCRTPoly& publicKey, const VectorOfCiphertexts& sharesPair, const CiphertextDCRTPoly& a, const CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddManyInPlace( VectorOfCiphertexts& ciphertextVec) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalLinearWSumMutable( VectorOfCiphertexts& ciphertextVec, const std::vector<double>& constantsVec) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalLinearWSumMutable( const std::vector<double>& constantsVec, VectorOfCiphertexts& ciphertextVec) const; [[nodiscard]] std::unique_ptr<KeyPairDCRTPoly> MultipartyKeyGenByVectorOfPrivateKeys( const VectorOfPrivateKeys& privateKeyVec) const; [[nodiscard]] std::unique_ptr<UnorderedMapFromIndexToDCRTPoly> ShareKeys( const PrivateKeyDCRTPoly& sk, const uint32_t N, const uint32_t threshold, const uint32_t index, const std::string& shareType) const; void RecoverSharedKey(PrivateKeyDCRTPoly& sk, UnorderedMapFromIndexToDCRTPoly& sk_shares, const uint32_t N, const uint32_t threshold, const std::string& shareType) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAutomorphism( const CiphertextDCRTPoly& ciphertext, const uint32_t i, const MapFromIndexToEvalKey& evalKeyMap) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSumRows( const CiphertextDCRTPoly& ciphertext, const uint32_t rowSize, const MapFromIndexToEvalKey& evalSumKeyMap, const uint32_t subringDim /* 0 */) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSumCols( const CiphertextDCRTPoly& ciphertext, const uint32_t rowSize, const MapFromIndexToEvalKey& evalSumKeyMap) const; [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> EvalAutomorphismKeyGen( const PrivateKeyDCRTPoly& privateKey, const std::vector<uint32_t>& indexList) const; [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> EvalSumRowsKeyGen( const PrivateKeyDCRTPoly& privateKey, const PublicKeyDCRTPoly& publicKey /* GenNullPublicKeyDCRTPoly() */, const uint32_t rowSize /* 0 */, const uint32_t subringDim /* 0 */) const; [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> EvalSumColsKeyGen( const PrivateKeyDCRTPoly& privateKey, const PublicKeyDCRTPoly& publicKey /* GenNullPublicKeyDCRTPoly() */) const; [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> MultiEvalAutomorphismKeyGen( const PrivateKeyDCRTPoly& privateKey, const MapFromIndexToEvalKey& evalKeyMap, const std::vector<uint32_t>& indexList, const std::string& keyId /* "" */) const; [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> MultiEvalAtIndexKeyGen( const PrivateKeyDCRTPoly& privateKey, const MapFromIndexToEvalKey& evalKeyMap, const std::vector<int32_t>& indexList, const std::string& keyId /* "" */) const; [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> MultiEvalSumKeyGen( const PrivateKeyDCRTPoly& privateKey, const MapFromIndexToEvalKey& evalKeyMap, const std::string& keyId /* "" */) const; [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> MultiAddEvalSumKeys( const MapFromIndexToEvalKey& evalKeyMap1, const MapFromIndexToEvalKey& evalKeyMap2, const std::string& keyId /* "" */) const; [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> MultiAddEvalAutomorphismKeys( const MapFromIndexToEvalKey& evalKeyMap1, const MapFromIndexToEvalKey& evalKeyMap2, const std::string& keyId /* "" */) const; [[nodiscard]] std::unique_ptr<VectorOfDCRTPolys> EvalFastRotationPrecompute( const CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalFastRotation( const CiphertextDCRTPoly& ciphertext, const uint32_t index, const uint32_t m, const VectorOfDCRTPolys& digits) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalFastRotationExt( const CiphertextDCRTPoly& ciphertext, const uint32_t index, const VectorOfDCRTPolys& digits, const bool addFirst) const; [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalFHEWtoCKKS( VectorOfLWECiphertexts& LWECiphertexts, const uint32_t numCtxts /* 0 */, const uint32_t numSlots /* 0 */, const uint32_t p /* 4 */, const double pmin /* 0.0 */, const double pmax /* 2.0 */, const uint32_t dim1 /* 0 */) const; [[nodiscard]] std::unique_ptr<VectorOfLWECiphertexts> EvalCKKStoFHEW( const CiphertextDCRTPoly& ciphertext, const uint32_t numCtxts /* 0 */) const; [[nodiscard]] std::unique_ptr<VectorOfCiphertexts> IntMPBootAdd( VectorOfVectorOfCiphertexts& sharesPairVec) const; [[nodiscard]] std::unique_ptr<SchemeBaseDCRTPoly> GetScheme() const; [[nodiscard]] std::unique_ptr<CryptoParametersBaseDCRTPoly> GetCryptoParameters() const; [[nodiscard]] std::unique_ptr<EncodingParams> GetEncodingParams() const; [[nodiscard]] std::unique_ptr<DCRTPoly> KeySwitchDownFirstElement( const CiphertextDCRTPoly& ciphertext) const; [[nodiscard]] std::unique_ptr<DCRTPolyParams> GetElementParams() const; [[nodiscard]] std::shared_ptr<CryptoContextImpl>& GetRef() noexcept; [[nodiscard]] const std::shared_ptr<CryptoContextImpl>& GetRef() const noexcept; }; // cxx currently does not support static class methods void DCRTPolyClearEvalMultKeys(); void DCRTPolyClearEvalMultKeysById(const std::string& id); void DCRTPolyClearEvalMultKeysByCryptoContext(const CryptoContextDCRTPoly& cryptoContext); void DCRTPolyClearEvalSumKeys(); void DCRTPolyClearEvalSumKeysById(const std::string& id); void DCRTPolyClearEvalSumKeysByCryptoContext(const CryptoContextDCRTPoly& cryptoContext); void DCRTPolyClearEvalAutomorphismKeys(); void DCRTPolyClearEvalAutomorphismKeysById(const std::string& id); void DCRTPolyClearEvalAutomorphismKeysByCryptoContext(const CryptoContextDCRTPoly& cryptoContext); [[nodiscard]] std::unique_ptr<std::vector<uint32_t>> DCRTPolyGetExistingEvalAutomorphismKeyIndices( const std::string& keyTag); [[nodiscard]] std::unique_ptr<std::vector<uint32_t>> DCRTPolyGetUniqueValues( const std::vector<uint32_t>& oldValues, const std::vector<uint32_t>& newValues); [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> DCRTPolyGetEvalAutomorphismKeyMap( const std::string& keyID); [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> DCRTPolyGetCopyOfEvalSumKeyMap( const std::string& id); [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> DCRTPolyGetEvalAutomorphismKeyMapPtr( const std::string& keyID); void DCRTPolyInsertEvalAutomorphismKey(const MapFromIndexToEvalKey& evalKeyMap, const std::string& keyTag /* "" */); void DCRTPolyInsertEvalSumKey(const MapFromIndexToEvalKey& mapToInsert, const std::string& keyTag /* "" */); [[nodiscard]] std::unique_ptr<VectorOfEvalKeys> DCRTPolyGetCopyOfEvalMultKeyVector( const std::string& keyID); void DCRTPolyInsertEvalMultKey(const VectorOfEvalKeys& evalKeyVec); [[nodiscard]] std::unique_ptr<MapFromStringToVectorOfEvalKeys> DCRTPolyGetCopyOfAllEvalMultKeys(); [[nodiscard]] std::unique_ptr<MapFromStringToMapFromIndexToEvalKey> DCRTPolyGetCopyOfAllEvalSumKeys(); [[nodiscard]] std::unique_ptr<MapFromStringToMapFromIndexToEvalKey> DCRTPolyGetCopyOfAllEvalAutomorphismKeys(); [[nodiscard]] std::unique_ptr<Plaintext> DCRTPolyGetPlaintextForDecrypt( const PlaintextEncodings pte, const DCRTPolyParams& evp, const EncodingParams& ep); // Generator functions [[nodiscard]] std::unique_ptr<CryptoContextDCRTPoly> DCRTPolyGenNullCryptoContext(); [[nodiscard]] std::unique_ptr<CryptoContextDCRTPoly> DCRTPolyGenCryptoContextByParamsBFVRNS( const ParamsBFVRNS& params); [[nodiscard]] std::unique_ptr<CryptoContextDCRTPoly> DCRTPolyGenCryptoContextByParamsBGVRNS( const ParamsBGVRNS& params); [[nodiscard]] std::unique_ptr<CryptoContextDCRTPoly> DCRTPolyGenCryptoContextByParamsCKKSRNS( const ParamsCKKSRNS& params); } // openfhe