1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* apps/dsaparam.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com). 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL. 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to. The following conditions 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA, 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed. 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used. 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package. 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in the 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * documentation and/or other materials provided with the distribution. 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * must display the following acknowledgement: 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes cryptographic software written by 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Eric Young (eay@cryptsoft.com)" 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The word 'cryptographic' can be left out if the rouines from the library 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * being used are not cryptographic related :-). 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the apps directory (application code) you must include an acknowledgement: 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE. 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed. i.e. this code cannot simply be 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.] 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/opensslconf.h> /* for OPENSSL_NO_DSA */ 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Until the key-gen callbacks are modified to use newer prototypes, we allow 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * deprecated functions for openssl-internal code */ 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_NO_DEPRECATED 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef OPENSSL_NO_DEPRECATED 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DSA 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <assert.h> 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h> 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <time.h> 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h> 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "apps.h" 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bio.h> 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h> 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bn.h> 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/dsa.h> 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509.h> 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/pem.h> 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef PROG 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define PROG dsaparam_main 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* -inform arg - input format - default PEM (DER or PEM) 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -outform arg - output format - default PEM 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -in arg - input file - default stdin 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -out arg - output file - default stdout 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -noout 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -text 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -C 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -noout 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -genkey 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * #ifdef GENCB_TEST 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -timebomb n - interrupt keygen after <n> seconds 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * #endif 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef GENCB_TEST 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int stop_keygen_flag = 0; 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void timebomb_sigalarm(int foo) 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project stop_keygen_flag = 1; 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int MS_CALLBACK dsa_cb(int p, int n, BN_GENCB *cb); 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int, char **); 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int argc, char **argv) 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DSA *dsa=NULL; 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i,badops=0,text=0; 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *in=NULL,*out=NULL; 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int informat,outformat,noout=0,C=0,ret=1; 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *infile,*outfile,*prog,*inrand=NULL; 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int numbits= -1,num,genkey=0; 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int need_rand=0; 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *engine=NULL; 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef GENCB_TEST 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int timebomb=0; 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project apps_startup(); 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bio_err == NULL) 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((bio_err=BIO_new(BIO_s_file())) != NULL) 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!load_config(bio_err, NULL)) 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project infile=NULL; 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outfile=NULL; 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project informat=FORMAT_PEM; 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outformat=FORMAT_PEM; 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project prog=argv[0]; 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argc--; 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argv++; 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (argc >= 1) 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strcmp(*argv,"-inform") == 0) 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project informat=str2fmt(*(++argv)); 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-outform") == 0) 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outformat=str2fmt(*(++argv)); 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-in") == 0) 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project infile= *(++argv); 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-out") == 0) 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outfile= *(++argv); 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if(strcmp(*argv, "-engine") == 0) 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project engine = *(++argv); 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef GENCB_TEST 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if(strcmp(*argv, "-timebomb") == 0) 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project timebomb = atoi(*(++argv)); 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-text") == 0) 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project text=1; 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-C") == 0) 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project C=1; 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-genkey") == 0) 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project genkey=1; 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project need_rand=1; 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-rand") == 0) 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project inrand= *(++argv); 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project need_rand=1; 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-noout") == 0) 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project noout=1; 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (sscanf(*argv,"%d",&num) == 1) 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* generate a key */ 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project numbits=num; 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project need_rand=1; 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"unknown option %s\n",*argv); 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badops=1; 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argc--; 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argv++; 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (badops) 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectbad: 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%s [options] [bits] <infile >outfile\n",prog); 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"where options are\n"); 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -inform arg input format - DER or PEM\n"); 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -outform arg output format - DER or PEM\n"); 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -in arg input file\n"); 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -out arg output file\n"); 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -text print as text\n"); 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -C Output C code\n"); 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -noout no output\n"); 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -genkey generate a DSA key\n"); 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -rand files to use for random number input\n"); 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -engine e use engine e, possibly a hardware device.\n"); 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef GENCB_TEST 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -timebomb n interrupt keygen after <n> seconds\n"); 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," number number of bits to use for generating private key\n"); 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_load_crypto_strings(); 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project in=BIO_new(BIO_s_file()); 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out=BIO_new(BIO_s_file()); 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((in == NULL) || (out == NULL)) 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (infile == NULL) 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_fp(in,stdin,BIO_NOCLOSE); 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (BIO_read_filename(in,infile) <= 0) 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project perror(infile); 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (outfile == NULL) 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_fp(out,stdout,BIO_NOCLOSE); 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *tmpbio = BIO_new(BIO_f_linebuffer()); 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out = BIO_push(tmpbio, out); 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (BIO_write_filename(out,outfile) <= 0) 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project perror(outfile); 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 27843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom setup_engine(bio_err, engine, 0); 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (need_rand) 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project app_RAND_load_file(NULL, bio_err, (inrand != NULL)); 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (inrand != NULL) 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%ld semi-random bytes loaded\n", 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project app_RAND_load_files(inrand)); 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (numbits > 0) 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_GENCB cb; 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BN_GENCB_set(&cb, dsa_cb, bio_err); 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project assert(need_rand); 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dsa = DSA_new(); 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!dsa) 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"Error allocating DSA object\n"); 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"Generating DSA parameters, %d bit long prime\n",num); 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"This could take some time\n"); 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef GENCB_TEST 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(timebomb > 0) 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct sigaction act; 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project act.sa_handler = timebomb_sigalarm; 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project act.sa_flags = 0; 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"(though I'll stop it if not done within %d secs)\n", 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project timebomb); 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(sigaction(SIGALRM, &act, NULL) != 0) 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"Error, couldn't set SIGALRM handler\n"); 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project alarm(timebomb); 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!DSA_generate_parameters_ex(dsa,num,NULL,0,NULL,NULL, &cb)) 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef GENCB_TEST 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(stop_keygen_flag) 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"DSA key generation time-stopped\n"); 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* This is an asked-for behaviour! */ 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 0; 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 32904ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom ERR_print_errors(bio_err); 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"Error, DSA key generation failed\n"); 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (informat == FORMAT_ASN1) 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dsa=d2i_DSAparams_bio(in,NULL); 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (informat == FORMAT_PEM) 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dsa=PEM_read_bio_DSAparams(in,NULL,NULL,NULL); 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"bad input format specified\n"); 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (dsa == NULL) 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"unable to load DSA parameters\n"); 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (text) 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DSAparams_print(out,dsa); 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (C) 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char *data; 35843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom int l,len,bits_p; 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project len=BN_num_bytes(dsa->p); 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bits_p=BN_num_bits(dsa->p); 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project data=(unsigned char *)OPENSSL_malloc(len+20); 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (data == NULL) 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project perror("OPENSSL_malloc"); 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project l=BN_bn2bin(dsa->p,data); 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("static unsigned char dsa%d_p[]={",bits_p); 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<l; i++) 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((i%12) == 0) printf("\n\t"); 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("0x%02X,",data[i]); 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\n\t};\n"); 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project l=BN_bn2bin(dsa->q,data); 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("static unsigned char dsa%d_q[]={",bits_p); 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<l; i++) 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((i%12) == 0) printf("\n\t"); 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("0x%02X,",data[i]); 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\n\t};\n"); 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project l=BN_bn2bin(dsa->g,data); 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("static unsigned char dsa%d_g[]={",bits_p); 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<l; i++) 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((i%12) == 0) printf("\n\t"); 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("0x%02X,",data[i]); 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\n\t};\n\n"); 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("DSA *get_dsa%d()\n\t{\n",bits_p); 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\tDSA *dsa;\n\n"); 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\tif ((dsa=DSA_new()) == NULL) return(NULL);\n"); 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\tdsa->p=BN_bin2bn(dsa%d_p,sizeof(dsa%d_p),NULL);\n", 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bits_p,bits_p); 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\tdsa->q=BN_bin2bn(dsa%d_q,sizeof(dsa%d_q),NULL);\n", 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bits_p,bits_p); 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\tdsa->g=BN_bin2bn(dsa%d_g,sizeof(dsa%d_g),NULL);\n", 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bits_p,bits_p); 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\tif ((dsa->p == NULL) || (dsa->q == NULL) || (dsa->g == NULL))\n"); 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\t\t{ DSA_free(dsa); return(NULL); }\n"); 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\treturn(dsa);\n\t}\n"); 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!noout) 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (outformat == FORMAT_ASN1) 413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=i2d_DSAparams_bio(out,dsa); 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (outformat == FORMAT_PEM) 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=PEM_write_bio_DSAparams(out,dsa); 416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"bad output format specified for outfile\n"); 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!i) 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"unable to write DSA parameters\n"); 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (genkey) 428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DSA *dsakey; 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project assert(need_rand); 432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((dsakey=DSAparams_dup(dsa)) == NULL) goto end; 43304ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom if (!DSA_generate_key(dsakey)) 43404ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom { 43504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom ERR_print_errors(bio_err); 43604ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom DSA_free(dsakey); 43704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom goto end; 43804ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom } 439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (outformat == FORMAT_ASN1) 440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=i2d_DSAPrivateKey_bio(out,dsakey); 441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (outformat == FORMAT_PEM) 442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=PEM_write_bio_DSAPrivateKey(out,dsakey,NULL,NULL,0,NULL,NULL); 443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { 444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"bad output format specified for outfile\n"); 44504ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom DSA_free(dsakey); 446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DSA_free(dsakey); 449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (need_rand) 451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project app_RAND_write_file(NULL, bio_err); 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=0; 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend: 454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (in != NULL) BIO_free(in); 455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (out != NULL) BIO_free_all(out); 456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (dsa != NULL) DSA_free(dsa); 457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project apps_shutdown(); 458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_EXIT(ret); 459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int MS_CALLBACK dsa_cb(int p, int n, BN_GENCB *cb) 462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char c='*'; 464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (p == 0) c='.'; 466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (p == 1) c='+'; 467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (p == 2) c='*'; 468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (p == 3) c='\n'; 469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_write(cb->arg,&c,1); 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (void)BIO_flush(cb->arg); 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef LINT 472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project p=n; 473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef GENCB_TEST 475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(stop_keygen_flag) 476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 48098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom#else /* !OPENSSL_NO_DSA */ 48198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 48298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom# if PEDANTIC 48398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstromstatic void *dummy=&dummy; 48498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom# endif 48598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 487