Sideloading to an iPhone or iPad on iOS 10 or earlier is fixed in principle, and failed installs now explain themselves (#11).
What was wrong. iPASide signs apps with a SHA-256-only code signature. iOS 11 and later accept that, but iOS 10 and earlier only verify a SHA-1 signature, so an iPad 2 on iOS 6.1.3 provisioned and signed every app and then rejected it at its own verification step with ApplicationVerificationFailed: None.
What changed.
- Devices on iOS 10 or earlier now get both signatures (SHA-1 and SHA-256), chosen automatically from the connected device's iOS version. Everything newer is signed exactly as before.
sign --legacy-sha1does the same by hand. - A failed install now says what iPASide can read from the app and the device, with Apple's own message kept above it: an app that needs a newer iOS than the device has, or that has no code for the device's CPU (an arm64-only app on a 32-bit iPad). Nothing is claimed that cannot be read.
- Thin 32-bit apps, the only kind an old device can run, were not recognised: the Mach-O magic for a little-endian 32-bit binary was mistyped, so their CPU architecture was lost and they skipped the encryption check. Fixed.
Verified. The bundled signer produces the dual signature: reading the code signature of an app signed both ways shows SHA-256 only by default, and SHA-1 in the primary slot plus SHA-256 in the alternate slot with the new option. 667 engine tests and 797 app tests pass; each of ten deliberate breaks of the new logic was caught; on a real iPhone (iOS 16.7) the new code chooses the normal signature and reads the device correctly; CI built the installer on a clean machine.
Not verified. Installing on a real device older than iOS 11. I have no such device, so whether the signature was the only thing an iOS 6 iPad objected to is still open; very old iOS can also refuse apps for reasons outside iPASide's control, such as Apple's current certificate chain. Apps must also contain code for the device's CPU and support its iOS version.
The installer is unsigned, so SmartScreen will warn — the SHA-256 is in SHA256SUMS.txt.