Repository navigation
Avoid BigInteger(int, byte[], int, int) for Android 12 and older - #379
Merged
Merged
Conversation
Android added this constructor only in API 33. On Android 12 and older the ECDSA and NIST ECDH point decoding throws NoSuchMethodError; since it is an Error, updateHostKeys does not catch it and the app dies right after login on servers with an ECDSA host key. Copy the coordinate bytes and use BigInteger(int, byte[]). The length is checked just before, so the ranges and values are the same.
kruton
approved these changes
Oct 26, 2026
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



EcdsaSignatureAlgorithm.decodeEcPointandEcdhKeyExchange.decodeEcPointuseBigInteger(int signum, byte[] magnitude, int off, int len). Android added that constructor only in API 33, so on Android 12 and older these calls throwNoSuchMethodError. ConnectBot (minSdk 24) dies right after login on servers with an ECDSA host key: OpenSSH sends its host keys (hostkeys-00@openssh.com),updateHostKeysverifies the ECDSA proof, and theErroris not caught by thecatch (e: Exception)around it. Seen on Android 11:ecdh-sha2-nistp*key exchange takes the same path inEcdhKeyExchange.The fix copies the coordinate bytes and uses
BigInteger(int, byte[]). The length is checked just above, so the ranges are the same and the values are identical; behaviour on the JVM and on Android 13+ does not change. A JVM unit test cannot catch this, since the JVM has the constructor; checking against Android API signatures (e.g. animal-sniffer) could, if that is wanted as a follow-up.