Cryptsetup 1.6.0 Release Notes ============================== Changes since version 1.6.0-rc1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Change LUKS default cipher to to use XTS encryption mode, aes-xts-plain64 (i.e. using AES128-XTS). XTS mode becomes standard in hard disk encryption. You can still use any old mode: - compile cryptsetup with old default: configure --with-luks1-cipher=aes --with-luks1-mode=cbc-essiv:sha256 --with-luks1-keybits=256 - format LUKS device with old default: cryptsetup luksFormat -c aes-cbc-essiv:sha256 -s 256 * Skip tests and fix error messages if running on old systems (or with old kernel). * Rename configure.in to configure.ac and fix issues with new automake and pkgconfig and --disable-kernel_crypto option to allow compilation with old kernel headers. * Allow repair of 512 bits key header. * Fix status of device if path argument is used and fix double path prefix for non-existent device path. Changes since version 1.5.1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Important changes ~~~~~~~~~~~~~~~~~ * Cryptsetup and libcryptsetup is now released under GPLv2+ (GPL version 2 or any later). Some internal code handling files (loopaes, verity, tcrypt and crypto backend wrapper) are LGPLv2+. Previously code was GPL version 2 only. * Introducing new unified command open and close. Example: cryptsetup open --type plain|luks|loopaes|tcrypt (type defaults to luks) with backward-compatible aliases plainOpen, luksOpen, loopaesOpen, tcryptOpen. Basically "open --type xyz" has alias "xyzOpen". The "create" command (plain device create) is DEPRECATED but will be still supported. (This command is confusing because of switched arguments order.) The close command is generic command to remove mapping and have backward compatible aliases (remove, luksClose, ...) which behaves exactly the same. While all old syntax is still supported, I strongly suggest to use new command syntax which is common for all device types (and possible new formats added in future). * cryptsetup now support directly TCRYPT (TrueCrypt and compatible tc-play) on-disk format (Code is independent implementation not related to original project). Only dump (tcryptDump command) and activation (open --type tcrypt or tcryptOpen) of TCRYPT device are supported. No header changes are supported. It is intended to easily access containers shared with other operating systems without need to install 3rd party software. For native Linux installations LUKS is the preferred format. WARNING: TCRYPT extension requires kernel userspace crypto API to be available (introduced in Linux kernel 2.6.38). If you are configuring kernel yourself, enable "User-space interface for symmetric key cipher algorithms" in "Cryptographic API" section (CRYPTO_USER_API_SKCIPHER .config option). Because TCRYPT header is encrypted, you have to always provide valid passphrase and keyfiles. Keyfiles are handled exactly the same as in original format (basically, first 1MB of every keyfile is mixed using CRC32 into pool). Cryptsetup should recognize all TCRYPT header variants ever released, except legacy cipher chains using LRW encryption mode with 64 bits encryption block (namely Blowfish in LRW mode is not recognized, this is limitation of kernel crypto API). Device activation is supported only for LRW/XTS modes (again, limitation of kernel dmcrypt which do not implements TCRYPT extensions to CBC mode). (So old containers cannot be activated, but you can use libcryptsetup for lost password search, example of such code is included in misc directory.) Hidden header are supported using --tcrypt-hidden option, system encryption using --tcrypt-system option. For detailed description see man page. EXAMPLE: * Dump device parameters of container in file: # cryptsetup tcryptDump tst Enter passphrase: TCRYPT header information for tst Version: 5 Driver req.: 7 Sector size: 512 MK offset: 131072 PBKDF2 hash: sha512 Cipher chain: serpent-twofish-aes Cipher mode: xts-plain64 MK bits: 1536 You can also dump master key using --dump-master-key. Dump does not require superuser privilege. * Activation of this container # cryptsetup tcryptOpen tst tcrypt_dev Enter passphrase: (Chain of dmcrypt devices is activated as /dev/mapper/tcrypt_dev.) * See status of active TCRYPT device # cryptsetup status tcrypt_dev /dev/mapper/tcrypt_dev is active. type: TCRYPT cipher: serpent-twofish-aes-xts-plain64 keysize: 1536 bits device: /dev/loop0 loop: /tmp/tst offset: 256 sectors size: 65024 sectors skipped: 256 sectors mode: read/write * And plaintext filesystem now ready to mount # blkid /dev/mapper/tcrypt_dev /dev/mapper/tcrypt_dev: SEC_TYPE="msdos" UUID="9F33-2954" TYPE="vfat" * Add (optional) support for lipwquality for new LUKS passwords. If password is entered through terminal (no keyfile specified) and cryptsetup is compiled with --enable-pwquality, default system pwquality settings are used to check password quality. You can always override this check by using new --force-password option. For more info about pwquality project see http://libpwquality.fedorahosted.org/ * Proper handle interrupt signals (ctrl+c and TERM signal) in tools Code should now handle interrupt properly, release and explicitly wipe in-memory key materials on interrupt. (Direct users of libcryptsetup should always call crypt_free() when code is interrupted to wipe all resources. There is no signal handling in library, it is up to the tool using it.) * Add new benchmark command The "benchmark" command now tries to benchmark PBKDF2 and some block cipher variants. You can specify you own parameters (--cipher/--key-size for block ciphers, --hash for PBKDF2). See man page for detailed description. WARNING: benchmark command requires kernel userspace crypto API to be available (introduced in Linux kernel 2.6.38). If you are configuring kernel yourself, enable "User-space interface for symmetric key cipher algorithms" in "Cryptographic API" section (CRYPTO_USER_API_SKCIPHER .config option). EXAMPLE: # cryptsetup benchmark # Tests are approximate using memory only (no storage IO). PBKDF2-sha1 111077 iterations per second PBKDF2-sha256 53718 iterations per second PBKDF2-sha512 18832 iterations per second PBKDF2-ripemd160 89775 iterations per second PBKDF2-whirlpool 23918 iterations per second # Algorithm | Key | Encryption | Decryption aes-cbc 128b 212.0 MiB/s 428.0 MiB/s serpent-cbc 128b 23.1 MiB/s 66.0 MiB/s twofish-cbc 128b 46.1 MiB/s 50.5 MiB/s aes-cbc 256b 163.0 MiB/s 350.0 MiB/s serpent-cbc 256b 23.1 MiB/s 66.0 MiB/s twofish-cbc 256b 47.0 MiB/s 50.0 MiB/s aes-xts 256b 190.0 MiB/s 190.0 MiB/s serpent-xts 256b 58.4 MiB/s 58.0 MiB/s twofish-xts 256b 49.0 MiB/s 49.5 MiB/s aes-xts 512b 175.0 MiB/s 175.0 MiB/s serpent-xts 512b 59.0 MiB/s 58.0 MiB/s twofish-xts 512b 48.5 MiB/s 49.5 MiB/s Or you can specify cipher yourself: # cryptsetup benchmark --cipher cast5-cbc-essiv:sha256 -s 128 # Tests are approximate using memory only (no storage IO). # Algorithm | Key | Encryption | Decryption cast5-cbc 128b 32.4 MiB/s 35.0 MiB/s WARNING: these tests do not use dmcrypt, only crypto API. You have to benchmark the whole device stack and you can get completely different results. But is is usable for basic comparison. (Note for example AES-NI decryption optimization effect in example above.) Features ~~~~~~~~ * Do not maintain ChangeLog file anymore, see git log for detailed changes, e.g. here http://code.google.com/p/cryptsetup/source/list * Move change key into library, add crypt_keyslot_change_by_passphrase(). This change is useful mainly in FIPS mode, where we cannot extract volume key directly from libcryptsetup. * Add verbose messages during reencryption. * Default LUKS PBKDF2 iteration time is now configurable. * Add simple cipher benchmarking API. * Add kernel skcipher backend. * Add CRC32 implementation (for TCRYPT). * Move PBKDF2 into crypto backend wrapper. This allows use it in other formats, use library implementations and also possible use of different KDF function in future. * New PBKDF2 benchmark using getrusage(). Fixes ~~~~~ * Avoid O_DIRECT open if underlying storage doesn't support it. * Fix some non-translated messages. * Fix regression in header backup (1.5.1) with container in file. * Fix blockwise read/write for end writes near end of device. (was not used in previous versions) * Ignore setpriority failure. * Code changes to fix/ignore problems found by Coverity static analysis, including - Get page size should never fail. - Fix time of check/use (TOCTOU test) in tools - Fix time of check/use in loop/wipe utils. - Fix time of check/use in device utils. * Disallow header restore if context is non-LUKS device.