From 257ca17b349afbb502c609f361969b0be1f865d6 Mon Sep 17 00:00:00 2001 From: shmalebx9 Date: Sun, 2 Apr 2023 18:06:46 -0600 Subject: [PATCH] inject blobs into release archive and check their hash --- resources/scripts/blobs/inject | 96 +++++++++++++++++++++++++++++----- 1 file changed, 84 insertions(+), 12 deletions(-) diff --git a/resources/scripts/blobs/inject b/resources/scripts/blobs/inject index 153dd6cc..99cfc569 100755 --- a/resources/scripts/blobs/inject +++ b/resources/scripts/blobs/inject @@ -23,6 +23,7 @@ Fail(){ } Modify_gbe(){ + rom=${1} printf "changing mac address in gbe to ${new_mac}\n" _gbe_location=${CONFIG_GBE_BIN_PATH#../../} @@ -42,7 +43,7 @@ Modify_gbe(){ listboards() { for boarddir in resources/coreboot/*; do if [ ! -d "${boarddir}" ]; then continue; fi - board="${boarddir##resources/coreboot/}" + board="${boarddir/##resources/coreboot/}" board="${board%/}" printf '%s\n' "${board##*/}" done @@ -51,7 +52,8 @@ listboards() { # This function tries to determine the board from the filename of the rom. # It will only succeed if the filename is not changed from the build/download Detect_board(){ - filename=$(basename ${rom}) + path=${1} + filename=$(basename ${path}) case ${filename} in grub_*) board=$(echo "${filename}" | cut -d '_' -f2-3) @@ -59,6 +61,10 @@ Detect_board(){ seabios_withgrub_*) board=$(echo "${filename}" | cut -d '_' -f3-4) ;; + *.tar.xz) + _stripped_prefix=${filename#*_} + board="${_stripped_prefix%.tar.xz}" + ;; *) return 1 esac @@ -71,6 +77,7 @@ Detect_board(){ } Patch(){ +rom="${1}" set -- "resources/coreboot/${board}/config/*" . ${1} 2>/dev/null . "resources/coreboot/${board}/board.cfg" @@ -86,11 +93,58 @@ set -- "resources/coreboot/${board}/config/*" ./coreboot/default/util/ifdtool/ifdtool -i me:${_me_location} ${rom} -O ${rom} || exit 1 fi - if [ "${modifygbe}" = "true" ]; then - Modify_gbe + if [ "${modifygbe}" = "true" ] && ! [ "${release}" = "true" ]; then + Modify_gbe ${rom} fi } +Patch_release(){ + _tmpdir=$(mktemp -d "/tmp/${board}_tmpXXXX") + tar xf "${releasearchive}" -C "${_tmpdir}" || \ + Fail 'could not extract release archive' + + for rom in ${_tmpdir}/bin/*/*.rom ; do + echo "patching rom $rom" + Patch ${rom} || \ + Fail "could not patch ${rom}" + done + + ( cd ${_tmpdir}/bin/* + sha1sum --status -c blobhashes || \ + Fail 'ROMs did not match expected hashes' + ) + + + if [ "${modifygbe}" = "true" ]; then + for rom in ${_tmpdir}/bin/*/*.rom ; do + Modify_gbe ${rom} + done + fi + + if ! [ -d bin/release ]; then + mkdir -p bin/release + fi + + mv ${_tmpdir}/bin/* bin/release/ && \ + printf '%s\n' 'Success! Your ROMs are in bin/release' + + rm -r "${_tmpdir}" +} + +Check_release(){ +if ! [ -f ${1} ]; then + return 1 +fi + +_filetype=$(file -b "${1}") + +if [ "${_filetype%%,*}" = "XZ compressed data" ]; then + printf "%s\n" "Release archive ${1} detected" +else + return 1 +fi +} + if [ "${1}" = "listboards" ]; then listboards exit 0 @@ -110,15 +164,25 @@ do esac done -if [ -z ${rom+x} ]; then - Fail 'no rom specified' -elif [ ! -f "${rom}" ]; then - Fail "${rom} is not a valid path" -elif [ -z ${board+x} ]; then - board=$(Detect_board) || \ - Fail 'no board specified' + + +if ! Check_release ${1} ; then + if [ ! -f "${rom}" ]; then + Fail "${rom} is not a valid path" + elif [ -z ${rom+x} ]; then + Fail 'no rom specified' + elif [ -z ${board+x} ]; then + board=$(Detect_board ${rom}) || \ + Fail 'no board specified' + fi +else + release=true + releasearchive="${1}" + board=$(Detect_board ${1}) || \ + Fail 'Could not detect board type' fi + if [ ! -d "resources/coreboot/${board}/" ]; then Fail "board ${board} not found" fi @@ -138,4 +202,12 @@ printf "building cbfstool from coreboot\n" ./build module cbutils default || Fail 'could not build cbfstool' fi -./blobutil download ${board} && Patch +./blobutil download ${board} || \ +Fail "Could not download blobs for ${board}, check network connection" + +if [ "${release}" = "true" ]; then + echo 'patching release file' + Patch_release +else + Patch ${rom} +fi