Example #1
0
 public void TestDecodeDigitPairs()
 {
     Z3Provider solver = new Z3Provider();
     var st = BekConverter.BekFileToSTb(solver, sampleDir + "bek/DecodeDigitPairs.bek");
     //st.ShowGraph();
     var f1 = st.Explore();                        //convert to SFT by exploring the register
     //f1.ToCSt("../../../src/Bek.Query.Tests/DecodeDigitPairs.cs", "", "Experiments", "DecodeDigitPairs");
     //f1.ToDot("../../../src/Bek.Query.Tests/DecodeDigitPairs.dot");
     //f1.ShowGraph();
     var f = f1.ToST();
     var fof = f + f;                             //functional composition
     bool idempotent = f.Eq1(fof);                //check idempotence
     if (!idempotent)
     {
         var w = f.Diff(fof);                     //find a witness where f and fof differ
         string input = w.Input.StringValue;      // e.g. "5555"
         string output1 = w.Output1.StringValue;  // e.g. f("5555") == "77"
         string output2 = w.Output2.StringValue;  // e.g. f(f("5555")) == "M"
         Console.WriteLine("not idempotent, witness: {0}, {1}, {2}", input, output1, output2);
     }
     else
     {
         Console.WriteLine("idempotent");
     }
 }
Example #2
0
 public void TestSFTwithPC()
 {
     var solver = new Z3Provider();
     var d      = System.Environment.CurrentDirectory;
     var stb    = BekConverter.BekFileToSTb(solver, sampleDir + "bek/decode.bek").ExploreBools();
     //stb.ShowGraph(10);
 }
Example #3
0
        //[TestMethod]
        public void TestCssEncode5()
        {
            var solver = new Z3Provider();
            var stb    = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode5.bek");
            //stb.Explore().ShowGraph();
            var st = stb.ToST();
            //st.ShowGraph(10);
            var sft = st.Explore();
            //sft.ShowGraph(10);

            //just to get longer input strings
            var restr = sft.RestrictDomain("(.){3,}$");

            restr.Simplify();
            //restr.ShowGraph(10);

            restr.AssertTheory();

            Expr inputConst  = solver.MkFreshConst("input", sft.InputListSort);
            Expr outputConst = solver.MkFreshConst("output", sft.OutputListSort);

            solver.MainSolver.Assert(restr.MkAccept(inputConst, outputConst));

            int okCnt     = 0;
            int error0Cnt = 0;
            int error1Cnt = 0;

            //validate correctness for some values against the actual CssEncode
            //TBD: validate also exceptional behavior
            int K = 10;

            for (int i = 0; i < K; i++)
            {
                var    model  = solver.MainSolver.GetModel(solver.True, inputConst, outputConst);
                string input  = model[inputConst].StringValue;
                string output = model[outputConst].StringValue;

                Assert.IsFalse(string.IsNullOrEmpty(input));
                Assert.IsFalse(string.IsNullOrEmpty(output));
                if ((input != ""))
                {
                    char lastChar = '\0'; //output[output.Length - 1];

                    try
                    {
                        var output_expected = System.Web.Security.AntiXss.AntiXssEncoder.CssEncode(input);
                        Assert.AreEqual <string>(output_expected, output);
                        okCnt += 1;
                    }
                    catch (Exception)
                    {
                        Assert.AreEqual <char>('\0', lastChar);
                        error0Cnt += 1;
                    }
                }
                //exclude this solution, before picking the next one
                solver.MainSolver.Assert(solver.MkNeq(inputConst, model[inputConst].Value));
            }
            Assert.AreEqual(K, okCnt);
        }
Example #4
0
 public void TestDecodeDigitPairsDotGen()
 {
     Z3Provider solver = new Z3Provider();
     var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/DecodeDigitPairs.bek");
     stb.ToDot("DecodeDigitPairs.dot");
     var sft = stb.Explore();
     sft.ToDot("DecodeDigitPairs_F.dot");
 }
Example #5
0
 public void TestCssEncodeBekRoundtrip()
 {
     Z3Provider solver = new Z3Provider();
     var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode.bek");
     var sb = new StringBuilder();
     stb.ToBek(sb);
     var stb2 = BekConverter.BekToSTb(solver, sb.ToString());
     CheckFullEquivalence(stb, stb2);
 }
Example #6
0
 public void TestCssEncodeDomainDotGen()
 {
     Z3Provider solver = new Z3Provider();
     var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode.bek");
     var sfa = stb.ToST().ToSFA().Determinize().Minimize();
     Assert.AreEqual<int>(2, sfa.StateCount);
     sfa.SaveAsDot("CssEncode_Dom.dot");
     //sfa.ShowGraph();
 }
Example #7
0
 public void TestHtmlDecode()
 {
     int        k      = 3134 % 100;
     int        foo    = 0xff41;
     Z3Provider solver = new Z3Provider();
     var        stb    = BekConverter.BekFileToSTb(solver, sampleDir + "bek/HtmlDecode.bek");
     var        st     = stb.ExploreBools().ToST();
     //st.ShowGraph();
 }
Example #8
0
 public void TestCssEncodeCSgen()
 {
     Z3Provider solver = new Z3Provider();
     var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode.bek");
     stb.ToCS("CssEncode.cs", "Test", "CssEncode", false, true);
     var st1 = stb.ExploreBools();
     st1.ToCS("CssEncode_B.cs", "Test", "CssEncode_B", false, true);
     var sft = stb.Explore();
     sft.ToCS("CssEncode_F.cs", "Test", "CssEncode_F", false, true);
 }
Example #9
0
 public void TestCssEncodeDotGen()
 {
     Z3Provider solver = new Z3Provider();
     var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode.bek");
     stb.ToDot(15, "CssEncode.dot");
     var st1 = stb.ExploreBools();
     st1.ToDot(15, "CssEncode_B.dot");
     var sft = stb.Explore();
     sft.ToDot(15, "CssEncode_F.dot");
 }
Example #10
0
        public void TestBitsBug()
        {
            Z3Provider solver = new Z3Provider();
            var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/BitsBug.bek");
            var sft = stb; // stb.Explore();

            var bitsbug = stb.Compile("Microsoft.Bek.Tests", "BitsBug", true);

            int c = 15;
            int k = ((1 + (c & 7)) & 3);
            string res = bitsbug.Apply(((char)c).ToString());
            Assert.AreEqual<int>(1, res.Length);
            Assert.AreEqual<int>(k, (int)res[0]);
        }
Example #11
0
        public void TestExploreBools()
        {
            var solver = new Z3Provider();
            var stb5   = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode5.bek");
            var stb6   = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode4.bek");
            //stb6.ShowGraph(10);
            var fst6 = stb6.ExploreBools();
            //fst6.ShowGraph();
            var fst5 = stb5.ExploreBools();

            //fst5.ShowGraph();
            //fst5.Name = "CssEncode5";
            //fst5.ShowGraph(20);
            CheckFullEquivalence(fst5.ToST(), fst6.ToST());
        }
Example #12
0
        public void TestUTF8DecodeDomain()
        {
            Z3Provider solver = new Z3Provider();
            var dec = BekConverter.BekFileToSTb(solver, sampleDir + "bek/UTF8Decode.bek").ToST();
            var decDom = dec.ToSFA();
            //decDom.ShowGraph();

            var one = @"[\x00-\x7F]";
            var two = @"[\xC2-\xDF][\x80-\xBF]";
            var thr = @"(\xE0[\xA0-\xBF]|\xED[\x80-\x9F]|[\xE1-\xEC\xEE\xEF][\x80-\xBF])[\x80-\xBF]";
            var fou = @"(\xF0[\x90-\xBF]|[\xF1-\xF3][\x80-\xBF]|\xF4[\x80-\x8F])[\x80-\xBF]{2}";
            var regex = string.Format("^(({0})|({1})|({2})|({3}))*$", one, two, thr, fou);

            var aut = solver.RegexConverter.Convert(regex);
            //solver.CharSetProvider.ShowGraph(solver.CharSetProvider.Convert(regex).Minimize(solver.CharSetProvider), "temp");
            var sfa = new SFAModel(solver, solver.CharacterSort, aut);
            //sfa.ShowGraph();

            bool equiv = aut.IsEquivalentWith(decDom.Automaton, solver);
            Assert.IsTrue(equiv);

        }
Example #13
0
        public void TestCssEncode4eq5()
        {
            var solver = new Z3Provider();
            var stb5   = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode5.bek");
            var stb4   = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode4.bek");
            //stb5.ShowGraph(10);
            var  fst4 = stb4.ToST().Explore();
            var  fst5 = stb5.ToST().Explore();
            var  dom4 = fst4.ToSFA();
            var  dom5 = fst5.ToSFA();
            bool dom4_subsetof_dom5 = dom4.IsSubsetOf(dom5);
            //var tmp = dom4.Minus(dom5);
            //tmp.ShowGraph();
            //var member = new List<Expr>(tmp.ChoosePathToSomeFinalState()).ToArray();
            //var str = new String(Array.ConvertAll(member, m => solver.GetCharValue(solver.FindOneMember(m).Value)));

            bool dom5_subsetof_dom4 = dom5.IsSubsetOf(dom4);
            bool partial_equiv      = fst4.Eq1(fst5);

            Assert.IsTrue(dom4_subsetof_dom5);
            Assert.IsTrue(partial_equiv);
            Assert.IsTrue(dom5_subsetof_dom4);
        }
Example #14
0
        //[TestMethod]
        public void TestUTF8Encode()
        {
            Z3Provider solver = new Z3Provider();
            var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/UTF8Encode.bek");
            var tmp = stb.ToST();
            var sft = stb.Explore();
            var sft1 = sft.ToST();
            //sft.ShowGraph();
            //sft1.SaveAsDot("C:/tmp/dot/utf8encode.dot");

            #region data for the popl paper
            var st = sft.ToST();
            int n = st.StateCount;
            var moves = new List<Move<Rule<Expr>>>(st.GetMoves());
            moves.RemoveAll(x => x.Label.IsFinal);
            int m = moves.Count;
            int t = System.Environment.TickCount;
            var st_o_st = st + st;
            int n1 = st_o_st.StateCount;
            var moves1 = new List<Move<Rule<Expr>>>(st_o_st.GetMoves());
            moves1.RemoveAll(y => y.Label.IsFinal);
            int m1 = moves1.Count;
            bool diff = st.Eq1(st_o_st);
            t = System.Environment.TickCount - t;
            #endregion

            var restr = sft.ToST().RestrictDomain(".+");
            restr.AssertTheory();

            Expr inputConst = solver.MkFreshConst("input", restr.InputListSort);
            Expr outputConst = solver.MkFreshConst("output", restr.OutputListSort);

            solver.MainSolver.Assert(restr.MkAccept(inputConst, outputConst));

            //validate correctness for some values against the actual UTF8Encode
            //TBD: validate also exceptional behavior, when the generated code throws an exception 
            //the builtin one must contain the character 0xFFFD
            int K = 50;
            for (int i = 0; i < K; i++)
            {
                var model = solver.MainSolver.GetModel(solver.True, inputConst, outputConst);
                string input = model[inputConst].StringValue;
                string output = model[outputConst].StringValue;

                Assert.IsFalse(string.IsNullOrEmpty(input));
                Assert.IsFalse(string.IsNullOrEmpty(output));

                byte[] encoding = Encoding.UTF8.GetBytes(input);
                char[] chars = Array.ConvertAll(encoding, b => (char)b);
                string output_expected = new String(chars);
                string output_generated = UTF8Encode_F.Apply(input);
                string output_generated2 = UTF8Encode.Apply(input);
                string output_generated3 = UTF8Encode_B.Apply(input);

                Assert.AreEqual<string>(output_expected, output_generated);

                Assert.AreEqual<string>(output_expected, output_generated2);

                Assert.AreEqual<string>(output_expected, output_generated3);

                Assert.AreEqual<string>(output_expected, output);

                //exclude this solution, before picking the next one
                solver.MainSolver.Assert(solver.MkNeq(inputConst, model[inputConst].Value));
            }
        }
Example #15
0
        //[TestMethod]
        public void TestUTF8Decode()
        {
            Z3Provider solver = new Z3Provider();
            var dec = BekConverter.BekFileToSTb(solver, sampleDir + "bek/UTF8Decode.bek").ToST().ExploreBools();
            var enc = BekConverter.BekFileToSTb(solver, sampleDir + "bek/UTF8Encode.bek").ToST().Explore();
            var id = STModel.MkId(solver, solver.CharacterSort);
            //var id = BekConverter.BekFileToSTb(solver, sampleDir + "bek/identity.bek").ToST();
            var ed = enc + dec; //first encode then decode
            var de = dec + enc; //first decode then encode
            ed.Simplify();
            //ed.ShowGraph(10);
            //ed.ShowGraph(5);
            //return;
            //id.ShowGraph();
            //de.ShowGraph(5);

            int timeE = System.Environment.TickCount;
            var encF = enc.Explore();
            timeE = System.Environment.TickCount - timeE;

            int timeD = System.Environment.TickCount;
            var decF = dec.Explore();
            timeD = System.Environment.TickCount - timeD;
            decF.Simplify();

            Console.WriteLine(timeE);
            Console.WriteLine(timeD);

            var encRuleCnt = encF.MoveCount;
            var decRuleCnt = decF.MoveCount;

            var tmp =  new Dictionary<Expr,int>();
            int m = 0;
            //foreach (var move in decF.GetMoves())
            //{
            //    int k = 0;
            //    if (move.Condition.IsFinal && move.Condition.Guard.Equals(solver.True))
            //        k = 1;
            //    else if (!tmp.TryGetValue(move.Condition.Guard, out k))
            //    {

            //        foreach (var v in solver.FindAllMembers(move.Condition.Guard))
            //            k += 1;
            //        tmp[move.Condition.Guard] = k;
            //    }
            //    m += k;
            //}

            //var dec_filtered = dec.RestrictDomain(@"^[^\xE0\xED\xF0\xF4]*$");
            //dec_filtered.ShowGraph(5);
            //var dec_filtered_e = dec_filtered.Explore();
            //int stateCount = dec_filtered_e.StateCount;
            //int moveCount = dec_filtered_e.MoveCount;

            string utf16 = @"^([\0-\uD7FF\uE000-\uFFFF]|([\uD800-\uDBFF][\uDC00-\uDFFF]))*$";

            var one = @"[\x00-\x7F]";
            var two = @"[\xC2-\xDF][\x80-\xBF]";
            var thr = @"(\xE0[\xA0-\xBF]|\xED[\x80-\x9F]|[\xE1-\xEC\xEE\xEF][\x80-\xBF])[\x80-\xBF]";
            var fou = @"(\xF0[\x90-\xBF]|[\xF1-\xF3][\x80-\xBF]|\xF4[\x80-\x8F])[\x80-\xBF]{2}";
            var utf8 = string.Format("^(({0})|({1})|({2})|({3}))*$", one, two, thr, fou);

            var UTF_8 = new SFAModel(solver, solver.CharacterSort, solver.RegexConverter.Convert(utf8).Determinize(solver).MinimizeHopcroft(solver));

            //UTF_8.ShowGraph();

            //var F0 = new SFAModel(solver, solver.CharacterSort, solver.RegexConverter.Convert("^(\xF0[\0-\uFFFF]{3})*$").Determinize(solver).Minimize(solver));

            //var decF0 = dec.RestrictDomain(F0);

            //var decF0_E = decF0.Explore();

            //var surr = @"^([\uD800-\uDBFF][\uDC00-\uDFFF])*$";

            //var ed_surr = ed.RestrictDomain(surr);
            //ed_surr.Simplify();
            //ed_surr.ShowGraph(10);

            //F0.ShowGraph();

            //ed_F0.ShowGraph(5);




            //var decE = dec.Explore();

            //dec.STb.ShowGraph();
            //enc.STb.ShowGraph();

            var decDom = dec.ToSFA();
            
            var edDom = ed.ToSFA();
            var eDom = enc.ToSFA();


            var UTF_16 = solver.RegexConverter.Convert(utf16);

            int timeDEdom = System.Environment.TickCount;
            var deDom = de.ToSFA();
            bool equivDomDE = UTF_8.Automaton.IsEquivalentWith(deDom.Automaton, solver);
            timeDEdom = System.Environment.TickCount - timeDEdom;
            Console.WriteLine(timeDEdom);
            

            bool equivDom = UTF_16.IsEquivalentWith(edDom.Automaton, solver);
            Assert.IsTrue(equivDom);
            bool equivDom2 = UTF_16.IsEquivalentWith(eDom.Automaton, solver);
            Assert.IsTrue(equivDom2);

            int time0 = System.Environment.TickCount;

            bool equiv0 = id.Eq1(ed);

            time0 = System.Environment.TickCount - time0;

            int time1 = System.Environment.TickCount;

            bool equiv1 = id.Eq1(de);

            time1 = System.Environment.TickCount - time1;

            Assert.IsTrue(equiv1);
            Assert.IsTrue(equiv0);

            int time = System.Environment.TickCount;

            bool equiv = id.Eq1(ed);

            time = System.Environment.TickCount - time;

            Console.WriteLine(time);

            Assert.IsTrue(equiv);
        }