From: Sweet Tea Dorminy <[email protected]>

Add the modes of getting the encryption nonces, either inode or extent,
to the various get_encryption_nonce functions. For now, no encrypt test
makes a file with more than one extent, so we can just grab the first
extent's nonce for the data nonce; when we write a bigger file test,
we'll need to change that.

v1:
 * adapt to the new on-disk format (btrfs-progs dump-tree changed).
   - use simple sed substitution to get the raw nonce

Signed-off-by: Sweet Tea Dorminy <[email protected]>
Signed-off-by: Daniel Vacek <[email protected]>
---
 common/encrypt | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/common/encrypt b/common/encrypt
index 8f664518..29293ea4 100644
--- a/common/encrypt
+++ b/common/encrypt
@@ -591,6 +591,16 @@ _get_encryption_file_nonce()
                                found = 0;
                        }'
                ;;
+       btrfs)
+               # Retrieve the fscrypt context for an inode as a hex string.
+               # btrfs prints these like:
+               #
+               #       item 21 key (258 FSCRYPT_INODE_CTX 0) itemoff 15081 
itemsize 40
+               #               value: 
020104000000000026845b8fc4d86191a06600879b25a852818ab722beec5fc403df968bf2e03af5
+               #
+               $BTRFS_UTIL_PROG inspect-internal dump-tree $device | \
+                       sed -n "/key ($inode FSCRYPT_INODE_CTX 0)/{n;s/.*value: 
.*\([0-9a-f]\{32\}\)$/\1/p}"
+               ;;
        *)
                _fail "_get_encryption_file_nonce() isn't implemented on $FSTYP"
                ;;
@@ -610,6 +620,16 @@ _get_encryption_data_nonce()
        ext4|f2fs)
                _get_encryption_file_nonce $device $inode
                ;;
+       btrfs)
+               # Retrieve the encryption IV of the first file extent in an 
inode as a hex
+               # string. btrfs prints the extent fscrypt context like:
+               #
+               #       item 22 key (258 FSCRYPT_CTX 0) itemoff 15047 itemsize 
34
+               #               value: 
010126845b8fc4d86191a06600879b25a852729c4e35b33e29d171a0c96b9eed33d9
+               #
+               $BTRFS_UTIL_PROG inspect-internal dump-tree $device | \
+                       sed -n "/key ($inode FSCRYPT_CTX 0)/{n;s/.*value: 
.*\([0-9a-f]\{32\}\)$/\1/p}"
+               ;;
        *)
                _fail "_get_encryption_data_nonce() isn't implemented on $FSTYP"
                ;;
@@ -632,6 +652,9 @@ _require_get_encryption_nonce_support()
                # Otherwise the xattr is incorrectly parsed as v1.  But just let
                # the test fail in that case, as it was an f2fs-tools bug...
                ;;
+       btrfs)
+               _require_command "$BTRFS_UTIL_PROG" btrfs
+               ;;
        *)
                _notrun "_get_encryption_*nonce() isn't implemented on $FSTYP"
                ;;
-- 
2.53.0


Reply via email to