diff options
author | Dmitry Belyavskiy <beldmit@gmail.com> | 2019-04-04 18:45:36 +0300 |
---|---|---|
committer | Dmitry Belyavskiy <beldmit@gmail.com> | 2019-04-04 18:45:36 +0300 |
commit | 89d1db9116738da5ed5de417c63da5e8be214b4d (patch) | |
tree | 63ff3e35434b01ea753f97a93854b54fb192c4e1 | |
parent | af328b347cfbb3e4fa672b03700d70fdc8da892a (diff) | |
download | gost-engine-89d1db9116738da5ed5de417c63da5e8be214b4d.zip gost-engine-89d1db9116738da5ed5de417c63da5e8be214b4d.tar.gz gost-engine-89d1db9116738da5ed5de417c63da5e8be214b4d.tar.bz2 |
Cofactor should be taken into account in VKO
-rw-r--r-- | gost_ec_keyx.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/gost_ec_keyx.c b/gost_ec_keyx.c index 6efa3e8..cc94d67 100644 --- a/gost_ec_keyx.c +++ b/gost_ec_keyx.c @@ -24,7 +24,7 @@ static int VKO_compute_key(unsigned char *shared_key, 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); |