diff options
author | Sergei Ianovich <s@elektroplus.ru> | 2022-09-25 14:35:14 +0300 |
---|---|---|
committer | Dmitry Belyavskiy <beldmit@users.noreply.github.com> | 2022-12-02 18:56:55 +0100 |
commit | 97b3db1ebf985b73718faaae6c425782d526d44f (patch) | |
tree | 7d1017f8403761b7d8341401b2ead89e1c60e0a1 | |
parent | fa0478e003f308adbd6e30dc1c39089ea3fdce3a (diff) | |
download | gost-engine-97b3db1ebf985b73718faaae6c425782d526d44f.zip gost-engine-97b3db1ebf985b73718faaae6c425782d526d44f.tar.gz gost-engine-97b3db1ebf985b73718faaae6c425782d526d44f.tar.bz2 |
engine: create missing NIDs
Signed-off-by: Sergei Ianovich <sergei.ianovich@ya.ru>
-rw-r--r-- | gost_eng.c | 34 | ||||
-rw-r--r-- | gost_lcl.h | 11 |
2 files changed, 45 insertions, 0 deletions
@@ -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; @@ -17,6 +17,7 @@ # include <openssl/x509.h> # include <openssl/engine.h> # include <openssl/ec.h> +# include <openssl/asn1.h> # 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 : */ |