// [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"); }
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); }