qemu/crypto
Hyman Huang 9ad5c4e7ee crypto: Support LUKS volume with detached header
By enhancing the LUKS driver, it is possible to implement
the LUKS volume with a detached header.

Normally a LUKS volume has a layout:
  disk:  | header | key material | disk payload data |

With a detached LUKS header, you need 2 disks so getting:
  disk1:  | header | key material |
  disk2:  | disk payload data |

There are a variety of benefits to doing this:
 * Secrecy - the disk2 cannot be identified as containing LUKS
             volume since there's no header
 * Control - if access to the disk1 is restricted, then even
             if someone has access to disk2 they can't unlock
             it. Might be useful if you have disks on NFS but
             want to restrict which host can launch a VM
             instance from it, by dynamically providing access
             to the header to a designated host
 * Flexibility - your application data volume may be a given
                 size and it is inconvenient to resize it to
                 add encryption.You can store the LUKS header
                 separately and use the existing storage
                 volume for payload
 * Recovery - corruption of a bit in the header may make the
              entire payload inaccessible. It might be
              convenient to take backups of the header. If
              your primary disk header becomes corrupt, you
              can unlock the data still by pointing to the
              backup detached header

Take the raw-format image as an example to introduce the usage
of the LUKS volume with a detached header:

1. prepare detached LUKS header images
$ dd if=/dev/zero of=test-header.img bs=1M count=32
$ dd if=/dev/zero of=test-payload.img bs=1M count=1000
$ cryptsetup luksFormat --header test-header.img test-payload.img
> --force-password --type luks1

2. block-add a protocol blockdev node of payload image
$ virsh qemu-monitor-command vm '{"execute":"blockdev-add",
> "arguments":{"node-name":"libvirt-1-storage", "driver":"file",
> "filename":"test-payload.img"}}'

3. block-add a protocol blockdev node of LUKS header as above.
$ virsh qemu-monitor-command vm '{"execute":"blockdev-add",
> "arguments":{"node-name":"libvirt-2-storage", "driver":"file",
> "filename": "test-header.img" }}'

4. object-add the secret for decrypting the cipher stored in
   LUKS header above
$ virsh qemu-monitor-command vm '{"execute":"object-add",
> "arguments":{"qom-type":"secret", "id":
> "libvirt-2-storage-secret0", "data":"abc123"}}'

5. block-add the raw-drived blockdev format node
$ virsh qemu-monitor-command vm '{"execute":"blockdev-add",
> "arguments":{"node-name":"libvirt-1-format", "driver":"raw",
> "file":"libvirt-1-storage"}}'

6. block-add the luks-drived blockdev to link the raw disk
   with the LUKS header by specifying the field "header"
$ virsh qemu-monitor-command vm '{"execute":"blockdev-add",
> "arguments":{"node-name":"libvirt-2-format", "driver":"luks",
> "file":"libvirt-1-format", "header":"libvirt-2-storage",
> "key-secret":"libvirt-2-format-secret0"}}'

7. hot-plug the virtio-blk device finally
$ virsh qemu-monitor-command vm '{"execute":"device_add",
> "arguments": {"num-queues":"1", "driver":"virtio-blk-pci",
> "drive": "libvirt-2-format", "id":"virtio-disk2"}}'

Starting a VM with a LUKS volume with detached header is
somewhat similar to hot-plug in that both maintaining the
same json command while the starting VM changes the
"blockdev-add/device_add" parameters to "blockdev/device".

Signed-off-by: Hyman Huang <yong.huang@smartx.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2024-02-09 12:50:33 +00:00
..
aes.c target/riscv: Use existing lookup tables for MixColumns 2023-09-11 11:45:54 +10:00
afalg.c misc/other: spelling fixes 2023-09-08 13:08:52 +03:00
afalgpriv.h crypto: Allocate QCryptoCipher with the subclass 2020-09-10 11:02:23 +01:00
afsplit.c crypto: use auto cleanup for many stack variables 2019-08-22 10:56:57 +01:00
akcipher-gcrypt.c.inc crypto: Implement RSA algorithm by gcrypt 2022-05-26 11:41:53 +01:00
akcipher-nettle.c.inc test/crypto: Add test suite for crypto akcipher 2022-05-26 11:41:54 +01:00
akcipher.c crypto: Support export akcipher to pkcs8 2022-11-02 06:56:32 -04:00
akcipherpriv.h crypto: Introduce akcipher crypto class 2022-05-26 11:41:47 +01:00
block-luks-priv.h crypto: Clean up includes 2023-02-08 07:16:23 +01:00
block-luks.c crypto: Support LUKS volume with detached header 2024-02-09 12:50:33 +00:00
block-luks.h crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
block-qcow.c crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
block-qcow.h crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
block.c crypto: Make block callbacks return 0 on success 2022-07-12 12:14:55 +02:00
blockpriv.h qcrypto/core: add generic infrastructure for crypto options amendment 2020-07-06 08:49:28 +02:00
cipher-afalg.c Remove qemu-common.h include from most units 2022-04-06 14:31:55 +02:00
cipher-builtin.c.inc crypto: delete built-in XTS cipher mode support 2021-07-14 14:15:52 +01:00
cipher-gcrypt.c.inc crypto: Introduce SM4 symmetric cipher algorithm 2024-02-09 12:47:55 +00:00
cipher-gnutls.c.inc crypto/cipher-gnutls.c: Clean up local variable shadowing 2023-09-29 10:07:16 +02:00
cipher-nettle.c.inc crypto: Introduce SM4 symmetric cipher algorithm 2024-02-09 12:47:55 +00:00
cipher.c crypto: Introduce SM4 symmetric cipher algorithm 2024-02-09 12:47:55 +00:00
cipherpriv.h crypto: Move cipher->driver init to qcrypto_*_cipher_ctx_new 2020-09-10 11:02:23 +01:00
clmul.c crypto: Add generic 64-bit carry-less multiply routine 2023-09-15 13:57:00 +00:00
der.c misc/other: spelling fixes 2023-09-08 13:08:52 +03:00
der.h misc/other: spelling fixes 2023-09-08 13:08:52 +03:00
hash-afalg.c Remove qemu-common.h include from most units 2022-04-06 14:31:55 +02:00
hash-gcrypt.c crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
hash-glib.c crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
hash-gnutls.c crypto: add gnutls hash provider 2021-07-14 14:15:52 +01:00
hash-nettle.c crypto: drop back compatibility typedefs for nettle 2021-06-02 07:04:55 +02:00
hash.c crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
hashpriv.h crypto: hash: add afalg-backend hash support 2017-07-19 10:11:05 +01:00
hmac-gcrypt.c qapi: Mechanically convert FOO_lookup[...] to FOO_str(...) 2017-09-04 13:09:13 +02:00
hmac-glib.c glib: bump min required glib library version to 2.48 2019-08-22 10:46:34 +01:00
hmac-gnutls.c crypto: add gnutls hmac provider 2021-07-14 14:15:52 +01:00
hmac-nettle.c crypto: drop back compatibility typedefs for nettle 2021-06-02 07:04:55 +02:00
hmac.c Include qapi/error.h exactly where needed 2018-02-09 13:50:17 +01:00
hmacpriv.h bulk: Do not declare function prototypes using 'extern' keyword 2023-08-31 19:47:43 +02:00
init.c crypto: drop gcrypt thread initialization code 2021-07-14 14:15:52 +01:00
ivgen-essiv.c crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
ivgen-essiv.h crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
ivgen-plain64.c crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
ivgen-plain64.h crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
ivgen-plain.c crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
ivgen-plain.h Clean up ill-advised or unusual header guards 2022-05-11 16:50:01 +02:00
ivgen.c crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
ivgenpriv.h crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
meson.build crypto: only include tls-cipher-suites in emulators 2023-10-03 10:29:39 +02:00
pbkdf-gcrypt.c crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
pbkdf-gnutls.c crypto: add gnutls pbkdf provider 2021-07-14 14:15:52 +01:00
pbkdf-nettle.c crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
pbkdf-stub.c crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
pbkdf.c crypto/luks: Support creating LUKS image on Darwin 2022-10-26 13:32:08 +01:00
random-gcrypt.c crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
random-gnutls.c crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
random-none.c crypto: add "none" random provider 2020-06-15 11:33:50 +01:00
random-platform.c crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00
rsakey-builtin.c.inc crypto/rsakey-builtin.c.inc: Clean up two error paths 2023-11-07 14:54:56 +00:00
rsakey-nettle.c.inc crypto: Implement RSA algorithm by hogweed 2022-05-26 11:41:51 +01:00
rsakey.c crypto: Support export akcipher to pkcs8 2022-11-02 06:56:32 -04:00
rsakey.h crypto: Support export akcipher to pkcs8 2022-11-02 06:56:32 -04:00
secret_common.c crypto: make loaded property read-only 2022-05-14 12:33:44 +02:00
secret_keyring.c crypto: Move USER_CREATABLE to secret_common base class 2021-01-29 17:07:53 +00:00
secret.c crypto: Move USER_CREATABLE to secret_common base class 2021-01-29 17:07:53 +00:00
sm4.c crypto: Add SM4 constant parameter CK 2023-09-11 11:45:55 +10:00
tls-cipher-suites.c crypto: remove shadowed 'ret' variable 2023-09-29 10:07:20 +02:00
tlscreds.c crypto/tlscreds: Introduce qcrypto_tls_creds_check_endpoint() helper 2021-06-29 18:29:43 +01:00
tlscredsanon.c crypto: make loaded property read-only 2022-05-14 12:33:44 +02:00
tlscredspriv.h crypto: Make QCryptoTLSCreds* structures private 2021-06-29 18:30:24 +01:00
tlscredspsk.c crypto: check for and report errors setting PSK credentials 2022-10-27 11:55:41 +01:00
tlscredsx509.c crypto: make loaded property read-only 2022-05-14 12:33:44 +02:00
tlssession.c crypto: TLS: introduce check_pending 2023-02-15 11:01:03 -05:00
trace-events docs: fix references to docs/devel/tracing.rst 2021-06-02 06:51:09 +02:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
xts.c crypto: Fix LGPL information in the file headers 2019-07-19 14:21:25 +01:00