Check-in [3b7b2eddb4]
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: branch diff | 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
#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;








>
>
>
>


>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







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













		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;
}



















|















>
>
>
>
>
>
>
>
>
>
>
>
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/" 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
16
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=''
	for argName in "${argNames[@]}"; do
		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
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
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=''
	for argName in "${argNames[@]}"; do
		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