Lines Matching full:block

2  * QEMU Crypto block device encryption
25 #include "block-qcow.h"
26 #include "block-luks.h"
58 QCryptoBlock *block = g_new0(QCryptoBlock, 1); in qcrypto_block_open() local
60 qemu_mutex_init(&block->mutex); in qcrypto_block_open()
62 block->format = options->format; in qcrypto_block_open()
66 error_setg(errp, "Unsupported block driver %s", in qcrypto_block_open()
68 g_free(block); in qcrypto_block_open()
72 block->driver = qcrypto_block_drivers[options->format]; in qcrypto_block_open()
74 if (block->driver->open(block, options, optprefix, in qcrypto_block_open()
77 g_free(block); in qcrypto_block_open()
81 return block; in qcrypto_block_open()
93 QCryptoBlock *block = g_new0(QCryptoBlock, 1); in qcrypto_block_create() local
95 qemu_mutex_init(&block->mutex); in qcrypto_block_create()
97 block->format = options->format; in qcrypto_block_create()
101 error_setg(errp, "Unsupported block driver %s", in qcrypto_block_create()
103 g_free(block); in qcrypto_block_create()
107 block->driver = qcrypto_block_drivers[options->format]; in qcrypto_block_create()
108 block->detached_header = flags & QCRYPTO_BLOCK_CREATE_DETACHED; in qcrypto_block_create()
110 if (block->driver->create(block, options, optprefix, initfunc, in qcrypto_block_create()
112 g_free(block); in qcrypto_block_create()
116 return block; in qcrypto_block_create()
120 static int qcrypto_block_headerlen_hdr_init_func(QCryptoBlock *block, in qcrypto_block_headerlen_hdr_init_func() argument
131 static int qcrypto_block_headerlen_hdr_write_func(QCryptoBlock *block, in qcrypto_block_headerlen_hdr_write_func() argument
155 int qcrypto_block_amend_options(QCryptoBlock *block, in qcrypto_block_amend_options() argument
163 if (options->format != block->format) { in qcrypto_block_amend_options()
169 if (!block->driver->amend) { in qcrypto_block_amend_options()
172 QCryptoBlockFormat_str(block->format)); in qcrypto_block_amend_options()
176 return block->driver->amend(block, in qcrypto_block_amend_options()
185 QCryptoBlockInfo *qcrypto_block_get_info(QCryptoBlock *block, in qcrypto_block_get_info() argument
190 info->format = block->format; in qcrypto_block_get_info()
192 if (block->driver->get_info && in qcrypto_block_get_info()
193 block->driver->get_info(block, info, errp) < 0) { in qcrypto_block_get_info()
202 int qcrypto_block_decrypt(QCryptoBlock *block, in qcrypto_block_decrypt() argument
208 return block->driver->decrypt(block, offset, buf, len, errp); in qcrypto_block_decrypt()
212 int qcrypto_block_encrypt(QCryptoBlock *block, in qcrypto_block_encrypt() argument
218 return block->driver->encrypt(block, offset, buf, len, errp); in qcrypto_block_encrypt()
222 QCryptoCipher *qcrypto_block_get_cipher(QCryptoBlock *block) in qcrypto_block_get_cipher() argument
230 assert(block->max_free_ciphers <= 1); in qcrypto_block_get_cipher()
231 return block->free_ciphers ? block->free_ciphers[0] : NULL; in qcrypto_block_get_cipher()
235 static QCryptoCipher *qcrypto_block_pop_cipher(QCryptoBlock *block, in qcrypto_block_pop_cipher() argument
239 WITH_QEMU_LOCK_GUARD(&block->mutex) { in qcrypto_block_pop_cipher()
240 if (block->n_free_ciphers > 0) { in qcrypto_block_pop_cipher()
241 block->n_free_ciphers--; in qcrypto_block_pop_cipher()
242 return block->free_ciphers[block->n_free_ciphers]; in qcrypto_block_pop_cipher()
247 return qcrypto_cipher_new(block->alg, block->mode, block->key, in qcrypto_block_pop_cipher()
248 block->nkey, errp); in qcrypto_block_pop_cipher()
252 static void qcrypto_block_push_cipher(QCryptoBlock *block, in qcrypto_block_push_cipher() argument
255 QEMU_LOCK_GUARD(&block->mutex); in qcrypto_block_push_cipher()
257 if (block->n_free_ciphers == block->max_free_ciphers) { in qcrypto_block_push_cipher()
258 block->max_free_ciphers++; in qcrypto_block_push_cipher()
259 block->free_ciphers = g_renew(QCryptoCipher *, in qcrypto_block_push_cipher()
260 block->free_ciphers, in qcrypto_block_push_cipher()
261 block->max_free_ciphers); in qcrypto_block_push_cipher()
264 block->free_ciphers[block->n_free_ciphers] = cipher; in qcrypto_block_push_cipher()
265 block->n_free_ciphers++; in qcrypto_block_push_cipher()
269 int qcrypto_block_init_cipher(QCryptoBlock *block, in qcrypto_block_init_cipher() argument
277 assert(!block->free_ciphers && !block->max_free_ciphers && in qcrypto_block_init_cipher()
278 !block->n_free_ciphers); in qcrypto_block_init_cipher()
281 block->alg = alg; in qcrypto_block_init_cipher()
282 block->mode = mode; in qcrypto_block_init_cipher()
283 block->key = g_memdup2(key, nkey); in qcrypto_block_init_cipher()
284 block->nkey = nkey; in qcrypto_block_init_cipher()
290 cipher = qcrypto_block_pop_cipher(block, errp); in qcrypto_block_init_cipher()
292 g_free(block->key); in qcrypto_block_init_cipher()
293 block->key = NULL; in qcrypto_block_init_cipher()
297 qcrypto_block_push_cipher(block, cipher); in qcrypto_block_init_cipher()
302 void qcrypto_block_free_cipher(QCryptoBlock *block) in qcrypto_block_free_cipher() argument
306 g_free(block->key); in qcrypto_block_free_cipher()
307 block->key = NULL; in qcrypto_block_free_cipher()
309 if (!block->free_ciphers) { in qcrypto_block_free_cipher()
314 assert(block->n_free_ciphers == block->max_free_ciphers); in qcrypto_block_free_cipher()
316 for (i = 0; i < block->max_free_ciphers; i++) { in qcrypto_block_free_cipher()
317 qcrypto_cipher_free(block->free_ciphers[i]); in qcrypto_block_free_cipher()
320 g_free(block->free_ciphers); in qcrypto_block_free_cipher()
321 block->free_ciphers = NULL; in qcrypto_block_free_cipher()
322 block->max_free_ciphers = block->n_free_ciphers = 0; in qcrypto_block_free_cipher()
325 QCryptoIVGen *qcrypto_block_get_ivgen(QCryptoBlock *block) in qcrypto_block_get_ivgen() argument
330 assert(block->max_free_ciphers <= 1); in qcrypto_block_get_ivgen()
331 return block->ivgen; in qcrypto_block_get_ivgen()
335 QCryptoHashAlgo qcrypto_block_get_kdf_hash(QCryptoBlock *block) in qcrypto_block_get_kdf_hash() argument
337 return block->kdfhash; in qcrypto_block_get_kdf_hash()
341 uint64_t qcrypto_block_get_payload_offset(QCryptoBlock *block) in qcrypto_block_get_payload_offset() argument
343 return block->payload_offset; in qcrypto_block_get_payload_offset()
347 uint64_t qcrypto_block_get_sector_size(QCryptoBlock *block) in qcrypto_block_get_sector_size() argument
349 return block->sector_size; in qcrypto_block_get_sector_size()
353 void qcrypto_block_free(QCryptoBlock *block) in qcrypto_block_free() argument
355 if (!block) { in qcrypto_block_free()
359 block->driver->cleanup(block); in qcrypto_block_free()
361 qcrypto_block_free_cipher(block); in qcrypto_block_free()
362 qcrypto_ivgen_free(block->ivgen); in qcrypto_block_free()
363 qemu_mutex_destroy(&block->mutex); in qcrypto_block_free()
364 g_free(block); in qcrypto_block_free()
457 int qcrypto_block_decrypt_helper(QCryptoBlock *block, in qcrypto_block_decrypt_helper() argument
465 QCryptoCipher *cipher = qcrypto_block_pop_cipher(block, errp); in qcrypto_block_decrypt_helper()
470 ret = do_qcrypto_block_cipher_encdec(cipher, block->niv, block->ivgen, in qcrypto_block_decrypt_helper()
471 &block->mutex, sectorsize, offset, buf, in qcrypto_block_decrypt_helper()
474 qcrypto_block_push_cipher(block, cipher); in qcrypto_block_decrypt_helper()
479 int qcrypto_block_encrypt_helper(QCryptoBlock *block, in qcrypto_block_encrypt_helper() argument
487 QCryptoCipher *cipher = qcrypto_block_pop_cipher(block, errp); in qcrypto_block_encrypt_helper()
492 ret = do_qcrypto_block_cipher_encdec(cipher, block->niv, block->ivgen, in qcrypto_block_encrypt_helper()
493 &block->mutex, sectorsize, offset, buf, in qcrypto_block_encrypt_helper()
496 qcrypto_block_push_cipher(block, cipher); in qcrypto_block_encrypt_helper()