Add a dedicated ".dm-verity" keyring for root hash signature
verification, similar to the ".fs-verity" keyring used by fs-verity.

By default the keyring is unused retaining the exact same old behavior.
For systems that provision additional keys only intended for dm-verity
images during boot, the dm_verity.keyring_unsealed=1 kernel parameter
leaves the keyring open.

We want to use this in systemd as a way add keys during boot that are
only used for creating dm-verity devices for later mounting and nothing
else. The discoverable disk image (DDI) spec at [1] heavily relies on
dm-verity and we would like to expand this even more. This will allow us
to do that in a fully backward compatible way.

Once provisioning is complete, userspace restricts and activates it for
dm-verity verification. If userspace fully seals the keyring then it
gains the guarantee that no new keys can be added.

Selftests included:

user1@localhost:~/data/kernel/linux/tools/testing/selftests/dm-verity$ sudo 
./test-dm-verity-keyring.sh
[INFO] === dm-verity keyring test ===
[INFO]
[INFO] Work directory: /tmp/dm-verity-test.6pZgfJ
[INFO] Checking requirements...
[INFO] Using OpenSSL for PKCS#7 signatures
[INFO]
[INFO] ========================================
[INFO] === TEST MODE: UNSEALED KEYRING ===
[INFO] ========================================
[INFO]
[INFO] Loading dm-verity module with keyring_unsealed=1 require_signatures=1
[INFO] Unloading existing dm-verity module...
[INFO] Found .dm-verity keyring: 27532829
[INFO] Module parameters:
[INFO]   keyring_unsealed=Y
[INFO]   require_signatures=Y
[INFO] Keyring status:
  Keyring ID: 27532829
Keyring
  27532829 --a-swrv      0     0  keyring: .dm-verity
01a41e1d I------     1 perm 082f0000     0     0 keyring   .dm-verity: empty
[INFO]
[INFO] TEST: Multiple keys in keyring
[INFO] Generating key pair: vendor-a
[INFO] Generating key pair: vendor-b
[INFO] Generating key pair: vendor-c
[INFO] Uploading key 'vendor-a' to keyring...
[INFO] Key 'vendor-a' uploaded with ID: 271225594
[INFO] Uploading key 'vendor-b' to keyring...
[INFO] Key 'vendor-b' uploaded with ID: 293778700
[INFO] Uploading key 'vendor-c' to keyring...
[INFO] Key 'vendor-c' uploaded with ID: 147304219
[INFO]
[INFO] Keys in keyring before sealing:
[INFO] Keys in .dm-verity keyring:
  3 keys in keyring:
  271225594: --als--v     0     0 asymmetric: vendor-a
  147304219: --als--v     0     0 asymmetric: vendor-c
  293778700: --als--v     0     0 asymmetric: vendor-b
[INFO] Key details:
  Key 3:
[INFO] Keyring status:
  Keyring ID: 27532829
Keyring
  27532829 --a-swrv      0     0  keyring: .dm-verity
 271225594 --als--v      0     0   \_ asymmetric: vendor-a
 147304219 --als--v      0     0   \_ asymmetric: vendor-c
 293778700 --als--v      0     0   \_ asymmetric: vendor-b
01a41e1d I------     1 perm 082f0000     0     0 keyring   .dm-verity: 3
[INFO]
[INFO] Sealing the .dm-verity keyring...
[INFO] Keyring sealed successfully
[INFO]
[INFO] Keys in keyring after sealing:
[INFO] Keys in .dm-verity keyring:
  3 keys in keyring:
  271225594: --als--v     0     0 asymmetric: vendor-a
  147304219: --als--v     0     0 asymmetric: vendor-c
  293778700: --als--v     0     0 asymmetric: vendor-b
[INFO] Key details:
  Key 3:
[INFO] Keyring status:
  Keyring ID: 27532829
Keyring
  27532829 --a-swrv      0     0  keyring: .dm-verity
 271225594 --als--v      0     0   \_ asymmetric: vendor-a
 147304219 --als--v      0     0   \_ asymmetric: vendor-c
 293778700 --als--v      0     0   \_ asymmetric: vendor-b
01a41e1d I------     1 perm 082f0000     0     0 keyring   .dm-verity: 3
[PASS] Key upload and keyring sealing succeeded
[INFO]
[INFO] Creating test device images...
[INFO] Data device: /dev/loop0
[INFO] Hash device: /dev/loop1
[INFO] Creating dm-verity hash tree...
[INFO] Root hash: 
6d55b4aaed08b738d3bf8340a2da2393f1492b8c10fbbab6cb9f9be432d67202
[INFO]
[INFO] Sub-test: Verify with vendor-a key
[INFO] Root hash (hex): 
6d55b4aaed08b738d3bf8340a2da2393f1492b8c10fbbab6cb9f9be432d67202
[INFO] Root hash hex string size: 64 bytes
[INFO] Signed with certificate:
  subject=CN=dm-verity-test-vendor-a
[INFO] Local signature verification: PASSED
[INFO] Activating dm-verity device with signature...
[INFO] Kernel messages:
  [ 7116.491826] audit: type=1338 audit(1768573436.899:720): module=verity 
op=ctr ppid=11286 pid=11399 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 
egid=0 sgid=0 fsgid=0 tty=pts3 ses=4294967295 comm="veritysetup" 
exe="/usr/sbin/veritysetup" dev=253:0 error_msg='success' res=1
  [ 7116.525233] audit: type=1300 audit(1768573436.899:720): arch=c000003e 
syscall=16 success=yes exit=0 a0=6 a1=c138fd09 a2=564631524510 
a3=5011b697c01be617 items=8 ppid=11286 pid=11399 auid=4294967295 uid=0 gid=0 
euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts3 ses=4294967295 
comm="veritysetup" exe="/usr/sbin/veritysetup" key=(null)
  [ 7116.540295] audit: type=1307 audit(1768573436.899:720): 
cwd="/home/user1/data/kernel/linux/tools/testing/selftests/dm-verity"
[PASS] Verification with vendor-a key succeeded
[INFO]
[INFO] Sub-test: Verify with vendor-b key
[INFO] Root hash (hex): 
6d55b4aaed08b738d3bf8340a2da2393f1492b8c10fbbab6cb9f9be432d67202
[INFO] Root hash hex string size: 64 bytes
[INFO] Signed with certificate:
  subject=CN=dm-verity-test-vendor-b
[INFO] Local signature verification: PASSED
[INFO] Activating dm-verity device with signature...
[PASS] Verification with vendor-b key succeeded
[INFO]
[INFO] Sub-test: Verify with vendor-c key
[INFO] Root hash (hex): 
6d55b4aaed08b738d3bf8340a2da2393f1492b8c10fbbab6cb9f9be432d67202
[INFO] Root hash hex string size: 64 bytes
[INFO] Signed with certificate:
  subject=CN=dm-verity-test-vendor-c
[INFO] Local signature verification: PASSED
[INFO] Activating dm-verity device with signature...
[PASS] Verification with vendor-c key succeeded
[INFO]
[INFO] Sub-test: Verify with unknown key (should fail)
[INFO] Generating key pair: unknown-vendor
[INFO] Root hash (hex): 
6d55b4aaed08b738d3bf8340a2da2393f1492b8c10fbbab6cb9f9be432d67202
[INFO] Root hash hex string size: 64 bytes
[INFO] Signed with certificate:
  subject=CN=dm-verity-test-unknown-vendor
[INFO] Local signature verification: PASSED
[INFO] Activating dm-verity device with signature...
device-mapper: reload ioctl on verity-test-11286 (253:0) failed: Required key 
not available
[INFO] Kernel messages:
  [ 7121.271149] device-mapper: table: 253:0: verity: Root hash verification 
failed (-ENOKEY)
[PASS] Verification with unknown key correctly rejected
[INFO]
[PASS] Multiple keys test completed successfully
[INFO]
[INFO] TEST: Verify sealed keyring rejects key additions
[INFO] Generating signing key pair...
[INFO] Certificate details:
        Issuer: CN=dm-verity-test-key
        Subject: CN=dm-verity-test-key
            X509v3 Key Usage:
[INFO] Keys generated successfully
[PASS] Sealed keyring correctly rejected key addition
[INFO]
[INFO] TEST: Verify corrupted signatures are rejected
[INFO] Sub-test: Truncated signature (should fail)
[INFO] Activating dm-verity device with signature...
device-mapper: reload ioctl on verity-test-11286 (253:0) failed: Bad message
[INFO] Kernel messages:
  [ 7121.896207] audit: type=1338 audit(1768573442.327:727): module=verity 
op=ctr ppid=11286 pid=11530 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 
egid=0 sgid=0 fsgid=0 tty=pts3 ses=4294967295 comm="veritysetup" 
exe="/usr/sbin/veritysetup" dev=253:0 error_msg='Root hash verification failed' 
res=0
  [ 7121.896333] device-mapper: table: 253:0: verity: Root hash verification 
failed (-EBADMSG)
  [ 7121.899944] audit: type=1338 audit(1768573442.327:727): module=verity 
op=dtr ppid=11286 pid=11530 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 
egid=0 sgid=0 fsgid=0 tty=pts3 ses=4294967295 comm="veritysetup" 
exe="/usr/sbin/veritysetup" dev=253:0 error_msg='success' res=1
  [ 7121.914639] audit: type=1300 audit(1768573442.327:727): arch=c000003e 
syscall=16 success=no exit=-74 a0=6 a1=c138fd09 a2=560615c9f3d0 
a3=6f558aa5a313577d items=0 ppid=11286 pid=11530 auid=4294967295 uid=0 gid=0 
euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts3 ses=4294967295 
comm="veritysetup" exe="/usr/sbin/veritysetup" key=(null)
[PASS] Truncated signature correctly rejected
[INFO] Sub-test: Corrupted signature bytes (should fail)
[INFO] Activating dm-verity device with signature...
device-mapper: reload ioctl on verity-test-11286 (253:0) failed: Required key 
not available
[INFO] Kernel messages:
  [ 7122.265626] audit: type=1338 audit(1768573442.695:728): module=verity 
op=ctr ppid=11286 pid=11549 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 
egid=0 sgid=0 fsgid=0 tty=pts3 ses=4294967295 comm="veritysetup" 
exe="/usr/sbin/veritysetup" dev=253:0 error_msg='Root hash verification failed' 
res=0
  [ 7122.265742] device-mapper: table: 253:0: verity: Root hash verification 
failed (-ENOKEY)
  [ 7122.279242] audit: type=1338 audit(1768573442.695:728): module=verity 
op=dtr ppid=11286 pid=11549 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 
egid=0 sgid=0 fsgid=0 tty=pts3 ses=4294967295 comm="veritysetup" 
exe="/usr/sbin/veritysetup" dev=253:0 error_msg='success' res=1
  [ 7122.301838] audit: type=1300 audit(1768573442.695:728): arch=c000003e 
syscall=16 success=no exit=-126 a0=6 a1=c138fd09 a2=5614e8dd3510 
a3=b8e8a86e4465fecd items=0 ppid=11286 pid=11549 auid=4294967295 uid=0 gid=0 
euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts3 ses=4294967295 
comm="veritysetup" exe="/usr/sbin/veritysetup" key=(null)
[PASS] Corrupted signature correctly rejected
[INFO] Sub-test: Signature over wrong data (should fail)
[INFO] Activating dm-verity device with signature...
device-mapper: reload ioctl on verity-test-11286 (253:0) failed: Key was 
rejected by service
[INFO] Kernel messages:
  [ 7122.570453] audit: type=1338 audit(1768573442.999:729): module=verity 
op=ctr ppid=11286 pid=11564 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 
egid=0 sgid=0 fsgid=0 tty=pts3 ses=4294967295 comm="veritysetup" 
exe="/usr/sbin/veritysetup" dev=253:0 error_msg='Root hash verification failed' 
res=0
  [ 7122.570706] device-mapper: table: 253:0: verity: Root hash verification 
failed (-EKEYREJECTED)
  [ 7122.583491] audit: type=1338 audit(1768573442.999:729): module=verity 
op=dtr ppid=11286 pid=11564 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 
egid=0 sgid=0 fsgid=0 tty=pts3 ses=4294967295 comm="veritysetup" 
exe="/usr/sbin/veritysetup" dev=253:0 error_msg='success' res=1
[PASS] Signature over wrong data correctly rejected
[PASS] Corrupted signature test completed successfully
[INFO]
[INFO] ========================================
[INFO] === TEST MODE: SEALED KEYRING (default) ===
[INFO] ========================================
[INFO]
[INFO] Loading dm-verity module with keyring_unsealed=0 require_signatures=0
[INFO] Unloading existing dm-verity module...
[INFO] Found .dm-verity keyring: 30758673
[INFO] Module parameters:
[INFO]   keyring_unsealed=N
[INFO]   require_signatures=N
[INFO] Keyring status:
  Keyring ID: 30758673
Keyring
  30758673 --a-swrv      0     0  keyring: .dm-verity
01d55711 I------     1 perm 082f0000     0     0 keyring   .dm-verity: empty
[INFO]
[INFO] TEST: Verify keyring is sealed by default (keyring_unsealed=0)
[INFO] Current keyring state (should be empty and sealed):
[INFO] Keys in .dm-verity keyring:
  (empty)
[INFO] Keyring status:
  Keyring ID: 30758673
Keyring
  30758673 --a-swrv      0     0  keyring: .dm-verity
01d55711 I------     1 perm 082f0000     0     0 keyring   .dm-verity: empty
[INFO] Generating signing key pair...
[INFO] Certificate details:
        Issuer: CN=dm-verity-test-key
        Subject: CN=dm-verity-test-key
            X509v3 Key Usage:
[INFO] Keys generated successfully
[INFO] Attempting to add key to sealed keyring...
[PASS] Keyring is correctly sealed when keyring_unsealed=0
[INFO] Keyring state after failed add attempt:
[INFO] Keys in .dm-verity keyring:
  (empty)
[INFO]
[INFO] TEST: Verify dm-verity keyring is inactive when sealed empty
[INFO] Keyring state (should be empty and sealed):
[INFO] Keys in .dm-verity keyring:
  (empty)
[INFO] Keyring status:
  Keyring ID: 30758673
Keyring
  30758673 --a-swrv      0     0  keyring: .dm-verity
01d55711 I------     1 perm 082f0000     0     0 keyring   .dm-verity: empty
[INFO] Creating test device images...
[INFO] Data device: /dev/loop0
[INFO] Hash device: /dev/loop1
[INFO] Creating dm-verity hash tree...
[INFO] Root hash: 
2a905b81a24ea25ae6e90ce250bfe770407605b2eb6822e4a0f9d7c728357ff7
[INFO] Sub-test: Device activation with sealed empty keyring
[INFO] Activating dm-verity device without signature...
[PASS] Device activated (require_signatures=0, empty dm-verity keyring is 
inactive)
[INFO]
[INFO] ========================================
[INFO] === All tests PASSED ===
[INFO] ========================================
[INFO] Cleaning up...

Signed-off-by: Christian Brauner <[email protected]>
---
Christian Brauner (2):
      dm-verity: add dm-verity keyring
      selftests: add dm-verity keyring selftests

 Documentation/admin-guide/kernel-parameters.txt    |   7 +
 drivers/md/dm-verity-target.c                      |  20 +-
 drivers/md/dm-verity-verify-sig.c                  |  45 ++
 drivers/md/dm-verity-verify-sig.h                  |  12 +
 tools/testing/selftests/dm-verity/Makefile         |   5 +
 tools/testing/selftests/dm-verity/config           |  10 +
 .../selftests/dm-verity/test-dm-verity-keyring.sh  | 873 +++++++++++++++++++++
 7 files changed, 971 insertions(+), 1 deletion(-)
---
base-commit: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
change-id: 20260116-work-dm-verity-keyring-083f2596c59b


Reply via email to