void CRYPTO_free(void *str)
{
#ifndef OPENSSL_NO_CRYPTO_MDEBUG
    if (call_malloc_debug) {
        CRYPTO_mem_debug_free(str, 0);
        free(str);
        CRYPTO_mem_debug_free(str, 1);
    } else {
        free(str);
    }
#else
    free(str);
#endif
}
['static int create_digest(BIO *input, char *digest, const EVP_MD *md,\n                         unsigned char **md_value)\n{\n    int md_value_len;\n    md_value_len = EVP_MD_size(md);\n    if (md_value_len < 0)\n        return 0;\n    if (input) {\n        EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();\n        unsigned char buffer[4096];\n        int length;\n        if (md_ctx == NULL)\n            return 0;\n        *md_value = app_malloc(md_value_len, "digest buffer");\n        EVP_DigestInit(md_ctx, md);\n        while ((length = BIO_read(input, buffer, sizeof(buffer))) > 0) {\n            EVP_DigestUpdate(md_ctx, buffer, length);\n        }\n        if (!EVP_DigestFinal(md_ctx, *md_value, NULL)) {\n            EVP_MD_CTX_free(md_ctx);\n            return 0;\n        }\n        EVP_MD_CTX_free(md_ctx);\n    } else {\n        long digest_len;\n        *md_value = string_to_hex(digest, &digest_len);\n        if (!*md_value || md_value_len != digest_len) {\n            OPENSSL_free(*md_value);\n            *md_value = NULL;\n            BIO_printf(bio_err, "bad digest, %d bytes "\n                       "must be specified\\n", md_value_len);\n            return 0;\n        }\n    }\n    return md_value_len;\n}', 'int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size)\n{\n    int ret;\n    ret = EVP_DigestFinal_ex(ctx, md, size);\n    EVP_MD_CTX_reset(ctx);\n    return ret;\n}', 'int EVP_MD_CTX_reset(EVP_MD_CTX *ctx)\n{\n    if (ctx == NULL)\n        return 1;\n    if (ctx->digest && ctx->digest->cleanup\n        && !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_CLEANED))\n        ctx->digest->cleanup(ctx);\n    if (ctx->digest && ctx->digest->ctx_size && ctx->md_data\n        && !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE)) {\n        OPENSSL_clear_free(ctx->md_data, ctx->digest->ctx_size);\n    }\n    EVP_PKEY_CTX_free(ctx->pctx);\n#ifndef OPENSSL_NO_ENGINE\n    if (ctx->engine)\n        ENGINE_finish(ctx->engine);\n#endif\n    memset(ctx, 0, sizeof(*ctx));\n    return 1;\n}', 'void CRYPTO_clear_free(void *str, size_t num)\n{\n    if (str == NULL)\n        return;\n    if (num)\n        OPENSSL_cleanse(str, num);\n    CRYPTO_free(str);\n}', 'void CRYPTO_free(void *str)\n{\n#ifndef OPENSSL_NO_CRYPTO_MDEBUG\n    if (call_malloc_debug) {\n        CRYPTO_mem_debug_free(str, 0);\n        free(str);\n        CRYPTO_mem_debug_free(str, 1);\n    } else {\n        free(str);\n    }\n#else\n    free(str);\n#endif\n}']