xref: /openbsd-src/lib/libcrypto/man/EVP_PKEY_keygen.3 (revision f1c41952defc4168d000b336cecabdeb1a7edc96)
1*f1c41952Sschwarze.\" $OpenBSD: EVP_PKEY_keygen.3,v 1.15 2024/12/06 14:27:49 schwarze Exp $
2dc05e4a3Sschwarze.\" full merge up to: OpenSSL 24a535ea Sep 22 13:14:20 2020 +0100
38974101aSjmc.\"
4dc05e4a3Sschwarze.\" This file is a derived work.
5dc05e4a3Sschwarze.\" The changes are covered by the following Copyright and license:
6dc05e4a3Sschwarze.\"
7*f1c41952Sschwarze.\" Copyright (c) 2023, 2024 Ingo Schwarze <schwarze@openbsd.org>
8dc05e4a3Sschwarze.\"
9dc05e4a3Sschwarze.\" Permission to use, copy, modify, and distribute this software for any
10dc05e4a3Sschwarze.\" purpose with or without fee is hereby granted, provided that the above
11dc05e4a3Sschwarze.\" copyright notice and this permission notice appear in all copies.
12dc05e4a3Sschwarze.\"
13dc05e4a3Sschwarze.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
14dc05e4a3Sschwarze.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15dc05e4a3Sschwarze.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
16dc05e4a3Sschwarze.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17dc05e4a3Sschwarze.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18dc05e4a3Sschwarze.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
19dc05e4a3Sschwarze.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20dc05e4a3Sschwarze.\"
21dc05e4a3Sschwarze.\" The original file was written by Dr. Stephen Henson <steve@openssl.org>.
223d0df02fSschwarze.\" Copyright (c) 2006, 2009, 2013, 2015, 2016, 2018 The OpenSSL Project.
233d0df02fSschwarze.\" All rights reserved.
240f34efa9Sschwarze.\"
250f34efa9Sschwarze.\" Redistribution and use in source and binary forms, with or without
260f34efa9Sschwarze.\" modification, are permitted provided that the following conditions
270f34efa9Sschwarze.\" are met:
280f34efa9Sschwarze.\"
290f34efa9Sschwarze.\" 1. Redistributions of source code must retain the above copyright
300f34efa9Sschwarze.\"    notice, this list of conditions and the following disclaimer.
310f34efa9Sschwarze.\"
320f34efa9Sschwarze.\" 2. Redistributions in binary form must reproduce the above copyright
330f34efa9Sschwarze.\"    notice, this list of conditions and the following disclaimer in
340f34efa9Sschwarze.\"    the documentation and/or other materials provided with the
350f34efa9Sschwarze.\"    distribution.
360f34efa9Sschwarze.\"
370f34efa9Sschwarze.\" 3. All advertising materials mentioning features or use of this
380f34efa9Sschwarze.\"    software must display the following acknowledgment:
390f34efa9Sschwarze.\"    "This product includes software developed by the OpenSSL Project
400f34efa9Sschwarze.\"    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
410f34efa9Sschwarze.\"
420f34efa9Sschwarze.\" 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
430f34efa9Sschwarze.\"    endorse or promote products derived from this software without
440f34efa9Sschwarze.\"    prior written permission. For written permission, please contact
450f34efa9Sschwarze.\"    openssl-core@openssl.org.
460f34efa9Sschwarze.\"
470f34efa9Sschwarze.\" 5. Products derived from this software may not be called "OpenSSL"
480f34efa9Sschwarze.\"    nor may "OpenSSL" appear in their names without prior written
490f34efa9Sschwarze.\"    permission of the OpenSSL Project.
500f34efa9Sschwarze.\"
510f34efa9Sschwarze.\" 6. Redistributions of any form whatsoever must retain the following
520f34efa9Sschwarze.\"    acknowledgment:
530f34efa9Sschwarze.\"    "This product includes software developed by the OpenSSL Project
540f34efa9Sschwarze.\"    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
550f34efa9Sschwarze.\"
560f34efa9Sschwarze.\" THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
570f34efa9Sschwarze.\" EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
580f34efa9Sschwarze.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
590f34efa9Sschwarze.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
600f34efa9Sschwarze.\" ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
610f34efa9Sschwarze.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
620f34efa9Sschwarze.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
630f34efa9Sschwarze.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
640f34efa9Sschwarze.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
650f34efa9Sschwarze.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
660f34efa9Sschwarze.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
670f34efa9Sschwarze.\" OF THE POSSIBILITY OF SUCH DAMAGE.
680f34efa9Sschwarze.\"
69*f1c41952Sschwarze.Dd $Mdocdate: December 6 2024 $
70d5c51cd3Sschwarze.Dt EVP_PKEY_KEYGEN 3
71d5c51cd3Sschwarze.Os
72d5c51cd3Sschwarze.Sh NAME
73d5c51cd3Sschwarze.Nm EVP_PKEY_keygen_init ,
74d5c51cd3Sschwarze.Nm EVP_PKEY_keygen ,
75d5c51cd3Sschwarze.Nm EVP_PKEY_paramgen_init ,
76d5c51cd3Sschwarze.Nm EVP_PKEY_paramgen ,
7730dcf770Sschwarze.Nm EVP_PKEY_gen_cb ,
78d5c51cd3Sschwarze.Nm EVP_PKEY_CTX_set_cb ,
79d5c51cd3Sschwarze.Nm EVP_PKEY_CTX_get_cb ,
80dc05e4a3Sschwarze.Nm EVP_PKEY_CTX_set0_keygen_info ,
81d5c51cd3Sschwarze.Nm EVP_PKEY_CTX_get_keygen_info ,
82d5c51cd3Sschwarze.Nm EVP_PKEY_CTX_set_app_data ,
83*f1c41952Sschwarze.Nm EVP_PKEY_CTX_get_app_data ,
84*f1c41952Sschwarze.Nm EVP_PKEY_CTX_set_data ,
85*f1c41952Sschwarze.Nm EVP_PKEY_CTX_get_data
86d5c51cd3Sschwarze.Nd key and parameter generation functions
87d5c51cd3Sschwarze.Sh SYNOPSIS
88d5c51cd3Sschwarze.In openssl/evp.h
89d5c51cd3Sschwarze.Ft int
90d5c51cd3Sschwarze.Fo EVP_PKEY_keygen_init
91d5c51cd3Sschwarze.Fa "EVP_PKEY_CTX *ctx"
92d5c51cd3Sschwarze.Fc
93d5c51cd3Sschwarze.Ft int
94d5c51cd3Sschwarze.Fo EVP_PKEY_keygen
95d5c51cd3Sschwarze.Fa "EVP_PKEY_CTX *ctx"
96d5c51cd3Sschwarze.Fa "EVP_PKEY **ppkey"
97d5c51cd3Sschwarze.Fc
98d5c51cd3Sschwarze.Ft int
99d5c51cd3Sschwarze.Fo EVP_PKEY_paramgen_init
100d5c51cd3Sschwarze.Fa "EVP_PKEY_CTX *ctx"
101d5c51cd3Sschwarze.Fc
102d5c51cd3Sschwarze.Ft int
103d5c51cd3Sschwarze.Fo EVP_PKEY_paramgen
104d5c51cd3Sschwarze.Fa "EVP_PKEY_CTX *ctx"
105d5c51cd3Sschwarze.Fa "EVP_PKEY **ppkey"
106d5c51cd3Sschwarze.Fc
107d5c51cd3Sschwarze.Ft typedef int
108d5c51cd3Sschwarze.Fo EVP_PKEY_gen_cb
109d5c51cd3Sschwarze.Fa "EVP_PKEY_CTX *ctx"
110d5c51cd3Sschwarze.Fc
111d5c51cd3Sschwarze.Ft void
112d5c51cd3Sschwarze.Fo EVP_PKEY_CTX_set_cb
113d5c51cd3Sschwarze.Fa "EVP_PKEY_CTX *ctx"
114d5c51cd3Sschwarze.Fa "EVP_PKEY_gen_cb *cb"
115d5c51cd3Sschwarze.Fc
116d5c51cd3Sschwarze.Ft EVP_PKEY_gen_cb *
117d5c51cd3Sschwarze.Fo EVP_PKEY_CTX_get_cb
118d5c51cd3Sschwarze.Fa "EVP_PKEY_CTX *ctx"
119d5c51cd3Sschwarze.Fc
120dc05e4a3Sschwarze.Ft void
121dc05e4a3Sschwarze.Fo EVP_PKEY_CTX_set0_keygen_info
122dc05e4a3Sschwarze.Fa "EVP_PKEY_CTX *ctx"
123dc05e4a3Sschwarze.Fa "int *dat"
124dc05e4a3Sschwarze.Fa "int datlen"
125dc05e4a3Sschwarze.Fc
126d5c51cd3Sschwarze.Ft int
127d5c51cd3Sschwarze.Fo EVP_PKEY_CTX_get_keygen_info
128d5c51cd3Sschwarze.Fa "EVP_PKEY_CTX *ctx"
129d5c51cd3Sschwarze.Fa "int idx"
130d5c51cd3Sschwarze.Fc
131d5c51cd3Sschwarze.Ft void
132d5c51cd3Sschwarze.Fo EVP_PKEY_CTX_set_app_data
133d5c51cd3Sschwarze.Fa "EVP_PKEY_CTX *ctx"
134*f1c41952Sschwarze.Fa "void *app_data"
135d5c51cd3Sschwarze.Fc
136d5c51cd3Sschwarze.Ft void *
137d5c51cd3Sschwarze.Fo EVP_PKEY_CTX_get_app_data
138d5c51cd3Sschwarze.Fa "EVP_PKEY_CTX *ctx"
139d5c51cd3Sschwarze.Fc
140*f1c41952Sschwarze.Ft void
141*f1c41952Sschwarze.Fo EVP_PKEY_CTX_set_data
142*f1c41952Sschwarze.Fa "EVP_PKEY_CTX *ctx"
143*f1c41952Sschwarze.Fa "void *data"
144*f1c41952Sschwarze.Fc
145*f1c41952Sschwarze.Ft void *
146*f1c41952Sschwarze.Fo EVP_PKEY_CTX_get_data
147*f1c41952Sschwarze.Fa "EVP_PKEY_CTX *ctx"
148*f1c41952Sschwarze.Fc
149d5c51cd3Sschwarze.Sh DESCRIPTION
150d5c51cd3SschwarzeThe
151d5c51cd3Sschwarze.Fn EVP_PKEY_keygen_init
152d5c51cd3Sschwarzefunction initializes a public key algorithm context using key
153d5c51cd3Sschwarze.Fa ctx->pkey
154d5c51cd3Sschwarzefor a key generation operation.
155d5c51cd3Sschwarze.Pp
156d5c51cd3SschwarzeThe
157d5c51cd3Sschwarze.Fn EVP_PKEY_keygen
15884a81591Sjmcfunction performs a key generation operation.
15984a81591SjmcThe generated key is written to
160d5c51cd3Sschwarze.Fa ppkey .
161d5c51cd3Sschwarze.Pp
162d5c51cd3SschwarzeThe functions
163d5c51cd3Sschwarze.Fn EVP_PKEY_paramgen_init
164d5c51cd3Sschwarzeand
165d5c51cd3Sschwarze.Fn EVP_PKEY_paramgen
166d5c51cd3Sschwarzeare similar except parameters are generated.
167d5c51cd3Sschwarze.Pp
168dc05e4a3SschwarzeThe functions
169d5c51cd3Sschwarze.Fn EVP_PKEY_CTX_set_cb
170dc05e4a3Sschwarzeand
171d5c51cd3Sschwarze.Fn EVP_PKEY_CTX_get_cb
172dc05e4a3Sschwarzeset and retrieve the key or parameter generation callback, respectively.
173dc05e4a3Sschwarze.Pp
174dc05e4a3SschwarzeThe function
175dc05e4a3Sschwarze.Fn EVP_PKEY_CTX_set0_keygen_info
176dc05e4a3Sschwarzesets the parameters associated with the generation operation to the array
177dc05e4a3Sschwarze.Fa dat
178dc05e4a3Sschwarzecontaining
179dc05e4a3Sschwarze.Ft datlen
180dc05e4a3Sschwarzeinteger parameters.
181dc05e4a3SschwarzeThe caller retains ownership of the
182dc05e4a3Sschwarze.Fa dat
183dc05e4a3Sschwarzearray; it will never be freed by the library.
184d5c51cd3Sschwarze.Pp
185d5c51cd3SschwarzeThe function
186d5c51cd3Sschwarze.Fn EVP_PKEY_CTX_get_keygen_info
187d5c51cd3Sschwarzereturns parameters associated with the generation operation.
188d5c51cd3SschwarzeIf
189d5c51cd3Sschwarze.Fa idx
190d5c51cd3Sschwarzeis -1, the total number of parameters available is returned.
19184a81591SjmcAny non-negative value returns the value of that parameter.
192d5c51cd3Sschwarze.Fn EVP_PKEY_CTX_get_keygen_info
193d5c51cd3Sschwarzewith a non-negative value for
194d5c51cd3Sschwarze.Fa idx
195d5c51cd3Sschwarzeshould only be called within the generation callback.
196d5c51cd3Sschwarze.Pp
197d5c51cd3SschwarzeIf the callback returns 0, then the key generation operation is aborted
198d5c51cd3Sschwarzeand an error occurs.
199d5c51cd3SschwarzeThis might occur during a time consuming operation where a user clicks
200d5c51cd3Sschwarzeon a "cancel" button.
201d5c51cd3Sschwarze.Pp
202d5c51cd3SschwarzeThe functions
203d5c51cd3Sschwarze.Fn EVP_PKEY_CTX_set_app_data
204d5c51cd3Sschwarzeand
205d5c51cd3Sschwarze.Fn EVP_PKEY_CTX_get_app_data
206d5c51cd3Sschwarzeset and retrieve an opaque pointer.
207d5c51cd3SschwarzeThis can be used to set some application defined value which can be
208d5c51cd3Sschwarzeretrieved in the callback: for example a handle which is used to update
209d5c51cd3Sschwarzea "progress dialog".
210d5c51cd3Sschwarze.Pp
211*f1c41952SschwarzeThe deprecated functions
212*f1c41952Sschwarze.Fn EVP_PKEY_CTX_set_data
213*f1c41952Sschwarzeand
214*f1c41952Sschwarze.Fn EVP_PKEY_CTX_get_data
215*f1c41952Sschwarzeset and retrieve a
216*f1c41952Sschwarze.Em different
217*f1c41952Sschwarzeopaque pointer that is ignored by the library.
218*f1c41952Sschwarze.Pp
219d5c51cd3SschwarzeAfter the call to
220d5c51cd3Sschwarze.Fn EVP_PKEY_keygen_init
221d5c51cd3Sschwarzeor
222d5c51cd3Sschwarze.Fn EVP_PKEY_paramgen_init ,
223d5c51cd3Sschwarzealgorithm specific control operations can be performed to set any
224d5c51cd3Sschwarzeappropriate parameters for the operation.
225d5c51cd3Sschwarze.Pp
226d5c51cd3SschwarzeThe functions
227d5c51cd3Sschwarze.Fn EVP_PKEY_keygen
228d5c51cd3Sschwarzeand
229d5c51cd3Sschwarze.Fn EVP_PKEY_paramgen
230d5c51cd3Sschwarzecan be called more than once on the same context if several operations
231d5c51cd3Sschwarzeare performed using the same parameters.
232d5c51cd3Sschwarze.Pp
233d5c51cd3SschwarzeThe meaning of the parameters passed to the callback will depend on the
234d5c51cd3Sschwarzealgorithm and the specific implementation of the algorithm.
235d5c51cd3SschwarzeSome might not give any useful information at all during key or
236d5c51cd3Sschwarzeparameter generation.
237d5c51cd3SschwarzeOthers might not even call the callback.
238d5c51cd3Sschwarze.Pp
239d5c51cd3SschwarzeThe operation performed by key or parameter generation depends on the
240d5c51cd3Sschwarzealgorithm used.
241d5c51cd3SschwarzeIn some cases (e.g. EC with a supplied named curve) the "generation"
242d5c51cd3Sschwarzeoption merely sets the appropriate fields in an
243d5c51cd3Sschwarze.Vt EVP_PKEY
244d5c51cd3Sschwarzestructure.
245d5c51cd3Sschwarze.Pp
246d5c51cd3SschwarzeIn OpenSSL, an
247d5c51cd3Sschwarze.Vt EVP_PKEY
248d5c51cd3Sschwarzestructure containing a private key also contains the public key
249d5c51cd3Sschwarzecomponents and parameters (if any).
250d5c51cd3SschwarzeAn OpenSSL private key is equivalent to what some libraries call a "key
251d5c51cd3Sschwarzepair".
252d5c51cd3SschwarzeA private key can be used in functions which require the use of a public
253d5c51cd3Sschwarzekey or parameters.
254d5c51cd3Sschwarze.Sh RETURN VALUES
255d5c51cd3Sschwarze.Fn EVP_PKEY_keygen_init ,
256d5c51cd3Sschwarze.Fn EVP_PKEY_paramgen_init ,
257d5c51cd3Sschwarze.Fn EVP_PKEY_keygen ,
258d5c51cd3Sschwarzeand
259d5c51cd3Sschwarze.Fn EVP_PKEY_paramgen
260d5c51cd3Sschwarzereturn 1 for success and 0 or a negative value for failure.
261d5c51cd3SschwarzeIn particular, a return value of -2 indicates the operation is not
262d5c51cd3Sschwarzesupported by the public key algorithm.
263dc05e4a3Sschwarze.Pp
264dc05e4a3SschwarzeCallback functions of the type
265dc05e4a3Sschwarze.Fn EVP_PKEY_gen_cb
266dc05e4a3Sschwarzeare supposed to return 1 on success or 0 on error.
267dc05e4a3Sschwarze.Pp
268dc05e4a3Sschwarze.Fn EVP_PKEY_CTX_get_cb
269dc05e4a3Sschwarzereturns a function pointer to the currently installed callback function or
270dc05e4a3Sschwarze.Dv NULL
271dc05e4a3Sschwarzeif no callback function is installed.
272dc05e4a3Sschwarze.Pp
273dc05e4a3Sschwarze.Fn EVP_PKEY_CTX_get_keygen_info
274ecb554e3Sjsgreturns the number of available parameters if
275dc05e4a3Sschwarze.Fa idx
276dc05e4a3Sschwarzeis \-1, one of these parameters if
277dc05e4a3Sschwarze.Fa idx
278dc05e4a3Sschwarzeis greater than or equal to zero but less than the number
279dc05e4a3Sschwarzeof available parameters, or 0 otherwise.
280*f1c41952Sschwarze.Pp
281*f1c41952Sschwarze.Fn EVP_PKEY_CTX_get_app_data
282*f1c41952Sschwarzeand
283*f1c41952Sschwarze.Fn EVP_PKEY_CTX_get_data
284*f1c41952Sschwarzereturn the pointer that was last passed to the corresponding set function, or
285*f1c41952Sschwarze.Dv NULL
286*f1c41952Sschwarzeif the corresponding set function was never called on
287*f1c41952Sschwarze.Fa ctx .
288d5c51cd3Sschwarze.Sh EXAMPLES
28984a81591SjmcGenerate a 2048-bit RSA key:
29084a81591Sjmc.Bd -literal -offset indent
291d5c51cd3Sschwarze#include <openssl/evp.h>
292d5c51cd3Sschwarze#include <openssl/rsa.h>
293d5c51cd3Sschwarze
294d5c51cd3SschwarzeEVP_PKEY_CTX *ctx;
295d5c51cd3SschwarzeEVP_PKEY *pkey = NULL;
2963d0df02fSschwarze
297d5c51cd3Sschwarzectx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL);
298d5c51cd3Sschwarzeif (!ctx)
299d5c51cd3Sschwarze	/* Error occurred */
300d5c51cd3Sschwarzeif (EVP_PKEY_keygen_init(ctx) <= 0)
301d5c51cd3Sschwarze	/* Error */
302d5c51cd3Sschwarzeif (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048) <= 0)
303d5c51cd3Sschwarze	/* Error */
304d5c51cd3Sschwarze
305d5c51cd3Sschwarze/* Generate key */
306d5c51cd3Sschwarzeif (EVP_PKEY_keygen(ctx, &pkey) <= 0)
307d5c51cd3Sschwarze	/* Error */
308d5c51cd3Sschwarze.Ed
309d5c51cd3Sschwarze.Pp
310d5c51cd3SschwarzeGenerate a key from a set of parameters:
31184a81591Sjmc.Bd -literal -offset indent
312d5c51cd3Sschwarze#include <openssl/evp.h>
313d5c51cd3Sschwarze#include <openssl/rsa.h>
314d5c51cd3Sschwarze
315d5c51cd3SschwarzeEVP_PKEY_CTX *ctx;
316d5c51cd3SschwarzeEVP_PKEY *pkey = NULL, *param;
3173d0df02fSschwarze
318fd819adcStb/* Assumes that param is already set up. */
319fd819adcStbctx = EVP_PKEY_CTX_new(param, NULL);
320d5c51cd3Sschwarzeif (!ctx)
321d5c51cd3Sschwarze	/* Error occurred */
322d5c51cd3Sschwarzeif (EVP_PKEY_keygen_init(ctx) <= 0)
323d5c51cd3Sschwarze	/* Error */
324d5c51cd3Sschwarze
325d5c51cd3Sschwarze/* Generate key */
326d5c51cd3Sschwarzeif (EVP_PKEY_keygen(ctx, &pkey) <= 0)
327d5c51cd3Sschwarze	/* Error */
328d5c51cd3Sschwarze.Ed
329d5c51cd3Sschwarze.Pp
330d5c51cd3SschwarzeExample of generation callback for OpenSSL public key implementations:
33184a81591Sjmc.Bd -literal -offset indent
332d5c51cd3Sschwarze/* Application data is a BIO to output status to */
333d5c51cd3Sschwarze
334d5c51cd3SschwarzeEVP_PKEY_CTX_set_app_data(ctx, status_bio);
335d5c51cd3Sschwarze
336d5c51cd3Sschwarzestatic int
337d5c51cd3Sschwarzegenpkey_cb(EVP_PKEY_CTX *ctx)
338d5c51cd3Sschwarze{
339d5c51cd3Sschwarze	char c = '*';
340d5c51cd3Sschwarze	BIO *b = EVP_PKEY_CTX_get_app_data(ctx);
341d5c51cd3Sschwarze	int p;
342d5c51cd3Sschwarze
343d5c51cd3Sschwarze	p = EVP_PKEY_CTX_get_keygen_info(ctx, 0);
344d5c51cd3Sschwarze	if (p == 0)
345d5c51cd3Sschwarze		c = '.';
346d5c51cd3Sschwarze	if (p == 1)
347d5c51cd3Sschwarze		c = '+';
348d5c51cd3Sschwarze	if (p == 2)
349d5c51cd3Sschwarze		c = '*';
350d5c51cd3Sschwarze	if (p == 3)
351d5c51cd3Sschwarze		c = '\en';
352d5c51cd3Sschwarze	BIO_write(b, &c, 1);
353d5c51cd3Sschwarze	(void)BIO_flush(b);
354d5c51cd3Sschwarze	return 1;
355d5c51cd3Sschwarze}
356d5c51cd3Sschwarze.Ed
357d5c51cd3Sschwarze.Sh SEE ALSO
358d5c51cd3Sschwarze.Xr EVP_PKEY_CTX_new 3 ,
359d5c51cd3Sschwarze.Xr EVP_PKEY_decrypt 3 ,
360d5c51cd3Sschwarze.Xr EVP_PKEY_derive 3 ,
361d5c51cd3Sschwarze.Xr EVP_PKEY_encrypt 3 ,
362d5c51cd3Sschwarze.Xr EVP_PKEY_sign 3 ,
363d5c51cd3Sschwarze.Xr EVP_PKEY_verify 3 ,
364ded909dbSschwarze.Xr EVP_PKEY_verify_recover 3 ,
365ded909dbSschwarze.Xr X25519 3
366d5c51cd3Sschwarze.Sh HISTORY
36756929f71SschwarzeThese functions first appeared in OpenSSL 1.0.0
36856929f71Sschwarzeand have been available since
36956929f71Sschwarze.Ox 4.9 .
370