qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Fam Zheng <famz@redhat.com>
To: "Daniel P. Berrange" <berrange@redhat.com>
Cc: qemu-devel@nongnu.org, qemu-block@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v4 04/26] crypto: add support for anti-forensic split algorithm
Date: Mon, 7 Mar 2016 13:51:40 +0800	[thread overview]
Message-ID: <20160307055140.GC21446@ad.usersys.redhat.com> (raw)
In-Reply-To: <1456747261-22032-5-git-send-email-berrange@redhat.com>

On Mon, 02/29 12:00, Daniel P. Berrange wrote:
> The LUKS format specifies an anti-forensic split algorithm which
> is used to artificially expand the size of the key material on
> disk. This is an implementation of that algorithm.
> 
> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
> ---
>  crypto/Makefile.objs        |   1 +
>  crypto/afsplit.c            | 158 ++++++++++++++++++++++++++++++++++++
>  include/crypto/afsplit.h    | 135 +++++++++++++++++++++++++++++++
>  tests/.gitignore            |   1 +
>  tests/Makefile              |   2 +
>  tests/test-crypto-afsplit.c | 190 ++++++++++++++++++++++++++++++++++++++++++++
>  6 files changed, 487 insertions(+)
>  create mode 100644 crypto/afsplit.c
>  create mode 100644 include/crypto/afsplit.h
>  create mode 100644 tests/test-crypto-afsplit.c
> 
> diff --git a/crypto/Makefile.objs b/crypto/Makefile.objs
> index 3040989..5136737 100644
> --- a/crypto/Makefile.objs
> +++ b/crypto/Makefile.objs
> @@ -17,6 +17,7 @@ crypto-obj-y += ivgen.o
>  crypto-obj-y += ivgen-essiv.o
>  crypto-obj-y += ivgen-plain.o
>  crypto-obj-y += ivgen-plain64.o
> +crypto-obj-y += afsplit.o
>  
>  # Let the userspace emulators avoid linking gnutls/etc
>  crypto-aes-obj-y = aes.o
> diff --git a/crypto/afsplit.c b/crypto/afsplit.c
> new file mode 100644
> index 0000000..8074913
> --- /dev/null
> +++ b/crypto/afsplit.c
> @@ -0,0 +1,158 @@
> +/*
> + * QEMU Crypto anti forensic information splitter
> + *
> + * Copyright (c) 2015-2016 Red Hat, Inc.
> + *
> + * Derived from cryptsetup package lib/luks1/af.c
> + *
> + * Copyright (C) 2004, Clemens Fruhwirth <clemens@endorphin.org>
> + * Copyright (C) 2009-2012, Red Hat, Inc. All rights reserved.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * as published by the Free Software Foundation; either version 2
> + * of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, see <http://www.gnu.org/licenses/>.
> + *
> + */
> +
> +#include "qemu/osdep.h"
> +#include "crypto/afsplit.h"
> +#include "crypto/random.h"
> +
> +
> +static void qcrypto_afsplit_xor(size_t blocklen,
> +                                const uint8_t *in1,
> +                                const uint8_t *in2,
> +                                uint8_t *out)
> +{
> +    size_t i;
> +    for (i = 0; i < blocklen; i++) {
> +        out[i] = in1[i] ^ in2[i];
> +    }
> +}
> +
> +
> +static int qcrypto_afsplit_hash(QCryptoHashAlgorithm hash,
> +                                size_t blocklen,
> +                                uint8_t *block,
> +                                Error **errp)
> +{
> +    size_t digestlen = qcrypto_hash_digest_len(hash);
> +
> +    size_t hashcount = blocklen / digestlen;

Do you want to use DIV_ROUND_UP? Because if blocklen < digestlen, hashcount is
0, and your for loop below will be skipped.

Fam

> +    size_t finallen = blocklen % digestlen;
> +    uint32_t i;
> +
> +    if (finallen) {
> +        hashcount++;
> +    } else {
> +        finallen = digestlen;
> +    }
> +
> +    for (i = 0; i < hashcount; i++) {
> +        uint8_t *out = NULL;
> +        size_t outlen = 0;
> +        uint32_t iv = cpu_to_be32(i);
> +        struct iovec in[] = {
> +            { .iov_base = &iv,
> +              .iov_len = sizeof(iv) },
> +            { .iov_base = block + (i * digestlen),
> +              .iov_len = (i == (hashcount - 1)) ? finallen : digestlen },
> +        };
> +
> +        if (qcrypto_hash_bytesv(hash,
> +                                in,
> +                                G_N_ELEMENTS(in),
> +                                &out, &outlen,
> +                                errp) < 0) {
> +            return -1;
> +        }
> +
> +        assert(outlen == digestlen);
> +        memcpy(block + (i * digestlen), out,
> +               (i == (hashcount - 1)) ? finallen : digestlen);
> +        g_free(out);
> +    }
> +
> +    return 0;
> +}
> +
> +
> +int qcrypto_afsplit_encode(QCryptoHashAlgorithm hash,
> +                           size_t blocklen,
> +                           uint32_t stripes,
> +                           const uint8_t *in,
> +                           uint8_t *out,
> +                           Error **errp)
> +{
> +    uint8_t *block = g_new0(uint8_t, blocklen);
> +    size_t i;
> +    int ret = -1;
> +
> +    for (i = 0; i < (stripes - 1); i++) {
> +        if (qcrypto_random_bytes(out + (i * blocklen), blocklen, errp) < 0) {
> +            goto cleanup;
> +        }
> +
> +        qcrypto_afsplit_xor(blocklen,
> +                            out + (i * blocklen),
> +                            block,
> +                            block);
> +        if (qcrypto_afsplit_hash(hash, blocklen, block,
> +                                 errp) < 0) {
> +            goto cleanup;
> +        }
> +    }
> +    qcrypto_afsplit_xor(blocklen,
> +                        in,
> +                        block,
> +                        out + (i * blocklen));
> +    ret = 0;
> +
> + cleanup:
> +    g_free(block);
> +    return ret;
> +}
> +
> +
> +int qcrypto_afsplit_decode(QCryptoHashAlgorithm hash,
> +                           size_t blocklen,
> +                           uint32_t stripes,
> +                           const uint8_t *in,
> +                           uint8_t *out,
> +                           Error **errp)
> +{
> +    uint8_t *block = g_new0(uint8_t, blocklen);
> +    size_t i;
> +    int ret = -1;
> +
> +    for (i = 0; i < (stripes - 1); i++) {
> +        qcrypto_afsplit_xor(blocklen,
> +                            in + (i * blocklen),
> +                            block,
> +                            block);
> +        if (qcrypto_afsplit_hash(hash, blocklen, block,
> +                                 errp) < 0) {
> +            goto cleanup;
> +        }
> +    }
> +
> +    qcrypto_afsplit_xor(blocklen,
> +                        in + (i * blocklen),
> +                        block,
> +                        out);
> +
> +    ret = 0;
> +
> + cleanup:
> +    g_free(block);
> +    return ret;
> +}
> diff --git a/include/crypto/afsplit.h b/include/crypto/afsplit.h
> new file mode 100644
> index 0000000..4cc4ca4
> --- /dev/null
> +++ b/include/crypto/afsplit.h
> @@ -0,0 +1,135 @@
> +/*
> + * QEMU Crypto anti forensic information splitter
> + *
> + * Copyright (c) 2015-2016 Red Hat, Inc.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * as published by the Free Software Foundation; either version 2
> + * of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, see <http://www.gnu.org/licenses/>.
> + *
> + */
> +
> +#ifndef QCRYPTO_AFSPLIT_H__
> +#define QCRYPTO_AFSPLIT_H__
> +
> +#include "crypto/hash.h"
> +
> +/**
> + * This module implements the anti-forensic splitter that is specified
> + * as part of the LUKS format:
> + *
> + *   http://clemens.endorphin.org/cryptography
> + *   http://clemens.endorphin.org/TKS1-draft.pdf
> + *
> + * The core idea is to take a short piece of data (key material)
> + * and process it to expand it to a much larger piece of data.
> + * The expansion process is reversible, to obtain the original
> + * short data. The key property of the expansion is that if any
> + * byte in the larger data set is changed / missing, it should be
> + * impossible to recreate the original short data.
> + *
> + * <example>
> + *    <title>Creating a large split key for storage</title>
> + *    <programlisting>
> + * size_t nkey = 32;
> + * uint32_t stripes = 32768; // To produce a 1 MB split key
> + * uint8_t *masterkey = ....a 32-byte AES key...
> + * uint8_t *splitkey;
> + *
> + * splitkey = g_new0(uint8_t, nkey * stripes);
> + *
> + * if (qcrypto_afsplit_encode(QCRYPTO_HASH_ALG_SHA256,
> + *                            nkey, stripes,
> + *                            masterkey, splitkey, errp) < 0) {
> + *     g_free(splitkey);
> + *     g_free(masterkey);
> + *     return -1;
> + * }
> + *
> + * ...store splitkey somewhere...
> + *
> + * g_free(splitkey);
> + * g_free(masterkey);
> + *    </programlisting>
> + * </example>
> + *
> + * <example>
> + *    <title>Retrieving a master key from storage</title>
> + *    <programlisting>
> + * size_t nkey = 32;
> + * uint32_t stripes = 32768; // To produce a 1 MB split key
> + * uint8_t *masterkey;
> + * uint8_t *splitkey = .... read in 1 MB of data...
> + *
> + * masterkey = g_new0(uint8_t, nkey);
> + *
> + * if (qcrypto_afsplit_decode(QCRYPTO_HASH_ALG_SHA256,
> + *                            nkey, stripes,
> + *                            splitkey, masterkey, errp) < 0) {
> + *     g_free(splitkey);
> + *     g_free(masterkey);
> + *     return -1;
> + * }
> + *
> + * ..decrypt data with masterkey...
> + *
> + * g_free(splitkey);
> + * g_free(masterkey);
> + *    </programlisting>
> + * </example>
> + */
> +
> +/**
> + * qcrypto_afsplit_encode:
> + * @hash: the hash algorithm to use for data expansion
> + * @blocklen: the size of @in in bytes
> + * @stripes: the number of times to expand @in in size
> + * @in: the master key to be expanded in size
> + * @out: preallocated buffer to hold the split key
> + * @errp: pointer to a NULL-initialized error object
> + *
> + * Split the data in @in, which is @blocklen bytes in
> + * size, to form a larger piece of data @out, which is
> + * @blocklen * @stripes bytes in size.
> + *
> + * Returns: 0 on success, -1 on error;
> + */
> +int qcrypto_afsplit_encode(QCryptoHashAlgorithm hash,
> +                           size_t blocklen,
> +                           uint32_t stripes,
> +                           const uint8_t *in,
> +                           uint8_t *out,
> +                           Error **errp);
> +
> +/**
> + * qcrypto_afsplit_decode:
> + * @hash: the hash algorithm to use for data compression
> + * @blocklen: the size of @out in bytes
> + * @stripes: the number of times to decrease @in in size
> + * @in: the split key to be recombined
> + * @out: preallocated buffer to hold the master key
> + * @errp: pointer to a NULL-initialized error object
> + *
> + * Join the data in @in, which is @blocklen * @stripes
> + * bytes in size, to form the original small piece of
> + * data @out, which is @blocklen bytes in size.
> + *
> + * Returns: 0 on success, -1 on error;
> + */
> +int qcrypto_afsplit_decode(QCryptoHashAlgorithm hash,
> +                           size_t blocklen,
> +                           uint32_t stripes,
> +                           const uint8_t *in,
> +                           uint8_t *out,
> +                           Error **errp);
> +
> +#endif /* QCRYPTO_AFSPLIT_H__ */
> diff --git a/tests/.gitignore b/tests/.gitignore
> index 369f848..5b97e8c 100644
> --- a/tests/.gitignore
> +++ b/tests/.gitignore
> @@ -12,6 +12,7 @@ test-base64
>  test-bitops
>  test-blockjob-txn
>  test-coroutine
> +test-crypto-afsplit
>  test-crypto-cipher
>  test-crypto-hash
>  test-crypto-ivgen
> diff --git a/tests/Makefile b/tests/Makefile
> index ef6b717..868e67d 100644
> --- a/tests/Makefile
> +++ b/tests/Makefile
> @@ -94,6 +94,7 @@ check-unit-y += tests/test-io-channel-buffer$(EXESUF)
>  check-unit-y += tests/test-base64$(EXESUF)
>  check-unit-y += tests/test-crypto-pbkdf$(EXESUF)
>  check-unit-y += tests/test-crypto-ivgen$(EXESUF)
> +check-unit-y += tests/test-crypto-afsplit$(EXESUF)
>  
>  check-block-$(CONFIG_POSIX) += tests/qemu-iotests-quick.sh
>  
> @@ -501,6 +502,7 @@ tests/test-io-channel-buffer$(EXESUF): tests/test-io-channel-buffer.o \
>          tests/io-channel-helpers.o $(test-io-obj-y)
>  tests/test-crypto-pbkdf$(EXESUF): tests/test-crypto-pbkdf.o $(test-crypto-obj-y)
>  tests/test-crypto-ivgen$(EXESUF): tests/test-crypto-ivgen.o $(test-crypto-obj-y)
> +tests/test-crypto-afsplit$(EXESUF): tests/test-crypto-afsplit.o $(test-crypto-obj-y)
>  
>  libqos-obj-y = tests/libqos/pci.o tests/libqos/fw_cfg.o tests/libqos/malloc.o
>  libqos-obj-y += tests/libqos/i2c.o tests/libqos/libqos.o
> diff --git a/tests/test-crypto-afsplit.c b/tests/test-crypto-afsplit.c
> new file mode 100644
> index 0000000..52c0b71
> --- /dev/null
> +++ b/tests/test-crypto-afsplit.c
> @@ -0,0 +1,190 @@
> +/*
> + * QEMU Crypto anti-forensic splitter
> + *
> + * Copyright (c) 2015-2016 Red Hat, Inc.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, see <http://www.gnu.org/licenses/>.
> + *
> + */
> +
> +#include "qemu/osdep.h"
> +#include "crypto/init.h"
> +#include "crypto/afsplit.h"
> +
> +typedef struct QCryptoAFSplitTestData QCryptoAFSplitTestData;
> +struct QCryptoAFSplitTestData {
> +    const char *path;
> +    QCryptoHashAlgorithm hash;
> +    uint32_t stripes;
> +    size_t blocklen;
> +    const uint8_t *key;
> +    const uint8_t *splitkey;
> +};
> +
> +static QCryptoAFSplitTestData test_data[] = {
> +    {
> +        .path = "/crypto/afsplit/sha256/5",
> +        .hash = QCRYPTO_HASH_ALG_SHA256,
> +        .stripes = 5,
> +        .blocklen = 32,
> +        .key = (const uint8_t *)
> +            "\x00\x01\x02\x03\x04\x05\x06\x07"
> +            "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
> +            "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
> +            "\xa8\xa9\xaa\xab\xac\xad\xae\xaf",
> +        .splitkey = (const uint8_t *)
> +            "\xfd\xd2\x73\xb1\x7d\x99\x93\x34"
> +            "\x70\xde\xfa\x07\xc5\xac\x58\xd2"
> +            "\x30\x67\x2f\x1a\x35\x43\x60\x7d"
> +            "\x77\x02\xdb\x62\x3c\xcb\x2c\x33"
> +            "\x48\x08\xb6\xf1\x7c\xa3\x20\xa0"
> +            "\xad\x2d\x4c\xf3\xcd\x18\x6f\x53"
> +            "\xf9\xe8\xe7\x59\x27\x3c\xa9\x54"
> +            "\x61\x87\xb3\xaf\xf6\xf7\x7e\x64"
> +            "\x86\xaa\x89\x7f\x1f\x9f\xdb\x86"
> +            "\xf4\xa2\x16\xff\xa3\x4f\x8c\xa1"
> +            "\x59\xc4\x23\x34\x28\xc4\x77\x71"
> +            "\x83\xd4\xcd\x8e\x89\x1b\xc7\xc5"
> +            "\xae\x4d\xa9\xcd\xc9\x72\x85\x70"
> +            "\x13\x68\x52\x83\xfc\xb8\x11\x72"
> +            "\xba\x3d\xc6\x4a\x28\xfa\xe2\x86"
> +            "\x7b\x27\xab\x58\xe1\xa4\xca\xf6"
> +            "\x9e\xbc\xfe\x0c\x92\x79\xb3\xec"
> +            "\x1c\x5f\x79\x3b\x0d\x1e\xaa\x1a"
> +            "\x77\x0f\x70\x19\x4b\xc8\x80\xee"
> +            "\x27\x7c\x6e\x4a\x91\x96\x5c\xf4"
> +    },
> +    {
> +        .path = "/crypto/afsplit/sha256/5000",
> +        .hash = QCRYPTO_HASH_ALG_SHA256,
> +        .stripes = 5000,
> +        .blocklen = 16,
> +        .key = (const uint8_t *)
> +            "\x00\x01\x02\x03\x04\x05\x06\x07"
> +            "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
> +    },
> +    {
> +        .path = "/crypto/afsplit/sha1/1000",
> +        .hash = QCRYPTO_HASH_ALG_SHA1,
> +        .stripes = 1000,
> +        .blocklen = 32,
> +        .key = (const uint8_t *)
> +            "\x00\x01\x02\x03\x04\x05\x06\x07"
> +            "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
> +            "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
> +            "\xa8\xa9\xaa\xab\xac\xad\xae\xaf",
> +    },
> +    {
> +        .path = "/crypto/afsplit/sha256/big",
> +        .hash = QCRYPTO_HASH_ALG_SHA256,
> +        .stripes = 1000,
> +        .blocklen = 64,
> +        .key = (const uint8_t *)
> +            "\x00\x01\x02\x03\x04\x05\x06\x07"
> +            "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
> +            "\x00\x01\x02\x03\x04\x05\x06\x07"
> +            "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
> +            "\x00\x01\x02\x03\x04\x05\x06\x07"
> +            "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
> +            "\x00\x01\x02\x03\x04\x05\x06\x07"
> +            "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
> +    },
> +};
> +
> +
> +static inline char hex(int i)
> +{
> +    if (i < 10) {
> +        return '0' + i;
> +    }
> +    return 'a' + (i - 10);
> +}
> +
> +static char *hex_string(const uint8_t *bytes,
> +                        size_t len)
> +{
> +    char *hexstr = g_new0(char, len * 2 + 1);
> +    size_t i;
> +
> +    for (i = 0; i < len; i++) {
> +        hexstr[i * 2] = hex((bytes[i] >> 4) & 0xf);
> +        hexstr[i * 2 + 1] = hex(bytes[i] & 0xf);
> +    }
> +    hexstr[len * 2] = '\0';
> +
> +    return hexstr;
> +}
> +
> +static void test_afsplit(const void *opaque)
> +{
> +    const QCryptoAFSplitTestData *data = opaque;
> +    size_t splitlen = data->blocklen * data->stripes;
> +    uint8_t *splitkey = g_new0(uint8_t, splitlen);
> +    uint8_t *key = g_new0(uint8_t, data->blocklen);
> +    gchar *expect, *actual;
> +
> +    /* First time we round-trip the key */
> +    qcrypto_afsplit_encode(data->hash,
> +                           data->blocklen, data->stripes,
> +                           data->key, splitkey,
> +                           &error_abort);
> +
> +    qcrypto_afsplit_decode(data->hash,
> +                           data->blocklen, data->stripes,
> +                           splitkey, key,
> +                           &error_abort);
> +
> +    expect = hex_string(data->key, data->blocklen);
> +    actual = hex_string(key, data->blocklen);
> +
> +    g_assert_cmpstr(actual, ==, expect);
> +
> +    g_free(actual);
> +    g_free(expect);
> +
> +    /* Second time we merely try decoding a previous split */
> +    if (data->splitkey) {
> +        memset(key, 0, data->blocklen);
> +
> +        qcrypto_afsplit_decode(data->hash,
> +                               data->blocklen, data->stripes,
> +                               data->splitkey, key,
> +                               &error_abort);
> +
> +        expect = hex_string(data->key, data->blocklen);
> +        actual = hex_string(key, data->blocklen);
> +
> +        g_assert_cmpstr(actual, ==, expect);
> +
> +        g_free(actual);
> +        g_free(expect);
> +    }
> +
> +    g_free(key);
> +    g_free(splitkey);
> +}
> +
> +int main(int argc, char **argv)
> +{
> +    size_t i;
> +
> +    g_test_init(&argc, &argv, NULL);
> +
> +    g_assert(qcrypto_init(NULL) == 0);
> +
> +    for (i = 0; i < G_N_ELEMENTS(test_data); i++) {
> +        g_test_add_data_func(test_data[i].path, &test_data[i], test_afsplit);
> +    }
> +    return g_test_run();
> +}
> -- 
> 2.5.0
> 

  parent reply	other threads:[~2016-03-07  5:51 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-29 12:00 [Qemu-devel] [PATCH v4 00/26] Support LUKS encryption in block devices Daniel P. Berrange
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 01/26] crypto: add cryptographic random byte source Daniel P. Berrange
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 02/26] crypto: add support for PBKDF2 algorithm Daniel P. Berrange
2016-03-03  0:20   ` Eric Blake
2016-03-07  5:18   ` Fam Zheng
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 03/26] crypto: add support for generating initialization vectors Daniel P. Berrange
2016-03-03  0:31   ` Eric Blake
2016-03-03 10:49     ` Daniel P. Berrange
2016-03-07  5:39   ` Fam Zheng
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 04/26] crypto: add support for anti-forensic split algorithm Daniel P. Berrange
2016-03-03  0:41   ` Eric Blake
2016-03-07  5:51   ` Fam Zheng [this message]
2016-03-11 16:55     ` Daniel P. Berrange
2016-03-14  3:23       ` Fam Zheng
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 05/26] crypto: skip testing of unsupported cipher algorithms Daniel P. Berrange
2016-03-07  5:52   ` Fam Zheng
2016-03-11 19:10   ` Eric Blake
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 06/26] crypto: add support for the cast5-128 cipher algorithm Daniel P. Berrange
2016-03-07  5:56   ` Fam Zheng
2016-03-11 19:14   ` Eric Blake
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 07/26] crypto: add support for the serpent " Daniel P. Berrange
2016-03-07  6:05   ` Fam Zheng
2016-03-11 19:18   ` Eric Blake
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 08/26] crypto: add support for the twofish " Daniel P. Berrange
2016-03-08  6:01   ` Fam Zheng
2016-03-11 19:19   ` Eric Blake
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 09/26] crypto: import an implementation of the XTS cipher mode Daniel P. Berrange
2016-03-11 19:51   ` Eric Blake
2016-03-14 14:22     ` Daniel P. Berrange
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 10/26] crypto: refactor code for dealing with AES cipher Daniel P. Berrange
2016-03-11 20:14   ` Eric Blake
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 11/26] crypto: wire up XTS mode for cipher APIs Daniel P. Berrange
2016-03-11 20:23   ` Eric Blake
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 12/26] crypto: add block encryption framework Daniel P. Berrange
2016-03-11 20:58   ` Eric Blake
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 13/26] crypto: implement the LUKS block encryption format Daniel P. Berrange
2016-03-11 22:31   ` Eric Blake
2016-03-14 14:27     ` Daniel P. Berrange
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 14/26] block: add flag to indicate that no I/O will be performed Daniel P. Berrange
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 15/26] qemu-img/qemu-io: don't prompt for passwords if not required Daniel P. Berrange
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 16/26] tests: redirect stderr to stdout for iotests Daniel P. Berrange
2016-03-11 22:51   ` Eric Blake
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 17/26] tests: refactor python I/O tests helper main method Daniel P. Berrange
2016-03-11 22:57   ` Eric Blake
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 18/26] tests: add output filter to python I/O tests helper Daniel P. Berrange
2016-03-14 17:57   ` Eric Blake
2016-03-14 18:33     ` Daniel P. Berrange
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 19/26] block: add generic full disk encryption driver Daniel P. Berrange
2016-03-15 13:59   ` Eric Blake
2016-03-15 14:03     ` Daniel P. Berrange
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 20/26] qcow2: make qcow2_encrypt_sectors encrypt in place Daniel P. Berrange
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 21/26] qcow2: convert QCow2 to use QCryptoBlock for encryption Daniel P. Berrange
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 22/26] qcow: make encrypt_sectors encrypt in place Daniel P. Berrange
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 23/26] qcow: convert QCow to use QCryptoBlock for encryption Daniel P. Berrange
2016-02-29 12:00 ` [Qemu-devel] [PATCH v4 24/26] block: rip out all traces of password prompting Daniel P. Berrange
2016-05-12 20:35   ` Eric Blake
2016-02-29 12:01 ` [Qemu-devel] [PATCH v4 25/26] block: remove all encryption handling APIs Daniel P. Berrange
2016-02-29 12:01 ` [Qemu-devel] [PATCH v4 26/26] block: remove support for legecy AES qcow/qcow2 encryption Daniel P. Berrange

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160307055140.GC21446@ad.usersys.redhat.com \
    --to=famz@redhat.com \
    --cc=berrange@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).