]> git.proxmox.com Git - mirror_qemu.git/commitdiff
crypto: expose encryption sector size in APIs
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 27 Sep 2017 12:53:36 +0000 (13:53 +0100)
committerMax Reitz <mreitz@redhat.com>
Fri, 6 Oct 2017 14:30:47 +0000 (16:30 +0200)
While current encryption schemes all have a fixed sector size of
512 bytes, this is not guaranteed to be the case in future. Expose
the sector size in the APIs so the block layer can remove assumptions
about fixed 512 byte sectors.

Reviewed-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-id: 20170927125340.12360-3-berrange@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
crypto/block-luks.c
crypto/block-qcow.c
crypto/block.c
crypto/blockpriv.h
include/crypto/block.h

index 36bc856084d0ad86016fc6aabf999000774d8ae6..a9062bb0f21d060706d8abb1bd7a4edcfea757ca 100644 (file)
@@ -846,8 +846,9 @@ qcrypto_block_luks_open(QCryptoBlock *block,
         }
     }
 
+    block->sector_size = QCRYPTO_BLOCK_LUKS_SECTOR_SIZE;
     block->payload_offset = luks->header.payload_offset *
-        QCRYPTO_BLOCK_LUKS_SECTOR_SIZE;
+        block->sector_size;
 
     luks->cipher_alg = cipheralg;
     luks->cipher_mode = ciphermode;
@@ -1240,8 +1241,9 @@ qcrypto_block_luks_create(QCryptoBlock *block,
                    QCRYPTO_BLOCK_LUKS_SECTOR_SIZE)) *
          QCRYPTO_BLOCK_LUKS_NUM_KEY_SLOTS);
 
+    block->sector_size = QCRYPTO_BLOCK_LUKS_SECTOR_SIZE;
     block->payload_offset = luks->header.payload_offset *
-        QCRYPTO_BLOCK_LUKS_SECTOR_SIZE;
+        block->sector_size;
 
     /* Reserve header space to match payload offset */
     initfunc(block, block->payload_offset, opaque, &local_err);
index a456fe338baf6b8043990a0f9e120187c00112d3..4dd594a9ba215bb45cc8bda1211e726b71ed7a3e 100644 (file)
@@ -80,6 +80,7 @@ qcrypto_block_qcow_init(QCryptoBlock *block,
         goto fail;
     }
 
+    block->sector_size = QCRYPTO_BLOCK_QCOW_SECTOR_SIZE;
     block->payload_offset = 0;
 
     return 0;
index c382393d9a6058e29524a2ccd8ddd7a6a1b25237..a7a9ad240e39816f97ac96616b61e26f2d67d878 100644 (file)
@@ -170,6 +170,12 @@ uint64_t qcrypto_block_get_payload_offset(QCryptoBlock *block)
 }
 
 
+uint64_t qcrypto_block_get_sector_size(QCryptoBlock *block)
+{
+    return block->sector_size;
+}
+
+
 void qcrypto_block_free(QCryptoBlock *block)
 {
     if (!block) {
index 0edb810e22d44013914ea82e4671506abd51cf54..d227522d88ca3c17bba3d651fec49535e20d56bb 100644 (file)
@@ -36,6 +36,7 @@ struct QCryptoBlock {
     QCryptoHashAlgorithm kdfhash;
     size_t niv;
     uint64_t payload_offset; /* In bytes */
+    uint64_t sector_size; /* In bytes */
 };
 
 struct QCryptoBlockDriver {
index f0e543bee1f85acc9b5b183d8fc6625f368b3662..13232b2472c5555ffee5cd8ea5f98bfe92fbeaf0 100644 (file)
@@ -240,6 +240,21 @@ QCryptoHashAlgorithm qcrypto_block_get_kdf_hash(QCryptoBlock *block);
  */
 uint64_t qcrypto_block_get_payload_offset(QCryptoBlock *block);
 
+/**
+ * qcrypto_block_get_sector_size:
+ * @block: the block encryption object
+ *
+ * Get the size of sectors used for payload encryption. A new
+ * IV is used at the start of each sector. The encryption
+ * sector size is not required to match the sector size of the
+ * underlying storage. For example LUKS will always use a 512
+ * byte sector size, even if the volume is on a disk with 4k
+ * sectors.
+ *
+ * Returns: the sector in bytes
+ */
+uint64_t qcrypto_block_get_sector_size(QCryptoBlock *block);
+
 /**
  * qcrypto_block_free:
  * @block: the block encryption object