PALISADE Lattice Crypto Library  1.11.9
A lattice crypto library for software engineers by software engineers.
metadata.h
1 /***
2  * © 2020 Duality Technologies, Inc. All rights reserved.
3  * This is a proprietary software product of Duality Technologies, Inc.
4  *protected under copyright laws and international copyright treaties, patent
5  *law, trade secret law and other intellectual property rights of general
6  *applicability. Any use of this software is strictly prohibited absent a
7  *written agreement executed by Duality Technologies, Inc., which provides
8  *certain limited rights to use this software. You may not copy, distribute,
9  *make publicly available, publicly perform, disassemble, de-compile or reverse
10  *engineer any part of this software, breach its security, or circumvent,
11  *manipulate, impair or disrupt its operation.
12  ***/
13 
14 #ifndef LBCRYPTO_CRYPTO_METADATA_H
15 #define LBCRYPTO_CRYPTO_METADATA_H
16 
17 namespace lbcrypto {
18 
22 class Metadata {
23  public:
27  Metadata() {}
28 
32  Metadata(const Metadata& mdata) { Metadata(); }
33 
37  virtual ~Metadata() {}
38 
43  virtual std::shared_ptr<Metadata> Clone() const {
44  return std::make_shared<Metadata>();
45  }
46 
52  virtual bool operator==(const Metadata& mdata) const { return true; }
53 
58  virtual bool operator!=(const Metadata& mdata) const {
59  return !(*this == mdata);
60  }
61 
66  virtual std::ostream& print(std::ostream& out) const {
67  out << "[ ]" << std::endl;
68  return out;
69  }
70 
75  friend std::ostream& operator<<(std::ostream& out, const Metadata& m) {
76  m.print(out);
77  return out;
78  }
79 
83  template <class Archive>
84  void save(Archive& ar, std::uint32_t const version) const {}
85 
89  template <class Archive>
90  void load(Archive& ar, std::uint32_t const version) {
91  if (version > SerializedVersion()) {
92  PALISADE_THROW(deserialize_error,
93  "serialized object version " + std::to_string(version) +
94  " is from a later version of the library");
95  }
96  }
97 
101  virtual std::string SerializedObjectName() const { return "Metadata"; }
102 
106  static uint32_t SerializedVersion() { return 1; }
107 };
108 
113 class MetadataTest : public Metadata {
114  public:
118  MetadataTest() : Metadata(), m_s("") {}
122  virtual ~MetadataTest() {}
123 
127  MetadataTest(const MetadataTest& mdata) : Metadata() { m_s = mdata.m_s; }
128 
141  std::shared_ptr<Metadata> Clone() const {
142  auto mdata = std::make_shared<MetadataTest>();
143  mdata->m_s = this->m_s;
144  return mdata;
145  }
146 
150  void SetMetadata(string str) { m_s = string(str); }
151 
155  string GetMetadata() const { return m_s; }
156 
160  bool operator==(const Metadata& mdata) const {
161  try {
162  const MetadataTest& mdataTest = dynamic_cast<const MetadataTest&>(mdata);
163  return m_s == mdataTest.GetMetadata(); // All Metadata objects without
164  // any members are equal
165  } catch (const std::bad_cast& e) {
166  PALISADE_THROW(
168  "Tried to downcast an object of different class to MetadataTest");
169  }
170  }
171 
175  std::ostream& print(std::ostream& out) const {
176  out << "[ " << m_s << " ]";
177  return out;
178  }
179 
183  template <class Archive>
184  void save(Archive& ar, std::uint32_t const version) const {
185  ar(cereal::base_class<Metadata>(this));
186  ar(cereal::make_nvp("str", m_s));
187  }
188 
192  template <class Archive>
193  void load(Archive& ar, std::uint32_t const version) {
194  if (version > SerializedVersion()) {
195  PALISADE_THROW(deserialize_error,
196  "serialized object version " + std::to_string(version) +
197  " is from a later version of the library");
198  }
199  ar(cereal::base_class<Metadata>(this));
200  ar(cereal::make_nvp("str", m_s));
201  }
202 
210  template <class Element>
211  static const shared_ptr<MetadataTest> CloneMetadata(
212  ConstCiphertext<Element> ciphertext) {
213  auto it = ciphertext->FindMetadataByKey("test");
214 
215  if (ciphertext->MetadataFound(it)) {
216  return std::dynamic_pointer_cast<MetadataTest>(
217  ciphertext->GetMetadata(it)->Clone());
218  } else {
219  PALISADE_THROW(
221  "Attempt to access metadata (MetadataTest) that has not been set.");
222  }
223  }
224 
233  template <class Element>
234  static const shared_ptr<MetadataTest> GetMetadata(
235  ConstCiphertext<Element> ciphertext) {
236  auto it = ciphertext->FindMetadataByKey("test");
237 
238  if (ciphertext->MetadataFound(it)) {
239  return std::dynamic_pointer_cast<MetadataTest>(
240  ciphertext->GetMetadata(it));
241  } else {
242  PALISADE_THROW(
244  "Attempt to access metadata (MetadataTest) that has not been set.");
245  }
246  }
247 
263  template <class Element>
264  static void StoreMetadata(Ciphertext<Element> ciphertext,
265  shared_ptr<MetadataTest> mdata) {
266  ciphertext->SetMetadataByKey("test", mdata);
267  }
268 
269  protected:
270  string m_s;
271 };
272 
273 } // end namespace lbcrypto
274 
275 #endif
static void StoreMetadata(Ciphertext< Element > ciphertext, shared_ptr< MetadataTest > mdata)
Definition: metadata.h:264
virtual std::shared_ptr< Metadata > Clone() const
Definition: metadata.h:43
virtual ~Metadata()
Definition: metadata.h:37
std::ostream & print(std::ostream &out) const
Definition: metadata.h:175
Metadata(const Metadata &mdata)
Definition: metadata.h:32
bool operator==(const Metadata &mdata) const
Definition: metadata.h:160
string GetMetadata() const
Definition: metadata.h:155
void load(Archive &ar, std::uint32_t const version)
Definition: metadata.h:193
friend std::ostream & operator<<(std::ostream &out, const Metadata &m)
Definition: metadata.h:75
virtual bool operator==(const Metadata &mdata) const
Definition: metadata.h:52
Definition: exception.h:147
Metadata()
Definition: metadata.h:27
virtual bool operator!=(const Metadata &mdata) const
Definition: metadata.h:58
static uint32_t SerializedVersion()
Definition: metadata.h:106
static const shared_ptr< MetadataTest > GetMetadata(ConstCiphertext< Element > ciphertext)
Definition: metadata.h:234
Empty metadata container.
Definition: metadata.h:22
static const shared_ptr< MetadataTest > CloneMetadata(ConstCiphertext< Element > ciphertext)
Definition: metadata.h:211
MetadataTest()
Definition: metadata.h:118
void save(Archive &ar, std::uint32_t const version) const
Definition: metadata.h:84
void save(Archive &ar, std::uint32_t const version) const
Definition: metadata.h:184
virtual std::ostream & print(std::ostream &out) const
Definition: metadata.h:66
MetadataTest(const MetadataTest &mdata)
Definition: metadata.h:127
std::shared_ptr< Metadata > Clone() const
Definition: metadata.h:141
void load(Archive &ar, std::uint32_t const version)
Definition: metadata.h:90
Definition: binfhecontext.h:36
Example class inheriting from Metadata and adding a member. This is used in unit tests.
Definition: metadata.h:113
Definition: exception.h:90
virtual ~MetadataTest()
Definition: metadata.h:122
virtual std::string SerializedObjectName() const
Definition: metadata.h:101
void SetMetadata(string str)
Definition: metadata.h:150