You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pirk.apache.org by ea...@apache.org on 2016/07/12 16:21:16 UTC

incubator-pirk git commit: commenting in Paillier tests

Repository: incubator-pirk
Updated Branches:
  refs/heads/master 60e00d25c -> 8c1a1f30f


commenting in Paillier tests


Project: http://git-wip-us.apache.org/repos/asf/incubator-pirk/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-pirk/commit/8c1a1f30
Tree: http://git-wip-us.apache.org/repos/asf/incubator-pirk/tree/8c1a1f30
Diff: http://git-wip-us.apache.org/repos/asf/incubator-pirk/diff/8c1a1f30

Branch: refs/heads/master
Commit: 8c1a1f30f2b78a25584f99c5643a0df67b6928db
Parents: 60e00d2
Author: eawilliams <ea...@apache.org>
Authored: Tue Jul 12 12:21:04 2016 -0400
Committer: eawilliams <ea...@apache.org>
Committed: Tue Jul 12 12:21:04 2016 -0400

----------------------------------------------------------------------
 src/test/java/test/general/PaillierTest.java | 546 +++++++++++-----------
 1 file changed, 273 insertions(+), 273 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-pirk/blob/8c1a1f30/src/test/java/test/general/PaillierTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/test/general/PaillierTest.java b/src/test/java/test/general/PaillierTest.java
index ca81039..6148fbd 100644
--- a/src/test/java/test/general/PaillierTest.java
+++ b/src/test/java/test/general/PaillierTest.java
@@ -16,276 +16,276 @@
  * specific language governing permissions and limitations
  * under the License.
  *******************************************************************************/
-//package test.general;
-//
-//import static org.junit.Assert.assertEquals;
-//import static org.junit.Assert.fail;
-//
-//import java.math.BigInteger;
-//import java.util.Random;
-//
-//import org.apache.log4j.Logger;
-//import org.junit.Test;
-//
-//import utils.LogUtils;
-//import utils.PIRException;
-//import utils.SystemConfiguration;
-//import encryption.Paillier;
-//
-///**
-// * Basic test functionality for Paillier library
-// * 
-// */
-//public class PaillierTest
-//{
-//  private static Logger logger = LogUtils.getLoggerForThisClass();
-//
-//  BigInteger p = null; // large prime
-//  BigInteger q = null; // large prime
-//  BigInteger N = null; // N=pq, RSA modulus
-//  BigInteger NSquared = null; // N^2
-//  BigInteger lambdaN = null; // lambda(N) = lcm(p-1,q-1)
-//
-//  int bitLength = 0; // bit length of the modulus N
-//  int certainty = 64; // prob that new BigInteger values represents primes will exceed (1 - (1/2)^certainty)
-//
-//  BigInteger r1 = null; // random number in (Z/NZ)*
-//  BigInteger r2 = null; // random number in (Z/NZ)*
-//
-//  BigInteger m1 = null; // message to encrypt
-//  BigInteger m2 = null; // message to encrypt
-//
-//  public PaillierTest()
-//  {
-//    p = BigInteger.valueOf(7);
-//    q = BigInteger.valueOf(17);
-//    N = p.multiply(q);
-//    NSquared = N.multiply(N);
-//
-//    lambdaN = BigInteger.valueOf(48);
-//
-//    r1 = BigInteger.valueOf(3);
-//    r2 = BigInteger.valueOf(4);
-//
-//    m1 = BigInteger.valueOf(5);
-//    m2 = BigInteger.valueOf(2);
-//
-//    bitLength = 201;// bitLength = 384;
-//    certainty = 128;
-//
-//    logger.info("p = " + p.intValue() + " q = " + q.intValue() + " N = " + N.intValue() + " bitLength = " + N.bitLength() + " lambdaN = " + lambdaN + " m1 = "
-//        + m1.intValue() + " m2 = " + m2.intValue() + " r1 = " + r1.intValue() + " r2 = " + r2.intValue());
-//  }
-//
-//  @Test
-//  @SuppressWarnings("unused")
-//  public void testPIRExceptions()
-//  {
-//    try
-//    {
-//      Paillier paillier = new Paillier(BigInteger.valueOf(2), BigInteger.valueOf(2), 128);
-//      fail("Paillier constructor did not throw PIRException for p,q < 3");
-//    } catch (PIRException e)
-//    {}
-//
-//    try
-//    {
-//      Paillier paillier = new Paillier(BigInteger.valueOf(2), BigInteger.valueOf(3), 128);
-//      fail("Paillier constructor did not throw PIRException for p < 3");
-//    } catch (PIRException e)
-//    {}
-//
-//    try
-//    {
-//      Paillier paillier = new Paillier(BigInteger.valueOf(3), BigInteger.valueOf(2), 128);
-//      fail("Paillier constructor did not throw PIRException for q < 3");
-//    } catch (PIRException e)
-//    {}
-//
-//    try
-//    {
-//      Paillier paillier = new Paillier(BigInteger.valueOf(7), BigInteger.valueOf(7), 128);
-//      fail("Paillier constructor did not throw PIRException for p = q");
-//    } catch (PIRException e)
-//    {}
-//
-//    try
-//    {
-//      Paillier paillier = new Paillier(BigInteger.valueOf(8), BigInteger.valueOf(7), 128);
-//      fail("Paillier constructor did not throw PIRException for p not prime");
-//    } catch (PIRException e)
-//    {}
-//
-//    try
-//    {
-//      Paillier paillier = new Paillier(BigInteger.valueOf(7), BigInteger.valueOf(10), 128);
-//      fail("Paillier constructor did not throw PIRException for q not prime");
-//    } catch (PIRException e)
-//    {}
-//
-//    try
-//    {
-//      int systemPrimeCertainty = Integer.parseInt(SystemConfiguration.getProperty("pir.primeCertainty", "128"));
-//      Paillier paillier = new Paillier(3072, systemPrimeCertainty - 10);
-//      fail("Paillier constructor did not throw PIRException for certainty less than system default of " + systemPrimeCertainty);
-//    } catch (PIRException e)
-//    {}
-//
-//    try
-//    {
-//      Paillier pailler = new Paillier(p, q, bitLength);
-//      BigInteger encM1 = pailler.encrypt(N);
-//      fail("Paillier encryption did not throw PIRException for message m = N");
-//    } catch (PIRException e)
-//    {}
-//
-//    try
-//    {
-//      Paillier pailler = new Paillier(p, q, bitLength);
-//      BigInteger encM1 = pailler.encrypt(N.add(BigInteger.TEN));
-//      fail("Paillier encryption did not throw PIRException for message m > N");
-//    } catch (PIRException e)
-//    {}
-//    
-//    try
-//    {
-//      Paillier pailler = new Paillier(bitLength, 128, bitLength);
-//      fail("Paillier constructor did not throw PIRException for ensureBitSet = bitLength");
-//    } catch (PIRException e)
-//    {}
-//    
-//    try
-//    {
-//      Paillier pailler = new Paillier(bitLength, 128, bitLength + 1);
-//      fail("Paillier constructor did not throw PIRException for ensureBitSet > bitLength");
-//    } catch (PIRException e)
-//    {}
-//  }
-//
-//  @Test
-//  public void testPaillierGivenAllParameters() throws Exception
-//  {
-//    logger.info("Starting testPaillierGivenAllParameters: ");
-//
-//    Paillier pailler = new Paillier(p, q, bitLength);
-//
-//    assertEquals(pailler.getN(), N);
-//    assertEquals(pailler.getLambdaN(), lambdaN);
-//
-//    // Check encryption
-//    BigInteger encM1 = pailler.encrypt(m1, r1);
-//    BigInteger encM2 = pailler.encrypt(m2, r2);
-//    logger.info("encM1 = " + encM1.intValue() + " encM2 = " + encM2.intValue());
-//
-//    assertEquals(encM1, BigInteger.valueOf(14019));
-//    assertEquals(encM2, BigInteger.valueOf(8836));
-//
-//    // Check decryption
-//    BigInteger decM1 = pailler.decrypt(encM1);
-//    BigInteger decM2 = pailler.decrypt(encM2);
-//    logger.info("decM1 = " + decM1.intValue() + " decM2 = " + decM2.intValue());
-//
-//    assertEquals(decM1, m1);
-//    assertEquals(decM2, m2);
-//
-//    // Check homomorphic property: E_r1(m1)*E_r2(m2) mod N^2 = E_r1r2((m1+m2) mod N) mod N^2
-//    BigInteger encM1_times_encM2 = (encM1.multiply(encM2)).mod(NSquared);
-//    BigInteger encM1plusM2 = pailler.encrypt((m1.add(m2)).mod(N), r1.multiply(r2));
-//    logger.info("encM1_times_encM2 = " + encM1_times_encM2.intValue() + " encM1plusM2 = " + encM1plusM2.intValue());
-//
-//    assertEquals(encM1_times_encM2, BigInteger.valueOf(5617));
-//    assertEquals(encM1plusM2, BigInteger.valueOf(5617));
-//
-//    logger.info("Successfully completed testPaillierGivenAllParameters: ");
-//  }
-//
-//  @Test
-//  public void testPaillierWithKeyGeneration() throws Exception
-//  {
-//    logger.info("Starting testPaillierWithKeyGeneration: ");
-//
-//    // Test with and without gmp optimization for modPow
-//    SystemConfiguration.setProperty("pallier.FIPSPrimeGenerationChecks", "true");
-//    SystemConfiguration.setProperty("paillier.useGMPForModPow", "true");
-//    SystemConfiguration.setProperty("paillier.GMPConstantTimeMode", "true");
-//    testPaillerWithKeyGenerationGeneral();
-//
-//    SystemConfiguration.setProperty("pallier.FIPSPrimeGenerationChecks", "false");
-//
-//    SystemConfiguration.setProperty("paillier.useGMPForModPow", "true");
-//    SystemConfiguration.setProperty("paillier.GMPConstantTimeMode", "true");
-//    testPaillerWithKeyGenerationGeneral();
-//
-//    SystemConfiguration.setProperty("paillier.useGMPForModPow", "true");
-//    SystemConfiguration.setProperty("paillier.GMPConstantTimeMode", "false");
-//    testPaillerWithKeyGenerationGeneral();
-//
-//    SystemConfiguration.setProperty("paillier.useGMPForModPow", "false");
-//    SystemConfiguration.setProperty("paillier.GMPConstantTimeMode", "false");
-//    testPaillerWithKeyGenerationGeneral();
-//
-//    // Reset the properties
-//    SystemConfiguration.resetProperties();
-//
-//    logger.info("Ending testPaillierWithKeyGeneration: ");
-//  }
-//
-//  public void testPaillerWithKeyGenerationGeneral() throws Exception
-//  {
-//    // Test without requiring highest bit to be set
-//    logger.info("Starting testPaillierWithKeyGenerationBitSetOption with ensureHighBitSet = false");
-//    testPaillierWithKeyGenerationBitSetOption(-1);
-//
-//    // Test requiring highest bit to be set
-//    logger.info("Starting testPaillierWithKeyGenerationBitSetOption with ensureHighBitSet = true");
-//    testPaillierWithKeyGenerationBitSetOption(5);
-//  }
-//
-//  public void testPaillierWithKeyGenerationBitSetOption(int ensureBitSet) throws Exception
-//  {
-//    Random r = new Random();
-//    int lowBitLength = 3073; // inclusive
-//    int highBitLength = 7001; // exclusive
-//
-//    int loopVal = 1; // int loopVal = 1000; //change this and re-test for high loop testing
-//    for (int i = 0; i < loopVal; ++i)
-//    {
-//      logger.info("i = " + i);
-//
-//      basicTestPaillierWithKeyGeneration(bitLength, certainty, ensureBitSet);
-//      basicTestPaillierWithKeyGeneration(3072, certainty, ensureBitSet);
-//
-//      // Test with random bit length between 3073 and 7000
-//      int randomLargeBitLength = r.nextInt(highBitLength - lowBitLength) + lowBitLength;
-//      basicTestPaillierWithKeyGeneration(randomLargeBitLength, certainty, ensureBitSet);
-//    }
-//  }
-//
-//  private void basicTestPaillierWithKeyGeneration(int bitLengthInput, int certaintyInput, int ensureBitSet) throws Exception
-//  {
-//    Paillier pailler = new Paillier(bitLengthInput, certaintyInput, ensureBitSet);
-//    BigInteger generatedN = pailler.getN();
-//    BigInteger geneartedNsquared = generatedN.multiply(generatedN);
-//
-//    // Check the decrypting the encryption yields the message
-//    BigInteger encM1 = pailler.encrypt(m1);
-//    BigInteger encM2 = pailler.encrypt(m2);
-//    logger.info("encM1 = " + encM1.intValue() + " encM2 = " + encM2.intValue());
-//
-//    BigInteger decM1 = pailler.decrypt(encM1);
-//    BigInteger decM2 = pailler.decrypt(encM2);
-//    logger.info("decM1 = " + decM1.intValue() + " decM2 = " + decM2.intValue());
-//
-//    assertEquals(decM1, m1);
-//    assertEquals(decM2, m2);
-//
-//    // Check homomorphic property: E_r1(m1)*E_r2(m2) mod N^2 = E_r1r2((m1+m2) mod N) mod N^2
-//    BigInteger encM1_times_encM2 = (encM1.multiply(encM2)).mod(geneartedNsquared);
-//    BigInteger multDecrypt = pailler.decrypt(encM1_times_encM2);
-//    BigInteger m1_plus_m2 = (m1.add(m2)).mod(N);
-//
-//    logger.info("encM1_times_encM2 = " + encM1_times_encM2.intValue() + " multDecrypt = " + multDecrypt.intValue() + " m1_plus_m2 = " + m1_plus_m2.intValue());
-//
-//    assertEquals(multDecrypt, m1_plus_m2);
-//  }
-// }
+package test.general;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.math.BigInteger;
+import java.util.Random;
+
+import org.apache.log4j.Logger;
+import org.junit.Test;
+
+import org.apache.pirk.utils.LogUtils;
+import org.apache.pirk.utils.PIRException;
+import org.apache.pirk.utils.SystemConfiguration;
+import org.apache.pirk.encryption.Paillier;
+
+/**
+ * Basic test functionality for Paillier library
+ * 
+ */
+public class PaillierTest
+{
+  private static Logger logger = LogUtils.getLoggerForThisClass();
+
+  BigInteger p = null; // large prime
+  BigInteger q = null; // large prime
+  BigInteger N = null; // N=pq, RSA modulus
+  BigInteger NSquared = null; // N^2
+  BigInteger lambdaN = null; // lambda(N) = lcm(p-1,q-1)
+
+  int bitLength = 0; // bit length of the modulus N
+  int certainty = 64; // prob that new BigInteger values represents primes will exceed (1 - (1/2)^certainty)
+
+  BigInteger r1 = null; // random number in (Z/NZ)*
+  BigInteger r2 = null; // random number in (Z/NZ)*
+
+  BigInteger m1 = null; // message to encrypt
+  BigInteger m2 = null; // message to encrypt
+
+  public PaillierTest()
+  {
+    p = BigInteger.valueOf(7);
+    q = BigInteger.valueOf(17);
+    N = p.multiply(q);
+    NSquared = N.multiply(N);
+
+    lambdaN = BigInteger.valueOf(48);
+
+    r1 = BigInteger.valueOf(3);
+    r2 = BigInteger.valueOf(4);
+
+    m1 = BigInteger.valueOf(5);
+    m2 = BigInteger.valueOf(2);
+
+    bitLength = 201;// bitLength = 384;
+    certainty = 128;
+
+    logger.info("p = " + p.intValue() + " q = " + q.intValue() + " N = " + N.intValue() + " bitLength = " + N.bitLength() + " lambdaN = " + lambdaN + " m1 = "
+        + m1.intValue() + " m2 = " + m2.intValue() + " r1 = " + r1.intValue() + " r2 = " + r2.intValue());
+  }
+
+  @Test
+  @SuppressWarnings("unused")
+  public void testPIRExceptions()
+  {
+    try
+    {
+      Paillier paillier = new Paillier(BigInteger.valueOf(2), BigInteger.valueOf(2), 128);
+      fail("Paillier constructor did not throw PIRException for p,q < 3");
+    } catch (PIRException e)
+    {}
+
+    try
+    {
+      Paillier paillier = new Paillier(BigInteger.valueOf(2), BigInteger.valueOf(3), 128);
+      fail("Paillier constructor did not throw PIRException for p < 3");
+    } catch (PIRException e)
+    {}
+
+    try
+    {
+      Paillier paillier = new Paillier(BigInteger.valueOf(3), BigInteger.valueOf(2), 128);
+      fail("Paillier constructor did not throw PIRException for q < 3");
+    } catch (PIRException e)
+    {}
+
+    try
+    {
+      Paillier paillier = new Paillier(BigInteger.valueOf(7), BigInteger.valueOf(7), 128);
+      fail("Paillier constructor did not throw PIRException for p = q");
+    } catch (PIRException e)
+    {}
+
+    try
+    {
+      Paillier paillier = new Paillier(BigInteger.valueOf(8), BigInteger.valueOf(7), 128);
+      fail("Paillier constructor did not throw PIRException for p not prime");
+    } catch (PIRException e)
+    {}
+
+    try
+    {
+      Paillier paillier = new Paillier(BigInteger.valueOf(7), BigInteger.valueOf(10), 128);
+      fail("Paillier constructor did not throw PIRException for q not prime");
+    } catch (PIRException e)
+    {}
+
+    try
+    {
+      int systemPrimeCertainty = Integer.parseInt(SystemConfiguration.getProperty("pir.primeCertainty", "128"));
+      Paillier paillier = new Paillier(3072, systemPrimeCertainty - 10);
+      fail("Paillier constructor did not throw PIRException for certainty less than system default of " + systemPrimeCertainty);
+    } catch (PIRException e)
+    {}
+
+    try
+    {
+      Paillier pailler = new Paillier(p, q, bitLength);
+      BigInteger encM1 = pailler.encrypt(N);
+      fail("Paillier encryption did not throw PIRException for message m = N");
+    } catch (PIRException e)
+    {}
+
+    try
+    {
+      Paillier pailler = new Paillier(p, q, bitLength);
+      BigInteger encM1 = pailler.encrypt(N.add(BigInteger.TEN));
+      fail("Paillier encryption did not throw PIRException for message m > N");
+    } catch (PIRException e)
+    {}
+    
+    try
+    {
+      Paillier pailler = new Paillier(bitLength, 128, bitLength);
+      fail("Paillier constructor did not throw PIRException for ensureBitSet = bitLength");
+    } catch (PIRException e)
+    {}
+    
+    try
+    {
+      Paillier pailler = new Paillier(bitLength, 128, bitLength + 1);
+      fail("Paillier constructor did not throw PIRException for ensureBitSet > bitLength");
+    } catch (PIRException e)
+    {}
+  }
+
+  @Test
+  public void testPaillierGivenAllParameters() throws Exception
+  {
+    logger.info("Starting testPaillierGivenAllParameters: ");
+
+    Paillier pailler = new Paillier(p, q, bitLength);
+
+    assertEquals(pailler.getN(), N);
+    assertEquals(pailler.getLambdaN(), lambdaN);
+
+    // Check encryption
+    BigInteger encM1 = pailler.encrypt(m1, r1);
+    BigInteger encM2 = pailler.encrypt(m2, r2);
+    logger.info("encM1 = " + encM1.intValue() + " encM2 = " + encM2.intValue());
+
+    assertEquals(encM1, BigInteger.valueOf(14019));
+    assertEquals(encM2, BigInteger.valueOf(8836));
+
+    // Check decryption
+    BigInteger decM1 = pailler.decrypt(encM1);
+    BigInteger decM2 = pailler.decrypt(encM2);
+    logger.info("decM1 = " + decM1.intValue() + " decM2 = " + decM2.intValue());
+
+    assertEquals(decM1, m1);
+    assertEquals(decM2, m2);
+
+    // Check homomorphic property: E_r1(m1)*E_r2(m2) mod N^2 = E_r1r2((m1+m2) mod N) mod N^2
+    BigInteger encM1_times_encM2 = (encM1.multiply(encM2)).mod(NSquared);
+    BigInteger encM1plusM2 = pailler.encrypt((m1.add(m2)).mod(N), r1.multiply(r2));
+    logger.info("encM1_times_encM2 = " + encM1_times_encM2.intValue() + " encM1plusM2 = " + encM1plusM2.intValue());
+
+    assertEquals(encM1_times_encM2, BigInteger.valueOf(5617));
+    assertEquals(encM1plusM2, BigInteger.valueOf(5617));
+
+    logger.info("Successfully completed testPaillierGivenAllParameters: ");
+  }
+
+  @Test
+  public void testPaillierWithKeyGeneration() throws Exception
+  {
+    logger.info("Starting testPaillierWithKeyGeneration: ");
+
+    // Test with and without gmp optimization for modPow
+    SystemConfiguration.setProperty("pallier.FIPSPrimeGenerationChecks", "true");
+    SystemConfiguration.setProperty("paillier.useGMPForModPow", "true");
+    SystemConfiguration.setProperty("paillier.GMPConstantTimeMode", "true");
+    testPaillerWithKeyGenerationGeneral();
+
+    SystemConfiguration.setProperty("pallier.FIPSPrimeGenerationChecks", "false");
+
+    SystemConfiguration.setProperty("paillier.useGMPForModPow", "true");
+    SystemConfiguration.setProperty("paillier.GMPConstantTimeMode", "true");
+    testPaillerWithKeyGenerationGeneral();
+
+    SystemConfiguration.setProperty("paillier.useGMPForModPow", "true");
+    SystemConfiguration.setProperty("paillier.GMPConstantTimeMode", "false");
+    testPaillerWithKeyGenerationGeneral();
+
+    SystemConfiguration.setProperty("paillier.useGMPForModPow", "false");
+    SystemConfiguration.setProperty("paillier.GMPConstantTimeMode", "false");
+    testPaillerWithKeyGenerationGeneral();
+
+    // Reset the properties
+    SystemConfiguration.resetProperties();
+
+    logger.info("Ending testPaillierWithKeyGeneration: ");
+  }
+
+  public void testPaillerWithKeyGenerationGeneral() throws Exception
+  {
+    // Test without requiring highest bit to be set
+    logger.info("Starting testPaillierWithKeyGenerationBitSetOption with ensureHighBitSet = false");
+    testPaillierWithKeyGenerationBitSetOption(-1);
+
+    // Test requiring highest bit to be set
+    logger.info("Starting testPaillierWithKeyGenerationBitSetOption with ensureHighBitSet = true");
+    testPaillierWithKeyGenerationBitSetOption(5);
+  }
+
+  public void testPaillierWithKeyGenerationBitSetOption(int ensureBitSet) throws Exception
+  {
+    Random r = new Random();
+    int lowBitLength = 3073; // inclusive
+    int highBitLength = 7001; // exclusive
+
+    int loopVal = 1; // int loopVal = 1000; //change this and re-test for high loop testing
+    for (int i = 0; i < loopVal; ++i)
+    {
+      logger.info("i = " + i);
+
+      basicTestPaillierWithKeyGeneration(bitLength, certainty, ensureBitSet);
+      basicTestPaillierWithKeyGeneration(3072, certainty, ensureBitSet);
+
+      // Test with random bit length between 3073 and 7000
+      int randomLargeBitLength = r.nextInt(highBitLength - lowBitLength) + lowBitLength;
+      basicTestPaillierWithKeyGeneration(randomLargeBitLength, certainty, ensureBitSet);
+    }
+  }
+
+  private void basicTestPaillierWithKeyGeneration(int bitLengthInput, int certaintyInput, int ensureBitSet) throws Exception
+  {
+    Paillier pailler = new Paillier(bitLengthInput, certaintyInput, ensureBitSet);
+    BigInteger generatedN = pailler.getN();
+    BigInteger geneartedNsquared = generatedN.multiply(generatedN);
+
+    // Check the decrypting the encryption yields the message
+    BigInteger encM1 = pailler.encrypt(m1);
+    BigInteger encM2 = pailler.encrypt(m2);
+    logger.info("encM1 = " + encM1.intValue() + " encM2 = " + encM2.intValue());
+
+    BigInteger decM1 = pailler.decrypt(encM1);
+    BigInteger decM2 = pailler.decrypt(encM2);
+    logger.info("decM1 = " + decM1.intValue() + " decM2 = " + decM2.intValue());
+
+    assertEquals(decM1, m1);
+    assertEquals(decM2, m2);
+
+    // Check homomorphic property: E_r1(m1)*E_r2(m2) mod N^2 = E_r1r2((m1+m2) mod N) mod N^2
+    BigInteger encM1_times_encM2 = (encM1.multiply(encM2)).mod(geneartedNsquared);
+    BigInteger multDecrypt = pailler.decrypt(encM1_times_encM2);
+    BigInteger m1_plus_m2 = (m1.add(m2)).mod(N);
+
+    logger.info("encM1_times_encM2 = " + encM1_times_encM2.intValue() + " multDecrypt = " + multDecrypt.intValue() + " m1_plus_m2 = " + m1_plus_m2.intValue());
+
+    assertEquals(multDecrypt, m1_plus_m2);
+  }
+ }