diff options
author | Mark Fedorov <mark.fedorov@cloudbear.ru> | 2022-08-11 12:27:11 +0000 |
---|---|---|
committer | Dmitry Belyavskiy <beldmit@users.noreply.github.com> | 2022-08-11 17:48:01 +0200 |
commit | bd6c4f8c5c8a087ce0ea65c3dc5ee38b38b8802c (patch) | |
tree | 94968c628962a3cbe2e8ab8133ef3817d177981d | |
parent | e19c3e04fddc64c30535eb042dbf948fc5687398 (diff) | |
download | gost-engine-bd6c4f8c5c8a087ce0ea65c3dc5ee38b38b8802c.zip gost-engine-bd6c4f8c5c8a087ce0ea65c3dc5ee38b38b8802c.tar.gz gost-engine-bd6c4f8c5c8a087ce0ea65c3dc5ee38b38b8802c.tar.bz2 |
Add magma-ecb mode. Fixes #410
-rw-r--r-- | gost_crypt.c | 43 | ||||
-rw-r--r-- | gost_eng.c | 1 | ||||
-rw-r--r-- | gost_lcl.h | 1 | ||||
-rw-r--r-- | tcl_tests/engine.try | 4 | ||||
-rw-r--r-- | test/00-engine.t | 2 |
5 files changed, 45 insertions, 6 deletions
diff --git a/gost_crypt.c b/gost_crypt.c index 6d68f62..0aa2ecf 100644 --- a/gost_crypt.c +++ b/gost_crypt.c @@ -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) @@ -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, @@ -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; diff --git a/tcl_tests/engine.try b/tcl_tests/engine.try index f7ef659..9dcdad7 100644 --- a/tcl_tests/engine.try +++ b/tcl_tests/engine.try @@ -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"} } diff --git a/test/00-engine.t b/test/00-engine.t index 9f37555..c61cbcb 100644 --- a/test/00-engine.t +++ b/test/00-engine.t @@ -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 } |