1e71b7053SJung-uk Kim=pod 2e71b7053SJung-uk Kim 3e71b7053SJung-uk Kim=head1 NAME 4e71b7053SJung-uk Kim 5e71b7053SJung-uk KimEC_KEY_get_method, EC_KEY_set_method, 6e71b7053SJung-uk KimEC_KEY_new, EC_KEY_get_flags, EC_KEY_set_flags, EC_KEY_clear_flags, 7e71b7053SJung-uk KimEC_KEY_new_by_curve_name, EC_KEY_free, EC_KEY_copy, EC_KEY_dup, EC_KEY_up_ref, 8e71b7053SJung-uk KimEC_KEY_get0_engine, 9e71b7053SJung-uk KimEC_KEY_get0_group, EC_KEY_set_group, EC_KEY_get0_private_key, 10e71b7053SJung-uk KimEC_KEY_set_private_key, EC_KEY_get0_public_key, EC_KEY_set_public_key, 11e71b7053SJung-uk KimEC_KEY_get_conv_form, 1258f35182SJung-uk KimEC_KEY_set_conv_form, EC_KEY_set_asn1_flag, 1358f35182SJung-uk KimEC_KEY_decoded_from_explicit_params, EC_KEY_precompute_mult, 14e71b7053SJung-uk KimEC_KEY_generate_key, EC_KEY_check_key, EC_KEY_set_public_key_affine_coordinates, 15e71b7053SJung-uk KimEC_KEY_oct2key, EC_KEY_key2buf, EC_KEY_oct2priv, EC_KEY_priv2oct, 16e71b7053SJung-uk KimEC_KEY_priv2buf - Functions for creating, destroying and manipulating 17e71b7053SJung-uk KimEC_KEY objects 18e71b7053SJung-uk Kim 19e71b7053SJung-uk Kim=head1 SYNOPSIS 20e71b7053SJung-uk Kim 21e71b7053SJung-uk Kim #include <openssl/ec.h> 22e71b7053SJung-uk Kim 23e71b7053SJung-uk Kim EC_KEY *EC_KEY_new(void); 24e71b7053SJung-uk Kim int EC_KEY_get_flags(const EC_KEY *key); 25e71b7053SJung-uk Kim void EC_KEY_set_flags(EC_KEY *key, int flags); 26e71b7053SJung-uk Kim void EC_KEY_clear_flags(EC_KEY *key, int flags); 27e71b7053SJung-uk Kim EC_KEY *EC_KEY_new_by_curve_name(int nid); 28e71b7053SJung-uk Kim void EC_KEY_free(EC_KEY *key); 29e71b7053SJung-uk Kim EC_KEY *EC_KEY_copy(EC_KEY *dst, const EC_KEY *src); 30e71b7053SJung-uk Kim EC_KEY *EC_KEY_dup(const EC_KEY *src); 31e71b7053SJung-uk Kim int EC_KEY_up_ref(EC_KEY *key); 32e71b7053SJung-uk Kim ENGINE *EC_KEY_get0_engine(const EC_KEY *eckey); 33e71b7053SJung-uk Kim const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key); 34e71b7053SJung-uk Kim int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group); 35e71b7053SJung-uk Kim const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key); 36*cfc39718SJung-uk Kim int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *priv_key); 37e71b7053SJung-uk Kim const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key); 38e71b7053SJung-uk Kim int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub); 39e71b7053SJung-uk Kim point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *key); 40e71b7053SJung-uk Kim void EC_KEY_set_conv_form(EC_KEY *eckey, point_conversion_form_t cform); 41e71b7053SJung-uk Kim void EC_KEY_set_asn1_flag(EC_KEY *eckey, int asn1_flag); 4258f35182SJung-uk Kim int EC_KEY_decoded_from_explicit_params(const EC_KEY *key); 43e71b7053SJung-uk Kim int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx); 44e71b7053SJung-uk Kim int EC_KEY_generate_key(EC_KEY *key); 45e71b7053SJung-uk Kim int EC_KEY_check_key(const EC_KEY *key); 46e71b7053SJung-uk Kim int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x, BIGNUM *y); 47e71b7053SJung-uk Kim const EC_KEY_METHOD *EC_KEY_get_method(const EC_KEY *key); 48e71b7053SJung-uk Kim int EC_KEY_set_method(EC_KEY *key, const EC_KEY_METHOD *meth); 49e71b7053SJung-uk Kim 50e71b7053SJung-uk Kim int EC_KEY_oct2key(EC_KEY *eckey, const unsigned char *buf, size_t len, BN_CTX *ctx); 51e71b7053SJung-uk Kim size_t EC_KEY_key2buf(const EC_KEY *eckey, point_conversion_form_t form, 52e71b7053SJung-uk Kim unsigned char **pbuf, BN_CTX *ctx); 53e71b7053SJung-uk Kim 54e71b7053SJung-uk Kim int EC_KEY_oct2priv(EC_KEY *eckey, const unsigned char *buf, size_t len); 55e71b7053SJung-uk Kim size_t EC_KEY_priv2oct(const EC_KEY *eckey, unsigned char *buf, size_t len); 56e71b7053SJung-uk Kim 57e71b7053SJung-uk Kim size_t EC_KEY_priv2buf(const EC_KEY *eckey, unsigned char **pbuf); 58e71b7053SJung-uk Kim 59e71b7053SJung-uk Kim=head1 DESCRIPTION 60e71b7053SJung-uk Kim 61e71b7053SJung-uk KimAn EC_KEY represents a public key and, optionally, the associated private 62e71b7053SJung-uk Kimkey. A new EC_KEY with no associated curve can be constructed by calling 63e71b7053SJung-uk KimEC_KEY_new(). The reference count for the newly created EC_KEY is initially 64e71b7053SJung-uk Kimset to 1. A curve can be associated with the EC_KEY by calling 65e71b7053SJung-uk KimEC_KEY_set_group(). 66e71b7053SJung-uk Kim 67e71b7053SJung-uk KimAlternatively a new EC_KEY can be constructed by calling 68e71b7053SJung-uk KimEC_KEY_new_by_curve_name() and supplying the nid of the associated curve. See 69e71b7053SJung-uk KimL<EC_GROUP_new(3)> for a description of curve names. This function simply 70e71b7053SJung-uk Kimwraps calls to EC_KEY_new() and EC_GROUP_new_by_curve_name(). 71e71b7053SJung-uk Kim 72e71b7053SJung-uk KimCalling EC_KEY_free() decrements the reference count for the EC_KEY object, 73e71b7053SJung-uk Kimand if it has dropped to zero then frees the memory associated with it. If 74e71b7053SJung-uk KimB<key> is NULL nothing is done. 75e71b7053SJung-uk Kim 76e71b7053SJung-uk KimEC_KEY_copy() copies the contents of the EC_KEY in B<src> into B<dest>. 77e71b7053SJung-uk Kim 78e71b7053SJung-uk KimEC_KEY_dup() creates a new EC_KEY object and copies B<ec_key> into it. 79e71b7053SJung-uk Kim 80e71b7053SJung-uk KimEC_KEY_up_ref() increments the reference count associated with the EC_KEY 81e71b7053SJung-uk Kimobject. 82e71b7053SJung-uk Kim 83e71b7053SJung-uk KimEC_KEY_get0_engine() returns a handle to the ENGINE that has been set for 84e71b7053SJung-uk Kimthis EC_KEY object. 85e71b7053SJung-uk Kim 86e71b7053SJung-uk KimEC_KEY_generate_key() generates a new public and private key for the supplied 87e71b7053SJung-uk KimB<eckey> object. B<eckey> must have an EC_GROUP object associated with it 88e71b7053SJung-uk Kimbefore calling this function. The private key is a random integer (0 < priv_key 89e71b7053SJung-uk Kim< order, where I<order> is the order of the EC_GROUP object). The public key is 90e71b7053SJung-uk Kiman EC_POINT on the curve calculated by multiplying the generator for the 91e71b7053SJung-uk Kimcurve by the private key. 92e71b7053SJung-uk Kim 93e71b7053SJung-uk KimEC_KEY_check_key() performs various sanity checks on the EC_KEY object to 94e71b7053SJung-uk Kimconfirm that it is valid. 95e71b7053SJung-uk Kim 96e71b7053SJung-uk KimEC_KEY_set_public_key_affine_coordinates() sets the public key for B<key> based 97e71b7053SJung-uk Kimon its affine co-ordinates; i.e., it constructs an EC_POINT object based on 98e71b7053SJung-uk Kimthe supplied B<x> and B<y> values and sets the public key to be this 99e71b7053SJung-uk KimEC_POINT. It also performs certain sanity checks on the key to confirm 100e71b7053SJung-uk Kimthat it is valid. 101e71b7053SJung-uk Kim 102e71b7053SJung-uk KimThe functions EC_KEY_get0_group(), EC_KEY_set_group(), 103e71b7053SJung-uk KimEC_KEY_get0_private_key(), EC_KEY_set_private_key(), EC_KEY_get0_public_key(), 104e71b7053SJung-uk Kimand EC_KEY_set_public_key() get and set the EC_GROUP object, the private key, 105*cfc39718SJung-uk Kimand the EC_POINT public key for the B<key> respectively. The function 106*cfc39718SJung-uk KimEC_KEY_set_private_key() accepts NULL as the priv_key argument to securely clear 107*cfc39718SJung-uk Kimthe private key component from the EC_KEY. 108e71b7053SJung-uk Kim 109e71b7053SJung-uk KimThe functions EC_KEY_get_conv_form() and EC_KEY_set_conv_form() get and set the 110e71b7053SJung-uk Kimpoint_conversion_form for the B<key>. For a description of 111e71b7053SJung-uk Kimpoint_conversion_forms please see L<EC_POINT_new(3)>. 112e71b7053SJung-uk Kim 113e71b7053SJung-uk KimEC_KEY_set_flags() sets the flags in the B<flags> parameter on the EC_KEY 114e71b7053SJung-uk Kimobject. Any flags that are already set are left set. The flags currently 115e71b7053SJung-uk Kimdefined are EC_FLAG_NON_FIPS_ALLOW and EC_FLAG_FIPS_CHECKED. In 116e71b7053SJung-uk Kimaddition there is the flag EC_FLAG_COFACTOR_ECDH which is specific to ECDH. 117e71b7053SJung-uk KimEC_KEY_get_flags() returns the current flags that are set for this EC_KEY. 118e71b7053SJung-uk KimEC_KEY_clear_flags() clears the flags indicated by the B<flags> parameter; all 119e71b7053SJung-uk Kimother flags are left in their existing state. 120e71b7053SJung-uk Kim 121e71b7053SJung-uk KimEC_KEY_set_asn1_flag() sets the asn1_flag on the underlying EC_GROUP object 122e71b7053SJung-uk Kim(if set). Refer to L<EC_GROUP_copy(3)> for further information on the 123e71b7053SJung-uk Kimasn1_flag. 124e71b7053SJung-uk Kim 12558f35182SJung-uk KimEC_KEY_decoded_from_explicit_params() returns 1 if the group of the I<key> was 12658f35182SJung-uk Kimdecoded from data with explicitly encoded group parameters, -1 if the I<key> 12758f35182SJung-uk Kimis NULL or the group parameters are missing, and 0 otherwise. 12858f35182SJung-uk Kim 129e71b7053SJung-uk KimEC_KEY_precompute_mult() stores multiples of the underlying EC_GROUP generator 130e71b7053SJung-uk Kimfor faster point multiplication. See also L<EC_POINT_add(3)>. 131e71b7053SJung-uk Kim 132e71b7053SJung-uk KimEC_KEY_oct2key() and EC_KEY_key2buf() are identical to the functions 13358f35182SJung-uk KimEC_POINT_oct2point() and EC_POINT_point2buf() except they use the public key 134e71b7053SJung-uk KimEC_POINT in B<eckey>. 135e71b7053SJung-uk Kim 136e71b7053SJung-uk KimEC_KEY_oct2priv() and EC_KEY_priv2oct() convert between the private key 137e71b7053SJung-uk Kimcomponent of B<eckey> and octet form. The octet form consists of the content 138e71b7053SJung-uk Kimoctets of the B<privateKey> OCTET STRING in an B<ECPrivateKey> ASN.1 structure. 139e71b7053SJung-uk Kim 140e71b7053SJung-uk KimThe function EC_KEY_priv2oct() must be supplied with a buffer long enough to 141e71b7053SJung-uk Kimstore the octet form. The return value provides the number of octets stored. 142e71b7053SJung-uk KimCalling the function with a NULL buffer will not perform the conversion but 143e71b7053SJung-uk Kimwill just return the required buffer length. 144e71b7053SJung-uk Kim 145e71b7053SJung-uk KimThe function EC_KEY_priv2buf() allocates a buffer of suitable length and writes 146e71b7053SJung-uk Kiman EC_KEY to it in octet format. The allocated buffer is written to B<*pbuf> 147e71b7053SJung-uk Kimand its length is returned. The caller must free up the allocated buffer with a 148e71b7053SJung-uk Kimcall to OPENSSL_free(). Since the allocated buffer value is written to B<*pbuf> 149e71b7053SJung-uk Kimthe B<pbuf> parameter B<MUST NOT> be B<NULL>. 150e71b7053SJung-uk Kim 151e71b7053SJung-uk KimEC_KEY_priv2buf() converts an EC_KEY private key into an allocated buffer. 152e71b7053SJung-uk Kim 153e71b7053SJung-uk Kim=head1 RETURN VALUES 154e71b7053SJung-uk Kim 155e71b7053SJung-uk KimEC_KEY_new(), EC_KEY_new_by_curve_name() and EC_KEY_dup() return a pointer to 156e71b7053SJung-uk Kimthe newly created EC_KEY object, or NULL on error. 157e71b7053SJung-uk Kim 158e71b7053SJung-uk KimEC_KEY_get_flags() returns the flags associated with the EC_KEY object as an 159e71b7053SJung-uk Kiminteger. 160e71b7053SJung-uk Kim 161e71b7053SJung-uk KimEC_KEY_copy() returns a pointer to the destination key, or NULL on error. 162e71b7053SJung-uk Kim 163e71b7053SJung-uk KimEC_KEY_get0_engine() returns a pointer to an ENGINE, or NULL if it wasn't set. 164e71b7053SJung-uk Kim 165*cfc39718SJung-uk KimEC_KEY_up_ref(), EC_KEY_set_group(), EC_KEY_set_public_key(), 166*cfc39718SJung-uk KimEC_KEY_precompute_mult(), EC_KEY_generate_key(), EC_KEY_check_key(), 167*cfc39718SJung-uk KimEC_KEY_set_public_key_affine_coordinates(), EC_KEY_oct2key() and 168*cfc39718SJung-uk KimEC_KEY_oct2priv() return 1 on success or 0 on error. 169*cfc39718SJung-uk Kim 170*cfc39718SJung-uk KimEC_KEY_set_private_key() returns 1 on success or 0 on error except when the 171*cfc39718SJung-uk Kimpriv_key argument is NULL, in that case it returns 0, for legacy compatibility, 172*cfc39718SJung-uk Kimand should not be treated as an error. 173e71b7053SJung-uk Kim 174e71b7053SJung-uk KimEC_KEY_get0_group() returns the EC_GROUP associated with the EC_KEY. 175e71b7053SJung-uk Kim 176e71b7053SJung-uk KimEC_KEY_get0_private_key() returns the private key associated with the EC_KEY. 177e71b7053SJung-uk Kim 178e71b7053SJung-uk KimEC_KEY_get_conv_form() return the point_conversion_form for the EC_KEY. 179e71b7053SJung-uk Kim 180e71b7053SJung-uk KimEC_KEY_key2buf(), EC_KEY_priv2oct() and EC_KEY_priv2buf() return the length 181e71b7053SJung-uk Kimof the buffer or 0 on error. 182e71b7053SJung-uk Kim 183e71b7053SJung-uk Kim=head1 SEE ALSO 184e71b7053SJung-uk Kim 185e71b7053SJung-uk KimL<crypto(7)>, L<EC_GROUP_new(3)>, 186e71b7053SJung-uk KimL<EC_GROUP_copy(3)>, L<EC_POINT_new(3)>, 187e71b7053SJung-uk KimL<EC_POINT_add(3)>, 188e71b7053SJung-uk KimL<EC_GFp_simple_method(3)>, 189e71b7053SJung-uk KimL<d2i_ECPKParameters(3)> 190e71b7053SJung-uk Kim 191e71b7053SJung-uk Kim=head1 COPYRIGHT 192e71b7053SJung-uk Kim 193*cfc39718SJung-uk KimCopyright 2013-2022 The OpenSSL Project Authors. All Rights Reserved. 194e71b7053SJung-uk Kim 195e71b7053SJung-uk KimLicensed under the OpenSSL license (the "License"). You may not use 196e71b7053SJung-uk Kimthis file except in compliance with the License. You can obtain a copy 197e71b7053SJung-uk Kimin the file LICENSE in the source distribution or at 198e71b7053SJung-uk KimL<https://www.openssl.org/source/license.html>. 199e71b7053SJung-uk Kim 200e71b7053SJung-uk Kim=cut 201