Commit Graph

57 Commits

Author SHA1 Message Date
Andrew Gunnerson 1cbfd96067 Merge pull request #36 from chenxiaolong/passphrase
Pass encrypted private keys to openssl directly
2023-02-09 22:22:19 -05:00
Andrew Gunnerson 17ee5ee37b Pass encrypted private keys to openssl directly
openssl supports passing the passphrase via a file descriptor, so let's
do that and avoid ever putting plaintext private keys on the filesystem,
even if it is a tmpfs.

Signed-off-by: Andrew Gunnerson <accounts+github@chiller3.com>
2023-02-09 22:20:06 -05:00
Andrew Gunnerson d62516b2e0 Merge pull request #35 from pascallj/patch-1
Add unused return object when extracting
2023-02-07 17:29:48 -05:00
Pascal Roeleven 9618c0bc36 Add unused return object when extracting
Fixes #34
2023-02-07 22:17:04 +01:00
Andrew Gunnerson 2e27d9eb12 Merge pull request #33 from chenxiaolong/docs
README.md: Improve documentation
2023-02-06 23:42:44 -05:00
Andrew Gunnerson 6272ca573d README.md: Improve documentation
* Clarify boot image partitions. It is no longer the case that only
  `boot` and `vendor_boot` are patched.
* Describe how to check if an OTA file is A/B.
* Remove mentions of signapk now that avbroot signs zips itself.
* Minor grammar changes.

Signed-off-by: Andrew Gunnerson <accounts+github@chiller3.com>
2023-02-06 23:39:05 -05:00
Andrew Gunnerson 2319ce8cac Merge pull request #32 from chenxiaolong/oneplus
Add support for OnePlus OTAs
2023-02-06 22:57:59 -05:00
Andrew Gunnerson 3c843856e1 Add support for OnePlus OTAs
Only OxygenOS 12 and 13 can work because older builds use the legacy
metadata file instead of the newer protobuf format.

Differences from Pixel devices:

* There's a recovery image. It contains otacerts.zip instead of
  vendor_boot or boot. The image uses a version 4 `ANDROID!` header, not
  `VNDRBOOT`.
* The payload.bin uses ZERO blocks with no sha256 checksum.

Signed-off-by: Andrew Gunnerson <accounts+github@chiller3.com>
2023-02-06 22:52:05 -05:00
Andrew Gunnerson fe79cc852d Merge pull request #31 from chenxiaolong/typo
avbroot/util.py: Fix variable name typo in zero_n()
2023-02-03 17:45:31 -05:00
Andrew Gunnerson e687eeed24 avbroot/util.py: Fix variable name typo in zero_n()
This hasn't broken anything in the past because the Pixel OTA payloads
haven't been using ZERO or DISCARD blocks.

Signed-off-by: Andrew Gunnerson <accounts+github@chiller3.com>
2023-02-03 17:44:01 -05:00
Andrew Gunnerson 4bd6c48b8f Merge pull request #30 from chenxiaolong/temp_dir
Stop setting default temporary directory to the output directory
2023-02-03 17:40:24 -05:00
Andrew Gunnerson 2d4ff61531 Stop setting default temporary directory to the output directory
Now that avbroot no longer needs to create huge temp files, just use the
OS's default temp directory.

Signed-off-by: Andrew Gunnerson <accounts+github@chiller3.com>
2023-02-03 17:38:18 -05:00
Andrew Gunnerson d9bfa98ea1 Merge pull request #29 from chenxiaolong/x86_64
avbroot/boot.py: Document why the x86 magiskboot is used instead of x86_64
2023-02-03 17:34:12 -05:00
Andrew Gunnerson 0a3b7ff5f7 avbroot/boot.py: Document why the x86 magiskboot is used instead of x86_64
Signed-off-by: Andrew Gunnerson <accounts+github@chiller3.com>
2023-02-03 17:13:20 -05:00
Andrew Gunnerson 99dd8ba5ff Merge pull request #28 from chenxiaolong/zip_signing
ota: Reimplement zip signing ourselves more efficiently
2023-02-03 16:57:30 -05:00
Andrew Gunnerson e81f17cabc avbroot/ota.py: Ensure all protobuf serialization is deterministic
Signed-off-by: Andrew Gunnerson <accounts+github@chiller3.com>
2023-02-01 22:29:04 -05:00
Andrew Gunnerson 806d8117f0 Perform all OTA signing ourselves
With this commit, avbroot now performs the entire OTA signing process
itself. This removes the 4 full .zip builds needed for signing before,
which means that avbroot can now do the full patching process in a
single pass.

Since signapk is no longer needed, the java dependency has been dropped.
This also means that avbroot no longer depends on glibc-based Linux
distros, which was the case before due to signapk's conscrypt
dependency.

Signed-off-by: Andrew Gunnerson <accounts+github@chiller3.com>
2023-02-01 22:29:01 -05:00
Andrew Gunnerson 1057c2c5fc avbroot/boot.py: Ensure otacerts.zip certificate filename is consistent
It was originally stored as <certificate basename>/ota.x509.pem due to a
brain fart. It was always intended to just be ota.x509.pem.

Signed-off-by: Andrew Gunnerson <accounts+github@chiller3.com>
2023-01-31 15:08:48 -05:00
Andrew Gunnerson df887f90e7 ota: Reimplement zip signing ourselves more efficiently
The original AOSP ota_utils implementation is quite disk and memory heavy:

* ota_utils.FinalizeMetadata() performs metadata file replacement as
  separate delete + add operations, which require an extra intermediate
  zip to be written.
* ota_utils.FinalizeMetadata() keeps unneeded intermediate temporary
  files around until common.Cleanup() is called.
* common.ZipDelete() deletes files by excluding entries when copying
  from one zip to another. The data copy reads entire entries (including
  the huge payload) into memory instead of copying chunks.

Additionally, ota_utils is a bit exception/crash-unsafe in general.
There are several places where temp files won't be cleaned up unless
everything is following the happy path.

This commit's reimplementation tries to use streaming and chunked
operations where possible and only keeps temporary files around as long
as needed. This is about as efficient as we can get while still relying
on AOSP's signapk.

(And we can finally get rid of the common.OPTIONS hackery!)

Signed-off-by: Andrew Gunnerson <accounts+github@chiller3.com>
2023-01-30 19:52:00 -05:00
Andrew Gunnerson 437cfc23d0 Merge pull request #27 from chenxiaolong/time
avbroot.py: Add final status message to indicate the elapsed time
2023-01-30 13:56:21 -05:00
Andrew Gunnerson c2f64a6587 avbroot.py: Add final status message to indicate the elapsed time
Signed-off-by: Andrew Gunnerson <accounts+github@chiller3.com>
2023-01-30 13:54:59 -05:00
Andrew Gunnerson 00f903e85f Merge pull request #26 from chenxiaolong/deps
Update external submodules
2023-01-30 01:15:21 -05:00
Andrew Gunnerson 26526ff235 Update external submodules
There are two noteworthy changes:

1. https://android.googlesource.com/platform/build/+/bf01f8b3f0ce70047840999d95a449bf03b407c6%5E%21/

   This reduces the number of fields that we have to apply the hacky
   common.OPTIONS override for.

2. https://android.googlesource.com/platform/build/+/8895f9eceac4ad568bcca724c4dcf8faf5b865f4%5E%21/

   This removes the dependency on the host having the zip command
   installed.

Signed-off-by: Andrew Gunnerson <accounts+github@chiller3.com>
2023-01-30 00:47:33 -05:00
Andrew Gunnerson 19a559508f Merge pull request #24 from chenxiaolong/linux_only
README.md: Clarify that only Linux is supported
2023-01-28 16:24:21 -05:00
Andrew Gunnerson 9c52dbd8f9 README.md: Clarify that only Linux is supported
Issue: #15

Signed-off-by: Andrew Gunnerson <accounts+github@chiller3.com>
2023-01-28 16:24:12 -05:00
Andrew Gunnerson 909d42cd4b Merge pull request #23 from chenxiaolong/temp_override
Respect standard TMPDIR/TEMP/TMP environment variables
2023-01-28 16:21:35 -05:00
Andrew Gunnerson d67cc7fe11 Respect standard TMPDIR/TEMP/TMP environment variables
If any standard temp directory environment variables are set, then don't
use the output directory as the temp directory.

Issue: #22

Signed-off-by: Andrew Gunnerson <accounts+github@chiller3.com>
2023-01-28 16:20:48 -05:00
Andrew Gunnerson 2afdc2953c Merge pull request #21 from pascallj/patch-1
Use sys.platform to determine if system is Linux
2023-01-28 15:39:10 -05:00
Pascal Roeleven 3dd7c0f5ef Use sys.platform to determine if system is Linux 2023-01-28 14:03:27 +01:00
Andrew Gunnerson 1bc6cfb6d3 Merge pull request #19 from chenxiaolong/output_temp
avbroot.py: Use the output directory as the default temporary directory path
2023-01-24 19:53:30 -05:00
Andrew Gunnerson 41e7d347e2 avbroot.py: Use the output directory as the default temporary directory path
Systems where /tmp is on a tmpfs and have less free RAM may have trouble
with the patching process.

Signed-off-by: Andrew Gunnerson <chillermillerlong@hotmail.com>
2023-01-24 19:52:57 -05:00
Andrew Gunnerson 53eddd5f73 Merge pull request #18 from chenxiaolong/keys
avbroot: Decrypt keys to tmpfs on Linux if available
2023-01-24 19:25:39 -05:00
Andrew Gunnerson aed3ce6494 avbroot: Decrypt keys to tmpfs on Linux if available
Signed-off-by: Andrew Gunnerson <chillermillerlong@hotmail.com>
2023-01-24 18:47:52 -05:00
Andrew Gunnerson e7f8d3737e Merge pull request #16 from chenxiaolong/windows
avbroot.py: Decrypt keys to standard temp directory
2023-01-21 01:21:34 -05:00
Andrew Gunnerson 6c8333a866 avbroot.py: Decrypt keys to standard temp directory
Using /dev/shm breaks compatibility with non-Linux operating systems. On
Linux, most distros mount /tmp as a tmpfs anyway.

Fixes: #15

Signed-off-by: Andrew Gunnerson <chillermillerlong@hotmail.com>
2023-01-21 01:21:12 -05:00
Andrew Gunnerson c22a443edd Merge pull request #12 from chenxiaolong/magisk
avbroot/boot.py: Add support for separate stub.apk
2023-01-13 19:22:17 -05:00
Andrew Gunnerson 74020079ed avbroot/boot.py: Add support for separate stub.apk
Magisk commit ad0e6511e11ebec65aa9b5b916e1397342850319 stopped embedding
stub.apk into magiskinit, so we need to ensure it is extracted and
available to boot_patch.sh.

Signed-off-by: Andrew Gunnerson <chillermillerlong@hotmail.com>
2023-01-13 19:19:43 -05:00
Andrew Gunnerson 0364f02cc8 Merge pull request #10 from chenxiaolong/older_pixel
avbroot/vbmeta.py: Force signing algorithm from SHA256_RSA2048 to SHA256_RSA4096
2023-01-02 15:22:49 -05:00
Andrew Gunnerson fc3e219aaf avbroot/vbmeta.py: Force signing algorithm from SHA256_RSA2048 to SHA256_RSA4096
This is the same as commit 163540b2b6,
except for the vbmeta image. Some older devices' vbmeta images were
originally signed by an RSA 4096 key.

Fixes: #9

Signed-off-by: Andrew Gunnerson <chillermillerlong@hotmail.com>
2023-01-02 15:21:13 -05:00
Andrew Gunnerson 15c951e320 README.md: Add note about locking/unlocking the bootloader triggering a data wipe
Issue: #7

Signed-off-by: Andrew Gunnerson <chillermillerlong@hotmail.com>
2022-12-03 18:44:14 -05:00
Andrew Gunnerson d0373470b4 Merge pull request #6 from chenxiaolong/old
Add support for older Pixel devices
2022-11-28 14:34:41 -05:00
Andrew Gunnerson c83b8f5b17 Add support for older Pixel devices
* Apply OTA certificate patch to the boot image if no `vendor_boot`
  image exists.
* Only manually decompress ramdisk cpio archives if the boot image
  header version is 4. `magiskboot` automatically decompresses older
  header versions.

Fixes: #5

Signed-off-by: Andrew Gunnerson <chillermillerlong@hotmail.com>
2022-11-27 17:12:11 -05:00
Andrew Gunnerson 8ad906d3a3 Merge pull request #3 from tnagorran/master
Update README.md
2022-11-02 15:27:22 -04:00
tnagorran 2edb25af31 Update README.md 2022-11-02 15:16:34 +03:00
Andrew Gunnerson d965e22875 avbroot/openssl.py: openssl 1.1's pkeyutl also does not autodetect the private key encoding
Issue: #2

Signed-off-by: Andrew Gunnerson <chillermillerlong@hotmail.com>
2022-10-24 22:10:44 -04:00
Andrew Gunnerson 7b697b8daf README.md: python3-protobuf is also required
Issue: #2

Signed-off-by: Andrew Gunnerson <chillermillerlong@hotmail.com>
2022-10-24 22:08:38 -04:00
Andrew Gunnerson df344bdf84 README.md: Add documentation about git submodule and system dependencies
Issue: #2

Signed-off-by: Andrew Gunnerson <chillermillerlong@hotmail.com>
2022-10-24 10:38:48 -04:00
Andrew Gunnerson ee297eb605 avbroot/openssl.py: Explicitly set -inform when querying RSA modulus
openssl 1.1 does not support autodetecting whether the input file is PEM
or DER encoded.

Issue: #2

Signed-off-by: Andrew Gunnerson <chillermillerlong@hotmail.com>
2022-10-24 10:33:52 -04:00
Andrew Gunnerson 1ce72c2513 README.md: Add note about Pixel 7 Pro compatibility
Signed-off-by: Andrew Gunnerson <chillermillerlong@hotmail.com>
2022-10-13 17:27:16 -04:00
Andrew Gunnerson 163540b2b6 avbroot/boot.py: Force signing algorithm from SHA256_RSA2048 to SHA256_RSA4096
The Pixel 7 series' init_boot image is signed with a SHA256_RSA2048
signature and avbroot can't use that algorithm because it expects RSA
4096 keys.

Signed-off-by: Andrew Gunnerson <chillermillerlong@hotmail.com>
2022-10-13 17:25:01 -04:00