block/crypto: implement the encryption key management
commitbbfdae91fb68783fd54a0f817e3dd9b1c6fe8f8a
authorMaxim Levitsky <mlevitsk@redhat.com>
Thu, 25 Jun 2020 12:55:42 +0000 (25 14:55 +0200)
committerMax Reitz <mreitz@redhat.com>
Mon, 6 Jul 2020 06:49:28 +0000 (6 08:49 +0200)
tree0c4f99d982af0376f8e9aa38f7250d57b213d121
parente0d0ddc591a079d2a3da6aa913ba7dd9551fb5ef
block/crypto: implement the encryption key management

This implements the encryption key management using the generic code in
qcrypto layer and exposes it to the user via qemu-img

This code adds another 'write_func' because the initialization
write_func works directly on the underlying file, and amend
works on instance of luks device.

This commit also adds a 'hack/workaround' I and Kevin Wolf (thanks)
made to make the driver both support write sharing (to avoid breaking the users),
and be safe against concurrent  metadata update (the keyslots)

Eventually the write sharing for luks driver will be deprecated
and removed together with this hack.

The hack is that we ask (as a format driver) for BLK_PERM_CONSISTENT_READ
and then when we want to update the keys, we unshare that permission.
So if someone else has the image open, even readonly, encryption
key update will fail gracefully.

Also thanks to Daniel Berrange for the idea of
unsharing read, rather that write permission which allows
to avoid cases when the other user had opened the image read-only.

Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-Id: <20200608094030.670121-8-mlevitsk@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
block/crypto.c
block/crypto.h