Skip to content

Commit

Permalink
crypto: cipher: introduce qcrypto_cipher_ctx_new for builtin-backend
Browse files Browse the repository at this point in the history
Extracts qcrypto_cipher_ctx_new() from qcrypto_cipher_new() for
builtin-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>
  • Loading branch information
Longpeng(Mike) authored and berrange committed Jul 19, 2017
1 parent eabe6c5 commit d962c62
Showing 1 changed file with 55 additions and 46 deletions.
101 changes: 55 additions & 46 deletions crypto/cipher-builtin.c
Expand Up @@ -235,23 +235,24 @@ static int qcrypto_cipher_setiv_aes(QCryptoCipher *cipher,



static int qcrypto_cipher_init_aes(QCryptoCipher *cipher,
const uint8_t *key, size_t nkey,
Error **errp)
static QCryptoCipherBuiltin *
qcrypto_cipher_init_aes(QCryptoCipherMode mode,
const uint8_t *key, size_t nkey,
Error **errp)
{
QCryptoCipherBuiltin *ctxt;

if (cipher->mode != QCRYPTO_CIPHER_MODE_CBC &&
cipher->mode != QCRYPTO_CIPHER_MODE_ECB &&
cipher->mode != QCRYPTO_CIPHER_MODE_XTS) {
if (mode != QCRYPTO_CIPHER_MODE_CBC &&
mode != QCRYPTO_CIPHER_MODE_ECB &&
mode != QCRYPTO_CIPHER_MODE_XTS) {
error_setg(errp, "Unsupported cipher mode %s",
QCryptoCipherMode_lookup[cipher->mode]);
return -1;
QCryptoCipherMode_lookup[mode]);
return NULL;
}

ctxt = g_new0(QCryptoCipherBuiltin, 1);

if (cipher->mode == QCRYPTO_CIPHER_MODE_XTS) {
if (mode == QCRYPTO_CIPHER_MODE_XTS) {
if (AES_set_encrypt_key(key, nkey * 4, &ctxt->state.aes.key.enc) != 0) {
error_setg(errp, "Failed to set encryption key");
goto error;
Expand Down Expand Up @@ -291,13 +292,11 @@ static int qcrypto_cipher_init_aes(QCryptoCipher *cipher,
ctxt->encrypt = qcrypto_cipher_encrypt_aes;
ctxt->decrypt = qcrypto_cipher_decrypt_aes;

cipher->opaque = ctxt;

return 0;
return ctxt;

error:
g_free(ctxt);
return -1;
return NULL;
}


Expand Down Expand Up @@ -370,16 +369,17 @@ static int qcrypto_cipher_setiv_des_rfb(QCryptoCipher *cipher,
}


static int qcrypto_cipher_init_des_rfb(QCryptoCipher *cipher,
const uint8_t *key, size_t nkey,
Error **errp)
static QCryptoCipherBuiltin *
qcrypto_cipher_init_des_rfb(QCryptoCipherMode mode,
const uint8_t *key, size_t nkey,
Error **errp)
{
QCryptoCipherBuiltin *ctxt;

if (cipher->mode != QCRYPTO_CIPHER_MODE_ECB) {
if (mode != QCRYPTO_CIPHER_MODE_ECB) {
error_setg(errp, "Unsupported cipher mode %s",
QCryptoCipherMode_lookup[cipher->mode]);
return -1;
QCryptoCipherMode_lookup[mode]);
return NULL;
}

ctxt = g_new0(QCryptoCipherBuiltin, 1);
Expand All @@ -394,9 +394,7 @@ static int qcrypto_cipher_init_des_rfb(QCryptoCipher *cipher,
ctxt->encrypt = qcrypto_cipher_encrypt_des_rfb;
ctxt->decrypt = qcrypto_cipher_decrypt_des_rfb;

cipher->opaque = ctxt;

return 0;
return ctxt;
}


Expand Down Expand Up @@ -426,12 +424,13 @@ bool qcrypto_cipher_supports(QCryptoCipherAlgorithm alg,
}


QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
QCryptoCipherMode mode,
const uint8_t *key, size_t nkey,
Error **errp)
static QCryptoCipherBuiltin *qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
QCryptoCipherMode mode,
const uint8_t *key,
size_t nkey,
Error **errp)
{
QCryptoCipher *cipher;
QCryptoCipherBuiltin *ctxt;

switch (mode) {
case QCRYPTO_CIPHER_MODE_ECB:
Expand All @@ -444,39 +443,27 @@ QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
return NULL;
}

cipher = g_new0(QCryptoCipher, 1);
cipher->alg = alg;
cipher->mode = mode;

if (!qcrypto_cipher_validate_key_length(alg, mode, nkey, errp)) {
goto error;
return NULL;
}

switch (cipher->alg) {
switch (alg) {
case QCRYPTO_CIPHER_ALG_DES_RFB:
if (qcrypto_cipher_init_des_rfb(cipher, key, nkey, errp) < 0) {
goto error;
}
ctxt = qcrypto_cipher_init_des_rfb(mode, key, nkey, errp);
break;
case QCRYPTO_CIPHER_ALG_AES_128:
case QCRYPTO_CIPHER_ALG_AES_192:
case QCRYPTO_CIPHER_ALG_AES_256:
if (qcrypto_cipher_init_aes(cipher, key, nkey, errp) < 0) {
goto error;
}
ctxt = qcrypto_cipher_init_aes(mode, key, nkey, errp);
break;
default:
error_setg(errp,
"Unsupported cipher algorithm %s",
QCryptoCipherAlgorithm_lookup[cipher->alg]);
goto error;
QCryptoCipherAlgorithm_lookup[alg]);
return NULL;
}

return cipher;

error:
g_free(cipher);
return NULL;
return ctxt;
}

void qcrypto_cipher_free(QCryptoCipher *cipher)
Expand Down Expand Up @@ -537,3 +524,25 @@ int qcrypto_cipher_setiv(QCryptoCipher *cipher,

return ctxt->setiv(cipher, iv, niv, errp);
}


QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
QCryptoCipherMode mode,
const uint8_t *key, size_t nkey,
Error **errp)
{
QCryptoCipher *cipher;
QCryptoCipherBuiltin *ctxt;

ctxt = qcrypto_cipher_ctx_new(alg, mode, key, nkey, errp);
if (!ctxt) {
return NULL;
}

cipher = g_new0(QCryptoCipher, 1);
cipher->alg = alg;
cipher->mode = mode;
cipher->opaque = ctxt;

return cipher;
}

0 comments on commit d962c62

Please sign in to comment.