X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=gost_pmeth.c;h=f4a830de7274dbb5c1ff63a82345a223218edb9a;hb=ea281d2516111f018f224409098d5a1d11e967bd;hp=b6f45436975d56783ec4f36e8fa70620d332b2f5;hpb=9f87d42a5c7815f5185d9ea6b2435c969f091eff;p=openssl-gost%2Fengine.git diff --git a/gost_pmeth.c b/gost_pmeth.c index b6f4543..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 */ @@ -177,12 +183,35 @@ static int pkey_gost_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) return -2; } -static int pkey_gost_ec_ctrl_str_256(EVP_PKEY_CTX *ctx, +static int pkey_gost_ec_ctrl_str_common(EVP_PKEY_CTX *ctx, const char *type, const char *value) { - int param_nid = 0; + if (0 == strcmp(type, ukm_ctrl_string)) { + unsigned char ukm_buf[32], *tmp = NULL; + long len = 0; + tmp = OPENSSL_hexstr2buf(value, &len); + if (tmp == NULL) + return 0; + + if (len > 32) { + OPENSSL_free(tmp); + GOSTerr(GOST_F_PKEY_GOST_EC_CTRL_STR_COMMON, GOST_R_CTRL_CALL_FAILED); + return 0; + } + memcpy(ukm_buf, tmp, len); + OPENSSL_free(tmp); + + return pkey_gost_ctrl(ctx, EVP_PKEY_CTRL_SET_IV, len, ukm_buf); + } + return -2; +} +static int pkey_gost_ec_ctrl_str_256(EVP_PKEY_CTX *ctx, + const char *type, const char *value) +{ if (strcmp(type, param_ctrl_string) == 0) { + int param_nid = 0; + if (!value) { return 0; } @@ -215,9 +244,9 @@ static int pkey_gost_ec_ctrl_str_256(EVP_PKEY_CTX *ctx, default: return 0; } - } else if ((strlen(value) == 3) - && (toupper((unsigned char)value[0]) == 'T') - && (toupper((unsigned char)value[1]) == 'C')) { + } else if ((strlen(value) == 3) + && (toupper((unsigned char)value[0]) == 'T') + && (toupper((unsigned char)value[1]) == 'C')) { switch (toupper((unsigned char)value[2])) { case 'A': param_nid = NID_id_tc26_gost_3410_2012_256_paramSetA; @@ -254,7 +283,8 @@ static int pkey_gost_ec_ctrl_str_256(EVP_PKEY_CTX *ctx, return pkey_gost_ctrl(ctx, EVP_PKEY_CTRL_GOST_PARAMSET, param_nid, NULL); } - return -2; + + return pkey_gost_ec_ctrl_str_common(ctx, type, value); } static int pkey_gost_ec_ctrl_str_512(EVP_PKEY_CTX *ctx, @@ -263,7 +293,7 @@ static int pkey_gost_ec_ctrl_str_512(EVP_PKEY_CTX *ctx, int param_nid = NID_undef; if (strcmp(type, param_ctrl_string)) - return -2; + return pkey_gost_ec_ctrl_str_common(ctx, type, value); if (!value) return 0; @@ -631,8 +661,8 @@ static int pkey_gost_mac_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) case EVP_PKEY_CTRL_DIGESTINIT: { EVP_MD_CTX *mctx = p2; - struct gost_mac_key *key; if (!data->key_set) { + struct gost_mac_key *key; EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx); if (!pkey) { GOSTerr(GOST_F_PKEY_GOST_MAC_CTRL, @@ -764,8 +794,8 @@ static int pkey_gost_omac_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2, si case EVP_PKEY_CTRL_DIGESTINIT: { EVP_MD_CTX *mctx = p2; - struct gost_mac_key *key; if (!data->key_set) { + struct gost_mac_key *key; EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx); if (!pkey) { GOSTerr(GOST_F_PKEY_GOST_OMAC_CTRL,