]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
liboqs: manually load liboqs.so at startup
authorDaiki Ueno <ueno@gnu.org>
Tue, 23 Jul 2024 06:12:11 +0000 (15:12 +0900)
committerDaiki Ueno <ueno@gnu.org>
Tue, 23 Jul 2024 06:13:06 +0000 (15:13 +0900)
Signed-off-by: Daiki Ueno <ueno@gnu.org>
lib/global.c
lib/liboqs/liboqs.c
lib/liboqs/liboqs.h

index ae2f7f54dc5d9d42381471bfc490fa102a507cc6..4aaf79a76830b3705f42cc5db4d8fc95667a30c3 100644 (file)
@@ -330,7 +330,11 @@ static int _gnutls_global_init(unsigned constructor)
        }
 
 #ifdef HAVE_LIBOQS
-       _gnutls_liboqs_init();
+       ret = _gnutls_liboqs_init();
+       if (ret < 0) {
+               gnutls_assert();
+               goto out;
+       }
 #endif
 
 #ifndef _WIN32
index 88f2369719ff0130fd7bce25cd5158a1d093685d..c5531d479617c7046334b1833e21d76b91ca3bef 100644 (file)
 
 #include "liboqs/liboqs.h"
 
+#ifdef _WIN32
+#define RTLD_NOW 0
+#define RTLD_GLOBAL 0
+#else
+#include <dlfcn.h>
+#endif
+
+#ifndef OQS_LIBRARY_SONAME
+#define OQS_LIBRARY_SONAME "none"
+#endif
+
+#include "errors.h"
+
 #include "dlwrap/oqs.h"
 #include "liboqs/rand.h"
 #include "liboqs/sha3.h"
 
-void _gnutls_liboqs_init(void)
+int _gnutls_liboqs_init(void)
 {
+       if (gnutls_oqs_ensure_library(OQS_LIBRARY_SONAME,
+                                     RTLD_NOW | RTLD_GLOBAL) < 0)
+               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
+
        _gnutls_liboqs_sha3_init();
        GNUTLS_OQS_FUNC(OQS_init)();
        _gnutls_liboqs_rand_init();
+       return 0;
 }
 
 void _gnutls_liboqs_deinit(void)
@@ -38,4 +56,5 @@ void _gnutls_liboqs_deinit(void)
        _gnutls_liboqs_rand_deinit();
        _gnutls_liboqs_sha3_deinit();
        GNUTLS_OQS_FUNC(OQS_destroy)();
+       gnutls_oqs_unload_library();
 }
index b6c1659212580f2012e949800eac540f03aaef22..50206fa77ccb02b21dcae9e029e2026860bf5f76 100644 (file)
@@ -21,7 +21,7 @@
 #ifndef GNUTLS_LIB_LIBOQS_LIBOQS_H
 #define GNUTLS_LIB_LIBOQS_LIBOQS_H
 
-void _gnutls_liboqs_init(void);
+int _gnutls_liboqs_init(void);
 void _gnutls_liboqs_deinit(void);
 
 #endif /* GNUTLS_LIB_LIBOQS_LIBOQS_H */