#include <openssl/err.h>
#include <openssl/evp.h>
#include "internal/evp_int.h"
+#include "evp_locl.h"
/* MAC PKEY context structure */
{
MAC_PKEY_CTX *sctx, *dctx;
- if (!pkey_mac_init(dst))
+ sctx = EVP_PKEY_CTX_get_data(src);
+ if (sctx->ctx->data == NULL)
return 0;
- sctx = EVP_PKEY_CTX_get_data(src);
- dctx = EVP_PKEY_CTX_get_data(dst);
+ dctx = OPENSSL_zalloc(sizeof(*dctx));
+ if (dctx == NULL) {
+ EVPerr(EVP_F_PKEY_MAC_COPY, ERR_R_MALLOC_FAILURE);
+ return 0;
+ }
- if (!EVP_MAC_CTX_copy(dctx->ctx, sctx->ctx))
+ EVP_PKEY_CTX_set_data(dst, dctx);
+ dst->keygen_info_count = 0;
+
+ dctx->ctx = EVP_MAC_CTX_dup(sctx->ctx);
+ if (dctx->ctx == NULL)
goto err;
+ dctx->type = sctx->type;
+
switch (dctx->type) {
case MAC_TYPE_RAW:
dctx->raw_data.md = sctx->raw_data.md;
}
return 1;
err:
- pkey_mac_cleanup (dst);
+ pkey_mac_cleanup(dst);
return 0;
}
break;
case MAC_TYPE_MAC:
{
- EVP_MAC_CTX *cmkey = EVP_MAC_CTX_new_id(nid);
+ EVP_MAC_CTX *cmkey = EVP_MAC_CTX_dup(hctx->ctx);
if (cmkey == NULL)
return 0;
- if (!EVP_MAC_CTX_copy(cmkey, hctx->ctx)) {
- EVP_MAC_CTX_free(cmkey);
- return 0;
- }
EVP_PKEY_assign(pkey, nid, cmkey);
}
break;
case MAC_TYPE_RAW:
hctx->raw_data.md = p2;
break;
- case MAC_TYPE_MAC:
- if (ctx->pkey != NULL
- && !EVP_MAC_CTX_copy(hctx->ctx,
- (EVP_MAC_CTX *)ctx->pkey->pkey.ptr))
- return 0;
- if (!EVP_MAC_init(hctx->ctx))
- return 0;
+ case MAC_TYPE_MAC: {
+ EVP_MAC_CTX *new_mac_ctx;
+
+ if (ctx->pkey == NULL)
+ return 0;
+ new_mac_ctx = EVP_MAC_CTX_dup((EVP_MAC_CTX *)ctx->pkey
+ ->pkey.ptr);
+ if (new_mac_ctx == NULL)
+ return 0;
+ EVP_MAC_CTX_free(hctx->ctx);
+ hctx->ctx = new_mac_ctx;
+ }
break;
default:
/* This should be dead code */