Skip to content

Commit 23730bb

Browse files
Allow keying of database
1 parent 227d131 commit 23730bb

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed

sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SQLiteConnection.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,8 @@
2020

2121
package net.zetetic.database.sqlcipher;
2222

23-
import net.zetetic.database.sqlcipher.CloseGuard;
24-
2523
import android.database.Cursor;
2624
import android.database.CursorWindow;
27-
import net.zetetic.database.DatabaseUtils;
28-
import net.zetetic.database.sqlcipher.SQLiteDebug.DbStats;
2925
import android.os.CancellationSignal;
3026
import android.os.OperationCanceledException;
3127
import android.os.ParcelFileDescriptor;
@@ -34,11 +30,13 @@
3430
import android.util.LruCache;
3531
import android.util.Printer;
3632

33+
import net.zetetic.database.DatabaseUtils;
34+
import net.zetetic.database.sqlcipher.SQLiteDebug.DbStats;
35+
3736
import java.text.SimpleDateFormat;
3837
import java.util.ArrayList;
3938
import java.util.Date;
4039
import java.util.Map;
41-
import java.util.regex.Pattern;
4240

4341
/**
4442
* Represents a SQLite database connection.
@@ -119,6 +117,7 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen
119117
// we can ensure that we detach the signal at the right time.
120118
private int mCancellationSignalAttachCount;
121119

120+
private static native void nativeKey(long connectionPtr, byte[] password);
122121
private static native long nativeOpen(String path, int openFlags, String label,
123122
boolean enableTrace, boolean enableProfile);
124123
private static native void nativeClose(long connectionPtr);
@@ -214,7 +213,15 @@ private void open() {
214213
mConnectionPtr = nativeOpen(mConfiguration.path, mConfiguration.openFlags,
215214
mConfiguration.label,
216215
SQLiteDebug.DEBUG_SQL_STATEMENTS, SQLiteDebug.DEBUG_SQL_TIME);
217-
216+
if(mConfiguration.databaseHook != null){
217+
mConfiguration.databaseHook.preKey(this);
218+
}
219+
if(mConfiguration.password != null && mConfiguration.password.length > 0){
220+
nativeKey(mConnectionPtr, mConfiguration.password);
221+
}
222+
if(mConfiguration.databaseHook != null){
223+
mConfiguration.databaseHook.postKey(this);
224+
}
218225
setPageSize();
219226
setForeignKeyModeFromConfiguration();
220227
setJournalSizeLimit();

sqlcipher/src/main/jni/sqlcipher/android_database_SQLiteConnection.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,26 @@ static int coll_localized(
138138
return rc;
139139
}
140140

141+
static void nativeKey(JNIEnv* env, jclass clazz, jlong connectionPtr, jbyteArray keyArray) {
142+
int rc = 0;
143+
jsize size = 0;
144+
jbyte *key = nullptr;
145+
auto* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr);
146+
if(connection) {
147+
ALOGV("Keying connection %p", connection->db);
148+
key = env->GetByteArrayElements(keyArray, nullptr);
149+
size = env->GetArrayLength(keyArray);
150+
rc = sqlite3_key(connection->db, key, size);
151+
}
152+
if(key) {
153+
env->ReleaseByteArrayElements(keyArray, key, JNI_ABORT);
154+
}
155+
if (rc != SQLITE_OK) {
156+
ALOGE("sqlite3_key(%p) failed: %d", connection->db, rc);
157+
throw_sqlite3_exception(env, connection->db, "Could not key db.");
158+
}
159+
}
160+
141161
static jlong nativeOpen(JNIEnv* env, jclass clazz, jstring pathStr, jint openFlags,
142162
jstring labelStr, jboolean enableTrace, jboolean enableProfile) {
143163
int sqliteFlags;
@@ -819,7 +839,9 @@ static jboolean nativeHasCodec(JNIEnv* env, jobject clazz){
819839
static JNINativeMethod sMethods[] =
820840
{
821841
/* name, signature, funcPtr */
822-
{ "nativeOpen", "(Ljava/lang/String;ILjava/lang/String;ZZ)J",
842+
{"nativeKey", "(J[B)V",
843+
(void*)nativeKey },
844+
{"nativeOpen", "(Ljava/lang/String;ILjava/lang/String;ZZ)J",
823845
(void*)nativeOpen },
824846
{ "nativeClose", "(J)V",
825847
(void*)nativeClose },

0 commit comments

Comments
 (0)