Skip to content

Commit a2bb641

Browse files
committed
64k iterations plus pragma cipher_default_kdf_iter function
1 parent 5818768 commit a2bb641

File tree

5 files changed

+77
-7
lines changed

5 files changed

+77
-7
lines changed

sqlcipher-2.3-testkey.db

2 KB
Binary file not shown.

src/crypto.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,15 @@ int codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLeft, const c
110110
if( sqlite3StrICmp(zLeft, "rekey_cipher")==0 && zRight ){
111111
if(ctx) sqlcipher_codec_ctx_set_cipher(ctx, zRight, 1); // change write cipher only
112112
}else
113+
if( sqlite3StrICmp(zLeft,"cipher_default_kdf_iter")==0 ){
114+
if( zRight ) {
115+
sqlcipher_set_default_kdf_iter(atoi(zRight)); // change default KDF iterations
116+
} else {
117+
char *kdf_iter = sqlite3_mprintf("%d", sqlcipher_get_default_kdf_iter());
118+
codec_vdbe_return_static_string(pParse, "cipher_default_kdf_iter", kdf_iter);
119+
sqlite3_free(kdf_iter);
120+
}
121+
}else
113122
if( sqlite3StrICmp(zLeft, "kdf_iter")==0 ){
114123
if(ctx) {
115124
if( zRight ) {

src/crypto.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
#define CIPHER_READWRITE_CTX 2
6060

6161
#ifndef PBKDF2_ITER
62-
#define PBKDF2_ITER 4000
62+
#define PBKDF2_ITER 64000
6363
#endif
6464

6565
/* possible flags for cipher_ctx->flags */
@@ -173,6 +173,9 @@ int sqlcipher_codec_ctx_set_pagesize(codec_ctx *, int);
173173
int sqlcipher_codec_ctx_get_pagesize(codec_ctx *);
174174
int sqlcipher_codec_ctx_get_reservesize(codec_ctx *);
175175

176+
void sqlcipher_set_default_kdf_iter(int iter);
177+
int sqlcipher_get_default_kdf_iter();
178+
176179
int sqlcipher_codec_ctx_set_kdf_iter(codec_ctx *, int, int);
177180
int sqlcipher_codec_ctx_get_kdf_iter(codec_ctx *ctx, int);
178181

src/crypto_impl.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ typedef struct {
6666

6767
static unsigned int default_flags = DEFAULT_CIPHER_FLAGS;
6868
static unsigned char hmac_salt_mask = HMAC_SALT_MASK;
69+
static int default_kdf_iter = PBKDF2_ITER;
6970

7071
static sqlcipher_provider *default_provider = NULL;
7172

@@ -386,6 +387,15 @@ const char* sqlcipher_codec_ctx_get_cipher(codec_ctx *ctx, int for_ctx) {
386387
return c_ctx->provider->get_cipher(c_ctx->provider_ctx);
387388
}
388389

390+
/* set the global default KDF iteration */
391+
void sqlcipher_set_default_kdf_iter(int iter) {
392+
default_kdf_iter = iter;
393+
}
394+
395+
int sqlcipher_get_default_kdf_iter() {
396+
return default_kdf_iter;
397+
}
398+
389399
int sqlcipher_codec_ctx_set_kdf_iter(codec_ctx *ctx, int kdf_iter, int for_ctx) {
390400
cipher_ctx *c_ctx = for_ctx ? ctx->write_ctx : ctx->read_ctx;
391401
int rc;
@@ -572,7 +582,7 @@ int sqlcipher_codec_ctx_init(codec_ctx **iCtx, Db *pDb, Pager *pPager, sqlite3_f
572582
}
573583

574584
if((rc = sqlcipher_codec_ctx_set_cipher(ctx, CIPHER, 0)) != SQLITE_OK) return rc;
575-
if((rc = sqlcipher_codec_ctx_set_kdf_iter(ctx, PBKDF2_ITER, 0)) != SQLITE_OK) return rc;
585+
if((rc = sqlcipher_codec_ctx_set_kdf_iter(ctx, default_kdf_iter, 0)) != SQLITE_OK) return rc;
576586
if((rc = sqlcipher_codec_ctx_set_fast_kdf_iter(ctx, FAST_PBKDF2_ITER, 0)) != SQLITE_OK) return rc;
577587
if((rc = sqlcipher_codec_ctx_set_pass(ctx, zKey, nKey, 0)) != SQLITE_OK) return rc;
578588

test/crypto.test

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,7 @@ do_test open-1.1.8-database {
879879
execsql {
880880
PRAGMA key = 'testkey';
881881
PRAGMA cipher_use_hmac = OFF;
882+
PRAGMA kdf_iter = 4000;
882883
SELECT count(*) FROM t1;
883884
SELECT * FROM t1;
884885
}
@@ -893,6 +894,7 @@ do_test attach-and-copy-1.1.8 {
893894
execsql {
894895
PRAGMA key = 'testkey';
895896
PRAGMA cipher_use_hmac = OFF;
897+
PRAGMA kdf_iter = 4000;
896898
ATTACH DATABASE 'test.db' AS db2 KEY 'testkey-hmac';
897899
CREATE TABLE db2.t1(a,b);
898900
INSERT INTO db2.t1 SELECT * FROM main.t1;
@@ -1350,20 +1352,22 @@ do_test cipher-options-before-keys {
13501352
db close
13511353
file delete -force test.db
13521354

1353-
# open a 1.1.8 database (no HMAC), then
1355+
# open a 1.1.8 database (no HMAC, 4K iter), then
13541356
# try to open another 1.1.8 database. The
13551357
# attached database should have the same hmac
13561358
# setting as the original
1357-
do_test default-use-hmac-attach {
1359+
do_test default-hmac-kdf-attach {
13581360
file copy -force sqlcipher-1.1.8-testkey.db test.db
13591361
sqlite_orig db test.db
13601362
execsql {
13611363
PRAGMA cipher_default_use_hmac = OFF;
1364+
PRAGMA cipher_default_kdf_iter = 4000;
13621365
PRAGMA key = 'testkey';
13631366
SELECT count(*) FROM t1;
13641367
ATTACH 'sqlcipher-1.1.8-testkey.db' AS db2;
13651368
SELECT count(*) from db2.t1;
13661369
PRAGMA cipher_default_use_hmac = ON;
1370+
PRAGMA cipher_default_kdf_iter = 64000;
13671371
}
13681372
} {4 4}
13691373
db close
@@ -1384,12 +1388,12 @@ do_test attach-1.1.8-database-from-2.0-fails {
13841388
db close
13851389
file delete -force test.db
13861390

1387-
# open a 2.0 database (with HMAC), then
1391+
# open a 2.0 database (with HMAC, 4k iter), then
13881392
# set the default hmac setting to OFF.
13891393
# try to a 1.1.8 database. this should
13901394
# succeed now that hmac is off by default
13911395
# before the attach
1392-
do_test change-default-use-hmac-attach {
1396+
do_test change-default-hmac-kdf-attach {
13931397
sqlite_orig db test.db
13941398
execsql {
13951399
PRAGMA key = 'testkey';
@@ -1402,9 +1406,11 @@ do_test change-default-use-hmac-attach {
14021406
PRAGMA key = 'testkey';
14031407
SELECT count(*) FROM t1;
14041408
PRAGMA cipher_default_use_hmac = OFF;
1409+
PRAGMA cipher_default_kdf_iter = 4000;
14051410
ATTACH 'sqlcipher-1.1.8-testkey.db' AS db2;
14061411
SELECT count(*) from db2.t1;
14071412
PRAGMA cipher_default_use_hmac = ON;
1413+
PRAGMA cipher_default_kdf_iter = 64000;
14081414
}
14091415
} {1 4}
14101416
db close
@@ -1580,12 +1586,25 @@ do_test multipage-schema-autovacuum-shortread-wal {
15801586
db close
15811587
file delete -force test.db
15821588

1589+
# open a 2.3 database with little endian hmac page numbers (default)
1590+
# verify it can be opened
1591+
do_test open-2.3-le-database {
1592+
sqlite_orig db sqlcipher-2.3-testkey.db
1593+
execsql {
1594+
PRAGMA key = 'testkey';
1595+
SELECT count(*) FROM t1;
1596+
SELECT * FROM t1;
1597+
}
1598+
} {4 1 1 one one 1 2 one two}
1599+
db close
1600+
15831601
# open a 2.0 database with little endian hmac page numbers (default)
15841602
# verify it can be opened
15851603
do_test open-2.0-le-database {
15861604
sqlite_orig db sqlcipher-2.0-le-testkey.db
15871605
execsql {
15881606
PRAGMA key = 'testkey';
1607+
PRAGMA kdf_iter = 4000;
15891608
SELECT count(*) FROM t1;
15901609
SELECT * FROM t1;
15911610
}
@@ -1599,6 +1618,7 @@ do_test open-2.0-be-database {
15991618
execsql {
16001619
PRAGMA key = 'testkey';
16011620
PRAGMA cipher_hmac_pgno = be;
1621+
PRAGMA kdf_iter = 4000;
16021622
SELECT count(*) FROM t1;
16031623
SELECT * FROM t1;
16041624
}
@@ -1615,6 +1635,7 @@ do_test be-to-le-migration {
16151635
execsql {
16161636
PRAGMA key = 'testkey';
16171637
PRAGMA cipher_hmac_pgno = be;
1638+
PRAGMA kdf_iter = 4000;
16181639
ATTACH DATABASE 'test.db' AS db2 KEY 'testkey';
16191640
CREATE TABLE db2.t1(a,b);
16201641
INSERT INTO db2.t1 SELECT * FROM main.t1;
@@ -1684,6 +1705,31 @@ do_test verify-pragma-cipher-default-use-hmac-off {
16841705
db close
16851706
file delete -force test.db
16861707

1708+
# verify the pragma default_cipher_kdf_iter
1709+
# is set to 64000 by default
1710+
do_test verify-pragma-cipher-default-kdf-iter-default {
1711+
sqlite_orig db test.db
1712+
execsql {
1713+
PRAGMA cipher_default_kdf_iter;
1714+
}
1715+
} {64000}
1716+
db close
1717+
file delete -force test.db
1718+
1719+
1720+
# verify the pragma default_cipher_kdf_ter
1721+
# reports changes
1722+
do_test verify-pragma-cipher-default-use-hmac-off {
1723+
sqlite_orig db test.db
1724+
execsql {
1725+
PRAGMA cipher_default_kdf_iter = 1000;
1726+
PRAGMA cipher_default_kdf_iter;
1727+
PRAGMA cipher_default_kdf_iter = 64000;
1728+
}
1729+
} {1000}
1730+
db close
1731+
file delete -force test.db
1732+
16871733
# verify the pragma kdf_iter
16881734
# reports the default value
16891735
do_test verify-pragma-kdf-iter-reports-default {
@@ -1692,7 +1738,7 @@ do_test verify-pragma-kdf-iter-reports-default {
16921738
PRAGMA key = 'test';
16931739
PRAGMA kdf_iter;
16941740
}
1695-
} {4000}
1741+
} {64000}
16961742
db close
16971743
file delete -force test.db
16981744

@@ -1843,6 +1889,7 @@ do_test open-2.0-beta-database {
18431889
sqlite_orig db sqlcipher-2.0-beta-testkey.db
18441890
execsql {
18451891
PRAGMA key = 'testkey';
1892+
PRAGMA kdf_iter = 4000;
18461893
PRAGMA fast_kdf_iter = 4000;
18471894
PRAGMA cipher_hmac_salt_mask = "x'00'";
18481895
SELECT count(*) FROM t1;
@@ -1861,6 +1908,7 @@ do_test 2.0-beta-to-2.0-migration {
18611908
execsql {
18621909
PRAGMA key = 'testkey';
18631910
PRAGMA cipher_hmac_salt_mask = "x'00'";
1911+
PRAGMA kdf_iter = 4000;
18641912
PRAGMA fast_kdf_iter = 4000;
18651913
SELECT count(*) FROM sqlite_master;
18661914

0 commit comments

Comments
 (0)