Changes On Branch better-wrapping

Changes In Branch better-wrapping Excluding Merge-Ins

This is equivalent to a diff from 9043258dc4 to 3fdad99785

2018-08-24
21:33
Updated URL for RPM spec file check-in: 1efa305922 user: rkeene tags: trunk
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
2017-12-27
18:59
CACKey 0.7.9 check-in: ac7bd0bf8f user: rkeene tags: trunk

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 [8cdc000c32].

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
#define _GNU_SOURCE
#include <dlfcn.h>

#include "config.h"

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define CK_PTR *
#define CK_DEFINE_FUNCTION(returnType, name) returnType name
#define CK_DECLARE_FUNCTION(returnType, name) returnType name
#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) {





|
|
|












>
>
>
>
>
>
>

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







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
97
98
99
#define _GNU_SOURCE
#include <dlfcn.h>

#include "config.h"

#include <string.h>
#include <stdio.h>
#include <time.h>

#define CK_PTR *
#define CK_DEFINE_FUNCTION(returnType, name) returnType name
#define CK_DECLARE_FUNCTION(returnType, name) returnType name
#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

void abort(void);
void free(void *ptr);

static void *libcackey_wrap_handle = NULL_PTR;

typedef enum {
	LIBCACKEY_WRAP_MUTEX_UNINIT = 0,
	LIBCACKEY_WRAP_MUTEX_INIT,
	LIBCACKEY_WRAP_MUTEX_UNLOCKED,
	LIBCACKEY_WRAP_MUTEX_LOCKED,
} libcackey_wrap_mutexes_states_t;
static libcackey_wrap_mutexes_states_t libcackey_wrap_mutexes[16] = {LIBCACKEY_WRAP_MUTEX_UNINIT};

typedef libcackey_wrap_mutexes_states_t *pthread_mutex_t;
typedef int pthread_mutexattr_t;

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr) {
	libcackey_wrap_mutexes_states_t *mutex_;
	int idx;

	for (idx = 0; idx < (sizeof(libcackey_wrap_mutexes) / sizeof(libcackey_wrap_mutexes[0])); idx++) {
		if (libcackey_wrap_mutexes[idx] == LIBCACKEY_WRAP_MUTEX_UNINIT) {
			libcackey_wrap_mutexes[idx] = LIBCACKEY_WRAP_MUTEX_INIT;
			mutex_ = &libcackey_wrap_mutexes[idx];
			break;
		}
	}

	if (!mutex_) {
		return(1);
	}

	*mutex = mutex_;

	return(0);
}

int pthread_mutex_destroy(pthread_mutex_t *mutex) {
	**mutex = LIBCACKEY_WRAP_MUTEX_UNINIT;

	return(0);
}

int pthread_mutex_lock(pthread_mutex_t *mutex) {
	struct timespec sleeptime;

	while (**mutex == LIBCACKEY_WRAP_MUTEX_LOCKED) {
		sleeptime.tv_sec = 0;
		sleeptime.tv_nsec = 1000000;
		nanosleep(&sleeptime, NULL);
fprintf(stderr, "mutex %p is locked\n", mutex); fflush(stderr);
		/* Do nothing */
	}

fprintf(stderr, "locking mutex %p\n", mutex); fflush(stderr);
	**mutex = LIBCACKEY_WRAP_MUTEX_LOCKED;
fprintf(stderr, "locked mutex %p\n", mutex); fflush(stderr);

	return(CKR_OK);
}

int pthread_mutex_unlock(pthread_mutex_t *mutex) {
fprintf(stderr, "unlocking mutex %p\n", mutex); fflush(stderr);
	**mutex = LIBCACKEY_WRAP_MUTEX_UNLOCKED;
fprintf(stderr, "unlocked mutex %p\n", mutex); fflush(stderr);

	return(CKR_OK);
}

static void libcackey_wrap_init(void) {
	Dl_info libinfo;
	int dladdr_ret;
	char *library, *libraryDir, *libraryDirLastSlash;

	if (libcackey_wrap_handle) {
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;
}



















|


>













>
>
>
>
>
>
>
>
>
>
>
>
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159

		abort();

		return;
	}
	*libraryDirLastSlash = '\0';

	asprintf(&library, "%s/" CACKEY_LIBRARY_FILE, libraryDir);

	libcackey_wrap_handle = dlmopen(LM_ID_NEWLM, library, RTLD_LOCAL | RTLD_NOW);
	libcackey_wrap_handle = dlmopen(LM_ID_NEWLM, , 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 [d43bff44b6].

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
#! /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_GetFunctionList)
			echo $'\t''CK_RV retval;'
			echo $'\t''CK_FUNCTION_LIST_PTR pFunctionList;'
			;;
	esac

	echo ''
	echo $'\t''libcackey_wrap_init();'

	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

Modified test.c from [b3c16cba8c] to [b9686fc1be].

553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
			if ((tokenInfo.flags & CKF_SO_PIN_TO_BE_CHANGED) == CKF_SO_PIN_TO_BE_CHANGED) {
				printf("CKF_SO_PIN_TO_BE_CHANGED ");
			}
			printf("\n");
		}
	}

	chk_rv = C_OpenSession(slots[0], CKF_SERIAL_SESSION, NULL, NULL, &hSession);
	if (chk_rv == CKR_OK) {
		chk_rv = C_GetTokenInfo(slots[0], &tokenInfo);
		if (chk_rv != CKR_OK) {
			return(1);
		}

		if ((tokenInfo.flags & CKF_LOGIN_REQUIRED) == CKF_LOGIN_REQUIRED && (tokenInfo.flags & CKF_PROTECTED_AUTHENTICATION_PATH) == 0) {
			fgets_ret = NULL;








|

|







553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
			if ((tokenInfo.flags & CKF_SO_PIN_TO_BE_CHANGED) == CKF_SO_PIN_TO_BE_CHANGED) {
				printf("CKF_SO_PIN_TO_BE_CHANGED ");
			}
			printf("\n");
		}
	}

	chk_rv = C_OpenSession(slots[1], CKF_SERIAL_SESSION, NULL, NULL, &hSession);
	if (chk_rv == CKR_OK) {
		chk_rv = C_GetTokenInfo(slots[1], &tokenInfo);
		if (chk_rv != CKR_OK) {
			return(1);
		}

		if ((tokenInfo.flags & CKF_LOGIN_REQUIRED) == CKF_LOGIN_REQUIRED && (tokenInfo.flags & CKF_PROTECTED_AUTHENTICATION_PATH) == 0) {
			fgets_ret = NULL;