qemu/include/crypto/block.h
<<
>>
Prefs
   1/*
   2 * QEMU Crypto block device encryption
   3 *
   4 * Copyright (c) 2015-2016 Red Hat, Inc.
   5 *
   6 * This library is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU Lesser General Public
   8 * License as published by the Free Software Foundation; either
   9 * version 2.1 of the License, or (at your option) any later version.
  10 *
  11 * This library is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14 * Lesser General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU Lesser General Public
  17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  18 *
  19 */
  20
  21#ifndef QCRYPTO_BLOCK_H
  22#define QCRYPTO_BLOCK_H
  23
  24#include "crypto/cipher.h"
  25#include "crypto/ivgen.h"
  26
  27typedef struct QCryptoBlock QCryptoBlock;
  28
  29/* See also QCryptoBlockFormat, QCryptoBlockCreateOptions
  30 * and QCryptoBlockOpenOptions in qapi/crypto.json */
  31
  32typedef ssize_t (*QCryptoBlockReadFunc)(QCryptoBlock *block,
  33                                        size_t offset,
  34                                        uint8_t *buf,
  35                                        size_t buflen,
  36                                        void *opaque,
  37                                        Error **errp);
  38
  39typedef ssize_t (*QCryptoBlockInitFunc)(QCryptoBlock *block,
  40                                        size_t headerlen,
  41                                        void *opaque,
  42                                        Error **errp);
  43
  44typedef ssize_t (*QCryptoBlockWriteFunc)(QCryptoBlock *block,
  45                                         size_t offset,
  46                                         const uint8_t *buf,
  47                                         size_t buflen,
  48                                         void *opaque,
  49                                         Error **errp);
  50
  51/**
  52 * qcrypto_block_has_format:
  53 * @format: the encryption format
  54 * @buf: the data from head of the volume
  55 * @len: the length of @buf in bytes
  56 *
  57 * Given @len bytes of data from the head of a storage volume
  58 * in @buf, probe to determine if the volume has the encryption
  59 * format specified in @format.
  60 *
  61 * Returns: true if the data in @buf matches @format
  62 */
  63bool qcrypto_block_has_format(QCryptoBlockFormat format,
  64                              const uint8_t *buf,
  65                              size_t buflen);
  66
  67typedef enum {
  68    QCRYPTO_BLOCK_OPEN_NO_IO = (1 << 0),
  69} QCryptoBlockOpenFlags;
  70
  71/**
  72 * qcrypto_block_open:
  73 * @options: the encryption options
  74 * @optprefix: name prefix for options
  75 * @readfunc: callback for reading data from the volume
  76 * @opaque: data to pass to @readfunc
  77 * @flags: bitmask of QCryptoBlockOpenFlags values
  78 * @n_threads: allow concurrent I/O from up to @n_threads threads
  79 * @errp: pointer to a NULL-initialized error object
  80 *
  81 * Create a new block encryption object for an existing
  82 * storage volume encrypted with format identified by
  83 * the parameters in @options.
  84 *
  85 * This will use @readfunc to initialize the encryption
  86 * context based on the volume header(s), extracting the
  87 * master key(s) as required.
  88 *
  89 * If @flags contains QCRYPTO_BLOCK_OPEN_NO_IO then
  90 * the open process will be optimized to skip any parts
  91 * that are only required to perform I/O. In particular
  92 * this would usually avoid the need to decrypt any
  93 * master keys. The only thing that can be done with
  94 * the resulting QCryptoBlock object would be to query
  95 * metadata such as the payload offset. There will be
  96 * no cipher or ivgen objects available.
  97 *
  98 * If any part of initializing the encryption context
  99 * fails an error will be returned. This could be due
 100 * to the volume being in the wrong format, a cipher
 101 * or IV generator algorithm that is not supported,
 102 * or incorrect passphrases.
 103 *
 104 * Returns: a block encryption format, or NULL on error
 105 */
 106QCryptoBlock *qcrypto_block_open(QCryptoBlockOpenOptions *options,
 107                                 const char *optprefix,
 108                                 QCryptoBlockReadFunc readfunc,
 109                                 void *opaque,
 110                                 unsigned int flags,
 111                                 size_t n_threads,
 112                                 Error **errp);
 113
 114/**
 115 * qcrypto_block_create:
 116 * @options: the encryption options
 117 * @optprefix: name prefix for options
 118 * @initfunc: callback for initializing volume header
 119 * @writefunc: callback for writing data to the volume header
 120 * @opaque: data to pass to @initfunc and @writefunc
 121 * @errp: pointer to a NULL-initialized error object
 122 *
 123 * Create a new block encryption object for initializing
 124 * a storage volume to be encrypted with format identified
 125 * by the parameters in @options.
 126 *
 127 * This method will allocate space for a new volume header
 128 * using @initfunc and then write header data using @writefunc,
 129 * generating new master keys, etc as required. Any existing
 130 * data present on the volume will be irrevocably destroyed.
 131 *
 132 * If any part of initializing the encryption context
 133 * fails an error will be returned. This could be due
 134 * to the volume being in the wrong format, a cipher
 135 * or IV generator algorithm that is not supported,
 136 * or incorrect passphrases.
 137 *
 138 * Returns: a block encryption format, or NULL on error
 139 */
 140QCryptoBlock *qcrypto_block_create(QCryptoBlockCreateOptions *options,
 141                                   const char *optprefix,
 142                                   QCryptoBlockInitFunc initfunc,
 143                                   QCryptoBlockWriteFunc writefunc,
 144                                   void *opaque,
 145                                   Error **errp);
 146
 147
 148/**
 149 * qcrypto_block_get_info:
 150 * @block: the block encryption object
 151 * @errp: pointer to a NULL-initialized error object
 152 *
 153 * Get information about the configuration options for the
 154 * block encryption object. This includes details such as
 155 * the cipher algorithms, modes, and initialization vector
 156 * generators.
 157 *
 158 * Returns: a block encryption info object, or NULL on error
 159 */
 160QCryptoBlockInfo *qcrypto_block_get_info(QCryptoBlock *block,
 161                                         Error **errp);
 162
 163/**
 164 * @qcrypto_block_decrypt:
 165 * @block: the block encryption object
 166 * @offset: the position at which @iov was read
 167 * @buf: the buffer to decrypt
 168 * @len: the length of @buf in bytes
 169 * @errp: pointer to a NULL-initialized error object
 170 *
 171 * Decrypt @len bytes of cipher text in @buf, writing
 172 * plain text back into @buf. @len and @offset must be
 173 * a multiple of the encryption format sector size.
 174 *
 175 * Returns 0 on success, -1 on failure
 176 */
 177int qcrypto_block_decrypt(QCryptoBlock *block,
 178                          uint64_t offset,
 179                          uint8_t *buf,
 180                          size_t len,
 181                          Error **errp);
 182
 183/**
 184 * @qcrypto_block_encrypt:
 185 * @block: the block encryption object
 186 * @offset: the position at which @iov will be written
 187 * @buf: the buffer to decrypt
 188 * @len: the length of @buf in bytes
 189 * @errp: pointer to a NULL-initialized error object
 190 *
 191 * Encrypt @len bytes of plain text in @buf, writing
 192 * cipher text back into @buf. @len and @offset must be
 193 * a multiple of the encryption format sector size.
 194 *
 195 * Returns 0 on success, -1 on failure
 196 */
 197int qcrypto_block_encrypt(QCryptoBlock *block,
 198                          uint64_t offset,
 199                          uint8_t *buf,
 200                          size_t len,
 201                          Error **errp);
 202
 203/**
 204 * qcrypto_block_get_cipher:
 205 * @block: the block encryption object
 206 *
 207 * Get the cipher to use for payload encryption
 208 *
 209 * Returns: the cipher object
 210 */
 211QCryptoCipher *qcrypto_block_get_cipher(QCryptoBlock *block);
 212
 213/**
 214 * qcrypto_block_get_ivgen:
 215 * @block: the block encryption object
 216 *
 217 * Get the initialization vector generator to use for
 218 * payload encryption
 219 *
 220 * Returns: the IV generator object
 221 */
 222QCryptoIVGen *qcrypto_block_get_ivgen(QCryptoBlock *block);
 223
 224
 225/**
 226 * qcrypto_block_get_kdf_hash:
 227 * @block: the block encryption object
 228 *
 229 * Get the hash algorithm used with the key derivation
 230 * function
 231 *
 232 * Returns: the hash algorithm
 233 */
 234QCryptoHashAlgorithm qcrypto_block_get_kdf_hash(QCryptoBlock *block);
 235
 236/**
 237 * qcrypto_block_get_payload_offset:
 238 * @block: the block encryption object
 239 *
 240 * Get the offset to the payload indicated by the
 241 * encryption header, in bytes.
 242 *
 243 * Returns: the payload offset in bytes
 244 */
 245uint64_t qcrypto_block_get_payload_offset(QCryptoBlock *block);
 246
 247/**
 248 * qcrypto_block_get_sector_size:
 249 * @block: the block encryption object
 250 *
 251 * Get the size of sectors used for payload encryption. A new
 252 * IV is used at the start of each sector. The encryption
 253 * sector size is not required to match the sector size of the
 254 * underlying storage. For example LUKS will always use a 512
 255 * byte sector size, even if the volume is on a disk with 4k
 256 * sectors.
 257 *
 258 * Returns: the sector in bytes
 259 */
 260uint64_t qcrypto_block_get_sector_size(QCryptoBlock *block);
 261
 262/**
 263 * qcrypto_block_free:
 264 * @block: the block encryption object
 265 *
 266 * Release all resources associated with the encryption
 267 * object
 268 */
 269void qcrypto_block_free(QCryptoBlock *block);
 270
 271#endif /* QCRYPTO_BLOCK_H */
 272