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