]> wagner.pp.ru Git - openssl-gost/engine.git/commitdiff
Add magma-ecb mode. Fixes #410
authorMark Fedorov <mark.fedorov@cloudbear.ru>
Thu, 11 Aug 2022 12:27:11 +0000 (12:27 +0000)
committerDmitry Belyavskiy <beldmit@users.noreply.github.com>
Thu, 11 Aug 2022 15:48:01 +0000 (17:48 +0200)
gost_crypt.c
gost_eng.c
gost_lcl.h
tcl_tests/engine.try
test/00-engine.t

index 6d68f62ba2b9084660c351535c76fd6c85ed6804..0aa2ecf277b8066dfa9fdd5aef0c74ec1dd11d1e 100644 (file)
@@ -54,6 +54,8 @@ static int magma_cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key,
 static int magma_cipher_init_ctr_acpkm_omac(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_ecb(EVP_CIPHER_CTX *ctx, unsigned char *out,
+                               const unsigned char *in, size_t inl);
 static int magma_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
                                const unsigned char *in, size_t inl);
 static int magma_cipher_do_ctr(EVP_CIPHER_CTX *ctx, unsigned char *out,
@@ -187,8 +189,7 @@ GOST_cipher Gost28147_89_cnt_12_cipher = {
 static GOST_cipher magma_template_cipher = {
     .block_size = 8,
     .key_len = 32,
-    .iv_len = 8,
-    .flags = EVP_CIPH_CUSTOM_IV |
+    .flags =
         EVP_CIPH_RAND_KEY |
         EVP_CIPH_ALWAYS_CALL_INIT,
     .cleanup = gost_cipher_cleanup,
@@ -205,6 +206,7 @@ GOST_cipher magma_ctr_cipher = {
     .block_size = 1,
     .iv_len = 4,
     .flags = EVP_CIPH_CTR_MODE |
+        EVP_CIPH_CUSTOM_IV |
         EVP_CIPH_NO_PADDING,
     .init = magma_cipher_init,
 };
@@ -215,6 +217,7 @@ GOST_cipher magma_ctr_acpkm_cipher = {
     .block_size = 1,
     .iv_len = 4,
     .flags = EVP_CIPH_CTR_MODE |
+        EVP_CIPH_CUSTOM_IV |
         EVP_CIPH_NO_PADDING,
     .init = magma_cipher_init,
 };
@@ -225,6 +228,7 @@ GOST_cipher magma_ctr_acpkm_omac_cipher = {
     .block_size = 1,
     .iv_len = 4,
     .flags = EVP_CIPH_CTR_MODE |
+        EVP_CIPH_CUSTOM_IV |
         EVP_CIPH_NO_PADDING |
         EVP_CIPH_CUSTOM_COPY |
         EVP_CIPH_FLAG_CUSTOM_CIPHER |
@@ -234,10 +238,20 @@ GOST_cipher magma_ctr_acpkm_omac_cipher = {
     .ctrl = magma_cipher_ctl_acpkm_omac,
 };
 
+GOST_cipher magma_ecb_cipher = {
+    .nid = NID_magma_ecb,
+    .template = &magma_template_cipher,
+    .flags = EVP_CIPH_ECB_MODE,
+    .init = magma_cipher_init,
+    .do_cipher = magma_cipher_do_ecb,
+};
+
 GOST_cipher magma_cbc_cipher = {
     .nid = NID_magma_cbc,
     .template = &gost_template_cipher,
-    .flags = EVP_CIPH_CBC_MODE,
+    .iv_len = 8,
+    .flags = EVP_CIPH_CBC_MODE |
+        EVP_CIPH_CUSTOM_IV,
     .init = magma_cipher_init,
     .do_cipher = magma_cipher_do_cbc,
 };
@@ -592,6 +606,29 @@ static int gost_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
     return 1;
 }
 
+/* MAGMA encryption in ECB mode */
+static int magma_cipher_do_ecb(EVP_CIPHER_CTX *ctx, unsigned char *out,
+                        const unsigned char *in, size_t inl)
+{
+    struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_get_cipher_data(ctx);
+    if (EVP_CIPHER_CTX_encrypting(ctx)) {
+        while (inl > 0) {
+            magmacrypt(&(c->cctx), in, out);
+            out += 8;
+            in += 8;
+            inl -= 8;
+        }
+    } else {
+        while (inl > 0) {
+            magmadecrypt(&(c->cctx), in, out);
+            out += 8;
+            in += 8;
+            inl -= 8;
+        }
+    }
+    return 1;
+}
+
 /* MAGMA encryption in CBC mode */
 static int magma_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
                         const unsigned char *in, size_t inl)
index 003768cfb727e49a6bd26330c5ed3ae876885f62..c128867300c7438ed8787060a9bfaafdc1c1ef6d 100644 (file)
@@ -92,6 +92,7 @@ GOST_cipher *gost_cipher_array[] = {
     &grasshopper_cfb_cipher,
     &grasshopper_ofb_cipher,
     &grasshopper_ctr_cipher,
+    &magma_ecb_cipher,
     &magma_cbc_cipher,
     &magma_ctr_cipher,
     &magma_ctr_acpkm_cipher,
index e78540465b73920444a414eb5150a50f5be66fdf..569f7cfbd3c5c38816eedb34f85cea087a83d67d 100644 (file)
@@ -349,6 +349,7 @@ extern GOST_cipher Gost28147_89_cnt_12_cipher;
 extern GOST_cipher magma_ctr_cipher;
 extern GOST_cipher magma_ctr_acpkm_cipher;
 extern GOST_cipher magma_ctr_acpkm_omac_cipher;
+extern GOST_cipher magma_ecb_cipher;
 extern GOST_cipher magma_cbc_cipher;
 extern GOST_cipher grasshopper_ecb_cipher;
 extern GOST_cipher grasshopper_cbc_cipher;
index f7ef65951844555570d48f446d64d4022d6081dc..9dcdad7cc2b0326d48171635c301324f04590a7c 100644 (file)
@@ -5,8 +5,8 @@ cd $::test::dir
 start_tests "Тесты на команду engine" 
 
 switch -exact [engine_name] {
-       "ccore" {set list " \[RAND, gost89, gost89-cnt, gost89-cnt-12, gost89-cbc, id-tc26-cipher-gostr3412-2015-magma-ctracpkm, magma-ctr, magma-ofb, magma-cbc, magma-cfb, grasshopper-ecb, grasshopper-cbc, grasshopper-ofb, grasshopper-cfb, grasshopper-ctr, id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm, md_gost94, gost-mac, md_gost12_256, md_gost12_512, gost-mac-12, gost2001, id-GostR3410-2001DH, gost-mac, gost2012_256, gost2012_512, gost-mac-12\]\n"}
-       "open" {set list "(gost) Reference implementation of GOST engine\n \[gost89, gost89-cnt, gost89-cnt-12, gost89-cbc, kuznyechik-ecb, kuznyechik-cbc, kuznyechik-cfb, kuznyechik-ofb, kuznyechik-ctr, magma-cbc, magma-ctr, magma-ctr-acpkm, magma-ctr-acpkm-omac, kuznyechik-ctr-acpkm, kuznyechik-ctr-acpkm-omac, magma-kexp15, kuznyechik-kexp15, md_gost94, gost-mac, md_gost12_256, md_gost12_512, gost-mac-12, magma-mac, kuznyechik-mac, kuznyechik-ctr-acpkm-omac, gost2001, id-GostR3410-2001DH, gost-mac, gost2012_256, gost2012_512, gost-mac-12, magma-mac, kuznyechik-mac, magma-ctr-acpkm-omac, kuznyechik-ctr-acpkm-omac\]\n"}
+       "ccore" {set list " \[RAND, gost89, gost89-cnt, gost89-cnt-12, gost89-cbc, id-tc26-cipher-gostr3412-2015-magma-ctracpkm, magma-ctr, magma-ofb, magma-ecb, magma-cbc, magma-cfb, grasshopper-ecb, grasshopper-cbc, grasshopper-ofb, grasshopper-cfb, grasshopper-ctr, id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm, md_gost94, gost-mac, md_gost12_256, md_gost12_512, gost-mac-12, gost2001, id-GostR3410-2001DH, gost-mac, gost2012_256, gost2012_512, gost-mac-12\]\n"}
+       "open" {set list "(gost) Reference implementation of GOST engine\n \[gost89, gost89-cnt, gost89-cnt-12, gost89-cbc, kuznyechik-ecb, kuznyechik-cbc, kuznyechik-cfb, kuznyechik-ofb, kuznyechik-ctr, magma-ecb, magma-cbc, magma-ctr, magma-ctr-acpkm, magma-ctr-acpkm-omac, kuznyechik-ctr-acpkm, kuznyechik-ctr-acpkm-omac, magma-kexp15, kuznyechik-kexp15, md_gost94, gost-mac, md_gost12_256, md_gost12_512, gost-mac-12, magma-mac, kuznyechik-mac, kuznyechik-ctr-acpkm-omac, gost2001, id-GostR3410-2001DH, gost-mac, gost2012_256, gost2012_512, gost-mac-12, magma-mac, kuznyechik-mac, magma-ctr-acpkm-omac, kuznyechik-ctr-acpkm-omac\]\n"}
 }
 
 
index 9f37555465020f5eeadcb61a00b90fee86e634ec..c61cbcb354f7e0e965e6c6a09507edc90cc61aab 100644 (file)
@@ -40,7 +40,7 @@ if ( -f $engine . ".info") {
 
 $engine_info= <<EOINF;
 (gost) Reference implementation of GOST engine
- [gost89, gost89-cnt, gost89-cnt-12, gost89-cbc, kuznyechik-ecb, kuznyechik-cbc, kuznyechik-cfb, kuznyechik-ofb, kuznyechik-ctr, magma-cbc, magma-ctr, magma-ctr-acpkm, magma-ctr-acpkm-omac, kuznyechik-ctr-acpkm, kuznyechik-ctr-acpkm-omac, magma-kexp15, kuznyechik-kexp15, md_gost94, gost-mac, md_gost12_256, md_gost12_512, gost-mac-12, magma-mac, kuznyechik-mac, kuznyechik-ctr-acpkm-omac, gost2001, id-GostR3410-2001DH, gost-mac, gost2012_256, gost2012_512, gost-mac-12, magma-mac, kuznyechik-mac, magma-ctr-acpkm-omac, kuznyechik-ctr-acpkm-omac]
+ [gost89, gost89-cnt, gost89-cnt-12, gost89-cbc, kuznyechik-ecb, kuznyechik-cbc, kuznyechik-cfb, kuznyechik-ofb, kuznyechik-ctr, magma-ecb, magma-cbc, magma-ctr, magma-ctr-acpkm, magma-ctr-acpkm-omac, kuznyechik-ctr-acpkm, kuznyechik-ctr-acpkm-omac, magma-kexp15, kuznyechik-kexp15, md_gost94, gost-mac, md_gost12_256, md_gost12_512, gost-mac-12, magma-mac, kuznyechik-mac, kuznyechik-ctr-acpkm-omac, gost2001, id-GostR3410-2001DH, gost-mac, gost2012_256, gost2012_512, gost-mac-12, magma-mac, kuznyechik-mac, magma-ctr-acpkm-omac, kuznyechik-ctr-acpkm-omac]
 EOINF
 }