Skip to content

Commit aec6435

Browse files
Update to use SQLCipher for Android 4.4.1
1 parent d0d6175 commit aec6435

18 files changed

+295
-27
lines changed

app/build.gradle

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,12 @@ dependencies {
2222
// For testing JAR-based distribution:
2323
// implementation files('libs/sqlcipher.jar')
2424

25-
// For testing local AAR package:
26-
// implementation (name: 'android-database-sqlcipher-4.4.0-release', ext: 'aar')
25+
// For testing local AAR packages:
26+
//implementation (name: 'android-database-sqlcipher-4.4.1-release', ext: 'aar')
2727

28-
// For testing on remote AAR reference:
29-
implementation 'net.zetetic:android-database-sqlcipher:4.4.0@aar'
28+
// For testing on remote AAR references:
29+
implementation 'net.zetetic:android-database-sqlcipher:4.4.1@aar'
3030

31-
// Mandatory dependency:
3231
implementation "androidx.sqlite:sqlite:2.0.1"
3332

3433
// For Room tests:
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package net.zetetic;
2+
import android.util.Log;
3+
4+
import net.sqlcipher.database.SQLiteDatabase;
5+
6+
public class NativeInitializer {
7+
8+
static {
9+
Log.i("NativeInitializer", "Before loadLibs");
10+
SQLiteDatabase.loadLibs(ZeteticApplication.getInstance());
11+
Log.i("NativeInitializer", "After loadLibs");
12+
}
13+
14+
public static void initialize(){}
15+
16+
}

app/src/main/java/net/zetetic/ZeteticApplication.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ public static ZeteticApplication getInstance() {
2828
return instance;
2929
}
3030

31+
@Override
32+
public void onCreate() {
33+
super.onCreate();
34+
NativeInitializer.initialize();
35+
}
36+
3137
public void setCurrentActivity(Activity activity) {
3238
this.activity = activity;
3339
}

app/src/main/java/net/zetetic/ZeteticContentProvider.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,8 @@ public boolean onCreate() {
2828

2929
@Override
3030
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
31-
32-
SQLiteDatabase.loadLibs(ZeteticApplication.getInstance());
3331
File databasePath = ZeteticApplication.getInstance().getDatabasePath(ZeteticApplication.DATABASE_NAME);
3432
database = ZeteticApplication.getInstance().createDatabase(databasePath, null);
35-
3633
createDatabaseWithData(database);
3734
SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
3835
builder.setTables("t1");

app/src/main/java/net/zetetic/ZeteticContentProvider2.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ public boolean onCreate() {
2929

3030
@Override
3131
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
32-
SQLiteDatabase.loadLibs(ZeteticApplication.getInstance());
3332
File databasePath = ZeteticApplication.getInstance().getDatabasePath(DATABASE_NAME);
3433
database = ZeteticApplication.getInstance().createDatabase(databasePath);
3534

app/src/main/java/net/zetetic/activities/TestScrollingCursorActivity.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ public void run() {
9393

9494
void initializeEnvironment(){
9595
try{
96-
SQLiteDatabase.loadLibs(this);
9796
File databasePath = getDatabasePath(databaseFilename);
9897
ZeteticApplication.getInstance().extractAssetToDatabaseDirectory(databaseFilename);
9998
database = SQLiteDatabase.openDatabase(databasePath.getAbsolutePath(),

app/src/main/java/net/zetetic/tests/JavaClientLibraryVersionTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
import net.sqlcipher.database.SQLiteDatabase;
44

5-
public class JavaClientLibraryVersionTest extends SQLCipherTest {
5+
public class
6+
JavaClientLibraryVersionTest extends SQLCipherTest {
67

7-
private final String EXPECTED_SQLCIPHER_ANDROID_VERSION = "4.4.0";
8+
private final String EXPECTED_SQLCIPHER_ANDROID_VERSION = "4.4.1";
89

910
@Override
1011
public boolean execute(SQLiteDatabase database) {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package net.zetetic.tests;
2+
3+
import net.sqlcipher.Cursor;
4+
import net.sqlcipher.database.SQLiteDatabase;
5+
6+
public class JsonCastTest extends SQLCipherTest {
7+
@Override
8+
public boolean execute(SQLiteDatabase database) {
9+
String name = "Bob Smith", queryName = "";
10+
String query = String.format("select cast(json_extract('{\"user\":\"%s\"}','$.user') as TEXT);", name);
11+
Cursor cursor = database.rawQuery(query, new Object[]{});
12+
if(cursor != null && cursor.moveToFirst()){
13+
queryName = cursor.getString(0);
14+
cursor.close();
15+
}
16+
return name.equals(queryName);
17+
}
18+
19+
@Override
20+
public String getName() {
21+
return "JSON cast test";
22+
}
23+
}

app/src/main/java/net/zetetic/tests/PragmaCipherVersionTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
public class PragmaCipherVersionTest extends SQLCipherTest {
88

9-
private final String CURRENT_CIPHER_VERSION = "4.4.0";
9+
private final String CURRENT_CIPHER_VERSION = "4.4.1";
1010

1111
@Override
1212
public boolean execute(SQLiteDatabase database) {

app/src/main/java/net/zetetic/tests/TestSuiteRunner.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ protected void onPostExecute(Void aVoid) {
4949
}
5050

5151
private void runSuite() {
52-
53-
SQLiteDatabase.loadLibs(ZeteticApplication.getInstance());
5452
CursorWindowAllocation defaultAllocation = CursorWindow.getCursorWindowAllocation();
5553
for (SQLCipherTest test : getTestsToRun()) {
5654
try {
@@ -71,10 +69,11 @@ private void runSuite() {
7169

7270
private List<SQLCipherTest> getTestsToRun() {
7371
List<SQLCipherTest> tests = new ArrayList<>();
72+
tests.add(new JsonCastTest());
7473
tests.add(new SimpleQueryTest());
75-
//tests.add(new DefaultCursorWindowAllocationTest());
74+
tests.add(new DefaultCursorWindowAllocationTest());
7675

77-
//tests.add(new DeleteTableWithNullWhereArgsTest());
76+
tests.add(new DeleteTableWithNullWhereArgsTest());
7877
tests.add(new LoopingInsertTest());
7978
tests.add(new FIPSTest());
8079
tests.add(new PragmaCipherVersionTest());
@@ -106,7 +105,7 @@ private List<SQLCipherTest> getTestsToRun() {
106105
tests.add(new TransactionNonExclusiveTest());
107106
tests.add(new TransactionWithListenerTest());
108107
tests.add(new LargeDatabaseCursorAccessTest());
109-
108+
110109
//// tests.add(new TimeLargeByteArrayQueryTest());
111110

112111
tests.add(new QueryLimitTest());

app/src/main/java/net/zetetic/tests/VerifyCipherProviderVersionTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public boolean execute(SQLiteDatabase database) {
1111
"PRAGMA cipher_provider_version;");
1212
setMessage(String.format("Reported:%s", provider));
1313
return provider.contains("OpenSSL 1.1.1") ||
14-
provider.contains("OpenSSL 1.0.2t-fips");
14+
provider.contains("OpenSSL 1.0.2u-fips");
1515
}
1616

1717
@Override
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package net.zetetic.tests.support;
2+
3+
import android.app.Activity;
4+
import android.database.Cursor;
5+
6+
import androidx.room.Dao;
7+
import androidx.room.Database;
8+
import androidx.room.Entity;
9+
import androidx.room.PrimaryKey;
10+
import androidx.room.RawQuery;
11+
import androidx.room.Room;
12+
import androidx.room.RoomDatabase;
13+
import androidx.sqlite.db.SimpleSQLiteQuery;
14+
15+
import net.sqlcipher.database.SQLiteDatabase;
16+
import net.sqlcipher.database.SupportFactory;
17+
import net.zetetic.ZeteticApplication;
18+
import net.zetetic.tests.TestResult;
19+
20+
import java.security.SecureRandom;
21+
import java.util.Arrays;
22+
import java.util.Random;
23+
24+
public class EncryptBytesTest implements ISupportTest {
25+
26+
Activity activity;
27+
28+
public EncryptBytesTest(Activity activity) {
29+
this.activity = activity;
30+
}
31+
32+
@Dao
33+
public interface BlobDao {
34+
@RawQuery
35+
byte[] blobRawGet(SimpleSQLiteQuery query);
36+
}
37+
38+
public static class Encryptor {
39+
BlobDao dao;
40+
byte[] encryptionKey;
41+
42+
public Encryptor(BlobDao dao, byte[] encryptionKey) {
43+
this.dao = dao;
44+
this.encryptionKey = encryptionKey;
45+
}
46+
47+
public byte[] encryptBytes(byte[] material) {
48+
return dao.blobRawGet(new SimpleSQLiteQuery("select sqlcipher_vle_encrypt(?, ?)",
49+
new Object[]{material, encryptionKey}));
50+
}
51+
52+
public byte[] decryptBytes(byte[] material) {
53+
return dao.blobRawGet(new SimpleSQLiteQuery("select sqlcipher_vle_decrypt(?, ?)",
54+
new Object[]{material, encryptionKey}));
55+
}
56+
}
57+
58+
public static class Encryptor2 {
59+
RoomDatabase roomDatabase;
60+
byte[] encryptionKey;
61+
62+
public Encryptor2(RoomDatabase roomDatabase, byte[] encryptionKey) {
63+
this.roomDatabase = roomDatabase;
64+
this.encryptionKey = encryptionKey;
65+
}
66+
67+
public byte[] encryptBytes(byte[] material) {
68+
byte[] result = null;
69+
Cursor cursor = roomDatabase.getOpenHelper().getReadableDatabase().query("select sqlcipher_vle_encrypt(?, ?)",
70+
new Object[]{material, encryptionKey});
71+
if(cursor != null && cursor.moveToNext()){
72+
result = cursor.getBlob(0);
73+
cursor.close();
74+
}
75+
return result;
76+
}
77+
78+
public byte[] decryptBytes(byte[] material) {
79+
byte[] result = null;
80+
Cursor cursor = roomDatabase.getOpenHelper().getReadableDatabase().query("select sqlcipher_vle_decrypt(?, ?)",
81+
new Object[]{material, encryptionKey});
82+
if(cursor != null && cursor.moveToNext()){
83+
result = cursor.getBlob(0);
84+
cursor.close();
85+
}
86+
return result;
87+
}
88+
}
89+
90+
@Entity
91+
public static class BlobEntity {
92+
@PrimaryKey(autoGenerate = true)
93+
long id;
94+
}
95+
96+
@Database(entities = {BlobEntity.class}, version = 1)
97+
public static abstract class BlobDatabase extends RoomDatabase {
98+
abstract BlobDao blobDao();
99+
}
100+
101+
102+
public TestResult run() {
103+
TestResult result = new TestResult(getName(), false);
104+
byte[] passphrase = SQLiteDatabase.getBytes(ZeteticApplication.DATABASE_PASSWORD.toCharArray());
105+
SupportFactory factory = new SupportFactory(passphrase, ZeteticApplication.getInstance().wrapHook(null));
106+
BlobDatabase room = Room.databaseBuilder(activity, BlobDatabase.class, "test.db")
107+
.openHelperFactory(factory)
108+
.build();
109+
110+
byte[] key = generateRandomBytes(64);
111+
//Encryptor encryptor = new Encryptor(room.blobDao(), key);
112+
Encryptor2 encryptor = new Encryptor2(room, key);
113+
114+
byte[] source = "hi".getBytes();
115+
byte[] encrypted = encryptor.encryptBytes(source);
116+
byte[] decrypted = encryptor.decryptBytes(encrypted);
117+
result.setResult(Arrays.equals(source, decrypted));
118+
return result;
119+
}
120+
121+
private byte[] generateRandomBytes(int length) {
122+
Random random = new SecureRandom();
123+
byte[] value = new byte[length];
124+
random.nextBytes(value);
125+
return value;
126+
}
127+
128+
public String getName() {
129+
return "Encrypt Bytes Test";
130+
}
131+
}

app/src/main/java/net/zetetic/tests/support/JavaClientLibraryVersionTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
public class JavaClientLibraryVersionTest extends SupportTest {
77

8-
private final String EXPECTED_SQLCIPHER_ANDROID_VERSION = "4.4.0";
8+
private final String EXPECTED_SQLCIPHER_ANDROID_VERSION = "4.4.1";
99

1010
@Override
1111
public boolean execute(SQLiteDatabase database) {

app/src/main/java/net/zetetic/tests/support/PragmaCipherVersionTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
public class PragmaCipherVersionTest extends SupportTest {
99

10-
private final String CURRENT_CIPHER_VERSION = "4.4.0";
10+
private final String CURRENT_CIPHER_VERSION = "4.4.1";
1111

1212
@Override
1313
public boolean execute(SQLiteDatabase database) {

0 commit comments

Comments
 (0)