Question about migrating from d2i_ECPrivateKey() to d2i_PrivateKey(EVP_PKEY_EC, ...)
Viktor Dukhovni
openssl-users at dukhovni.org
Sat Nov 19 06:26:38 UTC 2022
On Fri, Nov 18, 2022 at 11:33:08PM -0600, Nico Williams wrote:
> On Fri, Nov 18, 2022 at 04:53:44PM -0600, Nico Williams wrote:
> > I can't use d2i_PrivateKey() because that requires an existing
> > EVP_PKEY * that has the group already set.
>
> Although, that's just what's documented. From code inspection, if the
> parameters are found in the encoded private key, then the group will be
> set internally and no error will be returned.
Often, if you want a clear example of OpenSSL API usage, one place to
look is the Postfix "tls" library. In this case:
https://github.com/vdukhovni/postfix/blob/master/postfix/src/tls/tls_certkey.c#L245-L266
https://github.com/vdukhovni/postfix/blob/master/postfix/src/tls/tls_certkey.c#L363-L370
Postfix does not do much with low-level crypto, but it exercises a
non-trivial chunk of the certificate and TLS API surface, ECDH/DH
setup and digests.
Generally, I would expect d2i_... to automatically detect the algorithm
when tagged with a suitable OIDs, and so d2i_AutoPrivateKey() could
often work, but if you know the expected key type, you can ask for
that explicitly with d2i_PrivateKey().
You don't need to pass an existing key. Just pass NULL for
(EVP_PKEY **) pointer, and let OpenSSL return a freshly allocated
key:
EVP_PKEY *key;
key = d2i_PrivateKey(type, NULL, ...);
key = d2i_AutoPrivateKey(NULL, ...);
I strive to also check that the buffer pointer advanced by the expected
length (no "left-over" data):
https://github.com/vdukhovni/postfix/blob/master/postfix/src/tls/tls_certkey.c#L293-L306
--
Viktor.
More information about the openssl-users
mailing list