From 96a773858731a1124347ab195a6236d9e7bfde8a Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Tue, 17 Jul 2012 17:18:17 -0400 Subject: [PATCH] move pragma handling logic into crypto.c --- src/crypto.c | 33 +++++++++++++++++++++++++++++++++ src/crypto.h | 2 ++ src/pragma.c | 52 +++++++++++++--------------------------------------- 3 files changed, 48 insertions(+), 39 deletions(-) diff --git a/src/crypto.c b/src/crypto.c index dd0ba0f9..e12a677a 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -163,6 +163,39 @@ int codec_set_pass_key(sqlite3* db, int nDb, const void *zKey, int nKey, int for return SQLITE_ERROR; } +int codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLeft, const char *zRight) { + if( sqlite3StrICmp(zLeft, "cipher_version")==0 && !zRight ){ + codec_vdbe_return_static_string(pParse, "cipher_version", codec_get_cipher_version()); + }else + if( sqlite3StrICmp(zLeft, "cipher")==0 && zRight ){ + codec_set_cipher_name(db, iDb, zRight, 2); // change cipher for both + }else + if( sqlite3StrICmp(zLeft, "rekey_cipher")==0 && zRight ){ + codec_set_cipher_name(db, iDb, zRight, 1); // change write cipher only + }else + if( sqlite3StrICmp(zLeft, "kdf_iter")==0 && zRight ){ + codec_set_kdf_iter(db, iDb, atoi(zRight), 2); // change of RW PBKDF2 iteration + }else + if( sqlite3StrICmp(zLeft, "fast_kdf_iter")==0 && zRight ){ + codec_set_fast_kdf_iter(db, iDb, atoi(zRight), 2); // change of RW PBKDF2 iteration + }else + if( sqlite3StrICmp(zLeft, "rekey_kdf_iter")==0 && zRight ){ + codec_set_kdf_iter(db, iDb, atoi(zRight), 1); // change # if W iterations + }else + if( sqlite3StrICmp(zLeft,"cipher_page_size")==0 ){ + codec_set_page_size(db, iDb, atoi(zRight)); // change page size + }else + if( sqlite3StrICmp(zLeft,"cipher_default_use_hmac")==0 ){ + codec_set_default_use_hmac(sqlite3GetBoolean(zRight,1)); + }else + if( sqlite3StrICmp(zLeft,"cipher_use_hmac")==0 ){ + codec_set_use_hmac(db, iDb, sqlite3GetBoolean(zRight,1)); + }else { + return 0; + } + return 1; +} + /* * sqlite3Codec can be called in multiple modes. * encrypt mode - expected to return a pointer to the diff --git a/src/crypto.h b/src/crypto.h index 4faf1b53..873aff9b 100644 --- a/src/crypto.h +++ b/src/crypto.h @@ -159,6 +159,8 @@ void sqlcipher_codec_ctx_set_error(codec_ctx *, int); int sqlcipher_codec_ctx_set_pass(codec_ctx *, const void *, int, int); void sqlcipher_codec_get_pass(codec_ctx *, void **zKey, int *nKey); +int codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLeft, const char *zRight); + int sqlcipher_codec_ctx_set_pagesize(codec_ctx *, int); int sqlcipher_codec_ctx_get_pagesize(codec_ctx *); int sqlcipher_codec_ctx_get_reservesize(codec_ctx *); diff --git a/src/pragma.c b/src/pragma.c index 5c991ab1..63d2c013 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -317,6 +317,12 @@ void sqlite3Pragma( sqlite3 *db = pParse->db; /* The database connection */ Db *pDb; /* The specific database being pragmaed */ Vdbe *v = pParse->pVdbe = sqlite3VdbeCreate(db); /* Prepared statement */ +/** BEGIN CRYPTO **/ +#ifdef SQLITE_HAS_CODEC + extern int codec_pragma(sqlite3*, int, Parse *, const char *, const char *); +#endif +/** END CRYPTO **/ + if( v==0 ) return; sqlite3VdbeRunOnlyOnce(v); @@ -376,6 +382,13 @@ void sqlite3Pragma( pParse->rc = rc; }else +/** BEGIN CRYPTO **/ +#ifdef SQLITE_HAS_CODEC + if(codec_pragma(db, iDb, pParse, zLeft, zRight)) { + /* codec_pragma executes internal */ + }else + #endif +/** END CRYPTO **/ #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) /* @@ -1534,45 +1547,6 @@ void sqlite3Pragma( sqlite3_rekey(db, zKey, i/2); } }else -/** BEGIN CRYPTO **/ - if( sqlite3StrICmp(zLeft, "cipher_version")==0 && !zRight ){ - extern void codec_vdbe_return_static_string(Parse *pParse, const char *zLabel, const char *value); - extern const char* codec_get_cipher_version(); - codec_vdbe_return_static_string(pParse, "cipher_version", codec_get_cipher_version()); - }else - if( sqlite3StrICmp(zLeft, "cipher")==0 && zRight ){ - extern int codec_set_cipher_name(sqlite3*, int, const char *, int); - codec_set_cipher_name(db, iDb, zRight, 2); // change cipher for both - }else - if( sqlite3StrICmp(zLeft, "rekey_cipher")==0 && zRight ){ - extern int codec_set_cipher_name(sqlite3*, int, const char *, int); - codec_set_cipher_name(db, iDb, zRight, 1); // change write cipher only - }else - if( sqlite3StrICmp(zLeft, "kdf_iter")==0 && zRight ){ - extern int codec_set_kdf_iter(sqlite3*, int, int, int); - codec_set_kdf_iter(db, iDb, atoi(zRight), 2); // change of RW PBKDF2 iteration - }else - if( sqlite3StrICmp(zLeft, "fast_kdf_iter")==0 && zRight ){ - extern int codec_set_fast_kdf_iter(sqlite3*, int, int, int); - codec_set_fast_kdf_iter(db, iDb, atoi(zRight), 2); // change of RW PBKDF2 iteration - }else - if( sqlite3StrICmp(zLeft, "rekey_kdf_iter")==0 && zRight ){ - extern int codec_set_kdf_iter(sqlite3*, int, int, int); - codec_set_kdf_iter(db, iDb, atoi(zRight), 1); // change # if W iterations - }else - if( sqlite3StrICmp(zLeft,"cipher_page_size")==0 ){ - extern int codec_set_page_size(sqlite3*, int, int); - codec_set_page_size(db, iDb, atoi(zRight)); // change page size - }else - if( sqlite3StrICmp(zLeft,"cipher_default_use_hmac")==0 ){ - extern void codec_set_default_use_hmac(int); - codec_set_default_use_hmac(sqlite3GetBoolean(zRight,1)); - }else - if( sqlite3StrICmp(zLeft,"cipher_use_hmac")==0 ){ - extern int codec_set_use_hmac(sqlite3*, int, int); - codec_set_use_hmac(db, iDb, sqlite3GetBoolean(zRight,1)); - }else -/** END CRYPTO **/ #endif #if defined(SQLITE_HAS_CODEC) || defined(SQLITE_ENABLE_CEROD) if( sqlite3StrICmp(zLeft, "activate_extensions")==0 ){