]> www.wagner.pp.ru Git - openssl-gost/engine.git/commitdiff
Finalized magma-cbc
authorDmitry Belyavskiy <beldmit@gmail.com>
Sat, 9 Jun 2018 11:54:30 +0000 (14:54 +0300)
committerDmitry Belyavskiy <beldmit@gmail.com>
Sat, 9 Jun 2018 11:54:30 +0000 (14:54 +0300)
gost89.c
gost_crypt.c

index 9011e1d8bc60b6cb8a85e3aeb124ec8001865a47..ccf338e29d8a3acf5e363dde47206f8a2da87ff5 100644 (file)
--- a/gost89.c
+++ b/gost89.c
@@ -453,9 +453,9 @@ void gost_key(gost_ctx * c, const byte * k)
 void magma_key(gost_ctx * c, const byte * k)
 {
     int i, j;
-    for (i = 7, j = 0; i >= 0; i--, j += 4) {
+    for (i = 0, j = 0; i < 8; i++, j += 4) {
         c->k[i] =
-            k[j] | (k[j + 1] << 8) | (k[j + 2] << 16) | ((word32) k[j + 3] <<
+            k[j+3] | (k[j + 2] << 8) | (k[j + 1] << 16) | ((word32) k[j] <<
                                                          24);
     }
 }
index 69a8f0d7df7a45bbe948bc4d491b3f6c6e15229b..27321f4db3af23e18afaf4351550f94e195774f0 100644 (file)
@@ -48,6 +48,9 @@ static int gost_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr);
 
 static int magma_cipher_init_cbc(EVP_CIPHER_CTX *ctx, const unsigned char *key,
                                 const unsigned char *iv, int enc);
+/* Handles block of data in CBC mode */
+static int magma_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
+                              const unsigned char *in, size_t inl);
 static EVP_CIPHER *_hidden_Gost28147_89_cipher = NULL;
 const EVP_CIPHER *cipher_gost(void)
 {
@@ -205,7 +208,7 @@ const EVP_CIPHER *cipher_magma_cbc(void)
             || !EVP_CIPHER_meth_set_init(_hidden_magma_cbc,
                                          magma_cipher_init_cbc)
             || !EVP_CIPHER_meth_set_do_cipher(_hidden_magma_cbc,
-                                              gost_cipher_do_cbc)
+                                              magma_cipher_do_cbc)
             || !EVP_CIPHER_meth_set_cleanup(_hidden_magma_cbc,
                                             gost_cipher_cleanup)
             || !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_magma_cbc,
@@ -428,7 +431,7 @@ static int magma_cipher_init_param(EVP_CIPHER_CTX *ctx,
 {
     struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_get_cipher_data(ctx);
     if (EVP_CIPHER_CTX_get_app_data(ctx) == NULL) {
-        if (!gost_cipher_set_param(c, paramNID))
+        if (!gost_cipher_set_param(c, NID_id_tc26_gost_28147_param_Z))
             return 0;
         EVP_CIPHER_CTX_set_app_data(ctx, EVP_CIPHER_CTX_get_cipher_data(ctx));
     }
@@ -549,7 +552,7 @@ static void gost_cnt_next(void *ctx, unsigned char *iv, unsigned char *buf)
     c->count = c->count % 1024 + 8;
 }
 
-/* GOST encryptoon in CBC mode */
+/* GOST encryption in CBC mode */
 int gost_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
                        const unsigned char *in, size_t inl)
 {
@@ -586,6 +589,51 @@ int gost_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
     return 1;
 }
 
+/* GOST encryption in CBC mode */
+int magma_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
+                       const unsigned char *in, size_t inl)
+{
+    unsigned char b[8];
+               unsigned char d[8];
+    const unsigned char *in_ptr = in;
+    unsigned char *out_ptr = out;
+    int i;
+    struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_get_cipher_data(ctx);
+    unsigned char *iv = EVP_CIPHER_CTX_iv_noconst(ctx);
+    if (EVP_CIPHER_CTX_encrypting(ctx)) {
+        while (inl > 0) {
+
+            for (i = 0; i < 8; i++) {
+                b[7-i] = iv[i] ^ in_ptr[i];
+            }
+            gostcrypt(&(c->cctx), b, d);
+
+            for (i = 0; i < 8; i++) {
+                out_ptr[7-i] = d[i];
+            }
+            memcpy(iv, out_ptr, 8);
+            out_ptr += 8;
+            in_ptr += 8;
+            inl -= 8;
+        }
+    } else {
+        while (inl > 0) {
+            for (i = 0; i < 8; i++) {
+                d[7-i] = in_ptr[i];
+            }
+            gostdecrypt(&(c->cctx), d, b);
+            for (i = 0; i < 8; i++) {
+                out_ptr[i] = iv[i] ^ b[7-i];
+            }
+            memcpy(iv, in_ptr, 8);
+            out_ptr += 8;
+            in_ptr += 8;
+            inl -= 8;
+        }
+    }
+    return 1;
+}
+
 /* GOST encryption in CFB mode */
 int gost_cipher_do_cfb(EVP_CIPHER_CTX *ctx, unsigned char *out,
                        const unsigned char *in, size_t inl)