From 0449160c84daff8c557dee47a970e4f4837ff81d Mon Sep 17 00:00:00 2001 From: Huaxin Lu Date: Mon, 12 Dec 2022 00:16:01 +0800 Subject: [PATCH] support EBS sign for IMA digest list Signed-off-by: Huaxin Lu Signed-off-by: zhangguangzhi --- brp-digest-list | 46 +++++----- brp-ebs-sign | 238 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 262 insertions(+), 22 deletions(-) create mode 100644 brp-ebs-sign diff --git a/brp-digest-list b/brp-digest-list index e698b7a..d1e2600 100644 --- a/brp-digest-list +++ b/brp-digest-list @@ -26,7 +26,6 @@ fi DIGEST_LIST_DIR=$RPM_BUILD_ROOT/$2/etc/ima/digest_lists mkdir -p $DIGEST_LIST_DIR mkdir -p $DIGEST_LIST_DIR.tlv -mkdir -p $DIGEST_LIST_DIR.sig # Generate digest list for the kernel gen_digest_lists -i M: -t metadata -f compact -d $DIGEST_LIST_DIR -i l:policy \ @@ -70,28 +69,31 @@ DIGEST_LIST_TLV_PATH="$DIGEST_LIST_DIR.tlv/0-metadata_list-compact_tlv-$(basenam chmod 644 $DIGEST_LIST_TLV_PATH echo $DIGEST_LIST_TLV_PATH -if [[ "$(basename $BIN_PKG_FILES)" =~ "digest-list-tools" && \ - ! $(basename $BIN_PKG_FILES) =~ "debug" ]]; then - # Generate digest list for the user space parsers - LD_LIBRARY_PATH=$RPM_BUILD_ROOT/usr/lib64 \ - $RPM_BUILD_ROOT/usr/bin/gen_digest_lists \ - -d $DIGEST_LIST_DIR -t parser -f compact -m immutable \ - -i I:$RPM_BUILD_ROOT/usr/libexec -o add -p -1 -i i: - - f="$DIGEST_LIST_DIR/0-parser_list-compact-libexec" - [ -f $f ] || exit 0 - - chmod 644 $f - echo $f +#if [[ "$(basename $BIN_PKG_FILES)" =~ "digest-list-tools" && \ +# ! $(basename $BIN_PKG_FILES) =~ "debug" ]]; then +# Generate digest list for the user space parsers + +# do EBS sign +export PUBLISHER_HOST=$(grep PUBLISHER_HOST /lkp/scheduled/job.yaml | awk '{print $2}') +export PUBLISHER_PORT=$(grep PUBLISHER_PORT /lkp/scheduled/job.yaml | awk '{print $2}') +if [[ -n "$PUBLISHER_HOST" && -n "$PUBLISHER_PORT" ]]; then + [ -f /usr/lib/rpm/brp-ebs-sign ] || exit 0 + sh /usr/lib/rpm/brp-ebs-sign --ima-digestlist $DIGEST_LIST_PATH 1>&2 + [ -f $DIGEST_LIST_PATH.sig ] || exit 0 + chmod 644 $DIGEST_LIST_PATH.sig + mv $DIGEST_LIST_PATH.sig $DIGEST_LIST_PATH + exit 0 +fi - [ -f /usr/lib/rpm/brp-suse.d/brp-99-pesign ] || exit 0 +# do OBS sign +[ -f /usr/lib/rpm/brp-suse.d/brp-99-pesign ] || exit 0 - export BRP_PESIGN_FILES="$2/etc/ima/digest_lists/*" - export RPM_BUILD_ROOT - export RPM_PACKAGE_NAME="digest-list-tools" - export RPM_SOURCE_DIR="$(rpm --eval %_topdir)/SOURCES" +export BRP_PESIGN_FILES="$2/etc/ima/digest_lists/*" +export RPM_BUILD_ROOT +export RPM_PACKAGE_NAME="digest-list-tools" +export RPM_SOURCE_DIR="$(rpm --eval %_topdir)/SOURCES" - if [ -f "/usr/lib/rpm/brp-suse.d/brp-99-pesign" ]; then - /usr/lib/rpm/brp-suse.d/brp-99-pesign &> /dev/null - fi +if [ -f "/usr/lib/rpm/brp-suse.d/brp-99-pesign" ]; then + /usr/lib/rpm/brp-suse.d/brp-99-pesign &> /dev/null fi +#fi diff --git a/brp-ebs-sign b/brp-ebs-sign new file mode 100644 index 0000000..a7a83e5 --- /dev/null +++ b/brp-ebs-sign @@ -0,0 +1,238 @@ +#!/bin/bash + +INPUT_TYPE=$1 +INPUT_FILE=$2 +SIGN_FILE=$INPUT_FILE +PROJECT_CONF="/lkp/scheduled/job.yaml" +POST_ADDR="" +POST_FILE_SHA256="" +POST_KEY_NAME="" +POST_KEY_TYPE="" +POST_FILE_TYPE="" +POST_SIGN_TYPE="" +POST_JOB_ID="" +POST_OS_ORIJECT="" +CONFIG_RETEST_COUNT=5 +SIGN_RESULT=0 +FAILED_SIGN_PERMISSION_DENIED=2 + +# Tool functions for JSON +get_json_value(){ + echo "$1" | \ + awk -F "[{,:}]" '{for(i=1;i $INPUT_FILE.sig + if [ $? -ne 0 ]; then + echo "Failed to write the signed file" + return 1 + fi + + # for test + # cp -f $INPUT_FILE $INPUT_FILE.sig + # req="{file_sha256:41c68fca7b3870cc9ef13a828a74af933bd8e4ff345fcfa316}" + + # 3. check the hash + sha256_cal=$(sha256sum $INPUT_FILE.sig | awk '{print $1}') + sha256_get=$(get_json_value "$req" "file_sha256" | tr '[:upper:]' '[:lower:]') + if [ "$sha256_cal" != "$sha256_get" ]; then + echo "Failed to verify the hash value" + return 1 + fi +} + +sign_post() { + case $INPUT_TYPE in + --efi) + efi_sign_post + ;; + --module) + module_sign_post + ;; + --ima-digestlist) + ima_digestlist_sign_post + ;; + --kernel) + kernel_sign_post + ;; + esac +} + +# Main function +sign_pre + +for ((i=1; i<=$CONFIG_RETEST_COUNT; i++)); do + sign + ret_sign=$? + if [ $ret_sign -eq 0 ]; then + echo "Succeed to sign file" + break; + elif [ $ret_sign -eq $FAILED_SIGN_PERMISSION_DENIED ]; then + echo "Failed to sign file, permission denied" + SIGN_RESULT=$FAILED_SIGN_PERMISSION_DENIED + break; + elif [ $i -ne $CONFIG_RETEST_COUNT ]; then + echo "Failed to sign file, try again" + elif [ $i -eq $CONFIG_RETEST_COUNT ]; then + echo "Failed to sign file" + SIGN_RESULT=1 + fi +done + +sign_post +exit $SIGN_RESULT -- 2.33.0