Skip to content

Commit

Permalink
deal with all broken variants (#292)
Browse files Browse the repository at this point in the history
* remove variant code for arm32

* deal with all broken variants
  • Loading branch information
m2049r authored May 25, 2018
1 parent 22c5a54 commit 271cd2d
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 23 deletions.
17 changes: 11 additions & 6 deletions app/src/main/cpp/monerujo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/cpp/monerujo.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 10 additions & 4 deletions app/src/main/java/com/m2049r/xmrwallet/util/Helper.java
Original file line number Diff line number Diff line change
Expand Up @@ -361,10 +361,16 @@ static public String getWalletPassword(Context context, String walletName, Strin
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;
Expand Down
19 changes: 8 additions & 11 deletions app/src/main/java/com/m2049r/xmrwallet/util/KeyStoreHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -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!");
}
Expand All @@ -84,19 +84,16 @@ private static String getCrazyPass(Context context, String password, boolean bro
}

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;
Expand Down

0 comments on commit 271cd2d

Please sign in to comment.