From 97b3db1ebf985b73718faaae6c425782d526d44f Mon Sep 17 00:00:00 2001 From: Sergei Ianovich Date: Sun, 25 Sep 2022 14:35:14 +0300 Subject: [PATCH] engine: create missing NIDs Signed-off-by: Sergei Ianovich --- gost_eng.c | 34 ++++++++++++++++++++++++++++++++++ gost_lcl.h | 11 +++++++++++ 2 files changed, 45 insertions(+) diff --git a/gost_eng.c b/gost_eng.c index c128867..f38a6fc 100644 --- a/gost_eng.c +++ b/gost_eng.c @@ -295,6 +295,8 @@ static int gost_engine_finish(ENGINE* e) { return 1; } +static void free_NIDs(); + static int gost_engine_destroy(ENGINE* e) { int i; @@ -312,6 +314,7 @@ static int gost_engine_destroy(ENGINE* e) { } free_cached_groups(); + free_NIDs(); # ifndef BUILDING_GOST_PROVIDER ERR_unload_GOST_strings(); @@ -325,6 +328,33 @@ static int gost_engine_destroy(ENGINE* e) { * binds it to OpenSSL libraries */ +static GOST_NID_JOB *missing_NIDs[] = { +}; + +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 @@ -341,6 +371,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; diff --git a/gost_lcl.h b/gost_lcl.h index 569f7cf..d8b8943 100644 --- a/gost_lcl.h +++ b/gost_lcl.h @@ -17,6 +17,7 @@ # include # include # include +# include # include "gost89.h" # include "gosthash.h" /* Control commands */ @@ -400,5 +401,15 @@ extern GOST_digest kuznyechik_ctracpkm_omac_digest; extern const OSSL_ALGORITHM GOST_prov_digests[]; void GOST_prov_deinit_digests(void); +/* job to initialize a missing NID */ +struct gost_nid_job { + const char *sn; + const char *ln; + void (*callback)(int nid); + ASN1_OBJECT *asn1; +}; + +typedef struct gost_nid_job GOST_NID_JOB; + #endif /* vim: set expandtab cinoptions=\:0,l1,t0,g0,(0 sw=4 : */ -- 2.39.2