diff --git a/app/src/main/cpp/monerujo.cpp b/app/src/main/cpp/monerujo.cpp index fac7c3b..ee0e5e1 100644 --- a/app/src/main/cpp/monerujo.cpp +++ b/app/src/main/cpp/monerujo.cpp @@ -698,18 +698,23 @@ Java_com_m2049r_xmrwallet_model_Wallet_isSynchronized(JNIEnv *env, jobject insta //void cn_slow_hash(const void *data, size_t length, char *hash); // from crypto/hash-ops.h JNIEXPORT jbyteArray JNICALL Java_com_m2049r_xmrwallet_util_KeyStoreHelper_slowHash(JNIEnv *env, jobject clazz, - jbyteArray data, jboolean broken) { + jbyteArray data, jint brokenVariant) { char hash[HASH_SIZE]; jsize size = env->GetArrayLength(data); - if (broken && (size < 200 /*sizeof(union hash_state)*/)) { + if ((brokenVariant > 0) && (size < 200 /*sizeof(union hash_state)*/)) { return nullptr; } jbyte *buffer = env->GetByteArrayElements(data, NULL); - if (broken) { - slow_hash_broken(buffer, hash); - } else { - slow_hash(buffer, (size_t) size, hash); + switch (brokenVariant) { + case 1: + slow_hash_broken(buffer, hash, 1); + break; + case 2: + slow_hash_broken(buffer, hash, 0); + break; + default: // not broken + slow_hash(buffer, (size_t) size, hash); } env->ReleaseByteArrayElements(data, buffer, JNI_ABORT); // do not update java byte[] jbyteArray result = env->NewByteArray(HASH_SIZE); diff --git a/app/src/main/cpp/monerujo.h b/app/src/main/cpp/monerujo.h index 24295fd..60483c8 100644 --- a/app/src/main/cpp/monerujo.h +++ b/app/src/main/cpp/monerujo.h @@ -66,8 +66,8 @@ inline void slow_hash(const void *data, const size_t length, char *hash) { cn_slow_hash(data, length, hash, 0 /* variant */, 0/*prehashed*/); } -inline void slow_hash_broken(const void *data, char *hash) { - cn_slow_hash(data, 200 /*sizeof(union hash_state)*/, hash, 1 /* variant */, 1 /*prehashed*/); +inline void slow_hash_broken(const void *data, char *hash, int variant) { + cn_slow_hash(data, 200 /*sizeof(union hash_state)*/, hash, variant, 1 /*prehashed*/); } #ifdef __cplusplus diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java index 596e8c0..fed1bb8 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java @@ -361,10 +361,16 @@ public class Helper { return crazyPass; } - // or maybe it is a broken CrAzYpass? - String brokenCrazyPass = KeyStoreHelper.getBrokenCrazyPass(context, password); - if (WalletManager.getInstance().verifyWalletPassword(walletPath, brokenCrazyPass, true)) { - return brokenCrazyPass; + // or maybe it is a broken CrAzYpass? (of which we have two variants) + String brokenCrazyPass2 = KeyStoreHelper.getBrokenCrazyPass(context, password, 2); + if ((brokenCrazyPass2 != null) + && WalletManager.getInstance().verifyWalletPassword(walletPath, brokenCrazyPass2, true)) { + return brokenCrazyPass2; + } + String brokenCrazyPass1 = KeyStoreHelper.getBrokenCrazyPass(context, password, 1); + if ((brokenCrazyPass1 != null) + && WalletManager.getInstance().verifyWalletPassword(walletPath, brokenCrazyPass1, true)) { + return brokenCrazyPass1; } return null; diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/KeyStoreHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/KeyStoreHelper.java index 1a666c9..6db0631 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/KeyStoreHelper.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/KeyStoreHelper.java @@ -61,17 +61,17 @@ public class KeyStoreHelper { System.loadLibrary("monerujo"); } - public static native byte[] slowHash(byte[] data, boolean broken); + public static native byte[] slowHash(byte[] data, int brokenVariant); static final private String RSA_ALIAS = "MonerujoRSA"; - private static String getCrazyPass(Context context, String password, boolean broken) { + private static String getCrazyPass(Context context, String password, int brokenVariant) { byte[] data = password.getBytes(StandardCharsets.UTF_8); byte[] sig = null; try { KeyStoreHelper.createKeys(context, RSA_ALIAS); sig = KeyStoreHelper.signData(RSA_ALIAS, data); - byte[] hash = slowHash(sig, broken); + byte[] hash = slowHash(sig, brokenVariant); if (hash == null) { throw new IllegalStateException("Slow Hash is null!"); } @@ -84,19 +84,16 @@ public class KeyStoreHelper { } public static String getCrazyPass(Context context, String password) { - return getCrazyPass(context, password, false); + return getCrazyPass(context, password, 0); } - public static String getBrokenCrazyPass(Context context, String password) { + public static String getBrokenCrazyPass(Context context, String password, int brokenVariant) { // due to a link bug in the initial implementation, some crazypasses were built with // prehash & variant == 1 // since there are wallets out there, we need to keep this here - - // arm32 variant code is broken in monero-core - // (raises "signal 7 (SIGBUS), code 1 (BUS_ADRALN)" in cn_slow_hash()) - if (isArm32()) return ""; - - return getCrazyPass(context, password, true); + // yes, it's a mess + if (isArm32() && (brokenVariant != 2)) return null; + return getCrazyPass(context, password, brokenVariant); } private static Boolean isArm32 = null;