mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-12-25 09:07:50 +00:00
SignBoot: improve error catching/reporting
- `!= remain` shouldn't indicate "not signed", it should indicate a read error as with `!= hdr.length` - attempt to catch unsigned images at signature read, before they make it to `BootSignature bootsig = new BootSignature(signature);` and result in the following: java.io.IOException: unexpected end-of-contents marker at org.bouncycastle.asn1.ASN1InputStream.readObject(Unknown Source:14) at com.topjohnwu.signing.SignBoot$BootSignature.<init>(SignBoot.java:230) at com.topjohnwu.signing.SignBoot.verifySignature(SignBoot.java:139) at com.topjohnwu.signing.BootSigner.main(BootSigner.java:15) at a.a.main(a.java:20)
This commit is contained in:
parent
6fd357962f
commit
e7d668502c
@ -33,10 +33,10 @@ public class SignBoot {
|
|||||||
private static final int BOOT_IMAGE_HEADER_V1_RECOVERY_DTBO_SIZE_OFFSET = 1632;
|
private static final int BOOT_IMAGE_HEADER_V1_RECOVERY_DTBO_SIZE_OFFSET = 1632;
|
||||||
private static final int BOOT_IMAGE_HEADER_V2_DTB_SIZE_OFFSET = 1648;
|
private static final int BOOT_IMAGE_HEADER_V2_DTB_SIZE_OFFSET = 1648;
|
||||||
|
|
||||||
/* Arbitrary maximum header version value; when greater assume the field is dt/extra size */
|
// Arbitrary maximum header version value; when greater assume the field is dt/extra size
|
||||||
private static final int BOOT_IMAGE_HEADER_VERSION_MAXIMUM = 8;
|
private static final int BOOT_IMAGE_HEADER_VERSION_MAXIMUM = 8;
|
||||||
|
|
||||||
/* Maximum header size byte value to read (bootimg minimum page size) */
|
// Maximum header size byte value to read (currently the bootimg minimum page size)
|
||||||
private static final int BOOT_IMAGE_HEADER_SIZE_MAXIMUM = 2048;
|
private static final int BOOT_IMAGE_HEADER_SIZE_MAXIMUM = 2048;
|
||||||
|
|
||||||
private static class PushBackRWStream extends FilterInputStream {
|
private static class PushBackRWStream extends FilterInputStream {
|
||||||
@ -120,21 +120,26 @@ public class SignBoot {
|
|||||||
try {
|
try {
|
||||||
// Read the header for size
|
// Read the header for size
|
||||||
byte[] hdr = new byte[BOOT_IMAGE_HEADER_SIZE_MAXIMUM];
|
byte[] hdr = new byte[BOOT_IMAGE_HEADER_SIZE_MAXIMUM];
|
||||||
if (imgIn.read(hdr) != hdr.length)
|
if (imgIn.read(hdr) != hdr.length) {
|
||||||
|
System.err.println("Unable to read image header");
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
int signableSize = getSignableImageSize(hdr);
|
int signableSize = getSignableImageSize(hdr);
|
||||||
|
|
||||||
// Read the rest of the image
|
// Read the rest of the image
|
||||||
byte[] rawImg = Arrays.copyOf(hdr, signableSize);
|
byte[] rawImg = Arrays.copyOf(hdr, signableSize);
|
||||||
int remain = signableSize - hdr.length;
|
int remain = signableSize - hdr.length;
|
||||||
if (imgIn.read(rawImg, hdr.length, remain) != remain) {
|
if (imgIn.read(rawImg, hdr.length, remain) != remain) {
|
||||||
System.err.println("Invalid image: not signed");
|
System.err.println("Unable to read image");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read footer, which contains the signature
|
// Read footer, which contains the signature
|
||||||
byte[] signature = new byte[4096];
|
byte[] signature = new byte[4096];
|
||||||
imgIn.read(signature);
|
if (imgIn.read(signature) == -1) {
|
||||||
|
System.err.println("Invalid image: not signed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
BootSignature bootsig = new BootSignature(signature);
|
BootSignature bootsig = new BootSignature(signature);
|
||||||
if (certIn != null) {
|
if (certIn != null) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user