From 1a4287061524e992aea56af01ee3550d9aa9495d Mon Sep 17 00:00:00 2001 From: Klas Lindfors Date: Mon, 16 Jun 2014 10:22:05 +0200 Subject: [PATCH] start of the ykpiv library --- Makefile.am | 2 +- configure.ac | 14 ++++ lib/Makefile.am | 49 ++++++++++++++ lib/version.c | 142 ++++++++++++++++++++++++++++++++++++++++ lib/ykpiv-version.h.in | 91 +++++++++++++++++++++++++ lib/ykpiv.c | 28 ++++++++ lib/ykpiv.h | 42 ++++++++++++ lib/ykpiv.map | 34 ++++++++++ lib/ykpiv.pc.in | 12 ++++ m4/ld-version-script.m4 | 53 +++++++++++++++ 10 files changed, 466 insertions(+), 1 deletion(-) create mode 100644 lib/Makefile.am create mode 100644 lib/version.c create mode 100644 lib/ykpiv-version.h.in create mode 100644 lib/ykpiv.c create mode 100644 lib/ykpiv.h create mode 100644 lib/ykpiv.map create mode 100644 lib/ykpiv.pc.in create mode 100644 m4/ld-version-script.m4 diff --git a/Makefile.am b/Makefile.am index 3ff81f3..566d588 100644 --- a/Makefile.am +++ b/Makefile.am @@ -24,7 +24,7 @@ # non-source form of such a combination shall include the source code # for the parts of OpenSSL used as well as that of the covered work. -SUBDIRS = tool tests +SUBDIRS = lib tool tests ACLOCAL_AMFLAGS = -I m4 diff --git a/configure.ac b/configure.ac index dd587c0..6c7b113 100644 --- a/configure.ac +++ b/configure.ac @@ -28,9 +28,18 @@ AC_INIT([yubico-piv-tool], [0.0.4]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([m4]) +# Library code modified: REVISION++ +# Interfaces changed/added/removed: CURRENT++ REVISION=0 +# Interfaces added: AGE++ +# Interfaces removed: AGE=0 +AC_SUBST([LT_CURRENT], 0) +AC_SUBST([LT_REVISION], 0) +AC_SUBST([LT_AGE], 0) + AM_INIT_AUTOMAKE([-Wall -Werror foreign]) AM_SILENT_RULES([yes]) AC_PROG_CC +m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) AC_LIBTOOL_WIN32_DLL AC_PROG_LIBTOOL @@ -39,6 +48,8 @@ PKG_PROG_PKG_CONFIG PKG_CHECK_MODULES(OPENSSL, openssl) +gl_LD_VERSION_SCRIPT + AC_ARG_WITH([backend], [AS_HELP_STRING([--with-backend=ARG], [use specific backend/linkage; 'pcsc', 'macscard' or 'winscard'])], @@ -136,8 +147,11 @@ fi AC_CONFIG_FILES([ Makefile + lib/Makefile tool/Makefile tests/Makefile + lib/ykpiv-version.h + lib/ykpiv.pc ]) AC_OUTPUT diff --git a/lib/Makefile.am b/lib/Makefile.am new file mode 100644 index 0000000..2fddc41 --- /dev/null +++ b/lib/Makefile.am @@ -0,0 +1,49 @@ +# Copyright (c) 2014 Yubico AB +# All rights reserved. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# Additional permission under GNU GPL version 3 section 7 +# +# If you modify this program, or any covered work, by linking or +# combining it with the OpenSSL project's OpenSSL library (or a +# modified version of that library), containing parts covered by the +# terms of the OpenSSL or SSLeay licenses, We grant you additional +# permission to convey the resulting work. Corresponding Source for a +# non-source form of such a combination shall include the source code +# for the parts of OpenSSL used as well as that of the covered work. + +AM_CFLAGS = $(WERROR_CFLAGS) $(WARN_CFLAGS) +AM_CPPFLAGS = $(OPENSSL_CFLAGS) $(PCSC_CFLAGS) + +lib_LTLIBRARIES = libykpiv.la + +libykpiv_la_SOURCES = ykpiv.c version.c ykpiv.pc.in ykpiv.map +libykpiv_la_includedir = $(includedir)/ykpiv +libykpiv_la_include_HEADERS = ykpiv.h ykpiv-version.h + +libykpiv_la_LIBADD = $(OPENSSL_LIBS) $(PCSC_LIBS) +libykpiv_la_LIBADD += $(LTLIBWINSCARD) $(PCSC_MACOSX_LIBS) + +libykpiv_la_LDFLAGS = -no-undefined +libykpiv_la_LDFLAGS += -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) + +if HAVE_LD_VERSION_SCRIPT +libykpiv_la_LDFLAGS += -Wl,--version-script=$(srcdir)/ykpiv.map +else +libykpiv_la_LDFLAGS += -export-symbols-regex '^ykpiv_.*' +endif + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = ykpiv.pc diff --git a/lib/version.c b/lib/version.c new file mode 100644 index 0000000..50071d1 --- /dev/null +++ b/lib/version.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2014 Yubico AB + * All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Additional permission under GNU GPL version 3 section 7 + * + * If you modify this program, or any covered work, by linking or + * combining it with the OpenSSL project's OpenSSL library (or a + * modified version of that library), containing parts covered by the + * terms of the OpenSSL or SSLeay licenses, We grant you additional + * permission to convey the resulting work. Corresponding Source for a + * non-source form of such a combination shall include the source code + * for the parts of OpenSSL used as well as that of the covered work. + * + */ + +#include "ykpiv-version.h" + +#include + +#include + +/* From http://article.gmane.org/gmane.os.freebsd.devel.hackers/23606 */ +static int my_strverscmp (const char *s1, const char *s2) +{ + static const char *digits = "0123456789"; + int ret, lz1, lz2; + size_t p1, p2; + + p1 = strcspn (s1, digits); + p2 = strcspn (s2, digits); + while (p1 == p2 && s1[p1] != '\0' && s2[p2] != '\0') { + /* Different prefix */ + if ((ret = strncmp (s1, s2, p1)) != 0) + return ret; + + s1 += p1; + s2 += p2; + + lz1 = lz2 = 0; + if (*s1 == '0') + lz1 = 1; + if (*s2 == '0') + lz2 = 1; + + if (lz1 > lz2) + return -1; + else if (lz1 < lz2) + return 1; + else if (lz1 == 1) { + /* + * If the common prefix for s1 and s2 consists only of zeros, then the + * "longer" number has to compare less. Otherwise the comparison needs + * to be numerical (just fallthrough). See + * http://refspecs.freestandards.org/LSB_2.0.1/LSB-generic/ + * LSB-generic/baselib-strverscmp.html + */ + while (*s1 == '0' && *s2 == '0') { + ++s1; + ++s2; + } + + p1 = strspn (s1, digits); + p2 = strspn (s2, digits); + + /* Catch empty strings */ + if (p1 == 0 && p2 > 0) + return 1; + else if (p2 == 0 && p1 > 0) + return -1; + + /* Prefixes are not same */ + if (*s1 != *s2 && *s1 != '0' && *s2 != '0') { + if (p1 < p2) + return 1; + else if (p1 > p2) + return -1; + } else { + if (p1 < p2) + ret = strncmp (s1, s2, p1); + else if (p1 > p2) + ret = strncmp (s1, s2, p2); + if (ret != 0) + return ret; + } + } + + p1 = strspn (s1, digits); + p2 = strspn (s2, digits); + + if (p1 < p2) + return -1; + else if (p1 > p2) + return 1; + else if ((ret = strncmp (s1, s2, p1)) != 0) + return ret; + + /* Numbers are equal or not present, try with next ones. */ + s1 += p1; + s2 += p2; + p1 = strcspn (s1, digits); + p2 = strcspn (s2, digits); + } + + return strcmp (s1, s2); +} + +/** + * ykpiv_check_version: + * @req_version: Required version number, or NULL. + * + * Check that the version of the library is at minimum the requested + * one and return the version string; return NULL if the condition is + * not satisfied. If a NULL is passed to this function, no check is + * done, but the version string is simply returned. + * + * See %YKPIV_VERSION_STRING for a suitable @req_version string. + * + * Return value: Version string of run-time library, or NULL if the + * run-time library does not meet the required version number. + */ +const char * ykpiv_check_version (const char *req_version) +{ + if (!req_version + || my_strverscmp (req_version, YKPIV_VERSION_STRING) <= 0) + return YKPIV_VERSION_STRING; + + return NULL; +} diff --git a/lib/ykpiv-version.h.in b/lib/ykpiv-version.h.in new file mode 100644 index 0000000..acf8af5 --- /dev/null +++ b/lib/ykpiv-version.h.in @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2014 Yubico AB + * All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Additional permission under GNU GPL version 3 section 7 + * + * If you modify this program, or any covered work, by linking or + * combining it with the OpenSSL project's OpenSSL library (or a + * modified version of that library), containing parts covered by the + * terms of the OpenSSL or SSLeay licenses, We grant you additional + * permission to convey the resulting work. Corresponding Source for a + * non-source form of such a combination shall include the source code + * for the parts of OpenSSL used as well as that of the covered work. + * + */ + +#ifndef YKPIV_VERSION_H +#define YKPIV_VERSION_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * YKPIV_VERSION_STRING + * + * Pre-processor symbol with a string that describe the header file + * version number. Used together with ykneomgr_check_version() to verify + * header file and run-time library consistency. + */ +#define YKPIV_VERSION_STRING "@VERSION@" + + /** + * YKPIV_VERSION_NUMBER + * + * Pre-processor symbol with a hexadecimal value describing the header + * file version number. For example, when the header version is 1.2.3 + * this symbol will have the value 0x01020300. The last two digits + * are only used between public releases, and will otherwise be 00. + */ +#define YKPIV_VERSION_NUMBER @YKPIV_VERSION_NUMBER@ + + /** + * YKPIV_VERSION_MAJOR + * + * Pre-processor symbol with a decimal value that describe the major + * level of the header file version number. For example, when the + * header version is 1.2.3 this symbol will be 1. + */ +#define YKPIV_VERSION_MAJOR @YKPIV_VERSION_MAJOR@ + + /** + * YKPIV_VERSION_MINOR + * + * Pre-processor symbol with a decimal value that describe the minor + * level of the header file version number. For example, when the + * header version is 1.2.3 this symbol will be 2. + */ +#define YKPIV_VERSION_MINOR @YKPIV_VERSION_MINOR@ + + /** + * YKPIV_VERSION_PATCH + * + * Pre-processor symbol with a decimal value that describe the patch + * level of the header file version number. For example, when the + * header version is 1.2.3 this symbol will be 3. + */ +#define YKPIV_VERSION_PATCH @YKPIV_VERSION_PATCH@ + + const char *ykpiv_check_version (const char *req_version); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/ykpiv.c b/lib/ykpiv.c new file mode 100644 index 0000000..312531b --- /dev/null +++ b/lib/ykpiv.c @@ -0,0 +1,28 @@ + /* + * Copyright (c) 2014 Yubico AB + * All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Additional permission under GNU GPL version 3 section 7 + * + * If you modify this program, or any covered work, by linking or + * combining it with the OpenSSL project's OpenSSL library (or a + * modified version of that library), containing parts covered by the + * terms of the OpenSSL or SSLeay licenses, We grant you additional + * permission to convey the resulting work. Corresponding Source for a + * non-source form of such a combination shall include the source code + * for the parts of OpenSSL used as well as that of the covered work. + * + */ diff --git a/lib/ykpiv.h b/lib/ykpiv.h new file mode 100644 index 0000000..b4f2a8c --- /dev/null +++ b/lib/ykpiv.h @@ -0,0 +1,42 @@ + /* + * Copyright (c) 2014 Yubico AB + * All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Additional permission under GNU GPL version 3 section 7 + * + * If you modify this program, or any covered work, by linking or + * combining it with the OpenSSL project's OpenSSL library (or a + * modified version of that library), containing parts covered by the + * terms of the OpenSSL or SSLeay licenses, We grant you additional + * permission to convey the resulting work. Corresponding Source for a + * non-source form of such a combination shall include the source code + * for the parts of OpenSSL used as well as that of the covered work. + * + */ + +#ifndef YKPIV_H +#define YKPIV_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/ykpiv.map b/lib/ykpiv.map new file mode 100644 index 0000000..a4a66a4 --- /dev/null +++ b/lib/ykpiv.map @@ -0,0 +1,34 @@ +# Copyright (c) 2014 Yubico AB +# All rights reserved. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# Additional permission under GNU GPL version 3 section 7 +# +# If you modify this program, or any covered work, by linking or +# combining it with the OpenSSL project's OpenSSL library (or a +# modified version of that library), containing parts covered by the +# terms of the OpenSSL or SSLeay licenses, We grant you additional +# permission to convey the resulting work. Corresponding Source for a +# non-source form of such a combination shall include the source code +# for the parts of OpenSSL used as well as that of the covered work. + +YKPIV_0.1.0 +{ +global: + ykpiv_check_version; + +local: + *; +}; diff --git a/lib/ykpiv.pc.in b/lib/ykpiv.pc.in new file mode 100644 index 0000000..fc8e8c3 --- /dev/null +++ b/lib/ykpiv.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: @PACKAGE@ +Description: Yubico PIV C Library +URL: https://www.yubico.com/ +Version: @VERSION@ +Libs: -L${libdir} -lykpiv +Cflags: -I${includedir}/ykpiv + diff --git a/m4/ld-version-script.m4 b/m4/ld-version-script.m4 new file mode 100644 index 0000000..5ed93ef --- /dev/null +++ b/m4/ld-version-script.m4 @@ -0,0 +1,53 @@ +# ld-version-script.m4 serial 3 +dnl Copyright (C) 2008-2012 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Simon Josefsson + +# FIXME: The test below returns a false positive for mingw +# cross-compiles, 'local:' statements does not reduce number of +# exported symbols in a DLL. Use --disable-ld-version-script to work +# around the problem. + +# gl_LD_VERSION_SCRIPT +# -------------------- +# Check if LD supports linker scripts, and define automake conditional +# HAVE_LD_VERSION_SCRIPT if so. +AC_DEFUN([gl_LD_VERSION_SCRIPT], +[ + AC_ARG_ENABLE([ld-version-script], + AS_HELP_STRING([--enable-ld-version-script], + [enable linker version script (default is enabled when possible)]), + [have_ld_version_script=$enableval], []) + if test -z "$have_ld_version_script"; then + AC_MSG_CHECKING([if LD -Wl,--version-script works]) + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" + cat > conftest.map < conftest.map <