0

I'm working with some Android Java code that uses ECDSA keys. The code compiles and runs fine, but has some logic errors during the verification process. I want to try using a constant key pair (that's known to be valid) to troubleshoot the program.

Using an online generator, I got an EC public key in hex,

0x044fb7cebbb1f4a1e0412c8e0b6f2d675ebfee000c5e860a81ffd795b5743033dec0e114abfba3de8db8705fc8ed985c5550c66a6ee9fdd258d058a2ef749eba78

As well as a valid private key to complete the pair,

0x0c84e7e707b31ecf0254e8cb3040513883d92d81e977ad4754a409a6ab18ee51

I can convert the hex string to a primitive byte array, but that byte array appears to be invalid. I cannot figure out how to convert a hex representation of my keys to a X509 representation so that I can make a Java key object.

KeyFactory mFactory = KeyFactory.getInstance("EC");
X509EncodedKeySpec mPublicKey = new X509EncodedKeySpec(publicKeyBytes);
PublicKey publicKey = mFactory.generatePublic(mPublicKey);

That code results in:

java.security.spec.InvalidKeySpecException: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: Error parsing public key

I am reasonably sure that my conversion from hex string to byte array is working, but I'll include that method as well for a sanity check.

private static byte[] hexStringToByteArray(String s) throws IllegalArgumentException {
    int len = s.length();
    if (len % 2 == 1) {
        throw new IllegalArgumentException("Hex string must have even number of characters");
    }
    byte[] data = new byte[len / 2]; // Allocate 1 byte per 2 hex characters
    for (int i = 0; i < len; i += 2) {
        // Convert each character into a integer (base-16), then bit-shift into place
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

The end goal is to have a constant, valid PublicKey/PrivateKey object for testing. Any advice about how to generate those objects would be greatly appreciated.

  • You're doing it the hard way. Just generate your keys in Android, then use getEncoded() method of the public and private keys to get the byte arrays. Then base64 encoded the byte arrays and dump them to logcat. Now these can be your hard-coded EC keypair, and just reverse the process to create a key pair from the base64 strings. – President James K. Polk May 29 '18 at 20:09
  • 1
    That worked, and now I feel like an idiot. Thank you! – Kaleb Jacobsen May 29 '18 at 20:57

0 Answers0