2

I am trying to use the OpenSSL command line to generate a ECDH public key that meets the following specifications:

Use a Base64 encoded X.509 SubjectPublicKeyInfo structure containing a ECDH public key for group P256

They following commands provide me with a key:

openssl ecparam -name prime256v1 -out prime256v1.pem
openssl ecparam -in prime256v1.pem -genkey -noout -out prime256v1-key.pem
openssl ec -in prime256v1-key.pem -pubout -out pubkey.pem

Key: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE85KGK3YiX7tC7mFm+Te1xRYOeDq23h80MPPt1nMZ/ZRpwjRGPEUr6vaoOCB8QC3uHmaPKOAgQ0Kk9Sc4M1QUmA==

However this key is not being accepted by the API I am accessing.

An example key that is working is:

MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgACKoJz0lSBocGMsdl8TiMasRsBOxpMywCqzAoOLwZfUl0=

This example key is 44 (Base64) bytes shorter and has a slightly different SubjectPublickKeyInfo signature.

My question is what is the difference between these two keys and how could I use the OpenSSL command line tools to generate such a key pair.

1 Answer 1

5

Try compressed version

What you posted there as "example key that is working" is a base64 encoded EC pubkey without the PEM wrapper and without the usual line breaks. And more specifically it is a COMPRESSED version of the EC pubkey. But openssl writes UNcompressed keys by default.

You can convert between the compressed und uncompressed versions like so:

$ cat ExampleOfRejectedKey.headerlesspem
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE85KGK3YiX7tC7mFm+Te1xRYOeDq23h80MPPt1nMZ/ZRpwjRGPEUr6vaoOCB8QC3uHmaPKOAgQ0Kk9Sc4M1QUmA==

Make openssl parse in the key

$ openssl ec -inform DER -pubin -in <(base64 -d ExampleOfRejectedKey.headerlesspem)
read EC key
writing EC key
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE85KGK3YiX7tC7mFm+Te1xRYOeDq2
3h80MPPt1nMZ/ZRpwjRGPEUr6vaoOCB8QC3uHmaPKOAgQ0Kk9Sc4M1QUmA==
-----END PUBLIC KEY-----

Again but with "-conv_form compressed"

$ openssl ec -inform DER -pubin -in <(base64 -d ExampleOfRejectedKey.headerlesspem) -conv_form compressed
read EC key
writing EC key
-----BEGIN PUBLIC KEY-----
MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgAC85KGK3YiX7tC7mFm+Te1xRYOeDq2
3h80MPPt1nMZ/ZQ=
-----END PUBLIC KEY-----

As you can see: It's a lot shorter now. And closer in length to the working key. Try this. (Why any API would insist on a compressed representation, and not say so, is beyond me.)

Further reading

See this question: 2011-07-12, Is there a standardized fixed-length encoding for EC public keys?

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .