Overview
Comment: | More work on improving the wrapper |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | better-wrapping |
Files: | files | file ages | folders |
SHA1: | 3b7b2eddb484df522b782618348c690777f166be |
User & Date: | rkeene on 2017-12-28 01:32:36 |
Other Links: | manifest | tags |
Context
2018-06-29
| ||
18:58 | More work on improving wrapper Leaf check-in: 3fdad99785 user: rkeene tags: better-wrapping | |
2017-12-28
| ||
01:32 | More work on improving the wrapper check-in: 3b7b2eddb4 user: rkeene tags: better-wrapping | |
01:32 | Updated to support supplying an empty PIN command to be equivelant to unsetting check-in: 9043258dc4 user: rkeene tags: trunk | |
Changes
Modified Makefile.in from [abdaf2d437] to [0b2c29b908].
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
libcackey_g.a: cackey_g.o rm -f libcackey_g.a $(AR) rc libcackey_g.a cackey_g.o -$(RANLIB) libcackey_g.a libcackey_wrap.@SHOBJEXT@: libcackey_wrap.o $(CC) $(SHOBJFLAGS) $(SHOBJLDFLAGS) -o libcackey_wrap.@SHOBJEXT@ libcackey_wrap.o -@WEAKENSYMS@ "libcackey_wrap.@SHOBJEXT@" -@REMOVESYMS@ "libcackey_wrap.@SHOBJEXT@" libcackey_wrap.o: libcackey_wrap.c $(CC) $(SHOBJFLAGS) -o libcackey_wrap.o -c libcackey_wrap.c test: test.c libcackey_g.@SHOBJEXT@ |
| |
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
libcackey_g.a: cackey_g.o
rm -f libcackey_g.a
$(AR) rc libcackey_g.a cackey_g.o
-$(RANLIB) libcackey_g.a
libcackey_wrap.@SHOBJEXT@: libcackey_wrap.o
$(CC) $(SHOBJFLAGS) $(SHOBJLDFLAGS) -o libcackey_wrap.@SHOBJEXT@ libcackey_wrap.o -ldl
-@WEAKENSYMS@ "libcackey_wrap.@SHOBJEXT@"
-@REMOVESYMS@ "libcackey_wrap.@SHOBJEXT@"
libcackey_wrap.o: libcackey_wrap.c
$(CC) $(SHOBJFLAGS) -o libcackey_wrap.o -c libcackey_wrap.c
test: test.c libcackey_g.@SHOBJEXT@
|
Modified build/libcackey_wrap.c.in from [4c95cbc88b] to [98f3aad3ae].
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
..
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
#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" static void *libcackey_wrap_handle = NULL_PTR; static void libcackey_wrap_init(void) { Dl_info libinfo; int dladdr_ret; char *library, *libraryDir, *libraryDirLastSlash; if (libcackey_wrap_handle) { return; ................................................................................ abort(); return; } *libraryDirLastSlash = '\0'; asprintf(&library, "%s/libcackey.so", 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; } |
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
|
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
...
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
|
#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; ................................................................................ abort(); return; } *libraryDirLastSlash = '\0'; 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; } |
Modified build/make-libcackey_wrap from [833dbdb173] to [f1fa196b14].
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
..
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#! /usr/bin/env bash
cd "$(dirname "${BASH_SOURCE[0]}")" || exit 1
cat libcackey_wrap.c.in
grep '^CK_DEFINE_FUNCTION' ../cackey.c | while IFS='' read -r line; do
function="$(echo "${line}" | cut -f 2 -d , | cut -f 1 -d ')' | sed 's@ *@@g')"
args="$(echo "${line}" | cut -f 3 -d '(' | cut -f 1 -d ')' | tr ',' $'\n' | sed 's@^ *@@')"
argNames=()
while read argType argName; do
argNames=("${argNames[@]}" "${argName}")
done <<<"${args}"
argNamesList=''
................................................................................
argNamesList="${argNamesList}, ${argName}"
done
argNamesList="$(echo "${argNamesList}" | cut -c 3-)"
echo ''
echo "${line}"
echo $'\t'"CK_RV (*func)($(echo "${args}" | tr $'\n' ',' | sed 's@,*$@@;s@,@, @g'));"
echo ''
echo $'\t''libcackey_wrap_init();'
echo ''
echo $'\t'"func = dlsym(libcackey_wrap_handle, \"${function}\");"
echo ''
echo $'\t'"return(func($argNamesList));"
echo '}'
done
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
..
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
#! /usr/bin/env bash cd "$(dirname "${BASH_SOURCE[0]}")" || exit 1 cat libcackey_wrap.c.in functionList=() while IFS='' read -r line; do function="$(echo "${line}" | cut -f 2 -d , | cut -f 1 -d ')' | sed 's@ *@@g')" if [ "${function}" = 'C_LoginMutexArg' ]; then continue fi functionList=("${functionList[@]}" "${function}") done < <(grep '^CK_DEFINE_FUNCTION' ../cackey.c) grep '^CK_DEFINE_FUNCTION' ../cackey.c | while IFS='' read -r line; do function="$(echo "${line}" | cut -f 2 -d , | cut -f 1 -d ')' | sed 's@ *@@g')" if [ "${function}" = 'C_LoginMutexArg' ]; then continue fi args="$(echo "${line}" | cut -f 3 -d '(' | cut -f 1 -d ')' | tr ',' $'\n' | sed 's@^ *@@')" argNames=() while read argType argName; do argNames=("${argNames[@]}" "${argName}") done <<<"${args}" argNamesList='' ................................................................................ argNamesList="${argNamesList}, ${argName}" done argNamesList="$(echo "${argNamesList}" | cut -c 3-)" echo '' echo "${line}" echo $'\t'"CK_RV (*func)($(echo "${args}" | tr $'\n' ',' | sed 's@,*$@@;s@,@, @g'));" case "${function}" in C_Finalize) echo $'\t''CK_RV retval;' ;; C_Initialize) echo $'\t''CK_C_INITIALIZE_ARGS CK_PTR args, localargs;' ;; C_GetFunctionList) echo $'\t''CK_RV retval;' echo $'\t''CK_FUNCTION_LIST_PTR pFunctionList;' ;; esac echo '' echo $'\t''libcackey_wrap_init();' if [ "${function}" = 'C_Initialize' ]; then echo '' echo $'\t''if (pInitArgs) {' echo $'\t\t''args = pInitArgs;' echo $'\t\t''if ((args->flags & CKF_OS_LOCKING_OK) == CKF_OS_LOCKING_OK) {' #echo 'fprintf(stderr, "replacing=%p\n", pInitArgs); fflush(stderr); abort();' echo $'\t\t\t''memcpy(&localargs, args, sizeof(*args));' echo $'\t\t\t''localargs.CreateMutex = libcackey_wrap_createmutex;' echo $'\t\t\t''localargs.DestroyMutex = libcackey_wrap_destroymutex;' echo $'\t\t\t''localargs.LockMutex = libcackey_wrap_lockmutex;' echo $'\t\t\t''localargs.UnlockMutex = libcackey_wrap_unlockmutex;' echo $'\t\t\t''localargs.flags &= ~CKF_OS_LOCKING_OK;' echo $'\t\t\t''pInitArgs = &localargs;' echo $'\t\t''}' echo $'\t''}' fi echo '' echo $'\t'"func = dlsym(libcackey_wrap_handle, \"${function}\");" echo '' if [ "${function}" = 'C_Finalize' ]; then echo $'\t'"retval = func($argNamesList);" echo '' echo $'\t''libcackey_wrap_fini();' echo '' echo $'\t''return(retval);' elif [ "${function}" = 'C_GetFunctionList' ]; then echo $'\t'"retval = func($argNamesList);" echo '' echo $'\t''if (retval == CKR_OK) {' echo $'\t\t''pFunctionList = *ppFunctionList;' for function in "${functionList[@]}"; do echo $'\t\t'"pFunctionList->${function} = ${function};" done echo $'\t''}' echo '' echo $'\t''return(retval);' else echo $'\t'"return(func($argNamesList));" fi echo '}' done |