crypto: cipher: introduce qcrypto_cipher_ctx_new for gcrypt-backend

Extracts qcrypto_cipher_ctx_new() from qcrypto_cipher_new() for
gcrypt-backend impls.

Reviewed-by: Gonglei <arei.gonglei@huawei.com>
Signed-off-by: Longpeng(Mike) <longpeng2@huawei.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Longpeng(Mike) 2017-07-14 14:03:55 -04:00 committed by Daniel P. Berrange
parent cc5eff0186
commit 468fb27154
1 changed files with 33 additions and 17 deletions

View File

@ -80,12 +80,12 @@ static void gcrypt_cipher_free_ctx(QCryptoCipherGcrypt *ctx,
} }
QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg, static QCryptoCipherGcrypt *qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
QCryptoCipherMode mode, QCryptoCipherMode mode,
const uint8_t *key, size_t nkey, const uint8_t *key,
Error **errp) size_t nkey,
Error **errp)
{ {
QCryptoCipher *cipher;
QCryptoCipherGcrypt *ctx; QCryptoCipherGcrypt *ctx;
gcry_error_t err; gcry_error_t err;
int gcryalg, gcrymode; int gcryalg, gcrymode;
@ -162,10 +162,6 @@ QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
return NULL; return NULL;
} }
cipher = g_new0(QCryptoCipher, 1);
cipher->alg = alg;
cipher->mode = mode;
ctx = g_new0(QCryptoCipherGcrypt, 1); ctx = g_new0(QCryptoCipherGcrypt, 1);
err = gcry_cipher_open(&ctx->handle, gcryalg, gcrymode, 0); err = gcry_cipher_open(&ctx->handle, gcryalg, gcrymode, 0);
@ -174,7 +170,7 @@ QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
gcry_strerror(err)); gcry_strerror(err));
goto error; goto error;
} }
if (cipher->mode == QCRYPTO_CIPHER_MODE_XTS) { if (mode == QCRYPTO_CIPHER_MODE_XTS) {
err = gcry_cipher_open(&ctx->tweakhandle, gcryalg, gcrymode, 0); err = gcry_cipher_open(&ctx->tweakhandle, gcryalg, gcrymode, 0);
if (err != 0) { if (err != 0) {
error_setg(errp, "Cannot initialize cipher: %s", error_setg(errp, "Cannot initialize cipher: %s",
@ -183,7 +179,7 @@ QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
} }
} }
if (cipher->alg == QCRYPTO_CIPHER_ALG_DES_RFB) { if (alg == QCRYPTO_CIPHER_ALG_DES_RFB) {
/* We're using standard DES cipher from gcrypt, so we need /* We're using standard DES cipher from gcrypt, so we need
* to munge the key so that the results are the same as the * to munge the key so that the results are the same as the
* bizarre RFB variant of DES :-) * bizarre RFB variant of DES :-)
@ -193,7 +189,7 @@ QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
g_free(rfbkey); g_free(rfbkey);
ctx->blocksize = 8; ctx->blocksize = 8;
} else { } else {
if (cipher->mode == QCRYPTO_CIPHER_MODE_XTS) { if (mode == QCRYPTO_CIPHER_MODE_XTS) {
nkey /= 2; nkey /= 2;
err = gcry_cipher_setkey(ctx->handle, key, nkey); err = gcry_cipher_setkey(ctx->handle, key, nkey);
if (err != 0) { if (err != 0) {
@ -210,7 +206,7 @@ QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
gcry_strerror(err)); gcry_strerror(err));
goto error; goto error;
} }
switch (cipher->alg) { switch (alg) {
case QCRYPTO_CIPHER_ALG_AES_128: case QCRYPTO_CIPHER_ALG_AES_128:
case QCRYPTO_CIPHER_ALG_AES_192: case QCRYPTO_CIPHER_ALG_AES_192:
case QCRYPTO_CIPHER_ALG_AES_256: case QCRYPTO_CIPHER_ALG_AES_256:
@ -230,7 +226,7 @@ QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
} }
} }
if (cipher->mode == QCRYPTO_CIPHER_MODE_XTS) { if (mode == QCRYPTO_CIPHER_MODE_XTS) {
if (ctx->blocksize != XTS_BLOCK_SIZE) { if (ctx->blocksize != XTS_BLOCK_SIZE) {
error_setg(errp, error_setg(errp,
"Cipher block size %zu must equal XTS block size %d", "Cipher block size %zu must equal XTS block size %d",
@ -240,12 +236,10 @@ QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
ctx->iv = g_new0(uint8_t, ctx->blocksize); ctx->iv = g_new0(uint8_t, ctx->blocksize);
} }
cipher->opaque = ctx; return ctx;
return cipher;
error: error:
gcrypt_cipher_free_ctx(ctx, mode); gcrypt_cipher_free_ctx(ctx, mode);
g_free(cipher);
return NULL; return NULL;
} }
@ -385,3 +379,25 @@ int qcrypto_cipher_setiv(QCryptoCipher *cipher,
return 0; return 0;
} }
QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
QCryptoCipherMode mode,
const uint8_t *key, size_t nkey,
Error **errp)
{
QCryptoCipher *cipher;
QCryptoCipherGcrypt *ctx;
ctx = qcrypto_cipher_ctx_new(alg, mode, key, nkey, errp);
if (!ctx) {
return NULL;
}
cipher = g_new0(QCryptoCipher, 1);
cipher->alg = alg;
cipher->mode = mode;
cipher->opaque = ctx;
return cipher;
}