Skip to content

Commit 806d9ee

Browse files
authored
Merge pull request gost-engine#455 from arx11/magma_ctracpkm_omac
Added support for magma-ctracpkm-omac
2 parents c44622a + eb66749 commit 806d9ee

10 files changed

Lines changed: 121 additions & 12 deletions

File tree

gost_crypt.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,7 @@ static int magma_cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key,
519519
c->key_meshing = 0;
520520
}
521521

522+
c->count = 0;
522523
return 1;
523524
}
524525

@@ -1276,10 +1277,6 @@ static int magma_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
12761277
return -1;
12771278
}
12781279

1279-
if (c->count != 0) {
1280-
return -1;
1281-
}
1282-
12831280
c->key_meshing = arg;
12841281
return 1;
12851282
}
@@ -1654,4 +1651,10 @@ static int gost_imit_cleanup(EVP_MD_CTX *ctx)
16541651
memset(EVP_MD_CTX_md_data(ctx), 0, sizeof(struct ossl_gost_imit_ctx));
16551652
return 1;
16561653
}
1654+
1655+
/* Called directly by CMAC_ACPKM_Init() */
1656+
const EVP_CIPHER *cipher_gost_magma_ctracpkm()
1657+
{
1658+
return GOST_init_cipher(&magma_ctr_acpkm_cipher);
1659+
}
16571660
/* vim: set expandtab cinoptions=\:0,l1,t0,g0,(0 sw=4 : */

gost_eng.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ GOST_digest *gost_digest_array[] = {
8080
&magma_mac_digest,
8181
&grasshopper_mac_digest,
8282
&kuznyechik_ctracpkm_omac_digest,
83+
&magma_ctracpkm_omac_digest,
8384
};
8485

8586
GOST_cipher *gost_cipher_array[] = {

gost_lcl.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,8 @@ typedef struct gost_cipher_st GOST_cipher;
342342
EVP_CIPHER *GOST_init_cipher(GOST_cipher *c);
343343
void GOST_deinit_cipher(GOST_cipher *c);
344344

345+
const EVP_CIPHER *cipher_gost_magma_ctracpkm();
346+
345347
/* ENGINE implementation data */
346348
extern GOST_cipher Gost28147_89_cipher;
347349
extern GOST_cipher Gost28147_89_cbc_cipher;
@@ -398,6 +400,7 @@ extern GOST_digest GostR3411_2012_512_digest;
398400
extern GOST_digest magma_mac_digest;
399401
extern GOST_digest grasshopper_mac_digest;
400402
extern GOST_digest kuznyechik_ctracpkm_omac_digest;
403+
extern GOST_digest magma_ctracpkm_omac_digest;
401404

402405
/* Provider implementation data */
403406
extern const OSSL_ALGORITHM GOST_prov_digests[];

gost_omac_acpkm.c

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,29 @@ static int CMAC_ACPKM_Init(CMAC_ACPKM_CTX *ctx, const void *key, size_t keylen,
134134
}
135135
/* Initialise context */
136136
if (cipher) {
137-
const EVP_CIPHER *acpkm;
137+
const EVP_CIPHER *acpkm = NULL;
138138

139139
if (!EVP_EncryptInit_ex(ctx->cctx, cipher, impl, NULL, NULL))
140140
return 0;
141-
if (!EVP_CIPHER_is_a(cipher, SN_grasshopper_cbc))
141+
/* Unfortunately, EVP_CIPHER_is_a is bugged for an engine, EVP_CIPHER_nid is bugged for a provider. */
142+
if (EVP_CIPHER_nid(cipher) == NID_undef) {
143+
/* Looks like a provider */
144+
if (EVP_CIPHER_is_a(cipher, SN_magma_cbc))
145+
acpkm = cipher_gost_magma_ctracpkm();
146+
else if (EVP_CIPHER_is_a(cipher, SN_grasshopper_cbc))
147+
acpkm = cipher_gost_grasshopper_ctracpkm();
148+
}
149+
else {
150+
/* Looks like an engine */
151+
if (EVP_CIPHER_nid(cipher) == NID_magma_cbc)
152+
acpkm = cipher_gost_magma_ctracpkm();
153+
else if (EVP_CIPHER_nid(cipher) == NID_grasshopper_cbc)
154+
acpkm = cipher_gost_grasshopper_ctracpkm();
155+
}
156+
157+
if (acpkm == NULL)
142158
return 0;
143-
acpkm = cipher_gost_grasshopper_ctracpkm();
159+
144160
if (!EVP_EncryptInit_ex(ctx->actx, acpkm, impl, NULL, NULL))
145161
return 0;
146162
}
@@ -319,6 +335,9 @@ static int omac_acpkm_init(EVP_MD_CTX *ctx, const char *cipher_name)
319335
case NID_grasshopper_cbc:
320336
c->dgst_size = 16;
321337
break;
338+
case NID_magma_cbc:
339+
c->dgst_size = 8;
340+
break;
322341
}
323342

324343
return 1;
@@ -329,6 +348,11 @@ static int grasshopper_omac_acpkm_init(EVP_MD_CTX *ctx)
329348
return omac_acpkm_init(ctx, SN_grasshopper_cbc);
330349
}
331350

351+
static int magma_omac_acpkm_init(EVP_MD_CTX *ctx)
352+
{
353+
return omac_acpkm_init(ctx, SN_magma_cbc);
354+
}
355+
332356
static int omac_acpkm_imit_update(EVP_MD_CTX *ctx, const void *data,
333357
size_t count)
334358
{
@@ -432,6 +456,9 @@ int omac_acpkm_imit_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr)
432456
if (EVP_MD_is_a(md, SN_grasshopper_mac)
433457
|| EVP_MD_is_a(md, SN_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac))
434458
c->cipher_name = SN_grasshopper_cbc;
459+
else if (EVP_MD_is_a(md, SN_magma_mac)
460+
|| EVP_MD_is_a(md, SN_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac))
461+
c->cipher_name = SN_magma_cbc;
435462
}
436463
if ((cipher =
437464
(EVP_CIPHER *)EVP_get_cipherbyname(c->cipher_name)) == NULL
@@ -468,9 +495,13 @@ int omac_acpkm_imit_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr)
468495
return -1;
469496
c->cmac_ctx->section_size = arg;
470497
if (ptr && *(int *)ptr) {
498+
const EVP_CIPHER *cipher;
499+
if ((cipher = EVP_CIPHER_CTX_cipher(c->cmac_ctx->actx)) == NULL) {
500+
return 0;
501+
}
502+
471503
/* Set parameter T */
472-
if (EVP_CIPHER_get0_provider(EVP_CIPHER_CTX_cipher(c->cmac_ctx->actx))
473-
== NULL) {
504+
if (EVP_CIPHER_get0_provider(cipher) == NULL) {
474505
if (!EVP_CIPHER_CTX_ctrl(c->cmac_ctx->actx, EVP_CTRL_KEY_MESH,
475506
*(int *)ptr, NULL))
476507
return 0;
@@ -527,3 +558,17 @@ GOST_digest kuznyechik_ctracpkm_omac_digest = {
527558
.cleanup = omac_acpkm_imit_cleanup,
528559
.ctrl = omac_acpkm_imit_ctrl,
529560
};
561+
562+
GOST_digest magma_ctracpkm_omac_digest = {
563+
.nid = NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac,
564+
.result_size = 8,
565+
.input_blocksize = 8,
566+
.app_datasize = sizeof(OMAC_ACPKM_CTX),
567+
.flags = EVP_MD_FLAG_XOF,
568+
.init = magma_omac_acpkm_init,
569+
.update = omac_acpkm_imit_update,
570+
.final = omac_acpkm_imit_final,
571+
.copy = omac_acpkm_imit_copy,
572+
.cleanup = omac_acpkm_imit_cleanup,
573+
.ctrl = omac_acpkm_imit_ctrl,
574+
};

gost_pmeth.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,6 +1131,7 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags)
11311131
EVP_PKEY_meth_set_copy(*pmeth, pkey_gost_mac_copy);
11321132
return 1;
11331133
case NID_magma_mac:
1134+
case NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac: /* FIXME beldmit */
11341135
EVP_PKEY_meth_set_ctrl(*pmeth, pkey_gost_magma_mac_ctrl,
11351136
pkey_gost_magma_mac_ctrl_str);
11361137
EVP_PKEY_meth_set_signctx(*pmeth, pkey_gost_magma_mac_signctx_init,

gost_prov_mac.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,8 @@ static int mac_set_ctx_params(void *mctx, const OSSL_PARAM params[])
282282
#define gost_mac_12_digest Gost28147_89_mac_12_digest
283283
#define id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac_digest \
284284
kuznyechik_ctracpkm_omac_digest
285+
#define id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac_digest \
286+
magma_ctracpkm_omac_digest
285287

286288
typedef void (*fptr_t)(void);
287289
#define MAKE_FUNCTIONS(name, macsize) \
@@ -331,6 +333,7 @@ MAKE_FUNCTIONS(gost_mac_12, 4);
331333
MAKE_FUNCTIONS(magma_mac, 8);
332334
MAKE_FUNCTIONS(grasshopper_mac, 16);
333335
MAKE_FUNCTIONS(id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac, 16);
336+
MAKE_FUNCTIONS(id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac, 8);
334337

335338
/* The OSSL_ALGORITHM for the provider's operation query function */
336339
const OSSL_ALGORITHM GOST_prov_macs[] = {
@@ -342,6 +345,9 @@ const OSSL_ALGORITHM GOST_prov_macs[] = {
342345
{ SN_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac
343346
":1.2.643.7.1.1.5.2.2", NULL,
344347
id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac_functions },
348+
{ SN_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac
349+
":1.2.643.7.1.1.5.1.2", NULL,
350+
id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac_functions },
345351
{ NULL , NULL, NULL }
346352
};
347353

@@ -351,7 +357,8 @@ void GOST_prov_deinit_mac_digests(void) {
351357
&Gost28147_89_mac_12_digest,
352358
&magma_mac_digest,
353359
&grasshopper_mac_digest,
354-
&kuznyechik_ctracpkm_omac_digest
360+
&kuznyechik_ctracpkm_omac_digest,
361+
&magma_ctracpkm_omac_digest
355362
};
356363
size_t i;
357364
#define elems(l) (sizeof(l) / sizeof(l[0]))

tcl_tests/engine.try

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ start_tests "Тесты на команду engine"
66

77
switch -exact [engine_name] {
88
"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, kuznyechik-mgm, magma-cbc, magma-ctr, magma-ctr-acpkm, magma-ctr-acpkm-omac, magma-mgm, 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"}
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, kuznyechik-mgm, magma-cbc, magma-ctr, magma-ctr-acpkm, magma-ctr-acpkm-omac, magma-mgm, 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, magma-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-ecb, kuznyechik-mgm, magma-cbc, magma-ctr, magma-ctr-acpkm, magma-ctr-acpkm-omac, magma-mgm, 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, kuznyechik-mgm, magma-cbc, magma-ctr, magma-ctr-acpkm, magma-ctr-acpkm-omac, magma-mgm, 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, magma-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

test_context.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ static struct testcase_digest {
333333
{ SN_magma_mac, 1 },
334334
{ SN_grasshopper_mac, 1 },
335335
{ SN_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac, 1 },
336+
{ SN_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac, 1 },
336337
{ 0 },
337338
};
338339
int main(int argc, char **argv)

test_digest.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,30 @@ static const char MAC_omac[] = { 0x33,0x6f,0x4d,0x29,0x60,0x59,0xfb,0xe3 };
108108
*/
109109
static const char MAC_magma_omac[] = { 0x15,0x4e,0x72,0x10 };
110110

111+
/*
112+
* OMAC-ACPKM test vector from R 1323565.1.017-2018 A.3.1
113+
*/
114+
static const char P_omac_acpkm01[] = {
115+
0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x00,0xFF,0xEE,0xDD,0xCC,
116+
};
117+
118+
static const char MAC_omac_acpkm01[] = {
119+
0xA0,0x54,0x0E,0x37,0x30,0xAC,0xBC,0xF3,
120+
};
121+
122+
/*
123+
* OMAC-ACPKM test vector from R 1323565.1.017-2018 A.3.2
124+
*/
125+
static const char P_omac_acpkm02[] = {
126+
0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x00,0xFF,0xEE,0xDD,0xCC,0xBB,0xAA,0x99,0x88,
127+
0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xEE,0xFF,0x0A,
128+
0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,
129+
};
130+
131+
static const char MAC_omac_acpkm02[] = {
132+
0x34,0x00,0x8D,0xAD,0x54,0x96,0xBB,0x8E,
133+
};
134+
111135
/*
112136
* OMAC-ACPKM test vector from R 1323565.1.017-2018 A.4.1
113137
*/
@@ -277,6 +301,30 @@ static const struct hash_testvec testvecs[] = {
277301
.outsize = 64 / 8,
278302
.truncate = sizeof(MAC_magma_omac),
279303
},
304+
{
305+
.algname = SN_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac,
306+
.name = "M from R 1323565.1.017-2018 (A.3.1)",
307+
.plaintext = P_omac_acpkm01,
308+
.psize = sizeof(P_omac_acpkm01),
309+
.key = K,
310+
.key_size = sizeof(K),
311+
.acpkm = 128 / 8,
312+
.acpkm_t = 640 / 8,
313+
.digest = MAC_omac_acpkm01,
314+
.outsize = sizeof(MAC_omac_acpkm01),
315+
},
316+
{
317+
.algname = SN_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac,
318+
.name = "M from R 1323565.1.017-2018 (A.3.2)",
319+
.plaintext = P_omac_acpkm02,
320+
.psize = sizeof(P_omac_acpkm02),
321+
.key = K,
322+
.key_size = sizeof(K),
323+
.acpkm = 128 / 8,
324+
.acpkm_t = 640 / 8,
325+
.digest = MAC_omac_acpkm02,
326+
.outsize = sizeof(MAC_omac_acpkm02),
327+
},
280328
{
281329
.algname = SN_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac,
282330
.name = "M from R 1323565.1.017-2018 (A.4.1)",

0 commit comments

Comments
 (0)