X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=gost_eng.c;h=d03e813948e78fe78f1927763f5debf1f10c9aab;hb=refs%2Fheads%2Fossl_patched;hp=fb71d3b40e0cc5c4e8f31db7211c184bd8bf2d2c;hpb=ac616531eb3a22e7926fe0f01c11e1631923b261;p=openssl-gost%2Fengine.git diff --git a/gost_eng.c b/gost_eng.c index fb71d3b..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,144 +47,44 @@ 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, }; -static struct gost_cipher_minfo { - int nid; - const EVP_CIPHER *(*cipher)(void); - GOST_cipher *reg; -} gost_cipher_array[] = { - { - NID_id_Gost28147_89, - NULL, - &Gost28147_89_cipher, - }, - { - NID_gost89_cnt, - NULL, - &Gost28147_89_cnt_cipher, - }, - { - NID_gost89_cnt_12, - NULL, - &Gost28147_89_cnt_12_cipher, - }, - { - NID_gost89_cbc, - NULL, - &Gost28147_89_cbc_cipher, - }, - { - NID_grasshopper_ecb, - cipher_gost_grasshopper_ecb, - }, - { - NID_grasshopper_cbc, - cipher_gost_grasshopper_cbc, - }, - { - NID_grasshopper_cfb, - cipher_gost_grasshopper_cfb, - }, - { - NID_grasshopper_ofb, - cipher_gost_grasshopper_ofb, - }, - { - NID_grasshopper_ctr, - cipher_gost_grasshopper_ctr, - }, - { - NID_magma_cbc, - cipher_magma_cbc, - }, - { - NID_magma_ctr, - cipher_magma_ctr, - }, - { - NID_magma_ctr_acpkm, - cipher_magma_ctr_acpkm, - }, - { - NID_magma_ctr_acpkm_omac, - cipher_magma_ctr_acpkm_omac, - }, - { - NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm, - cipher_gost_grasshopper_ctracpkm, - }, - { - NID_kuznyechik_ctr_acpkm_omac, - cipher_gost_grasshopper_ctracpkm_omac, - }, - { - NID_magma_kexp15, - cipher_magma_wrap, - }, - { - NID_kuznyechik_kexp15, - cipher_kuznyechik_wrap, - }, - { 0 }, +GOST_cipher *gost_cipher_array[] = { + &Gost28147_89_cipher, + &Gost28147_89_cnt_cipher, + &Gost28147_89_cnt_12_cipher, + &Gost28147_89_cbc_cipher, + &grasshopper_ecb_cipher, + &grasshopper_cbc_cipher, + &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, + &kuznyechik_kexp15_cipher, }; static struct gost_meth_minfo { @@ -200,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, @@ -263,9 +171,9 @@ static struct gost_meth_minfo { # define OSSL_NELEM(x) (sizeof(x)/sizeof((x)[0])) #endif +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_digest_nids[OSSL_NELEM(gost_digest_array) - 1]; -static int known_cipher_nids[OSSL_NELEM(gost_cipher_array) - 1]; static int known_meths_nids[OSSL_NELEM(gost_meth_array) - 1]; static int gost_engine_init(ENGINE* e) { @@ -277,23 +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; - struct gost_cipher_minfo *cinfo = gost_cipher_array; - for (; cinfo->nid; cinfo++) { - if (cinfo->reg) - GOST_deinit_cipher(cinfo->reg); - else - EVP_CIPHER_meth_free((EVP_CIPHER *)cinfo->cipher()); - } - - //cipher_gost_grasshopper_destroy(); - //wrap_ciphers_destroy(); + 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_param_free(); @@ -374,24 +271,14 @@ static int bind_gost(ENGINE* e, const char* id) { || !ENGINE_register_pkey_meths(e)) goto end; - struct gost_cipher_minfo *cinfo = gost_cipher_array; - for (; cinfo->nid; cinfo++) { - const EVP_CIPHER *cipher; - - if (cinfo->reg) - cipher = GOST_init_cipher(cinfo->reg); - else - cipher = cinfo->cipher(); - if (!EVP_add_cipher(cipher)) + int i; + for (i = 0; i < OSSL_NELEM(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; } @@ -412,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; @@ -436,23 +323,20 @@ static int gost_digests(ENGINE *e, const EVP_MD **digest, static int gost_ciphers(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid) { - struct gost_cipher_minfo *info = gost_cipher_array; + int i; if (!cipher) { int *n = known_cipher_nids; *nids = n; - for (; info->nid; info++) - *n++ = info->nid; - return OSSL_NELEM(known_cipher_nids); + for (i = 0; i < OSSL_NELEM(gost_cipher_array); i++) + *n++ = gost_cipher_array[i]->nid; + return i; } - for (; info->nid; info++) - if (nid == info->nid) { - if (info->reg) - *cipher = GOST_init_cipher(info->reg); - else - *cipher = info->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 = NULL; @@ -532,3 +416,4 @@ void ENGINE_load_gost(void) { } #endif +/* vim: set expandtab cinoptions=\:0,l1,t0,g0,(0 sw=4 : */