Browse Source

Add a function to perform EvalAutomorphism without a KeyMap (like EvalRotate)

Ian Goldberg 3 weeks ago
parent
commit
ef8e5989fb
3 changed files with 11 additions and 0 deletions
  1. 8 0
      src/CryptoContext.cc
  2. 2 0
      src/CryptoContext.h
  3. 1 0
      src/lib.rs

+ 8 - 0
src/CryptoContext.cc

@@ -195,6 +195,14 @@ std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAutomorphism(
     return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAutomorphism(
         ciphertext.GetRef(), i, *evalKeyMap.GetRef()));
 }
+std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAutomorphismDirect(
+    const CiphertextDCRTPoly& ciphertext, const uint32_t i) const
+{
+    const auto ct = ciphertext.GetRef();
+    const auto evalKeyMap = this->GetRef()->GetEvalAutomorphismKeyMap(ct->GetKeyTag());
+    return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAutomorphism(
+        ciphertext.GetRef(), i, evalKeyMap));
+}
 std::unique_ptr<MapFromIndexToEvalKey> CryptoContextDCRTPoly::EvalAutomorphismKeyGen(
     const PrivateKeyDCRTPoly& privateKey, const std::vector<uint32_t>& indexList) const
 {

+ 2 - 0
src/CryptoContext.h

@@ -127,6 +127,8 @@ public:
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAutomorphism(
         const CiphertextDCRTPoly& ciphertext, const uint32_t i,
         const MapFromIndexToEvalKey& evalKeyMap) const;
+    [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAutomorphismDirect(
+        const CiphertextDCRTPoly& ciphertext, const uint32_t i) const;
     [[nodiscard]] std::unique_ptr<MapFromIndexToEvalKey> EvalAutomorphismKeyGen(
         const PrivateKeyDCRTPoly& privateKey, const std::vector<uint32_t>& indexList) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalBootstrap(

+ 1 - 0
src/lib.rs

@@ -315,6 +315,7 @@ pub mod ffi
                              publicKey: /* DCRTPolyGenNullPublicKey() */ &PublicKeyDCRTPoly);
         fn EvalAutomorphism(self: &CryptoContextDCRTPoly, ciphertext: &CiphertextDCRTPoly, i: u32,
                             evalKeyMap: &MapFromIndexToEvalKey) -> UniquePtr<CiphertextDCRTPoly>;
+        fn EvalAutomorphismDirect(self: &CryptoContextDCRTPoly, ciphertext: &CiphertextDCRTPoly, i: u32) -> UniquePtr<CiphertextDCRTPoly>;
         fn EvalAutomorphismKeyGen(self: &CryptoContextDCRTPoly, privateKey: &PrivateKeyDCRTPoly,
                                   indexList: &CxxVector<u32>) -> UniquePtr<MapFromIndexToEvalKey>;
         fn EvalBootstrap(self: &CryptoContextDCRTPoly, ciphertext: &CiphertextDCRTPoly,