]> wagner.pp.ru Git - openssl-gost/engine.git/commitdiff
Avoid double-free, restore ephemeral mode self-compatibility
authorDmitry Belyavskiy <beldmit@gmail.com>
Tue, 25 Dec 2018 13:34:24 +0000 (16:34 +0300)
committerDmitry Belyavskiy <beldmit@gmail.com>
Tue, 25 Dec 2018 13:34:24 +0000 (16:34 +0300)
gost_ec_keyx.c

index 6313a6bfe50962acf93261090be9d4c8162c43b8..a95df330f2546b757566b20e02666ab99ee6267b 100644 (file)
@@ -391,6 +391,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 +438,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;