1 | =pod
|
---|
2 |
|
---|
3 | =head1 NAME
|
---|
4 |
|
---|
5 | EVP_PKEY-EC,
|
---|
6 | EVP_KEYMGMT-EC
|
---|
7 | - EVP_PKEY EC keytype and algorithm support
|
---|
8 |
|
---|
9 | =head1 DESCRIPTION
|
---|
10 |
|
---|
11 | The B<EC> keytype is implemented in OpenSSL's default provider.
|
---|
12 |
|
---|
13 | =head2 Common EC parameters
|
---|
14 |
|
---|
15 | The normal way of specifying domain parameters for an EC curve is via the
|
---|
16 | curve name "group". For curves with no curve name, explicit parameters can be
|
---|
17 | used that specify "field-type", "p", "a", "b", "generator" and "order".
|
---|
18 | Explicit parameters are supported for backwards compatibility reasons, but they
|
---|
19 | are not compliant with multiple standards (including RFC5915) which only allow
|
---|
20 | named curves.
|
---|
21 |
|
---|
22 | The following KeyGen/Gettable/Import/Export types are available for the
|
---|
23 | built-in EC algorithm:
|
---|
24 |
|
---|
25 | =over 4
|
---|
26 |
|
---|
27 | =item "group" (B<OSSL_PKEY_PARAM_GROUP_NAME>) <UTF8 string>
|
---|
28 |
|
---|
29 | The curve name.
|
---|
30 |
|
---|
31 | =item "field-type" (B<OSSL_PKEY_PARAM_EC_FIELD_TYPE>) <UTF8 string>
|
---|
32 |
|
---|
33 | The value should be either "prime-field" or "characteristic-two-field",
|
---|
34 | which correspond to prime field Fp and binary field F2^m.
|
---|
35 |
|
---|
36 | =item "p" (B<OSSL_PKEY_PARAM_EC_P>) <unsigned integer>
|
---|
37 |
|
---|
38 | For a curve over Fp I<p> is the prime for the field. For a curve over F2^m I<p>
|
---|
39 | represents the irreducible polynomial - each bit represents a term in the
|
---|
40 | polynomial. Therefore, there will either be three or five bits set dependent on
|
---|
41 | whether the polynomial is a trinomial or a pentanomial.
|
---|
42 |
|
---|
43 | =item "a" (B<OSSL_PKEY_PARAM_EC_A>) <unsigned integer>
|
---|
44 |
|
---|
45 | =item "b" (B<OSSL_PKEY_PARAM_EC_B>) <unsigned integer>
|
---|
46 |
|
---|
47 | =item "seed" (B<OSSL_PKEY_PARAM_EC_SEED>) <octet string>
|
---|
48 |
|
---|
49 | I<a> and I<b> represents the coefficients of the curve
|
---|
50 | For Fp: y^2 mod p = x^3 +ax + b mod p OR
|
---|
51 | For F2^m: y^2 + xy = x^3 + ax^2 + b
|
---|
52 |
|
---|
53 | I<seed> is an optional value that is for information purposes only.
|
---|
54 | It represents the random number seed used to generate the coefficient I<b> from a
|
---|
55 | random number.
|
---|
56 |
|
---|
57 | =item "generator" (B<OSSL_PKEY_PARAM_EC_GENERATOR>) <octet string>
|
---|
58 |
|
---|
59 | =item "order" (B<OSSL_PKEY_PARAM_EC_ORDER>) <unsigned integer>
|
---|
60 |
|
---|
61 | =item "cofactor" (B<OSSL_PKEY_PARAM_EC_COFACTOR>) <unsigned integer>
|
---|
62 |
|
---|
63 | The I<generator> is a well defined point on the curve chosen for cryptographic
|
---|
64 | operations. The encoding conforms with Sec. 2.3.3 of the SECG SEC 1 ("Elliptic Curve
|
---|
65 | Cryptography") standard. See EC_POINT_oct2point().
|
---|
66 | Integers used for point multiplications will be between 0 and
|
---|
67 | I<order> - 1.
|
---|
68 | I<cofactor> is an optional value.
|
---|
69 | I<order> multiplied by the I<cofactor> gives the number of points on the curve.
|
---|
70 |
|
---|
71 | =item "decoded-from-explicit" (B<OSSL_PKEY_PARAM_EC_DECODED_FROM_EXPLICIT_PARAMS>) <integer>
|
---|
72 |
|
---|
73 | Gets a flag indicating whether the key or parameters were decoded from explicit
|
---|
74 | curve parameters. Set to 1 if so or 0 if a named curve was used.
|
---|
75 |
|
---|
76 | =item "use-cofactor-flag" (B<OSSL_PKEY_PARAM_USE_COFACTOR_ECDH>) <integer>
|
---|
77 |
|
---|
78 | Enable Cofactor DH (ECC CDH) if this value is 1, otherwise it uses normal EC DH
|
---|
79 | if the value is zero. The cofactor variant multiplies the shared secret by the
|
---|
80 | EC curve's cofactor (note for some curves the cofactor is 1).
|
---|
81 |
|
---|
82 | See also L<EVP_KEYEXCH-ECDH(7)> for the related
|
---|
83 | B<OSSL_EXCHANGE_PARAM_EC_ECDH_COFACTOR_MODE> parameter that can be set on a
|
---|
84 | per-operation basis.
|
---|
85 |
|
---|
86 | =item "encoding" (B<OSSL_PKEY_PARAM_EC_ENCODING>) <UTF8 string>
|
---|
87 |
|
---|
88 | Set the format used for serializing the EC group parameters.
|
---|
89 | Valid values are "explicit" or "named_curve". The default value is "named_curve".
|
---|
90 |
|
---|
91 | =item "point-format" (B<OSSL_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT>) <UTF8 string>
|
---|
92 |
|
---|
93 | Sets or gets the point_conversion_form for the I<key>. For a description of
|
---|
94 | point_conversion_forms please see L<EC_POINT_new(3)>. Valid values are
|
---|
95 | "uncompressed" or "compressed". The default value is "uncompressed".
|
---|
96 |
|
---|
97 | =item "group-check" (B<OSSL_PKEY_PARAM_EC_GROUP_CHECK_TYPE>) <UTF8 string>
|
---|
98 |
|
---|
99 | Sets or Gets the type of group check done when EVP_PKEY_param_check() is called.
|
---|
100 | Valid values are "default", "named" and "named-nist".
|
---|
101 | The "named" type checks that the domain parameters match the inbuilt curve parameters,
|
---|
102 | "named-nist" is similar but also checks that the named curve is a nist curve.
|
---|
103 | The "default" type does domain parameter validation for the OpenSSL default provider,
|
---|
104 | but is equivalent to "named-nist" for the OpenSSL FIPS provider.
|
---|
105 |
|
---|
106 | =item "include-public" (B<OSSL_PKEY_PARAM_EC_INCLUDE_PUBLIC>) <integer>
|
---|
107 |
|
---|
108 | Setting this value to 0 indicates that the public key should not be included when
|
---|
109 | encoding the private key. The default value of 1 will include the public key.
|
---|
110 |
|
---|
111 | =item "pub" (B<OSSL_PKEY_PARAM_PUB_KEY>) <octet string>
|
---|
112 |
|
---|
113 | The public key value in encoded EC point format conforming to Sec. 2.3.3 and
|
---|
114 | 2.3.4 of the SECG SEC 1 ("Elliptic Curve Cryptography") standard.
|
---|
115 | This parameter is used when importing or exporting the public key value with the
|
---|
116 | EVP_PKEY_fromdata() and EVP_PKEY_todata() functions.
|
---|
117 |
|
---|
118 | Note, in particular, that the choice of point compression format used for
|
---|
119 | encoding the exported value via EVP_PKEY_todata() depends on the underlying
|
---|
120 | provider implementation.
|
---|
121 | Before OpenSSL 3.0.8, the implementation of providers included with OpenSSL always
|
---|
122 | opted for an encoding in compressed format, unconditionally.
|
---|
123 | Since OpenSSL 3.0.8, the implementation has been changed to honor the
|
---|
124 | B<OSSL_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT> parameter, if set, or to default
|
---|
125 | to uncompressed format.
|
---|
126 |
|
---|
127 | =item "priv" (B<OSSL_PKEY_PARAM_PRIV_KEY>) <unsigned integer>
|
---|
128 |
|
---|
129 | The private key value.
|
---|
130 |
|
---|
131 | =item "encoded-pub-key" (B<OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY>) <octet string>
|
---|
132 |
|
---|
133 | Used for getting and setting the encoding of an EC public key. The public key
|
---|
134 | is expected to be a point conforming to Sec. 2.3.4 of the SECG SEC 1 ("Elliptic
|
---|
135 | Curve Cryptography") standard.
|
---|
136 |
|
---|
137 | =item "qx" (B<OSSL_PKEY_PARAM_EC_PUB_X>) <unsigned integer>
|
---|
138 |
|
---|
139 | Used for getting the EC public key X component.
|
---|
140 |
|
---|
141 | =item "qy" (B<OSSL_PKEY_PARAM_EC_PUB_Y>) <unsigned integer>
|
---|
142 |
|
---|
143 | Used for getting the EC public key Y component.
|
---|
144 |
|
---|
145 | =item "default-digest" (B<OSSL_PKEY_PARAM_DEFAULT_DIGEST>) <UTF8 string>
|
---|
146 |
|
---|
147 | Getter that returns the default digest name.
|
---|
148 | (Currently returns "SHA256" as of OpenSSL 3.0).
|
---|
149 |
|
---|
150 | =back
|
---|
151 |
|
---|
152 | The following Gettable types are also available for the built-in EC algorithm:
|
---|
153 |
|
---|
154 | =over 4
|
---|
155 |
|
---|
156 | =item "basis-type" (B<OSSL_PKEY_PARAM_EC_CHAR2_TYPE>) <UTF8 string>
|
---|
157 |
|
---|
158 | Supports the values "tpBasis" for a trinomial or "ppBasis" for a pentanomial.
|
---|
159 | This field is only used for a binary field F2^m.
|
---|
160 |
|
---|
161 | =item "m" (B<OSSL_PKEY_PARAM_EC_CHAR2_M>) <integer>
|
---|
162 |
|
---|
163 | =item "tp" (B<OSSL_PKEY_PARAM_EC_CHAR2_TP_BASIS>) <integer>
|
---|
164 |
|
---|
165 | =item "k1" (B<OSSL_PKEY_PARAM_EC_CHAR2_PP_K1>) <integer>
|
---|
166 |
|
---|
167 | =item "k2" (B<OSSL_PKEY_PARAM_EC_CHAR2_PP_K2>) <integer>
|
---|
168 |
|
---|
169 | =item "k3" (B<OSSL_PKEY_PARAM_EC_CHAR2_PP_K3>) <integer>
|
---|
170 |
|
---|
171 | These fields are only used for a binary field F2^m.
|
---|
172 | I<m> is the degree of the binary field.
|
---|
173 |
|
---|
174 | I<tp> is the middle bit of a trinomial so its value must be in the
|
---|
175 | range m > tp > 0.
|
---|
176 |
|
---|
177 | I<k1>, I<k2> and I<k3> are used to get the middle bits of a pentanomial such
|
---|
178 | that m > k3 > k2 > k1 > 0
|
---|
179 |
|
---|
180 | =back
|
---|
181 |
|
---|
182 | =head2 EC key validation
|
---|
183 |
|
---|
184 | For EC keys, L<EVP_PKEY_param_check(3)> behaves in the following way:
|
---|
185 | For the OpenSSL default provider it uses either
|
---|
186 | L<EC_GROUP_check(3)> or L<EC_GROUP_check_named_curve(3)> depending on the flag
|
---|
187 | EC_FLAG_CHECK_NAMED_GROUP.
|
---|
188 | The OpenSSL FIPS provider uses L<EC_GROUP_check_named_curve(3)> in order to
|
---|
189 | conform to SP800-56Ar3 I<Assurances of Domain-Parameter Validity>.
|
---|
190 |
|
---|
191 | For EC keys, L<EVP_PKEY_param_check_quick(3)> is equivalent to
|
---|
192 | L<EVP_PKEY_param_check(3)>.
|
---|
193 |
|
---|
194 | For EC keys, L<EVP_PKEY_public_check(3)> and L<EVP_PKEY_public_check_quick(3)>
|
---|
195 | conform to SP800-56Ar3 I<ECC Full Public-Key Validation> and
|
---|
196 | I<ECC Partial Public-Key Validation> respectively.
|
---|
197 |
|
---|
198 | For EC Keys, L<EVP_PKEY_private_check(3)> and L<EVP_PKEY_pairwise_check(3)>
|
---|
199 | conform to SP800-56Ar3 I<Private key validity> and
|
---|
200 | I<Owner Assurance of Pair-wise Consistency> respectively.
|
---|
201 |
|
---|
202 | =head1 EXAMPLES
|
---|
203 |
|
---|
204 | An B<EVP_PKEY> context can be obtained by calling:
|
---|
205 |
|
---|
206 | EVP_PKEY_CTX *pctx =
|
---|
207 | EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL);
|
---|
208 |
|
---|
209 | An B<EVP_PKEY> ECDSA or ECDH key can be generated with a "P-256" named group by
|
---|
210 | calling:
|
---|
211 |
|
---|
212 | pkey = EVP_EC_gen("P-256");
|
---|
213 |
|
---|
214 | or like this:
|
---|
215 |
|
---|
216 | EVP_PKEY *key = NULL;
|
---|
217 | OSSL_PARAM params[2];
|
---|
218 | EVP_PKEY_CTX *gctx =
|
---|
219 | EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL);
|
---|
220 |
|
---|
221 | EVP_PKEY_keygen_init(gctx);
|
---|
222 |
|
---|
223 | params[0] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME,
|
---|
224 | "P-256", 0);
|
---|
225 | params[1] = OSSL_PARAM_construct_end();
|
---|
226 | EVP_PKEY_CTX_set_params(gctx, params);
|
---|
227 |
|
---|
228 | EVP_PKEY_generate(gctx, &key);
|
---|
229 |
|
---|
230 | EVP_PKEY_print_private(bio_out, key, 0, NULL);
|
---|
231 | ...
|
---|
232 | EVP_PKEY_free(key);
|
---|
233 | EVP_PKEY_CTX_free(gctx);
|
---|
234 |
|
---|
235 | An B<EVP_PKEY> EC CDH (Cofactor Diffie-Hellman) key can be generated with a
|
---|
236 | "K-571" named group by calling:
|
---|
237 |
|
---|
238 | int use_cdh = 1;
|
---|
239 | EVP_PKEY *key = NULL;
|
---|
240 | OSSL_PARAM params[3];
|
---|
241 | EVP_PKEY_CTX *gctx =
|
---|
242 | EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL);
|
---|
243 |
|
---|
244 | EVP_PKEY_keygen_init(gctx);
|
---|
245 |
|
---|
246 | params[0] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME,
|
---|
247 | "K-571", 0);
|
---|
248 | /*
|
---|
249 | * This curve has a cofactor that is not 1 - so setting CDH mode changes
|
---|
250 | * the behaviour. For many curves the cofactor is 1 - so setting this has
|
---|
251 | * no effect.
|
---|
252 | */
|
---|
253 | params[1] = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_USE_COFACTOR_ECDH,
|
---|
254 | &use_cdh);
|
---|
255 | params[2] = OSSL_PARAM_construct_end();
|
---|
256 | EVP_PKEY_CTX_set_params(gctx, params);
|
---|
257 |
|
---|
258 | EVP_PKEY_generate(gctx, &key);
|
---|
259 | EVP_PKEY_print_private(bio_out, key, 0, NULL);
|
---|
260 | ...
|
---|
261 | EVP_PKEY_free(key);
|
---|
262 | EVP_PKEY_CTX_free(gctx);
|
---|
263 |
|
---|
264 | =head1 SEE ALSO
|
---|
265 |
|
---|
266 | L<EVP_EC_gen(3)>,
|
---|
267 | L<EVP_KEYMGMT(3)>,
|
---|
268 | L<EVP_PKEY(3)>,
|
---|
269 | L<provider-keymgmt(7)>,
|
---|
270 | L<EVP_SIGNATURE-ECDSA(7)>,
|
---|
271 | L<EVP_KEYEXCH-ECDH(7)>
|
---|
272 |
|
---|
273 | =head1 COPYRIGHT
|
---|
274 |
|
---|
275 | Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
|
---|
276 |
|
---|
277 | Licensed under the Apache License 2.0 (the "License"). You may not use
|
---|
278 | this file except in compliance with the License. You can obtain a copy
|
---|
279 | in the file LICENSE in the source distribution or at
|
---|
280 | L<https://www.openssl.org/source/license.html>.
|
---|
281 |
|
---|
282 | =cut
|
---|