Skip to content

Commit bd6c4f8

Browse files
marcfedorowbeldmit
authored andcommitted
Add magma-ecb mode. Fixes #410
1 parent e19c3e0 commit bd6c4f8

5 files changed

Lines changed: 45 additions & 6 deletions

File tree

gost_crypt.c

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ static int magma_cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key,
5454
static int magma_cipher_init_ctr_acpkm_omac(EVP_CIPHER_CTX *ctx, const unsigned char *key,
5555
const unsigned char *iv, int enc);
5656
/* Handles block of data in CBC mode */
57+
static int magma_cipher_do_ecb(EVP_CIPHER_CTX *ctx, unsigned char *out,
58+
const unsigned char *in, size_t inl);
5759
static int magma_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
5860
const unsigned char *in, size_t inl);
5961
static int magma_cipher_do_ctr(EVP_CIPHER_CTX *ctx, unsigned char *out,
@@ -187,8 +189,7 @@ GOST_cipher Gost28147_89_cnt_12_cipher = {
187189
static GOST_cipher magma_template_cipher = {
188190
.block_size = 8,
189191
.key_len = 32,
190-
.iv_len = 8,
191-
.flags = EVP_CIPH_CUSTOM_IV |
192+
.flags =
192193
EVP_CIPH_RAND_KEY |
193194
EVP_CIPH_ALWAYS_CALL_INIT,
194195
.cleanup = gost_cipher_cleanup,
@@ -205,6 +206,7 @@ GOST_cipher magma_ctr_cipher = {
205206
.block_size = 1,
206207
.iv_len = 4,
207208
.flags = EVP_CIPH_CTR_MODE |
209+
EVP_CIPH_CUSTOM_IV |
208210
EVP_CIPH_NO_PADDING,
209211
.init = magma_cipher_init,
210212
};
@@ -215,6 +217,7 @@ GOST_cipher magma_ctr_acpkm_cipher = {
215217
.block_size = 1,
216218
.iv_len = 4,
217219
.flags = EVP_CIPH_CTR_MODE |
220+
EVP_CIPH_CUSTOM_IV |
218221
EVP_CIPH_NO_PADDING,
219222
.init = magma_cipher_init,
220223
};
@@ -225,6 +228,7 @@ GOST_cipher magma_ctr_acpkm_omac_cipher = {
225228
.block_size = 1,
226229
.iv_len = 4,
227230
.flags = EVP_CIPH_CTR_MODE |
231+
EVP_CIPH_CUSTOM_IV |
228232
EVP_CIPH_NO_PADDING |
229233
EVP_CIPH_CUSTOM_COPY |
230234
EVP_CIPH_FLAG_CUSTOM_CIPHER |
@@ -234,10 +238,20 @@ GOST_cipher magma_ctr_acpkm_omac_cipher = {
234238
.ctrl = magma_cipher_ctl_acpkm_omac,
235239
};
236240

241+
GOST_cipher magma_ecb_cipher = {
242+
.nid = NID_magma_ecb,
243+
.template = &magma_template_cipher,
244+
.flags = EVP_CIPH_ECB_MODE,
245+
.init = magma_cipher_init,
246+
.do_cipher = magma_cipher_do_ecb,
247+
};
248+
237249
GOST_cipher magma_cbc_cipher = {
238250
.nid = NID_magma_cbc,
239251
.template = &gost_template_cipher,
240-
.flags = EVP_CIPH_CBC_MODE,
252+
.iv_len = 8,
253+
.flags = EVP_CIPH_CBC_MODE |
254+
EVP_CIPH_CUSTOM_IV,
241255
.init = magma_cipher_init,
242256
.do_cipher = magma_cipher_do_cbc,
243257
};
@@ -592,6 +606,29 @@ static int gost_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
592606
return 1;
593607
}
594608

609+
/* MAGMA encryption in ECB mode */
610+
static int magma_cipher_do_ecb(EVP_CIPHER_CTX *ctx, unsigned char *out,
611+
const unsigned char *in, size_t inl)
612+
{
613+
struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_get_cipher_data(ctx);
614+
if (EVP_CIPHER_CTX_encrypting(ctx)) {
615+
while (inl > 0) {
616+
magmacrypt(&(c->cctx), in, out);
617+
out += 8;
618+
in += 8;
619+
inl -= 8;
620+
}
621+
} else {
622+
while (inl > 0) {
623+
magmadecrypt(&(c->cctx), in, out);
624+
out += 8;
625+
in += 8;
626+
inl -= 8;
627+
}
628+
}
629+
return 1;
630+
}
631+
595632
/* MAGMA encryption in CBC mode */
596633
static int magma_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
597634
const unsigned char *in, size_t inl)

gost_eng.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ GOST_cipher *gost_cipher_array[] = {
9292
&grasshopper_cfb_cipher,
9393
&grasshopper_ofb_cipher,
9494
&grasshopper_ctr_cipher,
95+
&magma_ecb_cipher,
9596
&magma_cbc_cipher,
9697
&magma_ctr_cipher,
9798
&magma_ctr_acpkm_cipher,

gost_lcl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ extern GOST_cipher Gost28147_89_cnt_12_cipher;
349349
extern GOST_cipher magma_ctr_cipher;
350350
extern GOST_cipher magma_ctr_acpkm_cipher;
351351
extern GOST_cipher magma_ctr_acpkm_omac_cipher;
352+
extern GOST_cipher magma_ecb_cipher;
352353
extern GOST_cipher magma_cbc_cipher;
353354
extern GOST_cipher grasshopper_ecb_cipher;
354355
extern GOST_cipher grasshopper_cbc_cipher;

tcl_tests/engine.try

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ cd $::test::dir
55
start_tests "Тесты на команду engine"
66

77
switch -exact [engine_name] {
8-
"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"}
9-
"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"}
8+
"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"}
9+
"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"}
1010
}
1111

1212

test/00-engine.t

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ if ( -f $engine . ".info") {
4040

4141
$engine_info= <<EOINF;
4242
(gost) Reference implementation of GOST engine
43-
[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]
43+
[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]
4444
EOINF
4545
}
4646

0 commit comments

Comments
 (0)