diff mbox series

common/encrypt: allow the use of 'fscrypt:' as key prefix

Message ID 20220401104553.32036-1-lhenriques@suse.de (mailing list archive)
State New, archived
Headers show
Series common/encrypt: allow the use of 'fscrypt:' as key prefix | expand

Commit Message

Luis Henriques April 1, 2022, 10:45 a.m. UTC
fscrypt keys have used the $FSTYP as prefix.  However this format is being
deprecated -- newer kernels already allow the usage of the generic
'fscrypt:' prefix for ext4 and f2fs.  This patch allows the usage of this
new prefix for testing filesystems that have never supported the old
format, but keeping the $FSTYP prefix for filesystems that support it, so
that old kernels can be tested.

Signed-off-by: Luís Henriques <lhenriques@suse.de>
---
 common/encrypt | 38 +++++++++++++++++++++++++++-----------
 1 file changed, 27 insertions(+), 11 deletions(-)

Comments

Jeff Layton April 1, 2022, 12:37 p.m. UTC | #1
On Fri, 2022-04-01 at 11:45 +0100, Luís Henriques wrote:
> fscrypt keys have used the $FSTYP as prefix.  However this format is being
> deprecated -- newer kernels already allow the usage of the generic
> 'fscrypt:' prefix for ext4 and f2fs.  This patch allows the usage of this
> new prefix for testing filesystems that have never supported the old
> format, but keeping the $FSTYP prefix for filesystems that support it, so
> that old kernels can be tested.
> 
> Signed-off-by: Luís Henriques <lhenriques@suse.de>
> ---
>  common/encrypt | 38 +++++++++++++++++++++++++++-----------
>  1 file changed, 27 insertions(+), 11 deletions(-)
> 
> diff --git a/common/encrypt b/common/encrypt
> index f90c4ef05a3f..897c97e0f6fa 100644
> --- a/common/encrypt
> +++ b/common/encrypt
> @@ -250,6 +250,27 @@ _num_to_hex()
>  	fi
>  }
>  
> +# Keys are named $FSTYP:KEYDESC where KEYDESC is the 16-character key descriptor
> +# hex string.  Newer kernels (ext4 4.8 and later, f2fs 4.6 and later) also allow
> +# the common key prefix "fscrypt:" in addition to their filesystem-specific key
> +# prefix ("ext4:", "f2fs:").  It would be nice to use the common key prefix, but
> +# for now use the filesystem- specific prefix for these 2 filesystems to make it
> +# possible to test older kernels, and the "fscrypt" prefix for anything else.
> +_get_fs_keyprefix()
> +{
> +	local prefix=""
> +
> +	case $FSTYP in
> +	ext4|f2fs|ubifs)
> +		prefix="$FSTYP"
> +		;;
> +	*)
> +		prefix="fscrypt"
> +		;;
> +	esac
> +	echo $prefix
> +}
> +
>  # Add the specified raw encryption key to the session keyring, using the
>  # specified key descriptor.
>  _add_session_encryption_key()
> @@ -268,18 +289,11 @@ _add_session_encryption_key()
>  	#	};
>  	#
>  	# The kernel ignores 'mode' but requires that 'size' be 64.
> -	#
> -	# Keys are named $FSTYP:KEYDESC where KEYDESC is the 16-character key
> -	# descriptor hex string.  Newer kernels (ext4 4.8 and later, f2fs 4.6
> -	# and later) also allow the common key prefix "fscrypt:" in addition to
> -	# their filesystem-specific key prefix ("ext4:", "f2fs:").  It would be
> -	# nice to use the common key prefix, but for now use the filesystem-
> -	# specific prefix to make it possible to test older kernels...
> -	#
>  	local mode=$(_num_to_hex 0 4)
>  	local size=$(_num_to_hex 64 4)
> +	local prefix=$(_get_fs_keyprefix)
>  	echo -n -e "${mode}${raw}${size}" |
> -		$KEYCTL_PROG padd logon $FSTYP:$keydesc @s >>$seqres.full
> +		$KEYCTL_PROG padd logon $prefix:$keydesc @s >>$seqres.full
>  }
>  
>  #
> @@ -302,7 +316,8 @@ _generate_session_encryption_key()
>  _unlink_session_encryption_key()
>  {
>  	local keydesc=$1
> -	local keyid=$($KEYCTL_PROG search @s logon $FSTYP:$keydesc)
> +	local prefix=$(_get_fs_keyprefix)
> +	local keyid=$($KEYCTL_PROG search @s logon $prefix:$keydesc)
>  	$KEYCTL_PROG unlink $keyid >>$seqres.full
>  }
>  
> @@ -310,7 +325,8 @@ _unlink_session_encryption_key()
>  _revoke_session_encryption_key()
>  {
>  	local keydesc=$1
> -	local keyid=$($KEYCTL_PROG search @s logon $FSTYP:$keydesc)
> +	local prefix=$(_get_fs_keyprefix)
> +	local keyid=$($KEYCTL_PROG search @s logon $prefix:$keydesc)
>  	$KEYCTL_PROG revoke $keyid >>$seqres.full
>  }
>  

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Eric Biggers April 1, 2022, 6:12 p.m. UTC | #2
On Fri, Apr 01, 2022 at 11:45:53AM +0100, Luís Henriques wrote:
> fscrypt keys have used the $FSTYP as prefix.  However this format is being
> deprecated -- newer kernels already allow the usage of the generic
> 'fscrypt:' prefix for ext4 and f2fs.  This patch allows the usage of this
> new prefix for testing filesystems that have never supported the old
> format, but keeping the $FSTYP prefix for filesystems that support it, so
> that old kernels can be tested.
> 
> Signed-off-by: Luís Henriques <lhenriques@suse.de>
> ---
>  common/encrypt | 38 +++++++++++++++++++++++++++-----------
>  1 file changed, 27 insertions(+), 11 deletions(-)
> 
> diff --git a/common/encrypt b/common/encrypt
> index f90c4ef05a3f..897c97e0f6fa 100644
> --- a/common/encrypt
> +++ b/common/encrypt
> @@ -250,6 +250,27 @@ _num_to_hex()
>  	fi
>  }
>  
> +# Keys are named $FSTYP:KEYDESC where KEYDESC is the 16-character key descriptor
> +# hex string.  Newer kernels (ext4 4.8 and later, f2fs 4.6 and later) also allow
> +# the common key prefix "fscrypt:" in addition to their filesystem-specific key
> +# prefix ("ext4:", "f2fs:").  It would be nice to use the common key prefix, but
> +# for now use the filesystem- specific prefix for these 2 filesystems to make it
> +# possible to test older kernels, and the "fscrypt" prefix for anything else.
> +_get_fs_keyprefix()
> +{
> +	local prefix=""
> +
> +	case $FSTYP in
> +	ext4|f2fs|ubifs)
> +		prefix="$FSTYP"
> +		;;
> +	*)
> +		prefix="fscrypt"
> +		;;
> +	esac
> +	echo $prefix
> +}

ubifs can use the "fscrypt" prefix, since there was never a kernel that
supported ubifs encryption but not the "fscrypt" prefix.  Also, the "prefix"
local variable is unnecessary.  So:

	case $FSTYP in
	ext4|f2fs)
		echo $FSTYP
		;;
	*)
		echo fscrypt
		;;
	esac

Otherwise, this patch looks fine if we want to keep supporting testing kernels
older than 4.8.  However, since 4.4 is no longer a supported LTS kernel, perhaps
this is no longer needed and we could just always use "fscrypt"?  I'm not sure
what xfstests's policy on old kernels is.

- Eric
Jeff Layton April 1, 2022, 8:47 p.m. UTC | #3
On Fri, 2022-04-01 at 11:45 +0100, Luís Henriques wrote:
> fscrypt keys have used the $FSTYP as prefix.  However this format is being
> deprecated -- newer kernels already allow the usage of the generic
> 'fscrypt:' prefix for ext4 and f2fs.  This patch allows the usage of this
> new prefix for testing filesystems that have never supported the old
> format, but keeping the $FSTYP prefix for filesystems that support it, so
> that old kernels can be tested.
> 
> Signed-off-by: Luís Henriques <lhenriques@suse.de>
> ---
>  common/encrypt | 38 +++++++++++++++++++++++++++-----------
>  1 file changed, 27 insertions(+), 11 deletions(-)
> 
> diff --git a/common/encrypt b/common/encrypt
> index f90c4ef05a3f..897c97e0f6fa 100644
> --- a/common/encrypt
> +++ b/common/encrypt
> @@ -250,6 +250,27 @@ _num_to_hex()
>  	fi
>  }
>  
> +# Keys are named $FSTYP:KEYDESC where KEYDESC is the 16-character key descriptor
> +# hex string.  Newer kernels (ext4 4.8 and later, f2fs 4.6 and later) also allow
> +# the common key prefix "fscrypt:" in addition to their filesystem-specific key
> +# prefix ("ext4:", "f2fs:").  It would be nice to use the common key prefix, but
> +# for now use the filesystem- specific prefix for these 2 filesystems to make it
> +# possible to test older kernels, and the "fscrypt" prefix for anything else.
> +_get_fs_keyprefix()
> +{
> +	local prefix=""
> +
> +	case $FSTYP in
> +	ext4|f2fs|ubifs)
> +		prefix="$FSTYP"
> +		;;
> +	*)
> +		prefix="fscrypt"
> +		;;
> +	esac
> +	echo $prefix
> +}
> +
>  # Add the specified raw encryption key to the session keyring, using the
>  # specified key descriptor.
>  _add_session_encryption_key()
> @@ -268,18 +289,11 @@ _add_session_encryption_key()
>  	#	};
>  	#
>  	# The kernel ignores 'mode' but requires that 'size' be 64.
> -	#
> -	# Keys are named $FSTYP:KEYDESC where KEYDESC is the 16-character key
> -	# descriptor hex string.  Newer kernels (ext4 4.8 and later, f2fs 4.6
> -	# and later) also allow the common key prefix "fscrypt:" in addition to
> -	# their filesystem-specific key prefix ("ext4:", "f2fs:").  It would be
> -	# nice to use the common key prefix, but for now use the filesystem-
> -	# specific prefix to make it possible to test older kernels...
> -	#
>  	local mode=$(_num_to_hex 0 4)
>  	local size=$(_num_to_hex 64 4)
> +	local prefix=$(_get_fs_keyprefix)
>  	echo -n -e "${mode}${raw}${size}" |
> -		$KEYCTL_PROG padd logon $FSTYP:$keydesc @s >>$seqres.full
> +		$KEYCTL_PROG padd logon $prefix:$keydesc @s >>$seqres.full
>  }
>  
>  #
> @@ -302,7 +316,8 @@ _generate_session_encryption_key()
>  _unlink_session_encryption_key()
>  {
>  	local keydesc=$1
> -	local keyid=$($KEYCTL_PROG search @s logon $FSTYP:$keydesc)
> +	local prefix=$(_get_fs_keyprefix)
> +	local keyid=$($KEYCTL_PROG search @s logon $prefix:$keydesc)
>  	$KEYCTL_PROG unlink $keyid >>$seqres.full
>  }
>  
> @@ -310,7 +325,8 @@ _unlink_session_encryption_key()
>  _revoke_session_encryption_key()
>  {
>  	local keydesc=$1
> -	local keyid=$($KEYCTL_PROG search @s logon $FSTYP:$keydesc)
> +	local prefix=$(_get_fs_keyprefix)
> +	local keyid=$($KEYCTL_PROG search @s logon $prefix:$keydesc)
>  	$KEYCTL_PROG revoke $keyid >>$seqres.full
>  }
>  

For the record, without this patch in place, generic/397 hangs when
tested against the current ceph+fscrypt pile. With this, the test
passes.

Cheers,
Luis Henriques April 4, 2022, 8:55 a.m. UTC | #4
Eric Biggers <ebiggers@kernel.org> writes:

> On Fri, Apr 01, 2022 at 11:45:53AM +0100, Luís Henriques wrote:
>> fscrypt keys have used the $FSTYP as prefix.  However this format is being
>> deprecated -- newer kernels already allow the usage of the generic
>> 'fscrypt:' prefix for ext4 and f2fs.  This patch allows the usage of this
>> new prefix for testing filesystems that have never supported the old
>> format, but keeping the $FSTYP prefix for filesystems that support it, so
>> that old kernels can be tested.
>> 
>> Signed-off-by: Luís Henriques <lhenriques@suse.de>
>> ---
>>  common/encrypt | 38 +++++++++++++++++++++++++++-----------
>>  1 file changed, 27 insertions(+), 11 deletions(-)
>> 
>> diff --git a/common/encrypt b/common/encrypt
>> index f90c4ef05a3f..897c97e0f6fa 100644
>> --- a/common/encrypt
>> +++ b/common/encrypt
>> @@ -250,6 +250,27 @@ _num_to_hex()
>>  	fi
>>  }
>>  
>> +# Keys are named $FSTYP:KEYDESC where KEYDESC is the 16-character key descriptor
>> +# hex string.  Newer kernels (ext4 4.8 and later, f2fs 4.6 and later) also allow
>> +# the common key prefix "fscrypt:" in addition to their filesystem-specific key
>> +# prefix ("ext4:", "f2fs:").  It would be nice to use the common key prefix, but
>> +# for now use the filesystem- specific prefix for these 2 filesystems to make it
>> +# possible to test older kernels, and the "fscrypt" prefix for anything else.
>> +_get_fs_keyprefix()
>> +{
>> +	local prefix=""
>> +
>> +	case $FSTYP in
>> +	ext4|f2fs|ubifs)
>> +		prefix="$FSTYP"
>> +		;;
>> +	*)
>> +		prefix="fscrypt"
>> +		;;
>> +	esac
>> +	echo $prefix
>> +}
>
> ubifs can use the "fscrypt" prefix, since there was never a kernel that
> supported ubifs encryption but not the "fscrypt" prefix.  Also, the "prefix"
> local variable is unnecessary.  So:
>
> 	case $FSTYP in
> 	ext4|f2fs)
> 		echo $FSTYP
> 		;;
> 	*)
> 		echo fscrypt
> 		;;
> 	esac
>
> Otherwise, this patch looks fine if we want to keep supporting testing kernels
> older than 4.8.  However, since 4.4 is no longer a supported LTS kernel, perhaps
> this is no longer needed and we could just always use "fscrypt"?  I'm not sure
> what xfstests's policy on old kernels is.

Thank you for your feedback.  I'll resend the patch with your changes.  I
am, of course, OK dropping support for older kernels on fstests, but I'll
leave that decision for the maintainers; if anyone thinks that support
should be dropped, I can send another version of the patch doing that.

Cheers,
diff mbox series

Patch

diff --git a/common/encrypt b/common/encrypt
index f90c4ef05a3f..897c97e0f6fa 100644
--- a/common/encrypt
+++ b/common/encrypt
@@ -250,6 +250,27 @@  _num_to_hex()
 	fi
 }
 
+# Keys are named $FSTYP:KEYDESC where KEYDESC is the 16-character key descriptor
+# hex string.  Newer kernels (ext4 4.8 and later, f2fs 4.6 and later) also allow
+# the common key prefix "fscrypt:" in addition to their filesystem-specific key
+# prefix ("ext4:", "f2fs:").  It would be nice to use the common key prefix, but
+# for now use the filesystem- specific prefix for these 2 filesystems to make it
+# possible to test older kernels, and the "fscrypt" prefix for anything else.
+_get_fs_keyprefix()
+{
+	local prefix=""
+
+	case $FSTYP in
+	ext4|f2fs|ubifs)
+		prefix="$FSTYP"
+		;;
+	*)
+		prefix="fscrypt"
+		;;
+	esac
+	echo $prefix
+}
+
 # Add the specified raw encryption key to the session keyring, using the
 # specified key descriptor.
 _add_session_encryption_key()
@@ -268,18 +289,11 @@  _add_session_encryption_key()
 	#	};
 	#
 	# The kernel ignores 'mode' but requires that 'size' be 64.
-	#
-	# Keys are named $FSTYP:KEYDESC where KEYDESC is the 16-character key
-	# descriptor hex string.  Newer kernels (ext4 4.8 and later, f2fs 4.6
-	# and later) also allow the common key prefix "fscrypt:" in addition to
-	# their filesystem-specific key prefix ("ext4:", "f2fs:").  It would be
-	# nice to use the common key prefix, but for now use the filesystem-
-	# specific prefix to make it possible to test older kernels...
-	#
 	local mode=$(_num_to_hex 0 4)
 	local size=$(_num_to_hex 64 4)
+	local prefix=$(_get_fs_keyprefix)
 	echo -n -e "${mode}${raw}${size}" |
-		$KEYCTL_PROG padd logon $FSTYP:$keydesc @s >>$seqres.full
+		$KEYCTL_PROG padd logon $prefix:$keydesc @s >>$seqres.full
 }
 
 #
@@ -302,7 +316,8 @@  _generate_session_encryption_key()
 _unlink_session_encryption_key()
 {
 	local keydesc=$1
-	local keyid=$($KEYCTL_PROG search @s logon $FSTYP:$keydesc)
+	local prefix=$(_get_fs_keyprefix)
+	local keyid=$($KEYCTL_PROG search @s logon $prefix:$keydesc)
 	$KEYCTL_PROG unlink $keyid >>$seqres.full
 }
 
@@ -310,7 +325,8 @@  _unlink_session_encryption_key()
 _revoke_session_encryption_key()
 {
 	local keydesc=$1
-	local keyid=$($KEYCTL_PROG search @s logon $FSTYP:$keydesc)
+	local prefix=$(_get_fs_keyprefix)
+	local keyid=$($KEYCTL_PROG search @s logon $prefix:$keydesc)
 	$KEYCTL_PROG revoke $keyid >>$seqres.full
 }