Blame SOURCES/opencryptoki-3.17-libica4-8e9800b492f7a40ed5dfcd85e042701b6a5c5a26.patch

b9ab58
commit 8e9800b492f7a40ed5dfcd85e042701b6a5c5a26
b9ab58
Author: Ingo Franzki <ifranzki@linux.ibm.com>
b9ab58
Date:   Tue Dec 7 16:39:28 2021 +0100
b9ab58
b9ab58
    ICA/EP11: Support libica version 4
b9ab58
    
b9ab58
    Try to load libica version 4 (libica.so.4), but fall back to version 3
b9ab58
    (libica.so.3) if version 4 is not available.
b9ab58
    
b9ab58
    Signed-off-by: Ingo Franzki <ifranzki@linux.ibm.com>
b9ab58
b9ab58
diff --git a/usr/lib/ep11_stdll/ep11_specific.c b/usr/lib/ep11_stdll/ep11_specific.c
b9ab58
index 4029e5a5..f223017d 100644
b9ab58
--- a/usr/lib/ep11_stdll/ep11_specific.c
b9ab58
+++ b/usr/lib/ep11_stdll/ep11_specific.c
b9ab58
@@ -68,7 +68,8 @@
b9ab58
 #define EP11SHAREDLIB_V2 "libep11.so.2"
b9ab58
 #define EP11SHAREDLIB_V1 "libep11.so.1"
b9ab58
 #define EP11SHAREDLIB "libep11.so"
b9ab58
-#define ICASHAREDLIB  "libica.so.3"
b9ab58
+#define ICASHAREDLIB_V4  "libica.so.4"
b9ab58
+#define ICASHAREDLIB_V3  "libica.so.3"
b9ab58
 
b9ab58
 CK_RV ep11tok_get_mechanism_list(STDLL_TokData_t * tokdata,
b9ab58
                                  CK_MECHANISM_TYPE_PTR mlist,
b9ab58
@@ -2044,9 +2045,9 @@ static CK_RV make_wrapblob(STDLL_TokData_t * tokdata, CK_ATTRIBUTE * tmpl_in,
b9ab58
 }
b9ab58
 
b9ab58
 #ifdef EP11_HSMSIM
b9ab58
-#define DLOPEN_FLAGS        RTLD_GLOBAL | RTLD_NOW | RTLD_DEEPBIND
b9ab58
+#define DLOPEN_FLAGS        RTLD_NOW | RTLD_DEEPBIND
b9ab58
 #else
b9ab58
-#define DLOPEN_FLAGS        RTLD_GLOBAL | RTLD_NOW
b9ab58
+#define DLOPEN_FLAGS        RTLD_NOW
b9ab58
 #endif
b9ab58
 
b9ab58
 static void *ep11_load_host_lib()
b9ab58
@@ -2209,12 +2210,16 @@ static CK_RV ep11tok_load_libica(STDLL_TokData_t *tokdata)
b9ab58
         return CKR_OK;
b9ab58
 
b9ab58
     if (strcmp(ep11_data->digest_libica_path, "") == 0) {
b9ab58
-        strcpy(ep11_data->digest_libica_path, ICASHAREDLIB);
b9ab58
+        strcpy(ep11_data->digest_libica_path, ICASHAREDLIB_V4);
b9ab58
         default_libica = 1;
b9ab58
+        libica->library = dlopen(ep11_data->digest_libica_path, RTLD_NOW);
b9ab58
+        if (libica->library == NULL) {
b9ab58
+            strcpy(ep11_data->digest_libica_path, ICASHAREDLIB_V3);
b9ab58
+            libica->library = dlopen(ep11_data->digest_libica_path, RTLD_NOW);
b9ab58
+        }
b9ab58
+    } else {
b9ab58
+        libica->library = dlopen(ep11_data->digest_libica_path, RTLD_NOW);
b9ab58
     }
b9ab58
-
b9ab58
-    libica->library = dlopen(ep11_data->digest_libica_path,
b9ab58
-                             RTLD_GLOBAL | RTLD_NOW);
b9ab58
     if (libica->library == NULL) {
b9ab58
         errstr = dlerror();
b9ab58
         OCK_SYSLOG(default_libica ? LOG_WARNING : LOG_ERR,
b9ab58
diff --git a/usr/lib/ica_s390_stdll/ica_specific.c b/usr/lib/ica_s390_stdll/ica_specific.c
b9ab58
index fd18de42..c4fa9654 100644
b9ab58
--- a/usr/lib/ica_s390_stdll/ica_specific.c
b9ab58
+++ b/usr/lib/ica_s390_stdll/ica_specific.c
b9ab58
@@ -83,7 +83,8 @@ const char label[] = "icatok";
b9ab58
 
b9ab58
 static pthread_mutex_t rngmtx = PTHREAD_MUTEX_INITIALIZER;
b9ab58
 
b9ab58
-#define LIBICA_SHARED_LIB "libica.so.3"
b9ab58
+#define LIBICA_SHARED_LIB_V3 "libica.so.3"
b9ab58
+#define LIBICA_SHARED_LIB_V4 "libica.so.4"
b9ab58
 #define BIND(dso, sym)  do {                                             \
b9ab58
                             if (p_##sym == NULL)                         \
b9ab58
                                 *(void **)(&p_##sym) = dlsym(dso, #sym); \
b9ab58
@@ -221,9 +222,13 @@ static CK_RV load_libica(void)
b9ab58
     void *ibmca_dso = NULL;
b9ab58
 
b9ab58
     /* Load libica */
b9ab58
-    ibmca_dso = dlopen(LIBICA_SHARED_LIB, RTLD_NOW);
b9ab58
+    ibmca_dso = dlopen(LIBICA_SHARED_LIB_V4, RTLD_NOW);
b9ab58
+    if (ibmca_dso == NULL)
b9ab58
+        ibmca_dso = dlopen(LIBICA_SHARED_LIB_V3, RTLD_NOW);
b9ab58
+
b9ab58
     if (ibmca_dso == NULL) {
b9ab58
-        TRACE_ERROR("%s: dlopen(%s) failed\n", __func__, LIBICA_SHARED_LIB);
b9ab58
+        TRACE_ERROR("%s: dlopen(%s or %s) failed: %s\n", __func__,
b9ab58
+                    LIBICA_SHARED_LIB_V4, LIBICA_SHARED_LIB_V3, dlerror());
b9ab58
         return CKR_FUNCTION_FAILED;
b9ab58
     }
b9ab58