[Pkg-cryptsetup-devel] Bug#445186: Bug#445186: cryptsetup: Please load optimized cipher kernel modules by default

David Härdeman david at hardeman.nu
Thu Oct 4 14:38:26 UTC 2007


On Wed, October 3, 2007 22:52, Reinhard Tartler wrote:
> In ubuntu, we have patched cryptsetup so that it looks for
> optimized ciphers kernel modules and loads them if
> available. Please consider merging this patch to debian.

In general a good idea, some comments below:

> diff -pruN 2:1.0.5-2/debian/cryptdisks.functions
> 2:1.0.5-2ubuntu1/debian/cryptdisks.functions
> --- 2:1.0.5-2/debian/cryptdisks.functions	2007-10-03 00:08:07.000000000
> +0100
> +++ 2:1.0.5-2ubuntu1/debian/cryptdisks.functions	2007-10-03
> 00:07:57.000000000 +0100
> @@ -1,3 +1,8 @@
> +#
> +# This file is for inclusion with
> +#	. /lib/cryptsetup/cryptdisks.functions
> +# and should not be executed directly.
> +
>  PATH="/sbin:/bin"
>  TABFILE=/etc/crypttab
>  CRYPTDISKS_ENABLE="Yes"
> @@ -391,6 +412,18 @@ do_close () {
>  	return $?
>  }
>
> +load_optimized_aes_module () {
> +        local asm_module modulesdir
> +
> +        # find directory with kernel modules
> +        modulesdir="/lib/modules/`uname -r`"
> +        # Add assembly optimized AES module if it exists
> +        asm_module=`ls -1 "$modulesdir"/kernel/arch/*/*/aes*.ko`
> +        if [ $asm_module ];then

if [ -n "$asm_module" ]; then....but see below

> +           insmod $asm_module 2>/dev/null || true
> +        fi
> +}

It seems unnecessary to have an aes-specific function, why not:

load_optimized_module() {
        local module optmodule
        module="$1"

        optmodule=$(find "/lib/modules/$(uname -r)/kernel/arch" -name
"${module}*.ko" 2> /dev/null)
        if [ -n "$optmodule" ] && [ "$(echo -n "$optmodule" | wc -l)" -eq
1 ]; then
                modprobe "$optmodule" 2>/dev/null && return 0
        fi

        modprobe "$module" 2>/dev/null || return 1
        return 0
}

(I haven't tested that code, I just wrote it up to show the idea)

Advantages:
* works for all kinds of modules (twofish for example).

* use of modprobe allows blacklists to work

* falls back on non-optimized module automatically

* detects if more than one candidate is found (most likely an error) and
falls back to unoptimized

>  # Sets up all entries in crypttab
>  do_start () {
>  	local dst src key opts result
> @@ -399,6 +432,7 @@ do_start () {
>  	modprobe -qb dm-crypt || true
>  	dmsetup mknodes > /dev/null 2>&1 || true
>  	log_action_begin_msg "Starting $INITSTATE crypto disks"
> +	load_optimized_aes_module

With the above function, the function call could go someplace else
(probably to the "cipher" part of the big switch statement in parse_opts.

> --- 2:1.0.5-2/debian/initramfs/cryptroot-hook	2007-10-03
> 00:08:07.000000000 +0100
> +++ 2:1.0.5-2ubuntu1/debian/initramfs/cryptroot-hook	2007-10-03
> 00:07:57.000000000 +0100
> @@ -357,9 +371,18 @@ add_device() {
>
>  # Unless MODULES = "dep", we always add a basic subset of modules/tools
>  if [ "$MODULES" != "dep" ]; then
> -	for mod in dm_mod dm_crypt aes sha256 cbc; do
> +	for mod in dm_mod dm_crypt sha256 cbc; do
>  		manual_add_modules $mod
>  	done
> +
> +	# Add assembly optimized AES module if it exists
> +	asm_module=`find "$MODULESDIR"/kernel/arch/ -name aes\*`
> +	if [ $asm_module ];then
> +		manual_add_modules `basename "$asm_module"|sed s/.ko//`
> +	else
> +		manual_add_modules aes
> +	fi
> +

And then a copy of the function above, but with manual_add_modules instead
of modprobe, can be added to the initramfs hook.

-- 
David Härdeman






More information about the Pkg-cryptsetup-devel mailing list