On Fri, Mar 18, 2016, Viktor Dukhovni wrote:

> On Fri, Mar 18, 2016 at 06:59:36PM +0000, Blumenthal, Uri - 0553 - MITLL 
> wrote:
> 
> > Answered my own question: should use EVP_PKEY_bits(pkey) instead.
> 
> That's not the right way to determine the curve id.
> 
> > >How do I determine what curve the above key is on?
> 
> For that you need to determine the EVP_PKEY algorithm type:
> 
>       int type = EVP_PKEY_base_id(pkey);
> 
>       if (type == EVP_PKEY_EC) {
>           EC_KEY *key = EVP_PKEY_get0_EC_KEY(pkey);
>           EC_GROUP *group = EC_KEY_get0_group(key);
> 
>           /* Use that group to generate more points */
>       }
> 
> So you don't need code to specifically identify the group, but if
> you want to constrain the supported groups:
> 
>       switch (EC_GROUP_get_curve_name(group)) {
>       case NID_undef:
>       default:
>           /* Unknown or not named group */
> 
>       case NID_X9_62_prime256v1:
>           /* P-256 */
>           ...
> 
>       case NID_secp384r1:
>           /* P-384 */
> 
>           ...
>       }
> 

There is another way too. An EVP_PKEY can also be used to contain parameters
and it is permissible to pass a private or public key as a set of parameters.

In outline you call:

 EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new(privkey, NULL);
 EVP_PKEY_keygen_init(pctx);
 EVP_PKEY_keygen(pctx, &newkey);
 EVP_PKEY_CTX_free(pctx);

This works with other algorithms like DSA/DH too so you'll probably want to
check the key is of the correct type first.

Steve.
--
Dr Stephen N. Henson. OpenSSL project core developer.
Commercial tech support now available see: http://www.openssl.org
-- 
openssl-users mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users

Reply via email to