From: Vitaly Chikunov Date: Sat, 2 May 2020 19:53:01 +0000 (+0300) Subject: gost_eng: Make it use arrays instead of repeatable code X-Git-Tag: v3.0.0~182 X-Git-Url: http://www.wagner.pp.ru/gitweb/?a=commitdiff_plain;h=5d867de1d86990c192cae15e681af87741739cf8;p=openssl-gost%2Fengine.git gost_eng: Make it use arrays instead of repeatable code --- diff --git a/gost_eng.c b/gost_eng.c index ad6d62b..8257072 100644 --- a/gost_eng.c +++ b/gost_eng.c @@ -1,11 +1,12 @@ /********************************************************************** * gost_eng.c * + * Main file of GOST engine * + * * * Copyright (c) 2005-2006 Cryptocom LTD * - * This file is distributed under the same license as OpenSSL * + * Copyright (c) 2020 Chikunov Vitaly * + * * + * This file is distributed under the same license as OpenSSL * * * - * Main file of GOST engine * - * for OpenSSL * - * Requires OpenSSL 0.9.9 for compilation * **********************************************************************/ #include #include @@ -37,81 +38,210 @@ static int gost_pkey_meths(ENGINE* e, EVP_PKEY_METHOD** pmeth, static int gost_pkey_asn1_meths(ENGINE* e, EVP_PKEY_ASN1_METHOD** ameth, const int** nids, int nid); -static int gost_cipher_nids[] = { +static EVP_PKEY_METHOD* pmeth_GostR3410_2001 = NULL, + * pmeth_GostR3410_2012_256 = NULL, + * pmeth_GostR3410_2012_512 = NULL, + * pmeth_Gost28147_MAC = NULL, * pmeth_Gost28147_MAC_12 = NULL, + * pmeth_magma_mac = NULL, * pmeth_grasshopper_mac = NULL, + * pmeth_magma_mac_acpkm = NULL, * pmeth_grasshopper_mac_acpkm = NULL; + +static EVP_PKEY_ASN1_METHOD* ameth_GostR3410_2001 = 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 }, +}; + +static struct gost_cipher_minfo { + int nid; + const EVP_CIPHER *(*cipher)(void); +} gost_cipher_array[] = { + { NID_id_Gost28147_89, + cipher_gost, + }, + { NID_gost89_cnt, + cipher_gost_cpacnt, + }, + { NID_gost89_cnt_12, + cipher_gost_cpcnt_12, + }, + { NID_gost89_cbc, + cipher_gost_cbc, + }, + { 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_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm, - 0 + cipher_gost_grasshopper_ctracpkm, + }, + { 0 }, }; -static int gost_digest_nids(const int** nids) { - static int digest_nids[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - static int pos = 0; - static int init = 0; - - if (!init) { - const EVP_MD* md; - if ((md = digest_gost()) != NULL) - digest_nids[pos++] = EVP_MD_type(md); - if ((md = imit_gost_cpa()) != NULL) - digest_nids[pos++] = EVP_MD_type(md); - if ((md = digest_gost2012_256()) != NULL) - digest_nids[pos++] = EVP_MD_type(md); - if ((md = digest_gost2012_512()) != NULL) - digest_nids[pos++] = EVP_MD_type(md); - if ((md = imit_gost_cp_12()) != NULL) - digest_nids[pos++] = EVP_MD_type(md); - if ((md = magma_omac()) != NULL) - digest_nids[pos++] = EVP_MD_type(md); - if ((md = grasshopper_omac()) != NULL) - digest_nids[pos++] = EVP_MD_type(md); -/* if ((md = magma_omac_acpkm()) != NULL) - digest_nids[pos++] = EVP_MD_type(md);*/ - if ((md = grasshopper_omac_acpkm()) != NULL) - digest_nids[pos++] = EVP_MD_type(md); - - digest_nids[pos] = 0; - init = 1; - } - *nids = digest_nids; - return pos; -} - -static int gost_pkey_meth_nids[] = { +static struct gost_meth_minfo { + int nid; + EVP_PKEY_METHOD **pmeth; + EVP_PKEY_ASN1_METHOD **ameth; + const char *pemstr; + const char *info; +} gost_meth_array[] = { + { NID_id_GostR3410_2001, + &pmeth_GostR3410_2001, + &ameth_GostR3410_2001, + "GOST2001", + "GOST R 34.10-2001", + }, + { NID_id_Gost28147_89_MAC, + &pmeth_Gost28147_MAC, + &ameth_Gost28147_MAC, + "GOST-MAC", + "GOST 28147-89 MAC", + }, + { NID_id_GostR3410_2012_256, + &pmeth_GostR3410_2012_256, + &ameth_GostR3410_2012_256, + "GOST2012_256", + "GOST R 34.10-2012 with 256 bit key", + }, + { NID_id_GostR3410_2012_512, + &pmeth_GostR3410_2012_512, + &ameth_GostR3410_2012_512, + "GOST2012_512", + "GOST R 34.10-2012 with 512 bit key", + }, + { NID_gost_mac_12, + &pmeth_Gost28147_MAC_12, + &ameth_Gost28147_MAC_12, + "GOST-MAC-12", + "GOST 28147-89 MAC with 2012 params", + }, + { NID_magma_mac, + &pmeth_magma_mac, + &ameth_magma_mac, + "MAGMA-MAC", + "GOST R 34.13-2015 Magma MAC", + }, + { NID_grasshopper_mac, + &pmeth_grasshopper_mac, + &ameth_grasshopper_mac, + "GRASSHOPPER-MAC", + "GOST R 34.13-2015 Grasshopper MAC", + }, + { NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac, + &pmeth_magma_mac_acpkm, + &ameth_magma_mac_acpkm, + "ID-TC26-CIPHER-GOSTR3412-2015-MAGMA-CTRACPKM-OMAC", + "GOST R 34.13-2015 Magma MAC ACPKM", + }, + { NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac, - 0 + &pmeth_grasshopper_mac_acpkm, + &ameth_grasshopper_mac_acpkm, + "ID-TC26-CIPHER-GOSTR3412-2015-KUZNYECHIK-CTRACPKM-OMAC", + "GOST R 34.13-2015 Grasshopper MAC ACPKM", + }, + { 0 }, }; -static EVP_PKEY_METHOD* pmeth_GostR3410_2001 = NULL, - * pmeth_GostR3410_2012_256 = NULL, - * pmeth_GostR3410_2012_512 = NULL, - * pmeth_Gost28147_MAC = NULL, * pmeth_Gost28147_MAC_12 = NULL, - * pmeth_magma_mac = NULL, * pmeth_grasshopper_mac = NULL, - * pmeth_magma_mac_acpkm = NULL, * pmeth_grasshopper_mac_acpkm = NULL; +#ifndef OSSL_NELEM +# define OSSL_NELEM(x) (sizeof(x)/sizeof((x)[0])) +#endif -static EVP_PKEY_ASN1_METHOD* ameth_GostR3410_2001 = 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; +/* `- 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) { return 1; @@ -122,45 +252,26 @@ static int gost_engine_finish(ENGINE* e) { } static int gost_engine_destroy(ENGINE* e) { - EVP_delete_digest_alias("streebog256"); - EVP_delete_digest_alias("streebog512"); - digest_gost_destroy(); - digest_gost2012_256_destroy(); - digest_gost2012_512_destroy(); - - imit_gost_cpa_destroy(); - imit_gost_cp_12_destroy(); - magma_omac_destroy(); - grasshopper_omac_destroy(); - grasshopper_omac_acpkm_destroy(); + struct gost_digest_minfo *dinfo = gost_digest_array; + for (; dinfo->nid; dinfo++) { + if (dinfo->alias) + EVP_delete_digest_alias(dinfo->alias); + dinfo->destroy(); + } cipher_gost_destroy(); cipher_gost_grasshopper_destroy(); gost_param_free(); - pmeth_GostR3410_2001 = NULL; - pmeth_Gost28147_MAC = NULL; - pmeth_GostR3410_2012_256 = NULL; - pmeth_GostR3410_2012_512 = NULL; - pmeth_Gost28147_MAC_12 = NULL; - pmeth_magma_mac = NULL; - pmeth_grasshopper_mac = NULL; - pmeth_magma_mac_acpkm = NULL; - pmeth_grasshopper_mac_acpkm = NULL; - - ameth_GostR3410_2001 = NULL; - ameth_Gost28147_MAC = NULL; - ameth_GostR3410_2012_256 = NULL; - ameth_GostR3410_2012_512 = NULL; - ameth_Gost28147_MAC_12 = NULL; - ameth_magma_mac = NULL; - ameth_grasshopper_mac = NULL; - ameth_magma_mac_acpkm = NULL; - ameth_grasshopper_mac_acpkm = NULL; - - ERR_unload_GOST_strings(); - + struct gost_meth_minfo *minfo = gost_meth_array; + for (; minfo->nid; minfo++) { + *minfo->pmeth = NULL; + *minfo->ameth = NULL; + } + + ERR_unload_GOST_strings(); + return 1; } @@ -211,93 +322,37 @@ static int bind_gost(ENGINE* e, const char* id) { goto end; } - if (!register_ameth_gost - (NID_id_GostR3410_2001, &ameth_GostR3410_2001, "GOST2001", - "GOST R 34.10-2001")) - goto end; - if (!register_ameth_gost - (NID_id_GostR3410_2012_256, &ameth_GostR3410_2012_256, "GOST2012_256", - "GOST R 34.10-2012 with 256 bit key")) - goto end; - if (!register_ameth_gost - (NID_id_GostR3410_2012_512, &ameth_GostR3410_2012_512, "GOST2012_512", - "GOST R 34.10-2012 with 512 bit key")) - goto end; - if (!register_ameth_gost(NID_id_Gost28147_89_MAC, &ameth_Gost28147_MAC, - "GOST-MAC", "GOST 28147-89 MAC")) - goto end; - if (!register_ameth_gost(NID_gost_mac_12, &ameth_Gost28147_MAC_12, - "GOST-MAC-12", - "GOST 28147-89 MAC with 2012 params")) - goto end; - if (!register_ameth_gost(NID_magma_mac, &ameth_magma_mac, - "MAGMA-MAC", "GOST R 34.13-2015 Magma MAC")) - goto end; - if (!register_ameth_gost(NID_grasshopper_mac, &ameth_grasshopper_mac, - "GRASSHOPPER-MAC", "GOST R 34.13-2015 Grasshopper MAC")) - goto end; -/* if (!register_ameth_gost(NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac, &ameth_magma_mac_acpkm, - "ID-TC26-CIPHER-GOSTR3412-2015-MAGMA-CTRACPKM-OMAC", "GOST R 34.13-2015 Magma MAC ACPKM")) - goto end;*/ - if (!register_ameth_gost(NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac, &ameth_grasshopper_mac_acpkm, - "ID-TC26-CIPHER-GOSTR3412-2015-KUZNYECHIK-CTRACPKM-OMAC", "GOST R 34.13-2015 Grasshopper MAC ACPKM")) - goto end; + struct gost_meth_minfo *minfo = gost_meth_array; + for (; minfo->nid; minfo++) { + /* This skip looks temporary. */ + if (minfo->nid == NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac) + continue; - if (!register_pmeth_gost(NID_id_GostR3410_2001, &pmeth_GostR3410_2001, 0)) - goto end; + if (!register_ameth_gost(minfo->nid, minfo->ameth, minfo->pemstr, + minfo->info)) + goto end; + if (!register_pmeth_gost(minfo->nid, minfo->pmeth, 0)) + goto end; + } - if (!register_pmeth_gost - (NID_id_GostR3410_2012_256, &pmeth_GostR3410_2012_256, 0)) - goto end; - if (!register_pmeth_gost - (NID_id_GostR3410_2012_512, &pmeth_GostR3410_2012_512, 0)) - goto end; - if (!register_pmeth_gost - (NID_id_Gost28147_89_MAC, &pmeth_Gost28147_MAC, 0)) - goto end; - if (!register_pmeth_gost(NID_gost_mac_12, &pmeth_Gost28147_MAC_12, 0)) - goto end; - if (!register_pmeth_gost(NID_magma_mac, &pmeth_magma_mac, 0)) - goto end; - if (!register_pmeth_gost(NID_grasshopper_mac, &pmeth_grasshopper_mac, 0)) - goto end; -/* if (!register_pmeth_gost(NID_magma_mac_acpkm, &pmeth_magma_mac_acpkm, 0)) - goto end;*/ - if (!register_pmeth_gost(NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac, &pmeth_grasshopper_mac_acpkm, 0)) - goto end; if (!ENGINE_register_ciphers(e) || !ENGINE_register_digests(e) - || !ENGINE_register_pkey_meths(e) - /* These two actually should go in LIST_ADD command */ - || !EVP_add_cipher(cipher_gost()) - || !EVP_add_cipher(cipher_gost_cbc()) - || !EVP_add_cipher(cipher_gost_cpacnt()) - || !EVP_add_cipher(cipher_gost_cpcnt_12()) - || !EVP_add_cipher(cipher_gost_grasshopper_ecb()) - || !EVP_add_cipher(cipher_gost_grasshopper_cbc()) - || !EVP_add_cipher(cipher_gost_grasshopper_cfb()) - || !EVP_add_cipher(cipher_gost_grasshopper_ofb()) - || !EVP_add_cipher(cipher_gost_grasshopper_ctr()) - || !EVP_add_cipher(cipher_gost_grasshopper_ctracpkm()) - || !EVP_add_cipher(cipher_magma_cbc()) - || !EVP_add_cipher(cipher_magma_ctr()) - || !EVP_add_digest(digest_gost()) - || !EVP_add_digest(digest_gost2012_512()) - || !EVP_add_digest(digest_gost2012_256()) - || !EVP_add_digest(imit_gost_cpa()) - || !EVP_add_digest(imit_gost_cp_12()) - || !EVP_add_digest(magma_omac()) - || !EVP_add_digest(grasshopper_omac()) -/* || !EVP_add_digest(magma_omac_acpkm()) */ - || !EVP_add_digest(grasshopper_omac_acpkm()) - ) { + || !ENGINE_register_pkey_meths(e)) goto end; - } - if(!EVP_add_digest_alias(SN_id_GostR3411_2012_256, "streebog256") - || !EVP_add_digest_alias(SN_id_GostR3411_2012_512, "streebog512")) { - goto end; + struct gost_cipher_minfo *cinfo = gost_cipher_array; + for (; cinfo->nid; cinfo++) + if (!EVP_add_cipher(cinfo->cipher())) + 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)) + goto end; } ENGINE_register_all_complete(); @@ -313,157 +368,97 @@ IMPLEMENT_DYNAMIC_BIND_FN(bind_gost) IMPLEMENT_DYNAMIC_CHECK_FN() #endif /* ndef OPENSSL_NO_DYNAMIC_ENGINE */ -static int gost_digests(ENGINE* e, const EVP_MD** digest, - const int** nids, int nid) { - int ok = 1; - if (digest == NULL) { - return gost_digest_nids(nids); - } - if (nid == NID_id_GostR3411_94) { - *digest = digest_gost(); - } else if (nid == NID_id_Gost28147_89_MAC) { - *digest = imit_gost_cpa(); - } else if (nid == NID_id_GostR3411_2012_256) { - *digest = digest_gost2012_256(); - } else if (nid == NID_id_GostR3411_2012_512) { - *digest = digest_gost2012_512(); - } else if (nid == NID_gost_mac_12) { - *digest = imit_gost_cp_12(); - } else if (nid == NID_magma_mac) { - *digest = magma_omac(); - } else if (nid == NID_grasshopper_mac) { - *digest = grasshopper_omac(); - } else if (nid == NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac) { - *digest = grasshopper_omac_acpkm(); - } else { - ok = 0; - *digest = NULL; - } - return ok; -} +/* ENGINE_DIGESTS_PTR callback installed by ENGINE_set_digests */ +static int gost_digests(ENGINE *e, const EVP_MD **digest, + const int **nids, int nid) +{ + struct gost_digest_minfo *info = gost_digest_array; -static int gost_ciphers(ENGINE* e, const EVP_CIPHER** cipher, - const int** nids, int nid) { - int ok = 1; - if (cipher == NULL) { - *nids = gost_cipher_nids; - return sizeof(gost_cipher_nids) / sizeof(gost_cipher_nids[0]) - 1; - } + if (!digest) { + int *n = known_digest_nids; - if (nid == NID_id_Gost28147_89) { - *cipher = cipher_gost(); - } else if (nid == NID_gost89_cnt) { - *cipher = cipher_gost_cpacnt(); - } else if (nid == NID_gost89_cnt_12) { - *cipher = cipher_gost_cpcnt_12(); - } else if (nid == NID_gost89_cbc) { - *cipher = cipher_gost_cbc(); - } else if (nid == NID_grasshopper_ecb) { - *cipher = cipher_gost_grasshopper_ecb(); - } else if (nid == NID_grasshopper_cbc) { - *cipher = cipher_gost_grasshopper_cbc(); - } else if (nid == NID_grasshopper_cfb) { - *cipher = cipher_gost_grasshopper_cfb(); - } else if (nid == NID_grasshopper_ofb) { - *cipher = cipher_gost_grasshopper_ofb(); - } else if (nid == NID_grasshopper_ctr) { - *cipher = cipher_gost_grasshopper_ctr(); - } else if (nid == NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm) { - *cipher = cipher_gost_grasshopper_ctracpkm(); - } else if (nid == NID_magma_cbc) { - *cipher = cipher_magma_cbc(); - } else if (nid == NID_magma_ctr) { - *cipher = cipher_magma_ctr(); - } else { - ok = 0; - *cipher = NULL; + *nids = n; + for (; info->nid; info++) + *n++ = info->nid; + return OSSL_NELEM(known_digest_nids); } - return ok; + + for (; info->nid; info++) + if (nid == info->nid) { + *digest = info->digest(); + return 1; + } + *digest = NULL; + return 0; } -static int gost_pkey_meths(ENGINE* e, EVP_PKEY_METHOD** pmeth, - const int** nids, int nid) { - if (pmeth == NULL) { - *nids = gost_pkey_meth_nids; - return sizeof(gost_pkey_meth_nids) / sizeof(gost_pkey_meth_nids[0]) - 1; - } +/* ENGINE_CIPHERS_PTR callback installed by ENGINE_set_ciphers */ +static int gost_ciphers(ENGINE *e, const EVP_CIPHER **cipher, + const int **nids, int nid) +{ + struct gost_cipher_minfo *info = gost_cipher_array; - switch (nid) { - case NID_id_GostR3410_2001: - *pmeth = pmeth_GostR3410_2001; - return 1; - case NID_id_GostR3410_2012_256: - *pmeth = pmeth_GostR3410_2012_256; - return 1; - case NID_id_GostR3410_2012_512: - *pmeth = pmeth_GostR3410_2012_512; - return 1; - case NID_id_Gost28147_89_MAC: - *pmeth = pmeth_Gost28147_MAC; - return 1; - case NID_gost_mac_12: - *pmeth = pmeth_Gost28147_MAC_12; - return 1; - case NID_magma_mac: - *pmeth = pmeth_magma_mac; - return 1; - case NID_grasshopper_mac: - *pmeth = pmeth_grasshopper_mac; - return 1; - case NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac: - *pmeth = pmeth_magma_mac_acpkm; - return 1; - case NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac: - *pmeth = pmeth_grasshopper_mac_acpkm; - return 1; + if (!cipher) { + int *n = known_cipher_nids; - default:; + *nids = n; + for (; info->nid; info++) + *n++ = info->nid; + return OSSL_NELEM(known_cipher_nids); } - *pmeth = NULL; + for (; info->nid; info++) + if (nid == info->nid) { + *cipher = info->cipher(); + return 1; + } + *cipher = NULL; return 0; } -static int gost_pkey_asn1_meths(ENGINE* e, EVP_PKEY_ASN1_METHOD** ameth, - const int** nids, int nid) { - if (ameth == NULL) { - *nids = gost_pkey_meth_nids; - return sizeof(gost_pkey_meth_nids) / sizeof(gost_pkey_meth_nids[0]) - 1; - } +static int gost_meth_nids(const int **nids) +{ + struct gost_meth_minfo *info = gost_meth_array; + int *n = known_meths_nids; - switch (nid) { - case NID_id_GostR3410_2001: - *ameth = ameth_GostR3410_2001; - return 1; - case NID_id_GostR3410_2012_256: - *ameth = ameth_GostR3410_2012_256; - return 1; - case NID_id_GostR3410_2012_512: - *ameth = ameth_GostR3410_2012_512; - return 1; - case NID_id_Gost28147_89_MAC: - *ameth = ameth_Gost28147_MAC; - return 1; - case NID_gost_mac_12: - *ameth = ameth_Gost28147_MAC_12; - return 1; - case NID_magma_mac: - *ameth = ameth_magma_mac; - return 1; - case NID_grasshopper_mac: - *ameth = ameth_grasshopper_mac; - return 1; - case NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac: - *ameth = ameth_magma_mac_acpkm; - return 1; - case NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac: - *ameth = ameth_grasshopper_mac_acpkm; + *nids = n; + for (; info->nid; info++) + *n++ = info->nid; + return OSSL_NELEM(known_meths_nids); +} + +/* ENGINE_PKEY_METHS_PTR installed by ENGINE_set_pkey_meths */ +static int gost_pkey_meths(ENGINE *e, EVP_PKEY_METHOD **pmeth, + const int **nids, int nid) +{ + struct gost_meth_minfo *info; + + if (!pmeth) + return gost_meth_nids(nids); + + for (info = gost_meth_array; info->nid; info++) + if (nid == info->nid) { + *pmeth = *info->pmeth; return 1; + } + *pmeth = NULL; + return 0; +} +/* ENGINE_PKEY_ASN1_METHS_PTR installed by ENGINE_set_pkey_asn1_meths */ +static int gost_pkey_asn1_meths(ENGINE *e, EVP_PKEY_ASN1_METHOD **ameth, + const int **nids, int nid) +{ + struct gost_meth_minfo *info; - default:; - } + if (!ameth) + return gost_meth_nids(nids); + for (info = gost_meth_array; info->nid; info++) + if (nid == info->nid) { + *ameth = *info->ameth; + return 1; + } *ameth = NULL; return 0; }