From 5d96039154a225be48174ee0208f74821c90a745 Mon Sep 17 00:00:00 2001 From: sararv22 Date: Tue, 31 Jan 2023 14:46:53 -0500 Subject: [PATCH] check input ciphertext to encryptn, removed unittests copy for pke to identify tests to add and some cleanup (this branch fixes issue #235) --- src/binfhe/examples/pke/boolean-pke.cpp | 9 +- .../pke/boolean-serial-binary-pke.cpp | 25 +- src/binfhe/lib/binfhecontext.cpp | 26 +- src/binfhe/unittest/UnitTestFHEWPKE.cpp | 889 ------------------ src/binfhe/unittest/UnitTestFHEWPKEDeep.cpp | 316 ------- src/binfhe/unittest/UnitTestFHEWPKESerial.cpp | 139 --- 6 files changed, 35 insertions(+), 1369 deletions(-) delete mode 100644 src/binfhe/unittest/UnitTestFHEWPKE.cpp delete mode 100644 src/binfhe/unittest/UnitTestFHEWPKEDeep.cpp delete mode 100644 src/binfhe/unittest/UnitTestFHEWPKESerial.cpp diff --git a/src/binfhe/examples/pke/boolean-pke.cpp b/src/binfhe/examples/pke/boolean-pke.cpp index 7aab39ef4..427775eb2 100644 --- a/src/binfhe/examples/pke/boolean-pke.cpp +++ b/src/binfhe/examples/pke/boolean-pke.cpp @@ -46,7 +46,7 @@ int main() { // and HE standard. Other common options are TOY, MEDIUM, STD192, and STD256. // MEDIUM corresponds to the level of more than 100 bits for both quantum and // classical computer attacks. - cc.GenerateBinFHEContext(STD128Q_OPT);//STD128); + cc.GenerateBinFHEContext(STD128); // Sample Program: Step 2: Key Generation @@ -67,10 +67,10 @@ int main() { // If you wish to get a fresh encryption without bootstrapping, write // auto ct1 = cc.Encrypt(sk, 1, FRESH); auto ct1N = cc.EncryptN(keyTriple->publicKey, 1); - auto ct1 = cc.Encryptn(keyTriple->keySwitchingKey, ct1N); - + auto ct1 = cc.Encryptn(keyTriple->keySwitchingKey, ct1N); + auto ct2N = cc.EncryptN(keyTriple->publicKey, 1); - auto ct2 = cc.Encryptn(keyTriple->keySwitchingKey, ct2N); + auto ct2 = cc.Encryptn(keyTriple->keySwitchingKey, ct2N); LWEPlaintext result; @@ -79,7 +79,6 @@ int main() { std::cout << "Result of encrypted ciphertext of 1 = " << result << std::endl; - // Sample Program: Step 4: Evaluation // Compute (1 AND 1) = 1; Other binary gate options are OR, NAND, and NOR diff --git a/src/binfhe/examples/pke/boolean-serial-binary-pke.cpp b/src/binfhe/examples/pke/boolean-serial-binary-pke.cpp index 138cba2b5..5ed2fe4c3 100644 --- a/src/binfhe/examples/pke/boolean-serial-binary-pke.cpp +++ b/src/binfhe/examples/pke/boolean-serial-binary-pke.cpp @@ -50,11 +50,18 @@ int main() { std::cout << "Generating keys." << std::endl; // Generating the secret key - auto kt1 = cc1.KeyGenTriple(); - auto sk1 = kt1->secretKey; - auto pk1 = kt1->publicKey; + auto kt1 = cc1.KeyGenTriple(); + auto sk1 = kt1->secretKey; + auto pk1 = kt1->publicKey; auto ksk1 = kt1->keySwitchingKey; - + + auto params = cc1.GetParams()->GetLWEParams(); + + std::cout << "Q: " << params->GetQ() << std::endl; + std::cout << "N: " << params->GetN() << std::endl; + std::cout << "q: " << params->Getq() << std::endl; + std::cout << "n: " << params->Getn() << std::endl; + // Generate the bootstrapping keys cc1.BTKeyGen(sk1); @@ -62,7 +69,7 @@ int main() { // Encryption for a ciphertext that will be serialized auto ct1N = cc1.EncryptN(pk1, 1); - auto ct1 = cc1.Encryptn(ksk1, ct1N); + auto ct1 = cc1.Encryptn(ksk1, ct1N); // CODE FOR SERIALIZATION @@ -88,7 +95,7 @@ int main() { } std::cout << "The key switching key has been serialized." << std::endl; - // Serializing secret key + // Serializing secret key if (!Serial::SerializeToFile(DATAFOLDER + "/sk1.txt", sk1, SerType::BINARY)) { std::cerr << "Error serializing sk1" << std::endl; @@ -96,7 +103,7 @@ int main() { } std::cout << "The secret key sk1 key been serialized." << std::endl; - // Serializing public key switching key + // Serializing public key switching key if (!Serial::SerializeToFile(DATAFOLDER + "/ksk1.txt", ksk1, SerType::BINARY)) { std::cerr << "Error serializing ksk1" << std::endl; @@ -104,7 +111,7 @@ int main() { } std::cout << "The public key switching key ksk1 key been serialized." << std::endl; - // Serializing public key + // Serializing public key if (!Serial::SerializeToFile(DATAFOLDER + "/pk1.txt", pk1, SerType::BINARY)) { std::cerr << "Error serializing pk1" << std::endl; @@ -185,7 +192,7 @@ int main() { // OPERATIONS WITH DESERIALIZED KEYS AND CIPHERTEXTS auto ct2N = cc.EncryptN(pk, 1); - auto ct2 = cc.Encryptn(ksk, ct2N); + auto ct2 = cc.Encryptn(ksk, ct2N); std::cout << "Running the computation" << std::endl; diff --git a/src/binfhe/lib/binfhecontext.cpp b/src/binfhe/lib/binfhecontext.cpp index 87eae3eb6..255f29222 100644 --- a/src/binfhe/lib/binfhecontext.cpp +++ b/src/binfhe/lib/binfhecontext.cpp @@ -165,11 +165,11 @@ void BinFHEContext::GenerateBinFHEContext(BINFHE_PARAMSET set, BINFHE_METHOD met NativeInteger Q( PreviousPrime(FirstPrime(params.numberBits, params.cyclOrder), params.cyclOrder)); - usint ringDim = params.cyclOrder / 2; - auto lweparams = (PRIME == params.modKS) ? - std::make_shared(params.latticeParam, ringDim, params.mod, Q, Q, + usint ringDim = params.cyclOrder / 2; + auto lweparams = (PRIME == params.modKS) ? + std::make_shared(params.latticeParam, ringDim, params.mod, Q, Q, params.stdDev, params.baseKS) : - std::make_shared(params.latticeParam, ringDim, params.mod, Q, params.modKS, + std::make_shared(params.latticeParam, ringDim, params.mod, Q, params.modKS, params.stdDev, params.baseKS); auto rgswparams = std::make_shared(ringDim, Q, params.mod, params.gadgetBase, params.baseRK, method, params.stdDev); @@ -208,8 +208,8 @@ LWECiphertext BinFHEContext::Encrypt(ConstLWEPrivateKey sk, const LWEPlaintext& return ct; } -LWECiphertext BinFHEContext::EncryptN(ConstLWEPublicKey pk, const LWEPlaintext& m, - LWEPlaintextModulus p, NativeInteger mod) const { +LWECiphertext BinFHEContext::EncryptN(ConstLWEPublicKey pk, const LWEPlaintext& m, LWEPlaintextModulus p, + NativeInteger mod) const { auto& LWEParams = m_params->GetLWEParams(); auto Q = LWEParams->GetQ(); if (mod == 0) @@ -222,15 +222,19 @@ LWECiphertext BinFHEContext::EncryptN(ConstLWEPublicKey pk, const LWEPlaintext& LWECiphertext BinFHEContext::Encryptn(ConstLWESwitchingKey ksk, ConstLWECiphertext ct, BINFHE_OUTPUT output) const { auto& LWEParams = m_params->GetLWEParams(); - //auto Q = LWEParams->GetQ(); - //if (mod == 0) - // mod = Q; + auto Q = LWEParams->GetQ(); + auto N = LWEParams->GetN(); + + if ((ct->GetLength() != N) && (ct->GetModulus() != Q)) { + std::string errMsg("ERROR: Ciphertext dimension and modulus are not large N and Q"); + OPENFHE_THROW(config_error, errMsg); + } LWECiphertext ct1 = m_LWEscheme->Encryptn(LWEParams, ksk, ct); - //if ((output != FRESH) && (p == 4)) { + // if ((output != FRESH) && (p == 4)) { // ct = m_binfhescheme->Bootstrap(m_params, m_BTKey, ct); - //} + // } return ct1; } diff --git a/src/binfhe/unittest/UnitTestFHEWPKE.cpp b/src/binfhe/unittest/UnitTestFHEWPKE.cpp deleted file mode 100644 index c2e8d7751..000000000 --- a/src/binfhe/unittest/UnitTestFHEWPKE.cpp +++ /dev/null @@ -1,889 +0,0 @@ -//================================================================================== -// BSD 2-Clause License -// -// Copyright (c) 2014-2022, NJIT, Duality Technologies Inc. and other contributors -// -// All rights reserved. -// -// Author TPOC: contact@openfhe.org -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -//================================================================================== - -/* - This code runs unit tests for the FHEW methods of the OpenFHE lattice encryption library - */ - -#include "binfhecontext.h" -#include "gtest/gtest.h" - -using namespace lbcrypto; - -// --------------- TESTING METHODS OF FHEW --------------- - -// Checks the key switching operation -TEST(UnitTestFHEWAP, KeySwitch) { - auto cc = BinFHEContext(); - - cc.GenerateBinFHEContext(TOY, AP); - - NativeInteger Q = cc.GetParams()->GetLWEParams()->GetQ(); - - auto sk = cc.KeyGen(); - auto skN = cc.KeyGenN(); - - auto ctQN1 = cc.Encrypt(skN, 1, FRESH, 4, Q); - auto ctQN0 = cc.Encrypt(skN, 0, FRESH, 4, Q); - - NativeVector newSK = sk->GetElement(); - newSK.SwitchModulus(Q); - auto skQ = std::make_shared(newSK); - - auto keySwitchHint = cc.KeySwitchGen(sk, skN); - - LWECiphertext eQ1 = cc.GetLWEScheme()->KeySwitch(cc.GetParams()->GetLWEParams(), keySwitchHint, ctQN1); - LWECiphertext eQ0 = cc.GetLWEScheme()->KeySwitch(cc.GetParams()->GetLWEParams(), keySwitchHint, ctQN0); - - LWEPlaintext resultAfterKeySwitch1; - cc.Decrypt(skQ, eQ1, &resultAfterKeySwitch1); - - LWEPlaintext resultAfterKeySwitch0; - cc.Decrypt(skQ, eQ0, &resultAfterKeySwitch0); - - EXPECT_EQ(1, resultAfterKeySwitch1) << "Failed key switching test"; - - EXPECT_EQ(0, resultAfterKeySwitch0) << "Failed key switching test"; -} - -// Checks the key switching operation -TEST(UnitTestFHEWGINX, KeySwitch) { - auto cc = BinFHEContext(); - - cc.GenerateBinFHEContext(TOY, GINX); - - NativeInteger Q = cc.GetParams()->GetLWEParams()->GetQ(); - - auto sk = cc.KeyGen(); - auto skN = cc.KeyGenN(); - - auto ctQN1 = cc.Encrypt(skN, 1, FRESH, 4, Q); - auto ctQN0 = cc.Encrypt(skN, 0, FRESH, 4, Q); - - NativeVector newSK = sk->GetElement(); - newSK.SwitchModulus(Q); - auto skQ = std::make_shared(newSK); - - auto keySwitchHint = cc.KeySwitchGen(sk, skN); - - LWECiphertext eQ1 = cc.GetLWEScheme()->KeySwitch(cc.GetParams()->GetLWEParams(), keySwitchHint, ctQN1); - LWECiphertext eQ0 = cc.GetLWEScheme()->KeySwitch(cc.GetParams()->GetLWEParams(), keySwitchHint, ctQN0); - - LWEPlaintext resultAfterKeySwitch1; - cc.Decrypt(skQ, eQ1, &resultAfterKeySwitch1); - - LWEPlaintext resultAfterKeySwitch0; - cc.Decrypt(skQ, eQ0, &resultAfterKeySwitch0); - - EXPECT_EQ(1, resultAfterKeySwitch1) << "Failed key switching test"; - - EXPECT_EQ(0, resultAfterKeySwitch0) << "Failed key switching test"; -} - -// Checks the mod switching operation -TEST(UnitTestFHEWAP, ModSwitch) { - auto cc = BinFHEContext(); - - cc.GenerateBinFHEContext(TOY, AP); - - NativeInteger Q = cc.GetParams()->GetLWEParams()->GetQ(); - - auto sk = cc.KeyGen(); - - // switch secret key to Q - NativeVector newSK = sk->GetElement(); - newSK.SwitchModulus(Q); - auto skQ = std::make_shared(newSK); - - auto ctQ1 = cc.Encrypt(skQ, 1, FRESH, 4, Q); - auto ctQ0 = cc.Encrypt(skQ, 0, FRESH, 4, Q); - - // switches the modulus from Q to q - auto ct1 = cc.GetLWEScheme()->ModSwitch(cc.GetParams()->GetLWEParams()->Getq(), ctQ1); - auto ct0 = cc.GetLWEScheme()->ModSwitch(cc.GetParams()->GetLWEParams()->Getq(), ctQ0); - - LWEPlaintext resultAfterModSwitch1; - cc.Decrypt(sk, ct1, &resultAfterModSwitch1); - - LWEPlaintext resultAfterModSwitch0; - cc.Decrypt(sk, ct0, &resultAfterModSwitch0); - - EXPECT_EQ(1, resultAfterModSwitch1) << "Failed mod switching test"; - - EXPECT_EQ(0, resultAfterModSwitch0) << "Failed mod switching test"; -} - -// Checks the mod switching operation -TEST(UnitTestFHEWGINX, ModSwitch) { - auto cc = BinFHEContext(); - - cc.GenerateBinFHEContext(TOY, GINX); - - NativeInteger Q = cc.GetParams()->GetLWEParams()->GetQ(); - - auto sk = cc.KeyGen(); - - // switch secret key to Q - NativeVector newSK = sk->GetElement(); - newSK.SwitchModulus(Q); - auto skQ = std::make_shared(newSK); - - auto ctQ1 = cc.Encrypt(skQ, 1, FRESH, 4, Q); - auto ctQ0 = cc.Encrypt(skQ, 0, FRESH, 4, Q); - - // switches the modulus from Q to q - auto ct1 = cc.GetLWEScheme()->ModSwitch(cc.GetParams()->GetLWEParams()->Getq(), ctQ1); - auto ct0 = cc.GetLWEScheme()->ModSwitch(cc.GetParams()->GetLWEParams()->Getq(), ctQ0); - - LWEPlaintext resultAfterModSwitch1; - cc.Decrypt(sk, ct1, &resultAfterModSwitch1); - - LWEPlaintext resultAfterModSwitch0; - cc.Decrypt(sk, ct0, &resultAfterModSwitch0); - - EXPECT_EQ(1, resultAfterModSwitch1) << "Failed mod switching test"; - - EXPECT_EQ(0, resultAfterModSwitch0) << "Failed mod switching test"; -} - -// Checks the truth table for NOT -TEST(UnitTestFHEWAP, NOT) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, AP); - - auto sk = cc.KeyGen(); - - auto ct1 = cc.Encrypt(sk, 1, FRESH); - auto ct0 = cc.Encrypt(sk, 0, FRESH); - - auto ct1Not = cc.EvalNOT(ct1); - auto ct0Not = cc.EvalNOT(ct0); - - LWEPlaintext result1; - cc.Decrypt(sk, ct1Not, &result1); - - LWEPlaintext result0; - cc.Decrypt(sk, ct0Not, &result0); - - EXPECT_EQ(0, result1) << "NOT failed"; - - EXPECT_EQ(1, result0) << "NOT failed"; -} - -// Checks the truth table for NOT -TEST(UnitTestFHEWGINX, NOT) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, GINX); - - auto sk = cc.KeyGen(); - - auto ct1 = cc.Encrypt(sk, 1, FRESH); - auto ct0 = cc.Encrypt(sk, 0, FRESH); - - auto ct1Not = cc.EvalNOT(ct1); - auto ct0Not = cc.EvalNOT(ct0); - - LWEPlaintext result1; - cc.Decrypt(sk, ct1Not, &result1); - - LWEPlaintext result0; - cc.Decrypt(sk, ct0Not, &result0); - - EXPECT_EQ(0, result1) << "NOT failed"; - - EXPECT_EQ(1, result0) << "NOT failed"; -} - -// Checks the truth table for AND -TEST(UnitTestFHEWAP, Bootstrap) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, AP); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - - auto ct11 = cc.Bootstrap(ct1); - auto ct01 = cc.Bootstrap(ct0); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - - std::string failed = "Bootstrapping failed"; - - EXPECT_EQ(1, result11) << failed; - EXPECT_EQ(0, result01) << failed; -} - -// Checks the truth table for AND -TEST(UnitTestFHEWGINX, Bootstrap) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, GINX); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - - auto ct11 = cc.Bootstrap(ct1); - auto ct01 = cc.Bootstrap(ct0); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - - std::string failed = "Bootstrapping failed"; - - EXPECT_EQ(1, result11) << failed; - EXPECT_EQ(0, result01) << failed; -} - -// Checks the truth table for AND -TEST(UnitTestFHEWAP, AND) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, AP); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(AND, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(AND, ct0, ct1); - auto ct10 = cc.EvalBinGate(AND, ct1, ct0); - auto ct00 = cc.EvalBinGate(AND, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "AND failed"; - - EXPECT_EQ(1, result11) << failed; - EXPECT_EQ(0, result01) << failed; - EXPECT_EQ(0, result10) << failed; - EXPECT_EQ(0, result00) << failed; -} - -// Checks the truth table for AND -TEST(UnitTestFHEWGINX, AND) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, GINX); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(AND, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(AND, ct0, ct1); - auto ct10 = cc.EvalBinGate(AND, ct1, ct0); - auto ct00 = cc.EvalBinGate(AND, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "AND failed"; - - EXPECT_EQ(1, result11) << failed; - EXPECT_EQ(0, result01) << failed; - EXPECT_EQ(0, result10) << failed; - EXPECT_EQ(0, result00) << failed; -} - -// Checks GINX for the parameter set -// that exercises the signed modular reduction -// implementation in SignedDigitDecompose -TEST(UnitTestFHEWGINX, SIGNED_MOD) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(SIGNED_MOD_TEST, GINX); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(AND, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(AND, ct0, ct1); - auto ct10 = cc.EvalBinGate(AND, ct1, ct0); - auto ct00 = cc.EvalBinGate(AND, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "AND failed for SIGNED_MOD_TEST"; - - EXPECT_EQ(1, result11) << failed; - EXPECT_EQ(0, result01) << failed; - EXPECT_EQ(0, result10) << failed; - EXPECT_EQ(0, result00) << failed; -} - -// Checks the truth table for OR -TEST(UnitTestFHEWAP, OR) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, AP); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(OR, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(OR, ct0, ct1); - auto ct10 = cc.EvalBinGate(OR, ct1, ct0); - auto ct00 = cc.EvalBinGate(OR, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "OR failed"; - - EXPECT_EQ(1, result11) << failed; - EXPECT_EQ(1, result01) << failed; - EXPECT_EQ(1, result10) << failed; - EXPECT_EQ(0, result00) << failed; -} - -// Checks the truth table for OR -TEST(UnitTestFHEWGINX, OR) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, GINX); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(OR, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(OR, ct0, ct1); - auto ct10 = cc.EvalBinGate(OR, ct1, ct0); - auto ct00 = cc.EvalBinGate(OR, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "OR failed"; - - EXPECT_EQ(1, result11) << failed; - EXPECT_EQ(1, result01) << failed; - EXPECT_EQ(1, result10) << failed; - EXPECT_EQ(0, result00) << failed; -} - -// Checks the truth table for AND -TEST(UnitTestFHEWAP, NAND) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, AP); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(NAND, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(NAND, ct0, ct1); - auto ct10 = cc.EvalBinGate(NAND, ct1, ct0); - auto ct00 = cc.EvalBinGate(NAND, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "NAND failed"; - - EXPECT_EQ(0, result11) << failed; - EXPECT_EQ(1, result01) << failed; - EXPECT_EQ(1, result10) << failed; - EXPECT_EQ(1, result00) << failed; -} - -// Checks the truth table for AND -TEST(UnitTestFHEWGINX, NAND) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, GINX); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(NAND, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(NAND, ct0, ct1); - auto ct10 = cc.EvalBinGate(NAND, ct1, ct0); - auto ct00 = cc.EvalBinGate(NAND, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "NAND failed"; - - EXPECT_EQ(0, result11) << failed; - EXPECT_EQ(1, result01) << failed; - EXPECT_EQ(1, result10) << failed; - EXPECT_EQ(1, result00) << failed; -} - -// Checks the truth table for AND -TEST(UnitTestFHEWAP, NOR) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, AP); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(NOR, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(NOR, ct0, ct1); - auto ct10 = cc.EvalBinGate(NOR, ct1, ct0); - auto ct00 = cc.EvalBinGate(NOR, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "NOR failed"; - - EXPECT_EQ(0, result11) << failed; - EXPECT_EQ(0, result01) << failed; - EXPECT_EQ(0, result10) << failed; - EXPECT_EQ(1, result00) << failed; -} - -// Checks the truth table for AND -TEST(UnitTestFHEWGINX, NOR) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, GINX); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(NOR, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(NOR, ct0, ct1); - auto ct10 = cc.EvalBinGate(NOR, ct1, ct0); - auto ct00 = cc.EvalBinGate(NOR, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "NOR failed"; - - EXPECT_EQ(0, result11) << failed; - EXPECT_EQ(0, result01) << failed; - EXPECT_EQ(0, result10) << failed; - EXPECT_EQ(1, result00) << failed; -} - -// Checks the truth table for XOR -TEST(UnitTestFHEWAP, XOR) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, AP); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(XOR, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(XOR, ct0, ct1); - auto ct10 = cc.EvalBinGate(XOR, ct1, ct0); - auto ct00 = cc.EvalBinGate(XOR, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "XOR failed"; - - EXPECT_EQ(0, result11) << failed; - EXPECT_EQ(1, result01) << failed; - EXPECT_EQ(1, result10) << failed; - EXPECT_EQ(0, result00) << failed; -} - -// Checks the truth table for XOR -TEST(UnitTestFHEWGINX, XOR) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, GINX); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(XOR, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(XOR, ct0, ct1); - auto ct10 = cc.EvalBinGate(XOR, ct1, ct0); - auto ct00 = cc.EvalBinGate(XOR, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "XOR failed"; - - EXPECT_EQ(0, result11) << failed; - EXPECT_EQ(1, result01) << failed; - EXPECT_EQ(1, result10) << failed; - EXPECT_EQ(0, result00) << failed; -} - -// Checks the truth table for XOR -TEST(UnitTestFHEWAP, XNOR) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, AP); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(XNOR, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(XNOR, ct0, ct1); - auto ct10 = cc.EvalBinGate(XNOR, ct1, ct0); - auto ct00 = cc.EvalBinGate(XNOR, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "XNOR failed"; - - EXPECT_EQ(1, result11) << failed; - EXPECT_EQ(0, result01) << failed; - EXPECT_EQ(0, result10) << failed; - EXPECT_EQ(1, result00) << failed; -} - -// Checks the truth table for XOR -TEST(UnitTestFHEWGINX, XNOR) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, GINX); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(XNOR, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(XNOR, ct0, ct1); - auto ct10 = cc.EvalBinGate(XNOR, ct1, ct0); - auto ct00 = cc.EvalBinGate(XNOR, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "XNOR failed"; - - EXPECT_EQ(1, result11) << failed; - EXPECT_EQ(0, result01) << failed; - EXPECT_EQ(0, result10) << failed; - EXPECT_EQ(1, result00) << failed; -} - -// Checks the truth table for XOR -TEST(UnitTestFHEWAP, XOR_FAST) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, AP); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(XOR_FAST, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(XOR_FAST, ct0, ct1); - auto ct10 = cc.EvalBinGate(XOR_FAST, ct1, ct0); - auto ct00 = cc.EvalBinGate(XOR_FAST, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "XOR_FAST failed"; - - EXPECT_EQ(0, result11) << failed; - EXPECT_EQ(1, result01) << failed; - EXPECT_EQ(1, result10) << failed; - EXPECT_EQ(0, result00) << failed; -} - -// Checks the truth table for XOR -TEST(UnitTestFHEWGINX, XOR_FAST) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, GINX); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(XOR_FAST, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(XOR_FAST, ct0, ct1); - auto ct10 = cc.EvalBinGate(XOR_FAST, ct1, ct0); - auto ct00 = cc.EvalBinGate(XOR_FAST, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "XOR_FAST failed"; - - EXPECT_EQ(0, result11) << failed; - EXPECT_EQ(1, result01) << failed; - EXPECT_EQ(1, result10) << failed; - EXPECT_EQ(0, result00) << failed; -} - -// Checks the truth table for XOR -TEST(UnitTestFHEWAP, XNOR_FAST) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, AP); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(XNOR_FAST, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(XNOR_FAST, ct0, ct1); - auto ct10 = cc.EvalBinGate(XNOR_FAST, ct1, ct0); - auto ct00 = cc.EvalBinGate(XNOR_FAST, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "XNOR_FAST failed"; - - EXPECT_EQ(1, result11) << failed; - EXPECT_EQ(0, result01) << failed; - EXPECT_EQ(0, result10) << failed; - EXPECT_EQ(1, result00) << failed; -} - -// Checks the truth table for XOR -TEST(UnitTestFHEWGINX, XNOR_FAST) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(TOY, GINX); - - auto sk = cc.KeyGen(); - - cc.BTKeyGen(sk); - - auto ct1 = cc.Encrypt(sk, 1); - auto ct0 = cc.Encrypt(sk, 0); - auto ct1Alt = cc.Encrypt(sk, 1); - auto ct0Alt = cc.Encrypt(sk, 0); - - auto ct11 = cc.EvalBinGate(XNOR_FAST, ct1, ct1Alt); - auto ct01 = cc.EvalBinGate(XNOR_FAST, ct0, ct1); - auto ct10 = cc.EvalBinGate(XNOR_FAST, ct1, ct0); - auto ct00 = cc.EvalBinGate(XNOR_FAST, ct0, ct0Alt); - - LWEPlaintext result11; - cc.Decrypt(sk, ct11, &result11); - LWEPlaintext result01; - cc.Decrypt(sk, ct01, &result01); - LWEPlaintext result10; - cc.Decrypt(sk, ct10, &result10); - LWEPlaintext result00; - cc.Decrypt(sk, ct00, &result00); - - std::string failed = "XNOR_FAST failed"; - - EXPECT_EQ(1, result11) << failed; - EXPECT_EQ(0, result01) << failed; - EXPECT_EQ(0, result10) << failed; - EXPECT_EQ(1, result00) << failed; -} diff --git a/src/binfhe/unittest/UnitTestFHEWPKEDeep.cpp b/src/binfhe/unittest/UnitTestFHEWPKEDeep.cpp deleted file mode 100644 index eac5c85b7..000000000 --- a/src/binfhe/unittest/UnitTestFHEWPKEDeep.cpp +++ /dev/null @@ -1,316 +0,0 @@ -//================================================================================== -// BSD 2-Clause License -// -// Copyright (c) 2014-2022, NJIT, Duality Technologies Inc. and other contributors -// -// All rights reserved. -// -// Author TPOC: contact@openfhe.org -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -//================================================================================== - -/* - This code runs unit tests for the FHEW methods of the OpenFHE lattice encryption library - */ - -#include "binfhecontext.h" -#include "gtest/gtest.h" - -using namespace lbcrypto; - -// test very deep FHE operations -TEST(UnitTestFHEDeep, NOT_VERY_LONG) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(STD128); - - auto sk = cc.KeyGen(); - // Generate the bootstrapping keys (refresh and switching keys) - cc.BTKeyGen(sk); - - unsigned int input(1); - - unsigned int nLoop(2000); - - LWECiphertext stmp = cc.Encrypt(sk, input); - unsigned int tmp = input; - // not loop - for (unsigned int ix = 0; ix < nLoop; ix++) { - // if (ix % 100 == 0) std::cout << ix << std::endl; - LWECiphertext a(stmp); - auto b = cc.EvalNOT(a); - unsigned int c = !tmp; - LWEPlaintext res; - cc.Decrypt(sk, b, &res); - std::string failed = "Failed in iteration " + std::to_string(ix); - ASSERT_EQ(res, c) << failed; - stmp = b; - tmp = c; - } -} - -// test very deep FHE operations -TEST(UnitTestFHEDeep, AND_GINX_VERY_LONG) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(STD128, GINX); - - auto sk = cc.KeyGen(); - // Generate the bootstrapping keys (refresh and switching keys) - cc.BTKeyGen(sk); - - unsigned int input1(1); - unsigned int input2(1); - // unsigned int one(1); - - unsigned int nLoop(2000); - - LWECiphertext stmp1 = cc.Encrypt(sk, input1); - LWECiphertext stmp2 = cc.Encrypt(sk, input2); - auto d = cc.EvalBinGate(AND, stmp1, stmp2); - stmp1 = cc.Encrypt(sk, input1); - stmp2 = cc.Encrypt(sk, input2); - unsigned int tmp1 = input1; - unsigned int tmp2 = input2; - - // and loop - for (unsigned int ix = 0; ix < nLoop; ix++) { - // if (ix % 100 == 0) std::cout << ix << std::endl; - auto b = cc.EvalBinGate(AND, stmp1, stmp2); - - unsigned int c = tmp1 && tmp2; - LWEPlaintext res; - cc.Decrypt(sk, b, &res); - std::string failed = "Failed in iteration " + std::to_string(ix); - ASSERT_EQ(res, c) << failed; - - // we'd like to use the output to drive both inputs on the next - // cycle, but we can't, so lets generate a new input by anding with - // a constant one. - - stmp1 = b; - stmp2 = cc.EvalBinGate(AND, b, d); - tmp1 = c; - tmp2 = c; - } -} - -// test very deep FHE operations -TEST(UnitTestFHEDeep, AND_AP_VERY_LONG) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(STD128, AP); - - auto sk = cc.KeyGen(); - // Generate the bootstrapping keys (refresh and switching keys) - cc.BTKeyGen(sk); - - unsigned int input1(1); - unsigned int input2(1); - // unsigned int one(1); - - unsigned int nLoop(2000); - - LWECiphertext stmp1 = cc.Encrypt(sk, input1); - LWECiphertext stmp2 = cc.Encrypt(sk, input2); - auto d = cc.EvalBinGate(AND, stmp1, stmp2); - stmp1 = cc.Encrypt(sk, input1); - stmp2 = cc.Encrypt(sk, input2); - // LWECiphertext eone = cc.Encrypt(sk, one); - unsigned int tmp1 = input1; - unsigned int tmp2 = input2; - - // not loop - for (unsigned int ix = 0; ix < nLoop; ix++) { - // if (ix % 100 == 0) std::cout << ix << std::endl; - auto b = cc.EvalBinGate(AND, stmp1, stmp2); - - unsigned int c = tmp1 && tmp2; - LWEPlaintext res; - cc.Decrypt(sk, b, &res); - std::string failed = "Failed in iteration " + std::to_string(ix); - ASSERT_EQ(res, c) << failed; - - // we'd like to use the output to drive both inputs on the next - // cycle, but we can't, so lets generate a new input by anding with - // a constant one. - - stmp1 = b; - stmp2 = cc.EvalBinGate(AND, b, d); - - tmp1 = c; - tmp2 = c; - } -} - -// test very deep FHE operations -TEST(UnitTestFHEDeep, XOR_AP_VERY_LONG) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(STD128, AP); - - auto sk = cc.KeyGen(); - // Generate the bootstrapping keys (refresh and switching keys) - cc.BTKeyGen(sk); - - unsigned int input1(1); - unsigned int input2(1); - unsigned int one(1); - - unsigned int nLoop(2000); - - LWECiphertext stmp1 = cc.Encrypt(sk, input1); - LWECiphertext stmp2 = cc.Encrypt(sk, input2); - LWECiphertext eone = cc.Encrypt(sk, one); - unsigned int tmp1 = input1; - unsigned int tmp2 = input2; - - // xor loop - for (unsigned int ix = 0; ix < nLoop; ix++) { - // if (ix % 100 == 0) std::cout << ix << std::endl; - auto b = cc.EvalBinGate(XOR, stmp1, stmp2); - - unsigned int c = tmp1 ^ tmp2; - LWEPlaintext res; - cc.Decrypt(sk, b, &res); - std::string failed = "Failed in iteration " + std::to_string(ix); - ASSERT_EQ(res, c) << failed; - - // we'd like to use the output to drive both inputs on the next - // cycle, but we can't, so lets generate a new input by anding with - // a constant one. - - stmp1 = b; - stmp2 = cc.EvalBinGate(AND, b, eone); - - tmp1 = c; - tmp2 = c; - } -} -// test very deep FHE operations -TEST(UnitTestFHEDeep, XOR_GINX_VERY_LONG) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(STD128, GINX); - - auto sk = cc.KeyGen(); - // Generate the bootstrapping keys (refresh and switching keys) - cc.BTKeyGen(sk); - - unsigned int input1(1); - unsigned int input2(1); - unsigned int one(1); - - unsigned int nLoop(2000); - - LWECiphertext stmp1 = cc.Encrypt(sk, input1); - LWECiphertext stmp2 = cc.Encrypt(sk, input2); - LWECiphertext eone = cc.Encrypt(sk, one); - unsigned int tmp1 = input1; - unsigned int tmp2 = input2; - - // xor loop - for (unsigned int ix = 0; ix < nLoop; ix++) { - // if (ix % 100 == 0) std::cout << ix << std::endl; - auto b = cc.EvalBinGate(XOR, stmp1, stmp2); - - unsigned int c = tmp1 ^ tmp2; - LWEPlaintext res; - cc.Decrypt(sk, b, &res); - std::string failed = "Failed in iteration " + std::to_string(ix); - ASSERT_EQ(res, c) << failed; - - // we'd like to use the output to drive both inputs on the next - // cycle, but we can't, so lets generate a new input by anding with - // a constant one. - - stmp1 = b; - stmp2 = cc.EvalBinGate(AND, b, eone); - - tmp1 = c; - tmp2 = c; - } -} - -// test very deep FHE operations -TEST(UnitTestFHEDeep, OR_AP_VERY_LONG) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(STD128, AP); - - auto sk = cc.KeyGen(); - // Generate the bootstrapping keys (refresh and switching keys) - cc.BTKeyGen(sk); - - unsigned int input1(1); - unsigned int input2(1); - - unsigned int nLoop(2000); - - LWECiphertext stmp1 = cc.Encrypt(sk, input1); - LWECiphertext stmp2 = cc.Encrypt(sk, input2); - unsigned int tmp1 = input1; - unsigned int tmp2 = input2; - - // or loop - for (unsigned int ix = 0; ix < nLoop; ix++) { - // if (ix % 100 == 0) std::cout << ix << std::endl; - auto b = cc.EvalBinGate(OR, stmp1, stmp2); - - unsigned int c = tmp1 || tmp2; - LWEPlaintext res; - cc.Decrypt(sk, b, &res); - std::string failed = "Failed in iteration " + std::to_string(ix); - ASSERT_EQ(res, c) << failed; - stmp1 = b; - tmp1 = c; - } -} - -// test very deep FHE operations -TEST(UnitTestFHEDeep, OR_GINX_VERY_LONG) { - auto cc = BinFHEContext(); - cc.GenerateBinFHEContext(STD128, GINX); - - auto sk = cc.KeyGen(); - // Generate the bootstrapping keys (refresh and switching keys) - cc.BTKeyGen(sk); - - unsigned int input1(1); - unsigned int input2(1); - - unsigned int nLoop(2000); - - LWECiphertext stmp1 = cc.Encrypt(sk, input1); - LWECiphertext stmp2 = cc.Encrypt(sk, input2); - unsigned int tmp1 = input1; - unsigned int tmp2 = input2; - - // or loop - for (unsigned int ix = 0; ix < nLoop; ix++) { - // if (ix % 100 == 0) std::cout << ix << std::endl; - auto b = cc.EvalBinGate(OR, stmp1, stmp2); - - unsigned int c = tmp1 || tmp2; - LWEPlaintext res; - cc.Decrypt(sk, b, &res); - std::string failed = "Failed in iteration " + std::to_string(ix); - ASSERT_EQ(res, c) << failed; - stmp1 = b; - tmp1 = c; - } -} diff --git a/src/binfhe/unittest/UnitTestFHEWPKESerial.cpp b/src/binfhe/unittest/UnitTestFHEWPKESerial.cpp deleted file mode 100644 index f69710072..000000000 --- a/src/binfhe/unittest/UnitTestFHEWPKESerial.cpp +++ /dev/null @@ -1,139 +0,0 @@ -//================================================================================== -// BSD 2-Clause License -// -// Copyright (c) 2014-2022, NJIT, Duality Technologies Inc. and other contributors -// -// All rights reserved. -// -// Author TPOC: contact@openfhe.org -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -//================================================================================== - -/* - This code runs unit tests for the FHEW methods of the OpenFHE lattice encryption library - */ - -#include "gtest/gtest.h" - -// these header files are needed for serialization -#include "binfhecontext-ser.h" - -using namespace lbcrypto; - -template -void UnitTestFHEWSerial(const ST& sertype, BINFHE_PARAMSET secLevel, BINFHE_METHOD variant, - BINFHE_OUTPUT ctType, const std::string& errMsg) { - const LWEPlaintext val(1); - auto cc1 = BinFHEContext(); - cc1.GenerateBinFHEContext(secLevel, variant); - - auto sk1 = cc1.KeyGen(); - cc1.BTKeyGen(sk1); - - // Encryption for a ciphertext that will be serialized - auto ct1 = cc1.Encrypt(sk1, val, ctType); - - BinFHEContext cc2; - { - std::stringstream s; - Serial::Serialize(cc1, s, sertype); - Serial::Deserialize(cc2, s, sertype); - - EXPECT_EQ(*cc2.GetParams(), *cc1.GetParams()) << errMsg << " Context mismatch"; - } - - RingGSWACCKey refreshKey; - { - std::stringstream s; - Serial::Serialize(cc1.GetRefreshKey(), s, sertype); - Serial::Deserialize(refreshKey, s, sertype); - - // EXPECT_EQ( *refreshKey, *cc1.GetRefreshKey()) << errMsg << "Bootstrapping key mismatch: refresh key (1)"; - } - - LWESwitchingKey switchKey; - { - std::stringstream s; - Serial::Serialize(cc1.GetSwitchKey(), s, sertype); - Serial::Deserialize(switchKey, s, sertype); - - // EXPECT_EQ( *switchKey, *cc1.GetSwitchKey()) << errMsg << "Bootstrapping key mismatch: switching key (1)"; - } - - // Loading deserialized bootstrapping keys - cc2.BTKeyLoad({refreshKey,switchKey}); - - // Check the keys after adding them to cc2 - EXPECT_EQ( *(cc2.GetRefreshKey()), *(cc1.GetRefreshKey())) << errMsg << "Bootstrapping key mismatch: refresh key"; - EXPECT_EQ( *(cc2.GetSwitchKey()), *(cc1.GetSwitchKey())) << errMsg << "Bootstrapping key mismatch: switching key"; - - LWEPrivateKey sk2; - { - std::stringstream s; - Serial::Serialize(sk1, s, sertype); - Serial::Deserialize(sk2, s, sertype); - - EXPECT_EQ(*sk1, *sk2) << errMsg << " Secret key mismatch"; - } - - LWECiphertext ct2; - { - std::stringstream s; - Serial::Serialize(ct1, s, sertype); - Serial::Deserialize(ct2, s, sertype); - - EXPECT_EQ(*ct1, *ct2) << errMsg << " Ciphertext mismatch"; - } - - auto ctNew = cc2.Encrypt(sk2, val, ctType); - auto ctResult = cc2.EvalBinGate(AND, ct2, ctNew); - LWEPlaintext result; - cc2.Decrypt(sk2, ctResult, &result); - - EXPECT_EQ(val, result) << errMsg << "result = " << result << ", it is expected to be equal 1"; -} - - -// --------------- TESTING SERIALIZATION METHODS OF FHEW --------------- -// JSON tests were turned off as they take a very long time and require a lot of memory. -// They are left in this file for debugging purposes only. -// TEST(UnitTestFHEWSerialAP, JSON) { -// std::string msg = "UnitTestFHEWSerialAP.JSON serialization test failed: "; -// UnitTestFHEWSerial(SerType::JSON, TOY, AP, FRESH, msg); -// } - -TEST(UnitTestFHEWSerialAP, BINARY) { - std::string msg = "UnitTestFHEWSerialAP.BINARY serialization test failed: "; - UnitTestFHEWSerial(SerType::BINARY, TOY, AP, FRESH, msg); -} - -// TEST(UnitTestFHEWSerialGINX, JSON) { -// std::string msg = "UnitTestFHEWSerialGINX.JSON serialization test failed: "; -// UnitTestFHEWSerial(SerType::JSON, TOY, GINX, FRESH, msg); -// } - -TEST(UnitTestFHEWSerialGINX, BINARY) { - std::string msg = "UnitTestFHEWSerialGINX.BINARY serialization test failed: "; - UnitTestFHEWSerial(SerType::BINARY, TOY, GINX, FRESH, msg); -} -