crypto: cipher: introduce qcrypto_cipher_ctx_new for builtin-backend

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>
master
Longpeng(Mike) 2017-07-14 14:03:57 -04:00 committed by Daniel P. Berrange
parent eabe6c58ac
commit d962c6266c
1 changed files with 55 additions and 46 deletions

View File

@ -235,23 +235,24 @@ static int qcrypto_cipher_setiv_aes(QCryptoCipher *cipher,
static int qcrypto_cipher_init_aes(QCryptoCipher *cipher, static QCryptoCipherBuiltin *
const uint8_t *key, size_t nkey, qcrypto_cipher_init_aes(QCryptoCipherMode mode,
Error **errp) const uint8_t *key, size_t nkey,
Error **errp)
{ {
QCryptoCipherBuiltin *ctxt; QCryptoCipherBuiltin *ctxt;
if (cipher->mode != QCRYPTO_CIPHER_MODE_CBC && if (mode != QCRYPTO_CIPHER_MODE_CBC &&
cipher->mode != QCRYPTO_CIPHER_MODE_ECB && mode != QCRYPTO_CIPHER_MODE_ECB &&
cipher->mode != QCRYPTO_CIPHER_MODE_XTS) { mode != QCRYPTO_CIPHER_MODE_XTS) {
error_setg(errp, "Unsupported cipher mode %s", error_setg(errp, "Unsupported cipher mode %s",
QCryptoCipherMode_lookup[cipher->mode]); QCryptoCipherMode_lookup[mode]);
return -1; return NULL;
} }
ctxt = g_new0(QCryptoCipherBuiltin, 1); 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) { if (AES_set_encrypt_key(key, nkey * 4, &ctxt->state.aes.key.enc) != 0) {
error_setg(errp, "Failed to set encryption key"); error_setg(errp, "Failed to set encryption key");
goto error; goto error;
@ -291,13 +292,11 @@ static int qcrypto_cipher_init_aes(QCryptoCipher *cipher,
ctxt->encrypt = qcrypto_cipher_encrypt_aes; ctxt->encrypt = qcrypto_cipher_encrypt_aes;
ctxt->decrypt = qcrypto_cipher_decrypt_aes; ctxt->decrypt = qcrypto_cipher_decrypt_aes;
cipher->opaque = ctxt; return ctxt;
return 0;
error: error:
g_free(ctxt); g_free(ctxt);
return -1; return NULL;
} }
@ -370,16 +369,17 @@ static int qcrypto_cipher_setiv_des_rfb(QCryptoCipher *cipher,
} }
static int qcrypto_cipher_init_des_rfb(QCryptoCipher *cipher, static QCryptoCipherBuiltin *
const uint8_t *key, size_t nkey, qcrypto_cipher_init_des_rfb(QCryptoCipherMode mode,
Error **errp) const uint8_t *key, size_t nkey,
Error **errp)
{ {
QCryptoCipherBuiltin *ctxt; QCryptoCipherBuiltin *ctxt;
if (cipher->mode != QCRYPTO_CIPHER_MODE_ECB) { if (mode != QCRYPTO_CIPHER_MODE_ECB) {
error_setg(errp, "Unsupported cipher mode %s", error_setg(errp, "Unsupported cipher mode %s",
QCryptoCipherMode_lookup[cipher->mode]); QCryptoCipherMode_lookup[mode]);
return -1; return NULL;
} }
ctxt = g_new0(QCryptoCipherBuiltin, 1); ctxt = g_new0(QCryptoCipherBuiltin, 1);
@ -394,9 +394,7 @@ static int qcrypto_cipher_init_des_rfb(QCryptoCipher *cipher,
ctxt->encrypt = qcrypto_cipher_encrypt_des_rfb; ctxt->encrypt = qcrypto_cipher_encrypt_des_rfb;
ctxt->decrypt = qcrypto_cipher_decrypt_des_rfb; ctxt->decrypt = qcrypto_cipher_decrypt_des_rfb;
cipher->opaque = ctxt; return ctxt;
return 0;
} }
@ -426,12 +424,13 @@ bool qcrypto_cipher_supports(QCryptoCipherAlgorithm alg,
} }
QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg, static QCryptoCipherBuiltin *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; QCryptoCipherBuiltin *ctxt;
switch (mode) { switch (mode) {
case QCRYPTO_CIPHER_MODE_ECB: case QCRYPTO_CIPHER_MODE_ECB:
@ -444,39 +443,27 @@ QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
return NULL; return NULL;
} }
cipher = g_new0(QCryptoCipher, 1);
cipher->alg = alg;
cipher->mode = mode;
if (!qcrypto_cipher_validate_key_length(alg, mode, nkey, errp)) { 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: case QCRYPTO_CIPHER_ALG_DES_RFB:
if (qcrypto_cipher_init_des_rfb(cipher, key, nkey, errp) < 0) { ctxt = qcrypto_cipher_init_des_rfb(mode, key, nkey, errp);
goto error;
}
break; break;
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:
if (qcrypto_cipher_init_aes(cipher, key, nkey, errp) < 0) { ctxt = qcrypto_cipher_init_aes(mode, key, nkey, errp);
goto error;
}
break; break;
default: default:
error_setg(errp, error_setg(errp,
"Unsupported cipher algorithm %s", "Unsupported cipher algorithm %s",
QCryptoCipherAlgorithm_lookup[cipher->alg]); QCryptoCipherAlgorithm_lookup[alg]);
goto error; return NULL;
} }
return cipher; return ctxt;
error:
g_free(cipher);
return NULL;
} }
void qcrypto_cipher_free(QCryptoCipher *cipher) void qcrypto_cipher_free(QCryptoCipher *cipher)
@ -537,3 +524,25 @@ int qcrypto_cipher_setiv(QCryptoCipher *cipher,
return ctxt->setiv(cipher, iv, niv, errp); 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;
}