aboutsummaryrefslogtreecommitdiff
path: root/gost_pmeth.c
diff options
context:
space:
mode:
authorDmitry Belyavskiy <beldmit@gmail.com>2020-05-10 15:14:48 +0300
committerDmitry Belyavskiy <beldmit@gmail.com>2020-05-10 17:05:15 +0300
commit9cf021b8f3cc7b0f49ecd2f165bd1864903c90d0 (patch)
treed7b377bcfe638510f20e37574e9bbc559aab324a /gost_pmeth.c
parentfd5447e7fca18868178b225de76b49bf3dce90c6 (diff)
downloadgost-engine-9cf021b8f3cc7b0f49ecd2f165bd1864903c90d0.zip
gost-engine-9cf021b8f3cc7b0f49ecd2f165bd1864903c90d0.tar.gz
gost-engine-9cf021b8f3cc7b0f49ecd2f165bd1864903c90d0.tar.bz2
GOST CMS encryption implementation.
Diffstat (limited to 'gost_pmeth.c')
-rw-r--r--gost_pmeth.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/gost_pmeth.c b/gost_pmeth.c
index 3f60210..f4a830d 100644
--- a/gost_pmeth.c
+++ b/gost_pmeth.c
@@ -72,9 +72,7 @@ static int pkey_gost_copy(EVP_PKEY_CTX *dst, ossl3_const EVP_PKEY_CTX *src)
return 0;
*dst_data = *src_data;
- if (src_data->shared_ukm) {
- dst_data->shared_ukm = NULL;
- }
+
return 1;
}
@@ -84,7 +82,6 @@ static void pkey_gost_cleanup(EVP_PKEY_CTX *ctx)
struct gost_pmeth_data *data = EVP_PKEY_CTX_get_data(ctx);
if (!data)
return;
- OPENSSL_free(data->shared_ukm);
OPENSSL_free(data);
}
@@ -152,16 +149,25 @@ static int pkey_gost_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
return 1;
case EVP_PKEY_CTRL_SET_IV:
OPENSSL_assert(p2 != NULL);
- pctx->shared_ukm = OPENSSL_malloc((int)p1);
- if (pctx->shared_ukm == NULL) {
- GOSTerr(GOST_F_PKEY_GOST_CTRL, ERR_R_MALLOC_FAILURE);
- return 0;
- }
memcpy(pctx->shared_ukm, p2, (int)p1);
pctx->shared_ukm_size = p1;
return 1;
- case EVP_PKEY_CTRL_CIPHER:
- pctx->cipher_nid = p1;
+ case EVP_PKEY_CTRL_CIPHER:
+ switch (p1) {
+ case NID_magma_ctr_acpkm:
+ case NID_magma_ctr_acpkm_omac:
+ case NID_magma_ctr:
+ pctx->cipher_nid = NID_magma_ctr;
+ return 1;
+ case NID_kuznyechik_ctr_acpkm:
+ case NID_kuznyechik_ctr_acpkm_omac:
+ case NID_kuznyechik_ctr:
+ pctx->cipher_nid = NID_kuznyechik_ctr;
+ return 1;
+ default:
+ pctx->cipher_nid = p1;
+ return 1;
+ }
return 1;
case EVP_PKEY_CTRL_PEER_KEY:
if (p1 == 0 || p1 == 1) /* call from EVP_PKEY_derive_set_peer */