/* * Copyright (c) 2012 CommonsWare, LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.commonsware.cwac.loaderex; import android.content.Context; import java.io.File; import java.io.IOException; import net.sqlcipher.database.SQLiteDatabase; public class SQLCipherUtils { public static enum State { DOES_NOT_EXIST, UNENCRYPTED, ENCRYPTED, UNKNOWN } public static State getDatabaseState(Context context, String dbName) { File dbPath=context.getDatabasePath(dbName); if (dbPath.exists()) { SQLiteDatabase db=null; try { db= SQLiteDatabase.openDatabase(dbPath.getAbsolutePath(), "", null, SQLiteDatabase.OPEN_READONLY); db.getVersion(); return(State.UNENCRYPTED); } catch (Exception e) { return(State.ENCRYPTED); } finally { if (db != null) { db.close(); } } } return(State.DOES_NOT_EXIST); } public static void encrypt(Context ctxt, String dbName, String passphrase) throws IOException { File originalFile=ctxt.getDatabasePath(dbName); if (originalFile.exists()) { File newFile= File.createTempFile("sqlcipherutils", "tmp", ctxt.getCacheDir()); SQLiteDatabase db= SQLiteDatabase.openDatabase(originalFile.getAbsolutePath(), "", null, SQLiteDatabase.OPEN_READWRITE); db.rawExecSQL(String.format("ATTACH DATABASE '%s' AS encrypted KEY '%s';", newFile.getAbsolutePath(), passphrase)); db.rawExecSQL("SELECT sqlcipher_export('encrypted')"); db.rawExecSQL("DETACH DATABASE encrypted;"); int version=db.getVersion(); db.close(); db= SQLiteDatabase.openDatabase(newFile.getAbsolutePath(), passphrase, null, SQLiteDatabase.OPEN_READWRITE); db.setVersion(version); db.close(); originalFile.delete(); newFile.renameTo(originalFile); } } }