Example for the FHEW scheme using the default bootstrapping method (GINX)
*/
#include "binfhecontext.h"
using namespace lbcrypto;
int main() {
auto cc = BinFHEContext();
cc.GenerateBinFHEContext(STD128_4, GINX);
auto sk = cc.KeyGen();
std::cout << "Generating the bootstrapping keys..." << std::endl;
cc.BTKeyGen(sk);
std::cout << "Completed the key generation." << std::endl;
auto p = 6;
auto ct1_3input = cc.Encrypt(sk, 1, SMALL_DIM, p);
auto ct2_3input = cc.Encrypt(sk, 1, SMALL_DIM, p);
auto ct3_3input = cc.Encrypt(sk, 0, SMALL_DIM, p);
std::vector<LWECiphertext> ct123;
ct123.push_back(ct1_3input);
ct123.push_back(ct2_3input);
ct123.push_back(ct3_3input);
auto ctAND3 = cc.EvalBinGate(AND3, ct123);
auto ctOR3 = cc.EvalBinGate(OR3, ct123);
LWEPlaintext result;
cc.Decrypt(sk, ctAND3, &result, p);
if (result != 0)
OPENFHE_THROW("Decryption failure");
std::cout << "Result of encrypted computation of AND(1, 1, 0) = " << result << std::endl;
cc.Decrypt(sk, ctOR3, &result, p);
if (result != 1)
OPENFHE_THROW("Decryption failure");
std::cout << "Result of encrypted computation of OR(1, 1, 0) = " << result << std::endl;
p = 4;
auto ct1_3input_p4 = cc.Encrypt(sk, 1, SMALL_DIM, p);
auto ct2_3input_p4 = cc.Encrypt(sk, 1, SMALL_DIM, p);
auto ct3_3input_p4 = cc.Encrypt(sk, 0, SMALL_DIM, p);
auto ct4_3input_p4 = cc.Encrypt(sk, 0, SMALL_DIM, p);
std::vector<LWECiphertext> ct123_p4;
ct123_p4.push_back(ct1_3input_p4);
ct123_p4.push_back(ct2_3input_p4);
ct123_p4.push_back(ct3_3input_p4);
std::vector<LWECiphertext> ct134_p4;
ct134_p4.push_back(ct1_3input_p4);
ct134_p4.push_back(ct3_3input_p4);
ct134_p4.push_back(ct4_3input_p4);
std::vector<LWECiphertext> ct132_p4;
ct132_p4.push_back(ct1_3input_p4);
ct132_p4.push_back(ct3_3input_p4);
ct132_p4.push_back(ct2_3input_p4);
auto ctMajority = cc.EvalBinGate(MAJORITY, ct123_p4);
auto ctCMUX0 = cc.EvalBinGate(CMUX, ct132_p4);
auto ctCMUX1 = cc.EvalBinGate(CMUX, ct134_p4);
cc.Decrypt(sk, ctMajority, &result);
if (result != 1)
OPENFHE_THROW("Decryption failure");
std::cout << "Result of encrypted computation of Majority(1, 1, 0) = " << result << std::endl;
cc.Decrypt(sk, ctCMUX1, &result);
if (result != 1)
OPENFHE_THROW("Decryption failure");
std::cout << "Result of encrypted computation of CMUX(1, 0, 0) = " << result << std::endl;
cc.Decrypt(sk, ctCMUX0, &result);
if (result != 0)
OPENFHE_THROW("Decryption failure");
std::cout << "Result of encrypted computation of CMUX(1, 0, 1) = " << result << std::endl;
p = 8;
auto ct1_4input = cc.Encrypt(sk, 1, SMALL_DIM, p);
auto ct2_4input = cc.Encrypt(sk, 0, SMALL_DIM, p);
auto ct3_4input = cc.Encrypt(sk, 0, SMALL_DIM, p);
auto ct4_4input = cc.Encrypt(sk, 0, SMALL_DIM, p);
std::vector<LWECiphertext> ct1234;
ct1234.push_back(ct1_4input);
ct1234.push_back(ct2_4input);
ct1234.push_back(ct3_4input);
ct1234.push_back(ct4_4input);
auto ctAND4 = cc.EvalBinGate(AND4, ct1234);
auto ctOR4 = cc.EvalBinGate(OR4, ct1234);
cc.Decrypt(sk, ctAND4, &result, p);
if (result != 0)
OPENFHE_THROW("Decryption failure");
std::cout << "Result of encrypted computation of AND(1, 0, 0, 0) = " << result << std::endl;
cc.Decrypt(sk, ctOR4, &result, p);
if (result != 1)
OPENFHE_THROW("Decryption failure");
std::cout << "Result of encrypted computation of OR(1, 0, 0, 0) = " << result << std::endl;
return 0;
}