move pragma handling logic into crypto.c

This commit is contained in:
Stephen Lombardo 2012-07-17 17:18:17 -04:00
parent 70ef31ff5d
commit 96a7738587
3 changed files with 48 additions and 39 deletions

View File

@ -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

View File

@ -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 *);

View File

@ -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 ){