package fuzion24.device.vulnerability.vulnerabilities.helper;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.util.Base64;

import java.io.File;
import java.security.MessageDigest;
import java.util.HashSet;
import java.util.Scanner;

import fuzion24.device.vulnerability.util.SharedPreferencesUtils;

/**
 * Created by fuzion24 on 12/4/15.
 */
public class DeviceUpdateChecker {
    public static boolean wasDeviceUpdated(Context ctx){

        /*
            Take a hash of the build.prop and /proc/version
            If this changes, assume the device has been updated
        */
        String buildPropFile = readFile("/system/build.prop");
        String procVersion   = readFile("/proc/version");

        String fingerprint = hashString(buildPropFile + procVersion);
        String lastFingerprint = SharedPreferencesUtils.getBuildUpdateFingerprint(ctx);
        if(fingerprint.equals(lastFingerprint)){
            return false;
        } else {
            SharedPreferencesUtils.setBuildUpdateFingerPrint(ctx, fingerprint);
            return true;
        }
    }

    private static String hashString(String data){
        try {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(data.getBytes());
            byte[] hash = md.digest();
            return Base64.encodeToString(hash, Base64.DEFAULT);
        } catch (Exception e) {
            return "";
        }
    }

    private static String readFile(String filename){
        try {
            return new Scanner(new File(filename)).useDelimiter("\\Z").next();
        }catch(Exception e){
            return "";
        }
    }

}

Add a class with our hueristics to check if a device was updated