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