129 lines
4.1 KiB
Diff
129 lines
4.1 KiB
Diff
From ed6dfd1e3694b3438249f3d0117bc314afa6b240 Mon Sep 17 00:00:00 2001
|
|
From: Liu-ErMeng <liuermeng2@huawei.com>
|
|
Date: Tue, 11 Jul 2023 16:22:53 +0800
|
|
Subject: [PATCH] use '__builtin_expect' to improve EVP_EncryptUpdate
|
|
performance for gcc/clang.
|
|
|
|
Signed-off-by: Liu-ErMeng <liuermeng2@huawei.com>
|
|
|
|
Reviewed-by: Tomas Mraz <tomas@openssl.org>
|
|
Reviewed-by: Tom Cosgrove <tom.cosgrove@arm.com>
|
|
Reviewed-by: Paul Dale <pauli@openssl.org>
|
|
(Merged from https://github.com/openssl/openssl/pull/21425)
|
|
---
|
|
crypto/evp/evp_enc.c | 24 ++++++++++++------------
|
|
include/internal/common.h | 8 ++++++++
|
|
2 files changed, 20 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/crypto/evp/evp_enc.c b/crypto/evp/evp_enc.c
|
|
index 6b6d65163f..8dddcc0bb5 100644
|
|
--- a/crypto/evp/evp_enc.c
|
|
+++ b/crypto/evp/evp_enc.c
|
|
@@ -27,6 +27,14 @@
|
|
#include "crypto/evp.h"
|
|
#include "evp_local.h"
|
|
|
|
+#if defined(__GNUC__) || defined(__clang__)
|
|
+ #define likely(x) __builtin_expect(!!(x), 1)
|
|
+ #define unlikely(x) __builtin_expect(!!(x), 0)
|
|
+#else
|
|
+ #define likely(x) x
|
|
+ #define unlikely(x) x
|
|
+#endif
|
|
+
|
|
int EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *ctx)
|
|
{
|
|
if (ctx == NULL)
|
|
@@ -621,7 +621,7 @@ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
|
|
size_t soutl, inl_ = (size_t)inl;
|
|
int blocksize;
|
|
|
|
- if (outl != NULL) {
|
|
+ if (likely(outl != NULL)) {
|
|
*outl = 0;
|
|
} else {
|
|
ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER);
|
|
@@ -629,22 +629,22 @@ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
|
|
}
|
|
|
|
/* Prevent accidental use of decryption context when encrypting */
|
|
- if (!ctx->encrypt) {
|
|
+ if (unlikely(!ctx->encrypt)) {
|
|
ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_OPERATION);
|
|
return 0;
|
|
}
|
|
|
|
- if (ctx->cipher == NULL) {
|
|
+ if (unlikely(ctx->cipher == NULL)) {
|
|
ERR_raise(ERR_LIB_EVP, EVP_R_NO_CIPHER_SET);
|
|
return 0;
|
|
}
|
|
|
|
- if (ctx->cipher->prov == NULL)
|
|
+ if (unlikely(ctx->cipher->prov == NULL))
|
|
goto legacy;
|
|
|
|
blocksize = ctx->cipher->block_size;
|
|
|
|
- if (ctx->cipher->cupdate == NULL || blocksize < 1) {
|
|
+ if (unlikely(ctx->cipher->cupdate == NULL || blocksize < 1)) {
|
|
ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR);
|
|
return 0;
|
|
}
|
|
@@ -653,7 +653,7 @@ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
|
|
inl_ + (size_t)(blocksize == 1 ? 0 : blocksize),
|
|
in, inl_);
|
|
|
|
- if (ret) {
|
|
+ if (likely(ret)) {
|
|
if (soutl > INT_MAX) {
|
|
ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR);
|
|
return 0;
|
|
@@ -770,7 +770,7 @@ int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
|
|
size_t soutl, inl_ = (size_t)inl;
|
|
int blocksize;
|
|
|
|
- if (outl != NULL) {
|
|
+ if (likely(outl != NULL)) {
|
|
*outl = 0;
|
|
} else {
|
|
ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER);
|
|
@@ -778,21 +778,21 @@ int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
|
|
}
|
|
|
|
/* Prevent accidental use of encryption context when decrypting */
|
|
- if (ctx->encrypt) {
|
|
+ if (unlikely(ctx->encrypt)) {
|
|
ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_OPERATION);
|
|
return 0;
|
|
}
|
|
|
|
- if (ctx->cipher == NULL) {
|
|
+ if (unlikely(ctx->cipher == NULL)) {
|
|
ERR_raise(ERR_LIB_EVP, EVP_R_NO_CIPHER_SET);
|
|
return 0;
|
|
}
|
|
- if (ctx->cipher->prov == NULL)
|
|
+ if (unlikely(ctx->cipher->prov == NULL))
|
|
goto legacy;
|
|
|
|
blocksize = EVP_CIPHER_CTX_get_block_size(ctx);
|
|
|
|
- if (ctx->cipher->cupdate == NULL || blocksize < 1) {
|
|
+ if (unlikely(ctx->cipher->cupdate == NULL || blocksize < 1)) {
|
|
ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR);
|
|
return 0;
|
|
}
|
|
@@ -800,7 +800,7 @@ int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
|
|
inl_ + (size_t)(blocksize == 1 ? 0 : blocksize),
|
|
in, inl_);
|
|
|
|
- if (ret) {
|
|
+ if (likely(ret)) {
|
|
if (soutl > INT_MAX) {
|
|
ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR);
|
|
return 0;
|
|
--
|
|
2.33.0
|
|
|