From 526303caadbbf71ea156f8eea3c5ffb20edefd90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dag-Erling=20Sm=C3=B8rgrav?= Date: Fri, 1 Aug 2014 14:18:25 +0000 Subject: [PATCH] WIP: CPE library. --- configure.ac | 1 + include/cryb/Makefile.am | 1 + include/cryb/cpe.h | 88 +++++++++++++++++++ lib/Makefile.am | 1 + lib/cpe/Makefile.am | 11 +++ lib/cpe/cpe.c | 158 ++++++++++++++++++++++++++++++++++ lib/cpe/cpe_string.c | 52 ++++++++++++ lib/cpe/cpe_uri.c | 52 ++++++++++++ lib/cpe/cpe_wfn.c | 52 ++++++++++++ mkpkgng.in | 177 +++++++++++++++++++++++++++++++++++++++ 10 files changed, 593 insertions(+) create mode 100644 include/cryb/cpe.h create mode 100644 lib/cpe/Makefile.am create mode 100644 lib/cpe/cpe.c create mode 100644 lib/cpe/cpe_string.c create mode 100644 lib/cpe/cpe_uri.c create mode 100644 lib/cpe/cpe_wfn.c create mode 100644 mkpkgng.in diff --git a/configure.ac b/configure.ac index c360084..b7f3243 100644 --- a/configure.ac +++ b/configure.ac @@ -119,6 +119,7 @@ AC_CONFIG_FILES([ include/cryb/Makefile lib/Makefile lib/core/Makefile + lib/cpe/Makefile lib/digest/Makefile lib/enc/Makefile lib/hash/Makefile diff --git a/include/cryb/Makefile.am b/include/cryb/Makefile.am index 4b4090b..867ce03 100644 --- a/include/cryb/Makefile.am +++ b/include/cryb/Makefile.am @@ -6,6 +6,7 @@ cryb_HEADERS = \ algorithm.h \ attributes.h \ bitwise.h \ + cpe.h \ digest.h \ hash.h \ hmac.h \ diff --git a/include/cryb/cpe.h b/include/cryb/cpe.h new file mode 100644 index 0000000..2a47d25 --- /dev/null +++ b/include/cryb/cpe.h @@ -0,0 +1,88 @@ +/*- + * Copyright (c) 2014 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Cryb$ + */ + +#ifndef CRYB_CPE_H_INCLUDED +#define CRYB_CPE_H_INCLUDED + +#define CPE22_VER 202 +#define CPE22_NATTR 7 + +#define CPE23_VER 203 +#define CPE23_NATTR 11 + +#define cpe_name cryb_cpe_name + +enum cpe22_attributes { + /* CPE 2.2 attributes */ + cpe22_part, + cpe22_vendor, + cpe22_product, + cpe22_version, + cpe22_update, + cpe22_edition, + cpe22_language, + /* max */ + cpe22_nattr +}; + +enum cpe23_attributes { + /* CPE 2.2 attributes */ + cpe23_part = cpe22_part, + cpe23_vendor = cpe22_vendor, + cpe23_product = cpe22_product, + cpe23_version = cpe22_version, + cpe23_update = cpe22_update, + cpe23_edition = cpe22_edition, + cpe23_language = cpe22_language, + /* CPE 2.3 extended attributes */ + cpe23_sw_edition, + cpe23_target_sw, + cpe23_target_hw, + cpe23_other, + /* max */ + cpe23_nattr +}; + +struct cpe_name { + int ver; + int nattr; + wchar_t *attr[]; +}; + +struct cpe_name *cpe_upgrade(const struct cpe_name *); +struct cpe_name *cpe_from_string(const wchar_t *); +wchar_t *cpe_to_string(const struct cpe_name *); +struct cpe_name *cpe_from_string(const wchar_t *); +wchar_t *cpe_to_string(const struct cpe_name *); +struct cpe_name *cpe_from_string(const wchar_t *); +wchar_t *cpe_to_string(const struct cpe_name *); + +#endif diff --git a/lib/Makefile.am b/lib/Makefile.am index cb0ae29..0ebb98a 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -2,6 +2,7 @@ SUBDIRS = \ core \ + cpe \ digest \ enc \ hash \ diff --git a/lib/cpe/Makefile.am b/lib/cpe/Makefile.am new file mode 100644 index 0000000..651beb9 --- /dev/null +++ b/lib/cpe/Makefile.am @@ -0,0 +1,11 @@ +# $Cryb$ + +AM_CPPFLAGS = -I$(top_srcdir)/include + +lib_LTLIBRARIES = libcryb-cpe.la + +libcryb_cpe_la_SOURCES = \ + cpe.c \ + cpe_string.c \ + cpe_uri.c \ + cpe_wfn.c diff --git a/lib/cpe/cpe.c b/lib/cpe/cpe.c new file mode 100644 index 0000000..f7402f6 --- /dev/null +++ b/lib/cpe/cpe.c @@ -0,0 +1,158 @@ +/*- + * Copyright (c) 2014 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Cryb$ + */ + +#include "cryb/impl.h" + +#include +#include + +#include + +/* + * Free all memory allocated to a cpe structure. + */ +void +cpe_destroy(struct cpe_name *cpe) +{ + + if (cpe == NULL) + return; + for (int i = 0; i < cpe->nattr; ++i) + free(cpe->attr[i]); + free(cpe); +} + +/* + * Copy one or more attributes from a source cpe structure to a + * destination cpe structure. If an attribute in the source is NULL, the + * corresponding attribute in the destination will be an empty string. + */ +static int +cpe_copy_attr(struct cpe_name *dst, const struct cpe_name *src, int base, int nattr) +{ + + if (base < 0 || nattr < 0 || base + nattr > src->nattr || + base + nattr > dst->nattr) + return (-1); + if (nattr == 0) + nattr = src->nattr - base; + for (int i = base; i < base + nattr; ++i) { + if (src->attr[i] != NULL) + dst->attr[i] = wcsdup(src->attr[i]); + else + dst->attr[i] = wcsdup(L""); + if (dst->attr[i] == NULL) + return (-1); + } + return (nattr); +} + +/* + * Duplicate a cpe structure. Any attributes that are NULL in the source + * will be empty strings in the destination. + */ +struct cpe_name * +cpe_clone(const struct cpe_name *cpe) +{ + struct cpe_name *ncpe; + + ncpe = calloc(1, sizeof *ncpe + + cpe->nattr * sizeof *ncpe->attr); + if (ncpe == NULL) + return (NULL); + if (cpe_copy_attr(ncpe, cpe, 0, 0) < 0) { + cpe_destroy(ncpe); + return (NULL); + } + return (ncpe); +} + +/* + * Allocate a new cpe structure. + */ +struct cpe_name * +cpe_new(void) +{ + struct cpe_name *ncpe; + + if ((ncpe = calloc(1, sizeof *ncpe)) == NULL) + return (NULL); + ncpe->ver = CPE23_VER; + ncpe->nattr = CPE23_NATTR; + return (ncpe); +} + +/* + * Upgrade a cpe 2.2 structure to the latest supported version. + */ +struct cpe_name * +cpe_upgrade22(const struct cpe_name *cpe) +{ + struct cpe_name *ncpe; + + if ((ncpe = cpe_new()) == NULL) + return (NULL); + /* copy existing attributes */ + if (cpe_copy_attr(ncpe, cpe, 0, cpe22_nattr) < 0) { + cpe_destroy(ncpe); + return (NULL); + } + /* extended attributes? */ + if (ncpe->attr[cpe22_edition][0] == L'~') { + /* + * XXX pseudo-code: + * + * - Split into fields (return an error if there are more + * than four) + * - Assign these to sw_edition, target_sw, target_hw and + * other, in that order. + */ + } + return (ncpe); +} + +/* + * Upgrade a cpe structure to the latest supported version. + */ +struct cpe_name * +cpe_upgrade(const struct cpe_name *cpe) +{ + + switch (cpe->ver) { + case CPE22_VER: + /* already latest */ + return (cpe_clone(cpe)); + case CPE23_VER: + return (cpe_upgrade22(cpe)); + default: + return (NULL); + } +} diff --git a/lib/cpe/cpe_string.c b/lib/cpe/cpe_string.c new file mode 100644 index 0000000..1981717 --- /dev/null +++ b/lib/cpe/cpe_string.c @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 2014 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Cryb$ + */ + +#include "cryb/impl.h" + +#include + +#include + +struct cpe * +cpe_unbind_fs(const wchar_t *str) +{ + + (void)str; + return (NULL); +} + +wchar_t * +cpe_bind_to_fs(const struct cpe *cpe) +{ + + (void)cpe; + return (NULL); +} diff --git a/lib/cpe/cpe_uri.c b/lib/cpe/cpe_uri.c new file mode 100644 index 0000000..291560d --- /dev/null +++ b/lib/cpe/cpe_uri.c @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 2014 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Cryb$ + */ + +#include "cryb/impl.h" + +#include + +#include + +struct cpe * +cpe_unbind_uri(const wchar_t *str) +{ + + (void)str; + return (NULL); +} + +wchar_t * +cpe_bind_to_uri(const struct cpe *cpe) +{ + + (void)cpe; + return (NULL); +} diff --git a/lib/cpe/cpe_wfn.c b/lib/cpe/cpe_wfn.c new file mode 100644 index 0000000..bd65633 --- /dev/null +++ b/lib/cpe/cpe_wfn.c @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 2014 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Cryb$ + */ + +#include "cryb/impl.h" + +#include + +#include + +struct cpe * +cpe_from_wfn(const wchar_t *str) +{ + + (void)str; + return (NULL); +} + +wchar_t * +cpe_to_wfn(const struct cpe *cpe) +{ + + (void)cpe; + return (NULL); +} diff --git a/mkpkgng.in b/mkpkgng.in new file mode 100644 index 0000000..2834e29 --- /dev/null +++ b/mkpkgng.in @@ -0,0 +1,177 @@ +#!/bin/sh +#- +# Copyright (c) 2013-2014 Dag-Erling Smørgrav +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id: mkpkgng.in 787 2014-03-10 15:43:17Z des $ +# + +# Print an informational message +info() { + echo "mkpkgng: $@" +} + +# Print an error message and exit +error() { + echo "mkpkgng: $@" 1>&2 + exit 1 +} + +# Ask a yes / no question +yesno() { + while :; do + echo -n "mkpkgng: $@ (yes/no) " + read answer + case $answer in + [Yy]|[Yy][Ee][Ss]) + return 0 + ;; + [Nn]|[Nn][Oo]) + return 1 + ;; + esac + done +} + +# +# Locate source and build directory +# +srcdir="@abs_top_srcdir@" +[ -f "$srcdir/include/security/openpam.h" ] || \ + error "Unable to locate source directory." +builddir="@abs_top_builddir@" +cd "$srcdir" + +# +# Determine pkgng version and ABI +# +pkgver=$(pkg -v) +[ -n "$pkgver" ] || error "Unable to determine pkgng version." +pkgabi=$(pkg config abi) +[ -n "$pkgabi" ] || error "Unable to determine package ABI." + +# +# Determine package name and version +# +package="@PACKAGE@" +version="@PACKAGE_VERSION@" +if ! expr "$version" : "[0-9]{1,}$" >/dev/null ; then + svnversion="$(svnversion 2>&1)" + svnversion=$(expr "$svnversion" : '\([0-9][0-9]*\)[A-Z]\{0,1\}$') + if [ -n "$svnversion" ] ; then + version="$version-r${svnversion}" + fi +fi + +# +# Locate GNU make +# +if which gmake >/dev/null ; then + make=gmake +else + make=make +fi +make="$make --no-print-directory --quiet V=0" + +# +# Create temporary directory +# +info "Creating the temporary directory." +tmproot=$(mktemp -d "${TMPDIR:-/tmp}/$package-$version.XXXXXX") +[ -n "$tmproot" -a -d "$tmproot" ] || \ + error "Unable to create the temporary directory." +trap "exit 1" INT +trap "info Deleting the temporary directory. ; rm -rf '$tmproot'" EXIT +set -e + +# +# Install into tmproot +# +info "Installing into the temporary directory." +$make install DESTDIR="$tmproot" + +# +# Compress man pages +# +find $tmproot -type d -name 'man[0-9]' | +while read mandir ; do + find $mandir -type f -name '*.[0-9]' | + while read manpage ; do + gzip "$manpage" + done +done + +# +# Generate stub manifest +# +info "Generating the stub manifest." +manifest="$tmproot/+MANIFEST" +cat >"$manifest" <>"$manifest" + +# +# Create the package +# +info "Creating the package." +pkg create -r "$tmproot" -m "$tmproot" -o "$builddir" + +# +# Done +# +info "Package created for $package-$version."