X-Git-Url: http://www.wagner.pp.ru/gitweb/?p=openssl-gost%2Fengine.git;a=blobdiff_plain;f=gost_eng.c;h=7ca5523721dc8e26121e00c1fdfbd9b4d2896f7f;hp=003768cfb727e49a6bd26330c5ed3ae876885f62;hb=HEAD;hpb=5a399b81e811c28c016fbc0315a9c78593eda1f9 diff --git a/gost_eng.c b/gost_eng.c index 003768c..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; @@ -311,6 +316,7 @@ static int gost_engine_destroy(ENGINE* e) { } free_cached_groups(); + free_NIDs(); # ifndef BUILDING_GOST_PROVIDER ERR_unload_GOST_strings(); @@ -324,6 +330,35 @@ static int gost_engine_destroy(ENGINE* e) { * binds it to OpenSSL libraries */ +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 @@ -340,6 +375,10 @@ int populate_gost_engine(ENGINE* e) { 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)) { fprintf(stderr, "ENGINE_set_digests failed\n"); goto end;