Blame SOURCES/0008-Move-most-of-macros.pesign-to-pesign-rpmbuild-helper.patch

4bf471
From 6c16b978fd33f3611e9f7aaf4f9c44bce1679485 Mon Sep 17 00:00:00 2001
4bf471
From: Peter Jones <pjones@redhat.com>
4bf471
Date: Mon, 6 Jul 2020 13:54:35 -0400
4bf471
Subject: [PATCH] Move most of macros.pesign to pesign-rpmbuild-helper
4bf471
4bf471
Signed-off-by: Peter Jones <pjones@redhat.com>
4bf471
---
4bf471
 Make.defaults                 |   1 +
4bf471
 src/Makefile                  |   8 +-
4bf471
 src/macros.pesign             |  74 ++++--------
4bf471
 src/pesign-rpmbuild-helper.in | 222 ++++++++++++++++++++++++++++++++++
4bf471
 4 files changed, 252 insertions(+), 53 deletions(-)
4bf471
 create mode 100644 src/pesign-rpmbuild-helper.in
4bf471
4bf471
diff --git a/Make.defaults b/Make.defaults
4bf471
index 0bacafe0d01..d4cd626c11e 100644
4bf471
--- a/Make.defaults
4bf471
+++ b/Make.defaults
4bf471
@@ -16,6 +16,7 @@ INSTALLROOT = $(DESTDIR)
4bf471
 
4bf471
 INSTALL	?= install
4bf471
 CROSS_COMPILE	?=
4bf471
+EFI_ARCHES ?= aa64 ia32 x64
4bf471
 
4bf471
 PKG_CONFIG = $(CROSS_COMPILE)pkg-config
4bf471
 CC	:= $(if $(filter default,$(origin CC)),$(CROSS_COMPILE)gcc,$(CC))
4bf471
diff --git a/src/Makefile b/src/Makefile
4bf471
index 74327ba13f3..a7ca89159c6 100644
4bf471
--- a/src/Makefile
4bf471
+++ b/src/Makefile
4bf471
@@ -5,7 +5,7 @@ include $(TOPDIR)/Make.version
4bf471
 include $(TOPDIR)/Make.rules
4bf471
 include $(TOPDIR)/Make.defaults
4bf471
 
4bf471
-BINTARGETS=authvar client efikeygen efisiglist pesigcheck pesign
4bf471
+BINTARGETS=authvar client efikeygen efisiglist pesigcheck pesign pesign-rpmbuild-helper
4bf471
 SVCTARGETS=pesign.sysvinit pesign.service
4bf471
 TARGETS=$(BINTARGETS) $(SVCTARGETS)
4bf471
 
4bf471
@@ -49,6 +49,11 @@ pesign : $(call objects-of,$(PESIGN_SOURCES) $(COMMON_SOURCES) $(COMMON_PE_SOURC
4bf471
 pesign : LDLIBS+=$(TOPDIR)/libdpe/libdpe.a
4bf471
 pesign : PKGS=efivar nss nspr popt
4bf471
 
4bf471
+pesign-rpmbuild-helper: pesign-rpmbuild-helper.in
4bf471
+	sed \
4bf471
+		-e "s/@@EFI_ARCHES@@/$(EFI_ARCHES)/g" \
4bf471
+		$^ > $@
4bf471
+
4bf471
 deps : PKGS=efivar nss nspr popt uuid
4bf471
 deps : $(ALL_SOURCES)
4bf471
 	$(MAKE) -f $(TOPDIR)/Make.deps \
4bf471
@@ -94,6 +99,7 @@ install :
4bf471
 	$(INSTALL) -m 644 macros.pesign $(INSTALLROOT)/etc/rpm/
4bf471
 	$(INSTALL) -d -m 755 $(INSTALLROOT)$(libexecdir)/pesign/
4bf471
 	$(INSTALL) -m 750 pesign-authorize $(INSTALLROOT)$(libexecdir)/pesign/
4bf471
+	$(INSTALL) -m 755 pesign-rpmbuild-helper $(INSTALLROOT)$(libexecdir)/pesign/
4bf471
 	$(INSTALL) -d -m 700 $(INSTALLROOT)/etc/pesign
4bf471
 	$(INSTALL) -m 600 pesign-users $(INSTALLROOT)/etc/pesign/users
4bf471
 	$(INSTALL) -m 600 pesign-groups $(INSTALLROOT)/etc/pesign/groups
4bf471
diff --git a/src/macros.pesign b/src/macros.pesign
4bf471
index 5a6da1c6809..2e984b4eeb3 100644
4bf471
--- a/src/macros.pesign
4bf471
+++ b/src/macros.pesign
4bf471
@@ -6,7 +6,7 @@
4bf471
 # %pesign -s -i shim.orig -o shim.efi
4bf471
 # And magically get the right thing.
4bf471
 
4bf471
-%__pesign_token %{nil}%{?pe_signing_token:-t "%{pe_signing_token}"}
4bf471
+%__pesign_token %{nil}%{?pe_signing_token:--token "%{pe_signing_token}"}
4bf471
 %__pesign_cert %{!?pe_signing_cert:"Red Hat Test Certificate"}%{?pe_signing_cert:"%{pe_signing_cert}"}
4bf471
 
4bf471
 %__pesign_client_token %{!?pe_signing_token:"OpenSC Card (Fedora Signer)"}%{?pe_signing_token:"%{pe_signing_token}"}
4bf471
@@ -24,54 +24,24 @@
4bf471
 # -a <input ca cert filename>		# rhel only
4bf471
 # -s 					# perform signing
4bf471
 %pesign(i:o:C:e:c:n:a:s)						\
4bf471
-  _pesign_nssdir=/etc/pki/pesign					\
4bf471
-  if [ %{__pesign_cert} = "Red Hat Test Certificate" ]; then		\
4bf471
-    _pesign_nssdir=/etc/pki/pesign-rh-test				\
4bf471
-  fi									\
4bf471
-  if [ -x %{_pesign} ] &&  						\\\
4bf471
-       [ "%{_target_cpu}" == "x86_64" -o 				\\\
4bf471
-         "%{_target_cpu}" == "aarch64" ]; then				\
4bf471
-    if [ "0%{?rhel}" -ge "7" -a -f /usr/bin/rpm-sign ]; then		\
4bf471
-      nss=$(mktemp -p $PWD -d)						\
4bf471
-      echo > ${nss}/pwfile						\
4bf471
-      certutil -N -d ${nss} -f ${nss}/pwfile				\
4bf471
-      certutil -A -n "ca" -t "CT,C," -i %{-a*} -d ${nss}		\
4bf471
-      certutil -A -n "signer" -t ",c," -i %{-c*} -d ${nss}		\
4bf471
-      sattrs=$(mktemp -p $PWD --suffix=.der)				\
4bf471
-      %{_pesign} %{-i} -E ${sattrs} --certdir ${nss} --force		\
4bf471
-      rpm-sign --key "%{-n*}" --rsadgstsign ${sattrs}			\
4bf471
-      %{_pesign} -R ${sattrs}.sig -I ${sattrs} %{-i}			\\\
4bf471
-                 --certdir ${nss} -c signer %{-o}			\
4bf471
-      rm -rf ${sattrs} ${sattrs}.sig ${nss}				\
4bf471
-    elif [ "$(id -un)" == "kojibuilder" -a				\\\
4bf471
-           grep -q ID=fedora /etc/os-release -a				\\\
4bf471
-           ! -S /run/pesign/socket ]; then				\
4bf471
-      echo "No socket even though this is kojibuilder" 1>&2		\
4bf471
-      ls -ld /run/pesign 1>&2					\
4bf471
-      ls -l /run/pesign/socket 1>&2					\
4bf471
-      getfacl /run/pesign 1>&2					\
4bf471
-      getfacl /run/pesign/socket 1>&2				\
4bf471
-      exit 1								\
4bf471
-    elif [ -S /run/pesign/socket ]; then				\
4bf471
-      %{_pesign_client} -t %{__pesign_client_token}			\\\
4bf471
-                        -c %{__pesign_client_cert}			\\\
4bf471
-                        %{-i} %{-o} %{-e} %{-s} %{-C}			\
4bf471
-    else								\
4bf471
-      %{_pesign} %{__pesign_token} -c %{__pesign_cert}			\\\
4bf471
-                 --certdir ${_pesign_nssdir}				\\\
4bf471
-                 %{-i} %{-o} %{-e} %{-s} %{-C}				\
4bf471
-    fi									\
4bf471
-  else									\
4bf471
-    if [ -n "%{-i*}" -a -n "%{-o*}" ]; then				\
4bf471
-      mv %{-i*} %{-o*}							\
4bf471
-    elif [ -n "%{-i*}" -a -n "%{-e*}" ]; then				\
4bf471
-      touch %{-e*}							\
4bf471
-    fi									\
4bf471
-  fi									\
4bf471
-  if [ ! -s %{-o} ]; then						\
4bf471
-    if [ -e "%{-o*}" ]; then						\
4bf471
-      rm -f %{-o*}							\
4bf471
-    fi									\
4bf471
-    exit 1								\
4bf471
-  fi ;
4bf471
-
4bf471
+  %{_libexecdir}/pesign/pesign-rpmbuild-helper				\\\
4bf471
+    "%{_target_cpu}"							\\\
4bf471
+    "%{_pesign}"							\\\
4bf471
+    "%{_pesign_client}"							\\\
4bf471
+    %{?__pesign_client_token:--client-token %{__pesign_client_token}}	\\\
4bf471
+    %{?__pesign_client_cert:--client-cert %{__pesign_client_cert}}	\\\
4bf471
+    %{?__pesign_token:%{__pesign_token}}				\\\
4bf471
+    %{?__pesign_cert:--cert %{__pesign_cert}}				\\\
4bf471
+    %{?_buildhost:--hostname "%{_buildhost}"}				\\\
4bf471
+    %{?vendor:--vendor "%{vendor}"}					\\\
4bf471
+    %{?_rhel:--rhelver "%{_rhel}"}					\\\
4bf471
+    %{?-n:--rhelcert %{-n*}}%{?!-n:--rhelcert %{__pesign_cert}}	\\\
4bf471
+    %{?-a:--rhelcafile "%{-a*}"}					\\\
4bf471
+    %{?-c:--rhelcertfile "%{-c*}"}					\\\
4bf471
+    %{?-C:--certout "%{-C*}"}						\\\
4bf471
+    %{?-e:--sattrout "%{-e*}"}						\\\
4bf471
+    %{?-i:--in "%{-i*}"}						\\\
4bf471
+    %{?-o:--out "%{-o*}"}						\\\
4bf471
+    %{?-s:--sign}							\\\
4bf471
+    ;									\
4bf471
+%{nil}
4bf471
diff --git a/src/pesign-rpmbuild-helper.in b/src/pesign-rpmbuild-helper.in
4bf471
new file mode 100644
4bf471
index 00000000000..c5287c27e0c
4bf471
--- /dev/null
4bf471
+++ b/src/pesign-rpmbuild-helper.in
4bf471
@@ -0,0 +1,222 @@
4bf471
+#!/bin/bash
4bf471
+# shellcheck shell=bash
4bf471
+
4bf471
+set -eu
4bf471
+set -x
4bf471
+
4bf471
+usage() {
4bf471
+    local status="${1}" && shift
4bf471
+    local out
4bf471
+    if [[ "${status}" -eq 0 ]] ; then
4bf471
+	out=/dev/stdout
4bf471
+    else
4bf471
+	out=/dev/stderr
4bf471
+    fi
4bf471
+
4bf471
+    if [[ $# -gt 0 ]] ; then
4bf471
+	echo "${0}: error: $*" >>"${out}"
4bf471
+    fi
4bf471
+    echo "usage: ${0} TARGET_CPU PESIGN_BINARY PESIGN_CLIENT_BINARY [OPTIONS]" >>"${out}"
4bf471
+    exit "${status}"
4bf471
+}
4bf471
+
4bf471
+is_efi_arch() {
4bf471
+    local arch="${1}"
4bf471
+    local arches=(@@EFI_ARCHES@@)
4bf471
+    local x
4bf471
+    for x in "${arches[@]}" ; do
4bf471
+	if [[ "${arch}" = "${x}" ]] ; then
4bf471
+	    return 0
4bf471
+	fi
4bf471
+    done
4bf471
+    return 1
4bf471
+}
4bf471
+
4bf471
+error_on_empty() {
4bf471
+    local f="${1}"
4bf471
+    if [[ ! -s "${f}" ]] ; then
4bf471
+	if [[ -e "${f}" ]] ; then
4bf471
+	    rm -f "${f}"
4bf471
+	fi
4bf471
+	echo "${0}: error: empty result file \"${f}\"">>/dev/stderr
4bf471
+	exit 1
4bf471
+    fi
4bf471
+}
4bf471
+
4bf471
+main() {
4bf471
+    if [[ $# -lt 3 ]] ; then
4bf471
+	usage 1 not enough arguments
4bf471
+    fi
4bf471
+    local target_cpu="${1}" && shift
4bf471
+    local bin="${1}" && shift
4bf471
+    local client="${1}" && shift
4bf471
+
4bf471
+    local rhelcafile="" || :
4bf471
+    local rhelcertfile="" || :
4bf471
+
4bf471
+    local certout=() || :
4bf471
+    local sattrout=() || :
4bf471
+    local input=() || :
4bf471
+    local output=() || :
4bf471
+    local client_token=() || :
4bf471
+    local client_cert=() || :
4bf471
+    local token=() || :
4bf471
+    local cert=() || :
4bf471
+    local rhelcert=() || :
4bf471
+    local rhelver=0 || :
4bf471
+    local sign="" || :
4bf471
+    local arch="" || :
4bf471
+    local vendor="" || :
4bf471
+    local HOSTNAME="" || :
4bf471
+
4bf471
+    while [[ $# -ge 2 ]] ; do
4bf471
+	case " ${1} " in
4bf471
+	" --rhelcafile ")
4bf471
+	    rhelcafile="${2}"
4bf471
+	    ;;
4bf471
+	" --rhelcertfile ")
4bf471
+	    rhelcertfile="${2}"
4bf471
+	    ;;
4bf471
+	" --hostname ")
4bf471
+	    HOSTNAME="${2}"
4bf471
+	    ;;
4bf471
+	" --certout ")
4bf471
+	    certout[0]=-C
4bf471
+	    certout[1]="${2}"
4bf471
+	    ;;
4bf471
+	" --sattrout ")
4bf471
+	    sattrout[0]=-e
4bf471
+	    sattrout[1]="${2}"
4bf471
+	    ;;
4bf471
+	" --client-token ")
4bf471
+	    client_token[0]=-t
4bf471
+	    client_token[1]="${2}"
4bf471
+	    ;;
4bf471
+	" --client-cert ")
4bf471
+	    client_cert[0]=-c
4bf471
+	    client_cert[1]="${2}"
4bf471
+	    ;;
4bf471
+	" --token ")
4bf471
+	    token[0]=-t
4bf471
+	    token[1]="${2}"
4bf471
+	    ;;
4bf471
+	" --cert ")
4bf471
+	    cert[0]=-c
4bf471
+	    cert[1]="${2}"
4bf471
+	    ;;
4bf471
+	" --rhelcert ")
4bf471
+	    rhelcert[0]=-c
4bf471
+	    rhelcert[1]="${2}"
4bf471
+	    ;;
4bf471
+	" --in ")
4bf471
+	    input[0]=-i
4bf471
+	    input[1]="${2}"
4bf471
+	    ;;
4bf471
+	" --out ")
4bf471
+	    output[0]=-o
4bf471
+	    output[1]="${2}"
4bf471
+	    ;;
4bf471
+	" --rhelver ")
4bf471
+	    rhelver="${2}"
4bf471
+	    ;;
4bf471
+	" --vendor ")
4bf471
+	    vendor="${2}"
4bf471
+	    ;;
4bf471
+	*)
4bf471
+	    break
4bf471
+	    ;;
4bf471
+	esac
4bf471
+	shift
4bf471
+	shift
4bf471
+    done
4bf471
+    if [[ $# -ge 1 ]] && [[ "${1}" = --sign ]] ; then
4bf471
+	sign=-s
4bf471
+	shift
4bf471
+    fi
4bf471
+
4bf471
+    if [[ -z "${target_cpu}" ]] ; then
4bf471
+	target_cpu="$(uname -m)"
4bf471
+    fi
4bf471
+
4bf471
+    target_cpu="${target_cpu/i?86/ia32}"
4bf471
+    target_cpu="${target_cpu/x86_64/x64}"
4bf471
+    target_cpu="${target_cpu/aarch64/aa64}"
4bf471
+    target_cpu="${target_cpu/arm*/arm/}"
4bf471
+
4bf471
+    local nssdir=/etc/pki/pesign
4bf471
+    if [[ "${#cert[@]}" -eq 2 ]] &&
4bf471
+       [[ "${cert[1]}" == "Red Hat Test Certificate" ]] ; then
4bf471
+	nssdir=/etc/pki/pesign-rh-test
4bf471
+    fi
4bf471
+
4bf471
+    # is_efi_arch is ultimately returning "is pesign configured to sign these
4bf471
+    # using the rpm macro", so if it isn't, we're just copying the input to
4bf471
+    # the output
4bf471
+    if [[ -x "${bin}" ]] && ! is_efi_arch "${target_cpu}" ; then
4bf471
+	if [[ -n "${input[*]}" ]] && [[ -n "${output[*]}" ]] ; then
4bf471
+	    cp -v "${input[1]}" "${output[1]}"
4bf471
+	elif [[ -n "${input[*]}" ]] && [[ -n "${sattrout[*]}" ]] ; then
4bf471
+	    touch "${sattrout[1]}"
4bf471
+	fi
4bf471
+
4bf471
+	# if there's a 0-sized output file, delete it and error out
4bf471
+	error_on_empty "${output[1]}"
4bf471
+	return 0
4bf471
+    fi
4bf471
+
4bf471
+    USERNAME="${USERNAME:-$(id -un)}"
4bf471
+
4bf471
+    local socket="" || :
4bf471
+    if grep -q ID=fedora /etc/os-release \
4bf471
+       && [[ "${rhelver}" -lt 7 ]] \
4bf471
+       && [[ "${USERNAME}" = "mockbuild" ]] \
4bf471
+       && [[ "${vendor}" = "Fedora Project" ]] \
4bf471
+       && [[ "${HOSTNAME}" =~ bkernel.* ]]
4bf471
+    then
4bf471
+	if [[ -S /run/pesign/socket ]] ; then
4bf471
+	    socket=/run/pesign/socket
4bf471
+	elif [[ -S /var/run/pesign/socket ]]; then
4bf471
+	    socket=/var/run/pesign/socket
4bf471
+	else
4bf471
+	    echo "Warning: no pesign socket even though user is ${USERNAME}" 1>&2
4bf471
+	    echo "Warning: if this is a non-scratch koji build, this is wrong" 1>&2
4bf471
+	    ls -ld /run/pesign /var/run/pesign 1>&2 ||:
4bf471
+	    ls -l /run/pesign/socket /var/run/pesign/socket 1>&2 ||:
4bf471
+	    getfacl /run/pesign /run/pesign/socket /var/run/pesign /var/run/pesign/socket 1>&2 ||:
4bf471
+	    getfacl -n /run/pesign /run/pesign/socket /var/run/pesign /var/run/pesign/socket 1>&2 ||:
4bf471
+	fi
4bf471
+    fi
4bf471
+
4bf471
+    if [[ "${rhelver}" -ge 7 ]] ; then
4bf471
+	nssdir="$(mktemp -p "${PWD}" -d)"
4bf471
+	echo > "${nssdir}/pwfile"
4bf471
+	certutil -N -d "${nssdir}" -f "${nssdir}/pwfile"
4bf471
+	certutil -A -n "ca" -t "CTu,CTu,CTu" -i "${rhelcafile}" -d "${nssdir}"
4bf471
+	certutil -A -n "signer" -t "CTu,CTu,CTu" -i "${rhelcertfile}" -d "${nssdir}"
4bf471
+	sattrs="$(mktemp -p "${PWD}" --suffix=.der)"
4bf471
+	"${bin}" -E "${sattrs}" --certdir "${nssdir}" \
4bf471
+	    "${input[@]}" --force
4bf471
+	rpm-sign --key "${rhelcert[1]}" --rsadgstsign "${sattrs}"
4bf471
+	"${bin}" -R "${sattrs}.sig" -I "${sattrs}" \
4bf471
+	    --certdir "${nssdir}" -c signer \
4bf471
+	    "${input[@]}" "${output[@]}"
4bf471
+	rm -rf "${sattrs}" "${sattrs}.sig" "${nssdir}"
4bf471
+    elif [[ -n "${socket}" ]] ; then
4bf471
+	"${client}" "${client_token[@]}" "${client_cert[@]}"    \
4bf471
+	    "${sattrout[@]}" "${certout[@]}"	\
4bf471
+	    ${sign} "${input[@]}" "${output[@]}"
4bf471
+    else
4bf471
+	"${bin}" --certdir "${nssdir}" "${token[@]}"	\
4bf471
+	    "${cert[@]}" ${sign} "${sattrout[@]}"	\
4bf471
+	    "${certout[@]}"    "${input[@]}" "${output[@]}"
4bf471
+    fi
4bf471
+
4bf471
+    # if there's a 0-sized output file, delete it and error out
4bf471
+    if [[ "${#output[@]}" -eq 2 ]] ; then
4bf471
+	error_on_empty "${output[1]}"
4bf471
+    fi
4bf471
+}
4bf471
+
4bf471
+main "${@}"
4bf471
+
4bf471
+# vim:filetype=sh:fenc=utf-8:tw=78:sts=4:sw=4
4bf471
-- 
4bf471
2.26.2
4bf471