X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=gost_ec_keyx.c;h=b82c6f1859e5fe5bf249565e96282c563a9f26a3;hb=7d380ba4ad7be8f47e3610ce7c3586a408d8eac7;hp=6efa3e870b06d54d22dd8e8c3c26255f9966a615;hpb=6087586263eb1351a5fa370b233b8d747d0e1f59;p=openssl-gost%2Fengine.git diff --git a/gost_ec_keyx.c b/gost_ec_keyx.c index 6efa3e8..b82c6f1 100644 --- a/gost_ec_keyx.c +++ b/gost_ec_keyx.c @@ -18,13 +18,13 @@ #include "gost_lcl.h" /* Implementation of CryptoPro VKO 34.10-2001/2012 algorithm */ -static int VKO_compute_key(unsigned char *shared_key, - const EC_POINT *pub_key, const EC_KEY *priv_key, - const unsigned char *ukm, const size_t ukm_size, - const int vko_dgst_nid) +int VKO_compute_key(unsigned char *shared_key, + const EC_POINT *pub_key, const EC_KEY *priv_key, + const unsigned char *ukm, const size_t ukm_size, + const int vko_dgst_nid) { unsigned char *databuf = NULL; - BIGNUM *UKM = NULL, *p = NULL, *order = NULL, *X = NULL, *Y = NULL; + BIGNUM *UKM = NULL, *p = NULL, *order = NULL, *X = NULL, *Y = NULL, *cofactor = NULL; const BIGNUM *key = EC_KEY_get0_private_key(priv_key); EC_POINT *pnt = EC_POINT_new(EC_KEY_get0_group(priv_key)); BN_CTX *ctx = BN_CTX_new(); @@ -48,9 +48,12 @@ static int VKO_compute_key(unsigned char *shared_key, UKM = hashsum2bn(ukm, ukm_size); p = BN_CTX_get(ctx); order = BN_CTX_get(ctx); + cofactor = BN_CTX_get(ctx); X = BN_CTX_get(ctx); Y = BN_CTX_get(ctx); EC_GROUP_get_order(EC_KEY_get0_group(priv_key), order, ctx); + EC_GROUP_get_cofactor(EC_KEY_get0_group(priv_key), cofactor, ctx); + BN_mod_mul(UKM, UKM, cofactor, order, ctx); BN_mod_mul(p, key, UKM, order, ctx); if (!EC_POINT_mul(EC_KEY_get0_group(priv_key), pnt, NULL, pub_key, p, ctx)) { GOSTerr(GOST_F_VKO_COMPUTE_KEY, GOST_R_ERROR_POINT_MUL);