aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Ianovich <s@elektroplus.ru>2022-09-25 14:35:14 +0300
committerDmitry Belyavskiy <beldmit@users.noreply.github.com>2022-12-02 18:56:55 +0100
commit97b3db1ebf985b73718faaae6c425782d526d44f (patch)
tree7d1017f8403761b7d8341401b2ead89e1c60e0a1
parentfa0478e003f308adbd6e30dc1c39089ea3fdce3a (diff)
downloadgost-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.c34
-rw-r--r--gost_lcl.h11
2 files changed, 45 insertions, 0 deletions
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 <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 : */