diff --git a/app/src/main/assets/app/support/subscripts/boot.backup.sh b/app/src/main/assets/app/support/subscripts/boot.backup.sh index d3d7c77..2e7267d 100644 --- a/app/src/main/assets/app/support/subscripts/boot.backup.sh +++ b/app/src/main/assets/app/support/subscripts/boot.backup.sh @@ -26,7 +26,7 @@ for ACTIVE_SLOT in _a _b; do [ -s "$TEMP_FILE" ] && mv -f "$TEMP_FILE" "$OUTPUT_FILE"; then DOWNLOAD_FILE="$DOWNLOAD_PATH/boot$ACTIVE_SLOT.img" - if cp -f "$OUTPUT_FILE" "$DOWNLOAD_FILE" >> "$LOG_FILE" 2>&1 && [ -s "$DOWNLOAD_FILE" ]; then + if cp -f "$OUTPUT_FILE" "$DOWNLOAD_FILE" >> "$LOG_FILE" 2>&1 && verify_copy_hash "$OUTPUT_FILE" "$DOWNLOAD_FILE"; then copied=$((copied + 1)) else failed=1 diff --git a/app/src/main/assets/app/support/subscripts/init_boot.backup.sh b/app/src/main/assets/app/support/subscripts/init_boot.backup.sh index eab4964..464d67a 100644 --- a/app/src/main/assets/app/support/subscripts/init_boot.backup.sh +++ b/app/src/main/assets/app/support/subscripts/init_boot.backup.sh @@ -26,7 +26,7 @@ for ACTIVE_SLOT in _a _b; do [ -s "$TEMP_FILE" ] && mv -f "$TEMP_FILE" "$OUTPUT_FILE"; then DOWNLOAD_FILE="$DOWNLOAD_PATH/init_boot$ACTIVE_SLOT.img" - if cp -f "$OUTPUT_FILE" "$DOWNLOAD_FILE" >> "$LOG_FILE" 2>&1 && [ -s "$DOWNLOAD_FILE" ]; then + if cp -f "$OUTPUT_FILE" "$DOWNLOAD_FILE" >> "$LOG_FILE" 2>&1 && verify_copy_hash "$OUTPUT_FILE" "$DOWNLOAD_FILE"; then copied=$((copied + 1)) else failed=1 diff --git a/app/src/main/assets/app/support/subscripts/partition_path.sh b/app/src/main/assets/app/support/subscripts/partition_path.sh index 9b034a2..188dc45 100644 --- a/app/src/main/assets/app/support/subscripts/partition_path.sh +++ b/app/src/main/assets/app/support/subscripts/partition_path.sh @@ -38,6 +38,14 @@ verify_image_hash() { [ "$ACTUAL_HASH" = "$(printf '%s' "$EXPECTED_HASH" | tr '[:upper:]' '[:lower:]')" ] } +verify_copy_hash() { + SOURCE_PATH="$1" + DESTINATION_PATH="$2" + [ -s "$SOURCE_PATH" ] && [ -s "$DESTINATION_PATH" ] || return 1 + SOURCE_HASH="$(sha256sum "$SOURCE_PATH" 2>/dev/null | sed 's/[[:space:]].*$//' | tr '[:upper:]' '[:lower:]')" + verify_image_hash "$DESTINATION_PATH" "$SOURCE_HASH" +} + image_fits_partition() { IMAGE_PATH="$1" DEVICE_PATH="$2" diff --git a/app/src/test/java/dev/adrian/thortools/RecoveryScriptContractTest.kt b/app/src/test/java/dev/adrian/thortools/RecoveryScriptContractTest.kt index 431e5ea..b8d6083 100644 --- a/app/src/test/java/dev/adrian/thortools/RecoveryScriptContractTest.kt +++ b/app/src/test/java/dev/adrian/thortools/RecoveryScriptContractTest.kt @@ -14,7 +14,7 @@ class RecoveryScriptContractTest { assertTrue(source.contains("expected=\$((expected + 1))")) assertTrue(source.contains("copied=\$((copied + 1))")) assertTrue(source.contains("DOWNLOAD_FILE=")) - assertTrue(source.contains("[ -s \"\$DOWNLOAD_FILE\" ]")) + assertTrue(source.contains("verify_copy_hash \"\$OUTPUT_FILE\" \"\$DOWNLOAD_FILE\"")) assertTrue(source.contains("[ \"\$expected\" -gt 0 ] && [ \"\$copied\" -eq \"\$expected\" ] && [ \"\$failed\" -eq 0 ]")) } } @@ -67,6 +67,7 @@ class RecoveryScriptContractTest { } val partitionSource = script("partition_path.sh") assertTrue(partitionSource.contains("sha256sum")) + assertTrue(partitionSource.contains("verify_copy_hash")) assertTrue(partitionSource.contains("blockdev --getsize64")) assertTrue(partitionSource.contains("/sys/class/block/\$DEVICE_NAME/size")) }