recovery: derive KeyMint identity from installed ROM

This commit is contained in:
Nicholas Andrew 2026-07-18 15:29:10 -04:00
commit 736ed51710
4 changed files with 196 additions and 15 deletions

View file

@ -38,9 +38,6 @@ service rtwo-crypto-identity /system/bin/rtwo-crypto-identity.sh
oneshot
seclabel u:r:recovery:s0
on early-init
exec_start rtwo-crypto-identity
on init
setprop twrp.defer.decrypt false
# to cut charging battery path
@ -48,6 +45,9 @@ on init
setprop prepdecrypt.setpatch false
setprop sys.usb.configfs 1
on early-init
start rtwo-crypto-identity
on fs
wait /dev/block/platform/soc/${ro.boot.bootdevice}
symlink /dev/block/platform/soc/${ro.boot.bootdevice} /dev/block/bootdevice

View file

@ -2,18 +2,199 @@
# BOBtheBlinker
# Copyright (C) 2019-Present A-Team Digital Solutions
#
# Diagnostic identity matching Motorola stock Android 15:
# V1TRS35H.60-33-5-16-3, security patch 2026-05-01.
# Load the installed ROM identity before Qualcomm KeyMint starts.
# KeyMint binds storage keys to the Android and vendor patch levels.
resetprop ro.build.version.release 15
resetprop ro.build.version.sdk 35
resetprop ro.build.version.security_patch 2026-05-01
LOG=/tmp/rtwo-crypto-identity.log
resetprop ro.vendor.build.version.release 15
resetprop ro.vendor.build.version.sdk 35
resetprop ro.vendor.build.security_patch 2026-05-01
SYSTEM_DEVICE=/dev/block/mapper/system
VENDOR_DEVICE=/dev/block/mapper/vendor
resetprop ro.product.first_api_level 33
resetprop ro.board.first_api_level 33
SYSTEM_MOUNT=/tmp/rtwo-system
VENDOR_MOUNT=/tmp/rtwo-vendor
log_message() {
MESSAGE="rtwo-crypto-identity: $*"
echo "$MESSAGE" >> "$LOG"
echo "<6>$MESSAGE" > /dev/kmsg 2>/dev/null
}
mount_readonly() {
DEVICE="$1"
TARGET="$2"
NAME="$3"
mkdir -p "$TARGET"
umount "$TARGET" 2>/dev/null
for TYPE in erofs ext4; do
if mount -t "$TYPE" -o ro "$DEVICE" "$TARGET" 2>/dev/null; then
log_message "mounted $NAME as $TYPE"
return 0
fi
done
if mount -o ro "$DEVICE" "$TARGET" 2>/dev/null; then
log_message "mounted $NAME with automatic detection"
return 0
fi
log_message "ERROR: unable to mount $NAME from $DEVICE"
return 1
}
read_property() {
PROPERTY="$1"
shift
for FILE in "$@"; do
[ -r "$FILE" ] || continue
while IFS= read -r LINE; do
case "$LINE" in
"$PROPERTY"=*)
printf '%s' "${LINE#*=}"
return 0
;;
esac
done < "$FILE"
done
return 1
}
cleanup_mounts() {
umount "$VENDOR_MOUNT" 2>/dev/null
umount "$SYSTEM_MOUNT" 2>/dev/null
}
rm -f "$LOG"
setprop sys.rtwo.crypto_identity.ready 0
setprop sys.rtwo.crypto_identity.failed 0
log_message "waiting for logical system/vendor mappings"
ATTEMPT=0
while [ "$ATTEMPT" -lt 60 ]; do
if [ -e "$SYSTEM_DEVICE" ] && [ -e "$VENDOR_DEVICE" ]; then
break
fi
ATTEMPT=$((ATTEMPT + 1))
sleep 1
done
if [ ! -e "$SYSTEM_DEVICE" ] || [ ! -e "$VENDOR_DEVICE" ]; then
log_message "ERROR: logical system/vendor mappings unavailable"
setprop sys.rtwo.crypto_identity.failed 1
exit 1
fi
if ! mount_readonly "$SYSTEM_DEVICE" "$SYSTEM_MOUNT" system; then
cleanup_mounts
setprop sys.rtwo.crypto_identity.failed 1
exit 1
fi
if ! mount_readonly "$VENDOR_DEVICE" "$VENDOR_MOUNT" vendor; then
cleanup_mounts
setprop sys.rtwo.crypto_identity.failed 1
exit 1
fi
SYSTEM_FILES="
$SYSTEM_MOUNT/system/build.prop
$SYSTEM_MOUNT/build.prop
"
VENDOR_FILES="
$VENDOR_MOUNT/build.prop
$VENDOR_MOUNT/etc/build.prop
"
ALL_FILES="$SYSTEM_FILES $VENDOR_FILES"
OS_RELEASE="$(read_property ro.build.version.release $SYSTEM_FILES)"
OS_SDK="$(read_property ro.build.version.sdk $SYSTEM_FILES)"
OS_PATCH="$(read_property ro.build.version.security_patch $SYSTEM_FILES)"
VENDOR_RELEASE="$(
read_property ro.vendor.build.version.release $VENDOR_FILES
)"
VENDOR_SDK="$(
read_property ro.vendor.build.version.sdk $VENDOR_FILES
)"
VENDOR_PATCH="$(
read_property ro.vendor.build.security_patch $VENDOR_FILES
)"
BOOT_PATCH="$(
read_property ro.bootimage.build.version.security_patch $ALL_FILES
)"
VENDOR_BOOT_PATCH="$(
read_property ro.vendor.boot_security_patch $ALL_FILES
)"
FIRST_API="$(
read_property ro.product.first_api_level $ALL_FILES
)"
BOARD_FIRST_API="$(
read_property ro.board.first_api_level $ALL_FILES
)"
cleanup_mounts
if [ -z "$OS_RELEASE" ] ||
[ -z "$OS_SDK" ] ||
[ -z "$OS_PATCH" ] ||
[ -z "$VENDOR_RELEASE" ] ||
[ -z "$VENDOR_SDK" ] ||
[ -z "$VENDOR_PATCH" ]; then
log_message "ERROR: installed ROM identity is incomplete"
log_message "OS_RELEASE=${OS_RELEASE:-missing}"
log_message "OS_SDK=${OS_SDK:-missing}"
log_message "OS_PATCH=${OS_PATCH:-missing}"
log_message "VENDOR_RELEASE=${VENDOR_RELEASE:-missing}"
log_message "VENDOR_SDK=${VENDOR_SDK:-missing}"
log_message "VENDOR_PATCH=${VENDOR_PATCH:-missing}"
setprop sys.rtwo.crypto_identity.failed 1
exit 1
fi
[ -n "$FIRST_API" ] || FIRST_API=33
[ -n "$BOARD_FIRST_API" ] || BOARD_FIRST_API=33
resetprop ro.build.version.release "$OS_RELEASE"
resetprop ro.build.version.sdk "$OS_SDK"
resetprop ro.build.version.security_patch "$OS_PATCH"
resetprop ro.vendor.build.version.release "$VENDOR_RELEASE"
resetprop ro.vendor.build.version.sdk "$VENDOR_SDK"
resetprop ro.vendor.build.security_patch "$VENDOR_PATCH"
if [ -n "$BOOT_PATCH" ]; then
resetprop ro.bootimage.build.version.security_patch "$BOOT_PATCH"
fi
if [ -n "$VENDOR_BOOT_PATCH" ]; then
resetprop ro.vendor.boot_security_patch "$VENDOR_BOOT_PATCH"
fi
resetprop ro.product.first_api_level "$FIRST_API"
resetprop ro.board.first_api_level "$BOARD_FIRST_API"
resetprop ro.crypto.type file
log_message \
"loaded system=${OS_RELEASE}/SDK${OS_SDK}/SPL${OS_PATCH}"
log_message \
"loaded vendor=${VENDOR_RELEASE}/SDK${VENDOR_SDK}/SPL${VENDOR_PATCH}"
setprop sys.rtwo.crypto_identity.ready 1
exit 0

View file

@ -1,6 +1,6 @@
# Copyright (C) 2019-Present A-Team Digital Solutions
on init
on property:sys.rtwo.crypto_identity.ready=1
start vendor.keymaster-sb-4-0
service vendor.keymaster-sb-4-0 /system/bin/android.hardware.keymaster@4.0-strongbox-service-qti

View file

@ -1,4 +1,4 @@
on init
on property:sys.rtwo.crypto_identity.ready=1
start vendor.keymint-qti
service vendor.keymint-qti /system/bin/android.hardware.security.keymint-service-qti