mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-02 21:32:52 +00:00
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>
This commit is contained in:
parent
eabe6c58ac
commit
d962c6266c
1 changed files with 55 additions and 46 deletions
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue