Hello, I have been working with SQLCipher [1] and I have noticed that DBD::SQLite does not work out of the box with it. In order to use an encrypted database, the first thing that should happen is to issue a pragma that specifies the key to decrypt pages. I modified the login function (the patch is attached) to use the password, if set, as the key.
I was hoping this (or a modified, but equivalent) change could be made to the main line: it should not break existing code and will make DBD::SQLite work with SQLCipher. - Dmitri. 1. "SQLCipher is an open source extension that provides transparent encryption of SQLite databases. Data pages are encrypted before being written to storage and decrypted on read." http://www.zetetic.net/software/sqlcipher/
Index: dbdimp.c =================================================================== --- dbdimp.c (revision 31) +++ dbdimp.c (revision 32) @@ -106,6 +106,28 @@ sqlite3_busy_timeout(imp_dbh->db, SQL_TIMEOUT); + if (pass) { + /* If password is set, issue pragma to decrypt the database. Works + * with SQLCipher. + */ + char pragma[0x100]; + if (snprintf(pragma, sizeof(pragma), "PRAGMA key='%s'", pass) >= + sizeof(pragma)) + { + sqlite_error(dbh, (imp_xxh_t*)imp_dbh, 1, + strdup("password too long")); + return FALSE; + } + + if ((retval = sqlite3_exec(imp_dbh->db, pragma, NULL, NULL, &errmsg)) + != SQLITE_OK) + { + /* warn("failed to set pragma: %s\n", errmsg); */ + sqlite_error(dbh, (imp_xxh_t*)imp_dbh, retval, errmsg); + return FALSE; + } + } + if ((retval = sqlite3_exec(imp_dbh->db, "PRAGMA empty_result_callbacks = ON", NULL, NULL, &errmsg)) != SQLITE_OK)
_______________________________________________ DBD-SQLite mailing list DBD-SQLite@lists.scsys.co.uk http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbd-sqlite