]> www.wagner.pp.ru Git - openssl-gost/engine.git/blobdiff - gost_ec_keyx.c
Merge branch 'mgm_impl' of https://github.com/gost-engine/engine into mgm_impl
[openssl-gost/engine.git] / gost_ec_keyx.c
index 6313a6bfe50962acf93261090be9d4c8162c43b8..cc94d677ed37b5bb9aa5acc4284270824bed86db 100644 (file)
@@ -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);
@@ -251,8 +254,7 @@ static int pkey_GOST_ECcp_encrypt(EVP_PKEY_CTX *pctx, unsigned char *out,
     EVP_PKEY *sec_key = EVP_PKEY_CTX_get0_peerkey(pctx);
     if (data->shared_ukm) {
         memcpy(ukm, data->shared_ukm, 8);
-    } else if (out) {
-
+    } else {
         if (RAND_bytes(ukm, 8) <= 0) {
             GOSTerr(GOST_F_PKEY_GOST_ECCP_ENCRYPT, GOST_R_RNG_ERROR);
             return 0;
@@ -391,6 +393,12 @@ static int pkey_gost2018_encrypt(EVP_PKEY_CTX *pctx, unsigned char *out,
     sec_key = EVP_PKEY_CTX_get0_peerkey(pctx);
     if (!sec_key)
     {
+      sec_key = EVP_PKEY_new();
+      if (sec_key == NULL) {
+        GOSTerr(GOST_F_PKEY_GOST2018_ENCRYPT, ERR_R_MALLOC_FAILURE );
+        goto err;
+      }
+
       if (!EVP_PKEY_assign(sec_key, EVP_PKEY_base_id(pubk), EC_KEY_new())
           || !EVP_PKEY_copy_parameters(sec_key, pubk)
           || !gost_ec_keygen(EVP_PKEY_get0(sec_key))) {
@@ -432,13 +440,12 @@ static int pkey_gost2018_encrypt(EVP_PKEY_CTX *pctx, unsigned char *out,
         goto err;
     }
 
-    EVP_PKEY_free(sec_key);
-
     if ((*out_len = i2d_PSKeyTransport_gost(pst, out ? &out : NULL)) > 0)
         ret = 1;
  err:
     if (key_is_ephemeral)
       EVP_PKEY_free(sec_key);
+
     PSKeyTransport_gost_free(pst);
     OPENSSL_free(exp_buf);
     return ret;