xref: /freebsd/crypto/openssl/doc/man3/EC_KEY_new.pod (revision b077aed33b7b6aefca7b17ddb250cf521f938613)
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