13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
#define CK_DECLARE_FUNCTION_POINTER(returnType, name) returnType (* name)
#define CK_CALLBACK_FUNCTION(returnType, name) returnType (* name)
#ifndef NULL_PTR
# define NULL_PTR 0
#endif
#include "./pkcs11/pkcs11.h"
#ifndef CACKEY_LIBRARY_FILE
#define CACKEY_LIBRARY_FILE "libcackey_g.so"
#endif
static void *libcackey_wrap_handle = NULL_PTR;
static void libcackey_wrap_init(void);
static CK_RV libcackey_wrap_createmutex(CK_VOID_PTR_PTR ppMutex) {
int (*create_mutex)(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
pthread_mutex_t *pthread_mutex;
int pthread_retval;
libcackey_wrap_init();
pthread_mutex = malloc(sizeof(*pthread_mutex));
create_mutex = dlsym(libcackey_wrap_handle, "pthread_mutex_init");
pthread_retval = create_mutex(pthread_mutex, NULL);
if (pthread_retval != 0) {
return(CKR_GENERAL_ERROR);
}
*ppMutex = pthread_mutex;
return(CKR_OK);
}
#define libcackey_wrap_genericmutexfunc(funcName, pthreadName) \
static CK_RV funcName(CK_VOID_PTR pMutex) { \
int (*func)(pthread_mutex_t *mutex); \
pthread_mutex_t *pthread_mutex; \
int pthread_retval; \
libcackey_wrap_init(); \
pthread_mutex = pMutex; \
func = dlsym(libcackey_wrap_handle, pthreadName); \
pthread_retval = func(pthread_mutex); \
if (pthread_retval != 0) { \
return(CKR_GENERAL_ERROR); \
} \
if (strcmp(pthreadName, "pthread_mutex_destroy") == 0) { \
free(pthread_mutex); \
} \
return(CKR_OK); \
}
libcackey_wrap_genericmutexfunc(libcackey_wrap_destroymutex, "pthread_mutex_destroy")
libcackey_wrap_genericmutexfunc(libcackey_wrap_lockmutex, "pthread_mutex_lock")
libcackey_wrap_genericmutexfunc(libcackey_wrap_unlockmutex, "pthread_mutex_unlock")
static void libcackey_wrap_init(void) {
Dl_info libinfo;
int dladdr_ret;
char *library, *libraryDir, *libraryDirLastSlash;
if (libcackey_wrap_handle) {
return;
|
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
-
+
+
+
+
+
+
+
+
+
+
+
+
+
|
abort();
return;
}
*libraryDirLastSlash = '\0';
asprintf(&library, "%s/libcackey.so", libraryDir);
asprintf(&library, "%s/" CACKEY_LIBRARY_FILE, libraryDir);
libcackey_wrap_handle = dlmopen(LM_ID_NEWLM, library, RTLD_LOCAL | RTLD_NOW);
if (!libcackey_wrap_handle) {
fprintf(stderr, "Unable to load \"%s\": %s\n", library, dlerror());
abort();
return;
}
free(library);
return;
}
static void libcackey_wrap_fini(void) {
if (!libcackey_wrap_handle) {
return;
}
dlclose(libcackey_wrap_handle);
libcackey_wrap_handle = NULL_PTR;
return;
}
|