int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx)
{
    if (!hmac_ctx_alloc_mds(dctx))
        goto err;
    if (!EVP_MD_CTX_copy_ex(dctx->i_ctx, sctx->i_ctx))
        goto err;
    if (!EVP_MD_CTX_copy_ex(dctx->o_ctx, sctx->o_ctx))
        goto err;
    if (!EVP_MD_CTX_copy_ex(dctx->md_ctx, sctx->md_ctx))
        goto err;
    memcpy(dctx->key, sctx->key, HMAC_MAX_MD_CBLOCK_SIZE);
    dctx->key_length = sctx->key_length;
    dctx->md = sctx->md;
    return 1;
 err:
    hmac_ctx_cleanup(dctx);
    return 0;
}
['int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx)\n{\n    if (!hmac_ctx_alloc_mds(dctx))\n        goto err;\n    if (!EVP_MD_CTX_copy_ex(dctx->i_ctx, sctx->i_ctx))\n        goto err;\n    if (!EVP_MD_CTX_copy_ex(dctx->o_ctx, sctx->o_ctx))\n        goto err;\n    if (!EVP_MD_CTX_copy_ex(dctx->md_ctx, sctx->md_ctx))\n        goto err;\n    memcpy(dctx->key, sctx->key, HMAC_MAX_MD_CBLOCK_SIZE);\n    dctx->key_length = sctx->key_length;\n    dctx->md = sctx->md;\n    return 1;\n err:\n    hmac_ctx_cleanup(dctx);\n    return 0;\n}']