2 All notable changes to this project will be documented in this file.
4 ## [unreleased] - (? 2024 - [unreleased changes])
6 ## [4.6.0] - (May 2024 - [4.6.0 changes])
7 - Sets default log level to WARN
8 - Sends default log output to: logcat for Android; Console for iOS and macOS; and stderr for all other platforms
9 - General improvements to log level assignments, output, and sanitization
10 - Fixes Apple Privacy Manifest by removing empty NSPrivacyCollectedDataType from PrivacyInfo.xcprivacy
11 - Moves Swift support defines for podspec user_target_xcconfig so they only apply to the consuming project
13 ## [4.5.7] - (April 2024 - [4.5.7 changes])
14 - Updates baseline to upstream SQLite 3.45.3
15 - Adds "device" logging and profile target using os_log for Apple (and logcat on Android)
16 - Fixes issues compiling with SQLITE_OMIT_LOG
17 - fixes malformed man page caused by old merge conflict
18 - Updates podspec for current Xcode versions, improved Swift support, and Privacy Manifest
20 ## [4.5.6] - (January 2024 - [4.5.6 changes])
21 - Updates baseline to upstream SQLite 3.44.2
22 - Improve PRAGMA cipher_integrity check to report expected page size if invalid
23 - Implement PRAGMA page_size compatibility with PRAGMA cipher_page_size so both will operate properly on encrypted databases
24 - Updates LICENSE.md with SQLCipher license to avoid ambiguity and remove redundance
26 ## [4.5.5] - (August 2023 - [4.5.5 changes])
27 - Updates baseline to upstream SQLite 3.42.0
28 - Do not allow key to be changed on a connection after it has been successfully used for an encryption or decryption operation to prevent accidental database corruption
29 - Raise an error if a rekey operation is attempted on an unencrypted database
30 - Raise an error when a key or rekey operation is passed an empty key
31 - Minor improvements to constant time functions
32 - Miscellaneous code and comment cleanup
34 ## [4.5.4] - (April 2023 - [4.5.4 changes])
35 - Updates baseline to upstream SQLite 3.41.2
36 - Updates minimum Apple SDK versions in podspec for new Xcode compatibility
37 - Return runtime OpenSSL version from PRAGMA cipher_provider_version (instead of hardcoded value)
38 - Adds guard against zero block size and crash if cryptographic provider initialization fails
39 - When an ATTACH occurs creating a new encrypted database as the first operation after keying the main database, the new database will have the same salt value.
41 ## [4.5.3] - (December 2022 - [4.5.3 changes])
42 - Updates baseline to upstream SQLite 3.39.4
44 ## [4.5.2] - (August 2022 - [4.5.2 changes])
45 - Updates source code baseline to upstream SQLite 3.39.2
46 - Simplifies OpenSSL version conditional code
47 - Fixes issue where PRAGMA cipher_memory_security could report OFF when it was actually ON
48 - Fixes fix unfreed OpenSSL allocation when compiled against version 3
49 - Fixes support for building against recent versions of BoringSSL
51 ## [4.5.1] - (March 2022 - [4.5.1 changes])
52 - Updates source code baseline to upstream SQLite 3.37.2
53 - Adds PRAGMA cipher_log and cipher_log_level features to allow logging of TRACE, DEBUG, INFO, WARN, and ERROR messages to stdout, stderr, file, or logcat
54 - Modifies PRAGMA cipher_profile to use sqlite3_trace_v2 and adds logcat target for Android
55 - Updates OpenSSL provider to use EVP_MAC API with version 3+
56 - Adds new PRAGMA cipher_test_on, cipher_test_off, and cipher_test_rand (available when compiled with -DSQLCIPHER_TEST) to facilitate simulation of error conditions
57 - Fixes PRAGMA cipher_integrity_check to work properly with databases larger that 2GB
58 - Fixes missing munlock before free for context internal buffer (thanks to Fedor Indutny)
60 ## [4.5.0] - (October 2021 - [4.5.0 changes])
61 - Updates baseline to upstream SQLite 3.36.0
62 - Changes the enhanced memory security feature to be DISABLED by default; once enabled by PRAGMA cipher_memory_security = ON, it can't be turned off for the lifetime of the process
63 - Changes PRAGMA cipher_migrate to permanently enter an error state if a migration fails
64 - Fixes memory locking/unlocking issue with realloc implementation on hardened runtimes when memory security is enabled
65 - Fixes cipher_migrate to cleanup the temporary database if a migration fails
66 - Removes logging of non-string pointers when compiling with trace level logging
68 ## [4.4.3] - (February 2021 - [4.4.3 changes])
69 - Updates baseline to ustream SQLite 3.34.1
70 - Fixes sqlcipher_export handling of NULL parameters
71 - Removes randomization of rekey-delete tests to avoid false test failures
72 - Changes internal usage of sqlite_master to sqlite_schema
73 - Omits unusued profiling function under certain defines to avoid compiler warnings
75 ## [4.4.2] - (November 2020 - [4.4.2 changes])
76 - Improve error handling to resolve potential corruption if an encryption operation failed while operating in WAL mode
77 - Changes to OpenSSL library cryptographic provider to reduce initialization complexity
78 - Adjust cipher_integrity_check to skip locking page to avoid a spurious error report for very large databases
79 - Miscellaneous code and comment cleanup
81 ## [4.4.1] - (October 2020 - [4.4.1 changes])
82 - Updates baseline to upstream SQLite 3.33.0
83 - Fixes double-free bug in cipher_default_plaintext_header_size
84 - Changes SQLCipher tests to use suite runner
85 - Improvement to cipher_integrity_check tests to minimize false negatives
86 - Deprecates PRAGMA cipher_store_pass
88 ## [4.4.0] - (May 2020 - [4.4.0 changes])
89 - Updates baseline to upstream SQLite 3.31.0
90 - Adjusts shell to report SQLCipher version alongside SQLite version
91 - Fixes various build warnings under several compilers
92 - Removes unused id and status functions from provider interface
94 ## [4.3.0] - (November 2019 - [4.3.0 changes])
95 - Updates baseline to upstream SQLite 3.30.1
96 - PRAGMA key now returns text result value "ok" after execution
97 - Adjusts backup API so that encrypted to encrypted backups are permitted
98 - Adds NSS crypto provider implementation
99 - Fixes OpenSSL provider compatibility with BoringSSL
100 - Separates memory related traces to reduce verbosity of logging
101 - Fixes output of PRAGMA cipher_integrity_check on big endian platforms
102 - Cryptograpic provider interface cleanup
103 - Rework of mutex allocation and management
104 - Resolves miscellaneous build warnings
105 - Force error state at database pager level if SQLCipher initialization fails
107 ## [4.2.0] - (May 2019 - [4.2.0 changes])
108 - Adds PRAGMA cipher_integrity_check to perform independent verification of page HMACs
109 - Updates baseline to upstream SQLite 3.28.0
110 - Improves PRAGMA cipher_migrate to handle keys containing non-terminating zero bytes
112 ## [4.1.0] - (March 2019 - [4.1.0 changes])
113 - Defer reading salt from header until key derivation is triggered
114 - Clarify usage of sqlite3_rekey for plaintext databases in header
115 - Normalize attach behavior when key is not yet derived
116 - Adds PRAGMA cipher_settings to query current database codec settings
117 - Adds PRAGMA cipher_default_settings to query current default SQLCipher options
118 - PRAGMA cipher_hmac_pgno is now deprecated
119 - PRAGMA cipher_hmac_salt_mask is now deprecated
120 - PRAGMA fast_kdf_iter is now deprecated
121 - Improve sqlcipher_export routine and restore all database flags
122 - Clear codec data buffers if a crypographic provider operation fails
123 - Disable backup API for encrypted databases (this was previously documented as not-working and non-supported, but will now explicitly error out on initialization)
124 - Updates baseline to upstream SQLite 3.27.2
126 ## [4.0.1] - (December 2018 - [4.0.1 changes])
127 - Based on upstream SQLite 3.26.0 (addresses SQLite “Magellan” issue)
128 - Adds PRAGMA cipher_compatibility and cipher_default_compatibility which take automatcially configure appropriate compatibility settings for the specified SQLCipher major version number
129 - Filters attach statements with KEY parameters from readline history
130 - Fixes crash in command line shell with empty input (i.e. ^D)
131 - Fixes warnings when compiled with strict-prototypes
133 ## [4.0.0] - (November 2018 - [4.0.0 changes])
135 - Default page size for databases increased to 4096 bytes (up from 1024) *
136 - Default PBKDF2 iterations increased to 256,000 (up from 64,000) *
137 - Default KDF algorithm is now PBKDF2-HMAC-SHA512 (from PBKDF2-HMAC-SHA1) *
138 - Default HMAC algorithm is now HMAC-SHA512 (from HMAC-SHA1) *
139 - PRAGMA cipher is now disabled and no longer supported (after multi-year deprecation) *
140 - PRAGMA rekey_cipher is now disabled and no longer supported *
141 - PRAGMA rekey_kdf_iter is now disabled and no longer supported *
142 - By default all memory allocated internally by SQLite before the memory is wiped before it is freed
143 - PRAGMA cipher_memory_security: allows full memory wiping to be disabled for performance when the feature is not required
144 - PRAGMA cipher_kdf_algorithm, cipher_default_kdf_algorithm to control KDF algorithm selection between PBKDF2-HMAC-SHA1, PBKDF2-HMAC-SHA256 and PBKDF2-HMAC-SHA512
145 - PRAGMA cipher_hmac_algorithm, cipher_default_hmac_algorithm to control HMAC algorithm selection between HMAC-SHA1, HMAC-SHA256 and PBKDF2-HMAC-SHA512
146 - Based on upstream SQLite 3.25.2
147 - When compiled with readline support, PRAGMA key and rekey lines will no longer be
149 - Adds second optional parameter to sqlcipher_export to specify source database to
150 support bidirectional exports
151 - Fixes compatibility with LibreSSL 2.7.0+
152 - Fixes compatibility with OpenSSL 1.1.x
153 - Simplified and improved performance for PRAGMA cipher_migrate when migrating older database versions
154 - Refactoring of SQLCipher tests into separate files by test type
155 - PRAGMA cipher_plaintext_header_size and cipher_default_plaintext_header_size: allocates a portion of the database header which will not be encrypted to allow identification as a SQLite database
156 - PRAGMA cipher_salt: retrieve or set the salt value for the database
157 - Adds Podspec for using tagged versions of SQLCipher
158 - Define SQLCIPHER_PROFILE_USE_FOPEN for WinXP support
159 - Improved error handling for cryptographic providers
160 - Improved memory handling for PRAGMA commands that return values
161 - Improved version reporting to assist with identification of distribution
162 - Major rewrite and simplification of internal codec and pager extension
163 - Fixes compilation with --disable-amalgamation
164 - Removes sqlcipher.xcodeproj build support
166 ## [3.4.2] - (December 2017 - [3.4.2 changes])
168 - Added support for building with LibreSSL
171 - Merge upstream SQLite 3.20.1
172 - Text strings for `SQLITE_ERROR` and `SQLITE_NOTADB` changed to match upstream SQLite
173 - Remove static modifier for codec password functions
174 - Page alignment for `mlock`
175 - Fix segfault in `sqlcipher_cipher_ctx_cmp` during rekey operation
176 - Fix `sqlcipher_export` and `cipher_migrate` when tracing API in use
177 - Validate codec page size when setting
178 - Guard OpenSSL initialization and cleanup routines
179 - Allow additional linker options to be passed via command line for Windows platforms
181 ## [3.4.1] - (December 2016 - [3.4.1 changes])
183 - Added support for OpenSSL 1.1.0
186 - Merged upstream SQLite 3.15.2
188 ## [3.4.0] - (April 2016 - [3.4.0 changes])
190 - Added `PRAGMA cipher_provider_version`
193 - Merged upstream SQLite 3.11.0
196 - Deprecated `PRAGMA cipher` command
198 ## [3.3.1] - (July 2015 - [3.3.1 changes])
200 - Merge upstream SQLite 3.8.10.2
201 - Fixed segfault when provided an invalid cipher name
202 - Check for codec context when performing `PRAGMA cipher_store_pass`
203 - Remove extraneous null check in `PRAGMA cipher_migrate`
205 ## [3.3.0] - (March 2015 - [3.3.0 changes])
207 - Added FIPS API calls within the OpenSSL crypto provider
208 - `PRAGMA cipher_default_page_size` - support for attaching non-default page sizes
211 - Merged upstream SQLite 3.8.8.3
213 ## [3.2.0] - (September 2014 - [3.2.0 changes])
215 - Added `PRAGMA cipher_store_pass`
218 - Merged upstream SQLite 3.8.6
219 - Renmed README to README.md
221 ## [3.1.0] - (April 2014 - [3.1.0 changes])
223 - Added `PRAGMA cipher_profile`
226 - Merged upstream SQLite 3.8.4.3
228 ## [3.0.1] - (December 2013 - [3.0.1 changes])
230 - Added `PRAGMA cipher_add_random` to source external entropy
233 - Fix `PRAGMA cipher_migrate` to handle passphrases longer than 64 characters & raw keys
234 - Improvements to the libtomcrypt provider
236 ## [3.0.0] - (November 2013 - [3.0.0 changes])
238 - Added `PRAGMA cipher_migrate` to migrate older database file formats
241 - Merged upstream SQLite 3.8.0.2
242 - Remove usage of VirtualLock/Unlock on WinRT and Windows Phone
243 - Ignore HMAC read during Btree file copy
244 - Fix lib naming for pkg-config
245 - Use _v2 version of `sqlite3_key` and `sqlite3_rekey`
246 - Update xcodeproj file
249 - Change KDF iteration length from 4,000 to 64,000
251 [unreleased]: https://github.com/sqlcipher/sqlcipher/tree/prerelease
252 [unreleased changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.6.0...prerelease
253 [4.6.0]: https://github.com/sqlcipher/sqlcipher/tree/v4.6.0
254 [4.6.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.5.7...v4.6.0
255 [4.5.7]: https://github.com/sqlcipher/sqlcipher/tree/v4.5.7
256 [4.5.7 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.5.6...v4.5.7
257 [4.5.6]: https://github.com/sqlcipher/sqlcipher/tree/v4.5.6
258 [4.5.6 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.5.5...v4.5.6
259 [4.5.5]: https://github.com/sqlcipher/sqlcipher/tree/v4.5.5
260 [4.5.5 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.5.4...v4.5.5
261 [4.5.4]: https://github.com/sqlcipher/sqlcipher/tree/v4.5.4
262 [4.5.4 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.5.3...v4.5.4
263 [4.5.3]: https://github.com/sqlcipher/sqlcipher/tree/v4.5.3
264 [4.5.3 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.5.2...v4.5.3
265 [4.5.2]: https://github.com/sqlcipher/sqlcipher/tree/v4.5.2
266 [4.5.2 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.5.1...v4.5.2
267 [4.5.1]: https://github.com/sqlcipher/sqlcipher/tree/v4.5.1
268 [4.5.1 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.5.0...v4.5.1
269 [4.5.0]: https://github.com/sqlcipher/sqlcipher/tree/v4.5.0
270 [4.5.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.4.3...v4.5.0
271 [4.4.3]: https://github.com/sqlcipher/sqlcipher/tree/v4.4.3
272 [4.4.3 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.4.2...v4.4.3
273 [4.4.2]: https://github.com/sqlcipher/sqlcipher/tree/v4.4.2
274 [4.4.2 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.4.1...v4.4.2
275 [4.4.1]: https://github.com/sqlcipher/sqlcipher/tree/v4.4.1
276 [4.4.1 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.4.0...v4.4.1
277 [4.4.0]: https://github.com/sqlcipher/sqlcipher/tree/v4.4.0
278 [4.4.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.3.0...v4.4.0
279 [4.3.0]: https://github.com/sqlcipher/sqlcipher/tree/v4.3.0
280 [4.3.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.2.0...v4.3.0
281 [4.2.0]: https://github.com/sqlcipher/sqlcipher/tree/v4.2.0
282 [4.2.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.1.0...v4.2.0
283 [4.1.0]: https://github.com/sqlcipher/sqlcipher/tree/v4.1.0
284 [4.1.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.0.1...v4.1.0
285 [4.0.1]: https://github.com/sqlcipher/sqlcipher/tree/v4.0.1
286 [4.0.1 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.0.0...v4.0.1
287 [4.0.0]: https://github.com/sqlcipher/sqlcipher/tree/v4.0.0
288 [4.0.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.4.2...v4.0.0
289 [3.4.2]: https://github.com/sqlcipher/sqlcipher/tree/v3.4.2
290 [3.4.2 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.4.1...v3.4.2
291 [3.4.1]: https://github.com/sqlcipher/sqlcipher/tree/v3.4.1
292 [3.4.1 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.4.0...v3.4.1
293 [3.4.0]: https://github.com/sqlcipher/sqlcipher/tree/v3.4.0
294 [3.4.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.3.1...v3.4.0
295 [3.3.1]: https://github.com/sqlcipher/sqlcipher/tree/v3.3.1
296 [3.3.1 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.3.0...v3.3.1
297 [3.3.0]: https://github.com/sqlcipher/sqlcipher/tree/v3.3.0
298 [3.3.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.2.0...v3.3.0
299 [3.2.0]: https://github.com/sqlcipher/sqlcipher/tree/v3.2.0
300 [3.2.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.1.0...v3.2.0
301 [3.1.0]: https://github.com/sqlcipher/sqlcipher/tree/v3.1.0
302 [3.1.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.0.1...v3.1.0
303 [3.0.1]: https://github.com/sqlcipher/sqlcipher/tree/v3.0.1
304 [3.0.1 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.0.0...v3.0.1
305 [3.0.0]: https://github.com/sqlcipher/sqlcipher/tree/v3.0.0
306 [3.0.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v2.2.0...v3.0.0
307 [2.2.0]: https://github.com/sqlcipher/sqlcipher/tree/v2.2.0
308 [2.2.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v2.1.1...v2.2.0
309 [2.1.1]: https://github.com/sqlcipher/sqlcipher/tree/v2.1.1
310 [2.1.1 changes]: https://github.com/sqlcipher/sqlcipher/compare/v2.1.0...v2.1.1
311 [2.1.0]: https://github.com/sqlcipher/sqlcipher/tree/v2.1.0
312 [2.1.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v2.0.6...v2.1.0
313 [2.0.6]: https://github.com/sqlcipher/sqlcipher/tree/v2.0.6
314 [2.0.6 changes]: https://github.com/sqlcipher/sqlcipher/compare/v2.0.5...v2.0.6
315 [2.0.5]: https://github.com/sqlcipher/sqlcipher/tree/v2.0.5
316 [2.0.5 changes]: https://github.com/sqlcipher/sqlcipher/compare/v2.0.3...v2.0.5
317 [2.0.3]: https://github.com/sqlcipher/sqlcipher/tree/v2.0.3
318 [2.0.3 changes]: https://github.com/sqlcipher/sqlcipher/compare/v2.0.0...v2.0.3
319 [2.0.0]: https://github.com/sqlcipher/sqlcipher/tree/v2.0.0
320 [2.0.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.10...v2.0.0
321 [1.1.10]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.10
322 [1.1.10 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.9...v1.1.10
323 [1.1.9]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.9
324 [1.1.9 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.8...v1.1.9
325 [1.1.8]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.8
326 [1.1.8 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.7...v1.1.8
327 [1.1.7]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.7
328 [1.1.7 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.6...v1.1.7
329 [1.1.6]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.6
330 [1.1.6 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.5...v1.1.6
331 [1.1.5]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.5
332 [1.1.5 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.4...v1.1.5
333 [1.1.4]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.4
334 [1.1.4 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.3...v1.1.4
335 [1.1.3]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.3
336 [1.1.3 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.2...v1.1.3
337 [1.1.2]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.2
338 [1.1.2 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.1...v1.1.1
339 [1.1.1]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.1
340 [1.1.1 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.0...v1.1.1
341 [1.1.0]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.0
342 [1.1.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/617ed01...v1.1.0