crypto: Assume blocksize is a power of 2
The check in the encode/decode path using full division has a noticeable amount of overhead. By asserting the blocksize is a power of 2, we can reduce this check to a mask. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
ca04c3cf15
commit
eba29771c0
@ -484,7 +484,7 @@ qcrypto_builtin_cipher_encrypt(QCryptoCipher *cipher,
|
|||||||
{
|
{
|
||||||
QCryptoCipherBuiltin *ctxt = cipher->opaque;
|
QCryptoCipherBuiltin *ctxt = cipher->opaque;
|
||||||
|
|
||||||
if (len % ctxt->blocksize) {
|
if (len & (ctxt->blocksize - 1)) {
|
||||||
error_setg(errp, "Length %zu must be a multiple of block size %zu",
|
error_setg(errp, "Length %zu must be a multiple of block size %zu",
|
||||||
len, ctxt->blocksize);
|
len, ctxt->blocksize);
|
||||||
return -1;
|
return -1;
|
||||||
@ -503,7 +503,7 @@ qcrypto_builtin_cipher_decrypt(QCryptoCipher *cipher,
|
|||||||
{
|
{
|
||||||
QCryptoCipherBuiltin *ctxt = cipher->opaque;
|
QCryptoCipherBuiltin *ctxt = cipher->opaque;
|
||||||
|
|
||||||
if (len % ctxt->blocksize) {
|
if (len & (ctxt->blocksize - 1)) {
|
||||||
error_setg(errp, "Length %zu must be a multiple of block size %zu",
|
error_setg(errp, "Length %zu must be a multiple of block size %zu",
|
||||||
len, ctxt->blocksize);
|
len, ctxt->blocksize);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -245,6 +245,7 @@ static QCryptoCipherGcrypt *qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
|
|||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
g_assert(is_power_of_2(ctx->blocksize));
|
||||||
|
|
||||||
#ifdef CONFIG_QEMU_PRIVATE_XTS
|
#ifdef CONFIG_QEMU_PRIVATE_XTS
|
||||||
if (mode == QCRYPTO_CIPHER_MODE_XTS) {
|
if (mode == QCRYPTO_CIPHER_MODE_XTS) {
|
||||||
@ -305,7 +306,7 @@ qcrypto_gcrypt_cipher_encrypt(QCryptoCipher *cipher,
|
|||||||
QCryptoCipherGcrypt *ctx = cipher->opaque;
|
QCryptoCipherGcrypt *ctx = cipher->opaque;
|
||||||
gcry_error_t err;
|
gcry_error_t err;
|
||||||
|
|
||||||
if (len % ctx->blocksize) {
|
if (len & (ctx->blocksize - 1)) {
|
||||||
error_setg(errp, "Length %zu must be a multiple of block size %zu",
|
error_setg(errp, "Length %zu must be a multiple of block size %zu",
|
||||||
len, ctx->blocksize);
|
len, ctx->blocksize);
|
||||||
return -1;
|
return -1;
|
||||||
@ -344,7 +345,7 @@ qcrypto_gcrypt_cipher_decrypt(QCryptoCipher *cipher,
|
|||||||
QCryptoCipherGcrypt *ctx = cipher->opaque;
|
QCryptoCipherGcrypt *ctx = cipher->opaque;
|
||||||
gcry_error_t err;
|
gcry_error_t err;
|
||||||
|
|
||||||
if (len % ctx->blocksize) {
|
if (len & (ctx->blocksize - 1)) {
|
||||||
error_setg(errp, "Length %zu must be a multiple of block size %zu",
|
error_setg(errp, "Length %zu must be a multiple of block size %zu",
|
||||||
len, ctx->blocksize);
|
len, ctx->blocksize);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -576,6 +576,7 @@ static QCryptoCipherNettle *qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
|
|||||||
QCryptoCipherAlgorithm_str(alg));
|
QCryptoCipherAlgorithm_str(alg));
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
g_assert(is_power_of_2(ctx->blocksize));
|
||||||
|
|
||||||
if (mode == QCRYPTO_CIPHER_MODE_XTS &&
|
if (mode == QCRYPTO_CIPHER_MODE_XTS &&
|
||||||
ctx->blocksize != XTS_BLOCK_SIZE) {
|
ctx->blocksize != XTS_BLOCK_SIZE) {
|
||||||
@ -613,7 +614,7 @@ qcrypto_nettle_cipher_encrypt(QCryptoCipher *cipher,
|
|||||||
{
|
{
|
||||||
QCryptoCipherNettle *ctx = cipher->opaque;
|
QCryptoCipherNettle *ctx = cipher->opaque;
|
||||||
|
|
||||||
if (len % ctx->blocksize) {
|
if (len & (ctx->blocksize - 1)) {
|
||||||
error_setg(errp, "Length %zu must be a multiple of block size %zu",
|
error_setg(errp, "Length %zu must be a multiple of block size %zu",
|
||||||
len, ctx->blocksize);
|
len, ctx->blocksize);
|
||||||
return -1;
|
return -1;
|
||||||
@ -666,7 +667,7 @@ qcrypto_nettle_cipher_decrypt(QCryptoCipher *cipher,
|
|||||||
{
|
{
|
||||||
QCryptoCipherNettle *ctx = cipher->opaque;
|
QCryptoCipherNettle *ctx = cipher->opaque;
|
||||||
|
|
||||||
if (len % ctx->blocksize) {
|
if (len & (ctx->blocksize - 1)) {
|
||||||
error_setg(errp, "Length %zu must be a multiple of block size %zu",
|
error_setg(errp, "Length %zu must be a multiple of block size %zu",
|
||||||
len, ctx->blocksize);
|
len, ctx->blocksize);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/host-utils.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "crypto/cipher.h"
|
#include "crypto/cipher.h"
|
||||||
#include "cipherpriv.h"
|
#include "cipherpriv.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user