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:
osm0sis 2019-11-03 04:22:21 -05:00 committed by topjohnwu
parent 6fd357962f
commit e7d668502c

View File

@ -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) {