From a2bb641e485661395c2c31a78c7e061ea373f27d Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Thu, 27 Jun 2013 19:07:58 -0400 Subject: [PATCH] 64k iterations plus pragma cipher_default_kdf_iter function --- sqlcipher-2.3-testkey.db | Bin 0 -> 2048 bytes src/crypto.c | 9 ++++++ src/crypto.h | 5 +++- src/crypto_impl.c | 12 +++++++- test/crypto.test | 58 +++++++++++++++++++++++++++++++++++---- 5 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 sqlcipher-2.3-testkey.db diff --git a/sqlcipher-2.3-testkey.db b/sqlcipher-2.3-testkey.db new file mode 100644 index 0000000000000000000000000000000000000000..da27623373d27c6cf722ffb2eae8e2fb84f171ff GIT binary patch literal 2048 zcmV+b2>NOk^TF^{L~6~or%gh^OHlH zZ^~hcKOYfQfHjnIAI{gOi0q&=$`OeS##B^lWtu3;V6BlMTCW#_yrEIWiaazWMKMlC zHltH}hygk7VkMmROU_hwD3`bAwTYNj>5JvOFA&=(BB?gU!jO^Rpl^+j8jj*DEFXu> zRsmB{2H+hl5vkR+3eo9%2yr^^U~Mt*1%3bky%g9i-*zOnjZ=<`Qd{RU{8zZ5(`Ffu zo!^2iGdAW)RfOaJb@IA1HL?+@GqzPkH59th0*+;JJN=Ve)q4PZ3abxPM=8zXLz2;Q za0>6=c`+;89LS*ol%AG2(X&+#THCt$+h!MalRpUT*s~F+#kp{8FobE;7KcBSH)hHZ z_HDFJ7#^a4qssud6iLFj?v+1L4%ma*!^0bickPX~eH#Sn$OU!WSY&$HGA=z@{25*T zV@+qVzBd8A94Gdl8g*UwEV9Ff`Kyi!U7LSJ%72bt+otG`=D5gqk{_=o?$3u;BFSuE zxB;e-$BxgJBNC|fyoYh`PL671kvH-6BX?Vf2Y5!Y!QNw(VNr*%Obd^)9osmRGvm(T4|rB+#iI0w=$0e$*kTM11+=$I{>*P<*zW=X$H zRm4Fb{ZUHr#)i|0Kv%N&HlXR>xe|Ji1UB|H3b;O`ehq%VaI*ky299C@D6U>hQx+GG zI*Vl7`M+tRlTZQDB*J!Q_#v1w@3mwE z9w$>_v~#@>P-gEzg>DDUxpx^(fO7SKRYv30PlTiJB)>%)ZlX;_sHrI4^{}qB%5b0* zeKZTbOVg8E%E&&%9@{X9j`v37b0phjV9248{r<7tWdmTVh8j_@obWk?U=*r2k?ezs z>=w(#PdxyhpE8i#?ej=L^A1!)y>mrwD__CZELdjb~5*s zAuIC)3+&L%Crm6EGk9MU682s^1-9U7ZB*UN9y`O4n5%3iL+meDSv!mfqZ0uTsRn+o zFCGGR*2pNAVn?%)x70#37cFpZ$plzn&2OwZOo`kCcu3JFG^ETk zLp(eyyzNfKj_`T~NNvyB>FG)A)%#{hxj7S&sV_JvPeyPmZMk`I)AH)Wqr2EXyypr6 zeKSey5kCyxADA4xAMW+e@tV>`KCc4peBZ)a#Natwd;)9vFzzc-Gh$h z0z0Z&s$%b9_nuMdmJU%lWB428V8Jix75R7aaD$Mvf0K?waV9t*MuA7XbzUlv;Y~b+ zaxP-2uv`YGRg7wP3ln|b%PA~i%VN&4*3TAY*YRLtBYg%iU!kPzm9eQe5w!>FKVIt*PW)xraKN{_P)JOC*bV{%eHN^_*l7Q<`d|A;BYs@hQkigo<6f0THX2~jJ z>Hm^g^OESg=n@3xMiDPRJR5z5*9xxuSbaIDp#$Kr#@~|+XGRm9yS}{Li*Q5j1K&@? z-kXeot;1Kh)|S0k=-ZB}gvj|NtWV`D-}YDOTbulket2Y>yh#QDyAYnji3ZKw&zXe{ z$D^T?{`W(zP-gnZMDs~0Awj*z3(&&z(ijk6A*-jzS0xOT`^g`-<)w;QgEcdUnat1I zI|EM{!+tQ&tjK2sxc9#UYMcP71fxn2=^!M)%D^(Gr&X!i)v145)Dg z7CA-&ws|scttJQ1oB<)tE0554OPDt4eauZr{UlloG3#^ABj|go=|*ZcO6QsY%d_#N zN8$bIrKs$YC=9&i=F!!Npay1=m^fS&gkFicp1A12JDxzvvM%;jc=Bw{JI-3p3)pm( zJBSAwLI!e3Z~IS2{)v=*3?O0EA^2DKzuRJI^KpcTkT1D4_NkN0-cD-cp|kJKkk1_oONZWU}#emj=)U z_D-2`>~>omJVRfH%yfTdi~W0IN_@n~*iuv3flags */ @@ -173,6 +173,9 @@ 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 *); +void sqlcipher_set_default_kdf_iter(int iter); +int sqlcipher_get_default_kdf_iter(); + int sqlcipher_codec_ctx_set_kdf_iter(codec_ctx *, int, int); int sqlcipher_codec_ctx_get_kdf_iter(codec_ctx *ctx, int); diff --git a/src/crypto_impl.c b/src/crypto_impl.c index 589696d..76bd9be 100644 --- a/src/crypto_impl.c +++ b/src/crypto_impl.c @@ -66,6 +66,7 @@ typedef struct { static unsigned int default_flags = DEFAULT_CIPHER_FLAGS; static unsigned char hmac_salt_mask = HMAC_SALT_MASK; +static int default_kdf_iter = PBKDF2_ITER; static sqlcipher_provider *default_provider = NULL; @@ -386,6 +387,15 @@ const char* sqlcipher_codec_ctx_get_cipher(codec_ctx *ctx, int for_ctx) { return c_ctx->provider->get_cipher(c_ctx->provider_ctx); } +/* set the global default KDF iteration */ +void sqlcipher_set_default_kdf_iter(int iter) { + default_kdf_iter = iter; +} + +int sqlcipher_get_default_kdf_iter() { + return default_kdf_iter; +} + int sqlcipher_codec_ctx_set_kdf_iter(codec_ctx *ctx, int kdf_iter, int for_ctx) { cipher_ctx *c_ctx = for_ctx ? ctx->write_ctx : ctx->read_ctx; int rc; @@ -572,7 +582,7 @@ int sqlcipher_codec_ctx_init(codec_ctx **iCtx, Db *pDb, Pager *pPager, sqlite3_f } if((rc = sqlcipher_codec_ctx_set_cipher(ctx, CIPHER, 0)) != SQLITE_OK) return rc; - if((rc = sqlcipher_codec_ctx_set_kdf_iter(ctx, PBKDF2_ITER, 0)) != SQLITE_OK) return rc; + if((rc = sqlcipher_codec_ctx_set_kdf_iter(ctx, default_kdf_iter, 0)) != SQLITE_OK) return rc; if((rc = sqlcipher_codec_ctx_set_fast_kdf_iter(ctx, FAST_PBKDF2_ITER, 0)) != SQLITE_OK) return rc; if((rc = sqlcipher_codec_ctx_set_pass(ctx, zKey, nKey, 0)) != SQLITE_OK) return rc; diff --git a/test/crypto.test b/test/crypto.test index 90439c6..94a72f2 100644 --- a/test/crypto.test +++ b/test/crypto.test @@ -879,6 +879,7 @@ do_test open-1.1.8-database { execsql { PRAGMA key = 'testkey'; PRAGMA cipher_use_hmac = OFF; + PRAGMA kdf_iter = 4000; SELECT count(*) FROM t1; SELECT * FROM t1; } @@ -893,6 +894,7 @@ do_test attach-and-copy-1.1.8 { execsql { PRAGMA key = 'testkey'; PRAGMA cipher_use_hmac = OFF; + PRAGMA kdf_iter = 4000; ATTACH DATABASE 'test.db' AS db2 KEY 'testkey-hmac'; CREATE TABLE db2.t1(a,b); INSERT INTO db2.t1 SELECT * FROM main.t1; @@ -1350,20 +1352,22 @@ do_test cipher-options-before-keys { db close file delete -force test.db -# open a 1.1.8 database (no HMAC), then +# open a 1.1.8 database (no HMAC, 4K iter), then # try to open another 1.1.8 database. The # attached database should have the same hmac # setting as the original -do_test default-use-hmac-attach { +do_test default-hmac-kdf-attach { file copy -force sqlcipher-1.1.8-testkey.db test.db sqlite_orig db test.db execsql { PRAGMA cipher_default_use_hmac = OFF; + PRAGMA cipher_default_kdf_iter = 4000; PRAGMA key = 'testkey'; SELECT count(*) FROM t1; ATTACH 'sqlcipher-1.1.8-testkey.db' AS db2; SELECT count(*) from db2.t1; PRAGMA cipher_default_use_hmac = ON; + PRAGMA cipher_default_kdf_iter = 64000; } } {4 4} db close @@ -1384,12 +1388,12 @@ do_test attach-1.1.8-database-from-2.0-fails { db close file delete -force test.db -# open a 2.0 database (with HMAC), then +# open a 2.0 database (with HMAC, 4k iter), then # set the default hmac setting to OFF. # try to a 1.1.8 database. this should # succeed now that hmac is off by default # before the attach -do_test change-default-use-hmac-attach { +do_test change-default-hmac-kdf-attach { sqlite_orig db test.db execsql { PRAGMA key = 'testkey'; @@ -1402,9 +1406,11 @@ do_test change-default-use-hmac-attach { PRAGMA key = 'testkey'; SELECT count(*) FROM t1; PRAGMA cipher_default_use_hmac = OFF; + PRAGMA cipher_default_kdf_iter = 4000; ATTACH 'sqlcipher-1.1.8-testkey.db' AS db2; SELECT count(*) from db2.t1; PRAGMA cipher_default_use_hmac = ON; + PRAGMA cipher_default_kdf_iter = 64000; } } {1 4} db close @@ -1580,12 +1586,25 @@ do_test multipage-schema-autovacuum-shortread-wal { db close file delete -force test.db +# open a 2.3 database with little endian hmac page numbers (default) +# verify it can be opened +do_test open-2.3-le-database { + sqlite_orig db sqlcipher-2.3-testkey.db + execsql { + PRAGMA key = 'testkey'; + SELECT count(*) FROM t1; + SELECT * FROM t1; + } +} {4 1 1 one one 1 2 one two} +db close + # open a 2.0 database with little endian hmac page numbers (default) # verify it can be opened do_test open-2.0-le-database { sqlite_orig db sqlcipher-2.0-le-testkey.db execsql { PRAGMA key = 'testkey'; + PRAGMA kdf_iter = 4000; SELECT count(*) FROM t1; SELECT * FROM t1; } @@ -1599,6 +1618,7 @@ do_test open-2.0-be-database { execsql { PRAGMA key = 'testkey'; PRAGMA cipher_hmac_pgno = be; + PRAGMA kdf_iter = 4000; SELECT count(*) FROM t1; SELECT * FROM t1; } @@ -1615,6 +1635,7 @@ do_test be-to-le-migration { execsql { PRAGMA key = 'testkey'; PRAGMA cipher_hmac_pgno = be; + PRAGMA kdf_iter = 4000; ATTACH DATABASE 'test.db' AS db2 KEY 'testkey'; CREATE TABLE db2.t1(a,b); INSERT INTO db2.t1 SELECT * FROM main.t1; @@ -1684,6 +1705,31 @@ do_test verify-pragma-cipher-default-use-hmac-off { db close file delete -force test.db +# verify the pragma default_cipher_kdf_iter +# is set to 64000 by default +do_test verify-pragma-cipher-default-kdf-iter-default { + sqlite_orig db test.db + execsql { + PRAGMA cipher_default_kdf_iter; + } +} {64000} +db close +file delete -force test.db + + +# verify the pragma default_cipher_kdf_ter +# reports changes +do_test verify-pragma-cipher-default-use-hmac-off { + sqlite_orig db test.db + execsql { + PRAGMA cipher_default_kdf_iter = 1000; + PRAGMA cipher_default_kdf_iter; + PRAGMA cipher_default_kdf_iter = 64000; + } +} {1000} +db close +file delete -force test.db + # verify the pragma kdf_iter # reports the default value do_test verify-pragma-kdf-iter-reports-default { @@ -1692,7 +1738,7 @@ do_test verify-pragma-kdf-iter-reports-default { PRAGMA key = 'test'; PRAGMA kdf_iter; } -} {4000} +} {64000} db close file delete -force test.db @@ -1843,6 +1889,7 @@ do_test open-2.0-beta-database { sqlite_orig db sqlcipher-2.0-beta-testkey.db execsql { PRAGMA key = 'testkey'; + PRAGMA kdf_iter = 4000; PRAGMA fast_kdf_iter = 4000; PRAGMA cipher_hmac_salt_mask = "x'00'"; SELECT count(*) FROM t1; @@ -1861,6 +1908,7 @@ do_test 2.0-beta-to-2.0-migration { execsql { PRAGMA key = 'testkey'; PRAGMA cipher_hmac_salt_mask = "x'00'"; + PRAGMA kdf_iter = 4000; PRAGMA fast_kdf_iter = 4000; SELECT count(*) FROM sqlite_master;