diff --git a/build.py b/build.py index f813ad8b0..db2098475 100755 --- a/build.py +++ b/build.py @@ -395,22 +395,6 @@ def build_stub(args): build_apk(args, 'stub') -def build_snet(args): - header('* Building snet extension') - proc = execv([gradlew, 'snet:assembleRelease']) - if proc.returncode != 0: - error('Build snet extention failed!') - source = op.join('snet', 'build', 'outputs', 'apk', - 'release', 'snet-release-unsigned.apk') - target = op.join(config['outdir'], 'snet.jar') - # Extract classes.dex - with zipfile.ZipFile(target, 'w', compression=zipfile.ZIP_DEFLATED, allowZip64=False) as zout: - with zipfile.ZipFile(source) as zin: - zout.writestr('classes.dex', zin.read('classes.dex')) - rm(source) - header('Output: ' + target) - - def zip_main(args): header('* Packing Flashable Zip') @@ -629,10 +613,6 @@ stub_parser = subparsers.add_parser( 'stub', help='build stub Magisk Manager') stub_parser.set_defaults(func=build_stub) -snet_parser = subparsers.add_parser( - 'snet', help='build snet extention for Magisk Manager') -snet_parser.set_defaults(func=build_snet) - zip_parser = subparsers.add_parser( 'zip', help='zip Magisk into a flashable zip') zip_parser.set_defaults(func=zip_main) diff --git a/settings.gradle b/settings.gradle index fda1b71b5..3d9f4590a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':signing', ':native', ':snet', ':stub', ':shared' +include ':app', ':signing', ':native', ':stub', ':shared' diff --git a/snet/.gitignore b/snet/.gitignore deleted file mode 100644 index 796b96d1c..000000000 --- a/snet/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/snet/build.gradle b/snet/build.gradle deleted file mode 100644 index 37e6be2c0..000000000 --- a/snet/build.gradle +++ /dev/null @@ -1,23 +0,0 @@ -apply plugin: 'com.android.application' - -android { - defaultConfig { - applicationId 'com.topjohnwu.snet' - minSdkVersion 14 - versionCode 13 - versionName 'snet' - } - - buildTypes { - release { - minifyEnabled true - shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.google.android.gms:play-services-safetynet:17.0.0' -} diff --git a/snet/proguard-rules.pro b/snet/proguard-rules.pro deleted file mode 100644 index 934fdf271..000000000 --- a/snet/proguard-rules.pro +++ /dev/null @@ -1,29 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile - --keep,allowobfuscation class com.topjohnwu.snet.SafetyNetHelper --keepclassmembers class com.topjohnwu.snet.SafetyNetHelper { - ** get(...); -} - --repackageclasses 'x' --allowaccessmodification diff --git a/snet/src/main/AndroidManifest.xml b/snet/src/main/AndroidManifest.xml deleted file mode 100644 index 4fa18362e..000000000 --- a/snet/src/main/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/snet/src/main/java/com/topjohnwu/snet/SafetyNetHelper.java b/snet/src/main/java/com/topjohnwu/snet/SafetyNetHelper.java deleted file mode 100644 index 351b5f4f4..000000000 --- a/snet/src/main/java/com/topjohnwu/snet/SafetyNetHelper.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.topjohnwu.snet; - -import android.content.Context; -import android.util.Base64; -import android.util.Log; - -import androidx.annotation.NonNull; - -import com.google.android.gms.common.ConnectionResult; -import com.google.android.gms.common.GoogleApiAvailability; -import com.google.android.gms.common.api.ApiException; -import com.google.android.gms.safetynet.SafetyNet; -import com.google.android.gms.safetynet.SafetyNetApi; -import com.google.android.gms.safetynet.SafetyNetClient; -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.security.SecureRandom; - -public class SafetyNetHelper implements InvocationHandler, - OnSuccessListener, OnFailureListener { - - private static final int RESPONSE_ERR = 0x01; - private static final int CONNECTION_FAIL = 0x02; - private static final int BASIC_PASS = 0x10; - private static final int CTS_PASS = 0x20; - - private static final GoogleApiAvailability API_AVAIL = GoogleApiAvailability.getInstance(); - private static final SecureRandom RANDOM = new SecureRandom(); - private static final String TAG = "SNET"; - - private final Context context; - private final Object callback; - - public static Object get(Class interfaceClass, Context context, Object cb) { - return Proxy.newProxyInstance(SafetyNetHelper.class.getClassLoader(), - new Class[]{interfaceClass}, new SafetyNetHelper(context, cb)); - } - - private SafetyNetHelper(Context c, Object cb) { - context = c; - callback = cb; - } - - private void invokeCallback(int code) { - Class clazz = callback.getClass(); - try { - clazz.getMethod("onResponse", int.class).invoke(callback, code); - } catch (Exception ignored) { - } - } - - /* Return magic API key here :) */ - private String getApiKey() { - return ""; - } - - private int getVersion() { - return BuildConfig.VERSION_CODE; - } - - private void attest() { - int code = API_AVAIL.isGooglePlayServicesAvailable(context); - if (code != ConnectionResult.SUCCESS) { - Log.e(TAG, API_AVAIL.getErrorString(code)); - invokeCallback(CONNECTION_FAIL); - return; - } - // Create nonce - byte[] nonce = new byte[24]; - RANDOM.nextBytes(nonce); - - SafetyNetClient client = SafetyNet.getClient(context); - client.attest(nonce, getApiKey()).addOnSuccessListener(this).addOnFailureListener(this); - } - - @Override - public void onSuccess(SafetyNetApi.AttestationResponse result) { - int code = 0; - try { - String jsonStr = new String(Base64.decode( - result.getJwsResult().split("\\.")[1], Base64.DEFAULT)); - JSONObject json = new JSONObject(jsonStr); - code |= json.getBoolean("ctsProfileMatch") ? CTS_PASS : 0; - code |= json.getBoolean("basicIntegrity") ? BASIC_PASS : 0; - } catch (JSONException e) { - code = RESPONSE_ERR; - } - - // Return results - invokeCallback(code); - } - - @Override - public void onFailure(@NonNull Exception e) { - if (e instanceof ApiException) { - int errCode = ((ApiException) e).getStatusCode(); - Log.e(TAG, API_AVAIL.getErrorString(errCode)); - } else { - Log.e(TAG, "Unknown: " + e); - } - invokeCallback(CONNECTION_FAIL); - } - - @Override - public Object invoke(Object proxy, Method method, Object[] args) { - switch (method.getName()) { - case "attest": - attest(); - break; - case "getVersion": - return getVersion(); - } - return null; - } -}