X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=gost_eng.c;h=d03e813948e78fe78f1927763f5debf1f10c9aab;hb=refs%2Fheads%2Fossl_patched;hp=0d7090757fa92fac8d109ccd81128083e15b73fd;hpb=6957d3487caffeb79cf90c06d006599dcad85d15;p=openssl-gost%2Fengine.git diff --git a/gost_eng.c b/gost_eng.c index 0d70907..d03e813 100644 --- a/gost_eng.c +++ b/gost_eng.c @@ -39,6 +39,7 @@ static int gost_pkey_asn1_meths(ENGINE* e, EVP_PKEY_ASN1_METHOD** ameth, const int** nids, int nid); static EVP_PKEY_METHOD* pmeth_GostR3410_2001 = NULL, + * pmeth_GostR3410_2001DH = NULL, * pmeth_GostR3410_2012_256 = NULL, * pmeth_GostR3410_2012_512 = NULL, * pmeth_Gost28147_MAC = NULL, * pmeth_Gost28147_MAC_12 = NULL, @@ -46,64 +47,22 @@ static EVP_PKEY_METHOD* pmeth_GostR3410_2001 = NULL, * pmeth_magma_mac_acpkm = NULL, * pmeth_grasshopper_mac_acpkm = NULL; static EVP_PKEY_ASN1_METHOD* ameth_GostR3410_2001 = NULL, + * ameth_GostR3410_2001DH = NULL, * ameth_GostR3410_2012_256 = NULL, * ameth_GostR3410_2012_512 = NULL, * ameth_Gost28147_MAC = NULL, * ameth_Gost28147_MAC_12 = NULL, * ameth_magma_mac = NULL, * ameth_grasshopper_mac = NULL, * ameth_magma_mac_acpkm = NULL, * ameth_grasshopper_mac_acpkm = NULL; -static struct gost_digest_minfo { - int nid; - EVP_MD *(*digest)(void); - void (*destroy)(void); - const char *sn; - const char *alias; -} gost_digest_array[] = { - { - NID_id_GostR3411_94, - digest_gost, - digest_gost_destroy, - }, - { - NID_id_Gost28147_89_MAC, - imit_gost_cpa, - imit_gost_cpa_destroy, - }, - { - NID_id_GostR3411_2012_256, - digest_gost2012_256, - digest_gost2012_256_destroy, - SN_id_GostR3411_2012_256, - "streebog256", - }, - { - NID_id_GostR3411_2012_512, - digest_gost2012_512, - digest_gost2012_512_destroy, - SN_id_GostR3411_2012_512, - "streebog512", - }, - { - NID_gost_mac_12, - imit_gost_cp_12, - imit_gost_cp_12_destroy, - }, - { - NID_magma_mac, - magma_omac, - magma_omac_destroy, - }, - { - NID_grasshopper_mac, - grasshopper_omac, - grasshopper_omac_destroy, - }, - { - NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac, - grasshopper_omac_acpkm, - grasshopper_omac_acpkm_destroy, - }, - { 0 }, +GOST_digest *gost_digest_array[] = { + &GostR3411_94_digest, + &Gost28147_89_MAC_digest, + &GostR3411_2012_256_digest, + &GostR3411_2012_512_digest, + &Gost28147_89_mac_12_digest, + &magma_mac_digest, + &grasshopper_mac_digest, + &kuznyechik_ctracpkm_omac_digest, }; GOST_cipher *gost_cipher_array[] = { @@ -116,10 +75,12 @@ GOST_cipher *gost_cipher_array[] = { &grasshopper_cfb_cipher, &grasshopper_ofb_cipher, &grasshopper_ctr_cipher, + &grasshopper_mgm_cipher, &magma_cbc_cipher, &magma_ctr_cipher, &magma_ctr_acpkm_cipher, &magma_ctr_acpkm_omac_cipher, + &magma_mgm_cipher, &grasshopper_ctr_acpkm_cipher, &grasshopper_ctr_acpkm_omac_cipher, &magma_kexp15_cipher, @@ -140,6 +101,13 @@ static struct gost_meth_minfo { "GOST2001", "GOST R 34.10-2001", }, + { + NID_id_GostR3410_2001DH, + &pmeth_GostR3410_2001DH, + &ameth_GostR3410_2001DH, + "GOST2001 DH", + "GOST R 34.10-2001 DH", + }, { NID_id_Gost28147_89_MAC, &pmeth_Gost28147_MAC, @@ -203,9 +171,9 @@ static struct gost_meth_minfo { # define OSSL_NELEM(x) (sizeof(x)/sizeof((x)[0])) #endif -/* `- 1' because of terminating zero element */ -static int known_digest_nids[OSSL_NELEM(gost_digest_array) - 1]; +static int known_digest_nids[OSSL_NELEM(gost_digest_array)]; static int known_cipher_nids[OSSL_NELEM(gost_cipher_array)]; +/* `- 1' because of terminating zero element */ static int known_meths_nids[OSSL_NELEM(gost_meth_array) - 1]; static int gost_engine_init(ENGINE* e) { @@ -217,16 +185,12 @@ static int gost_engine_finish(ENGINE* e) { } static int gost_engine_destroy(ENGINE* e) { - struct gost_digest_minfo *dinfo = gost_digest_array; - for (; dinfo->nid; dinfo++) { - if (dinfo->alias) - EVP_delete_digest_alias(dinfo->alias); - dinfo->destroy(); - } - int i; + + for (i = 0; i < OSSL_NELEM(gost_digest_array); i++) + GOST_deinit_digest(gost_digest_array[i]); for (i = 0; i < OSSL_NELEM(gost_cipher_array); i++) - GOST_deinit_cipher(gost_cipher_array[i]); + GOST_deinit_cipher(gost_cipher_array[i]); gost_param_free(); @@ -309,16 +273,12 @@ static int bind_gost(ENGINE* e, const char* id) { int i; for (i = 0; i < OSSL_NELEM(gost_cipher_array); i++) { - if (!EVP_add_cipher(GOST_init_cipher(gost_cipher_array[i]))) + if (!EVP_add_cipher(GOST_init_cipher(gost_cipher_array[i]))) goto end; } - struct gost_digest_minfo *dinfo = gost_digest_array; - for (; dinfo->nid; dinfo++) { - if (!EVP_add_digest(dinfo->digest())) - goto end; - if (dinfo->alias && - !EVP_add_digest_alias(dinfo->sn, dinfo->alias)) + for (i = 0; i < OSSL_NELEM(gost_digest_array); i++) { + if (!EVP_add_digest(GOST_init_digest(gost_digest_array[i]))) goto end; } @@ -339,20 +299,20 @@ IMPLEMENT_DYNAMIC_BIND_FN(bind_gost) static int gost_digests(ENGINE *e, const EVP_MD **digest, const int **nids, int nid) { - struct gost_digest_minfo *info = gost_digest_array; + int i; if (!digest) { int *n = known_digest_nids; *nids = n; - for (; info->nid; info++) - *n++ = info->nid; - return OSSL_NELEM(known_digest_nids); + for (i = 0; i < OSSL_NELEM(gost_digest_array); i++) + *n++ = gost_digest_array[i]->nid; + return i; } - for (; info->nid; info++) - if (nid == info->nid) { - *digest = info->digest(); + for (i = 0; i < OSSL_NELEM(gost_digest_array); i++) + if (nid == gost_digest_array[i]->nid) { + *digest = GOST_init_digest(gost_digest_array[i]); return 1; } *digest = NULL; @@ -376,8 +336,8 @@ static int gost_ciphers(ENGINE *e, const EVP_CIPHER **cipher, for (i = 0; i < OSSL_NELEM(gost_cipher_array); i++) if (nid == gost_cipher_array[i]->nid) { - *cipher = GOST_init_cipher(gost_cipher_array[i]); - return 1; + *cipher = GOST_init_cipher(gost_cipher_array[i]); + return 1; } *cipher = NULL; return 0;