@@ -554,7 +554,7 @@ phase_deps() {
554554 hr
555555 info " Phase 2: Installing dependencies"
556556
557- local pkgs=(dracut efibootmgr binutils)
557+ local pkgs=(dracut efibootmgr binutils file )
558558
559559 case " $PKG_MGR " in
560560 dnf) pkgs+=(systemd-ukify) ;;
@@ -1098,12 +1098,14 @@ UKI_OUT="${EFI_DIR}/linux-${KERNEL_VER}.efi"
10981098[[ $EUID -eq 0 ]] || die "Must run as root."
10991099require_cmd dracut
11001100require_cmd ukify
1101+ require_cmd file
11011102require_cmd lsinitrd
11021103require_cmd findmnt
11031104require_cmd lsblk
11041105require_cmd blkid
11051106require_cmd df
11061107require_cmd efibootmgr
1108+ require_cmd objdump
11071109require_cmd rpm
11081110[[ -f "$KERNEL_IMG" ]] || die "Kernel image not found: ${KERNEL_IMG}"
11091111mkdir -p "$EFI_DIR"
@@ -1161,7 +1163,81 @@ trap cleanup EXIT
11611163info "Stage 2/2: Assembling UKI via ukify: ${UKI_OUT}"
11621164ukify "${UKIFY_ARGS[@]}"
11631165
1164- info "UKI built successfully: ${UKI_OUT} ($(du -sh "$UKI_OUT" | cut -f1))"
1166+ extract_uki_section_text() {
1167+ local image="$1" section="$2" hex
1168+ hex=$(objdump -s -j "$section" "$image" 2>/dev/null \
1169+ | awk '/^[[:space:]]*[0-9a-f]+[[:space:]]/ {for (i=2; i<=5; i++) if ($i ~ /^[0-9a-fA-F]{8}$/) printf "%s", $i}')
1170+ [[ -n "$hex" ]] || return 1
1171+ printf '%s' "$hex" | xxd -r -p | tr -d '\000' | tr -d '\r\n'
1172+ }
1173+
1174+ extract_ukify_inspect_field() {
1175+ local image="$1" key="$2" line value
1176+ while IFS= read -r line; do
1177+ if [[ "$line" =~ ^[[:space:]]*${key}[[:space:]]*:[[:space:]]*(.+)$ ]]; then
1178+ value="${BASH_REMATCH[1]}"
1179+ value="${value%\"}"
1180+ value="${value#\"}"
1181+ printf '%s\n' "$value"
1182+ return 0
1183+ fi
1184+ done < <(ukify inspect "$image" 2>/dev/null || true)
1185+ return 1
1186+ }
1187+
1188+ verify_uki_post_build() {
1189+ local image="$1" kernel_ver="$2" intended_cmdline="$3"
1190+ local min_size_bytes=$((10 * 1024 * 1024))
1191+ local size_bytes file_desc file_fmt embedded_cmdline embedded_uname sha ts
1192+
1193+ [[ -e "$image" ]] || die "Post-build verification failed: UKI artifact is missing: ${image}"
1194+ [[ -s "$image" ]] || die "Post-build verification failed: UKI artifact is empty (0 bytes): ${image}"
1195+
1196+ size_bytes=$(stat -c '%s' "$image")
1197+ (( size_bytes > 0 )) || die "Post-build verification failed: UKI size is 0 bytes: ${image}"
1198+ (( size_bytes >= min_size_bytes )) || die "Post-build verification failed: UKI size ${size_bytes} bytes is below minimum threshold ${min_size_bytes} bytes."
1199+
1200+ file_desc=$(file -Lb "$image")
1201+ if [[ ! "$file_desc" =~ PE32 ]]; then
1202+ die "Post-build verification failed: file(1) does not report PE/COFF EFI image (${file_desc})."
1203+ fi
1204+
1205+ file_fmt=$(objdump -f "$image" 2>/dev/null | awk -F'file format ' 'NF>1 {print $2; exit}')
1206+ if [[ -z "$file_fmt" || ! "$file_fmt" =~ ^pei- ]]; then
1207+ die "Post-build verification failed: objdump reports unexpected file format '${file_fmt:-unknown}' (expected pei-*)."
1208+ fi
1209+
1210+ embedded_cmdline=""
1211+ if embedded_cmdline=$(extract_ukify_inspect_field "$image" "cmdline"); then
1212+ :
1213+ elif embedded_cmdline=$(extract_uki_section_text "$image" ".cmdline"); then
1214+ :
1215+ else
1216+ die "Post-build verification failed: unable to extract embedded cmdline via ukify inspect or objdump section parsing."
1217+ fi
1218+ [[ "$embedded_cmdline" == "$intended_cmdline" ]] \
1219+ || die "Post-build verification failed: embedded cmdline mismatch. Intended='${intended_cmdline}' Embedded='${embedded_cmdline}'"
1220+
1221+ embedded_uname=""
1222+ if embedded_uname=$(extract_ukify_inspect_field "$image" "uname"); then
1223+ :
1224+ elif embedded_uname=$(extract_uki_section_text "$image" ".uname"); then
1225+ :
1226+ else
1227+ die "Post-build verification failed: unable to extract embedded uname metadata via ukify inspect or objdump section parsing."
1228+ fi
1229+ [[ "$embedded_uname" == "$kernel_ver" ]] \
1230+ || die "Post-build verification failed: embedded uname mismatch. Expected='${kernel_ver}' Embedded='${embedded_uname}'"
1231+
1232+ sha=$(sha256sum "$image" | awk '{print $1}')
1233+ ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)
1234+ printf '%s kernel=%s uki=%s sha256=%s\n' "$ts" "$kernel_ver" "$image" "$sha" >> /var/log/uki-setup.log
1235+
1236+ info "Post-build verification passed: ${image} ($(du -sh "$image" | cut -f1)), sha256=${sha}"
1237+ }
1238+
1239+ info "Stage 3/3: Verifying UKI artifact integrity and metadata"
1240+ verify_uki_post_build "$UKI_OUT" "$KERNEL_VER" "$EFFECTIVE_CMDLINE"
11651241
11661242# Register / refresh UEFI boot entry
11671243LABEL="Linux UKI ${KERNEL_VER}"
0 commit comments