PackageInfo info =getPackageManager().getPackageInfo(getPackageName(), 0); Signature[] signatures = info.signatures;
const char* rsa = "PUT_YOUR_RSA_KEY_HERE"; jint verifyCertificate(JNIEnv *env, jobject obj, jobject cnt) { jclass cls = env->GetObjectClass(cnt); jmethodID mid = env->GetMethodID(cls, "getPackageManager", "()Landroid/content/pm/PackageManager;"); jmethodID pnid = env->GetMethodID(cls, "getPackageName", "()Ljava/lang/String;"); if (mid == 0 || pnid == 0) { return ERROR; } jobject pacMan_o = env->CallObjectMethod(cnt, mid); jclass pacMan = env->GetObjectClass(pacMan_o); jstring packName = (jstring) env->CallObjectMethod(cnt, pnid); /*flags = PackageManager.GET_SIGNATURES*/ int flags = 0x40; mid = env->GetMethodID(pacMan, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;"); if (mid == 0) { return ERROR; } jobject pack_inf_o = (jobject) env->CallObjectMethod(pacMan_o, mid, packName, flags); jclass packinf = env->GetObjectClass(pack_inf_o); jfieldID fid; fid = env->GetFieldID(packinf, "signatures", "[Landroid/content/pm/Signature;"); jobjectArray signatures = (jobjectArray) env->GetObjectField(pack_inf_o, fid); jobject signature0 = env->GetObjectArrayElement(signatures, 0); mid = env->GetMethodID(env->GetObjectClass(signature0), "toByteArray", "()[B"); jbyteArray cert = (jbyteArray) env->CallObjectMethod(signature0, mid); if (cert == 0) { return ERROR; } jclass BAIS = env->FindClass("java/io/ByteArrayInputStream"); if (BAIS == 0) { return ERROR; } mid = env->GetMethodID(BAIS, "<init>", "([B)V"); if (mid == 0) { return ERROR; } jobject input = env->NewObject(BAIS, mid, cert); jclass CF = env->FindClass("java/security/cert/CertificateFactory"); mid = env->GetStaticMethodID(CF, "getInstance", "(Ljava/lang/String;)Ljava/security/cert/CertificateFactory;"); jstring X509 = env->NewStringUTF("X509"); jobject cf = env->CallStaticObjectMethod(CF, mid, X509); if (cf == 0) { return ERROR; } //"java/security/cert/X509Certificate" mid = env->GetMethodID(CF, "generateCertificate", "(Ljava/io/InputStream;)Ljava/security/cert/Certificate;"); if (mid == 0) { return ERROR; } jobject c = env->CallObjectMethod(cf, mid, input); if (c == 0) { return ERROR; } jclass X509Cert = env->FindClass("java/security/cert/X509Certificate"); mid = env->GetMethodID(X509Cert, "getPublicKey", "()Ljava/security/PublicKey;"); jobject pk = env->CallObjectMethod(c, mid); if (pk == 0) { return ERROR; } mid = env->GetMethodID(env->GetObjectClass(pk), "toString", "()Ljava/lang/String;"); if (mid == 0) { return ERROR; } jstring all = (jstring) env->CallObjectMethod(pk, mid); const char * all_char = env->GetStringUTFChars(all, NULL); char * out = NULL; if (all_char != NULL) { char * startString = strstr(all_char, "modulus:"); char * end = strstr(all_char, "public exponent"); bool isJB = false; if (startString == NULL) { //4.1.x startString = strstr(all_char, "modulus="); end = strstr(all_char, ",publicExponent"); isJB = true; } if (startString != NULL && end != NULL) { int len; if (isJB) { startString += strlen("modulus="); len = end - startString; } else { startString += strlen("modulus:"); len = end - startString - 5; /* -5 for new lines*/ } out = new char[len + 2]; strncpy(out, startString, len); out[len] = '\0'; } } env->ReleaseStringUTFChars(all, all_char); char * is_found = strstr(out, rsa); // if (IS_DEBUG) { return is_found != NULL ? 0 : 1; } else { return is_found != NULL ? 1 :0; } }
public class YourClass { static { System.loadLibrary("name_of_library"); } public native int getSomeValue(); public native void init(Context ctx); }
jint isCertCorrect = 0; JNIEXPORT void JNICALL Java_com_your_package_YourClass_init(JNIEnv *env, jobject obj, jobject ctx) { isCertCorrect = verifyCertificate(env, obj, ctx); } JNIEXPORT jint JNICALL Java_com_your_package_YourClass_getSomeValue(JNIEnv *env, jobject obj) { if (isCertCorrect ) { // } else { // }
Source: https://habr.com/ru/post/179487/
All Articles