Пример #1
0
 // [TestMethod]
 public void DecodeDecode()
 {
     Z3Provider solver = new Z3Provider();
     var A = BekConverter.BekToSTb(solver, BekConverter.BekFileToBekProgram(sampleDir + "bek/Base64decode.bek")).ExploreBools().ToST();
     var ID = ST<FuncDecl, Expr, Sort>.MkId(solver, solver.CharSort);
     var st = A.Compose(A);
     //st.ShowGraph();
     var sfa1 = st.ToSFA().Automaton;
     var sfa = ConvertToAutomatonOverBvSet(solver, sfa1).Determinize(solver.CharSetProvider).MinimizeHopcroft(solver.CharSetProvider);
     //solver.CharSetProvider.ShowGraph(sfa, "test");
 }
Пример #2
0
        public void TestBase64Decode()
        {
            Z3Provider solver = new Z3Provider();
            var        bek    = BekConverter.BekFileToBekProgram(sampleDir + "bek/Base64decode.bek");
            var        st     = BekConverter.BekToSTb(solver, bek).ExploreBools().ToST();

            st.Simplify();
            //st.ShowGraph();
            var st0 = st.RestrictDomain(@"^([AB]{3})*$");
            //st0.ShowGraph();
            var st1 = st0.Explore();
            //st1.Simplify();
            //st1.ShowGraph();
            //st.ToDot("c:/tmp/b64d.dot");
            var sft = st.Explore();
            var Q   = sft.StateCount;
            int M   = 0;
            int F   = 0;
            int tot = 0;
            var tmp = new Dictionary <Expr, int>();

            foreach (var m in sft.GetMoves())
            {
                if (m.Label.IsFinal)
                {
                    F   += 1;
                    tot += 1;
                }
                else
                {
                    M += 1;
                    int k = 0;
                    if (tmp.TryGetValue(m.Label.Guard, out k))
                    {
                        tot += k;
                    }
                    else
                    {
                        foreach (var v in solver.MainSolver.FindAllMembers(m.Label.Guard))
                        {
                            k += 1;
                        }
                        tot += k;
                        tmp[m.Label.Guard] = k;
                    }
                }
            }
            Console.WriteLine(tot);


            Assert.AreEqual <int>(87, Q);
        }