1e71b7053SJung-uk Kim=pod 2e71b7053SJung-uk Kim 3e71b7053SJung-uk Kim=head1 NAME 4e71b7053SJung-uk Kim 5*b077aed3SPierre ProncheryEVP_EC_gen, 6*b077aed3SPierre ProncheryEC_KEY_get_method, EC_KEY_set_method, EC_KEY_new_ex, 7e71b7053SJung-uk KimEC_KEY_new, EC_KEY_get_flags, EC_KEY_set_flags, EC_KEY_clear_flags, 8*b077aed3SPierre ProncheryEC_KEY_new_by_curve_name_ex, EC_KEY_new_by_curve_name, EC_KEY_free, 9*b077aed3SPierre ProncheryEC_KEY_copy, EC_KEY_dup, EC_KEY_up_ref, EC_KEY_get0_engine, 10e71b7053SJung-uk KimEC_KEY_get0_group, EC_KEY_set_group, EC_KEY_get0_private_key, 11e71b7053SJung-uk KimEC_KEY_set_private_key, EC_KEY_get0_public_key, EC_KEY_set_public_key, 12e71b7053SJung-uk KimEC_KEY_get_conv_form, 1358f35182SJung-uk KimEC_KEY_set_conv_form, EC_KEY_set_asn1_flag, 1458f35182SJung-uk KimEC_KEY_decoded_from_explicit_params, EC_KEY_precompute_mult, 15e71b7053SJung-uk KimEC_KEY_generate_key, EC_KEY_check_key, EC_KEY_set_public_key_affine_coordinates, 16e71b7053SJung-uk KimEC_KEY_oct2key, EC_KEY_key2buf, EC_KEY_oct2priv, EC_KEY_priv2oct, 17e71b7053SJung-uk KimEC_KEY_priv2buf - Functions for creating, destroying and manipulating 18e71b7053SJung-uk KimEC_KEY objects 19e71b7053SJung-uk Kim 20e71b7053SJung-uk Kim=head1 SYNOPSIS 21e71b7053SJung-uk Kim 22e71b7053SJung-uk Kim #include <openssl/ec.h> 23e71b7053SJung-uk Kim 24*b077aed3SPierre Pronchery EVP_PKEY *EVP_EC_gen(const char *curve); 25*b077aed3SPierre Pronchery 26*b077aed3SPierre ProncheryThe following functions have been deprecated since OpenSSL 3.0, and can be 27*b077aed3SPierre Proncheryhidden entirely by defining B<OPENSSL_API_COMPAT> with a suitable version value, 28*b077aed3SPierre Proncherysee L<openssl_user_macros(7)>: 29*b077aed3SPierre Pronchery 30*b077aed3SPierre Pronchery EC_KEY *EC_KEY_new_ex(OSSL_LIB_CTX *ctx, const char *propq); 31e71b7053SJung-uk Kim EC_KEY *EC_KEY_new(void); 32e71b7053SJung-uk Kim int EC_KEY_get_flags(const EC_KEY *key); 33e71b7053SJung-uk Kim void EC_KEY_set_flags(EC_KEY *key, int flags); 34e71b7053SJung-uk Kim void EC_KEY_clear_flags(EC_KEY *key, int flags); 35*b077aed3SPierre Pronchery EC_KEY *EC_KEY_new_by_curve_name_ex(OSSL_LIB_CTX *ctx, const char *propq, 36*b077aed3SPierre Pronchery int nid); 37e71b7053SJung-uk Kim EC_KEY *EC_KEY_new_by_curve_name(int nid); 38e71b7053SJung-uk Kim void EC_KEY_free(EC_KEY *key); 39e71b7053SJung-uk Kim EC_KEY *EC_KEY_copy(EC_KEY *dst, const EC_KEY *src); 40e71b7053SJung-uk Kim EC_KEY *EC_KEY_dup(const EC_KEY *src); 41e71b7053SJung-uk Kim int EC_KEY_up_ref(EC_KEY *key); 42e71b7053SJung-uk Kim ENGINE *EC_KEY_get0_engine(const EC_KEY *eckey); 43e71b7053SJung-uk Kim const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key); 44e71b7053SJung-uk Kim int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group); 45e71b7053SJung-uk Kim const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key); 46cfc39718SJung-uk Kim int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *priv_key); 47e71b7053SJung-uk Kim const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key); 48e71b7053SJung-uk Kim int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub); 49e71b7053SJung-uk Kim point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *key); 50e71b7053SJung-uk Kim void EC_KEY_set_conv_form(EC_KEY *eckey, point_conversion_form_t cform); 51e71b7053SJung-uk Kim void EC_KEY_set_asn1_flag(EC_KEY *eckey, int asn1_flag); 5258f35182SJung-uk Kim int EC_KEY_decoded_from_explicit_params(const EC_KEY *key); 53e71b7053SJung-uk Kim int EC_KEY_generate_key(EC_KEY *key); 54e71b7053SJung-uk Kim int EC_KEY_check_key(const EC_KEY *key); 55e71b7053SJung-uk Kim int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x, BIGNUM *y); 56e71b7053SJung-uk Kim const EC_KEY_METHOD *EC_KEY_get_method(const EC_KEY *key); 57e71b7053SJung-uk Kim int EC_KEY_set_method(EC_KEY *key, const EC_KEY_METHOD *meth); 58e71b7053SJung-uk Kim 59e71b7053SJung-uk Kim int EC_KEY_oct2key(EC_KEY *eckey, const unsigned char *buf, size_t len, BN_CTX *ctx); 60e71b7053SJung-uk Kim size_t EC_KEY_key2buf(const EC_KEY *eckey, point_conversion_form_t form, 61e71b7053SJung-uk Kim unsigned char **pbuf, BN_CTX *ctx); 62e71b7053SJung-uk Kim 63e71b7053SJung-uk Kim int EC_KEY_oct2priv(EC_KEY *eckey, const unsigned char *buf, size_t len); 64e71b7053SJung-uk Kim size_t EC_KEY_priv2oct(const EC_KEY *eckey, unsigned char *buf, size_t len); 65e71b7053SJung-uk Kim 66e71b7053SJung-uk Kim size_t EC_KEY_priv2buf(const EC_KEY *eckey, unsigned char **pbuf); 67*b077aed3SPierre Pronchery int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx); 68e71b7053SJung-uk Kim 69e71b7053SJung-uk Kim=head1 DESCRIPTION 70e71b7053SJung-uk Kim 71*b077aed3SPierre ProncheryEVP_EC_gen() generates a new EC key pair on the given I<curve>. 72*b077aed3SPierre Pronchery 73*b077aed3SPierre ProncheryAll of the functions described below are deprecated. 74*b077aed3SPierre ProncheryApplications should instead use EVP_EC_gen(), L<EVP_PKEY_Q_keygen(3)>, or 75*b077aed3SPierre ProncheryL<EVP_PKEY_keygen_init(3)> and L<EVP_PKEY_keygen(3)>. 76*b077aed3SPierre Pronchery 77e71b7053SJung-uk KimAn EC_KEY represents a public key and, optionally, the associated private 78*b077aed3SPierre Proncherykey. 79*b077aed3SPierre ProncheryA new EC_KEY with no associated curve can be constructed by calling 80*b077aed3SPierre ProncheryEC_KEY_new_ex() and specifying the associated library context in I<ctx> 81*b077aed3SPierre Pronchery(see L<OSSL_LIB_CTX(3)>) and property query string I<propq>. 82*b077aed3SPierre ProncheryThe I<ctx> parameter may be NULL in which case the default library context is 83*b077aed3SPierre Proncheryused. 84*b077aed3SPierre ProncheryThe reference count for the newly created EC_KEY is initially 85*b077aed3SPierre Proncheryset to 1. 86*b077aed3SPierre ProncheryA curve can be associated with the EC_KEY by calling 87e71b7053SJung-uk KimEC_KEY_set_group(). 88e71b7053SJung-uk Kim 89*b077aed3SPierre ProncheryEC_KEY_new() is the same as EC_KEY_new_ex() except that the default library 90*b077aed3SPierre Proncherycontext is always used. 91*b077aed3SPierre Pronchery 92e71b7053SJung-uk KimAlternatively a new EC_KEY can be constructed by calling 93*b077aed3SPierre ProncheryEC_KEY_new_by_curve_name_ex() and supplying the nid of the associated 94*b077aed3SPierre Proncherycurve, the library context to be used I<ctx> (see L<OSSL_LIB_CTX(3)>) and any 95*b077aed3SPierre Proncheryproperty query string I<propq>. 96*b077aed3SPierre ProncheryThe I<ctx> parameter may be NULL in which case the default library context is 97*b077aed3SPierre Proncheryused. The I<propq> value may also be NULL. 98*b077aed3SPierre ProncherySee L<EC_GROUP_new(3)> for a description of curve names. 99*b077aed3SPierre ProncheryThis function simply wraps calls to EC_KEY_new_ex() and 100*b077aed3SPierre ProncheryEC_GROUP_new_by_curve_name_ex(). 101*b077aed3SPierre Pronchery 102*b077aed3SPierre ProncheryEC_KEY_new_by_curve_name() is the same as EC_KEY_new_by_curve_name_ex() 103*b077aed3SPierre Proncheryexcept that the default library context is always used and a NULL property query 104*b077aed3SPierre Proncherystring. 105e71b7053SJung-uk Kim 106e71b7053SJung-uk KimCalling EC_KEY_free() decrements the reference count for the EC_KEY object, 107e71b7053SJung-uk Kimand if it has dropped to zero then frees the memory associated with it. If 108*b077aed3SPierre ProncheryI<key> is NULL nothing is done. 109e71b7053SJung-uk Kim 110*b077aed3SPierre ProncheryEC_KEY_copy() copies the contents of the EC_KEY in I<src> into I<dest>. 111e71b7053SJung-uk Kim 112*b077aed3SPierre ProncheryEC_KEY_dup() creates a new EC_KEY object and copies I<ec_key> into it. 113e71b7053SJung-uk Kim 114e71b7053SJung-uk KimEC_KEY_up_ref() increments the reference count associated with the EC_KEY 115e71b7053SJung-uk Kimobject. 116e71b7053SJung-uk Kim 117e71b7053SJung-uk KimEC_KEY_get0_engine() returns a handle to the ENGINE that has been set for 118e71b7053SJung-uk Kimthis EC_KEY object. 119e71b7053SJung-uk Kim 120e71b7053SJung-uk KimEC_KEY_generate_key() generates a new public and private key for the supplied 121*b077aed3SPierre ProncheryI<eckey> object. I<eckey> must have an EC_GROUP object associated with it 122e71b7053SJung-uk Kimbefore calling this function. The private key is a random integer (0 < priv_key 123e71b7053SJung-uk Kim< order, where I<order> is the order of the EC_GROUP object). The public key is 124e71b7053SJung-uk Kiman EC_POINT on the curve calculated by multiplying the generator for the 125e71b7053SJung-uk Kimcurve by the private key. 126e71b7053SJung-uk Kim 127e71b7053SJung-uk KimEC_KEY_check_key() performs various sanity checks on the EC_KEY object to 128e71b7053SJung-uk Kimconfirm that it is valid. 129e71b7053SJung-uk Kim 130*b077aed3SPierre ProncheryEC_KEY_set_public_key_affine_coordinates() sets the public key for I<key> based 131*b077aed3SPierre Proncheryon its affine coordinates; i.e., it constructs an EC_POINT object based on 132*b077aed3SPierre Proncherythe supplied I<x> and I<y> values and sets the public key to be this 133e71b7053SJung-uk KimEC_POINT. It also performs certain sanity checks on the key to confirm 134e71b7053SJung-uk Kimthat it is valid. 135e71b7053SJung-uk Kim 136e71b7053SJung-uk KimThe functions EC_KEY_get0_group(), EC_KEY_set_group(), 137e71b7053SJung-uk KimEC_KEY_get0_private_key(), EC_KEY_set_private_key(), EC_KEY_get0_public_key(), 138e71b7053SJung-uk Kimand EC_KEY_set_public_key() get and set the EC_GROUP object, the private key, 139cfc39718SJung-uk Kimand the EC_POINT public key for the B<key> respectively. The function 140cfc39718SJung-uk KimEC_KEY_set_private_key() accepts NULL as the priv_key argument to securely clear 141cfc39718SJung-uk Kimthe private key component from the EC_KEY. 142e71b7053SJung-uk Kim 143e71b7053SJung-uk KimThe functions EC_KEY_get_conv_form() and EC_KEY_set_conv_form() get and set the 144*b077aed3SPierre Proncherypoint_conversion_form for the I<key>. For a description of 145e71b7053SJung-uk Kimpoint_conversion_forms please see L<EC_POINT_new(3)>. 146e71b7053SJung-uk Kim 147*b077aed3SPierre ProncheryEC_KEY_set_flags() sets the flags in the I<flags> parameter on the EC_KEY 148e71b7053SJung-uk Kimobject. Any flags that are already set are left set. The flags currently 149e71b7053SJung-uk Kimdefined are EC_FLAG_NON_FIPS_ALLOW and EC_FLAG_FIPS_CHECKED. In 150e71b7053SJung-uk Kimaddition there is the flag EC_FLAG_COFACTOR_ECDH which is specific to ECDH. 151e71b7053SJung-uk KimEC_KEY_get_flags() returns the current flags that are set for this EC_KEY. 152*b077aed3SPierre ProncheryEC_KEY_clear_flags() clears the flags indicated by the I<flags> parameter; all 153e71b7053SJung-uk Kimother flags are left in their existing state. 154e71b7053SJung-uk Kim 155e71b7053SJung-uk KimEC_KEY_set_asn1_flag() sets the asn1_flag on the underlying EC_GROUP object 156e71b7053SJung-uk Kim(if set). Refer to L<EC_GROUP_copy(3)> for further information on the 157e71b7053SJung-uk Kimasn1_flag. 158e71b7053SJung-uk Kim 15958f35182SJung-uk KimEC_KEY_decoded_from_explicit_params() returns 1 if the group of the I<key> was 16058f35182SJung-uk Kimdecoded from data with explicitly encoded group parameters, -1 if the I<key> 16158f35182SJung-uk Kimis NULL or the group parameters are missing, and 0 otherwise. 16258f35182SJung-uk Kim 163e71b7053SJung-uk KimEC_KEY_precompute_mult() stores multiples of the underlying EC_GROUP generator 164e71b7053SJung-uk Kimfor faster point multiplication. See also L<EC_POINT_add(3)>. 165*b077aed3SPierre ProncheryModern versions should instead switch to named curves which OpenSSL has 166*b077aed3SPierre Proncheryhardcoded lookup tables for. 167e71b7053SJung-uk Kim 168e71b7053SJung-uk KimEC_KEY_oct2key() and EC_KEY_key2buf() are identical to the functions 16958f35182SJung-uk KimEC_POINT_oct2point() and EC_POINT_point2buf() except they use the public key 170*b077aed3SPierre ProncheryEC_POINT in I<eckey>. 171e71b7053SJung-uk Kim 172e71b7053SJung-uk KimEC_KEY_oct2priv() and EC_KEY_priv2oct() convert between the private key 173*b077aed3SPierre Proncherycomponent of I<eckey> and octet form. The octet form consists of the content 174*b077aed3SPierre Proncheryoctets of the I<privateKey> OCTET STRING in an I<ECPrivateKey> ASN.1 structure. 175e71b7053SJung-uk Kim 176e71b7053SJung-uk KimThe function EC_KEY_priv2oct() must be supplied with a buffer long enough to 177e71b7053SJung-uk Kimstore the octet form. The return value provides the number of octets stored. 178e71b7053SJung-uk KimCalling the function with a NULL buffer will not perform the conversion but 179e71b7053SJung-uk Kimwill just return the required buffer length. 180e71b7053SJung-uk Kim 181e71b7053SJung-uk KimThe function EC_KEY_priv2buf() allocates a buffer of suitable length and writes 182*b077aed3SPierre Proncheryan EC_KEY to it in octet format. The allocated buffer is written to I<*pbuf> 183e71b7053SJung-uk Kimand its length is returned. The caller must free up the allocated buffer with a 184*b077aed3SPierre Proncherycall to OPENSSL_free(). Since the allocated buffer value is written to I<*pbuf> 185*b077aed3SPierre Proncherythe I<pbuf> parameter B<MUST NOT> be B<NULL>. 186e71b7053SJung-uk Kim 187e71b7053SJung-uk KimEC_KEY_priv2buf() converts an EC_KEY private key into an allocated buffer. 188e71b7053SJung-uk Kim 189e71b7053SJung-uk Kim=head1 RETURN VALUES 190e71b7053SJung-uk Kim 191*b077aed3SPierre ProncheryEC_KEY_new_ex(), EC_KEY_new(), EC_KEY_new_by_curve_name_ex(), 192*b077aed3SPierre ProncheryEC_KEY_new_by_curve_name() and EC_KEY_dup() return a pointer to the newly 193*b077aed3SPierre Proncherycreated EC_KEY object, or NULL on error. 194e71b7053SJung-uk Kim 195e71b7053SJung-uk KimEC_KEY_get_flags() returns the flags associated with the EC_KEY object as an 196e71b7053SJung-uk Kiminteger. 197e71b7053SJung-uk Kim 198e71b7053SJung-uk KimEC_KEY_copy() returns a pointer to the destination key, or NULL on error. 199e71b7053SJung-uk Kim 200e71b7053SJung-uk KimEC_KEY_get0_engine() returns a pointer to an ENGINE, or NULL if it wasn't set. 201e71b7053SJung-uk Kim 202cfc39718SJung-uk KimEC_KEY_up_ref(), EC_KEY_set_group(), EC_KEY_set_public_key(), 203cfc39718SJung-uk KimEC_KEY_precompute_mult(), EC_KEY_generate_key(), EC_KEY_check_key(), 204cfc39718SJung-uk KimEC_KEY_set_public_key_affine_coordinates(), EC_KEY_oct2key() and 205cfc39718SJung-uk KimEC_KEY_oct2priv() return 1 on success or 0 on error. 206cfc39718SJung-uk Kim 207cfc39718SJung-uk KimEC_KEY_set_private_key() returns 1 on success or 0 on error except when the 208cfc39718SJung-uk Kimpriv_key argument is NULL, in that case it returns 0, for legacy compatibility, 209cfc39718SJung-uk Kimand should not be treated as an error. 210e71b7053SJung-uk Kim 211e71b7053SJung-uk KimEC_KEY_get0_group() returns the EC_GROUP associated with the EC_KEY. 212e71b7053SJung-uk Kim 213e71b7053SJung-uk KimEC_KEY_get0_private_key() returns the private key associated with the EC_KEY. 214e71b7053SJung-uk Kim 215e71b7053SJung-uk KimEC_KEY_get_conv_form() return the point_conversion_form for the EC_KEY. 216e71b7053SJung-uk Kim 217e71b7053SJung-uk KimEC_KEY_key2buf(), EC_KEY_priv2oct() and EC_KEY_priv2buf() return the length 218e71b7053SJung-uk Kimof the buffer or 0 on error. 219e71b7053SJung-uk Kim 220e71b7053SJung-uk Kim=head1 SEE ALSO 221e71b7053SJung-uk Kim 222*b077aed3SPierre ProncheryL<EVP_PKEY_Q_keygen(3)> 223e71b7053SJung-uk KimL<crypto(7)>, L<EC_GROUP_new(3)>, 224e71b7053SJung-uk KimL<EC_GROUP_copy(3)>, L<EC_POINT_new(3)>, 225e71b7053SJung-uk KimL<EC_POINT_add(3)>, 226e71b7053SJung-uk KimL<EC_GFp_simple_method(3)>, 227*b077aed3SPierre ProncheryL<d2i_ECPKParameters(3)>, 228*b077aed3SPierre ProncheryL<OSSL_LIB_CTX(3)> 229*b077aed3SPierre Pronchery 230*b077aed3SPierre Pronchery=head1 HISTORY 231*b077aed3SPierre Pronchery 232*b077aed3SPierre ProncheryEVP_EC_gen() was added in OpenSSL 3.0. 233*b077aed3SPierre ProncheryAll other functions described here were deprecated in OpenSSL 3.0. 234*b077aed3SPierre ProncheryFor replacement see L<EVP_PKEY-EC(7)>. 235e71b7053SJung-uk Kim 236e71b7053SJung-uk Kim=head1 COPYRIGHT 237e71b7053SJung-uk Kim 238*b077aed3SPierre ProncheryCopyright 2013-2023 The OpenSSL Project Authors. All Rights Reserved. 239e71b7053SJung-uk Kim 240*b077aed3SPierre ProncheryLicensed under the Apache License 2.0 (the "License"). You may not use 241e71b7053SJung-uk Kimthis file except in compliance with the License. You can obtain a copy 242e71b7053SJung-uk Kimin the file LICENSE in the source distribution or at 243e71b7053SJung-uk KimL<https://www.openssl.org/source/license.html>. 244e71b7053SJung-uk Kim 245e71b7053SJung-uk Kim=cut 246