Example for FHEW with JSON serialization
*/
#include "binfhecontext-ser.h"
using namespace lbcrypto;
const std::string DATAFOLDER = "demoData";
int main() {
auto cc1 = BinFHEContext();
cc1.GenerateBinFHEContext(TOY);
std::cout << "Generating keys." << std::endl;
auto sk1 = cc1.KeyGen();
cc1.BTKeyGen(sk1);
std::cout << "Done generating all keys." << std::endl;
auto ct1 = cc1.Encrypt(sk1, 1);
if (!Serial::SerializeToFile(DATAFOLDER + "/cryptoContext.txt", cc1, SerType::JSON)) {
std::cerr << "Error serializing the cryptocontext" << std::endl;
return 1;
}
std::cout << "The cryptocontext has been serialized." << std::endl;
if (!Serial::SerializeToFile(DATAFOLDER + "/refreshKey.txt", cc1.GetRefreshKey(), SerType::JSON)) {
std::cerr << "Error serializing the refreshing key" << std::endl;
return 1;
}
std::cout << "The refreshing key has been serialized." << std::endl;
if (!Serial::SerializeToFile(DATAFOLDER + "/ksKey.txt", cc1.GetSwitchKey(), SerType::JSON)) {
std::cerr << "Error serializing the switching key" << std::endl;
return 1;
}
std::cout << "The key switching key has been serialized." << std::endl;
if (!Serial::SerializeToFile(DATAFOLDER + "/sk1.txt", sk1, SerType::JSON)) {
std::cerr << "Error serializing sk1" << std::endl;
return 1;
}
std::cout << "The secret key sk1 key been serialized." << std::endl;
if (!Serial::SerializeToFile(DATAFOLDER + "/ct1.txt", ct1, SerType::JSON)) {
std::cerr << "Error serializing ct1" << std::endl;
return 1;
}
std::cout << "A ciphertext has been serialized." << std::endl;
BinFHEContext cc;
if (Serial::DeserializeFromFile(DATAFOLDER + "/cryptoContext.txt", cc, SerType::JSON) == false) {
std::cerr << "Could not deserialize the cryptocontext" << std::endl;
return 1;
}
std::cout << "The cryptocontext has been deserialized." << std::endl;
RingGSWACCKey refreshKey;
if (Serial::DeserializeFromFile(DATAFOLDER + "/refreshKey.txt", refreshKey, SerType::JSON) == false) {
std::cerr << "Could not deserialize the refresh key" << std::endl;
return 1;
}
std::cout << "The refresh key has been deserialized." << std::endl;
LWESwitchingKey ksKey;
if (Serial::DeserializeFromFile(DATAFOLDER + "/ksKey.txt", ksKey, SerType::JSON) == false) {
std::cerr << "Could not deserialize the switching key" << std::endl;
return 1;
}
std::cout << "The switching key has been deserialized." << std::endl;
cc.BTKeyLoad({refreshKey, ksKey});
LWEPrivateKey sk;
if (Serial::DeserializeFromFile(DATAFOLDER + "/sk1.txt", sk, SerType::JSON) == false) {
std::cerr << "Could not deserialize the secret key" << std::endl;
return 1;
}
std::cout << "The secret key has been deserialized." << std::endl;
LWECiphertext ct;
if (Serial::DeserializeFromFile(DATAFOLDER + "/ct1.txt", ct, SerType::JSON) == false) {
std::cerr << "Could not deserialize the ciphertext" << std::endl;
return 1;
}
std::cout << "The ciphertext has been deserialized." << std::endl;
auto ct2 = cc.Encrypt(sk, 1);
std::cout << "Running the computation" << std::endl;
auto ctResult = cc.EvalBinGate(AND, ct, ct2);
std::cout << "The computation has completed" << std::endl;
LWEPlaintext result;
cc.Decrypt(sk, ctResult, &result);
std::cout << "result of 1 AND 1 = " << result << std::endl;
return 0;
}