On 14.06.2016 12:56, Daniel P. Berrange wrote: > When creating new block encryption volumes, we accept a list of > parameters to control the formatting process. It is useful to > be able to query what those parameters were for existing block > devices. Add a qcrypto_block_get_info() method which returns a > QCryptoBlockInfo instance to report this data. > > Signed-off-by: Daniel P. Berrange <berra...@redhat.com> > --- > crypto/block-luks.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++ > crypto/block.c | 17 +++++++++++ > crypto/blockpriv.h | 4 +++ > include/crypto/block.h | 16 +++++++++++ > qapi/crypto.json | 76 > ++++++++++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 183 insertions(+) > > diff --git a/crypto/block-luks.c b/crypto/block-luks.c > index 63649f1..6a6ef07 100644 > --- a/crypto/block-luks.c > +++ b/crypto/block-luks.c
[...] > @@ -1284,6 +1305,54 @@ qcrypto_block_luks_create(QCryptoBlock *block, > } > > > +static int qcrypto_block_luks_get_info(QCryptoBlock *block, > + QCryptoBlockInfo *info, > + Error **errp) > +{ > + QCryptoBlockLUKS *luks = block->opaque; > + QCryptoBlockInfoLUKSSlot *slot; > + QCryptoBlockInfoLUKSSlotList *slots = NULL, *prev = NULL; You could make prev a double pointer, initializing it to &info->u.luks.slots... [1] > + size_t i; > + > + info->u.luks.cipher_alg = luks->cipher_alg; > + info->u.luks.cipher_mode = luks->cipher_mode; > + info->u.luks.ivgen_alg = luks->ivgen_alg; > + if (info->u.luks.ivgen_alg == QCRYPTO_IVGEN_ALG_ESSIV) { > + info->u.luks.has_ivgen_hash_alg = true; > + info->u.luks.ivgen_hash_alg = luks->ivgen_hash_alg; > + } > + info->u.luks.hash_alg = luks->hash_alg; > + info->u.luks.payload_offset = block->payload_offset; > + info->u.luks.master_key_iters = luks->header.master_key_iterations; > + info->u.luks.uuid = g_strdup((const char *)luks->header.uuid); Wouldn't g_strndup() with sizeof(luks->header.uuid) be a better choice? > + > + for (i = 0; i < QCRYPTO_BLOCK_LUKS_NUM_KEY_SLOTS; i++) { > + slots = g_new0(QCryptoBlockInfoLUKSSlotList, 1); > + if (i == 0) { > + info->u.luks.slots = slots; > + } else { > + prev->next = slots; > + } [1] ...then unconditionally use *prev = slots here... > + > + slots->value = slot = g_new0(QCryptoBlockInfoLUKSSlot, 1); > + slot->active = luks->header.key_slots[i].active == > + QCRYPTO_BLOCK_LUKS_KEY_SLOT_ENABLED; > + slot->key_offset = luks->header.key_slots[i].key_offset > + * QCRYPTO_BLOCK_LUKS_SECTOR_SIZE; > + if (slot->active) { > + slot->has_iters = true; > + slot->iters = luks->header.key_slots[i].iterations; > + slot->has_stripes = true; > + slot->stripes = luks->header.key_slots[i].stripes; > + } > + > + prev = slots; [1] ...and prev = &slots->next here. > + } > + > + return 0; > +} > + > + > static void qcrypto_block_luks_cleanup(QCryptoBlock *block) > { > g_free(block->opaque); [...] > diff --git a/include/crypto/block.h b/include/crypto/block.h > index a21e11f..6256f64 100644 > --- a/include/crypto/block.h > +++ b/include/crypto/block.h > @@ -138,6 +138,22 @@ QCryptoBlock > *qcrypto_block_create(QCryptoBlockCreateOptions *options, > void *opaque, > Error **errp); > > + > +/** > + * qcrypto_block_get_info: > + * block: the block encryption object I think this is missing an @. Max > + * @errp: pointer to a NULL-initialized error object > + * > + * Get information about the configuration options for the > + * block encryption object. This includes details such as > + * the cipher algorithms, modes, and initialization vector > + * generators. > + * > + * Returns: a block encryption info object, or NULL on error > + */ > +QCryptoBlockInfo *qcrypto_block_get_info(QCryptoBlock *block, > + Error **errp); > + > /** > * @qcrypto_block_decrypt: > * @block: the block encryption object
signature.asc
Description: OpenPGP digital signature