Add flag to avoid continuous
memory allocate when calling EVP_MD_CTX_copy_ex(). Without this HMAC is several times slower than < 0.9.7.
This commit is contained in:
parent
381a693c39
commit
31edde3edc
6
CHANGES
6
CHANGES
@ -4,6 +4,12 @@
|
|||||||
|
|
||||||
Changes between 0.9.7c and 0.9.7d [xx XXX XXXX]
|
Changes between 0.9.7c and 0.9.7d [xx XXX XXXX]
|
||||||
|
|
||||||
|
*) New md flag EVP_MD_CTX_FLAG_REUSE this allows md_data to be reused when
|
||||||
|
calling EVP_MD_CTX_copy_ex() to avoid calling OPENSSL_malloc(). Without
|
||||||
|
this HMAC (and other) operations are several times slower than OpenSSL
|
||||||
|
< 0.9.7.
|
||||||
|
[Steve Henson]
|
||||||
|
|
||||||
*) Print out GeneralizedTime and UTCTime in ASN1_STRING_print_ex().
|
*) Print out GeneralizedTime and UTCTime in ASN1_STRING_print_ex().
|
||||||
[Peter Sylvester <Peter.Sylvester@EdelWeb.fr>]
|
[Peter Sylvester <Peter.Sylvester@EdelWeb.fr>]
|
||||||
|
|
||||||
|
@ -248,6 +248,7 @@ int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in)
|
|||||||
|
|
||||||
int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in)
|
int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in)
|
||||||
{
|
{
|
||||||
|
unsigned char *tmp_buf;
|
||||||
if ((in == NULL) || (in->digest == NULL))
|
if ((in == NULL) || (in->digest == NULL))
|
||||||
{
|
{
|
||||||
EVPerr(EVP_F_EVP_MD_CTX_COPY,EVP_R_INPUT_NOT_INITIALIZED);
|
EVPerr(EVP_F_EVP_MD_CTX_COPY,EVP_R_INPUT_NOT_INITIALIZED);
|
||||||
@ -262,12 +263,19 @@ int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (out->digest == in->digest)
|
||||||
|
{
|
||||||
|
tmp_buf = out->md_data;
|
||||||
|
EVP_MD_CTX_set_flags(out,EVP_MD_CTX_FLAG_REUSE);
|
||||||
|
}
|
||||||
|
else tmp_buf = NULL;
|
||||||
EVP_MD_CTX_cleanup(out);
|
EVP_MD_CTX_cleanup(out);
|
||||||
memcpy(out,in,sizeof *out);
|
memcpy(out,in,sizeof *out);
|
||||||
|
|
||||||
if (out->digest->ctx_size)
|
if (out->digest->ctx_size)
|
||||||
{
|
{
|
||||||
out->md_data=OPENSSL_malloc(out->digest->ctx_size);
|
if (tmp_buf) out->md_data = tmp_buf;
|
||||||
|
else out->md_data=OPENSSL_malloc(out->digest->ctx_size);
|
||||||
memcpy(out->md_data,in->md_data,out->digest->ctx_size);
|
memcpy(out->md_data,in->md_data,out->digest->ctx_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -308,7 +316,8 @@ int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
|
|||||||
if (ctx->digest && ctx->digest->cleanup
|
if (ctx->digest && ctx->digest->cleanup
|
||||||
&& !EVP_MD_CTX_test_flags(ctx,EVP_MD_CTX_FLAG_CLEANED))
|
&& !EVP_MD_CTX_test_flags(ctx,EVP_MD_CTX_FLAG_CLEANED))
|
||||||
ctx->digest->cleanup(ctx);
|
ctx->digest->cleanup(ctx);
|
||||||
if (ctx->digest && ctx->digest->ctx_size && ctx->md_data)
|
if (ctx->digest && ctx->digest->ctx_size && ctx->md_data
|
||||||
|
&& !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE))
|
||||||
{
|
{
|
||||||
OPENSSL_cleanse(ctx->md_data,ctx->digest->ctx_size);
|
OPENSSL_cleanse(ctx->md_data,ctx->digest->ctx_size);
|
||||||
OPENSSL_free(ctx->md_data);
|
OPENSSL_free(ctx->md_data);
|
||||||
|
@ -329,6 +329,8 @@ struct env_md_ctx_st
|
|||||||
* once only */
|
* once only */
|
||||||
#define EVP_MD_CTX_FLAG_CLEANED 0x0002 /* context has already been
|
#define EVP_MD_CTX_FLAG_CLEANED 0x0002 /* context has already been
|
||||||
* cleaned */
|
* cleaned */
|
||||||
|
#define EVP_MD_CTX_FLAG_REUSE 0x0004 /* Don't free up ctx->md_data
|
||||||
|
* in EVP_MD_CTX_cleanup */
|
||||||
|
|
||||||
struct evp_cipher_st
|
struct evp_cipher_st
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user