From 3de5e59b291b6f58317bb16736f8c0271754378e Mon Sep 17 00:00:00 2001 From: Inaky Perez-Gonzalez Date: Sat, 2 Oct 2010 00:11:51 -0700 Subject: [PATCH] eap_peer: create a libeap library, with header files and pkg-config [v2] This adds infrastructe in src/eap_peer to make libeap.so and install the needed header files and pkg-config files. Now, this is quite dirty and probably not what we want in the long term, but serves as an starting point: - we don't build from the wpa_supplicant directory because the objects the .so have to be built with -fPIC. So if you need to build both the binary and the library: make -C wpa_supplicant make -C src/eap_peer clean make -C src/eap_peer As I said, it's dirty -- we'd need either wpa_supplicant linking against the library properly (but that seems not to be desirable) or a multiple object build approach ala automake. - need to use 'override CFLAGS' in src/eap_peer/Makefile, otherwise any CFLAGS setting will kill the build infrastructure. I miss AM_CFLAGS. - adds 'eap_register_methods()' that will register every compiled in method. Signed-off-by: Inaky Perez-Gonzalez --- build_release | 12 +++ src/eap_peer/Makefile | 191 ++++++++++++++++++++++++++++++++++++++++++-- src/eap_peer/eap_methods.c | 114 ++++++++++++++++++++++++++ src/eap_peer/eap_methods.h | 1 + src/eap_peer/libeap0.pc | 10 +++ 5 files changed, 320 insertions(+), 8 deletions(-) create mode 100644 src/eap_peer/libeap0.pc diff --git a/src/eap_peer/Makefile b/src/eap_peer/Makefile index 3651056..58c067a 100644 --- a/src/eap_peer/Makefile +++ b/src/eap_peer/Makefile @@ -1,11 +1,186 @@ -all: - @echo Nothing to be made. +LIBEAP_NAME = libeap +LIBEAP_CURRENT = 0 +LIBEAP_REVISION = 0 +LIBEAP_AGE = 0 + +LIBEAP = $(LIBEAP_NAME).so.$(LIBEAP_CURRENT).$(LIBEAP_REVISION).$(LIBEAP_AGE) +LIBEAP_SO = $(LIBEAP_NAME).so.$(LIBEAP_CURRENT) + +.PHONY: all clean install uninstall + +all: $(LIBEAP) + +ifndef CC +CC=gcc +endif + +ifndef CFLAGS +CFLAGS = -MMD -O0 -Wall -g +endif + +CONFIG_TLS=openssl + +INCLUDE_INSTALL_DIR=/usr/include/eap_peer + +# Got to use override all across the board, otherwise a 'make +# CFLAGS=XX' will kill us because the command line's CFLAGS will +# overwrite Make's and we'll loose all the infrastructure it sets. +override CFLAGS += -I. -I.. -I../crypto -I../utils -I../common + +# at least for now, need to include config_ssid.h and config_blob.h from +# wpa_supplicant directory +override CFLAGS += -I ../../wpa_supplicant + +OBJS_both += ../utils/common.o +OBJS_both += ../utils/os_unix.o +OBJS_both += ../utils/wpa_debug.o +OBJS_both += ../utils/base64.o +OBJS_both += ../utils/wpabuf.o +OBJS_both += ../crypto/md5.o +OBJS_both += ../crypto/sha1.o +OBJS_both += ../crypto/sha1-tlsprf.o +OBJS_both += ../crypto/aes-encblock.o +OBJS_both += ../crypto/aes-wrap.o +OBJS_both += ../crypto/aes-ctr.o +OBJS_both += ../crypto/aes-eax.o +OBJS_both += ../crypto/aes-omac1.o +OBJS_both += ../crypto/ms_funcs.o +OBJS_both += ../crypto/sha256.o + + +OBJS_both += ../eap_common/eap_peap_common.o +OBJS_both += ../eap_common/eap_psk_common.o +OBJS_both += ../eap_common/eap_pax_common.o +OBJS_both += ../eap_common/eap_sake_common.o +OBJS_both += ../eap_common/eap_gpsk_common.o +OBJS_both += ../eap_common/chap.o + +OBJS_peer += ../eap_peer/eap_tls.o +OBJS_peer += ../eap_peer/eap_peap.o +OBJS_peer += ../eap_peer/eap_ttls.o +OBJS_peer += ../eap_peer/eap_md5.o +OBJS_peer += ../eap_peer/eap_mschapv2.o +OBJS_peer += ../eap_peer/mschapv2.o +OBJS_peer += ../eap_peer/eap_otp.o +OBJS_peer += ../eap_peer/eap_gtc.o +OBJS_peer += ../eap_peer/eap_leap.o +OBJS_peer += ../eap_peer/eap_psk.o +OBJS_peer += ../eap_peer/eap_pax.o +OBJS_peer += ../eap_peer/eap_sake.o +OBJS_peer += ../eap_peer/eap_gpsk.o +OBJS_peer += ../eap_peer/eap.o +OBJS_peer += ../eap_common/eap_common.o +OBJS_peer += ../eap_peer/eap_methods.o +OBJS_peer += ../eap_peer/eap_tls_common.o + +override CFLAGS += -DEAP_TLS +override CFLAGS += -DEAP_PEAP +override CFLAGS += -DEAP_TTLS +override CFLAGS += -DEAP_MD5 +override CFLAGS += -DEAP_MSCHAPv2 +override CFLAGS += -DEAP_GTC +override CFLAGS += -DEAP_OTP +override CFLAGS += -DEAP_LEAP +override CFLAGS += -DEAP_PSK +override CFLAGS += -DEAP_PAX +override CFLAGS += -DEAP_SAKE +override CFLAGS += -DEAP_GPSK -DEAP_GPSK_SHA256 +override CFLAGS += -DEAP_TLS_FUNCS + +override CFLAGS += -DIEEE8021X_EAPOL + +ifeq ($(CONFIG_TLS), openssl) +override CFLAGS += -DEAP_TLS_OPENSSL +OBJS_both += ../crypto/tls_openssl.o +OBJS_both += ../crypto/crypto_openssl.o +LIBS += -lssl -lcrypto +override CFLAGS += -DINTERNAL_SHA256 +endif + +ifeq ($(CONFIG_TLS), internal) +OBJS_both += ../crypto/tls_internal.o +OBJS_both += ../tls/tlsv1_common.o ../../tls/tlsv1_record.o +OBJS_both += ../tls/tlsv1_cred.o +OBJS_both += ../tls/asn1.o ../../tls/x509v3.o +OBJS_both += ../crypto/crypto_internal.o ../../tls/rsa.o ../../tls/bignum.o + +OBJS_peer += ../tls/tlsv1_client.o +OBJS_peer += ../tls/tlsv1_client_write.o ../../tls/tlsv1_client_read.o +override CFLAGS += -DCONFIG_TLS_INTERNAL_CLIENT + +OBJS_server += ../tls/tlsv1_server.o +OBJS_server += ../tls/tlsv1_server_write.o ../../tls/tlsv1_server_read.o +override CFLAGS += -DCONFIG_TLS_INTERNAL_SERVER + +override CFLAGS += -DCONFIG_TLS_INTERNAL +override CFLAGS += -DCONFIG_CRYPTO_INTERNAL +override CFLAGS += -DCONFIG_INTERNAL_X509 +override CFLAGS += -DINTERNAL_AES +override CFLAGS += -DINTERNAL_SHA1 +override CFLAGS += -DINTERNAL_SHA256 +override CFLAGS += -DINTERNAL_MD5 +override CFLAGS += -DINTERNAL_MD4 +override CFLAGS += -DINTERNAL_DES +ifdef CONFIG_INTERNAL_LIBTOMMATH +override CFLAGS += -DCONFIG_INTERNAL_LIBTOMMATH +else +LIBS += -ltommath +endif +endif + +ifndef LDO +LDO=$(CC) +endif + + +OBJS_lib=$(OBJS_both) $(OBJS_peer) + + #$(OBJS_server) + +override CFLAGS += -fPIC -DPIC +LDFLAGS += -shared + +$(LIBEAP): $(OBJS_lib) + $(LDO) $(LDFLAGS) $(OBJS_lib) -Wl,-soname -Wl,$(LIBEAP_SO) -o $(LIBEAP) $(LIBS) + + +UTIL_HEADERS = ../utils/includes.h ../utils/common.h \ + ../utils/wpabuf.h ../utils/build_config.h \ + ../utils/os.h ../utils/wpa_debug.h +COMMON_HEADERS = ../common/defs.h +EAP_COMMON_HEADERS = ../eap_common/eap_defs.h +MAIN_HEADERS = eap.h eap_methods.h eap_config.h +CRYPTO_HEADERS = ../crypto/tls.h + +install: + + mkdir -p $(DESTDIR)/usr/lib +# copy the lib file to std lib location + cp $(LIBEAP) $(DESTDIR)/usr/lib + ln -fs $(LIBEAP) $(DESTDIR)/usr/lib/$(LIBEAP_SO) + ln -fs $(LIBEAP_SO) $(DESTDIR)/usr/lib/$(LIBEAP_NAME).so + +# copy the headers reqd by apps using eap peer library in its own subfolder under /usr/include + mkdir -p \ + $(DESTDIR)/$(INCLUDE_INSTALL_DIR)/eap_common \ + $(DESTDIR)/$(INCLUDE_INSTALL_DIR)/common \ + $(DESTDIR)/$(INCLUDE_INSTALL_DIR)/util \ + $(DESTDIR)/$(INCLUDE_INSTALL_DIR)/crypto + install -m 0644 $(EAP_COMMON_HEADERS) $(DESTDIR)/$(INCLUDE_INSTALL_DIR)/eap_common + install -m 0644 $(COMMON_HEADERS) $(DESTDIR)/$(INCLUDE_INSTALL_DIR)/common + install -m 0644 $(CRYPTO_HEADERS) $(DESTDIR)/$(INCLUDE_INSTALL_DIR)/crypto + install -m 0644 $(UTIL_HEADERS) $(DESTDIR)/$(INCLUDE_INSTALL_DIR)/util + install -m 0644 $(MAIN_HEADERS) $(DESTDIR)/$(INCLUDE_INSTALL_DIR)/ + + mkdir -p $(DESTDIR)/usr/lib/pkgconfig + cp libeap0.pc $(DESTDIR)/usr/lib/pkgconfig + +uninstall: + + rm $(DESTDIR)/usr/lib/$(LIBEAP) + rm -fr $(DESTDIR)/$(INCLUDE_INSTALL_DIR) + rm -f $(DESTDIR)/usr/lib/pkgconfig/libeap0.pc clean: - rm -f *~ *.o *.so *.d + rm -f *~ *.o *.so *.d libeap.a $(LIBEAP) $(OBJS_lib) -install: - if ls *.so >/dev/null 2>&1; then \ - install -d $(DESTDIR)$(LIBDIR)/wpa_supplicant && \ - cp *.so $(DESTDIR)$(LIBDIR)/wpa_supplicant \ - ; fi +-include $(OBJS:%.o=%.d) diff --git a/src/eap_peer/eap_methods.c b/src/eap_peer/eap_methods.c index 3b0af05..092f266 100644 --- a/src/eap_peer/eap_methods.c +++ b/src/eap_peer/eap_methods.c @@ -340,6 +340,120 @@ int eap_peer_method_register(struct eap_method *method) /** + * eap_peer_register_methods - Register all known EAP peer methods + * + * This function is called at program start to register all compiled + * in EAP peer methods. + */ +int eap_peer_register_methods(void) +{ + int ret = 0; + +#ifdef EAP_MD5 + if (ret == 0) + ret = eap_peer_md5_register(); +#endif /* EAP_MD5 */ + +#ifdef EAP_TLS + if (ret == 0) + ret = eap_peer_tls_register(); +#endif /* EAP_TLS */ + +#ifdef EAP_MSCHAPv2 + if (ret == 0) + ret = eap_peer_mschapv2_register(); +#endif /* EAP_MSCHAPv2 */ + +#ifdef EAP_PEAP + if (ret == 0) + ret = eap_peer_peap_register(); +#endif /* EAP_PEAP */ + +#ifdef EAP_TTLS + if (ret == 0) + ret = eap_peer_ttls_register(); +#endif /* EAP_TTLS */ + +#ifdef EAP_GTC + if (ret == 0) + ret = eap_peer_gtc_register(); +#endif /* EAP_GTC */ + +#ifdef EAP_OTP + if (ret == 0) + ret = eap_peer_otp_register(); +#endif /* EAP_OTP */ + +#ifdef EAP_SIM + if (ret == 0) + ret = eap_peer_sim_register(); +#endif /* EAP_SIM */ + +#ifdef EAP_LEAP + if (ret == 0) + ret = eap_peer_leap_register(); +#endif /* EAP_LEAP */ + +#ifdef EAP_PSK + if (ret == 0) + ret = eap_peer_psk_register(); +#endif /* EAP_PSK */ + +#ifdef EAP_AKA + if (ret == 0) + ret = eap_peer_aka_register(); +#endif /* EAP_AKA */ + +#ifdef EAP_AKA_PRIME + if (ret == 0) + ret = eap_peer_aka_prime_register(); +#endif /* EAP_AKA_PRIME */ + +#ifdef EAP_FAST + if (ret == 0) + ret = eap_peer_fast_register(); +#endif /* EAP_FAST */ + +#ifdef EAP_PAX + if (ret == 0) + ret = eap_peer_pax_register(); +#endif /* EAP_PAX */ + +#ifdef EAP_SAKE + if (ret == 0) + ret = eap_peer_sake_register(); +#endif /* EAP_SAKE */ + +#ifdef EAP_GPSK + if (ret == 0) + ret = eap_peer_gpsk_register(); +#endif /* EAP_GPSK */ + +#ifdef EAP_WSC + if (ret == 0) + ret = eap_peer_wsc_register(); +#endif /* EAP_WSC */ + +#ifdef EAP_IKEV2 + if (ret == 0) + ret = eap_peer_ikev2_register(); +#endif /* EAP_IKEV2 */ + +#ifdef EAP_VENDOR_TEST + if (ret == 0) + ret = eap_peer_vendor_test_register(); +#endif /* EAP_VENDOR_TEST */ + +#ifdef EAP_TNC + if (ret == 0) + ret = eap_peer_tnc_register(); +#endif /* EAP_TNC */ + + return ret; +} + + +/** * eap_peer_unregister_methods - Unregister EAP peer methods * * This function is called at program termination to unregister all EAP peer diff --git a/src/eap_peer/eap_methods.h b/src/eap_peer/eap_methods.h index 384c61b..b83a46f 100644 --- a/src/eap_peer/eap_methods.h +++ b/src/eap_peer/eap_methods.h @@ -32,6 +32,7 @@ EapType eap_peer_get_type(const char *name, int *vendor); const char * eap_get_name(int vendor, EapType type); size_t eap_get_names(char *buf, size_t buflen); char ** eap_get_names_as_string_array(size_t *num); +int eap_peer_register_methods(void); void eap_peer_unregister_methods(void); #else /* IEEE8021X_EAPOL */ diff --git a/src/eap_peer/libeap0.pc b/src/eap_peer/libeap0.pc new file mode 100644 index 0000000..2f8463a --- /dev/null +++ b/src/eap_peer/libeap0.pc @@ -0,0 +1,10 @@ +prefix=/usr +exec_prefix=/usr +libdir=${exec_prefix}/lib +includedir=${prefix}/include/eap_peer + +Name: libeap0 +Description: EAP Peer Library API +Version: 0.7.2 +Libs: -L${libdir} -leap +Cflags: -I${includedir} -- 1.6.6.1