From 28c0663468d3b8cd1805a9aa78f1471002ba34f0 Mon Sep 17 00:00:00 2001
From: Nikolay Morozov <nmorozoff77@yandex.ru>
Date: Thu, 26 Dec 2019 09:17:06 +0300
Subject: [PATCH] Remove unset local buffer meshing. This removes valgrind
 errors.

---
 gost89.c     | 9 ++++++---
 gost_crypt.c | 5 ++---
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/gost89.c b/gost89.c
index c670bb6..593bc23 100644
--- a/gost89.c
+++ b/gost89.c
@@ -621,15 +621,18 @@ int gost_mac_iv(gost_ctx * ctx, int mac_len, const unsigned char *iv,
 /* Implements key meshing algorithm by modifing ctx and IV in place */
 void cryptopro_key_meshing(gost_ctx * ctx, unsigned char *iv)
 {
-    unsigned char newkey[32], newiv[8];
+    unsigned char newkey[32];
     /* Set static keymeshing key */
     /* "Decrypt" key with keymeshing key */
     gost_dec(ctx, CryptoProKeyMeshingKey, newkey, 4);
     /* set new key */
     gost_key(ctx, newkey);
     /* Encrypt iv with new key */
-    gostcrypt(ctx, iv, newiv);
-    memcpy(iv, newiv, 8);
+    if (iv != NULL ) {
+        unsigned char newiv[8];
+        gostcrypt(ctx, iv, newiv);
+        memcpy(iv, newiv, 8);
+    }
 }
 
 void acpkm_magma_key_meshing(gost_ctx * ctx)
diff --git a/gost_crypt.c b/gost_crypt.c
index 16fb661..7e733df 100644
--- a/gost_crypt.c
+++ b/gost_crypt.c
@@ -1071,15 +1071,14 @@ static int gost_imit_init_cp_12(EVP_MD_CTX *ctx)
 static void mac_block_mesh(struct ossl_gost_imit_ctx *c,
                            const unsigned char *data)
 {
-    unsigned char buffer[8];
     /*
-     * We are using local buffer for iv because CryptoPro doesn't interpret
+     * We are using NULL for iv because CryptoPro doesn't interpret
      * internal state of MAC algorithm as iv during keymeshing (but does
      * initialize internal state from iv in key transport
      */
     assert(c->count % 8 == 0 && c->count <= 1024);
     if (c->key_meshing && c->count == 1024) {
-        cryptopro_key_meshing(&(c->cctx), buffer);
+        cryptopro_key_meshing(&(c->cctx), NULL);
     }
     mac_block(&(c->cctx), c->buffer, data);
     c->count = c->count % 1024 + 8;
-- 
2.39.5