version 1.22, 2022/03/24 14:07:08 |
version 1.23, 2022/03/27 00:37:10 |
|
|
unsigned char **md_value) |
unsigned char **md_value) |
{ |
{ |
int md_value_len; |
int md_value_len; |
|
EVP_MD_CTX *md_ctx = NULL; |
|
|
md_value_len = EVP_MD_size(md); |
md_value_len = EVP_MD_size(md); |
if (md_value_len < 0) |
if (md_value_len < 0) |
goto err; |
goto err; |
|
|
if (input != NULL) { |
if (input != NULL) { |
/* Digest must be computed from an input file. */ |
/* Digest must be computed from an input file. */ |
EVP_MD_CTX *md_ctx; |
|
unsigned char buffer[4096]; |
unsigned char buffer[4096]; |
int length; |
int length; |
|
|
|
|
if ((md_ctx = EVP_MD_CTX_new()) == NULL) |
if ((md_ctx = EVP_MD_CTX_new()) == NULL) |
goto err; |
goto err; |
|
|
EVP_DigestInit(md_ctx, md); |
if (!EVP_DigestInit(md_ctx, md)) |
|
goto err; |
|
|
while ((length = BIO_read(input, buffer, sizeof(buffer))) > 0) { |
while ((length = BIO_read(input, buffer, sizeof(buffer))) > 0) { |
EVP_DigestUpdate(md_ctx, buffer, length); |
if (!EVP_DigestUpdate(md_ctx, buffer, length)) |
|
goto err; |
} |
} |
EVP_DigestFinal(md_ctx, *md_value, NULL); |
|
|
|
|
if (!EVP_DigestFinal(md_ctx, *md_value, NULL)) |
|
goto err; |
|
|
EVP_MD_CTX_free(md_ctx); |
EVP_MD_CTX_free(md_ctx); |
|
md_ctx = NULL; |
|
|
} else { |
} else { |
/* Digest bytes are specified with digest. */ |
/* Digest bytes are specified with digest. */ |
long digest_len; |
long digest_len; |
|
|
*md_value = string_to_hex(digest, &digest_len); |
*md_value = string_to_hex(digest, &digest_len); |
if (*md_value == NULL || md_value_len != digest_len) { |
if (*md_value == NULL || md_value_len != digest_len) { |
free(*md_value); |
free(*md_value); |
|
|
} |
} |
|
|
return md_value_len; |
return md_value_len; |
|
|
err: |
err: |
|
EVP_MD_CTX_free(md_ctx); |
return 0; |
return 0; |
} |
} |
|
|