Changes On Branch runtime-loading-of-deps

Changes In Branch runtime-loading-of-deps Excluding Merge-Ins

This is equivalent to a diff from 0c7c510048 to e14e862239

2017-12-27
18:54
Integrated dlmopen() wrapper library (not for general use) check-in: 59356166dc user: rkeene tags: trunk
18:48
Added a wrapper PKCS#11 module which uses GNU dlmopen to segregate loading cackey and its libraries to avoid issues with different linkspaces Closed-Leaf check-in: 45c70bc44d user: rkeene tags: dlopen-wrapper
17:59
Started work on updating DOD certs Leaf check-in: ff2eb37b0a user: rkeene tags: update-dod-certs
17:52
Started work on runtime loading of dependencies Leaf check-in: e14e862239 user: rkeene tags: runtime-loading-of-deps
2017-07-17
13:56
Updated to treat returning a zero-length signed message as an error check-in: 0c7c510048 user: rkeene tags: trunk
13:56
Corrected typo causing debug builds to fail check-in: d02f2af7a5 user: rkeene tags: trunk

Modified aclocal/Makefile from [2810947b90] to [7b6874b298].

1

2

1
2
-
+

../aclocal.m4: acx_pthread.m4 dc_shobjs.m4 dc_pcsc.m4 dc_versionscript.m4
../aclocal.m4: acx_pthread.m4 dc_shobjs.m4 dc_pcsc.m4 dc_versionscript.m4 dc_dlfuncs.m4
	cat $^ > "$@"

Added aclocal/dc_dlfuncs.m4 version [d34cc673cd].






















1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
AC_DEFUN([DC_DLFUNCS], [
	dnl Check for dl headers and functions
	AC_CHECK_HEADERS(dlfcn.h)
	if test -n "${ac_cv_func_dlsym}"; then
		AC_CHECK_FUNC(dlsym, [
			AC_DEFINE([HAVE_DLSYM], [1], [Have dlsym()])
		])
	else
		SAVE_LIBS="${LIBS}"
		for addlibs in '' '-ldl'; do
			LIBS="${SAVE_LIBS} ${addlibs}"
			unset ac_cv_func_dlsym
			AC_CHECK_FUNC(dlsym, [
				AC_DEFINE([HAVE_DLSYM], [1], [Have dlsym()])
				SAVE_LIBS="${LIBS}"
				break
			])
		done
		LIBS="${SAVE_LIBS}"
	fi
])

Modified cackey.c from [de5cf6edd0] to [47e7747ccc].

43
44
45
46
47
48
49








50
51
52
53
54
55
56
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64







+
+
+
+
+
+
+
+







#  ifdef HAVE_LIBZ
#    include <zlib.h>
#  endif
#else
#  ifdef HAVE_LIBZ
#    undef HAVE_LIBZ
#  endif
#endif
#ifndef _THREAD_EMULATION
#  ifdef HAVE_DLFCN_H
#    ifdef HAVE_DLSYM
#      include <dlfcn.h>
#      define HAVE_CACKEY_MUTEX_PTHREAD_FUNCS 1
#    endif
#  endif
#endif
#ifdef CACKEY_DEBUG_SEARCH_SPEEDTEST
#  include <sys/time.h>
#endif

#define CK_PTR *
#define CK_DEFINE_FUNCTION(returnType, name) returnType name
3734
3735
3736
3737
3738
3739
3740


































3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758

3759
3760
3761
3762
3763
3764
3765
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799

3800
3801
3802
3803
3804
3805
3806
3807







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

















-
+







		return(-1);
	}
#  endif
#endif

	return(x509_read_ret);
}

/* Dynamically load pthreads from the running application */
#ifdef HAVE_CACKEY_MUTEX_PTHREAD_FUNCS
#warning building with pthreads opened via dlsym
struct cackey_mutex_pthread_funcs_st {
	int (*pthread_mutex_init)(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
	int (*pthread_mutex_lock)(pthread_mutex_t *mutex);
	int (*pthread_mutex_unlock)(pthread_mutex_t *mutex);
};

static struct cackey_mutex_pthread_funcs_st *cackey_mutex_pthread_funcs(void) {
	static struct cackey_mutex_pthread_funcs_st funcs = {0};
	static int init = 0;

	if (init != 0) {
		return(&funcs);
	}

	funcs.pthread_mutex_init = dlsym(RTLD_DEFAULT, "pthread_mutex_init");
	funcs.pthread_mutex_lock = dlsym(RTLD_DEFAULT, "pthread_mutex_lock");
	funcs.pthread_mutex_unlock = dlsym(RTLD_DEFAULT, "pthread_mutex_unlock");

	init = 1;

	return(&funcs);
}
#define cackey_pthread_mutex_init cackey_mutex_pthread_funcs()->pthread_mutex_init
#define cackey_pthread_mutex_lock cackey_mutex_pthread_funcs()->pthread_mutex_lock
#define cackey_pthread_mutex_unlock cackey_mutex_pthread_funcs()->pthread_mutex_unlock
#else
#define cackey_pthread_mutex_init pthread_mutex_init
#define cackey_pthread_mutex_lock pthread_mutex_lock
#define cackey_pthread_mutex_unlock pthread_mutex_unlock
#endif

/* Returns 0 on success */
static int cackey_mutex_create(void **mutex) {
	pthread_mutex_t *pthread_mutex;
	int pthread_retval;
	CK_RV custom_retval;

	CACKEY_DEBUG_PRINTF("Called.");

	if ((cackey_args.flags & CKF_OS_LOCKING_OK) == CKF_OS_LOCKING_OK) {
		pthread_mutex = malloc(sizeof(*pthread_mutex));
		if (!pthread_mutex) {
			CACKEY_DEBUG_PRINTF("Failed to allocate memory.");

			return(-1);
		}

		pthread_retval = pthread_mutex_init(pthread_mutex, NULL);
		pthread_retval = cackey_pthread_mutex_init(pthread_mutex, NULL);
		if (pthread_retval != 0) {
			CACKEY_DEBUG_PRINTF("pthread_mutex_init() returned error (%i).", pthread_retval);

			return(-1);
		}

		*mutex = pthread_mutex;
3787
3788
3789
3790
3791
3792
3793
3794

3795
3796
3797
3798
3799
3800
3801
3829
3830
3831
3832
3833
3834
3835

3836
3837
3838
3839
3840
3841
3842
3843







-
+







	CK_RV custom_retval;

	CACKEY_DEBUG_PRINTF("Called.");

	if ((cackey_args.flags & CKF_OS_LOCKING_OK) == CKF_OS_LOCKING_OK) {
		pthread_mutex = mutex;

		pthread_retval = pthread_mutex_lock(pthread_mutex);
		pthread_retval = cackey_pthread_mutex_lock(pthread_mutex);
		if (pthread_retval != 0) {
			CACKEY_DEBUG_PRINTF("pthread_mutex_lock() returned error (%i).", pthread_retval);

			return(-1);
		}
	} else {
		if (cackey_args.LockMutex) {
3821
3822
3823
3824
3825
3826
3827
3828

3829
3830
3831
3832
3833
3834
3835
3863
3864
3865
3866
3867
3868
3869

3870
3871
3872
3873
3874
3875
3876
3877







-
+







	CK_RV custom_retval;

	CACKEY_DEBUG_PRINTF("Called.");

	if ((cackey_args.flags & CKF_OS_LOCKING_OK) == CKF_OS_LOCKING_OK) {
		pthread_mutex = mutex;

		pthread_retval = pthread_mutex_unlock(pthread_mutex);
		pthread_retval = cackey_pthread_mutex_unlock(pthread_mutex);
		if (pthread_retval != 0) {
			CACKEY_DEBUG_PRINTF("pthread_mutex_unlock() returned error (%i).", pthread_retval);

			return(-1);
		}
	} else {
		if (cackey_args.UnlockMutex) {
4614
4615
4616
4617
4618
4619
4620








4621
4622
4623
4624
4625
4626
4627
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677







+
+
+
+
+
+
+
+








		if (args->CreateMutex == NULL || args->DestroyMutex == NULL || args->LockMutex == NULL || args->UnlockMutex == NULL) {
			if (args->CreateMutex != NULL || args->DestroyMutex != NULL || args->LockMutex != NULL || args->UnlockMutex != NULL) {
				CACKEY_DEBUG_PRINTF("Error. Some, but not All threading primitives provided.");

				return(CKR_ARGUMENTS_BAD);
			}
		} else {
#ifdef HAVE_CACKEY_MUTEX_PTHREAD_FUNCS
			if (cackey_mutex_pthread_funcs()->pthread_mutex_init == NULL || cackey_mutex_pthread_funcs()->pthread_mutex_lock == NULL || cackey_mutex_pthread_funcs()->pthread_mutex_unlock == NULL) {
				CACKEY_DEBUG_PRINTF("Error. Library is not linked to pthreads and we are unable to find them at runtime.");

				return(CKR_GENERAL_ERROR);
			}
#endif
		}
	} else {
		cackey_args.CreateMutex = NULL;
		cackey_args.DestroyMutex = NULL;
		cackey_args.LockMutex = NULL;
		cackey_args.UnlockMutex = NULL;
		cackey_args.flags = 0;

Modified configure.ac from [a419c60439] to [383d36814d].

77
78
79
80
81
82
83



84
85
86
87
88
89
90
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93







+
+
+







])

dnl Check for PC/SC headers and libraries
DC_PCSC

dnl Check for ZLIB libraries
AC_CHECK_LIB(z, uncompress)

dnl Check for dl headers and functions
DC_DLFUNCS

dnl Verify that a basic program will compile
AC_CACHE_CHECK([if basic PC/SC program works], cackey_cv_pcsc_works, [
	AC_LINK_IFELSE(
		AC_LANG_PROGRAM([[
#ifdef HAVE_WINTYPES_H
#  include <wintypes.h>