1 | =pod
|
---|
2 |
|
---|
3 | =head1 NAME
|
---|
4 |
|
---|
5 | EC_POINT_set_Jprojective_coordinates_GFp,
|
---|
6 | EC_POINT_point2buf,
|
---|
7 | EC_POINT_new,
|
---|
8 | EC_POINT_free,
|
---|
9 | EC_POINT_clear_free,
|
---|
10 | EC_POINT_copy,
|
---|
11 | EC_POINT_dup,
|
---|
12 | EC_POINT_method_of,
|
---|
13 | EC_POINT_set_to_infinity,
|
---|
14 | EC_POINT_get_Jprojective_coordinates_GFp,
|
---|
15 | EC_POINT_set_affine_coordinates,
|
---|
16 | EC_POINT_get_affine_coordinates,
|
---|
17 | EC_POINT_set_compressed_coordinates,
|
---|
18 | EC_POINT_set_affine_coordinates_GFp,
|
---|
19 | EC_POINT_get_affine_coordinates_GFp,
|
---|
20 | EC_POINT_set_compressed_coordinates_GFp,
|
---|
21 | EC_POINT_set_affine_coordinates_GF2m,
|
---|
22 | EC_POINT_get_affine_coordinates_GF2m,
|
---|
23 | EC_POINT_set_compressed_coordinates_GF2m,
|
---|
24 | EC_POINT_point2oct,
|
---|
25 | EC_POINT_oct2point,
|
---|
26 | EC_POINT_point2bn,
|
---|
27 | EC_POINT_bn2point,
|
---|
28 | EC_POINT_point2hex,
|
---|
29 | EC_POINT_hex2point
|
---|
30 | - Functions for creating, destroying and manipulating EC_POINT objects
|
---|
31 |
|
---|
32 | =head1 SYNOPSIS
|
---|
33 |
|
---|
34 | #include <openssl/ec.h>
|
---|
35 |
|
---|
36 | EC_POINT *EC_POINT_new(const EC_GROUP *group);
|
---|
37 | void EC_POINT_free(EC_POINT *point);
|
---|
38 | void EC_POINT_clear_free(EC_POINT *point);
|
---|
39 | int EC_POINT_copy(EC_POINT *dst, const EC_POINT *src);
|
---|
40 | EC_POINT *EC_POINT_dup(const EC_POINT *src, const EC_GROUP *group);
|
---|
41 | const EC_METHOD *EC_POINT_method_of(const EC_POINT *point);
|
---|
42 | int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point);
|
---|
43 | int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *group,
|
---|
44 | EC_POINT *p,
|
---|
45 | const BIGNUM *x, const BIGNUM *y,
|
---|
46 | const BIGNUM *z, BN_CTX *ctx);
|
---|
47 | int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group,
|
---|
48 | const EC_POINT *p,
|
---|
49 | BIGNUM *x, BIGNUM *y, BIGNUM *z,
|
---|
50 | BN_CTX *ctx);
|
---|
51 | int EC_POINT_set_affine_coordinates(const EC_GROUP *group, EC_POINT *p,
|
---|
52 | const BIGNUM *x, const BIGNUM *y,
|
---|
53 | BN_CTX *ctx);
|
---|
54 | int EC_POINT_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *p,
|
---|
55 | BIGNUM *x, BIGNUM *y, BN_CTX *ctx);
|
---|
56 | int EC_POINT_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *p,
|
---|
57 | const BIGNUM *x, int y_bit,
|
---|
58 | BN_CTX *ctx);
|
---|
59 | int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, EC_POINT *p,
|
---|
60 | const BIGNUM *x, const BIGNUM *y,
|
---|
61 | BN_CTX *ctx);
|
---|
62 | int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group,
|
---|
63 | const EC_POINT *p,
|
---|
64 | BIGNUM *x, BIGNUM *y, BN_CTX *ctx);
|
---|
65 | int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group,
|
---|
66 | EC_POINT *p,
|
---|
67 | const BIGNUM *x, int y_bit,
|
---|
68 | BN_CTX *ctx);
|
---|
69 | int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p,
|
---|
70 | const BIGNUM *x, const BIGNUM *y,
|
---|
71 | BN_CTX *ctx);
|
---|
72 | int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group,
|
---|
73 | const EC_POINT *p,
|
---|
74 | BIGNUM *x, BIGNUM *y, BN_CTX *ctx);
|
---|
75 | int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group,
|
---|
76 | EC_POINT *p,
|
---|
77 | const BIGNUM *x, int y_bit,
|
---|
78 | BN_CTX *ctx);
|
---|
79 | size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *p,
|
---|
80 | point_conversion_form_t form,
|
---|
81 | unsigned char *buf, size_t len, BN_CTX *ctx);
|
---|
82 | size_t EC_POINT_point2buf(const EC_GROUP *group, const EC_POINT *point,
|
---|
83 | point_conversion_form_t form,
|
---|
84 | unsigned char **pbuf, BN_CTX *ctx);
|
---|
85 | int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *p,
|
---|
86 | const unsigned char *buf, size_t len, BN_CTX *ctx);
|
---|
87 | BIGNUM *EC_POINT_point2bn(const EC_GROUP *group, const EC_POINT *p,
|
---|
88 | point_conversion_form_t form, BIGNUM *bn,
|
---|
89 | BN_CTX *ctx);
|
---|
90 | EC_POINT *EC_POINT_bn2point(const EC_GROUP *group, const BIGNUM *bn,
|
---|
91 | EC_POINT *p, BN_CTX *ctx);
|
---|
92 | char *EC_POINT_point2hex(const EC_GROUP *group, const EC_POINT *p,
|
---|
93 | point_conversion_form_t form, BN_CTX *ctx);
|
---|
94 | EC_POINT *EC_POINT_hex2point(const EC_GROUP *group, const char *hex,
|
---|
95 | EC_POINT *p, BN_CTX *ctx);
|
---|
96 |
|
---|
97 |
|
---|
98 | =head1 DESCRIPTION
|
---|
99 |
|
---|
100 | An B<EC_POINT> structure represents a point on a curve. A new point is
|
---|
101 | constructed by calling the function EC_POINT_new() and providing the
|
---|
102 | B<group> object that the point relates to.
|
---|
103 |
|
---|
104 | EC_POINT_free() frees the memory associated with the B<EC_POINT>.
|
---|
105 | if B<point> is NULL nothing is done.
|
---|
106 |
|
---|
107 | EC_POINT_clear_free() destroys any sensitive data held within the EC_POINT and
|
---|
108 | then frees its memory. If B<point> is NULL nothing is done.
|
---|
109 |
|
---|
110 | EC_POINT_copy() copies the point B<src> into B<dst>. Both B<src> and B<dst>
|
---|
111 | must use the same B<EC_METHOD>.
|
---|
112 |
|
---|
113 | EC_POINT_dup() creates a new B<EC_POINT> object and copies the content from
|
---|
114 | B<src> to the newly created B<EC_POINT> object.
|
---|
115 |
|
---|
116 | EC_POINT_method_of() obtains the B<EC_METHOD> associated with B<point>.
|
---|
117 |
|
---|
118 | A valid point on a curve is the special point at infinity. A point is set to
|
---|
119 | be at infinity by calling EC_POINT_set_to_infinity().
|
---|
120 |
|
---|
121 | The affine co-ordinates for a point describe a point in terms of its x and y
|
---|
122 | position. The function EC_POINT_set_affine_coordinates() sets the B<x> and B<y>
|
---|
123 | co-ordinates for the point B<p> defined over the curve given in B<group>. The
|
---|
124 | function EC_POINT_get_affine_coordinates() sets B<x> and B<y>, either of which
|
---|
125 | may be NULL, to the corresponding coordinates of B<p>.
|
---|
126 |
|
---|
127 | The functions EC_POINT_set_affine_coordinates_GFp() and
|
---|
128 | EC_POINT_set_affine_coordinates_GF2m() are synonyms for
|
---|
129 | EC_POINT_set_affine_coordinates(). They are defined for backwards compatibility
|
---|
130 | only and should not be used.
|
---|
131 |
|
---|
132 | The functions EC_POINT_get_affine_coordinates_GFp() and
|
---|
133 | EC_POINT_get_affine_coordinates_GF2m() are synonyms for
|
---|
134 | EC_POINT_get_affine_coordinates(). They are defined for backwards compatibility
|
---|
135 | only and should not be used.
|
---|
136 |
|
---|
137 | As well as the affine co-ordinates, a point can alternatively be described in
|
---|
138 | terms of its Jacobian projective co-ordinates (for Fp curves only). Jacobian
|
---|
139 | projective co-ordinates are expressed as three values x, y and z. Working in
|
---|
140 | this co-ordinate system provides more efficient point multiplication
|
---|
141 | operations. A mapping exists between Jacobian projective co-ordinates and
|
---|
142 | affine co-ordinates. A Jacobian projective co-ordinate (x, y, z) can be written
|
---|
143 | as an affine co-ordinate as (x/(z^2), y/(z^3)). Conversion to Jacobian
|
---|
144 | projective from affine co-ordinates is simple. The co-ordinate (x, y) is mapped
|
---|
145 | to (x, y, 1). To set or get the projective co-ordinates use
|
---|
146 | EC_POINT_set_Jprojective_coordinates_GFp() and
|
---|
147 | EC_POINT_get_Jprojective_coordinates_GFp() respectively.
|
---|
148 |
|
---|
149 | Points can also be described in terms of their compressed co-ordinates. For a
|
---|
150 | point (x, y), for any given value for x such that the point is on the curve
|
---|
151 | there will only ever be two possible values for y. Therefore, a point can be set
|
---|
152 | using the EC_POINT_set_compressed_coordinates() function where B<x> is the x
|
---|
153 | co-ordinate and B<y_bit> is a value 0 or 1 to identify which of the two
|
---|
154 | possible values for y should be used.
|
---|
155 |
|
---|
156 | The functions EC_POINT_set_compressed_coordinates_GFp() and
|
---|
157 | EC_POINT_set_compressed_coordinates_GF2m() are synonyms for
|
---|
158 | EC_POINT_set_compressed_coordinates(). They are defined for backwards
|
---|
159 | compatibility only and should not be used.
|
---|
160 |
|
---|
161 | In addition B<EC_POINT> can be converted to and from various external
|
---|
162 | representations. The octet form is the binary encoding of the B<ECPoint>
|
---|
163 | structure (as defined in RFC5480 and used in certificates and TLS records):
|
---|
164 | only the content octets are present, the B<OCTET STRING> tag and length are
|
---|
165 | not included. B<BIGNUM> form is the octet form interpreted as a big endian
|
---|
166 | integer converted to a B<BIGNUM> structure. Hexadecimal form is the octet
|
---|
167 | form converted to a NULL terminated character string where each character
|
---|
168 | is one of the printable values 0-9 or A-F (or a-f).
|
---|
169 |
|
---|
170 | The functions EC_POINT_point2oct(), EC_POINT_oct2point(), EC_POINT_point2bn(),
|
---|
171 | EC_POINT_bn2point(), EC_POINT_point2hex() and EC_POINT_hex2point() convert from
|
---|
172 | and to EC_POINTs for the formats: octet, BIGNUM and hexadecimal respectively.
|
---|
173 |
|
---|
174 | The function EC_POINT_point2oct() encodes the given curve point B<p> as an
|
---|
175 | octet string into the buffer B<buf> of size B<len>, using the specified
|
---|
176 | conversion form B<form>.
|
---|
177 | The encoding conforms with Sec. 2.3.3 of the SECG SEC 1 ("Elliptic Curve
|
---|
178 | Cryptography") standard.
|
---|
179 | Similarly the function EC_POINT_oct2point() decodes a curve point into B<p> from
|
---|
180 | the octet string contained in the given buffer B<buf> of size B<len>, conforming
|
---|
181 | to Sec. 2.3.4 of the SECG SEC 1 ("Elliptic Curve Cryptography") standard.
|
---|
182 |
|
---|
183 | The functions EC_POINT_point2hex() and EC_POINT_point2bn() convert a point B<p>,
|
---|
184 | respectively, to the hexadecimal or BIGNUM representation of the same
|
---|
185 | encoding of the function EC_POINT_point2oct().
|
---|
186 | Vice versa, similarly to the function EC_POINT_oct2point(), the functions
|
---|
187 | EC_POINT_hex2point() and EC_POINT_point2bn() decode the hexadecimal or
|
---|
188 | BIGNUM representation into the EC_POINT B<p>.
|
---|
189 |
|
---|
190 | Notice that, according to the standard, the octet string encoding of the point
|
---|
191 | at infinity for a given curve is fixed to a single octet of value zero and that,
|
---|
192 | vice versa, a single octet of size zero is decoded as the point at infinity.
|
---|
193 |
|
---|
194 | The function EC_POINT_point2oct() must be supplied with a buffer long enough to
|
---|
195 | store the octet form. The return value provides the number of octets stored.
|
---|
196 | Calling the function with a NULL buffer will not perform the conversion but
|
---|
197 | will still return the required buffer length.
|
---|
198 |
|
---|
199 | The function EC_POINT_point2buf() allocates a buffer of suitable length and
|
---|
200 | writes an EC_POINT to it in octet format. The allocated buffer is written to
|
---|
201 | B<*pbuf> and its length is returned. The caller must free up the allocated
|
---|
202 | buffer with a call to OPENSSL_free(). Since the allocated buffer value is
|
---|
203 | written to B<*pbuf> the B<pbuf> parameter B<MUST NOT> be B<NULL>.
|
---|
204 |
|
---|
205 | The function EC_POINT_point2hex() will allocate sufficient memory to store the
|
---|
206 | hexadecimal string. It is the caller's responsibility to free this memory with
|
---|
207 | a subsequent call to OPENSSL_free().
|
---|
208 |
|
---|
209 | =head1 RETURN VALUES
|
---|
210 |
|
---|
211 | EC_POINT_new() and EC_POINT_dup() return the newly allocated EC_POINT or NULL
|
---|
212 | on error.
|
---|
213 |
|
---|
214 | The following functions return 1 on success or 0 on error: EC_POINT_copy(),
|
---|
215 | EC_POINT_set_to_infinity(), EC_POINT_set_Jprojective_coordinates_GFp(),
|
---|
216 | EC_POINT_get_Jprojective_coordinates_GFp(),
|
---|
217 | EC_POINT_set_affine_coordinates_GFp(), EC_POINT_get_affine_coordinates_GFp(),
|
---|
218 | EC_POINT_set_compressed_coordinates_GFp(),
|
---|
219 | EC_POINT_set_affine_coordinates_GF2m(), EC_POINT_get_affine_coordinates_GF2m(),
|
---|
220 | EC_POINT_set_compressed_coordinates_GF2m() and EC_POINT_oct2point().
|
---|
221 |
|
---|
222 | EC_POINT_method_of returns the EC_METHOD associated with the supplied EC_POINT.
|
---|
223 |
|
---|
224 | EC_POINT_point2oct() and EC_POINT_point2buf() return the length of the required
|
---|
225 | buffer or 0 on error.
|
---|
226 |
|
---|
227 | EC_POINT_point2bn() returns the pointer to the BIGNUM supplied, or NULL on
|
---|
228 | error.
|
---|
229 |
|
---|
230 | EC_POINT_bn2point() returns the pointer to the EC_POINT supplied, or NULL on
|
---|
231 | error.
|
---|
232 |
|
---|
233 | EC_POINT_point2hex() returns a pointer to the hex string, or NULL on error.
|
---|
234 |
|
---|
235 | EC_POINT_hex2point() returns the pointer to the EC_POINT supplied, or NULL on
|
---|
236 | error.
|
---|
237 |
|
---|
238 | =head1 SEE ALSO
|
---|
239 |
|
---|
240 | L<crypto(7)>, L<EC_GROUP_new(3)>, L<EC_GROUP_copy(3)>,
|
---|
241 | L<EC_POINT_add(3)>, L<EC_KEY_new(3)>,
|
---|
242 | L<EC_GFp_simple_method(3)>, L<d2i_ECPKParameters(3)>
|
---|
243 |
|
---|
244 | =head1 COPYRIGHT
|
---|
245 |
|
---|
246 | Copyright 2013-2020 The OpenSSL Project Authors. All Rights Reserved.
|
---|
247 |
|
---|
248 | Licensed under the OpenSSL license (the "License"). You may not use
|
---|
249 | this file except in compliance with the License. You can obtain a copy
|
---|
250 | in the file LICENSE in the source distribution or at
|
---|
251 | L<https://www.openssl.org/source/license.html>.
|
---|
252 |
|
---|
253 | =cut
|
---|