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