Commit 1dc57b60 authored by Vladimir Sementsov-Ogievskiy's avatar Vladimir Sementsov-Ogievskiy Committed by Daniel P. Berrangé
Browse files

crypto/block: refactor qcrypto_block_*crypt_helper functions



qcrypto_block_encrypt_helper and qcrypto_block_decrypt_helper are
almost identical, let's reduce code duplication and simplify further
improvements.

Signed-off-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: default avatarAlberto Garcia <berto@igalia.com>
Signed-off-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
parent b640adca
Loading
Loading
Loading
Loading
+31 −50
Original line number Diff line number Diff line
@@ -190,13 +190,20 @@ void qcrypto_block_free(QCryptoBlock *block)
}


int qcrypto_block_decrypt_helper(QCryptoCipher *cipher,
typedef int (*QCryptoCipherEncDecFunc)(QCryptoCipher *cipher,
                                       const void *in,
                                       void *out,
                                       size_t len,
                                       Error **errp);

static int do_qcrypto_block_encdec(QCryptoCipher *cipher,
                                   size_t niv,
                                   QCryptoIVGen *ivgen,
                                   int sectorsize,
                                   uint64_t offset,
                                   uint8_t *buf,
                                   size_t len,
                                   QCryptoCipherEncDecFunc func,
                                   Error **errp)
{
    uint8_t *iv;
@@ -226,8 +233,7 @@ int qcrypto_block_decrypt_helper(QCryptoCipher *cipher,
        }

        nbytes = len > sectorsize ? sectorsize : len;
        if (qcrypto_cipher_decrypt(cipher, buf, buf,
                                   nbytes, errp) < 0) {
        if (func(cipher, buf, buf, nbytes, errp) < 0) {
            goto cleanup;
        }

@@ -243,7 +249,7 @@ int qcrypto_block_decrypt_helper(QCryptoCipher *cipher,
}


int qcrypto_block_encrypt_helper(QCryptoCipher *cipher,
int qcrypto_block_decrypt_helper(QCryptoCipher *cipher,
                                 size_t niv,
                                 QCryptoIVGen *ivgen,
                                 int sectorsize,
@@ -252,45 +258,20 @@ int qcrypto_block_encrypt_helper(QCryptoCipher *cipher,
                                 size_t len,
                                 Error **errp)
{
    uint8_t *iv;
    int ret = -1;
    uint64_t startsector = offset / sectorsize;

    assert(QEMU_IS_ALIGNED(offset, sectorsize));
    assert(QEMU_IS_ALIGNED(len, sectorsize));

    iv = niv ? g_new0(uint8_t, niv) : NULL;

    while (len > 0) {
        size_t nbytes;
        if (niv) {
            if (qcrypto_ivgen_calculate(ivgen,
                                        startsector,
                                        iv, niv,
                                        errp) < 0) {
                goto cleanup;
            }

            if (qcrypto_cipher_setiv(cipher,
                                     iv, niv,
                                     errp) < 0) {
                goto cleanup;
            }
    return do_qcrypto_block_encdec(cipher, niv, ivgen, sectorsize, offset,
                                   buf, len, qcrypto_cipher_decrypt, errp);
}

        nbytes = len > sectorsize ? sectorsize : len;
        if (qcrypto_cipher_encrypt(cipher, buf, buf,
                                   nbytes, errp) < 0) {
            goto cleanup;
        }

        startsector++;
        buf += nbytes;
        len -= nbytes;
    }

    ret = 0;
 cleanup:
    g_free(iv);
    return ret;
int qcrypto_block_encrypt_helper(QCryptoCipher *cipher,
                                 size_t niv,
                                 QCryptoIVGen *ivgen,
                                 int sectorsize,
                                 uint64_t offset,
                                 uint8_t *buf,
                                 size_t len,
                                 Error **errp)
{
    return do_qcrypto_block_encdec(cipher, niv, ivgen, sectorsize, offset,
                                   buf, len, qcrypto_cipher_encrypt, errp);
}