public void EmptyBigPolyNET()
        {
            var poly = new BigPoly();

            Assert.AreEqual(0, poly.CoeffCount);
            Assert.AreEqual(0, poly.CoeffBitCount);
            Assert.AreEqual(0, poly.UInt64Count);
            Assert.IsTrue(null == poly.Pointer);
            Assert.AreEqual(0, poly.GetSignificantCoeffCount());
            Assert.IsTrue(poly.IsZero);
            Assert.IsFalse(poly.IsAlias);
            Assert.AreEqual("0", poly.ToString());
            poly.SetZero();

            var poly2 = new BigPoly();

            Assert.IsTrue(poly.Equals(poly2));

            poly.Resize(1, 1);
            Assert.IsTrue(null != poly.Pointer);
            Assert.IsFalse(poly.IsAlias);

            poly.Resize(0, 0);
            Assert.IsTrue(null == poly.Pointer);
            Assert.IsFalse(poly.IsAlias);
        }
Example #2
0
        public void BinaryFractionalEncodeDecodeNET()
        {
            var polyModulus = new BigPoly("1x^1024 + 1");
            var modulus     = new SmallModulus(0x10000);
            var encoder     = new BinaryFractionalEncoder(modulus, polyModulus, 500, 50, MemoryPoolHandle.New());

            var poly = encoder.Encode(0.0);

            Assert.IsTrue(poly.IsZero);
            Assert.AreEqual(0.0, encoder.Decode(poly));

            var poly1 = encoder.Encode(-1.0);

            Assert.AreEqual(-1.0, encoder.Decode(poly1));

            var poly2 = encoder.Encode(0.1);

            Assert.IsTrue(Math.Abs(encoder.Decode(poly2) - 0.1) / 0.1 < 0.000001);

            var poly3 = encoder.Encode(3.123);

            Assert.IsTrue(Math.Abs(encoder.Decode(poly3) - 3.123) / 3.123 < 0.000001);

            var poly4 = encoder.Encode(-123.456);

            Assert.IsTrue(Math.Abs(encoder.Decode(poly4) + 123.456) / (-123.456) < 0.000001);

            var poly5 = encoder.Encode(12345.98765);

            Assert.IsTrue(Math.Abs(encoder.Decode(poly5) - 12345.98765) / 12345.98765 < 0.000001);
        }
Example #3
0
        public void TransformPlainToFromNTTNET()
        {
            var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());

            parms.SetDecompositionBitCount(4);
            parms.SetNoiseStandardDeviation(3.19);
            parms.SetNoiseMaxDeviation(35.06);

            var coeffModulus = new BigUInt(48);

            coeffModulus.Set("FFFFFFFFC001");
            parms.SetCoeffModulus(coeffModulus);

            var plainModulus = new BigUInt(7);

            plainModulus.Set(1 << 6);
            parms.SetPlainModulus(plainModulus);

            var polyModulus = new BigPoly(65, 1);

            polyModulus[0].Set(1);
            polyModulus[64].Set(1);
            parms.SetPolyModulus(polyModulus);

            parms.Validate();

            var evaluator = new Evaluator(parms, MemoryPoolHandle.AcquireNew());
            var plain     = new BigPoly(65, 1);

            plain.Set("0");
            evaluator.TransformToNTT(plain);
            Assert.IsTrue(plain.ToString() == "0");
            evaluator.TransformFromNTT(plain);
            Assert.IsTrue(plain.ToString() == "0");

            plain.Set("1");
            evaluator.TransformToNTT(plain);
            for (int i = 0; i < 64; i++)
            {
                Assert.IsTrue(plain[i].ToString() == "1");
            }
            Assert.IsTrue(plain[64].ToString() == "0");
            evaluator.TransformFromNTT(plain);
            Assert.IsTrue(plain.ToString() == "1");

            plain.Set("2");
            evaluator.TransformToNTT(plain);
            for (int i = 0; i < 64; i++)
            {
                Assert.IsTrue(plain[i].ToString() == "2");
            }
            Assert.IsTrue(plain[64].ToString() == "0");
            evaluator.TransformFromNTT(plain);
            Assert.IsTrue(plain.ToString() == "2");

            plain.Set("Fx^10 + Ex^9 + Dx^8 + Cx^7 + Bx^6 + Ax^5 + 1x^4 + 2x^3 + 3x^2 + 4x^1 + 5");
            evaluator.TransformToNTT(plain);
            evaluator.TransformFromNTT(plain);
            Assert.IsTrue(plain.ToString() == "Fx^10 + Ex^9 + Dx^8 + Cx^7 + Bx^6 + Ax^5 + 1x^4 + 2x^3 + 3x^2 + 4x^1 + 5");
        }
        public void PolyInftyNormCoeffmodNET()
        {
            var     poly    = new BigPoly("1x^10 + 2x^9 + 5x^8 + Ax^7 + Bx^6 + 4x^5 + 1x^2 + 1");
            BigUInt value   = new BigUInt();
            BigUInt modulus = new BigUInt();

            modulus.Set(5);
            var inftynorm = Utilities.PolyInftyNormCoeffmod(poly, modulus);

            value.Set("2");
            Assert.AreEqual(value, inftynorm);

            poly.Set("AAx^10 + ABx^9 + CAx^8 + CFx^7 + FEx^6 + F7x^5 + 1x^2 + 2");
            modulus.Set("10");
            inftynorm = Utilities.PolyInftyNormCoeffmod(poly, modulus);
            value.Set("7");
            Assert.AreEqual(value, inftynorm);

            poly.Set("Ax^10 + ABx^9 + ABCx^8 + ABCDx^7 + ABCDEx^6 + ABCDEFx^5 + 1x^2 + 2");
            modulus.Set("4");
            inftynorm = Utilities.PolyInftyNormCoeffmod(poly, modulus);
            value.Set("2");
            Assert.AreEqual(value, inftynorm);

            poly.Set("1x^5 + 2x^4 + 3x^3 + 4x^2 + 5x^1 + 6");
            modulus.Set("4");
            inftynorm = Utilities.PolyInftyNormCoeffmod(poly, modulus);
            value.Set("2");
            Assert.AreEqual(value, inftynorm);
        }
        public void FVKeyGenerationNoEVKNET()
        {
            var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());

            parms.SetDecompositionBitCount(0);
            parms.SetNoiseStandardDeviation(3.19);
            parms.SetNoiseMaxDeviation(35.06);

            var coeffModulus = new BigUInt(48);

            coeffModulus.Set("FFFFFFFFC001");
            parms.SetCoeffModulus(coeffModulus);

            var plainModulus = new BigUInt(7);

            plainModulus.Set(1 << 6);
            parms.SetPlainModulus(plainModulus);

            var polyModulus = new BigPoly(65, 1);

            polyModulus[0].Set(1);
            polyModulus[64].Set(1);
            parms.SetPolyModulus(polyModulus);

            parms.Validate();

            var keygen = new KeyGenerator(parms, MemoryPoolHandle.AcquireNew());

            keygen.Generate(0);

            Assert.IsFalse(keygen.PublicKey[0].IsZero);
            Assert.IsFalse(keygen.PublicKey[1].IsZero);
            Assert.IsFalse(keygen.SecretKey.IsZero);
        }
Example #6
0
        public void TransformEncryptedToFromNTTNET()
        {
            var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());

            parms.SetDecompositionBitCount(4);
            parms.SetNoiseStandardDeviation(3.19);
            parms.SetNoiseMaxDeviation(35.06);

            var coeffModulus = new BigUInt(48);

            coeffModulus.Set("FFFFFFFFC001");
            parms.SetCoeffModulus(coeffModulus);

            var plainModulus = new BigUInt(7);

            plainModulus.Set(1 << 6);
            parms.SetPlainModulus(plainModulus);

            var polyModulus = new BigPoly(65, 1);

            polyModulus[0].Set(1);
            polyModulus[64].Set(1);
            parms.SetPolyModulus(polyModulus);

            parms.Validate();

            var keygen = new KeyGenerator(parms, MemoryPoolHandle.AcquireNew());

            keygen.Generate();

            var encryptor = new Encryptor(parms, keygen.PublicKey, MemoryPoolHandle.AcquireNew());
            var evaluator = new Evaluator(parms, MemoryPoolHandle.AcquireNew());
            var decryptor = new Decryptor(parms, keygen.SecretKey, MemoryPoolHandle.AcquireNew());

            var plain  = new BigPoly(65, 1);
            var cipher = new BigPolyArray(2, 65, 1);

            plain.Set("0");
            encryptor.Encrypt(plain, cipher);
            evaluator.TransformToNTT(cipher);
            evaluator.TransformFromNTT(cipher);
            decryptor.Decrypt(cipher, plain);
            Assert.IsTrue(plain.ToString() == "0");

            plain.Set("1");
            encryptor.Encrypt(plain, cipher);
            evaluator.TransformToNTT(cipher);
            evaluator.TransformFromNTT(cipher);
            decryptor.Decrypt(cipher, plain);
            Assert.IsTrue(plain.ToString() == "1");

            plain.Set("Fx^10 + Ex^9 + Dx^8 + Cx^7 + Bx^6 + Ax^5 + 1x^4 + 2x^3 + 3x^2 + 4x^1 + 5");
            encryptor.Encrypt(plain, cipher);
            evaluator.TransformToNTT(cipher);
            evaluator.TransformFromNTT(cipher);
            decryptor.Decrypt(cipher, plain);
            Assert.IsTrue(plain.ToString() == "Fx^10 + Ex^9 + Dx^8 + Cx^7 + Bx^6 + Ax^5 + 1x^4 + 2x^3 + 3x^2 + 4x^1 + 5");
        }
Example #7
0
        public void FVEncryptSquareDecryptNET()
        {
            var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());

            parms.SetDecompositionBitCount(4);
            parms.SetNoiseStandardDeviation(3.19);
            parms.SetNoiseMaxDeviation(35.06);

            var coeffModulus = new BigUInt(48);

            coeffModulus.Set("FFFFFFFFC001");
            parms.SetCoeffModulus(coeffModulus);

            var plainModulus = new BigUInt(7);

            plainModulus.Set(1 << 6);
            parms.SetPlainModulus(plainModulus);

            var polyModulus = new BigPoly(65, 1);

            polyModulus[0].Set(1);
            polyModulus[64].Set(1);
            parms.SetPolyModulus(polyModulus);

            parms.Validate();

            var keygen = new KeyGenerator(parms, MemoryPoolHandle.AcquireNew());

            keygen.Generate();

            var encoder = new BalancedEncoder(parms.PlainModulus, MemoryPoolHandle.AcquireNew());

            var encryptor = new Encryptor(parms, keygen.PublicKey, MemoryPoolHandle.AcquireNew());
            var evaluator = new Evaluator(parms, MemoryPoolHandle.AcquireNew());
            var decryptor = new Decryptor(parms, keygen.SecretKey, MemoryPoolHandle.AcquireNew());

            var encrypted1 = encryptor.Encrypt(encoder.Encode(1));
            var product    = evaluator.Square(encrypted1);

            Assert.AreEqual(1UL, encoder.DecodeUInt64(decryptor.Decrypt(product)));

            encrypted1 = encryptor.Encrypt(encoder.Encode(0));
            product    = evaluator.Square(encrypted1);
            Assert.AreEqual(0UL, encoder.DecodeUInt64(decryptor.Decrypt(product)));

            encrypted1 = encryptor.Encrypt(encoder.Encode(-5));
            product    = evaluator.Square(encrypted1);
            Assert.AreEqual(25UL, encoder.DecodeUInt64(decryptor.Decrypt(product)));

            encrypted1 = encryptor.Encrypt(encoder.Encode(-1));
            product    = evaluator.Square(encrypted1);
            Assert.AreEqual(1UL, encoder.DecodeUInt64(decryptor.Decrypt(product)));

            encrypted1 = encryptor.Encrypt(encoder.Encode(123));
            product    = evaluator.Square(encrypted1);
            Assert.AreEqual(15129UL, encoder.DecodeUInt64(decryptor.Decrypt(product)));
        }
Example #8
0
        public void FVEncryptAddsNoiseNET()
        {
            var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());

            parms.SetDecompositionBitCount(4);
            parms.SetNoiseStandardDeviation(3.19);
            parms.SetNoiseMaxDeviation(35.06);

            var coeffModulus = new BigUInt(48);

            coeffModulus.Set("FFFFFFFFC001");
            parms.SetCoeffModulus(coeffModulus);

            var plainModulus = new BigUInt(7);

            plainModulus.Set(1 << 6);
            parms.SetPlainModulus(plainModulus);

            var polyModulus = new BigPoly(65, 1);

            polyModulus[0].Set(1);
            polyModulus[64].Set(1);
            parms.SetPolyModulus(polyModulus);

            parms.Validate();

            var Encoder = new BinaryEncoder(parms.PlainModulus, MemoryPoolHandle.AcquireNew());

            var keygen = new KeyGenerator(parms, MemoryPoolHandle.AcquireNew());

            keygen.Generate();

            var encryptor = new Encryptor(parms, keygen.PublicKey, MemoryPoolHandle.AcquireNew());

            // however, this line is fine
            Assert.AreEqual(encryptor.PublicKey[0], keygen.PublicKey[0]);
            Assert.AreEqual(encryptor.PublicKey[1], keygen.PublicKey[1]);

            var encrypted1 = encryptor.Encrypt(Encoder.Encode(0x12345678));
            var encrypted2 = encryptor.Encrypt(Encoder.Encode(0x12345678));

            // this is what we want to check
            Assert.AreNotEqual(encrypted1[0], encrypted2[0]);
            Assert.AreNotEqual(encrypted1[1], encrypted2[1]);


            var decryptor = new Decryptor(parms, keygen.SecretKey, MemoryPoolHandle.AcquireNew());

            Assert.AreEqual(0x12345678U, Encoder.DecodeUInt32(decryptor.Decrypt(encrypted1)));
            Assert.AreEqual(0x12345678U, Encoder.DecodeUInt32(decryptor.Decrypt(encrypted2)));
        }
        public void BigPolyFromStringNET()
        {
            var poly = new BigPoly("9x^2 + 2");

            Assert.AreEqual("9x^2 + 2", poly.ToString());
            Assert.AreEqual(3, poly.CoeffCount);
            Assert.AreEqual(4, poly.CoeffBitCount);

            poly.Resize(0, 0);
            poly.Set("0");
            Assert.AreEqual("0", poly.ToString());
            Assert.AreEqual(0, poly.CoeffCount);
            Assert.AreEqual(0, poly.CoeffBitCount);

            poly.Set("1");
            Assert.AreEqual("1", poly.ToString());
            Assert.AreEqual(1, poly.CoeffCount);
            Assert.AreEqual(1, poly.CoeffBitCount);

            poly.Set("123");
            Assert.AreEqual("123", poly.ToString());
            Assert.AreEqual(1, poly.CoeffCount);
            Assert.AreEqual(9, poly.CoeffBitCount);

            poly.Set("23x^3");
            Assert.AreEqual("23x^3", poly.ToString());
            Assert.AreEqual(4, poly.CoeffCount);
            Assert.AreEqual(9, poly.CoeffBitCount);

            poly.Resize(0, 0);
            poly.Set("23x^3");
            Assert.AreEqual("23x^3", poly.ToString());
            Assert.AreEqual(4, poly.CoeffCount);
            Assert.AreEqual(6, poly.CoeffBitCount);

            poly.Set("3x^2 + 2x^1");
            Assert.AreEqual("3x^2 + 2x^1", poly.ToString());
            Assert.AreEqual(4, poly.CoeffCount);
            Assert.AreEqual(6, poly.CoeffBitCount);

            poly.Set("1x^2 + 2x^1 + 3");
            Assert.AreEqual("1x^2 + 2x^1 + 3", poly.ToString());
            Assert.AreEqual(4, poly.CoeffCount);
            Assert.AreEqual(6, poly.CoeffBitCount);

            poly.Set("4x^1");
            Assert.AreEqual("4x^1", poly.ToString());
            Assert.AreEqual(4, poly.CoeffCount);
            Assert.AreEqual(6, poly.CoeffBitCount);
        }
Example #10
0
        public void BigPolyEvalPolyPolyModCoeffModNET()
        {
            var modulus      = new BigUInt("5");
            var polymod      = new BigPoly("1x^3 + 3x^1 + 1");
            var poly_to_eval = new BigPoly("0");
            var poly         = new BigPoly("0");
            var result       = Utilities.PolyEvalPolyPolymodCoeffmod(poly_to_eval, poly, polymod, modulus);

            Assert.AreEqual("0", result.ToString());

            poly_to_eval.Set("1");
            poly.Set("0");
            result = Utilities.PolyEvalPolyPolymodCoeffmod(poly_to_eval, poly, polymod, modulus);
            Assert.AreEqual("1", result.ToString());

            poly_to_eval.Set("4");
            poly.Set("0");
            result = Utilities.PolyEvalPolyPolymodCoeffmod(poly_to_eval, poly, polymod, modulus);
            Assert.AreEqual("4", result.ToString());

            poly_to_eval.Set("4");
            poly.Set("1");
            result = Utilities.PolyEvalPolyPolymodCoeffmod(poly_to_eval, poly, polymod, modulus);
            Assert.AreEqual("4", result.ToString());

            poly_to_eval.Set("0");
            poly.Set("1");
            result = Utilities.PolyEvalPolyPolymodCoeffmod(poly_to_eval, poly, polymod, modulus);
            Assert.AreEqual("0", result.ToString());

            poly_to_eval.Set("1x^1 + 2");
            poly.Set("1");
            result = Utilities.PolyEvalPolyPolymodCoeffmod(poly_to_eval, poly, polymod, modulus);
            Assert.AreEqual("3", result.ToString());

            poly_to_eval.Set("1x^1 + 4");
            poly.Set("2x^1 + 1");
            result = Utilities.PolyEvalPolyPolymodCoeffmod(poly_to_eval, poly, polymod, modulus);
            Assert.AreEqual("2x^1", result.ToString());

            poly_to_eval.Set("1x^1 + 1");
            poly.Set("1x^2 + 2x^1 + 3");
            result = Utilities.PolyEvalPolyPolymodCoeffmod(poly_to_eval, poly, polymod, modulus);
            Assert.AreEqual("1x^2 + 2x^1 + 4", result.ToString());

            poly_to_eval.Set("1x^2 + 1");
            poly.Set("1x^2 + 2x^1 + 3");
            result = Utilities.PolyEvalPolyPolymodCoeffmod(poly_to_eval, poly, polymod, modulus);
            Assert.AreEqual("2x^2 + 4x^1 + 1", result.ToString());
        }
Example #11
0
        public void FVEncryptExponentiateDecryptNET()
        {
            var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());

            parms.SetDecompositionBitCount(4);
            parms.SetNoiseStandardDeviation(3.19);
            parms.SetNoiseMaxDeviation(35.06);

            var coeffModulus = new BigUInt(48);

            coeffModulus.Set("FFFFFFFFC001");
            parms.SetCoeffModulus(coeffModulus);

            var plainModulus = new BigUInt(7);

            plainModulus.Set(1 << 6);
            parms.SetPlainModulus(plainModulus);

            var polyModulus = new BigPoly(65, 1);

            polyModulus[0].Set(1);
            polyModulus[64].Set(1);
            parms.SetPolyModulus(polyModulus);

            parms.Validate();

            var keygen = new KeyGenerator(parms, MemoryPoolHandle.AcquireNew());

            keygen.Generate(1);

            var encoder = new BinaryEncoder(parms.PlainModulus, MemoryPoolHandle.AcquireNew());

            var encryptor = new Encryptor(parms, keygen.PublicKey, MemoryPoolHandle.AcquireNew());
            var evaluator = new Evaluator(parms, keygen.EvaluationKeys, MemoryPoolHandle.AcquireNew());
            var decryptor = new Decryptor(parms, keygen.SecretKey, MemoryPoolHandle.AcquireNew());

            var encrypted = encryptor.Encrypt(encoder.Encode(5));
            var power     = evaluator.Exponentiate(encrypted, 1);

            Assert.AreEqual(5, encoder.DecodeInt32(decryptor.Decrypt(power)));

            encrypted = encryptor.Encrypt(encoder.Encode(7));
            power     = evaluator.Exponentiate(encrypted, 2);
            Assert.AreEqual(49, encoder.DecodeInt32(decryptor.Decrypt(power)));

            encrypted = encryptor.Encrypt(encoder.Encode(-7));
            power     = evaluator.Exponentiate(encrypted, 3);
            Assert.AreEqual(-343, encoder.DecodeInt32(decryptor.Decrypt(power)));
        }
        public void BalancedFractionalEncodeDecodeNET()
        {
            var polyModulus = new BigPoly("1x^1024 + 1");
            var modulus     = new BigUInt("10000");

            var poly  = new BigPoly();
            var poly1 = new BigPoly();
            var poly2 = new BigPoly();
            var poly3 = new BigPoly();
            var poly4 = new BigPoly();
            var poly5 = new BigPoly();

            for (ulong b = 3; b < 20; b += 2)
            {
                var encoder = new BalancedFractionalEncoder(modulus, polyModulus, 500, 50, b);

                poly = encoder.Encode(0.0);
                Assert.AreEqual(polyModulus.CoeffCount, poly.CoeffCount);
                Assert.IsTrue(poly.IsZero);
                Assert.AreEqual(0.0, encoder.Decode(poly));

                poly1 = encoder.Encode(-1.0);
                Assert.AreEqual(polyModulus.CoeffCount, poly1.CoeffCount);
                Assert.AreEqual(modulus.BitCount, poly1.CoeffBitCount);
                Assert.AreEqual(-1.0, encoder.Decode(poly1));

                poly2 = encoder.Encode(0.1);
                Assert.AreEqual(polyModulus.CoeffCount, poly2.CoeffCount);
                Assert.AreEqual(modulus.BitCount, poly2.CoeffBitCount);
                Assert.IsTrue(Math.Abs(encoder.Decode(poly2) - 0.1) / 0.1 < 0.000001);

                poly3 = encoder.Encode(3.123);
                Assert.AreEqual(polyModulus.CoeffCount, poly3.CoeffCount);
                Assert.AreEqual(modulus.BitCount, poly3.CoeffBitCount);
                Assert.IsTrue(Math.Abs(encoder.Decode(poly3) - 3.123) / 3.123 < 0.000001);

                poly4 = encoder.Encode(-123.456);
                Assert.AreEqual(polyModulus.CoeffCount, poly4.CoeffCount);
                Assert.AreEqual(modulus.BitCount, poly4.CoeffBitCount);
                Assert.IsTrue(Math.Abs(encoder.Decode(poly4) + 123.456) / (-123.456) < 0.000001);

                poly5 = encoder.Encode(12345.98765);
                Assert.AreEqual(polyModulus.CoeffCount, poly5.CoeffCount);
                Assert.AreEqual(modulus.BitCount, poly5.CoeffBitCount);
                Assert.IsTrue(Math.Abs(encoder.Decode(poly5) - 12345.98765) / 12345.98765 < 0.000001);
            }
        }
Example #13
0
        public void BigPolyEvalUIntModNET()
        {
            var modulus = new BigUInt("5");
            var poly    = new BigPoly("1x^2 + 1x^1 + 1");
            var value   = new BigUInt("0");
            var result  = Utilities.PolyEvalUIntMod(poly, value, modulus);

            Assert.AreEqual("1", result.ToString());

            value.Set("1");
            result = Utilities.PolyEvalUIntMod(poly, value, modulus);
            Assert.AreEqual("3", result.ToString());

            value.Set("4");
            result = Utilities.PolyEvalUIntMod(poly, value, modulus);
            Assert.AreEqual("1", result.ToString());
        }
        public void SaveLoadEncryptionParamsNET()
        {
            var stream = new MemoryStream();

            // Create encryption parameters.
            var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());

            parms.SetDecompositionBitCount(4);
            parms.SetNoiseStandardDeviation(3.19);
            parms.SetNoiseMaxDeviation(35.06);

            var coeffModulus = new BigUInt(48);

            coeffModulus.Set("FFFFFFFFC001");
            parms.SetCoeffModulus(coeffModulus);

            var plainModulus = new BigUInt(7);

            plainModulus.Set(1 << 6);
            parms.SetPlainModulus(plainModulus);

            var polyModulus = new BigPoly(65, 1);

            polyModulus[0].Set(1);
            polyModulus[64].Set(1);
            parms.SetPolyModulus(polyModulus);

            var parms2 = new EncryptionParameters(MemoryPoolHandle.AcquireNew());

            stream.Seek(0, SeekOrigin.Begin);
            parms.Save(stream);
            stream.Seek(0, SeekOrigin.Begin);
            parms2.Load(stream);

            Assert.AreEqual(parms.DecompositionBitCount, parms2.DecompositionBitCount);
            Assert.AreEqual(parms.NoiseStandardDeviation, parms2.NoiseStandardDeviation);
            Assert.AreEqual(parms.NoiseMaxDeviation, parms2.NoiseMaxDeviation);
            Assert.AreEqual(parms.CoeffModulus, parms2.CoeffModulus);

            // Commented out due to dependence on the SEAL library #define DISABLE_NTT_IN_MULTIPLY
            //Assert.AreEqual(parms.AuxCoeffModulus, parms2.AuxCoeffModulus);

            Assert.AreEqual(parms.PlainModulus, parms2.PlainModulus);
            Assert.AreEqual(parms.PolyModulus, parms2.PolyModulus);
        }
Example #15
0
        public void DuplicateFromNET()
        {
            var original = new BigPoly(123, 456);

            original[0].Set(1);
            original[1].Set(2);
            original[2].Set(3);
            original[3].Set(4);
            original[4].Set(5);
            original[122].Set(123);

            BigPoly target = new BigPoly();

            target.DuplicateFrom(original);
            Assert.AreEqual(target.CoeffCount, original.CoeffCount);
            Assert.AreEqual(target.CoeffBitCount, original.CoeffBitCount);
            Assert.IsTrue(target.Equals(original));
        }
Example #16
0
        public void ExponentiatePolyPolyPolyModCoeffModNET()
        {
            var poly     = new BigPoly("1x^2 + 2x^1 + 3");
            var modulus  = new BigUInt("5");
            var exponent = new BigUInt("1");
            var polymod  = new BigPoly("1x^3 + 3x^1 + 1");
            var result   = Utilities.ExponentiatePolyPolymodCoeffmod(poly, exponent, polymod, modulus);

            Assert.AreEqual("1x^2 + 2x^1 + 3", result.ToString());
            exponent.Set("2");
            result = Utilities.ExponentiatePolyPolymodCoeffmod(poly, exponent, polymod, modulus);
            Assert.AreEqual("2x^2 + 4x^1", result.ToString());

            poly.Set("1");
            exponent.Set("2");
            result = Utilities.ExponentiatePolyPolymodCoeffmod(poly, exponent, polymod, modulus);
            Assert.AreEqual("1", result.ToString());
            exponent.Set("F00F000F00");
            result = Utilities.ExponentiatePolyPolymodCoeffmod(poly, exponent, polymod, modulus);
            Assert.AreEqual("1", result.ToString());
        }
Example #17
0
        public void SaveLoadPolyNET()
        {
            var stream = new MemoryStream();

            var poly  = new BigPoly();
            var poly2 = new BigPoly(1, 32);

            poly2[0].Set(1);
            stream.Seek(0, SeekOrigin.Begin);
            poly.Save(stream);
            stream.Seek(0, SeekOrigin.Begin);
            poly2.Load(stream);
            Assert.AreEqual(poly, poly2);

            poly.Resize(3, 96);
            poly[0].Set(2);
            poly[1].Set(3);
            poly[2].Set(4);
            stream.Seek(0, SeekOrigin.Begin);
            poly.Save(stream);
            stream.Seek(0, SeekOrigin.Begin);
            poly2.Load(stream);
            Assert.AreEqual(poly, poly2);

            poly[0].Set("FFFFFFFFFFFFFFFFFF");
            stream.Seek(0, SeekOrigin.Begin);
            poly.Save(stream);
            stream.Seek(0, SeekOrigin.Begin);
            poly2.Load(stream);
            Assert.AreEqual(poly, poly2);

            poly.Resize(2, 32);
            poly[0].Set(1);
            stream.Seek(0, SeekOrigin.Begin);
            poly.Save(stream);
            stream.Seek(0, SeekOrigin.Begin);
            poly2.Load(stream);
            Assert.AreEqual(poly, poly2);
        }
Example #18
0
        public void BalancedFractionalEncodeDecodeNET()
        {
            var polyModulus = new BigPoly("1x^1024 + 1");
            var modulus     = new SmallModulus(0x10000);

            var poly  = new Plaintext();
            var poly1 = new Plaintext();
            var poly2 = new Plaintext();
            var poly3 = new Plaintext();
            var poly4 = new Plaintext();
            var poly5 = new Plaintext();

            for (ulong b = 3; b < 20; b += 2)
            {
                var encoder = new BalancedFractionalEncoder(modulus, polyModulus, 500, 50, b, MemoryPoolHandle.New());

                poly = encoder.Encode(0.0);
                Assert.AreEqual(1, poly.CoeffCount);
                Assert.IsTrue(poly.IsZero);
                Assert.AreEqual(0.0, encoder.Decode(poly));

                poly1 = encoder.Encode(-1.0);
                Assert.AreEqual(-1.0, encoder.Decode(poly1));

                poly2 = encoder.Encode(0.1);
                Assert.IsTrue(Math.Abs(encoder.Decode(poly2) - 0.1) / 0.1 < 0.000001);

                poly3 = encoder.Encode(3.123);
                Assert.IsTrue(Math.Abs(encoder.Decode(poly3) - 3.123) / 3.123 < 0.000001);

                poly4 = encoder.Encode(-123.456);
                Assert.IsTrue(Math.Abs(encoder.Decode(poly4) + 123.456) / (-123.456) < 0.000001);

                poly5 = encoder.Encode(12345.98765);
                Assert.IsTrue(Math.Abs(encoder.Decode(poly5) - 12345.98765) / 12345.98765 < 0.000001);
            }
        }
        public void PolyInftyNormNET()
        {
            var     poly      = new BigPoly("1x^10 + 2x^9 + 5x^8 + Ax^7 + Bx^6 + 4x^5 + 1x^2 + 1");
            BigUInt value     = new BigUInt();
            var     inftynorm = Utilities.PolyInftyNorm(poly);

            value.Set("B");
            Assert.AreEqual(value, inftynorm);

            poly.Set("AAx^10 + ABx^9 + CAx^8 + CFx^7 + FEx^6 + F7x^5 + 1x^2 + 2");
            inftynorm = Utilities.PolyInftyNorm(poly);
            value.Set("FE");
            Assert.AreEqual(value, inftynorm);

            poly.Set("Ax^10 + ABx^9 + ABCx^8 + ABCDx^7 + ABCDEx^6 + ABCDEFx^5 + 1x^2 + 2");
            inftynorm = Utilities.PolyInftyNorm(poly);
            value.Set("ABCDEF");
            Assert.AreEqual(value, inftynorm);

            poly.Set("1x^5 + 2x^4 + 3x^3 + 4x^2 + 5x^1 + 6");
            inftynorm = Utilities.PolyInftyNorm(poly);
            value.Set("6");
            Assert.AreEqual(value, inftynorm);
        }
Example #20
0
 public EncCal(string polyMod, int coeffDefault, ulong plainMod, int dbc, int noOfEvaluationKeys)
 {
     // Create encryption parameters.
     parms = new EncryptionParameters();
     parms.PolyModulus.Set(polyMod);
     parms.CoeffModulus.Set(ChooserEvaluator.DefaultParameterOptions[coeffDefault]);
     parms.PlainModulus.Set(plainMod);
     // Generate keys.
     generator = new KeyGenerator(parms);
     generator.Generate(noOfEvaluationKeys);     //Integer
     // Generator contains the keys
     publicKey      = generator.PublicKey;
     secretKey      = generator.SecretKey;
     evaluationKeys = generator.EvaluationKeys;
     // Create encoder (for encoding and decoding)
     encoder = new IntegerEncoder(parms.PlainModulus);        //Integer
     //Create Encryptor
     encryptor = new Encryptor(parms, publicKey);
     //Create Decryptor
     decryptor = new Decryptor(parms, secretKey);
     //Create Evaluator for arithmatic operations
     evaluator  = new Evaluator(parms);
     CrtBuilder = new PolyCRTBuilder(parms);
 }
        public void EncryptionParamsWriteReadNET()
        {
            // Create encryption parameters.
            var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());

            parms.SetDecompositionBitCount(4);
            parms.SetNoiseStandardDeviation(3.19);
            parms.SetNoiseMaxDeviation(35.06);

            var coeffModulus = new BigUInt(48);

            coeffModulus.Set("7FFFFC801");
            parms.SetCoeffModulus(coeffModulus);

            var plainModulus = new BigUInt(7);

            plainModulus.Set(1 << 6);
            parms.SetPlainModulus(plainModulus);

            var polyModulus = new BigPoly(65, 1);

            polyModulus[0].Set(1);
            polyModulus[64].Set(1);
            parms.SetPolyModulus(polyModulus);

            Assert.AreEqual(4, parms.DecompositionBitCount);
            Assert.AreEqual(3.19, parms.NoiseStandardDeviation);
            Assert.AreEqual(35.06, parms.NoiseMaxDeviation);
            Assert.AreEqual("7FFFFC801", parms.CoeffModulus.ToString());

            // Commented out due to dependence on the SEAL library #define DISABLE_NTT_IN_MULTIPLY
            //Assert.AreEqual("FFFFFFFFC001", parms.AuxCoeffModulus.ToString());

            Assert.AreEqual("40", parms.PlainModulus.ToString());
            Assert.AreEqual("1x^64 + 1", parms.PolyModulus.ToString());
        }
Example #22
0
        public void BigPoly3Coeff100BitsNET()
        {
            var poly = new BigPoly(3, 100);

            Assert.AreEqual(3, poly.CoeffCount);
            Assert.AreEqual(100, poly.CoeffBitCount);
            Assert.IsTrue(null != poly.Pointer);
            Assert.AreEqual(6, poly.UInt64Count);
            Assert.AreEqual(0, poly.GetSignificantCoeffCount());
            Assert.AreEqual("0", poly.ToString());
            Assert.IsTrue(poly.IsZero);
            Assert.AreEqual(0UL, poly.Pointer[0]);
            Assert.AreEqual(0UL, poly.Pointer[1]);
            Assert.AreEqual(0UL, poly.Pointer[2]);
            Assert.AreEqual(0UL, poly.Pointer[3]);
            Assert.AreEqual(0UL, poly.Pointer[4]);
            Assert.AreEqual(0UL, poly.Pointer[5]);

            poly[0].Set("1234");
            Assert.AreEqual("1234", poly[0].ToString());
            Assert.AreEqual(1, poly.GetSignificantCoeffCount());
            Assert.AreEqual("1234", poly.ToString());
            Assert.IsFalse(poly.IsZero);
            Assert.AreEqual(0x1234UL, poly.Pointer[0]);
            Assert.AreEqual(0UL, poly.Pointer[1]);
            Assert.AreEqual(0UL, poly.Pointer[2]);
            Assert.AreEqual(0UL, poly.Pointer[3]);
            Assert.AreEqual(0UL, poly.Pointer[4]);
            Assert.AreEqual(0UL, poly.Pointer[5]);

            poly[2].Set("3211234567812345678");
            Assert.AreEqual("3211234567812345678", poly[2].ToString());
            Assert.AreEqual(3, poly.GetSignificantCoeffCount());
            Assert.AreEqual("3211234567812345678x^2 + 1234", poly.ToString());
            Assert.IsFalse(poly.IsZero);
            Assert.AreEqual(0x1234UL, poly.Pointer[0]);
            Assert.AreEqual(0UL, poly.Pointer[1]);
            Assert.AreEqual(0UL, poly.Pointer[2]);
            Assert.AreEqual(0UL, poly.Pointer[3]);
            Assert.AreEqual(0x1234567812345678UL, poly.Pointer[4]);
            Assert.AreEqual(0x321UL, poly.Pointer[5]);

            poly.SetZero();
            Assert.IsTrue(poly.IsZero);
            Assert.AreEqual("0", poly.ToString());
            Assert.AreEqual(0UL, poly.Pointer[0]);
            Assert.AreEqual(0UL, poly.Pointer[1]);
            Assert.AreEqual(0UL, poly.Pointer[2]);
            Assert.AreEqual(0UL, poly.Pointer[3]);
            Assert.AreEqual(0UL, poly.Pointer[4]);
            Assert.AreEqual(0UL, poly.Pointer[5]);

            poly[0].Set("123");
            poly[1].Set("456");
            poly[2].Set("3211234567812345678");
            Assert.AreEqual("3211234567812345678x^2 + 456x^1 + 123", poly.ToString());
            Assert.AreEqual(3, poly.GetSignificantCoeffCount());
            Assert.AreEqual(0x123UL, poly.Pointer[0]);
            Assert.AreEqual(0UL, poly.Pointer[1]);
            Assert.AreEqual(0x456UL, poly.Pointer[2]);
            Assert.AreEqual(0UL, poly.Pointer[3]);
            Assert.AreEqual(0x1234567812345678UL, poly.Pointer[4]);
            Assert.AreEqual(0x321UL, poly.Pointer[5]);

            var poly2 = new BigPoly(3, 64);

            poly2[0].Set(1);
            poly2[1].Set(2);
            poly2[2].Set(3);
            Assert.IsFalse(poly.Equals(poly2));
            Assert.IsFalse(poly2.Equals(poly));
            Assert.AreNotEqual(poly.GetHashCode(), poly2.GetHashCode());
            poly.Set(poly2);
            Assert.IsTrue(poly.Equals(poly2));
            Assert.IsTrue(poly2.Equals(poly));
            Assert.AreEqual(poly.GetHashCode(), poly2.GetHashCode());
            Assert.AreEqual("3x^2 + 2x^1 + 1", poly.ToString());
            Assert.AreEqual(1UL, poly.Pointer[0]);
            Assert.AreEqual(0UL, poly.Pointer[1]);
            Assert.AreEqual(2UL, poly.Pointer[2]);
            Assert.AreEqual(0UL, poly.Pointer[3]);
            Assert.AreEqual(3UL, poly.Pointer[4]);
            Assert.AreEqual(0UL, poly.Pointer[5]);

            poly[0].Set("123");
            poly[1].Set("456");
            poly[2].Set("3211234567812345678");
            poly.Resize(3, 32);
            Assert.AreEqual(3, poly.CoeffCount);
            Assert.AreEqual(32, poly.CoeffBitCount);
            Assert.AreEqual(3, poly.UInt64Count);
            Assert.AreEqual("12345678x^2 + 456x^1 + 123", poly.ToString());
            Assert.AreEqual(0x123UL, poly.Pointer[0]);
            Assert.AreEqual(0x456UL, poly.Pointer[1]);
            Assert.AreEqual(0x12345678UL, poly.Pointer[2]);

            poly.Resize(4, 100);
            Assert.AreEqual(4, poly.CoeffCount);
            Assert.AreEqual(100, poly.CoeffBitCount);
            Assert.AreEqual("12345678x^2 + 456x^1 + 123", poly.ToString());
            Assert.AreEqual(0x123UL, poly.Pointer[0]);
            Assert.AreEqual(0UL, poly.Pointer[1]);
            Assert.AreEqual(0x456UL, poly.Pointer[2]);
            Assert.AreEqual(0UL, poly.Pointer[3]);
            Assert.AreEqual(0x12345678UL, poly.Pointer[4]);
            Assert.AreEqual(0UL, poly.Pointer[5]);
            Assert.AreEqual(0UL, poly.Pointer[6]);
            Assert.AreEqual(0UL, poly.Pointer[7]);

            poly.Resize(0, 0);
            Assert.AreEqual(0, poly.CoeffCount);
            Assert.AreEqual(0, poly.CoeffBitCount);
            Assert.AreEqual(0, poly.UInt64Count);
            Assert.IsTrue(null == poly.Pointer);
            Assert.AreEqual(0, poly.GetSignificantCoeffCount());
            Assert.IsTrue(poly.IsZero);
            Assert.IsFalse(poly.IsAlias);
            Assert.AreEqual("0", poly.ToString());
        }
Example #23
0
        public BigPolyArray GetEnc(BigPoly encoded)
        {
            var encrypted = encryptor.Encrypt(encoded);

            return(encrypted);
        }
Example #24
0
 internal BigPolyArray MultiplyPlain(BigPolyArray encrypted, BigPoly encoded)
 {
     return(evaluator.MultiplyPlain(encrypted, encoded));
 }
        public void BalancedEncodeDecodeInt32NET()
        {
            var modulus = new BigUInt("10000");
            var encoder = new BalancedEncoder(modulus, 3);

            var poly = encoder.Encode(0);

            Assert.AreEqual(0, poly.GetSignificantCoeffCount());
            Assert.IsTrue(poly.IsZero);
            Assert.AreEqual(0, encoder.DecodeInt32(poly));

            var poly1 = encoder.Encode(1);

            Assert.AreEqual(1, poly1.GetSignificantCoeffCount());
            Assert.AreEqual(modulus.BitCount, poly1.CoeffBitCount);
            Assert.AreEqual("1", poly1.ToString());
            Assert.AreEqual(1, encoder.DecodeInt32(poly1));

            var poly2 = encoder.Encode(2);

            Assert.AreEqual(2, poly2.GetSignificantCoeffCount());
            Assert.AreEqual(modulus.BitCount, poly2.CoeffBitCount);
            Assert.AreEqual("1x^1 + FFFF", poly2.ToString());
            Assert.AreEqual(2, encoder.DecodeInt32(poly2));

            var poly3 = encoder.Encode(3);

            Assert.AreEqual(2, poly3.GetSignificantCoeffCount());
            Assert.AreEqual(modulus.BitCount, poly3.CoeffBitCount);
            Assert.AreEqual("1x^1", poly3.ToString());
            Assert.AreEqual(3, encoder.DecodeInt32(poly3));

            var poly4 = encoder.Encode(-1);

            Assert.AreEqual(1, poly4.GetSignificantCoeffCount());
            Assert.AreEqual(modulus.BitCount, poly4.CoeffBitCount);
            Assert.AreEqual("FFFF", poly4.ToString());
            Assert.AreEqual(-1, encoder.DecodeInt32(poly4));

            var poly5 = encoder.Encode(-2);

            Assert.AreEqual(2, poly5.GetSignificantCoeffCount());
            Assert.AreEqual(modulus.BitCount, poly5.CoeffBitCount);
            Assert.AreEqual("FFFFx^1 + 1", poly5.ToString());
            Assert.AreEqual(-2, encoder.DecodeInt32(poly5));

            var poly6 = encoder.Encode(-3);

            Assert.AreEqual(2, poly6.GetSignificantCoeffCount());
            Assert.AreEqual(modulus.BitCount, poly6.CoeffBitCount);
            Assert.AreEqual("FFFFx^1", poly6.ToString());
            Assert.AreEqual(-3, encoder.DecodeInt32(poly6));

            var poly7 = encoder.Encode(-0x2671);

            Assert.AreEqual(9, poly7.GetSignificantCoeffCount());
            Assert.AreEqual(modulus.BitCount, poly7.CoeffBitCount);
            for (int i = 0; i < 9; ++i)
            {
                Assert.AreEqual("FFFF", poly7[i].ToString());
            }
            Assert.AreEqual(-0x2671, encoder.DecodeInt32(poly7));

            var poly8 = encoder.Encode(-4374);

            Assert.AreEqual(9, poly8.GetSignificantCoeffCount());
            Assert.AreEqual(modulus.BitCount, poly8.CoeffBitCount);
            Assert.AreEqual("FFFF", poly8[8].ToString());
            Assert.AreEqual("1", poly8[7].ToString());
            for (int i = 0; i < 7; ++i)
            {
                Assert.IsTrue(poly8[i].IsZero);
            }
            Assert.AreEqual(-4374, encoder.DecodeInt32(poly8));

            var poly9 = encoder.Encode(-0xD4EB);

            Assert.AreEqual(11, poly9.GetSignificantCoeffCount());
            Assert.AreEqual(modulus.BitCount, poly9.CoeffBitCount);
            for (int i = 0; i < 11; ++i)
            {
                if (i % 3 == 1)
                {
                    Assert.AreEqual("FFFF", poly9[i].ToString());
                }
                else if (i % 3 == 0)
                {
                    Assert.IsTrue(poly9[i].IsZero);
                }
                else
                {
                    Assert.AreEqual("1", poly9[i].ToString());
                }
            }
            Assert.AreEqual(-0xD4EB, encoder.DecodeInt32(poly9));

            var poly10 = encoder.Encode(-30724);

            Assert.AreEqual(11, poly10.GetSignificantCoeffCount());
            Assert.AreEqual(modulus.BitCount, poly10.CoeffBitCount);
            Assert.AreEqual("FFFF", poly10[10].ToString());
            Assert.AreEqual("1", poly10[9].ToString());
            Assert.AreEqual("1", poly10[8].ToString());
            Assert.AreEqual("1", poly10[7].ToString());
            Assert.IsTrue(poly10[6].IsZero);
            Assert.IsTrue(poly10[5].IsZero);
            Assert.AreEqual("FFFF", poly10[4].ToString());
            Assert.AreEqual("FFFF", poly10[3].ToString());
            Assert.IsTrue(poly10[2].IsZero);
            Assert.AreEqual("1", poly10[1].ToString());
            Assert.AreEqual("FFFF", poly10[0].ToString());
            Assert.AreEqual(-30724, encoder.DecodeInt32(poly10));

            modulus.Set("FFFF");
            var encoder2 = new BalancedEncoder(modulus, 7);
            var poly12   = new BigPoly(6, 16);

            poly12[0].Set(1);
            poly12[1].Set("FFFE"); // -1
            poly12[2].Set("FFFD"); // -2
            poly12[3].Set("8000"); // -32767
            poly12[4].Set("7FFF"); // 32767
            poly12[5].Set("7FFE"); // 32766
            Assert.AreEqual(1 + -1 * 7 + -2 * 49 + -32767 * 343 + 32767 * 2401 + 32766 * 16807, encoder2.DecodeInt32(poly12));
        }
        public void BinaryEncodeDecodeInt32NET()
        {
            var modulus = new BigUInt("FFFFFFFFFFFFFFFF");
            var encoder = new BinaryEncoder(modulus);

            var poly = encoder.Encode(0);

            Assert.AreEqual(0, poly.GetSignificantCoeffCount());
            Assert.IsTrue(poly.IsZero);
            Assert.AreEqual(0, encoder.DecodeInt32(poly));

            var poly1 = encoder.Encode(1);

            Assert.AreEqual(1, poly1.GetSignificantCoeffCount());
            Assert.AreEqual(1, poly1.CoeffBitCount);
            Assert.AreEqual("1", poly1.ToString());
            Assert.AreEqual(1, encoder.DecodeInt32(poly1));

            var poly2 = encoder.Encode(2);

            Assert.AreEqual(2, poly2.GetSignificantCoeffCount());
            Assert.AreEqual(1, poly2.CoeffBitCount);
            Assert.AreEqual("1x^1", poly2.ToString());
            Assert.AreEqual(2, encoder.DecodeInt32(poly2));

            var poly3 = encoder.Encode(3);

            Assert.AreEqual(2, poly3.GetSignificantCoeffCount());
            Assert.AreEqual(1, poly3.CoeffBitCount);
            Assert.AreEqual("1x^1 + 1", poly3.ToString());
            Assert.AreEqual(3, encoder.DecodeInt32(poly3));

            var poly4 = encoder.Encode(-1);

            Assert.AreEqual(1, poly4.GetSignificantCoeffCount());
            Assert.AreEqual(64, poly4.CoeffBitCount);
            Assert.AreEqual("FFFFFFFFFFFFFFFE", poly4.ToString());
            Assert.AreEqual(-1, encoder.DecodeInt32(poly4));

            var poly5 = encoder.Encode(-2);

            Assert.AreEqual(2, poly5.GetSignificantCoeffCount());
            Assert.AreEqual(64, poly5.CoeffBitCount);
            Assert.AreEqual("FFFFFFFFFFFFFFFEx^1", poly5.ToString());
            Assert.AreEqual(-2, encoder.DecodeInt32(poly5));

            var poly6 = encoder.Encode(-3);

            Assert.AreEqual(2, poly6.GetSignificantCoeffCount());
            Assert.AreEqual(64, poly6.CoeffBitCount);
            Assert.AreEqual("FFFFFFFFFFFFFFFEx^1 + FFFFFFFFFFFFFFFE", poly6.ToString());
            Assert.AreEqual(-3, encoder.DecodeInt32(poly6));

            var poly7 = encoder.Encode(0x7FFFFFFF);

            Assert.AreEqual(31, poly7.GetSignificantCoeffCount());
            Assert.AreEqual(1, poly7.CoeffBitCount);
            for (int i = 0; i < 31; ++i)
            {
                Assert.AreEqual("1", poly7[i].ToString());
            }
            Assert.AreEqual(0x7FFFFFFF, encoder.DecodeInt32(poly7));

            var poly8 = encoder.Encode(unchecked ((int)0x80000000));

            Assert.AreEqual(32, poly8.GetSignificantCoeffCount());
            Assert.AreEqual(64, poly8.CoeffBitCount);
            Assert.AreEqual("FFFFFFFFFFFFFFFE", poly8[31].ToString());
            for (int i = 0; i < 31; ++i)
            {
                Assert.IsTrue(poly8[i].IsZero);
            }
            Assert.AreEqual(unchecked ((int)0x80000000), encoder.DecodeInt32(poly8));

            var poly9 = encoder.Encode(0x80F02);

            Assert.AreEqual(20, poly9.GetSignificantCoeffCount());
            Assert.AreEqual(1, poly9.CoeffBitCount);
            for (int i = 0; i < 20; ++i)
            {
                if (i == 19 || (i >= 8 && i <= 11) || i == 1)
                {
                    Assert.AreEqual("1", poly9[i].ToString());
                }
                else
                {
                    Assert.IsTrue(poly9[i].IsZero);
                }
            }
            Assert.AreEqual(0x80F02, encoder.DecodeInt32(poly9));

            var poly10 = encoder.Encode(-1073);

            Assert.AreEqual(11, poly10.GetSignificantCoeffCount());
            Assert.AreEqual(64, poly10.CoeffBitCount);
            Assert.AreEqual("FFFFFFFFFFFFFFFE", poly10[10].ToString());
            Assert.IsTrue(poly10[9].IsZero);
            Assert.IsTrue(poly10[8].IsZero);
            Assert.IsTrue(poly10[7].IsZero);
            Assert.IsTrue(poly10[6].IsZero);
            Assert.AreEqual("FFFFFFFFFFFFFFFE", poly10[5].ToString());
            Assert.AreEqual("FFFFFFFFFFFFFFFE", poly10[4].ToString());
            Assert.IsTrue(poly10[3].IsZero);
            Assert.IsTrue(poly10[2].IsZero);
            Assert.IsTrue(poly10[1].IsZero);
            Assert.AreEqual("FFFFFFFFFFFFFFFE", poly10[0].ToString());
            Assert.AreEqual(-1073, encoder.DecodeInt32(poly10));

            modulus.Set("FFFF");
            var encoder2 = new BinaryEncoder(modulus);
            var poly11   = new BigPoly(6, 64);

            poly11[0].Set(1);
            poly11[1].Set("FFFE"); // -1
            poly11[2].Set("FFFD"); // -2
            poly11[3].Set("8000"); // -32767
            poly11[4].Set("7FFF"); // 32767
            poly11[5].Set("7FFE"); // 32766
            Assert.AreEqual(1 + -1 * 2 + -2 * 4 + -32767 * 8 + 32767 * 16 + 32766 * 32, encoder2.DecodeInt32(poly11));
        }
        public void BalancedEncodeDecodeUInt32NET()
        {
            var modulus = new BigUInt("10000");
            var encoder = new BalancedEncoder(modulus, 3);

            var poly = encoder.Encode(0U);

            Assert.AreEqual(0, poly.GetSignificantCoeffCount());
            Assert.IsTrue(poly.IsZero);
            Assert.AreEqual(0U, encoder.DecodeUInt32(poly));

            var poly1 = encoder.Encode(1U);

            Assert.AreEqual(1, poly1.GetSignificantCoeffCount());
            Assert.AreEqual(modulus.BitCount, poly1.CoeffBitCount);
            Assert.AreEqual("1", poly1.ToString());
            Assert.AreEqual(1U, encoder.DecodeUInt32(poly1));

            var poly2 = encoder.Encode(2U);

            Assert.AreEqual(2, poly2.GetSignificantCoeffCount());
            Assert.AreEqual(modulus.BitCount, poly2.CoeffBitCount);
            Assert.AreEqual("1x^1 + FFFF", poly2.ToString());
            Assert.AreEqual(2U, encoder.DecodeUInt32(poly2));

            var poly3 = encoder.Encode(3U);

            Assert.AreEqual(2, poly3.GetSignificantCoeffCount());
            Assert.AreEqual(modulus.BitCount, poly3.CoeffBitCount);
            Assert.AreEqual("1x^1", poly3.ToString());
            Assert.AreEqual(3U, encoder.DecodeUInt32(poly3));

            var poly4 = encoder.Encode(0x2671U);

            Assert.AreEqual(9, poly4.GetSignificantCoeffCount());
            Assert.AreEqual(modulus.BitCount, poly4.CoeffBitCount);
            for (int i = 0; i < 9; ++i)
            {
                Assert.IsTrue("1" == poly4[i].ToString());
            }
            Assert.AreEqual(0x2671U, encoder.DecodeUInt32(poly4));

            var poly5 = encoder.Encode(0xD4EBU);

            Assert.AreEqual(11, poly5.GetSignificantCoeffCount());
            Assert.AreEqual(modulus.BitCount, poly5.CoeffBitCount);
            for (int i = 0; i < 11; ++i)
            {
                if (i % 3 == 1)
                {
                    Assert.AreEqual("1", poly5[i].ToString());
                }
                else if (i % 3 == 0)
                {
                    Assert.IsTrue(poly5[i].IsZero);
                }
                else
                {
                    Assert.AreEqual("FFFF", poly5[i].ToString());
                }
            }
            Assert.AreEqual(0xD4EBU, encoder.DecodeUInt32(poly5));

            var poly6 = new BigPoly(3, 10);

            poly6[0].Set(1);
            poly6[1].Set(500);
            poly6[2].Set(1023);
            Assert.AreEqual(1U + 500 * 3 + 1023 * 9, encoder.DecodeUInt32(poly6));

            var encoder2 = new BalancedEncoder(modulus, 7);
            var poly7    = new BigPoly(4, 16);

            poly7[0].Set(123);    // 123   (*1)
            poly7[1].Set("FFFF"); // -1 (*7)
            poly7[2].Set(511);    // 511  (*49)
            poly7[3].Set(1);      // 1    (*343)
            Assert.AreEqual((UInt32)(123 + -1 * 7 + 511 * 49 + 1 * 343), encoder2.DecodeUInt32(poly7));
        }
        public void GetQualifiersNET()
        {
            {
                var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());
                parms.SetDecompositionBitCount(4);
                parms.SetNoiseStandardDeviation(3.19);
                parms.SetNoiseMaxDeviation(35.06);

                var coeffModulus = new BigUInt(48);
                coeffModulus.Set("FFFFFFFFC001");
                parms.SetCoeffModulus(coeffModulus);

                var plainModulus = new BigUInt(7);
                plainModulus.Set(1 << 6);
                parms.SetPlainModulus(plainModulus);

                var polyModulus = new BigPoly(65, 1);
                polyModulus[0].Set(1);
                polyModulus[64].Set(1);
                parms.SetPolyModulus(polyModulus);

                parms.Validate();

                var qualifiers = parms.Qualifiers;
                Assert.IsTrue(qualifiers.ParametersSet);
                Assert.IsTrue(qualifiers.EnableRelinearization);
                Assert.IsTrue(qualifiers.EnableNussbaumer);
                Assert.IsTrue(qualifiers.EnableNTT);

                // Commented out due to dependence on the SEAL library #define DISABLE_NTT_IN_MULTIPLY
                //Assert.IsTrue(qualifiers.EnableNTTInMultiply);

                Assert.IsFalse(qualifiers.EnableBatching);
            }

            {
                var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());
                parms.SetDecompositionBitCount(4);
                parms.SetNoiseStandardDeviation(3.19);
                parms.SetNoiseMaxDeviation(35.06);

                var coeffModulus = new BigUInt(48);
                coeffModulus.Set("FFFFFFFFC001");
                parms.SetCoeffModulus(coeffModulus);

                var plainModulus = new BigUInt(7);
                plainModulus.Set(1 << 6);
                parms.SetPlainModulus(plainModulus);

                var polyModulus = new BigPoly(64, 1);
                polyModulus[0].Set(1);
                polyModulus[63].Set(1);
                parms.SetPolyModulus(polyModulus);

                parms.Validate();

                var qualifiers = parms.Qualifiers;
                Assert.IsFalse(qualifiers.ParametersSet);
                Assert.IsFalse(qualifiers.EnableRelinearization);
                Assert.IsFalse(qualifiers.EnableNussbaumer);
                Assert.IsFalse(qualifiers.EnableNTT);

                // Commented out due to dependence on the SEAL library #define DISABLE_NTT_IN_MULTIPLY
                //Assert.IsFalse(qualifiers.EnableNTTInMultiply);

                Assert.IsFalse(qualifiers.EnableBatching);
            }

            {
                var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());
                parms.SetDecompositionBitCount(4);
                parms.SetNoiseStandardDeviation(3.19);
                parms.SetNoiseMaxDeviation(35.06);

                var coeffModulus = new BigUInt(48);
                coeffModulus.Set("0");
                parms.SetCoeffModulus(coeffModulus);

                var plainModulus = new BigUInt(7);
                plainModulus.Set(1 << 6);
                parms.SetPlainModulus(plainModulus);

                var polyModulus = new BigPoly(65, 1);
                polyModulus[0].Set(1);
                polyModulus[64].Set(1);
                parms.SetPolyModulus(polyModulus);

                parms.Validate();

                var qualifiers = parms.Qualifiers;
                Assert.IsFalse(qualifiers.ParametersSet);
                Assert.IsFalse(qualifiers.EnableRelinearization);
                Assert.IsFalse(qualifiers.EnableNussbaumer);
                Assert.IsFalse(qualifiers.EnableNTT);

                // Commented out due to dependence on the SEAL library #define DISABLE_NTT_IN_MULTIPLY
                //Assert.IsFalse(qualifiers.EnableNTTInMultiply);

                Assert.IsFalse(qualifiers.EnableBatching);
            }

            {
                var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());
                parms.SetDecompositionBitCount(0);
                parms.SetNoiseStandardDeviation(3.19);
                parms.SetNoiseMaxDeviation(35.06);

                var coeffModulus = new BigUInt(48);
                coeffModulus.Set("FFFFFFFFC001");
                parms.SetCoeffModulus(coeffModulus);

                var plainModulus = new BigUInt(7);
                plainModulus.Set(1 << 6);
                parms.SetPlainModulus(plainModulus);

                var polyModulus = new BigPoly(65, 1);
                polyModulus[0].Set(1);
                polyModulus[64].Set(1);
                parms.SetPolyModulus(polyModulus);

                parms.Validate();

                var qualifiers = parms.Qualifiers;
                Assert.IsTrue(qualifiers.ParametersSet);
                Assert.IsFalse(qualifiers.EnableRelinearization);
                Assert.IsTrue(qualifiers.EnableNussbaumer);
                Assert.IsTrue(qualifiers.EnableNTT);

                // Commented out due to dependence on the SEAL library #define DISABLE_NTT_IN_MULTIPLY
                //Assert.IsTrue(qualifiers.EnableNTTInMultiply);

                Assert.IsFalse(qualifiers.EnableBatching);
            }

            {
                var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());
                parms.SetDecompositionBitCount(4);
                parms.SetNoiseStandardDeviation(-3.19);
                parms.SetNoiseMaxDeviation(35.06);

                var coeffModulus = new BigUInt(48);
                coeffModulus.Set("7FFFFC801");
                parms.SetCoeffModulus(coeffModulus);

                var plainModulus = new BigUInt(7);
                plainModulus.Set(1 << 6);
                parms.SetPlainModulus(plainModulus);

                var polyModulus = new BigPoly(65, 1);
                polyModulus[0].Set(1);
                polyModulus[64].Set(1);
                parms.SetPolyModulus(polyModulus);

                parms.Validate();

                var qualifiers = parms.Qualifiers;
                Assert.IsFalse(qualifiers.ParametersSet);
                Assert.IsFalse(qualifiers.EnableRelinearization);
                Assert.IsFalse(qualifiers.EnableNussbaumer);
                Assert.IsFalse(qualifiers.EnableNTT);

                // Commented out due to dependence on the SEAL library #define DISABLE_NTT_IN_MULTIPLY
                //Assert.IsFalse(qualifiers.EnableNTTInMultiply);

                Assert.IsFalse(qualifiers.EnableBatching);
            }

            {
                var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());
                parms.SetDecompositionBitCount(0);
                parms.SetNoiseStandardDeviation(3.19);
                parms.SetNoiseMaxDeviation(35.06);

                var coeffModulus = new BigUInt(48);
                coeffModulus.Set("7FFFFC801");
                parms.SetCoeffModulus(coeffModulus);

                var plainModulus = new BigUInt(7);
                plainModulus.Set(1 << 6);
                parms.SetPlainModulus(plainModulus);

                var polyModulus = new BigPoly(65, 1);
                polyModulus[0].Set(1);
                polyModulus[64].Set(1);
                parms.SetPolyModulus(polyModulus);

                parms.Validate();

                var qualifiers = parms.Qualifiers;
                Assert.IsTrue(qualifiers.ParametersSet);
                Assert.IsFalse(qualifiers.EnableRelinearization);
                Assert.IsTrue(qualifiers.EnableNussbaumer);
                Assert.IsTrue(qualifiers.EnableNTT);

                // Commented out due to dependence on the SEAL library #define DISABLE_NTT_IN_MULTIPLY
                //Assert.IsFalse(qualifiers.EnableNTTInMultiply);

                Assert.IsFalse(qualifiers.EnableBatching);
            }

            {
                var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());
                parms.SetDecompositionBitCount(0);
                parms.SetNoiseStandardDeviation(3.19);
                parms.SetNoiseMaxDeviation(35.06);

                var coeffModulus = new BigUInt(48);
                coeffModulus.Set("7FFFFFFFF");
                parms.SetCoeffModulus(coeffModulus);

                var plainModulus = new BigUInt(7);
                plainModulus.Set(1 << 6);
                parms.SetPlainModulus(plainModulus);

                var polyModulus = new BigPoly(65, 1);
                polyModulus[0].Set(1);
                polyModulus[64].Set(1);
                parms.SetPolyModulus(polyModulus);

                parms.Validate();

                var qualifiers = parms.Qualifiers;
                Assert.IsTrue(qualifiers.ParametersSet);
                Assert.IsFalse(qualifiers.EnableRelinearization);
                Assert.IsTrue(qualifiers.EnableNussbaumer);
                Assert.IsFalse(qualifiers.EnableNTT);

                // Commented out due to dependence on the SEAL library #define DISABLE_NTT_IN_MULTIPLY
                //Assert.IsFalse(qualifiers.EnableNTTInMultiply);

                Assert.IsFalse(qualifiers.EnableBatching);
            }

            {
                var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());
                parms.SetDecompositionBitCount(0);
                parms.SetNoiseStandardDeviation(3.19);
                parms.SetNoiseMaxDeviation(35.06);

                var coeffModulus = new BigUInt(48);
                coeffModulus.Set("7FFFFFFFF");
                parms.SetCoeffModulus(coeffModulus);

                var plainModulus = new BigUInt(7);
                plainModulus.Set(12289);
                parms.SetPlainModulus(plainModulus);

                var polyModulus = new BigPoly(65, 1);
                polyModulus[0].Set(1);
                polyModulus[64].Set(1);
                parms.SetPolyModulus(polyModulus);

                parms.Validate();

                var qualifiers = parms.Qualifiers;
                Assert.IsTrue(qualifiers.ParametersSet);
                Assert.IsFalse(qualifiers.EnableRelinearization);
                Assert.IsTrue(qualifiers.EnableNussbaumer);
                Assert.IsFalse(qualifiers.EnableNTT);

                // Commented out due to dependence on the SEAL library #define DISABLE_NTT_IN_MULTIPLY
                //Assert.IsFalse(qualifiers.EnableNTTInMultiply);

                Assert.IsTrue(qualifiers.EnableBatching);
            }
        }
        public void BinaryEncodeDecodeUInt64NET()
        {
            var modulus = new BigUInt("FFFFFFFFFFFFFFFF");
            var encoder = new BinaryEncoder(modulus);

            var poly = encoder.Encode(0UL);

            Assert.AreEqual(0, poly.GetSignificantCoeffCount());
            Assert.IsTrue(poly.IsZero);
            Assert.AreEqual(0UL, encoder.DecodeUInt64(poly));

            var poly1 = encoder.Encode(1UL);

            Assert.AreEqual(1, poly1.GetSignificantCoeffCount());
            Assert.AreEqual(1, poly1.CoeffBitCount);
            Assert.AreEqual("1", poly1.ToString());
            Assert.AreEqual(1UL, encoder.DecodeUInt64(poly1));

            var poly2 = encoder.Encode(2UL);

            Assert.AreEqual(2, poly2.GetSignificantCoeffCount());
            Assert.AreEqual(1, poly2.CoeffBitCount);
            Assert.AreEqual("1x^1", poly2.ToString());
            Assert.AreEqual(2UL, encoder.DecodeUInt64(poly2));

            var poly3 = encoder.Encode(3UL);

            Assert.AreEqual(2, poly3.GetSignificantCoeffCount());
            Assert.AreEqual(1, poly3.CoeffBitCount);
            Assert.AreEqual("1x^1 + 1", poly3.ToString());
            Assert.AreEqual(3UL, encoder.DecodeUInt64(poly3));

            var poly4 = encoder.Encode(0xFFFFFFFFFFFFFFFFUL);

            Assert.AreEqual(64, poly4.GetSignificantCoeffCount());
            Assert.AreEqual(1, poly4.CoeffBitCount);
            for (int i = 0; i < 64; ++i)
            {
                Assert.AreEqual("1", poly4[i].ToString());
            }
            Assert.AreEqual(0xFFFFFFFFFFFFFFFFUL, encoder.DecodeUInt64(poly4));

            var poly5 = encoder.Encode(0x80F02UL);

            Assert.AreEqual(20, poly5.GetSignificantCoeffCount());
            Assert.AreEqual(1, poly5.CoeffBitCount);
            for (int i = 0; i < 20; ++i)
            {
                if (i == 19 || (i >= 8 && i <= 11) || i == 1)
                {
                    Assert.AreEqual("1", poly5[i].ToString());
                }
                else
                {
                    Assert.IsTrue(poly5[i].IsZero);
                }
            }
            Assert.AreEqual(0x80F02UL, encoder.DecodeUInt64(poly5));

            var poly6 = new BigPoly(3, 10);

            poly6[0].Set(1);
            poly6[1].Set(500);
            poly6[2].Set(1023);
            Assert.AreEqual((1UL + 500 * 2 + 1023 * 4), encoder.DecodeUInt64(poly6));

            modulus.Set(1024);
            var encoder2 = new BinaryEncoder(modulus);
            var poly7    = new BigPoly(4, 10);

            poly7[0].Set(1023); // -1   (*1)
            poly7[1].Set(512);  // -512 (*2)
            poly7[2].Set(511);  // 511  (*4)
            poly7[3].Set(1);    // 1    (*8)
            Assert.AreEqual((ulong)(-1 + -512 * 2 + 511 * 4 + 1 * 8), encoder2.DecodeUInt64(poly7));
        }
Example #30
0
        public void FVEncryptDecryptNET()
        {
            var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew());

            parms.SetDecompositionBitCount(4);
            parms.SetNoiseStandardDeviation(3.19);
            parms.SetNoiseMaxDeviation(35.06);

            var coeffModulus = new BigUInt(48);

            coeffModulus.Set("FFFFFFFFC001");
            parms.SetCoeffModulus(coeffModulus);

            var plainModulus = new BigUInt(7);

            plainModulus.Set(1 << 6);
            parms.SetPlainModulus(plainModulus);

            var polyModulus = new BigPoly(65, 1);

            polyModulus[0].Set(1);
            polyModulus[64].Set(1);
            parms.SetPolyModulus(polyModulus);

            parms.Validate();

            var Encoder = new BinaryEncoder(parms.PlainModulus, MemoryPoolHandle.AcquireNew());

            var keygen = new KeyGenerator(parms, MemoryPoolHandle.AcquireNew());

            keygen.Generate();

            var encryptor = new Encryptor(parms, keygen.PublicKey, MemoryPoolHandle.AcquireNew());

            Assert.AreEqual(encryptor.PublicKey[0], keygen.PublicKey[0]);
            Assert.AreEqual(encryptor.PublicKey[1], keygen.PublicKey[1]);

            var decryptor = new Decryptor(parms, keygen.SecretKey, MemoryPoolHandle.AcquireNew());

            Assert.AreEqual(decryptor.SecretKey, keygen.SecretKey);

            var encrypted = encryptor.Encrypt(Encoder.Encode(0x12345678));

            Assert.AreEqual(0x12345678U, Encoder.DecodeUInt32(decryptor.Decrypt(encrypted)));

            encrypted = encryptor.Encrypt(Encoder.Encode(0));
            Assert.AreEqual(0U, Encoder.DecodeUInt32(decryptor.Decrypt(encrypted)));

            encrypted = encryptor.Encrypt(Encoder.Encode(1));
            Assert.AreEqual(1U, Encoder.DecodeUInt32(decryptor.Decrypt(encrypted)));

            encrypted = encryptor.Encrypt(Encoder.Encode(2));
            Assert.AreEqual(2U, Encoder.DecodeUInt32(decryptor.Decrypt(encrypted)));

            encrypted = encryptor.Encrypt(Encoder.Encode(0x7FFFFFFFFFFFFFFDUL));
            Assert.AreEqual(0x7FFFFFFFFFFFFFFDUL, Encoder.DecodeUInt64(decryptor.Decrypt(encrypted)));

            encrypted = encryptor.Encrypt(Encoder.Encode(0x7FFFFFFFFFFFFFFEUL));
            Assert.AreEqual(0x7FFFFFFFFFFFFFFEUL, Encoder.DecodeUInt64(decryptor.Decrypt(encrypted)));

            encrypted = encryptor.Encrypt(Encoder.Encode(0x7FFFFFFFFFFFFFFFUL));
            Assert.AreEqual(0x7FFFFFFFFFFFFFFFUL, Encoder.DecodeUInt64(decryptor.Decrypt(encrypted)));
        }