Skip to content

Instantly share code, notes, and snippets.

@Laymer
Forked from AdiD253/libnative-lib.cpp
Created January 28, 2019 20:39
Show Gist options
  • Save Laymer/816546bf4d4b96d22e4174b63c913052 to your computer and use it in GitHub Desktop.
Save Laymer/816546bf4d4b96d22e4174b63c913052 to your computer and use it in GitHub Desktop.
bool checkCert(JNIEnv *env, jobject contextObject) {
jclass contextTemp = env->FindClass("android/content/Context");
jclass contextClass = (jclass) env->NewGlobalRef(contextTemp);
jmethodID getPackageManager = env->GetMethodID(contextClass,
"getPackageManager",
"()Landroid/content/pm/PackageManager;");
jobject share = (jobject) env->CallObjectMethod(contextObject, getPackageManager);
jmethodID getPackageName = env->GetMethodID(contextClass, "getPackageName",
"()Ljava/lang/String;");
jstring packageName = (jstring) env->CallObjectMethod(contextObject, getPackageName);
jclass clazz = env->FindClass("android/content/pm/PackageManager");
jfieldID GET_SIGNATURESfid = env->GetStaticFieldID(clazz, "GET_SIGNATURES", "I");
jint GET_SIGNATURES = env->GetStaticIntField(clazz, GET_SIGNATURESfid);
jclass PackageManagerObj = (jclass) env->NewGlobalRef(clazz);
jmethodID getPackageInfoId = env->GetMethodID(PackageManagerObj, "getPackageInfo",
"(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
jobject getPackageInfoObject = (jobject) env->CallObjectMethod(share, getPackageInfoId,
packageName, GET_SIGNATURES);
jclass packageInfoClass = env->FindClass("android/content/pm/PackageInfo");
jfieldID signatures = env->GetFieldID(packageInfoClass, "signatures",
"[Landroid/content/pm/Signature;");
jobjectArray rows = reinterpret_cast<jobjectArray>(
env->GetObjectField(getPackageInfoObject, signatures));
int size = env->GetArrayLength(rows);
jclass signaturesClass = env->FindClass("android/content/pm/Signature");
jclass mEssage = env->FindClass("java/security/MessageDigest");
jclass MessageDigestClass = (jclass) env->NewGlobalRef(mEssage);
jmethodID mGetInstance = env->GetStaticMethodID(MessageDigestClass, "getInstance",
"(Ljava/lang/String;)Ljava/security/MessageDigest;");
jmethodID updateMethod = env->GetMethodID(MessageDigestClass, "update", "([B)V");
jmethodID toByteArrayMethod = env->GetMethodID(signaturesClass, "toByteArray", "()[B");
jclass tempBase64 = env->FindClass("android/util/Base64");
jclass Base64Class = (jclass) env->NewGlobalRef(tempBase64);
jmethodID encodeToStringID = env->GetStaticMethodID(Base64Class, "encodeToString",
"([BI)Ljava/lang/String;");
jmethodID digest = env->GetMethodID(MessageDigestClass, "digest", "()[B");
for (int i = 0; i < size; i++) {
jobject messageDigest = env->CallStaticObjectMethod(MessageDigestClass, mGetInstance,
env->NewStringUTF("SHA"));
jobject signature = env->GetObjectArrayElement(rows, i);
env->CallVoidMethod(messageDigest, updateMethod,
(jbyteArray) env->CallObjectMethod(signature, toByteArrayMethod));
jstring signedCert = (jstring) env->CallStaticObjectMethod(Base64Class, encodeToStringID,
env->CallObjectMethod(messageDigest, digest),
(jint) 0);
std::string signedCertStr = jstring2string(env, signedCert);
std::string referenceCert = "yourReleaseSigningCertificate";
return signedCertStr == referenceCert;
}
return false;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment