1221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* apps/genpkey.c */ 2221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 3221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * project 2006 4221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */ 5221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* ==================================================================== 6221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Copyright (c) 2006 The OpenSSL Project. All rights reserved. 7221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 8221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Redistribution and use in source and binary forms, with or without 9221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * modification, are permitted provided that the following conditions 10221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * are met: 11221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 12221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 1. Redistributions of source code must retain the above copyright 13221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * notice, this list of conditions and the following disclaimer. 14221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 15221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 2. Redistributions in binary form must reproduce the above copyright 16221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * notice, this list of conditions and the following disclaimer in 17221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * the documentation and/or other materials provided with the 18221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * distribution. 19221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 20221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 3. All advertising materials mentioning features or use of this 21221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * software must display the following acknowledgment: 22221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * "This product includes software developed by the OpenSSL Project 23221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 24221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 25221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 26221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * endorse or promote products derived from this software without 27221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * prior written permission. For written permission, please contact 28221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * licensing@OpenSSL.org. 29221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 30221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 5. Products derived from this software may not be called "OpenSSL" 31221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * nor may "OpenSSL" appear in their names without prior written 32221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * permission of the OpenSSL Project. 33221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 34221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 6. Redistributions of any form whatsoever must retain the following 35221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * acknowledgment: 36221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * "This product includes software developed by the OpenSSL Project 37221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 38221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 39221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 40221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 42221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 43221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 44221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 45221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 49221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * OF THE POSSIBILITY OF SUCH DAMAGE. 51221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * ==================================================================== 52221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 53221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * This product includes cryptographic software written by Eric Young 54221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * (eay@cryptsoft.com). This product includes software written by Tim 55221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Hudson (tjh@cryptsoft.com). 56221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 57221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */ 58221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <stdio.h> 59221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <string.h> 60221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include "apps.h" 61221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/pem.h> 62221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/err.h> 63221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/evp.h> 64221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE 65221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/engine.h> 66221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 67221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 68221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int init_keygen_file(BIO *err, EVP_PKEY_CTX **pctx, 69221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const char *file, ENGINE *e); 70221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int genpkey_cb(EVP_PKEY_CTX *ctx); 71221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 72221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define PROG genpkey_main 73221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 74221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint MAIN(int, char **); 75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint MAIN(int argc, char **argv) 77221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 78221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ENGINE *e = NULL; 79221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom char **args, *outfile = NULL; 80221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom char *passarg = NULL; 81221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO *in = NULL, *out = NULL; 82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const EVP_CIPHER *cipher = NULL; 83221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int outformat; 84221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int text = 0; 85221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY *pkey=NULL; 86221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_CTX *ctx = NULL; 87221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom char *pass = NULL; 88221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int badarg = 0; 89221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int ret = 1, rv; 90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 91221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int do_param = 0; 92221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 93221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (bio_err == NULL) 94221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom bio_err = BIO_new_fp (stderr, BIO_NOCLOSE); 95221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!load_config(bio_err, NULL)) 97221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 98221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 99221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom outformat=FORMAT_PEM; 100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_load_crypto_strings(); 102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom OpenSSL_add_all_algorithms(); 103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom args = argv + 1; 104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom while (!badarg && *args && *args[0] == '-') 105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!strcmp(*args,"-outform")) 107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (args[1]) 109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom args++; 111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom outformat=str2fmt(*args); 112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else badarg = 1; 114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (!strcmp(*args,"-pass")) 116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 117221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) goto bad; 118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom passarg= *(++args); 119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 120221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE 121221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (strcmp(*args,"-engine") == 0) 122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 124221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto bad; 125221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom e = setup_engine(bio_err, *(++args), 0); 126221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 127221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 128221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (!strcmp (*args, "-paramfile")) 129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 131221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto bad; 132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom args++; 133221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (do_param == 1) 134221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto bad; 135221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!init_keygen_file(bio_err, &ctx, *args, e)) 136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (!strcmp (*args, "-out")) 139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (args[1]) 141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom args++; 143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom outfile = *args; 144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else badarg = 1; 146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (strcmp(*args,"-algorithm") == 0) 148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto bad; 151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!init_gen_str(bio_err, &ctx, *(++args),e, do_param)) 152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (strcmp(*args,"-pkeyopt") == 0) 155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto bad; 158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!ctx) 159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(bio_err, "No keytype specified\n"); 161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto bad; 162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (pkey_ctrl_string(ctx, *(++args)) <= 0) 164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(bio_err, "parameter setting error\n"); 166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_print_errors(bio_err); 167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 168221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (strcmp(*args,"-genparam") == 0) 171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 172221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ctx) 173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto bad; 174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom do_param = 1; 175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (strcmp(*args,"-text") == 0) 177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom text=1; 178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cipher = EVP_get_cipherbyname(*args + 1); 181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!cipher) 182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "Unknown cipher %s\n", 184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *args + 1); 185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom badarg = 1; 186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (do_param == 1) 188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom badarg = 1; 189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom args++; 191221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!ctx) 194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom badarg = 1; 195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (badarg) 197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom bad: 199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "Usage: genpkey [options]\n"); 200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "where options may be\n"); 201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "-out file output file\n"); 202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "-outform X output format (DER or PEM)\n"); 203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "-pass arg output file pass phrase source\n"); 204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "-<cipher> use cipher <cipher> to encrypt the key\n"); 205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE 206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "-engine e use engine e, possibly a hardware device.\n"); 207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "-paramfile file parameters file\n"); 209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "-algorithm alg the public key algorithm\n"); 210221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "-pkeyopt opt:value set the public key algorithm option <opt>\n" 211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom " to value <value>\n"); 212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "-genparam generate parameters, not key\n"); 213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "-text print the in text\n"); 214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "NB: options order may be important! See the manual page.\n"); 215221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!app_passwd(bio_err, passarg, NULL, &pass, NULL)) 219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(bio_err, "Error getting password\n"); 221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (outfile) 225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(out = BIO_new_file (outfile, "wb"))) 227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, 229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom "Can't open output file %s\n", outfile); 230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom out = BIO_new_fp (stdout, BIO_NOCLOSE); 236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef OPENSSL_SYS_VMS 237221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO *tmpbio = BIO_new(BIO_f_linebuffer()); 239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom out = BIO_push(tmpbio, out); 240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 241221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 242221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 243221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 244221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_CTX_set_cb(ctx, genpkey_cb); 245221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_CTX_set_app_data(ctx, bio_err); 246221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 247221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (do_param) 248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (EVP_PKEY_paramgen(ctx, &pkey) <= 0) 250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(bio_err, "Error generating parameters\n"); 252221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_print_errors(bio_err); 253221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 254221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 255221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 256221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 257221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 258221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (EVP_PKEY_keygen(ctx, &pkey) <= 0) 259221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 260221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(bio_err, "Error generating key\n"); 261221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_print_errors(bio_err); 262221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 264221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 265221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 266221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (do_param) 267221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rv = PEM_write_bio_Parameters(out, pkey); 268221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (outformat == FORMAT_PEM) 269221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rv = PEM_write_bio_PrivateKey(out, pkey, cipher, NULL, 0, 270221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom NULL, pass); 271221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (outformat == FORMAT_ASN1) 272221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rv = i2d_PrivateKey_bio(out, pkey); 273221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 274221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 275221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "Bad format specified for key\n"); 276221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 277221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 278221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 279221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (rv <= 0) 280221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 281221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(bio_err, "Error writing key\n"); 282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_print_errors(bio_err); 283221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 284221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 285221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (text) 286221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 287221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (do_param) 288221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rv = EVP_PKEY_print_params(out, pkey, 0, NULL); 289221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 290221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rv = EVP_PKEY_print_private(out, pkey, 0, NULL); 291221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 292221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (rv <= 0) 293221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(bio_err, "Error printing key\n"); 295221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_print_errors(bio_err); 296221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret = 0; 300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 301221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom end: 302221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (pkey) 303221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_free(pkey); 304221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ctx) 305221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_CTX_free(ctx); 306221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (out) 307221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_free_all(out); 308221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_free(in); 309221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (pass) 310221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom OPENSSL_free(pass); 311221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 312221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return ret; 313221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 314221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 315221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int init_keygen_file(BIO *err, EVP_PKEY_CTX **pctx, 316221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const char *file, ENGINE *e) 317221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 318221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO *pbio; 319221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY *pkey = NULL; 320221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_CTX *ctx = NULL; 321221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (*pctx) 322221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 323221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(err, "Parameters already set!\n"); 324221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 325221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 326221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 327221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pbio = BIO_new_file(file, "r"); 328221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!pbio) 329221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 330221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(err, "Can't open parameter file %s\n", file); 331221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 332221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 333221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 334221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pkey = PEM_read_bio_Parameters(pbio, NULL); 335221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_free(pbio); 336221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 337221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!pkey) 338221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 339221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "Error reading parameter file %s\n", file); 340221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 341221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 342221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 343221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ctx = EVP_PKEY_CTX_new(pkey, e); 344221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!ctx) 345221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 346221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (EVP_PKEY_keygen_init(ctx) <= 0) 347221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 348221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_free(pkey); 349221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *pctx = ctx; 350221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 351221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 352221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom err: 353221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(err, "Error initializing context\n"); 354221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_print_errors(err); 355221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ctx) 356221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_CTX_free(ctx); 357221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (pkey) 358221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_free(pkey); 359221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 360221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 361221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 362221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 363221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint init_gen_str(BIO *err, EVP_PKEY_CTX **pctx, 364221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const char *algname, ENGINE *e, int do_param) 365221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 366221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_CTX *ctx = NULL; 367221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const EVP_PKEY_ASN1_METHOD *ameth; 368221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ENGINE *tmpeng = NULL; 369221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int pkey_id; 370221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 371221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (*pctx) 372221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 373221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(err, "Algorithm already set!\n"); 374221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 375221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 376221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 377221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ameth = EVP_PKEY_asn1_find_str(&tmpeng, algname, -1); 378221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 379221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE 380221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!ameth && e) 381221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ameth = ENGINE_get_pkey_asn1_meth_str(e, algname, -1); 382221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 383221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 384221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!ameth) 385221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 386221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "Algorithm %s not found\n", algname); 387221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 388221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 389221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_clear_error(); 391221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 392221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_asn1_get0_info(&pkey_id, NULL, NULL, NULL, NULL, ameth); 393221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE 394221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (tmpeng) 395221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ENGINE_finish(tmpeng); 396221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 397221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ctx = EVP_PKEY_CTX_new_id(pkey_id, e); 398221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 399221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!ctx) 400221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 401221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (do_param) 402221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 403221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (EVP_PKEY_paramgen_init(ctx) <= 0) 404221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 405221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 406221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 407221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 408221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (EVP_PKEY_keygen_init(ctx) <= 0) 409221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 410221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 411221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 412221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *pctx = ctx; 413221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 414221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 415221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom err: 416221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(err, "Error initializing %s context\n", algname); 417221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_print_errors(err); 418221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ctx) 419221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_CTX_free(ctx); 420221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 421221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 422221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 423221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 424221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int genpkey_cb(EVP_PKEY_CTX *ctx) 425221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 426221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom char c='*'; 427221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO *b = EVP_PKEY_CTX_get_app_data(ctx); 428221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int p; 429221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom p = EVP_PKEY_CTX_get_keygen_info(ctx, 0); 430221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (p == 0) c='.'; 431221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (p == 1) c='+'; 432221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (p == 2) c='*'; 433221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (p == 3) c='\n'; 434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_write(b,&c,1); 435221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom (void)BIO_flush(b); 436221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef LINT 437221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom p=n; 438221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 439221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 440221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 441