From 1a21a43f05b73fda7dfd7f5902e1cbc27413a7ba Mon Sep 17 00:00:00 2001 From: Hardcore Sushi Date: Wed, 29 Jun 2022 22:01:05 +0200 Subject: [PATCH] Gocryptfs JNI cleanup --- app/src/main/native/gocryptfs_jni.c | 121 +++++++--------------------- 1 file changed, 29 insertions(+), 92 deletions(-) diff --git a/app/src/main/native/gocryptfs_jni.c b/app/src/main/native/gocryptfs_jni.c index e5dfd3e..d834158 100644 --- a/app/src/main/native/gocryptfs_jni.c +++ b/app/src/main/native/gocryptfs_jni.c @@ -5,30 +5,6 @@ #include #include "libgocryptfs.h" -void wipe(char* data, const unsigned int len){ - for (unsigned int i=0; iGetArrayLength(env, jpassword); - char* password = (char*)(*env)->GetByteArrayElements(env, jpassword, NULL); + jbyte* password = (*env)->GetByteArrayElements(env, jpassword, NULL); GoSlice go_password = {password, password_len, password_len}; size_t returned_hash_len; - jbyte* jbyte_returned_hash; - unsigned char* returned_hash; + jbyte* returned_hash; GoSlice go_returned_hash = {NULL, 0, 0}; if (!(*env)->IsSameObject(env, jreturned_hash, NULL)) { returned_hash_len = (*env)->GetArrayLength(env, jreturned_hash); - jbyte_returned_hash = (*env)->GetByteArrayElements(env, jreturned_hash, NULL); - returned_hash = malloc(returned_hash_len); + returned_hash = (*env)->GetByteArrayElements(env, jreturned_hash, NULL); go_returned_hash.data = returned_hash; go_returned_hash.len = returned_hash_len; go_returned_hash.cap = returned_hash_len; @@ -63,14 +37,10 @@ Java_sushi_hardcore_droidfs_filesystems_GocryptfsVolume_00024Companion_createVol (*env)->ReleaseStringUTFChars(env, jroot_cipher_dir, root_cipher_dir); (*env)->ReleaseStringUTFChars(env, jcreator, creator); - wipe(password, password_len); - (*env)->ReleaseByteArrayElements(env, jpassword, (jbyte*)password, 0); + (*env)->ReleaseByteArrayElements(env, jpassword, password, 0); if (!(*env)->IsSameObject(env, jreturned_hash, NULL)) { - unsignedCharArray_to_jbyteArray(returned_hash, jbyte_returned_hash, returned_hash_len); - wipe(returned_hash, returned_hash_len); - free(returned_hash); - (*env)->ReleaseByteArrayElements(env, jreturned_hash, jbyte_returned_hash, 0); + (*env)->ReleaseByteArrayElements(env, jreturned_hash, returned_hash, 0); } return result; @@ -86,36 +56,31 @@ Java_sushi_hardcore_droidfs_filesystems_GocryptfsVolume_00024Companion_nativeIni GoString go_root_cipher_dir = {root_cipher_dir, strlen(root_cipher_dir)}; size_t password_len; - char* password; + jbyte* password; GoSlice go_password = {NULL, 0, 0}; size_t given_hash_len; - jbyte* jbyte_given_hash; - unsigned char* given_hash; + jbyte* given_hash; GoSlice go_given_hash = {NULL, 0, 0}; if ((*env)->IsSameObject(env, jgiven_hash, NULL)){ password_len = (*env)->GetArrayLength(env, jpassword); - password = (char*)(*env)->GetByteArrayElements(env, jpassword, NULL); + password = (*env)->GetByteArrayElements(env, jpassword, NULL); go_password.data = password; go_password.len = password_len; go_password.cap = password_len; } else { given_hash_len = (*env)->GetArrayLength(env, jgiven_hash); - jbyte_given_hash = (*env)->GetByteArrayElements(env, jgiven_hash, NULL); - given_hash = malloc(given_hash_len); - jbyteArray_to_unsignedCharArray(jbyte_given_hash, given_hash, given_hash_len); + given_hash = (*env)->GetByteArrayElements(env, jgiven_hash, NULL); go_given_hash.data = given_hash; go_given_hash.len = given_hash_len; go_given_hash.cap = given_hash_len; } size_t returned_hash_len; - jbyte* jbyte_returned_hash; - unsigned char* returned_hash; + jbyte* returned_hash; GoSlice go_returned_hash = {NULL, 0, 0}; if (!(*env)->IsSameObject(env, jreturned_hash, NULL)){ returned_hash_len = (*env)->GetArrayLength(env, jreturned_hash); - jbyte_returned_hash = (*env)->GetByteArrayElements(env, jreturned_hash, NULL); - returned_hash = malloc(returned_hash_len); + returned_hash = (*env)->GetByteArrayElements(env, jreturned_hash, NULL); go_returned_hash.data = returned_hash; go_returned_hash.len = returned_hash_len; go_returned_hash.cap = returned_hash_len; @@ -126,19 +91,13 @@ Java_sushi_hardcore_droidfs_filesystems_GocryptfsVolume_00024Companion_nativeIni (*env)->ReleaseStringUTFChars(env, jroot_cipher_dir, root_cipher_dir); if ((*env)->IsSameObject(env, jgiven_hash, NULL)){ - wipe(password, password_len); - (*env)->ReleaseByteArrayElements(env, jpassword, (jbyte*)password, 0); + (*env)->ReleaseByteArrayElements(env, jpassword, password, 0); } else { - wipe(given_hash, given_hash_len); - free(given_hash); - (*env)->ReleaseByteArrayElements(env, jgiven_hash, jbyte_given_hash, 0); + (*env)->ReleaseByteArrayElements(env, jgiven_hash, given_hash, 0); } if (!(*env)->IsSameObject(env, jreturned_hash, NULL)){ - unsignedCharArray_to_jbyteArray(returned_hash, jbyte_returned_hash, returned_hash_len); - wipe(returned_hash, returned_hash_len); - free(returned_hash); - (*env)->ReleaseByteArrayElements(env, jreturned_hash, jbyte_returned_hash, 0); + (*env)->ReleaseByteArrayElements(env, jreturned_hash, returned_hash, 0); } return sessionID; @@ -153,53 +112,43 @@ Java_sushi_hardcore_droidfs_filesystems_GocryptfsVolume_native_1is_1closed(JNIEn JNIEXPORT jboolean JNICALL Java_sushi_hardcore_droidfs_filesystems_GocryptfsVolume_00024Companion_changePassword(JNIEnv *env, jclass clazz, jstring jroot_cipher_dir, - jcharArray jold_password, + jbyteArray jold_password, jbyteArray jgiven_hash, - jcharArray jnew_password, + jbyteArray jnew_password, jbyteArray jreturned_hash) { const char* root_cipher_dir = (*env)->GetStringUTFChars(env, jroot_cipher_dir, NULL); GoString go_root_cipher_dir = {root_cipher_dir, strlen(root_cipher_dir)}; size_t old_password_len; - jchar* jchar_old_password; - char* old_password; + jbyte* old_password; GoSlice go_old_password = {NULL, 0, 0}; size_t given_hash_len; - jbyte* jbyte_given_hash; - unsigned char* given_hash; + jbyte* given_hash; GoSlice go_given_hash = {NULL, 0, 0}; if ((*env)->IsSameObject(env, jgiven_hash, NULL)){ old_password_len = (*env)->GetArrayLength(env, jold_password); - jchar_old_password = (*env)->GetCharArrayElements(env, jold_password, NULL); - old_password = malloc(old_password_len); - jcharArray_to_charArray(jchar_old_password, old_password, old_password_len); + old_password = (*env)->GetByteArrayElements(env, jold_password, NULL); go_old_password.data = old_password; go_old_password.len = old_password_len; go_old_password.cap = old_password_len; } else { given_hash_len = (*env)->GetArrayLength(env, jgiven_hash); - jbyte_given_hash = (*env)->GetByteArrayElements(env, jgiven_hash, NULL); - given_hash = malloc(given_hash_len); - jbyteArray_to_unsignedCharArray(jbyte_given_hash, given_hash, given_hash_len); + given_hash = (*env)->GetByteArrayElements(env, jgiven_hash, NULL); go_given_hash.data = given_hash; go_given_hash.len = given_hash_len; go_given_hash.cap = given_hash_len; } size_t new_password_len = (*env)->GetArrayLength(env, jnew_password); - jchar* jchar_new_password = (*env)->GetCharArrayElements(env, jnew_password, NULL); - char* new_password = malloc(new_password_len); - jcharArray_to_charArray(jchar_new_password, new_password, new_password_len); + jbyte* new_password = (*env)->GetByteArrayElements(env, jnew_password, NULL); GoSlice go_new_password = {new_password, new_password_len, new_password_len}; size_t returned_hash_len; - jbyte* jbyte_returned_hash; - unsigned char* returned_hash; + jbyte* returned_hash; GoSlice go_returned_hash = {NULL, 0, 0}; if (!(*env)->IsSameObject(env, jreturned_hash, NULL)) { returned_hash_len = (*env)->GetArrayLength(env, jreturned_hash); - jbyte_returned_hash = (*env)->GetByteArrayElements(env, jreturned_hash, NULL); - returned_hash = malloc(returned_hash_len); + returned_hash = (*env)->GetByteArrayElements(env, jreturned_hash, NULL); go_returned_hash.data = returned_hash; go_returned_hash.len = returned_hash_len; go_returned_hash.cap = returned_hash_len; @@ -210,24 +159,15 @@ Java_sushi_hardcore_droidfs_filesystems_GocryptfsVolume_00024Companion_changePas (*env)->ReleaseStringUTFChars(env, jroot_cipher_dir, root_cipher_dir); if ((*env)->IsSameObject(env, jgiven_hash, NULL)){ - wipe(old_password, old_password_len); - free(old_password); - (*env)->ReleaseCharArrayElements(env, jold_password, jchar_old_password, 0); + (*env)->ReleaseByteArrayElements(env, jold_password, old_password, 0); } else { - wipe(given_hash, given_hash_len); - free(given_hash); - (*env)->ReleaseByteArrayElements(env, jgiven_hash, jbyte_given_hash, 0); + (*env)->ReleaseByteArrayElements(env, jgiven_hash, given_hash, 0); } - wipe(new_password, new_password_len); - free(new_password); - (*env)->ReleaseCharArrayElements(env, jnew_password, jchar_new_password, 0); + (*env)->ReleaseByteArrayElements(env, jnew_password, new_password, 0); if (!(*env)->IsSameObject(env, jreturned_hash, NULL)) { - unsignedCharArray_to_jbyteArray(returned_hash, jbyte_returned_hash, returned_hash_len); - wipe(returned_hash, returned_hash_len); - free(returned_hash); - (*env)->ReleaseByteArrayElements(env, jreturned_hash, jbyte_returned_hash, 0); + (*env)->ReleaseByteArrayElements(env, jreturned_hash, returned_hash, 0); } return result; @@ -370,15 +310,12 @@ Java_sushi_hardcore_droidfs_filesystems_GocryptfsVolume_native_1read_1file(JNIEn jint sessionID, jint handleID, jlong offset, jbyteArray jbuff) { const size_t buff_size = (*env)->GetArrayLength(env, jbuff); - unsigned char* buff = malloc(sizeof(char)*buff_size); + jbyte* buff = (*env)->GetByteArrayElements(env, jbuff, NULL); GoSlice go_buff = {buff, buff_size, buff_size}; int read = gcf_read_file(sessionID, handleID, offset, go_buff); - if (read > 0){ - (*env)->SetByteArrayRegion(env, jbuff, 0, read, (const jbyte*)buff); - } - free(buff); + (*env)->ReleaseByteArrayElements(env, jbuff, buff, 0); return read; }