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;
|
||||
|
||||
if (len % ctxt->blocksize) {
|
||||
if (len & (ctxt->blocksize - 1)) {
|
||||
error_setg(errp, "Length %zu must be a multiple of block size %zu",
|
||||
len, ctxt->blocksize);
|
||||
return -1;
|
||||
@ -503,7 +503,7 @@ qcrypto_builtin_cipher_decrypt(QCryptoCipher *cipher,
|
||||
{
|
||||
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",
|
||||
len, ctxt->blocksize);
|
||||
return -1;
|
||||
|
@ -245,6 +245,7 @@ static QCryptoCipherGcrypt *qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
g_assert(is_power_of_2(ctx->blocksize));
|
||||
|
||||
#ifdef CONFIG_QEMU_PRIVATE_XTS
|
||||
if (mode == QCRYPTO_CIPHER_MODE_XTS) {
|
||||
@ -305,7 +306,7 @@ qcrypto_gcrypt_cipher_encrypt(QCryptoCipher *cipher,
|
||||
QCryptoCipherGcrypt *ctx = cipher->opaque;
|
||||
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",
|
||||
len, ctx->blocksize);
|
||||
return -1;
|
||||
@ -344,7 +345,7 @@ qcrypto_gcrypt_cipher_decrypt(QCryptoCipher *cipher,
|
||||
QCryptoCipherGcrypt *ctx = cipher->opaque;
|
||||
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",
|
||||
len, ctx->blocksize);
|
||||
return -1;
|
||||
|
@ -576,6 +576,7 @@ static QCryptoCipherNettle *qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
|
||||
QCryptoCipherAlgorithm_str(alg));
|
||||
goto error;
|
||||
}
|
||||
g_assert(is_power_of_2(ctx->blocksize));
|
||||
|
||||
if (mode == QCRYPTO_CIPHER_MODE_XTS &&
|
||||
ctx->blocksize != XTS_BLOCK_SIZE) {
|
||||
@ -613,7 +614,7 @@ qcrypto_nettle_cipher_encrypt(QCryptoCipher *cipher,
|
||||
{
|
||||
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",
|
||||
len, ctx->blocksize);
|
||||
return -1;
|
||||
@ -666,7 +667,7 @@ qcrypto_nettle_cipher_decrypt(QCryptoCipher *cipher,
|
||||
{
|
||||
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",
|
||||
len, ctx->blocksize);
|
||||
return -1;
|
||||
|
@ -19,6 +19,7 @@
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/host-utils.h"
|
||||
#include "qapi/error.h"
|
||||
#include "crypto/cipher.h"
|
||||
#include "cipherpriv.h"
|
||||
|
Loading…
Reference in New Issue
Block a user