Skip to content

Commit d427cb3

Browse files
committed
Merge pull request sqlcipher#37 from developernotes/prerelease
Prerelease
2 parents fc04d69 + 45235df commit d427cb3

File tree

3 files changed

+206
-16
lines changed

3 files changed

+206
-16
lines changed

src/crypto.c

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -94,14 +94,22 @@ int codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLeft, const c
9494
if( sqlite3StrICmp(zLeft, "cipher_version")==0 && !zRight ){
9595
codec_vdbe_return_static_string(pParse, "cipher_version", codec_get_cipher_version());
9696
}else
97-
if( sqlite3StrICmp(zLeft, "cipher")==0 && zRight ){
98-
if(ctx) sqlcipher_codec_ctx_set_cipher(ctx, zRight, 2); // change cipher for both
97+
if( sqlite3StrICmp(zLeft, "cipher")==0 ){
98+
if( zRight ) {
99+
if(ctx) sqlcipher_codec_ctx_set_cipher(ctx, zRight, 2); // change cipher for both
100+
}else {
101+
if(ctx) sqlcipher_codec_ctx_get_cipher(pParse, ctx, 2);
102+
}
99103
}else
100104
if( sqlite3StrICmp(zLeft, "rekey_cipher")==0 && zRight ){
101105
if(ctx) sqlcipher_codec_ctx_set_cipher(ctx, zRight, 1); // change write cipher only
102106
}else
103-
if( sqlite3StrICmp(zLeft, "kdf_iter")==0 && zRight ){
104-
if(ctx) sqlcipher_codec_ctx_set_kdf_iter(ctx, atoi(zRight), 2); // change of RW PBKDF2 iteration
107+
if( sqlite3StrICmp(zLeft, "kdf_iter")==0 ){
108+
if( zRight ) {
109+
if(ctx) sqlcipher_codec_ctx_set_kdf_iter(ctx, atoi(zRight), 2); // change of RW PBKDF2 iteration
110+
} else {
111+
if(ctx) sqlcipher_codec_ctx_get_kdf_iter(pParse, ctx, 2);
112+
}
105113
}else
106114
if( sqlite3StrICmp(zLeft, "fast_kdf_iter")==0 && zRight ){
107115
if(ctx) sqlcipher_codec_ctx_set_fast_kdf_iter(ctx, atoi(zRight), 2); // change of RW PBKDF2 iteration
@@ -111,23 +119,36 @@ int codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLeft, const c
111119
}else
112120
if( sqlite3StrICmp(zLeft,"cipher_page_size")==0 ){
113121
if(ctx) {
114-
int size = atoi(zRight);
115-
rc = sqlcipher_codec_ctx_set_pagesize(ctx, size);
116-
if(rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, rc);
117-
rc = codec_set_btree_to_codec_pagesize(db, pDb, ctx);
118-
if(rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, rc);
122+
if( zRight ) {
123+
int size = atoi(zRight);
124+
rc = sqlcipher_codec_ctx_set_pagesize(ctx, size);
125+
if(rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, rc);
126+
rc = codec_set_btree_to_codec_pagesize(db, pDb, ctx);
127+
if(rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, rc);
128+
} else {
129+
sqlcipher_codec_ctx_get_cipher_pagesize(pParse, ctx);
130+
}
119131
}
120132
}else
121133
if( sqlite3StrICmp(zLeft,"cipher_default_use_hmac")==0 ){
122-
sqlcipher_set_default_use_hmac(sqlite3GetBoolean(zRight,1));
134+
if( zRight ) {
135+
sqlcipher_set_default_use_hmac(sqlite3GetBoolean(zRight,1));
136+
} else {
137+
sqlcipher_get_default_use_hmac(pParse);
138+
}
123139
}else
124140
if( sqlite3StrICmp(zLeft,"cipher_use_hmac")==0 ){
125-
if(ctx) {
126-
rc = sqlcipher_codec_ctx_set_use_hmac(ctx, sqlite3GetBoolean(zRight,1));
127-
if(rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, rc);
128-
/* since the use of hmac has changed, the page size may also change */
129-
rc = codec_set_btree_to_codec_pagesize(db, pDb, ctx);
130-
if(rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, rc);
141+
142+
if( zRight ) {
143+
if(ctx) {
144+
rc = sqlcipher_codec_ctx_set_use_hmac(ctx, sqlite3GetBoolean(zRight,1));
145+
if(rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, rc);
146+
/* since the use of hmac has changed, the page size may also change */
147+
rc = codec_set_btree_to_codec_pagesize(db, pDb, ctx);
148+
if(rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, rc);
149+
}
150+
} else {
151+
if(ctx) sqlcipher_codec_ctx_get_use_hmac(pParse, ctx, 2);
131152
}
132153
}else
133154
if( sqlite3StrICmp(zLeft,"cipher_hmac_pgno")==0 ){

src/crypto_impl.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,15 @@ int sqlcipher_codec_ctx_set_cipher(codec_ctx *ctx, const char *cipher_name, int
345345
return SQLITE_OK;
346346
}
347347

348+
int sqlcipher_codec_ctx_get_cipher(Parse *pParse, codec_ctx *ctx, int for_ctx) {
349+
cipher_ctx *c_ctx = for_ctx ? ctx->write_ctx : ctx->read_ctx;
350+
EVP_CIPHER *evp_cipher = c_ctx->evp_cipher;
351+
char* name = EVP_CIPHER_name(evp_cipher);
352+
codec_vdbe_return_static_string(pParse, "cipher", name);
353+
354+
return SQLITE_OK;
355+
}
356+
348357
int sqlcipher_codec_ctx_set_kdf_iter(codec_ctx *ctx, int kdf_iter, int for_ctx) {
349358
cipher_ctx *c_ctx = for_ctx ? ctx->write_ctx : ctx->read_ctx;
350359
int rc;
@@ -359,6 +368,15 @@ int sqlcipher_codec_ctx_set_kdf_iter(codec_ctx *ctx, int kdf_iter, int for_ctx)
359368
return SQLITE_OK;
360369
}
361370

371+
int sqlcipher_codec_ctx_get_kdf_iter(Parse *pParse, codec_ctx *ctx, int for_ctx) {
372+
cipher_ctx *c_ctx = for_ctx ? ctx->write_ctx : ctx->read_ctx;
373+
char *kdf_iter = sqlite3_mprintf("%d", c_ctx->kdf_iter);
374+
codec_vdbe_return_static_string(pParse, "kdf_iter", kdf_iter);
375+
sqlite3_free(kdf_iter);
376+
377+
return SQLITE_OK;
378+
}
379+
362380
int sqlcipher_codec_ctx_set_fast_kdf_iter(codec_ctx *ctx, int fast_kdf_iter, int for_ctx) {
363381
cipher_ctx *c_ctx = for_ctx ? ctx->write_ctx : ctx->read_ctx;
364382
int rc;
@@ -379,6 +397,15 @@ void sqlcipher_set_default_use_hmac(int use) {
379397
else default_flags &= ~CIPHER_FLAG_HMAC;
380398
}
381399

400+
int sqlcipher_get_default_use_hmac(Parse *pParse) {
401+
int default_use_hmac_set = default_flags & CIPHER_FLAG_HMAC > 0;
402+
char *default_use_hmac = sqlite3_mprintf("%d", default_use_hmac_set);
403+
codec_vdbe_return_static_string(pParse, "cipher_default_use_hmac", default_use_hmac);
404+
sqlite3_free(default_use_hmac);
405+
406+
return SQLITE_OK;
407+
}
408+
382409
/* set the codec flag for whether this individual database should be using hmac */
383410
int sqlcipher_codec_ctx_set_use_hmac(codec_ctx *ctx, int use) {
384411
int reserve = EVP_MAX_IV_LENGTH; /* base reserve size will be IV only */
@@ -405,6 +432,16 @@ int sqlcipher_codec_ctx_set_use_hmac(codec_ctx *ctx, int use) {
405432
return SQLITE_OK;
406433
}
407434

435+
int sqlcipher_codec_ctx_get_use_hmac(Parse *pParse, codec_ctx *ctx, int for_ctx) {
436+
cipher_ctx * c_ctx = for_ctx ? ctx->write_ctx : ctx->read_ctx;
437+
int hmac_flag_set = c_ctx->flags & CIPHER_FLAG_HMAC > 0;
438+
char *hmac_flag = sqlite3_mprintf("%d", hmac_flag_set);
439+
codec_vdbe_return_static_string(pParse, "cipher_use_hmac", hmac_flag);
440+
sqlite3_free(hmac_flag);
441+
442+
return SQLITE_OK;
443+
}
444+
408445
int sqlcipher_codec_ctx_set_flag(codec_ctx *ctx, unsigned int flag) {
409446
ctx->write_ctx->flags |= flag;
410447
ctx->read_ctx->flags |= flag;
@@ -459,6 +496,15 @@ int sqlcipher_codec_ctx_set_pagesize(codec_ctx *ctx, int size) {
459496
return SQLITE_OK;
460497
}
461498

499+
int sqlcipher_codec_ctx_get_cipher_pagesize(Parse *pParse, codec_ctx *ctx) {
500+
int page_size_value = ctx->page_sz;
501+
char *page_size = sqlite3_mprintf("%d", page_size_value);
502+
codec_vdbe_return_static_string(pParse, "cipher_page_size", page_size);
503+
sqlite3_free(page_size);
504+
505+
return SQLITE_OK;
506+
}
507+
462508
int sqlcipher_codec_ctx_init(codec_ctx **iCtx, Db *pDb, Pager *pPager, sqlite3_file *fd, const void *zKey, int nKey) {
463509
int rc;
464510
codec_ctx *ctx;

test/crypto.test

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1606,4 +1606,127 @@ do_test be-to-le-migration {
16061606
db close
16071607
file delete -force test.db
16081608

1609+
# verify the pragma cipher_use_hmac
1610+
# is set to true be default
1611+
do_test verify-pragma-cipher-use-hmac-default {
1612+
sqlite_orig db test.db
1613+
execsql {
1614+
PRAGMA key = 'test';
1615+
PRAGMA cipher_use_hmac;
1616+
}
1617+
} {1}
1618+
db close
1619+
file delete -force test.db
1620+
1621+
# verify the pragma cipher_use_hmac
1622+
# reports the flag turned off
1623+
do_test verify-pragma-cipher-use-hmac-off {
1624+
sqlite_orig db test.db
1625+
execsql {
1626+
PRAGMA key = 'test';
1627+
PRAGMA cipher_use_hmac = off;
1628+
PRAGMA cipher_use_hmac;
1629+
}
1630+
} {0}
1631+
db close
1632+
file delete -force test.db
1633+
1634+
# verify the pragma default_cipher_use_hmac
1635+
# is set to true by default
1636+
do_test verify-pragma-cipher-default-use-hmac-default {
1637+
sqlite_orig db test.db
1638+
execsql {
1639+
PRAGMA cipher_default_use_hmac;
1640+
}
1641+
} {1}
1642+
db close
1643+
file delete -force test.db
1644+
1645+
# verify the pragma default_cipher_use_hmac
1646+
# reports the flag turned off
1647+
do_test verify-pragma-cipher-default-use-hmac-off {
1648+
sqlite_orig db test.db
1649+
execsql {
1650+
PRAGMA cipher_default_use_hmac = off;
1651+
PRAGMA cipher_default_use_hmac;
1652+
}
1653+
} {0}
1654+
db close
1655+
file delete -force test.db
1656+
1657+
# verify the pragma kdf_iter
1658+
# reports the default value
1659+
do_test verify-pragma-kdf-iter-reports-default {
1660+
sqlite_orig db test.db
1661+
execsql {
1662+
PRAGMA key = 'test';
1663+
PRAGMA kdf_iter;
1664+
}
1665+
} {4000}
1666+
db close
1667+
file delete -force test.db
1668+
1669+
# verify the pragma kdf_iter
1670+
# reports value changed
1671+
do_test verify-pragma-kdf-iter-reports-value-changed {
1672+
sqlite_orig db test.db
1673+
execsql {
1674+
PRAGMA key = 'test';
1675+
PRAGMA kdf_iter = 8000;
1676+
PRAGMA kdf_iter;
1677+
}
1678+
} {8000}
1679+
db close
1680+
file delete -force test.db
1681+
1682+
# verify the pragma cipher_page_size
1683+
# reports default value
1684+
do_test verify-pragma-cipher-page-size-default {
1685+
sqlite_orig db test.db
1686+
execsql {
1687+
PRAGMA key = 'test';
1688+
PRAGMA cipher_page_size;
1689+
}
1690+
} {1024}
1691+
db close
1692+
file delete -force test.db
1693+
1694+
# verify the pragma cipher_page_size
1695+
# reports change in value
1696+
do_test verify-pragma-cipher-page-size-changed {
1697+
sqlite_orig db test.db
1698+
execsql {
1699+
PRAGMA key = 'test';
1700+
PRAGMA cipher_page_size = 4096;
1701+
PRAGMA cipher_page_size;
1702+
}
1703+
} {4096}
1704+
db close
1705+
file delete -force test.db
1706+
1707+
# verify the pragma cipher
1708+
# reports the default value
1709+
do_test verify-pragma-cipher-default {
1710+
sqlite_orig db test.db
1711+
execsql {
1712+
PRAGMA key = 'test';
1713+
PRAGMA cipher;
1714+
}
1715+
} {AES-256-CBC}
1716+
db close
1717+
file delete -force test.db
1718+
1719+
# verify the pragma cipher
1720+
# reports a change in value
1721+
do_test verify-pragma-cipher-changed {
1722+
sqlite_orig db test.db
1723+
execsql {
1724+
PRAGMA key = 'test';
1725+
PRAGMA cipher = 'AES-256-ECB';
1726+
PRAGMA cipher;
1727+
}
1728+
} {AES-256-ECB}
1729+
db close
1730+
file delete -force test.db
1731+
16091732
finish_test

0 commit comments

Comments
 (0)