genpkey.c (256281) | genpkey.c (280304) |
---|---|
1/* apps/genpkey.c */ | 1/* apps/genpkey.c */ |
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 3 * project 2006 | 2/* 3 * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project 4 * 2006 |
4 */ 5/* ==================================================================== 6 * Copyright (c) 2006 The OpenSSL Project. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright | 5 */ 6/* ==================================================================== 7 * Copyright (c) 2006 The OpenSSL Project. All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 13 * 1. Redistributions of source code must retain the above copyright |
13 * notice, this list of conditions and the following disclaimer. | 14 * notice, this list of conditions and the following disclaimer. |
14 * 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in 17 * the documentation and/or other materials provided with the 18 * distribution. 19 * 20 * 3. All advertising materials mentioning features or use of this 21 * software must display the following acknowledgment: --- 35 unchanged lines hidden (view full) --- 57 */ 58#include <stdio.h> 59#include <string.h> 60#include "apps.h" 61#include <openssl/pem.h> 62#include <openssl/err.h> 63#include <openssl/evp.h> 64#ifndef OPENSSL_NO_ENGINE | 15 * 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in 18 * the documentation and/or other materials provided with the 19 * distribution. 20 * 21 * 3. All advertising materials mentioning features or use of this 22 * software must display the following acknowledgment: --- 35 unchanged lines hidden (view full) --- 58 */ 59#include <stdio.h> 60#include <string.h> 61#include "apps.h" 62#include <openssl/pem.h> 63#include <openssl/err.h> 64#include <openssl/evp.h> 65#ifndef OPENSSL_NO_ENGINE |
65#include | 66# include <openssl/engine.h> |
66#endif 67 68static int init_keygen_file(BIO *err, EVP_PKEY_CTX **pctx, | 67#endif 68 69static int init_keygen_file(BIO *err, EVP_PKEY_CTX **pctx, |
69 const char *file, ENGINE *e); | 70 const char *file, ENGINE *e); |
70static int genpkey_cb(EVP_PKEY_CTX *ctx); 71 72#define PROG genpkey_main 73 74int MAIN(int, char **); 75 76int MAIN(int argc, char **argv) | 71static int genpkey_cb(EVP_PKEY_CTX *ctx); 72 73#define PROG genpkey_main 74 75int MAIN(int, char **); 76 77int MAIN(int argc, char **argv) |
77 { 78 ENGINE *e = NULL; 79 char **args, *outfile = NULL; 80 char *passarg = NULL; 81 BIO *in = NULL, *out = NULL; 82 const EVP_CIPHER *cipher = NULL; 83 int outformat; 84 int text = 0; 85 EVP_PKEY *pkey=NULL; 86 EVP_PKEY_CTX *ctx = NULL; 87 char *pass = NULL; 88 int badarg = 0; 89 int ret = 1, rv; | 78{ 79 ENGINE *e = NULL; 80 char **args, *outfile = NULL; 81 char *passarg = NULL; 82 BIO *in = NULL, *out = NULL; 83 const EVP_CIPHER *cipher = NULL; 84 int outformat; 85 int text = 0; 86 EVP_PKEY *pkey = NULL; 87 EVP_PKEY_CTX *ctx = NULL; 88 char *pass = NULL; 89 int badarg = 0; 90 int ret = 1, rv; |
90 | 91 |
91 int do_param = 0; | 92 int do_param = 0; |
92 | 93 |
93 if (bio_err == NULL) 94 bio_err = BIO_new_fp (stderr, BIO_NOCLOSE); | 94 if (bio_err == NULL) 95 bio_err = BIO_new_fp(stderr, BIO_NOCLOSE); |
95 | 96 |
96 if (!load_config(bio_err, NULL)) 97 goto end; | 97 if (!load_config(bio_err, NULL)) 98 goto end; |
98 | 99 |
99 outformat=FORMAT_PEM; | 100 outformat = FORMAT_PEM; |
100 | 101 |
101 ERR_load_crypto_strings(); 102 OpenSSL_add_all_algorithms(); 103 args = argv + 1; 104 while (!badarg && *args && *args[0] == '-') 105 { 106 if (!strcmp(*args,"-outform")) 107 { 108 if (args[1]) 109 { 110 args++; 111 outformat=str2fmt(*args); 112 } 113 else badarg = 1; 114 } 115 else if (!strcmp(*args,"-pass")) 116 { 117 if (!args[1]) goto bad; 118 passarg= *(++args); 119 } | 102 ERR_load_crypto_strings(); 103 OpenSSL_add_all_algorithms(); 104 args = argv + 1; 105 while (!badarg && *args && *args[0] == '-') { 106 if (!strcmp(*args, "-outform")) { 107 if (args[1]) { 108 args++; 109 outformat = str2fmt(*args); 110 } else 111 badarg = 1; 112 } else if (!strcmp(*args, "-pass")) { 113 if (!args[1]) 114 goto bad; 115 passarg = *(++args); 116 } |
120#ifndef OPENSSL_NO_ENGINE | 117#ifndef OPENSSL_NO_ENGINE |
121 else if (strcmp(*args,"-engine") == 0) 122 { 123 if (!args[1]) 124 goto bad; 125 e = setup_engine(bio_err, *(++args), 0); 126 } | 118 else if (strcmp(*args, "-engine") == 0) { 119 if (!args[1]) 120 goto bad; 121 e = setup_engine(bio_err, *(++args), 0); 122 } |
127#endif | 123#endif |
128 else if (!strcmp (*args, "-paramfile")) 129 { 130 if (!args[1]) 131 goto bad; 132 args++; 133 if (do_param == 1) 134 goto bad; 135 if (!init_keygen_file(bio_err, &ctx, *args, e)) 136 goto end; 137 } 138 else if (!strcmp (*args, "-out")) 139 { 140 if (args[1]) 141 { 142 args++; 143 outfile = *args; 144 } 145 else badarg = 1; 146 } 147 else if (strcmp(*args,"-algorithm") == 0) 148 { 149 if (!args[1]) 150 goto bad; 151 if (!init_gen_str(bio_err, &ctx, *(++args),e, do_param)) 152 goto end; 153 } 154 else if (strcmp(*args,"-pkeyopt") == 0) 155 { 156 if (!args[1]) 157 goto bad; 158 if (!ctx) 159 { 160 BIO_puts(bio_err, "No keytype specified\n"); 161 goto bad; 162 } 163 else if (pkey_ctrl_string(ctx, *(++args)) <= 0) 164 { 165 BIO_puts(bio_err, "parameter setting error\n"); 166 ERR_print_errors(bio_err); 167 goto end; 168 } 169 } 170 else if (strcmp(*args,"-genparam") == 0) 171 { 172 if (ctx) 173 goto bad; 174 do_param = 1; 175 } 176 else if (strcmp(*args,"-text") == 0) 177 text=1; 178 else 179 { 180 cipher = EVP_get_cipherbyname(*args + 1); 181 if (!cipher) 182 { 183 BIO_printf(bio_err, "Unknown cipher %s\n", 184 *args + 1); 185 badarg = 1; 186 } 187 if (do_param == 1) 188 badarg = 1; 189 } 190 args++; 191 } | 124 else if (!strcmp(*args, "-paramfile")) { 125 if (!args[1]) 126 goto bad; 127 args++; 128 if (do_param == 1) 129 goto bad; 130 if (!init_keygen_file(bio_err, &ctx, *args, e)) 131 goto end; 132 } else if (!strcmp(*args, "-out")) { 133 if (args[1]) { 134 args++; 135 outfile = *args; 136 } else 137 badarg = 1; 138 } else if (strcmp(*args, "-algorithm") == 0) { 139 if (!args[1]) 140 goto bad; 141 if (!init_gen_str(bio_err, &ctx, *(++args), e, do_param)) 142 goto end; 143 } else if (strcmp(*args, "-pkeyopt") == 0) { 144 if (!args[1]) 145 goto bad; 146 if (!ctx) { 147 BIO_puts(bio_err, "No keytype specified\n"); 148 goto bad; 149 } else if (pkey_ctrl_string(ctx, *(++args)) <= 0) { 150 BIO_puts(bio_err, "parameter setting error\n"); 151 ERR_print_errors(bio_err); 152 goto end; 153 } 154 } else if (strcmp(*args, "-genparam") == 0) { 155 if (ctx) 156 goto bad; 157 do_param = 1; 158 } else if (strcmp(*args, "-text") == 0) 159 text = 1; 160 else { 161 cipher = EVP_get_cipherbyname(*args + 1); 162 if (!cipher) { 163 BIO_printf(bio_err, "Unknown cipher %s\n", *args + 1); 164 badarg = 1; 165 } 166 if (do_param == 1) 167 badarg = 1; 168 } 169 args++; 170 } |
192 | 171 |
193 if (!ctx) 194 badarg = 1; | 172 if (!ctx) 173 badarg = 1; |
195 | 174 |
196 if (badarg) 197 { 198 bad: 199 BIO_printf(bio_err, "Usage: genpkey [options]\n"); 200 BIO_printf(bio_err, "where options may be\n"); 201 BIO_printf(bio_err, "-out file output file\n"); 202 BIO_printf(bio_err, "-outform X output format (DER or PEM)\n"); 203 BIO_printf(bio_err, "-pass arg output file pass phrase source\n"); 204 BIO_printf(bio_err, "-<cipher> use cipher <cipher> to encrypt the key\n"); | 175 if (badarg) { 176 bad: 177 BIO_printf(bio_err, "Usage: genpkey [options]\n"); 178 BIO_printf(bio_err, "where options may be\n"); 179 BIO_printf(bio_err, "-out file output file\n"); 180 BIO_printf(bio_err, 181 "-outform X output format (DER or PEM)\n"); 182 BIO_printf(bio_err, 183 "-pass arg output file pass phrase source\n"); 184 BIO_printf(bio_err, 185 "-<cipher> use cipher <cipher> to encrypt the key\n"); |
205#ifndef OPENSSL_NO_ENGINE | 186#ifndef OPENSSL_NO_ENGINE |
206 BIO_printf(bio_err, "-engine e use engine e, possibly a hardware device.\n"); | 187 BIO_printf(bio_err, 188 "-engine e use engine e, possibly a hardware device.\n"); |
207#endif | 189#endif |
208 BIO_printf(bio_err, "-paramfile file parameters file\n"); 209 BIO_printf(bio_err, "-algorithm alg the public key algorithm\n"); 210 BIO_printf(bio_err, "-pkeyopt opt:value set the public key algorithm option <opt>\n" 211 " to value <value>\n"); 212 BIO_printf(bio_err, "-genparam generate parameters, not key\n"); 213 BIO_printf(bio_err, "-text print the in text\n"); 214 BIO_printf(bio_err, "NB: options order may be important! See the manual page.\n"); 215 goto end; 216 } | 190 BIO_printf(bio_err, "-paramfile file parameters file\n"); 191 BIO_printf(bio_err, "-algorithm alg the public key algorithm\n"); 192 BIO_printf(bio_err, 193 "-pkeyopt opt:value set the public key algorithm option <opt>\n" 194 " to value <value>\n"); 195 BIO_printf(bio_err, 196 "-genparam generate parameters, not key\n"); 197 BIO_printf(bio_err, "-text print the in text\n"); 198 BIO_printf(bio_err, 199 "NB: options order may be important! See the manual page.\n"); 200 goto end; 201 } |
217 | 202 |
218 if (!app_passwd(bio_err, passarg, NULL, &pass, NULL)) 219 { 220 BIO_puts(bio_err, "Error getting password\n"); 221 goto end; 222 } | 203 if (!app_passwd(bio_err, passarg, NULL, &pass, NULL)) { 204 BIO_puts(bio_err, "Error getting password\n"); 205 goto end; 206 } |
223 | 207 |
224 if (outfile) 225 { 226 if (!(out = BIO_new_file (outfile, "wb"))) 227 { 228 BIO_printf(bio_err, 229 "Can't open output file %s\n", outfile); 230 goto end; 231 } 232 } 233 else 234 { 235 out = BIO_new_fp (stdout, BIO_NOCLOSE); | 208 if (outfile) { 209 if (!(out = BIO_new_file(outfile, "wb"))) { 210 BIO_printf(bio_err, "Can't open output file %s\n", outfile); 211 goto end; 212 } 213 } else { 214 out = BIO_new_fp(stdout, BIO_NOCLOSE); |
236#ifdef OPENSSL_SYS_VMS | 215#ifdef OPENSSL_SYS_VMS |
237 { 238 BIO *tmpbio = BIO_new(BIO_f_linebuffer()); 239 out = BIO_push(tmpbio, out); 240 } | 216 { 217 BIO *tmpbio = BIO_new(BIO_f_linebuffer()); 218 out = BIO_push(tmpbio, out); 219 } |
241#endif | 220#endif |
242 } | 221 } |
243 | 222 |
244 EVP_PKEY_CTX_set_cb(ctx, genpkey_cb); 245 EVP_PKEY_CTX_set_app_data(ctx, bio_err); | 223 EVP_PKEY_CTX_set_cb(ctx, genpkey_cb); 224 EVP_PKEY_CTX_set_app_data(ctx, bio_err); |
246 | 225 |
247 if (do_param) 248 { 249 if (EVP_PKEY_paramgen(ctx, &pkey) <= 0) 250 { 251 BIO_puts(bio_err, "Error generating parameters\n"); 252 ERR_print_errors(bio_err); 253 goto end; 254 } 255 } 256 else 257 { 258 if (EVP_PKEY_keygen(ctx, &pkey) <= 0) 259 { 260 BIO_puts(bio_err, "Error generating key\n"); 261 ERR_print_errors(bio_err); 262 goto end; 263 } 264 } | 226 if (do_param) { 227 if (EVP_PKEY_paramgen(ctx, &pkey) <= 0) { 228 BIO_puts(bio_err, "Error generating parameters\n"); 229 ERR_print_errors(bio_err); 230 goto end; 231 } 232 } else { 233 if (EVP_PKEY_keygen(ctx, &pkey) <= 0) { 234 BIO_puts(bio_err, "Error generating key\n"); 235 ERR_print_errors(bio_err); 236 goto end; 237 } 238 } |
265 | 239 |
266 if (do_param) 267 rv = PEM_write_bio_Parameters(out, pkey); 268 else if (outformat == FORMAT_PEM) 269 rv = PEM_write_bio_PrivateKey(out, pkey, cipher, NULL, 0, 270 NULL, pass); 271 else if (outformat == FORMAT_ASN1) 272 rv = i2d_PrivateKey_bio(out, pkey); 273 else 274 { 275 BIO_printf(bio_err, "Bad format specified for key\n"); 276 goto end; 277 } | 240 if (do_param) 241 rv = PEM_write_bio_Parameters(out, pkey); 242 else if (outformat == FORMAT_PEM) 243 rv = PEM_write_bio_PrivateKey(out, pkey, cipher, NULL, 0, NULL, pass); 244 else if (outformat == FORMAT_ASN1) 245 rv = i2d_PrivateKey_bio(out, pkey); 246 else { 247 BIO_printf(bio_err, "Bad format specified for key\n"); 248 goto end; 249 } |
278 | 250 |
279 if (rv <= 0) 280 { 281 BIO_puts(bio_err, "Error writing key\n"); 282 ERR_print_errors(bio_err); 283 } | 251 if (rv <= 0) { 252 BIO_puts(bio_err, "Error writing key\n"); 253 ERR_print_errors(bio_err); 254 } |
284 | 255 |
285 if (text) 286 { 287 if (do_param) 288 rv = EVP_PKEY_print_params(out, pkey, 0, NULL); 289 else 290 rv = EVP_PKEY_print_private(out, pkey, 0, NULL); | 256 if (text) { 257 if (do_param) 258 rv = EVP_PKEY_print_params(out, pkey, 0, NULL); 259 else 260 rv = EVP_PKEY_print_private(out, pkey, 0, NULL); |
291 | 261 |
292 if (rv <= 0) 293 { 294 BIO_puts(bio_err, "Error printing key\n"); 295 ERR_print_errors(bio_err); 296 } 297 } | 262 if (rv <= 0) { 263 BIO_puts(bio_err, "Error printing key\n"); 264 ERR_print_errors(bio_err); 265 } 266 } |
298 | 267 |
299 ret = 0; | 268 ret = 0; |
300 | 269 |
301 end: 302 if (pkey) 303 EVP_PKEY_free(pkey); 304 if (ctx) 305 EVP_PKEY_CTX_free(ctx); 306 if (out) 307 BIO_free_all(out); 308 BIO_free(in); 309 if (pass) 310 OPENSSL_free(pass); | 270 end: 271 if (pkey) 272 EVP_PKEY_free(pkey); 273 if (ctx) 274 EVP_PKEY_CTX_free(ctx); 275 if (out) 276 BIO_free_all(out); 277 BIO_free(in); 278 if (pass) 279 OPENSSL_free(pass); |
311 | 280 |
312 return ret; 313 } | 281 return ret; 282} |
314 315static int init_keygen_file(BIO *err, EVP_PKEY_CTX **pctx, | 283 284static int init_keygen_file(BIO *err, EVP_PKEY_CTX **pctx, |
316 const char *file, ENGINE *e) 317 { 318 BIO *pbio; 319 EVP_PKEY *pkey = NULL; 320 EVP_PKEY_CTX *ctx = NULL; 321 if (*pctx) 322 { 323 BIO_puts(err, "Parameters already set!\n"); 324 return 0; 325 } | 285 const char *file, ENGINE *e) 286{ 287 BIO *pbio; 288 EVP_PKEY *pkey = NULL; 289 EVP_PKEY_CTX *ctx = NULL; 290 if (*pctx) { 291 BIO_puts(err, "Parameters already set!\n"); 292 return 0; 293 } |
326 | 294 |
327 pbio = BIO_new_file(file, "r"); 328 if (!pbio) 329 { 330 BIO_printf(err, "Can't open parameter file %s\n", file); 331 return 0; 332 } | 295 pbio = BIO_new_file(file, "r"); 296 if (!pbio) { 297 BIO_printf(err, "Can't open parameter file %s\n", file); 298 return 0; 299 } |
333 | 300 |
334 pkey = PEM_read_bio_Parameters(pbio, NULL); 335 BIO_free(pbio); | 301 pkey = PEM_read_bio_Parameters(pbio, NULL); 302 BIO_free(pbio); |
336 | 303 |
337 if (!pkey) 338 { 339 BIO_printf(bio_err, "Error reading parameter file %s\n", file); 340 return 0; 341 } | 304 if (!pkey) { 305 BIO_printf(bio_err, "Error reading parameter file %s\n", file); 306 return 0; 307 } |
342 | 308 |
343 ctx = EVP_PKEY_CTX_new(pkey, e); 344 if (!ctx) 345 goto err; 346 if (EVP_PKEY_keygen_init(ctx) <= 0) 347 goto err; 348 EVP_PKEY_free(pkey); 349 *pctx = ctx; 350 return 1; | 309 ctx = EVP_PKEY_CTX_new(pkey, e); 310 if (!ctx) 311 goto err; 312 if (EVP_PKEY_keygen_init(ctx) <= 0) 313 goto err; 314 EVP_PKEY_free(pkey); 315 *pctx = ctx; 316 return 1; |
351 | 317 |
352 err: 353 BIO_puts(err, "Error initializing context\n"); 354 ERR_print_errors(err); 355 if (ctx) 356 EVP_PKEY_CTX_free(ctx); 357 if (pkey) 358 EVP_PKEY_free(pkey); 359 return 0; | 318 err: 319 BIO_puts(err, "Error initializing context\n"); 320 ERR_print_errors(err); 321 if (ctx) 322 EVP_PKEY_CTX_free(ctx); 323 if (pkey) 324 EVP_PKEY_free(pkey); 325 return 0; |
360 | 326 |
361 } | 327} |
362 363int init_gen_str(BIO *err, EVP_PKEY_CTX **pctx, | 328 329int init_gen_str(BIO *err, EVP_PKEY_CTX **pctx, |
364 const char *algname, ENGINE *e, int do_param) 365 { 366 EVP_PKEY_CTX *ctx = NULL; 367 const EVP_PKEY_ASN1_METHOD *ameth; 368 ENGINE *tmpeng = NULL; 369 int pkey_id; | 330 const char *algname, ENGINE *e, int do_param) 331{ 332 EVP_PKEY_CTX *ctx = NULL; 333 const EVP_PKEY_ASN1_METHOD *ameth; 334 ENGINE *tmpeng = NULL; 335 int pkey_id; |
370 | 336 |
371 if (*pctx) 372 { 373 BIO_puts(err, "Algorithm already set!\n"); 374 return 0; 375 } | 337 if (*pctx) { 338 BIO_puts(err, "Algorithm already set!\n"); 339 return 0; 340 } |
376 | 341 |
377 ameth = EVP_PKEY_asn1_find_str(&tmpeng, algname, -1); | 342 ameth = EVP_PKEY_asn1_find_str(&tmpeng, algname, -1); |
378 379#ifndef OPENSSL_NO_ENGINE | 343 344#ifndef OPENSSL_NO_ENGINE |
380 if (!ameth && e) 381 ameth = ENGINE_get_pkey_asn1_meth_str(e, algname, -1); | 345 if (!ameth && e) 346 ameth = ENGINE_get_pkey_asn1_meth_str(e, algname, -1); |
382#endif 383 | 347#endif 348 |
384 if (!ameth) 385 { 386 BIO_printf(bio_err, "Algorithm %s not found\n", algname); 387 return 0; 388 } | 349 if (!ameth) { 350 BIO_printf(bio_err, "Algorithm %s not found\n", algname); 351 return 0; 352 } |
389 | 353 |
390 ERR_clear_error(); | 354 ERR_clear_error(); |
391 | 355 |
392 EVP_PKEY_asn1_get0_info(&pkey_id, NULL, NULL, NULL, NULL, ameth); | 356 EVP_PKEY_asn1_get0_info(&pkey_id, NULL, NULL, NULL, NULL, ameth); |
393#ifndef OPENSSL_NO_ENGINE | 357#ifndef OPENSSL_NO_ENGINE |
394 if (tmpeng) 395 ENGINE_finish(tmpeng); | 358 if (tmpeng) 359 ENGINE_finish(tmpeng); |
396#endif | 360#endif |
397 ctx = EVP_PKEY_CTX_new_id(pkey_id, e); | 361 ctx = EVP_PKEY_CTX_new_id(pkey_id, e); |
398 | 362 |
399 if (!ctx) 400 goto err; 401 if (do_param) 402 { 403 if (EVP_PKEY_paramgen_init(ctx) <= 0) 404 goto err; 405 } 406 else 407 { 408 if (EVP_PKEY_keygen_init(ctx) <= 0) 409 goto err; 410 } | 363 if (!ctx) 364 goto err; 365 if (do_param) { 366 if (EVP_PKEY_paramgen_init(ctx) <= 0) 367 goto err; 368 } else { 369 if (EVP_PKEY_keygen_init(ctx) <= 0) 370 goto err; 371 } |
411 | 372 |
412 *pctx = ctx; 413 return 1; | 373 *pctx = ctx; 374 return 1; |
414 | 375 |
415 err: 416 BIO_printf(err, "Error initializing %s context\n", algname); 417 ERR_print_errors(err); 418 if (ctx) 419 EVP_PKEY_CTX_free(ctx); 420 return 0; | 376 err: 377 BIO_printf(err, "Error initializing %s context\n", algname); 378 ERR_print_errors(err); 379 if (ctx) 380 EVP_PKEY_CTX_free(ctx); 381 return 0; |
421 | 382 |
422 } | 383} |
423 424static int genpkey_cb(EVP_PKEY_CTX *ctx) | 384 385static int genpkey_cb(EVP_PKEY_CTX *ctx) |
425 { 426 char c='*'; 427 BIO *b = EVP_PKEY_CTX_get_app_data(ctx); 428 int p; 429 p = EVP_PKEY_CTX_get_keygen_info(ctx, 0); 430 if (p == 0) c='.'; 431 if (p == 1) c='+'; 432 if (p == 2) c='*'; 433 if (p == 3) c='\n'; 434 BIO_write(b,&c,1); 435 (void)BIO_flush(b); | 386{ 387 char c = '*'; 388 BIO *b = EVP_PKEY_CTX_get_app_data(ctx); 389 int p; 390 p = EVP_PKEY_CTX_get_keygen_info(ctx, 0); 391 if (p == 0) 392 c = '.'; 393 if (p == 1) 394 c = '+'; 395 if (p == 2) 396 c = '*'; 397 if (p == 3) 398 c = '\n'; 399 BIO_write(b, &c, 1); 400 (void)BIO_flush(b); |
436#ifdef LINT | 401#ifdef LINT |
437 p=n; | 402 p = n; |
438#endif | 403#endif |
439 return 1; 440 } | 404 return 1; 405} |