diff options
author | Ben Laurie <ben@openssl.org> | 2001-07-30 23:57:25 +0000 |
---|---|---|
committer | Ben Laurie <ben@openssl.org> | 2001-07-30 23:57:25 +0000 |
commit | dbad169019598981174ff46c7a9bf58373b0e53a (patch) | |
tree | ce8ca1188d5614648f24b03967785543f1edc8f5 /crypto/evp/digest.c | |
parent | 3ba5d1cf2eb6ef28ac5f6d9f3d28020d00c5be50 (diff) |
Really add the EVP and all of the DES changes.
Diffstat (limited to 'crypto/evp/digest.c')
-rw-r--r-- | crypto/evp/digest.c | 69 |
1 files changed, 57 insertions, 12 deletions
diff --git a/crypto/evp/digest.c b/crypto/evp/digest.c index ad69bfdedd..f1c905ab75 100644 --- a/crypto/evp/digest.c +++ b/crypto/evp/digest.c @@ -61,35 +61,60 @@ #include <openssl/objects.h> #include <openssl/evp.h> +void EVP_MD_CTX_init(EVP_MD_CTX *ctx) + { + memset(ctx,'\0',sizeof *ctx); + } + +EVP_MD_CTX *EVP_MD_CTX_create(void) + { + EVP_MD_CTX *ctx=OPENSSL_malloc(sizeof *ctx); + + EVP_MD_CTX_init(ctx); + + return ctx; + } + int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type) { - ctx->digest=type; - return type->init(&(ctx->md)); + if(ctx->digest != type) + { + OPENSSL_free(ctx->md_data); + ctx->digest=type; + ctx->md_data=OPENSSL_malloc(type->ctx_size); + } + return type->init(ctx->md_data); } int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, unsigned int count) { - return ctx->digest->update(&(ctx->md.base[0]),data,(unsigned long)count); + return ctx->digest->update(ctx->md_data,data,(unsigned long)count); } +/* The caller can assume that this removes any secret data from the context */ int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size) { int ret; - ret = ctx->digest->final(md,&(ctx->md.base[0])); + ret=ctx->digest->final(md,ctx->md_data); if (size != NULL) *size=ctx->digest->md_size; - memset(&(ctx->md),0,sizeof(ctx->md)); + /* FIXME: add a cleanup function to the ctx? */ + memset(ctx->md_data,0,ctx->digest->ctx_size); return ret; } -int EVP_MD_CTX_copy(EVP_MD_CTX *out, EVP_MD_CTX *in) +int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in) { if ((in == NULL) || (in->digest == NULL)) { EVPerr(EVP_F_EVP_MD_CTX_COPY,EVP_R_INPUT_NOT_INITIALIZED); return 0; } - memcpy((char *)out,(char *)in,in->digest->ctx_size); + EVP_MD_CTX_cleanup(out); + memcpy(out,in,sizeof *out); + out->md_data=OPENSSL_malloc(out->digest->ctx_size); + /* FIXME: we really need a per-MD copy function */ + memcpy(out->md_data,in->md_data,out->digest->ctx_size); return 1; } @@ -97,9 +122,29 @@ int EVP_Digest(void *data, unsigned int count, unsigned char *md, unsigned int *size, const EVP_MD *type) { EVP_MD_CTX ctx; - if (!EVP_DigestInit(&ctx, type)) - return 0; - if (!EVP_DigestUpdate(&ctx, data, count)) - return 0; - return EVP_DigestFinal(&ctx, md, size); + int ret; + + EVP_MD_CTX_init(&ctx); + ret=EVP_DigestInit(&ctx, type) + && EVP_DigestUpdate(&ctx, data, count) + && EVP_DigestFinal(&ctx, md, size); + EVP_MD_CTX_cleanup(&ctx); + + return ret; } + +void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx) + { + EVP_MD_CTX_cleanup(ctx); + OPENSSL_free(ctx); + } + +/* This call frees resources associated with the context */ +int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx) + { + /* assume ctx->md_data was cleaned in EVP_Digest_Final */ + OPENSSL_free(ctx->md_data); + memset(ctx,'\0',sizeof *ctx); + + return 1; + } |