Browse Source

Cherry-pick test-suite reorganisation commits

Needed this also fixes an issue with tests going into endless loops if
the tang startup failed for some reason. This has happened in
autopkgtests.
Christoph Biedl 1 month ago
parent
commit
d40d6ba0d6

+ 451 - 0
debian/patches/cherry-pick/1605797689.v15-2-g3dedc5d.tests-move-tang-tests-to-src-pins-tang.patch

@@ -0,0 +1,451 @@
+Subject: Tests: move tang tests to src/pins/tang
+Origin: v15-2-g3dedc5d <https://github.com/latchset/clevis/commit/v15-2-g3dedc5d>
+Upstream-Author: Sergio Correia <scorreia@redhat.com>
+Date: Thu Nov 19 11:54:49 2020 -0300
+
+    So that we can organize them better.
+
+--- a/src/pins/tang/meson.build
++++ b/src/pins/tang/meson.build
+@@ -1,33 +1,3 @@
+-actv = find_program(
+-  'systemd-socket-activate',
+-  'systemd-activate',
+-  join_paths('/', 'usr', 'lib', 'systemd', 'systemd-activate'),
+-  required: false
+-)
+-kgen = find_program(
+-  join_paths(libexecdir, 'tangd-keygen'),
+-  join_paths(get_option('prefix'), get_option('libdir'), 'tangd-keygen'),
+-  join_paths(get_option('prefix'), get_option('libexecdir'), 'tangd-keygen'),
+-  join_paths('/', 'usr', get_option('libdir'), 'tangd-keygen'),
+-  join_paths('/', 'usr', get_option('libexecdir'), 'tangd-keygen'),
+-  required: false
+-)
+-updt = find_program(
+-  join_paths(libexecdir, 'tangd-update'),
+-  join_paths(get_option('prefix'), get_option('libdir'), 'tangd-update'),
+-  join_paths(get_option('prefix'), get_option('libexecdir'), 'tangd-update'),
+-  join_paths('/', 'usr', get_option('libdir'), 'tangd-update'),
+-  join_paths('/', 'usr', get_option('libexecdir'), 'tangd-update'),
+-  required: false
+-)
+-tang = find_program(
+-  join_paths(libexecdir, 'tangd'),
+-  join_paths(get_option('prefix'), get_option('libdir'), 'tangd'),
+-  join_paths(get_option('prefix'), get_option('libexecdir'), 'tangd'),
+-  join_paths('/', 'usr', get_option('libdir'), 'tangd'),
+-  join_paths('/', 'usr', get_option('libexecdir'), 'tangd'),
+-  required: false
+-)
+ curl = find_program('curl', required: false)
+ 
+ if curl.found()
+@@ -35,22 +5,7 @@
+   bins += join_paths(meson.current_source_dir(), 'clevis-encrypt-tang')
+   mans += join_paths(meson.current_source_dir(), 'clevis-encrypt-tang.1')
+ 
+-  if actv.found() and kgen.found() and updt.found() and tang.found()
+-    env = environment()
+-    env.set('SD_ACTIVATE', actv.path())
+-    env.set('TANGD_KEYGEN', kgen.path())
+-    env.set('TANGD_UPDATE', updt.path())
+-    env.set('TANGD', tang.path())
+-    env.prepend('PATH',
+-      join_paths(meson.source_root(), 'src'),
+-      meson.current_source_dir(),
+-      separator: ':'
+-    )
+-
+-    test('pin-tang', find_program('./pin-tang'), env: env)
+-  else
+-    warning('Will not run tang tests due to missing dependencies!')
+-  endif
++  subdir('tests')
+ else
+   warning('Will not install tang pin due to missing dependencies!')
+ endif
+--- a/src/pins/tang/pin-tang
++++ /dev/null
+@@ -1,65 +0,0 @@
+-#!/bin/bash -x
+-# vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80:
+-#
+-# Copyright (c) 2016 Red Hat, Inc.
+-# Author: Nathaniel McCallum <npmccallum@redhat.com>
+-#
+-# 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 <http://www.gnu.org/licenses/>.
+-#
+-
+-function on_exit() {
+-    if [ "$PID" ]; then kill $PID; wait $PID || true; fi
+-    [ -d "$TMP" ] && rm -rf "$TMP"
+-}
+-
+-trap 'on_exit' EXIT
+-trap 'exit' ERR
+-
+-TMP="$(mktemp -d)"
+-mkdir -p "$TMP"/db
+-mkdir -p "$TMP"/cache
+-
+-# Generate the server keys
+-"${TANGD_KEYGEN}" "$TMP"/db sig exc
+-"${TANGD_UPDATE}" "$TMP"/db "$TMP"/cache
+-
+-# Start the server
+-port="$(shuf -i 1024-65536 -n 1)"
+-
+-inetd='--inetd'
+-[ "${SD_ACTIVATE##*/}" = "systemd-activate" ] && inetd=
+-
+-"$SD_ACTIVATE" $inetd -l 127.0.0.1:"$port" -a "$TANGD" "$TMP"/cache &
+-PID=$!
+-sleep 0.25
+-
+-thp="$(jose jwk thp -i "$TMP/db/sig.jwk")"
+-adv="$TMP/cache/default.jws"
+-url="http://localhost:${port}"
+-
+-cfg="$(printf '{"url":"%s","adv":"%s"}' "$url" "$adv")"
+-enc="$(echo -n "hi" | clevis encrypt tang "$cfg")"
+-dec="$(echo -n "$enc" | clevis decrypt)"
+-test "$dec" == "hi"
+-
+-cfg="$(printf '{"url":"%s","thp":"%s"}' "$url" "$thp")"
+-enc="$(echo -n "hi" | clevis encrypt tang "$cfg")"
+-dec="$(echo -n "$enc" | clevis decrypt)"
+-test "$dec" == "hi"
+-
+-kill -9 $PID
+-! wait $PID
+-unset PID
+-
+-! echo "$enc" | clevis decrypt
+--- /dev/null
++++ b/src/pins/tang/tests/meson.build
+@@ -0,0 +1,64 @@
++kgen = find_program(
++  join_paths(libexecdir, 'tangd-keygen'),
++  join_paths(get_option('prefix'), get_option('libdir'), 'tangd-keygen'),
++  join_paths(get_option('prefix'), get_option('libexecdir'), 'tangd-keygen'),
++  join_paths('/', 'usr', get_option('libdir'), 'tangd-keygen'),
++  join_paths('/', 'usr', get_option('libexecdir'), 'tangd-keygen'),
++  required: false
++)
++updt = find_program(
++  join_paths(libexecdir, 'tangd-update'),
++  join_paths(get_option('prefix'), get_option('libdir'), 'tangd-update'),
++  join_paths(get_option('prefix'), get_option('libexecdir'), 'tangd-update'),
++  join_paths('/', 'usr', get_option('libdir'), 'tangd-update'),
++  join_paths('/', 'usr', get_option('libexecdir'), 'tangd-update'),
++  required: false
++)
++tang = find_program(
++  join_paths(libexecdir, 'tangd'),
++  join_paths(get_option('prefix'), get_option('libdir'), 'tangd'),
++  join_paths(get_option('prefix'), get_option('libexecdir'), 'tangd'),
++  join_paths('/', 'usr', get_option('libdir'), 'tangd'),
++  join_paths('/', 'usr', get_option('libexecdir'), 'tangd'),
++  required: false
++)
++
++socat = find_program('socat', required: false)
++
++tang_data = configuration_data()
++tang_data.set('SOCAT', '')
++tang_data.set('TANGD_KEYGEN', '')
++tang_data.set('TANGD_UPDATE', '')
++tang_data.set('TANGD', '')
++
++if socat.found()
++  tang_data.set('SOCAT', socat.path())
++endif
++
++if kgen.found()
++  tang_data.set('TANGD_KEYGEN', kgen.path())
++endif
++
++if tang.found()
++  tang_data.set('TANGD', tang.path())
++endif
++
++if updt.found()
++  tang_data.set('TANGD_UPDATE', updt.path())
++endif
++
++tang_tests_common = configure_file(
++  input: 'tang-common-test-functions.in',
++  output: 'tang-common-test-functions',
++  configuration: tang_data
++)
++
++env = environment()
++env.prepend('PATH',
++  join_paths(meson.source_root(), 'src'),
++  join_paths(meson.source_root(), 'src', 'pins', 'tang'),
++  join_paths(meson.build_root(), 'src', 'pins', 'tang', 'tests'),
++  separator: ':'
++)
++
++test('pin-tang', find_program('pin-tang'), env: env)
+--- /dev/null
++++ b/src/pins/tang/tests/pin-tang
+@@ -0,0 +1,55 @@
++#!/bin/bash -xe
++# vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80:
++#
++# Copyright (c) 2016 Red Hat, Inc.
++# Author: Nathaniel McCallum <npmccallum@redhat.com>
++#
++# 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 <http://www.gnu.org/licenses/>.
++#
++
++. tang-common-test-functions
++
++on_exit() {
++    exit_status=$?
++    tang_stop "${TMP}"
++    [ -d "$TMP" ] && rm -rf "$TMP"
++    exit "${exit_status}"
++}
++
++trap 'on_exit' EXIT
++
++TMP="$(mktemp -d)"
++
++port=$(tang_new_random_port)
++
++tang_run "${TMP}" "${port}" sig exc
++
++thp="$(jose jwk thp -i "$TMP/db/sig.jwk")"
++adv="${TMP}/adv.jws"
++tang_get_adv "${port}" "${adv}"
++url="http://localhost:${port}"
++
++cfg="$(printf '{"url":"%s","adv":"%s"}' "$url" "$adv")"
++enc="$(echo -n "hi" | clevis encrypt tang "$cfg")"
++dec="$(echo -n "$enc" | clevis decrypt)"
++test "$dec" == "hi"
++
++cfg="$(printf '{"url":"%s","thp":"%s"}' "$url" "$thp")"
++enc="$(echo -n "hi" | clevis encrypt tang "$cfg")"
++dec="$(echo -n "$enc" | clevis decrypt)"
++test "$dec" == "hi"
++
++tang_stop "${TMP}"
++
++! echo "$enc" | clevis decrypt
+--- /dev/null
++++ b/src/pins/tang/tests/tang-common-test-functions.in
+@@ -0,0 +1,188 @@
++#!/bin/bash -ex
++# vim: set ts=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80:
++#
++# Copyright (c) 2020 Red Hat, Inc.
++# Author: Sergio Correia <scorreia@redhat.com>
++#
++# 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 <http://www.gnu.org/licenses/>.
++#
++
++SOCAT="@SOCAT@"
++TANGD_KEYGEN="@TANGD_KEYGEN@"
++TANGD_UPDATE="@TANGD_UPDATE@"
++TANGD="@TANGD@"
++
++tang_error() {
++    echo "${1}" >&2
++    exit 1
++}
++
++tang_skip() {
++    echo "${1}" >&2
++    exit 77
++}
++
++tang_sanity_check() {
++    [ -n "${SOCAT}" ] && [ -n "${TANGD_KEYGEN}" ] && \
++        [ -n "${TANGD}" ] && return 0
++    tang_skip "tang is not enabled/supported. Check if you have met all the requirements"
++}
++
++# Creates a tang adv to be used in the tests.
++tang_create_adv() {
++    local basedir="${1}"
++    local adv="${2:-/dev/stdout}"
++
++    local SIG="${basedir}/sig.jwk"
++    jose jwk gen --input='{"alg":"ES512"}' --output="${SIG}"
++
++    local EXC="${basedir}/exc.jwk"
++    jose jwk gen --input='{"alg":"ECMR"}' --output="${EXC}"
++
++    local TEMPLATE='{"protected":{"cty":"jwk-set+json"}}'
++    jose jwk pub --set --input="${SIG}" --input="${EXC}" \
++        | jose jws sig --detached=- --signature="${TEMPLATE}" \
++                       --key="${SIG}" --output="${adv}"
++}
++
++# Get a random port to be used with a test tang server.
++tang_new_random_port() {
++    tang_sanity_check
++    shuf -i 1024-65535 -n 1
++}
++
++# Removes tang rotated keys from the test server.
++tang_remove_rotated_keys() {
++    tang_sanity_check
++    local basedir="${1}"
++
++    [ -z "${basedir}" ] && \
++        tang_error "tang_remove_rotated_keys: please specify 'basedir'"
++
++    local db="${basedir}/db"
++
++    mkdir -p "${db}"
++    pushd "${db}"
++        find . -name ".*.jwk" -exec rm -f {} \;
++    popd
++
++    [ -n "${TANGD_UPDATE}" ] && "${TANGD_UPDATE}" "${db}" "${basedir}/cache"
++    return 0
++}
++
++# Creates new keys for the test tang server.
++tang_new_keys() {
++    tang_sanity_check
++    local basedir="${1}"
++    local rotate="${2:-}"
++    local sig_name="${3:-}"
++    local exc_name="${4:-}"
++
++    [ -z "${basedir}" ] && tang_error "tang_new_keys: please specify 'basedir'"
++
++    local db="${basedir}/db"
++    mkdir -p "${db}"
++
++    if [ -n "${rotate}" ]; then
++        pushd "${db}"
++            local k
++            k=$(find . -name "*.jwk" | wc -l)
++            if [ "${k}" -gt 0 ]; then
++                for k in *.jwk; do
++                    mv -f -- "${k}" ".${k}"
++                done
++            fi
++        popd
++    fi
++
++    "${TANGD_KEYGEN}" "${db}" ${sig_name} ${exc_name}
++    [ -n "${TANGD_UPDATE}" ] && "${TANGD_UPDATE}" "${db}" "${basedir}/cache"
++
++    return 0
++}
++
++# Wait for the tang server to be operational.
++tang_wait_until_ready() {
++    tang_sanity_check
++    local port="${1}"
++
++    [ -z "${port}" ] && \
++        tang_error "tang_wait_until_ready: please specify 'port'"
++
++    local max_timeout_in_s=5
++    local start elapsed
++    start="${SECONDS}"
++    while ! curl --output /dev/null --silent --fail \
++                "http://localhost:${port}/adv"; do
++        elapsed=$((SECONDS - start))
++        if [ "${elapsed}" -gt "${max_timeout_in_s}" ]; then
++            tang_error "Timeout (${max_timeout_in_s}s) waiting for tang server"
++        fi
++        sleep 0.1
++        echo -n . >&2
++    done
++}
++
++# Start a test tang server.
++tang_run() {
++    tang_sanity_check
++    local basedir="${1}"
++    local port="${2}"
++    local sig_name="${3:-}"
++    local exc_name="${4:-}"
++
++    [ -z "${basedir}" ] && tang_error "tang_run: please specify 'basedir'"
++    [ -z "${port}" ] && tang_error "tang_run: please specify 'port'"
++
++    if ! tang_new_keys "${basedir}" "" "${sig_name}" "${exc_name}"; then
++        tang_error "Error creating new keys for tang server"
++    fi
++
++    local KEYS="${basedir}/cache"
++    [ -z "${TANGD_UPDATE}" ] && KEYS="${basedir}/db"
++
++    local pid pidfile
++    pidfile="${basedir}/tang.pid"
++
++    "${SOCAT}" -v -v TCP-LISTEN:${port},reuseaddr,fork \
++               exec:"${TANGD} ${KEYS}" &
++
++    pid=$!
++    echo "${pid}" > "${pidfile}"
++    tang_wait_until_ready "${port}"
++}
++
++# Stop tang server.
++tang_stop() {
++    tang_sanity_check
++    local basedir="${1}"
++    [ -z "${basedir}" ] && tang_error "tang_stop: please specify 'basedir'"
++
++    local pidfile="${basedir}/tang.pid"
++    [ -f "${pidfile}" ] || return 0
++
++    local pid
++    pid=$(<"${pidfile}")
++    kill -9 "${pid}" 2>/dev/null || :
++}
++
++# Get tang advertisement.
++tang_get_adv() {
++    tang_sanity_check
++    local port="${1}"
++    local adv="${2:-/dev/stdout}"
++
++    [ -z "${port}" ] && tang_error "tang_get_adv: please specify 'port'"
++    curl -L -o "${adv}" "http://localhost:${port}/adv"
++}

+ 746 - 0
debian/patches/cherry-pick/1605845630.v15-3-ga07e753.tests-update-src-luks-tests-to-use-shared-tang-test-functions.patch

@@ -0,0 +1,746 @@
+Subject: Tests: update src/luks/tests to use shared tang test functions
+Origin: v15-3-ga07e753 <https://github.com/latchset/clevis/commit/v15-3-ga07e753>
+Upstream-Author: Sergio Correia <scorreia@redhat.com>
+Date: Fri Nov 20 01:13:50 2020 -0300
+
+--- a/src/luks/tests/assume-yes
++++ b/src/luks/tests/assume-yes
+@@ -33,11 +33,10 @@
+ 
+ TMP="$(mktemp -d)"
+ 
+-port=$(get_random_port)
+-tang_run "${TMP}" "${port}" &
+-tang_wait_until_ready "${port}"
++port=$(tang_new_random_port)
++tang_run "${TMP}" "${port}"
+ 
+-url="http://${TANG_HOST}:${port}"
++url="http://localhost:${port}"
+ cfg=$(printf '{"url":"%s"}' "$url")
+ 
+ test_tang() {
+--- a/src/luks/tests/assume-yes-luks2
++++ b/src/luks/tests/assume-yes-luks2
+@@ -33,11 +33,10 @@
+ 
+ TMP="$(mktemp -d)"
+ 
+-port=$(get_random_port)
+-tang_run "${TMP}" "${port}" &
+-tang_wait_until_ready "${port}"
++port=$(tang_new_random_port)
++tang_run "${TMP}" "${port}"
+ 
+-url="http://${TANG_HOST}:${port}"
++url="http://localhost:${port}"
+ cfg=$(printf '{"url":"%s"}' "$url")
+ 
+ # LUKS2.
+--- a/src/luks/tests/backup-restore-luks1
++++ b/src/luks/tests/backup-restore-luks1
+@@ -31,7 +31,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ CFG="$(printf '{"url":"foobar","adv":"%s"}' "$ADV")"
+ 
+ # LUKS1.
+--- a/src/luks/tests/backup-restore-luks2
++++ b/src/luks/tests/backup-restore-luks2
+@@ -31,7 +31,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ CFG="$(printf '{"url":"foobar","adv":"%s"}' "$ADV")"
+ 
+ # LUKS1.
+--- a/src/luks/tests/bind-already-used-luksmeta-slot
++++ b/src/luks/tests/bind-already-used-luksmeta-slot
+@@ -31,7 +31,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ CFG="$(printf '{"url":"foobar","adv":"%s"}' "$ADV")"
+ 
+ # LUKS1.
+--- a/src/luks/tests/bind-key-file-non-interactive-luks1
++++ b/src/luks/tests/bind-key-file-non-interactive-luks1
+@@ -31,7 +31,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ CFG="$(printf '{"url":"foobar","adv":"%s"}' "$ADV")"
+ UUID="cb6e8904-81ff-40da-a84a-07ab9ab5715e"
+ KEYFILE="${TMP}/key"
+--- a/src/luks/tests/bind-luks1
++++ b/src/luks/tests/bind-luks1
+@@ -31,7 +31,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ CFG="$(printf '{"url":"foobar","adv":"%s"}' "$ADV")"
+ 
+ # LUKS1.
+--- a/src/luks/tests/bind-luks2
++++ b/src/luks/tests/bind-luks2
+@@ -35,7 +35,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ CFG="$(printf '{"url":"foobar","adv":"%s"}' "$ADV")"
+ 
+ # LUKS2.
+--- a/src/luks/tests/bind-pass-with-newline-keyfile-luks1
++++ b/src/luks/tests/bind-pass-with-newline-keyfile-luks1
+@@ -31,7 +31,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ CFG="$(printf '{"url":"foobar","adv":"%s"}' "$ADV")"
+ 
+ # LUKS1.
+--- a/src/luks/tests/bind-pass-with-newline-luks1
++++ b/src/luks/tests/bind-pass-with-newline-luks1
+@@ -31,7 +31,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ CFG="$(printf '{"url":"foobar","adv":"%s"}' "$ADV")"
+ 
+ # LUKS1.
+--- a/src/luks/tests/bind-wrong-pass-luks1
++++ b/src/luks/tests/bind-wrong-pass-luks1
+@@ -31,7 +31,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ CFG="$(printf '{"url":"foobar","adv":"%s"}' "$ADV")"
+ 
+ # LUKS1.
+--- a/src/luks/tests/bind-wrong-pass-luks2
++++ b/src/luks/tests/bind-wrong-pass-luks2
+@@ -35,7 +35,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ CFG="$(printf '{"url":"foobar","adv":"%s"}' "$ADV")"
+ 
+ # LUKS2.
+--- a/src/luks/tests/edit-tang-luks1
++++ b/src/luks/tests/edit-tang-luks1
+@@ -36,11 +36,10 @@
+ 
+ TMP="$(mktemp -d)"
+ 
+-port=$(get_random_port)
+-tang_run "${TMP}" "${port}" &
+-tang_wait_until_ready "${port}"
++port=$(tang_new_random_port)
++tang_run "${TMP}" "${port}"
+ 
+-url="http://${TANG_HOST}:${port}"
++url="http://localhost:${port}"
+ 
+ cfg=$(printf '{"url":"%s"}' "${url}")
+ 
+@@ -65,11 +64,10 @@
+ 
+ # Now let's have another tang instance running and change the config to use
+ # the new one.
+-port2=$(get_random_port)
++port2=$(tang_new_random_port)
+ TMP2="$(mktemp -d)"
+-tang_run "${TMP2}" "${port2}" &
+-tang_wait_until_ready "${port2}"
+-new_url="http://${TANG_HOST}:${port2}"
++tang_run "${TMP2}" "${port2}"
++new_url="http://localhost:${port2}"
+ new_cfg=$(printf '{"url":"%s"}' "${new_url}")
+ 
+ if ! clevis luks edit -d "${DEV}" -s 1 -c "${new_cfg}"; then
+--- a/src/luks/tests/edit-tang-luks2
++++ b/src/luks/tests/edit-tang-luks2
+@@ -36,11 +36,10 @@
+ 
+ TMP="$(mktemp -d)"
+ 
+-port=$(get_random_port)
+-tang_run "${TMP}" "${port}" &
+-tang_wait_until_ready "${port}"
++port=$(tang_new_random_port)
++tang_run "${TMP}" "${port}"
+ 
+-url="http://${TANG_HOST}:${port}"
++url="http://localhost:${port}"
+ 
+ cfg=$(printf '{"url":"%s"}' "${url}")
+ 
+@@ -65,11 +64,10 @@
+ 
+ # Now let's have another tang instance running and change the config to use
+ # the new one.
+-port2=$(get_random_port)
++port2=$(tang_new_random_port)
+ TMP2="$(mktemp -d)"
+-tang_run "${TMP2}" "${port2}" &
+-tang_wait_until_ready "${port2}"
+-new_url="http://${TANG_HOST}:${port2}"
++tang_run "${TMP2}" "${port2}"
++new_url="http://localhost:${port2}"
+ new_cfg=$(printf '{"url":"%s"}' "${new_url}")
+ 
+ if ! clevis luks edit -d "${DEV}" -s 1 -c "${new_cfg}"; then
+--- a/src/luks/tests/list-recursive-luks1
++++ b/src/luks/tests/list-recursive-luks1
+@@ -31,7 +31,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ PIN="sss"
+ CFG=$(printf '
+ {
+--- a/src/luks/tests/list-recursive-luks2
++++ b/src/luks/tests/list-recursive-luks2
+@@ -31,7 +31,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ PIN="sss"
+ CFG=$(printf '
+ {
+--- a/src/luks/tests/list-sss-tang-luks1
++++ b/src/luks/tests/list-sss-tang-luks1
+@@ -31,7 +31,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ PIN="sss"
+ CFG=$(printf '
+ {
+--- a/src/luks/tests/list-sss-tang-luks2
++++ b/src/luks/tests/list-sss-tang-luks2
+@@ -31,7 +31,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ PIN="sss"
+ CFG=$(printf '
+ {
+--- a/src/luks/tests/list-tang-luks1
++++ b/src/luks/tests/list-tang-luks1
+@@ -31,7 +31,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ PIN="tang"
+ CFG=$(printf '{"url": "ADDR","adv": "%s"}' "${ADV}")
+ 
+--- a/src/luks/tests/list-tang-luks2
++++ b/src/luks/tests/list-tang-luks2
+@@ -31,7 +31,7 @@
+ TMP="$(mktemp -d)"
+ 
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ PIN="tang"
+ CFG=$(printf '{"url": "ADDR","adv": "%s"}' "${ADV}")
+ 
+--- a/src/luks/tests/meson.build
++++ b/src/luks/tests/meson.build
+@@ -1,39 +1,6 @@
+ # We use jq for comparing the pin config in the clevis luks list tests.
+ jq = find_program('jq', required: false)
+ 
+-# We use systemd-socket-activate for running test tang servers.
+-actv = find_program(
+-  'systemd-socket-activate',
+-  'systemd-activate',
+-  join_paths('/', 'usr', 'lib', 'systemd', 'systemd-activate'),
+-  required: false
+-)
+-
+-kgen = find_program(
+-  join_paths(libexecdir, 'tangd-keygen'),
+-  join_paths(get_option('prefix'), get_option('libdir'), 'tangd-keygen'),
+-  join_paths(get_option('prefix'), get_option('libexecdir'), 'tangd-keygen'),
+-  join_paths('/', 'usr', get_option('libdir'), 'tangd-keygen'),
+-  join_paths('/', 'usr', get_option('libexecdir'), 'tangd-keygen'),
+-  required: false
+-)
+-updt = find_program(
+-  join_paths(libexecdir, 'tangd-update'),
+-  join_paths(get_option('prefix'), get_option('libdir'), 'tangd-update'),
+-  join_paths(get_option('prefix'), get_option('libexecdir'), 'tangd-update'),
+-  join_paths('/', 'usr', get_option('libdir'), 'tangd-update'),
+-  join_paths('/', 'usr', get_option('libexecdir'), 'tangd-update'),
+-  required: false
+-)
+-tang = find_program(
+-  join_paths(libexecdir, 'tangd'),
+-  join_paths(get_option('prefix'), get_option('libdir'), 'tangd'),
+-  join_paths(get_option('prefix'), get_option('libexecdir'), 'tangd'),
+-  join_paths('/', 'usr', get_option('libdir'), 'tangd'),
+-  join_paths('/', 'usr', get_option('libexecdir'), 'tangd'),
+-  required: false
+-)
+-
+ common_functions = configure_file(input: 'tests-common-functions.in',
+   output: 'tests-common-functions',
+   configuration: luksmeta_data,
+@@ -53,19 +20,11 @@
+   join_paths(meson.build_root(), 'src', 'luks'),
+   join_paths(meson.build_root(), 'src', 'pins', 'sss'),
+   join_paths(meson.build_root(), 'src', 'pins', 'tang'),
++  join_paths(meson.build_root(), 'src', 'pins', 'tang', 'tests'),
+   join_paths(meson.build_root(), 'src', 'pins', 'tpm2'),
+   separator: ':'
+ )
+ 
+-has_tang = false
+-if actv.found() and kgen.found() and updt.found() and tang.found()
+-  has_tang = true
+-  env.set('SD_ACTIVATE', actv.path())
+-  env.set('TANGD_KEYGEN', kgen.path())
+-  env.set('TANGD_UPDATE', updt.path())
+-  env.set('TANGD', tang.path())
+-endif
+-
+ test('bind-wrong-pass-luks1', find_program('bind-wrong-pass-luks1'), env: env)
+ test('bind-luks1', find_program('bind-luks1'), env: env)
+ test('unbind-unbound-slot-luks1', find_program('unbind-unbound-slot-luks1'), env: env)
+@@ -85,15 +44,13 @@
+   warning('Will not run "clevis luks list" tests due to missing jq dependency')
+ endif
+ 
+-if has_tang
+-  test('unlock-tang-luks1', find_program('unlock-tang-luks1'), env: env, timeout: 90)
+-  test('assume-yes', find_program('assume-yes'), env: env, timeout: 60)
+-  test('regen-inplace-luks1', find_program('regen-inplace-luks1'), env: env, timeout: 90)
+-  test('regen-not-inplace-luks1', find_program('regen-not-inplace-luks1'), env: env, timeout: 90)
+-  test('report-tang-luks1', find_program('report-tang-luks1'), env: env, timeout: 90)
+-  test('report-sss-luks1', find_program('report-sss-luks1'), env: env, timeout: 90)
+-  test('edit-tang-luks1', find_program('edit-tang-luks1'), env: env, timeout: 150)
+-endif
++test('unlock-tang-luks1', find_program('unlock-tang-luks1'), env: env, timeout: 90)
++test('assume-yes', find_program('assume-yes'), env: env, timeout: 60)
++test('regen-inplace-luks1', find_program('regen-inplace-luks1'), env: env, timeout: 90)
++test('regen-not-inplace-luks1', find_program('regen-not-inplace-luks1'), env: env, timeout: 90)
++test('report-tang-luks1', find_program('report-tang-luks1'), env: env, timeout: 90)
++test('report-sss-luks1', find_program('report-sss-luks1'), env: env, timeout: 90)
++test('edit-tang-luks1', find_program('edit-tang-luks1'), env: env, timeout: 150)
+ 
+ test('backup-restore-luks1', find_program('backup-restore-luks1'), env: env, timeout: 60)
+ 
+@@ -112,15 +69,13 @@
+     test('list-sss-tang-luks2', find_program('list-sss-tang-luks2'), env: env, timeout: 60)
+   endif
+ 
+-  if has_tang
+-    test('unlock-tang-luks2', find_program('unlock-tang-luks2'), env: env, timeout: 120)
+-    test('assume-yes-luks2', find_program('assume-yes-luks2'), env: env, timeout: 90)
+-    test('regen-inplace-luks2', find_program('regen-inplace-luks2'), env: env, timeout: 120)
+-    test('regen-not-inplace-luks2', find_program('regen-not-inplace-luks2'), env: env, timeout: 120)
+-    test('report-tang-luks2', find_program('report-tang-luks2'), env: env, timeout: 120)
+-    test('report-sss-luks2', find_program('report-sss-luks2'), env: env, timeout: 120)
+-    test('edit-tang-luks2', find_program('edit-tang-luks2'), env: env, timeout: 210)
+-  endif
++  test('unlock-tang-luks2', find_program('unlock-tang-luks2'), env: env, timeout: 120)
++  test('assume-yes-luks2', find_program('assume-yes-luks2'), env: env, timeout: 90)
++  test('regen-inplace-luks2', find_program('regen-inplace-luks2'), env: env, timeout: 120)
++  test('regen-not-inplace-luks2', find_program('regen-not-inplace-luks2'), env: env, timeout: 120)
++  test('report-tang-luks2', find_program('report-tang-luks2'), env: env, timeout: 120)
++  test('report-sss-luks2', find_program('report-sss-luks2'), env: env, timeout: 120)
++  test('edit-tang-luks2', find_program('edit-tang-luks2'), env: env, timeout: 210)
+ 
+-test('backup-restore-luks2', find_program('backup-restore-luks2'), env: env, timeout: 120)
++  test('backup-restore-luks2', find_program('backup-restore-luks2'), env: env, timeout: 120)
+ endif
+--- a/src/luks/tests/regen-inplace-luks1
++++ b/src/luks/tests/regen-inplace-luks1
+@@ -32,11 +32,10 @@
+ 
+ TMP=$(mktemp -d)
+ 
+-port=$(get_random_port)
+-tang_run "${TMP}" "${port}" &
+-tang_wait_until_ready "${port}"
++port=$(tang_new_random_port)
++tang_run "${TMP}" "${port}"
+ 
+-url="http://${TANG_HOST}:${port}"
++url="http://localhost:${port}"
+ adv="${TMP}/adv"
+ tang_get_adv "${port}" "${adv}"
+ 
+--- a/src/luks/tests/regen-inplace-luks2
++++ b/src/luks/tests/regen-inplace-luks2
+@@ -32,11 +32,10 @@
+ 
+ TMP=$(mktemp -d)
+ 
+-port=$(get_random_port)
+-tang_run "${TMP}" "${port}" &
+-tang_wait_until_ready "${port}"
++port=$(tang_new_random_port)
++tang_run "${TMP}" "${port}"
+ 
+-url="http://${TANG_HOST}:${port}"
++url="http://localhost:${port}"
+ adv="${TMP}/adv"
+ tang_get_adv "${port}" "${adv}"
+ 
+--- a/src/luks/tests/regen-not-inplace-luks1
++++ b/src/luks/tests/regen-not-inplace-luks1
+@@ -32,11 +32,10 @@
+ 
+ export TMP=$(mktemp -d)
+ 
+-port=$(get_random_port)
+-tang_run "${TMP}" "${port}" &
+-tang_wait_until_ready "${port}"
++port=$(tang_new_random_port)
++tang_run "${TMP}" "${port}"
+ 
+-url="http://${TANG_HOST}:${port}"
++url="http://localhost:${port}"
+ adv="${TMP}/adv"
+ tang_get_adv "${port}" "${adv}"
+ 
+--- a/src/luks/tests/regen-not-inplace-luks2
++++ b/src/luks/tests/regen-not-inplace-luks2
+@@ -32,11 +32,10 @@
+ 
+ export TMP=$(mktemp -d)
+ 
+-port=$(get_random_port)
+-tang_run "${TMP}" "${port}" &
+-tang_wait_until_ready "${port}"
++port=$(tang_new_random_port)
++tang_run "${TMP}" "${port}"
+ 
+-url="http://${TANG_HOST}:${port}"
++url="http://localhost:${port}"
+ adv="${TMP}/adv"
+ tang_get_adv "${port}" "${adv}"
+ 
+--- a/src/luks/tests/report-sss-luks1
++++ b/src/luks/tests/report-sss-luks1
+@@ -32,11 +32,10 @@
+ 
+ TMP=$(mktemp -d)
+ 
+-port=$(get_random_port)
+-tang_run "${TMP}" "${port}" &
+-tang_wait_until_ready "${port}"
++port=$(tang_new_random_port)
++tang_run "${TMP}" "${port}"
+ 
+-url="http://${TANG_HOST}:${port}"
++url="http://localhost:${port}"
+ adv="${TMP}/adv"
+ tang_get_adv "${port}" "${adv}"
+ 
+--- a/src/luks/tests/report-sss-luks2
++++ b/src/luks/tests/report-sss-luks2
+@@ -32,11 +32,10 @@
+ 
+ TMP=$(mktemp -d)
+ 
+-port=$(get_random_port)
+-tang_run "${TMP}" "${port}" &
+-tang_wait_until_ready "${port}"
++port=$(tang_new_random_port)
++tang_run "${TMP}" "${port}"
+ 
+-url="http://${TANG_HOST}:${port}"
++url="http://localhost:${port}"
+ adv="${TMP}/adv"
+ tang_get_adv "${port}" "${adv}"
+ 
+--- a/src/luks/tests/report-tang-luks1
++++ b/src/luks/tests/report-tang-luks1
+@@ -32,11 +32,10 @@
+ 
+ TMP=$(mktemp -d)
+ 
+-port=$(get_random_port)
+-tang_run "${TMP}" "${port}" &
+-tang_wait_until_ready "${port}"
++port=$(tang_new_random_port)
++tang_run "${TMP}" "${port}"
+ 
+-url="http://${TANG_HOST}:${port}"
++url="http://localhost:${port}"
+ adv="${TMP}/adv"
+ tang_get_adv "${port}" "${adv}"
+ 
+--- a/src/luks/tests/report-tang-luks2
++++ b/src/luks/tests/report-tang-luks2
+@@ -32,11 +32,10 @@
+ 
+ TMP=$(mktemp -d)
+ 
+-port=$(get_random_port)
+-tang_run "${TMP}" "${port}" &
+-tang_wait_until_ready "${port}"
++port=$(tang_new_random_port)
++tang_run "${TMP}" "${port}"
+ 
+-url="http://${TANG_HOST}:${port}"
++url="http://localhost:${port}"
+ adv="${TMP}/adv"
+ tang_get_adv "${port}" "${adv}"
+ 
+--- a/src/luks/tests/tests-common-functions.in
++++ b/src/luks/tests/tests-common-functions.in
+@@ -18,6 +18,8 @@
+ # along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ #
+ 
++. tang-common-test-functions
++
+ error() {
+     echo "${1}" >&2
+     exit 1
+@@ -34,20 +36,6 @@
+     return @OLD_CRYPTSETUP@
+ }
+ 
+-# Creates a tang adv to be used in the test.
+-create_tang_adv() {
+-    local adv="${1}"
+-    local SIG="${TMP}/sig.jwk"
+-    jose jwk gen -i '{"alg":"ES512"}' > "${SIG}"
+-
+-    local EXC="${TMP}/exc.jwk"
+-    jose jwk gen -i '{"alg":"ECMR"}' > "${EXC}"
+-
+-    local TEMPLATE='{"protected":{"cty":"jwk-set+json"}}'
+-    jose jwk pub -s -i "${SIG}" -i "${EXC}" \
+-        | jose jws sig -I- -s "${TEMPLATE}" -k "${SIG}" -o "${adv}"
+-}
+-
+ # Creates a new LUKS1 or LUKS2 device to be used.
+ new_device() {
+     local LUKS="${1}"
+@@ -236,132 +224,4 @@
+     return 0
+ }
+ 
+-
+-# Get a random port to be used with a test tang server.
+-get_random_port() {
+-    shuf -i 1024-65535 -n 1
+-}
+-
+-# Removes tang rotated keys from the test server.
+-tang_remove_rotated_keys() {
+-    local basedir="${1}"
+-
+-    if [ -z "${basedir}" ]; then
+-        echo "Please pass a valid base directory for tang"
+-        return 1
+-    fi
+-
+-    [ -z "${TANGD_UPDATE}" ] && skip_test "WARNING: TANGD_UPDATE is not defined."
+-
+-    local db="${basedir}/db"
+-    local cache="${basedir}/cache"
+-    mkdir -p "${db}"
+-    mkdir -p "${cache}"
+-
+-    pushd "${db}"
+-        find . -name ".*.jwk" -exec rm -f {} \;
+-    popd
+-
+-    "${TANGD_UPDATE}" "${db}" "${cache}"
+-    return 0
+-}
+-
+-# Creates new keys for the test tang server.
+-tang_new_keys() {
+-    local basedir="${1}"
+-    local rotate="${2}"
+-
+-    if [ -z "${basedir}" ]; then
+-        echo "Please pass a valid base directory for tang"
+-        return 1
+-    fi
+-
+-    [ -z "${TANGD_KEYGEN}" ] && skip_test "WARNING: TANGD_KEYGEN is not defined."
+-    [ -z "${TANGD_UPDATE}" ] && skip_test "WARNING: TANGD_UPDATE is not defined."
+-
+-    local db="${basedir}/db"
+-    local cache="${basedir}/cache"
+-    mkdir -p "${db}"
+-
+-    if [ -n "${rotate}" ]; then
+-        pushd "${db}"
+-            local k
+-            k=$(find . -name "*.jwk" | wc -l)
+-            if [ "${k}" -gt 0 ]; then
+-                for k in *.jwk; do
+-                    mv -f -- "${k}" ".${k}"
+-                done
+-            fi
+-        popd
+-    fi
+-
+-    "${TANGD_KEYGEN}" "${db}"
+-    "${TANGD_UPDATE}" "${db}" "${cache}"
+-
+-    return 0
+-}
+-
+-# Start a test tang server.
+-tang_run() {
+-    local basedir="${1}"
+-    local port="${2}"
+-
+-    if [ -z "${basedir}" ]; then
+-        echo "Please pass a valid base directory for tang" >&2
+-        return 1
+-    fi
+-
+-    if [ -z "${port}" ]; then
+-        echo "Please pass a valid port for tang" >&2
+-        return 1
+-    fi
+-
+-    if ! tang_new_keys "${basedir}"; then
+-        echo "Error creating new keys for tang server" >&2
+-        return 1
+-    fi
+-
+-    local KEYS="${basedir}/cache"
+-    local inetd='--inetd'
+-    [ "${SD_ACTIVATE##*/}" = "systemd-activate" ] && inetd=
+-
+-    local pid pidfile
+-    pidfile="${basedir}/tang.pid"
+-
+-    "${SD_ACTIVATE}" ${inetd} -l "${TANG_HOST}":"${port}" \
+-            -a "${TANGD}" "${KEYS}" &
+-    pid=$!
+-    echo "${pid}" > "${pidfile}"
+-}
+-
+-# Stop tang server.
+-tang_stop() {
+-    local basedir="${1}"
+-    local pidfile="${basedir}/tang.pid"
+-    [ -f "${pidfile}" ] || return 0
+-
+-    local pid
+-    pid=$(<"${pidfile}")
+-    kill "${pid}"
+-}
+-
+-# Wait for the tang server to be operational.
+-tang_wait_until_ready() {
+-   local port="${1}"
+-   while ! curl --output /dev/null --silent --fail \
+-                http://"${TANG_HOST}":"${port}"/adv; do
+-       sleep 0.1
+-       echo -n . >&2
+-   done
+-}
+-
+-# Get tang advertisement.
+-tang_get_adv() {
+-    local port="${1}"
+-    local adv="${2}"
+-
+-    curl -o "${adv}" http://"${TANG_HOST}":"${port}"/adv
+-}
+-
+-export TANG_HOST=127.0.0.1
+ export DEFAULT_PASS='just-some-test-password-here'
+--- a/src/luks/tests/unbind-luks1
++++ b/src/luks/tests/unbind-luks1
+@@ -30,7 +30,7 @@
+ 
+ TMP="$(mktemp -d)"
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ CFG="$(printf '{"url":"foobar","adv":"%s"}' "$ADV")"
+ 
+ # LUKS1.
+--- a/src/luks/tests/unbind-luks2
++++ b/src/luks/tests/unbind-luks2
+@@ -34,7 +34,7 @@
+ 
+ TMP="$(mktemp -d)"
+ ADV="${TMP}/adv.jws"
+-create_tang_adv "${ADV}"
++tang_create_adv "${TMP}" "${ADV}"
+ CFG="$(printf '{"url":"foobar","adv":"%s"}' "$ADV")"
+ 
+ # LUKS2.
+--- a/src/luks/tests/unlock-tang-luks1
++++ b/src/luks/tests/unlock-tang-luks1
+@@ -33,11 +33,10 @@
+ 
+ TMP="$(mktemp -d)"
+ 
+-port=$(get_random_port)
+-tang_run "${TMP}" "${port}" &
+-tang_wait_until_ready "${port}"
++port=$(tang_new_random_port)
++tang_run "${TMP}" "${port}"
+ 
+-url="http://${TANG_HOST}:${port}"
++url="http://localhost:${port}"
+ adv="${TMP}/adv"
+ tang_get_adv "${port}" "${adv}"
+ 
+--- a/src/luks/tests/unlock-tang-luks2
++++ b/src/luks/tests/unlock-tang-luks2
+@@ -33,11 +33,10 @@
+ 
+ TMP="$(mktemp -d)"
+ 
+-port=$(get_random_port)
+-tang_run "${TMP}" "${port}" &
+-tang_wait_until_ready "${port}"
++port=$(tang_new_random_port)
++tang_run "${TMP}" "${port}"
+ 
+-url="http://${TANG_HOST}:${port}"
++url="http://localhost:${port}"
+ adv="${TMP}/adv"
+ tang_get_adv "${port}" "${adv}"
+ 

+ 2 - 0
debian/patches/series

@@ -1,5 +1,7 @@
 # cherry-picked commits. Keep in upstream's chronological order
 cherry-pick/1605094998.v15-1-gef76951.pins-tpm2-add-support-for-tpm2-tools-5-x.patch
+cherry-pick/1605797689.v15-2-g3dedc5d.tests-move-tang-tests-to-src-pins-tang.patch
+cherry-pick/1605845630.v15-3-ga07e753.tests-update-src-luks-tests-to-use-shared-tang-test-functions.patch
 cherry-pick/1606953228.v15-5-g9cdd041.systemd-drop-ncat-dependency.patch
 
 # patches for upstream