]> www.wagner.pp.ru Git - openssl-gost/engine.git/blobdiff - gost_eng.c
tcl_tests: ca.try: Ignore openssl crl exit status for 'corrupted CRL' test
[openssl-gost/engine.git] / gost_eng.c
index d2371d297640d3f82d53a339a7838f9b1003fc5d..7ca5523721dc8e26121e00c1fdfbd9b4d2896f7f 100644 (file)
@@ -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 : */