X-Git-Url: http://www.wagner.pp.ru/gitweb/?p=openssl-gost%2Fengine.git;a=blobdiff_plain;f=gost_eng.c;h=7ca5523721dc8e26121e00c1fdfbd9b4d2896f7f;hp=d2371d297640d3f82d53a339a7838f9b1003fc5d;hb=HEAD;hpb=d9a2b2973a1174baa4cecbffc6809764b63de2eb diff --git a/gost_eng.c b/gost_eng.c index d2371d2..7ca5523 100644 --- a/gost_eng.c +++ b/gost_eng.c @@ -92,10 +92,13 @@ GOST_cipher *gost_cipher_array[] = { &grasshopper_cfb_cipher, &grasshopper_ofb_cipher, &grasshopper_ctr_cipher, + &magma_ecb_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, @@ -294,6 +297,8 @@ static int gost_engine_finish(ENGINE* e) { return 1; } +static void free_NIDs(); + static int gost_engine_destroy(ENGINE* e) { int i; @@ -310,7 +315,12 @@ static int gost_engine_destroy(ENGINE* e) { *minfo->ameth = NULL; } + free_cached_groups(); + free_NIDs(); + +# ifndef BUILDING_GOST_PROVIDER ERR_unload_GOST_strings(); +# endif return 1; } @@ -320,33 +330,69 @@ static int gost_engine_destroy(ENGINE* e) { * binds it to OpenSSL libraries */ -static int populate_gost_engine(ENGINE* e) { +static GOST_NID_JOB *missing_NIDs[] = { + &kuznyechik_mgm_NID, + &magma_mgm_NID, +}; + +static int create_NIDs() { + int i; + int new_nid = OBJ_new_nid(OSSL_NELEM(missing_NIDs)); + for (i = 0; i < OSSL_NELEM(missing_NIDs); i++) { + GOST_NID_JOB *job = missing_NIDs[i]; + ASN1_OBJECT *obj = + ASN1_OBJECT_create(new_nid + i, NULL, 0, job->sn, job->ln); + job->asn1 = obj; + if (!obj || OBJ_add_object(obj) == NID_undef) { + OPENSSL_free(obj); + return 0; + } + (*missing_NIDs[i]->callback)(new_nid + i); + } + return 1; +} + +static void free_NIDs() { + int i; + for (i = 0; i < OSSL_NELEM(missing_NIDs); i++) { + ASN1_OBJECT_free(missing_NIDs[i]->asn1); + } +} + +# ifndef BUILDING_GOST_PROVIDER +static +# endif +int populate_gost_engine(ENGINE* e) { int ret = 0; if (e == NULL) goto end; if (!ENGINE_set_id(e, engine_gost_id)) { - printf("ENGINE_set_id failed\n"); + fprintf(stderr, "ENGINE_set_id failed\n"); goto end; } if (!ENGINE_set_name(e, engine_gost_name)) { - printf("ENGINE_set_name failed\n"); + fprintf(stderr, "ENGINE_set_name failed\n"); + goto end; + } + if (!create_NIDs()) { + fprintf(stderr, "NID creation failed\n"); goto end; } if (!ENGINE_set_digests(e, gost_digests)) { - printf("ENGINE_set_digests failed\n"); + fprintf(stderr, "ENGINE_set_digests failed\n"); goto end; } if (!ENGINE_set_ciphers(e, gost_ciphers)) { - printf("ENGINE_set_ciphers failed\n"); + fprintf(stderr, "ENGINE_set_ciphers failed\n"); goto end; } if (!ENGINE_set_pkey_meths(e, gost_pkey_meths)) { - printf("ENGINE_set_pkey_meths failed\n"); + fprintf(stderr, "ENGINE_set_pkey_meths failed\n"); goto end; } if (!ENGINE_set_pkey_asn1_meths(e, gost_pkey_asn1_meths)) { - printf("ENGINE_set_pkey_asn1_meths failed\n"); + fprintf(stderr, "ENGINE_set_pkey_asn1_meths failed\n"); goto end; } /* Control function and commands */ @@ -389,6 +435,7 @@ static int populate_gost_engine(ENGINE* e) { return ret; } +#ifndef BUILDING_GOST_PROVIDER static int bind_gost_engine(ENGINE* e) { int ret = 0; @@ -452,7 +499,6 @@ IMPLEMENT_DYNAMIC_CHECK_FN() * it must manually call ENGINE_load_gost() for it to bind itself into the * libcrypto libraries. */ - void ENGINE_load_gost(void) { ENGINE* toadd; int ret = 0; @@ -464,6 +510,6 @@ void ENGINE_load_gost(void) { if (ret > 0) ERR_clear_error(); } - +#endif #endif /* vim: set expandtab cinoptions=\:0,l1,t0,g0,(0 sw=4 : */