Convert Gost 28147-89 cipher to use 64-bit modes helper functions.
Signed-off-by: Dmitry Baryshkov <[email protected]>
---
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