Convert Gost 28147-89 cipher to use 64-bit modes helper functions.

Signed-off-by: Dmitry Baryshkov <dbarysh...@gmail.com>
---
 src/lib/libcrypto/gost/gost2814789.c | 121 ++-------------------------
 1 file changed, 9 insertions(+), 112 deletions(-)

diff --git a/src/lib/libcrypto/gost/gost2814789.c 
b/src/lib/libcrypto/gost/gost2814789.c
index e285413ed460..bbd578ef7010 100644
--- a/src/lib/libcrypto/gost/gost2814789.c
+++ b/src/lib/libcrypto/gost/gost2814789.c
@@ -56,6 +56,7 @@
 #ifndef OPENSSL_NO_GOST
 #include <openssl/objects.h>
 #include <openssl/gost.h>
+#include <openssl/modes.h>
 
 #include "gost_locl.h"
 
@@ -181,15 +182,17 @@ Gost2814789_ecb_encrypt(const unsigned char *in, unsigned 
char *out,
 }
 
 static inline void
-Gost2814789_encrypt_mesh(unsigned char *iv, GOST2814789_KEY *key)
+Gost2814789_encrypt_mesh(const unsigned char *in, unsigned char *out, 
GOST2814789_KEY *key)
 {
        if (key->key_meshing && key->count == 1024) {
                Gost2814789_cryptopro_key_mesh(key);
-               Gost2814789_encrypt(iv, iv, key);
-               key->count = 0;
+               Gost2814789_encrypt(in, out, key);
+               Gost2814789_encrypt(out, out, key);
+               key->count = 8;
+       } else {
+               Gost2814789_encrypt(in, out, key);
+               key->count += 8;
        }
-       Gost2814789_encrypt(iv, iv, key);
-       key->count += 8;
 }
 
 static inline void
@@ -209,113 +212,7 @@ Gost2814789_cfb64_encrypt(const unsigned char *in, 
unsigned char *out,
     size_t len, GOST2814789_KEY *key, unsigned char *ivec, int *num,
     const int enc)
 {
-       unsigned int n;
-       size_t l = 0;
-
-       n = *num;
-
-       if (enc) {
-#if !defined(OPENSSL_SMALL_FOOTPRINT)
-               if (8 % sizeof(size_t) == 0) do { /* always true actually */
-                       while (n && len) {
-                               *(out++) = ivec[n] ^= *(in++);
-                               --len;
-                               n = (n + 1) % 8;
-                       }
-#ifdef __STRICT_ALIGNMENT
-                       if (((size_t)in | (size_t)out | (size_t)ivec) %
-                           sizeof(size_t) != 0)
-                               break;
-#endif
-                       while (len >= 8) {
-                               Gost2814789_encrypt_mesh(ivec, key);
-                               for (; n < 8; n += sizeof(size_t)) {
-                                       *(size_t*)(out + n) =
-                                       *(size_t*)(ivec + n) ^=
-                                           *(size_t*)(in + n);
-                               }
-                               len -= 8;
-                               out += 8;
-                               in  += 8;
-                               n = 0;
-                       }
-                       if (len) {
-                               Gost2814789_encrypt_mesh(ivec, key);
-                               while (len--) {
-                                       out[n] = ivec[n] ^= in[n];
-                                       ++n;
-                               }
-                       }
-                       *num = n;
-                       return;
-               } while (0);
-               /* the rest would be commonly eliminated by x86* compiler */
-#endif
-               while (l<len) {
-                       if (n == 0) {
-                               Gost2814789_encrypt_mesh(ivec, key);
-                       }
-                       out[l] = ivec[n] ^= in[l];
-                       ++l;
-                       n = (n + 1) % 8;
-               }
-               *num = n;
-       } else {
-#if !defined(OPENSSL_SMALL_FOOTPRINT)
-               if (8 % sizeof(size_t) == 0) do { /* always true actually */
-                       while (n && len) {
-                               unsigned char c;
-
-                               *(out++) = ivec[n] ^ (c = *(in++));
-                               ivec[n] = c;
-                               --len;
-                               n = (n + 1) % 8;
-                       }
-#ifdef __STRICT_ALIGNMENT
-                       if (((size_t)in | (size_t)out | (size_t)ivec) %
-                           sizeof(size_t) != 0)
-                               break;
-#endif
-                       while (len >= 8) {
-                               Gost2814789_encrypt_mesh(ivec, key);
-                               for (; n < 8; n += sizeof(size_t)) {
-                                       size_t t = *(size_t*)(in + n);
-                                       *(size_t*)(out + n) =
-                                           *(size_t*)(ivec + n) ^ t;
-                                       *(size_t*)(ivec + n) = t;
-                               }
-                               len -= 8;
-                               out += 8;
-                               in  += 8;
-                               n = 0;
-                       }
-                       if (len) {
-                               Gost2814789_encrypt_mesh(ivec, key);
-                               while (len--) {
-                                       unsigned char c;
-
-                                       out[n] = ivec[n] ^ (c = in[n]);
-                                       ivec[n] = c;
-                                       ++n;
-                               }
-                       }
-                       *num = n;
-                       return;
-               } while (0);
-               /* the rest would be commonly eliminated by x86* compiler */
-#endif
-               while (l < len) {
-                       unsigned char c;
-
-                       if (n == 0) {
-                               Gost2814789_encrypt_mesh(ivec, key);
-                       }
-                       out[l] = ivec[n] ^ (c = in[l]); ivec[n] = c;
-                       ++l;
-                       n = (n + 1) % 8;
-               }
-               *num = n;
-       }
+       CRYPTO_cfb64_encrypt(in, out, len, key, ivec, num, enc, (block64_f) 
Gost2814789_encrypt_mesh);
 }
 
 static inline void
-- 
2.27.0

Reply via email to