All Downloads are FREE. Search and download functionalities are using the official Maven repository.

crypto.extractparameter.transformation.Transformation Maven / Gradle / Ivy

package crypto.extractparameter.transformation;

import boomerang.BackwardQuery;
import boomerang.Boomerang;
import boomerang.ForwardQuery;
import boomerang.results.BackwardBoomerangResults;
import boomerang.scene.AllocVal;
import boomerang.scene.ControlFlowGraph;
import boomerang.scene.Statement;
import boomerang.scene.Val;
import crypto.extractparameter.ExtractParameterDefinition;
import crypto.extractparameter.ExtractParameterOptions;
import crypto.extractparameter.scope.IntVal;
import crypto.extractparameter.scope.LongVal;
import crypto.extractparameter.scope.StringVal;
import java.util.Collection;
import java.util.HashSet;
import java.util.Optional;
import wpds.impl.Weight;

public abstract class Transformation {

    private final ExtractParameterDefinition definition;

    public Transformation(ExtractParameterDefinition definition) {
        this.definition = definition;
    }

    public abstract Optional evaluateExpression(Statement statement);

    protected Optional extractStringFromVal(Statement statement, Val val) {
        Optional forwardQuery = triggerBackwardQuery(statement, val);

        if (forwardQuery.isEmpty()) {
            return Optional.empty();
        }

        return extractStringFromBoomerangResult(forwardQuery.get());
    }

    protected Optional extractStringFromBoomerangResult(ForwardQuery query) {
        Statement statement = query.cfgEdge().getStart();

        if (!statement.isAssign()) {
            return Optional.empty();
        }

        Val rightOp = statement.getRightOp();
        if (!rightOp.isStringConstant()) {
            return Optional.empty();
        }

        return Optional.of(rightOp.getStringValue());
    }

    protected Optional extractLongFromVal(Statement statement, Val val) {
        Optional forwardQuery = triggerBackwardQuery(statement, val);

        if (forwardQuery.isEmpty()) {
            return Optional.empty();
        }

        return extractLongFromBoomerangResult(forwardQuery.get());
    }

    protected Optional extractLongFromBoomerangResult(ForwardQuery query) {
        Statement statement = query.cfgEdge().getStart();

        if (!statement.isAssign()) {
            return Optional.empty();
        }

        Val rightOp = statement.getRightOp();
        if (!rightOp.isLongConstant()) {
            return Optional.empty();
        }

        return Optional.of(rightOp.getLongValue());
    }

    protected Optional triggerBackwardQuery(Statement statement, Val val) {
        Collection extractedValues = new HashSet<>();

        Collection preds =
                statement.getMethod().getControlFlowGraph().getPredsOf(statement);
        for (Statement pred : preds) {
            ControlFlowGraph.Edge edge = new ControlFlowGraph.Edge(pred, statement);

            ExtractParameterOptions options = new ExtractParameterOptions(definition);
            BackwardQuery backwardQuery = BackwardQuery.make(edge, val);
            Boomerang boomerang =
                    new Boomerang(
                            definition.getCallGraph(), definition.getDataFlowScope(), options);

            BackwardBoomerangResults results = boomerang.solve(backwardQuery);
            extractedValues.addAll(results.getAllocationSites().keySet());
        }

        // If we have multiple allocation sites, then we cannot correctly evaluate an expression
        if (extractedValues.size() != 1) {
            return Optional.empty();
        }

        ForwardQuery forwardQuery = extractedValues.stream().iterator().next();
        return Optional.of(forwardQuery);
    }

    protected AllocVal createTransformedAllocVal(String string, Statement statement) {
        Val leftOp = statement.getLeftOp();
        Val resultOp = new StringVal(string, statement.getMethod());

        return new TransformedAllocVal(leftOp, statement, resultOp);
    }

    protected AllocVal createTransformedAllocVal(int intValue, Statement statement) {
        Val leftOp = statement.getLeftOp();
        Val resultOp = new IntVal(intValue, statement.getMethod());

        return new TransformedAllocVal(leftOp, statement, resultOp);
    }

    protected AllocVal createTransformedAllocVal(long longValue, Statement statement) {
        Val leftOp = statement.getLeftOp();
        Val resultOp = new LongVal(longValue, statement.getMethod());

        return new TransformedAllocVal(leftOp, statement, resultOp);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy