1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* apps/dsa.c */ 2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * All rights reserved. 4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This package is an SSL implementation written 6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * by Eric Young (eay@cryptsoft.com). 7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The implementation was written so as to conform with Netscapes SSL. 8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This library is free for commercial and non-commercial use as long as 10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the following conditions are aheared to. The following conditions 11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * apply to all code found in this distribution, be it the RC4, RSA, 12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * included with this distribution is covered by the same copyright terms 14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Copyright remains Eric Young's, and as such any Copyright notices in 17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the code are not to be removed. 18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * If this package is used in a product, Eric Young should be given attribution 19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * as the author of the parts of the library used. 20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This can be in the form of a textual message at program startup or 21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * in documentation (online or textual) provided with the package. 22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Redistribution and use in source and binary forms, with or without 24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * modification, are permitted provided that the following conditions 25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * are met: 26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 1. Redistributions of source code must retain the copyright 27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * notice, this list of conditions and the following disclaimer. 28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 2. Redistributions in binary form must reproduce the above copyright 29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * notice, this list of conditions and the following disclaimer in the 30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * documentation and/or other materials provided with the distribution. 31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 3. All advertising materials mentioning features or use of this software 32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * must display the following acknowledgement: 33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * "This product includes cryptographic software written by 34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Eric Young (eay@cryptsoft.com)" 35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The word 'cryptographic' can be left out if the rouines from the library 36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * being used are not cryptographic related :-). 37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 4. If you include any Windows specific code (or a derivative thereof) from 38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the apps directory (application code) you must include an acknowledgement: 39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * SUCH DAMAGE. 52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The licence and distribution terms for any publically available version or 54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * derivative of this code cannot be changed. i.e. this code cannot simply be 55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * copied and put under another distribution licence 56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * [including the GNU Public Licence.] 57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */ 58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/opensslconf.h> /* for OPENSSL_NO_DSA */ 60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_DSA 61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdio.h> 62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdlib.h> 63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <string.h> 64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <time.h> 65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "apps.h" 66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/bio.h> 67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/err.h> 68480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include <openssl/dsa.h> 69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/evp.h> 70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/x509.h> 71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/pem.h> 72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/bn.h> 73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#undef PROG 75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define PROG dsa_main 76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* -inform arg - input format - default PEM (one of DER, NET or PEM) 78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -outform arg - output format - default PEM 79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -in arg - input file - default stdin 80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -out arg - output file - default stdout 81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -des - encrypt output if PEM format with DES in cbc mode 82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -des3 - encrypt output if PEM format 83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -idea - encrypt output if PEM format 84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -aes128 - encrypt output if PEM format 85c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -aes192 - encrypt output if PEM format 86c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -aes256 - encrypt output if PEM format 87c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -camellia128 - encrypt output if PEM format 88c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -camellia192 - encrypt output if PEM format 89c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -camellia256 - encrypt output if PEM format 90c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -seed - encrypt output if PEM format 91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -text - print a text version 92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -modulus - print the DSA public key 93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */ 94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint MAIN(int, char **); 96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint MAIN(int argc, char **argv) 98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ENGINE *e = NULL; 100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int ret=1; 101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DSA *dsa=NULL; 102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int i,badops=0; 103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org const EVP_CIPHER *enc=NULL; 104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO *in=NULL,*out=NULL; 105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int informat,outformat,text=0,noout=0; 106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int pubin = 0, pubout = 0; 107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char *infile,*outfile,*prog; 108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_ENGINE 109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char *engine; 110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char *passargin = NULL, *passargout = NULL; 112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org char *passin = NULL, *passout = NULL; 113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int modulus=0; 114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 115480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org int pvk_encr = 2; 116480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org apps_startup(); 118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (bio_err == NULL) 120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((bio_err=BIO_new(BIO_s_file())) != NULL) 121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); 122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!load_config(bio_err, NULL)) 124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto end; 125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 126c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_ENGINE 127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org engine=NULL; 128c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 129c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org infile=NULL; 130c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org outfile=NULL; 131c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org informat=FORMAT_PEM; 132c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org outformat=FORMAT_PEM; 133c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 134c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org prog=argv[0]; 135c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org argc--; 136c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org argv++; 137c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org while (argc >= 1) 138c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 139c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (strcmp(*argv,"-inform") == 0) 140c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 141c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (--argc < 1) goto bad; 142c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org informat=str2fmt(*(++argv)); 143c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 144c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (strcmp(*argv,"-outform") == 0) 145c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 146c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (--argc < 1) goto bad; 147c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org outformat=str2fmt(*(++argv)); 148c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 149c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (strcmp(*argv,"-in") == 0) 150c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 151c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (--argc < 1) goto bad; 152c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org infile= *(++argv); 153c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 154c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (strcmp(*argv,"-out") == 0) 155c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 156c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (--argc < 1) goto bad; 157c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org outfile= *(++argv); 158c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 159c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (strcmp(*argv,"-passin") == 0) 160c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 161c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (--argc < 1) goto bad; 162c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org passargin= *(++argv); 163c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 164c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (strcmp(*argv,"-passout") == 0) 165c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 166c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (--argc < 1) goto bad; 167c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org passargout= *(++argv); 168c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 169c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_ENGINE 170c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (strcmp(*argv,"-engine") == 0) 171c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 172c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (--argc < 1) goto bad; 173c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org engine= *(++argv); 174c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 175c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 176480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org else if (strcmp(*argv,"-pvk-strong") == 0) 177480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org pvk_encr=2; 178480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org else if (strcmp(*argv,"-pvk-weak") == 0) 179480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org pvk_encr=1; 180480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org else if (strcmp(*argv,"-pvk-none") == 0) 181480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org pvk_encr=0; 182c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (strcmp(*argv,"-noout") == 0) 183c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org noout=1; 184c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (strcmp(*argv,"-text") == 0) 185c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org text=1; 186c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (strcmp(*argv,"-modulus") == 0) 187c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org modulus=1; 188c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (strcmp(*argv,"-pubin") == 0) 189c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org pubin=1; 190c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (strcmp(*argv,"-pubout") == 0) 191c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org pubout=1; 192c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if ((enc=EVP_get_cipherbyname(&(argv[0][1]))) == NULL) 193c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 194c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err,"unknown option %s\n",*argv); 195c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org badops=1; 196c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 197c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 198c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org argc--; 199c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org argv++; 200c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 201c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 202c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (badops) 203c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 204c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgbad: 205c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err,"%s [options] <infile >outfile\n",prog); 206c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err,"where options are\n"); 207c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -inform arg input format - DER or PEM\n"); 208c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -outform arg output format - DER or PEM\n"); 209c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -in arg input file\n"); 210c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -passin arg input file pass phrase source\n"); 211c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -out arg output file\n"); 212c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -passout arg output file pass phrase source\n"); 213c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_ENGINE 214c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -engine e use engine e, possibly a hardware device.\n"); 215c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 216c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -des encrypt PEM output with cbc des\n"); 217c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -des3 encrypt PEM output with ede cbc des using 168 bit key\n"); 218c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_IDEA 219c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -idea encrypt PEM output with cbc idea\n"); 220c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 221c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_AES 222c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -aes128, -aes192, -aes256\n"); 223c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," encrypt PEM output with cbc aes\n"); 224c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 225c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_CAMELLIA 226c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -camellia128, -camellia192, -camellia256\n"); 227c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," encrypt PEM output with cbc camellia\n"); 228c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 229c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_SEED 230c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -seed encrypt PEM output with cbc seed\n"); 231c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 232c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -text print the key in text\n"); 233c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -noout don't print key out\n"); 234c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err," -modulus print the DSA public value\n"); 235c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto end; 236c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 237c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 238c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_load_crypto_strings(); 239c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 240c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_ENGINE 241c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org e = setup_engine(bio_err, engine, 0); 242c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 243c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 244c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(!app_passwd(bio_err, passargin, passargout, &passin, &passout)) { 245c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err, "Error getting passwords\n"); 246c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto end; 247c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 248c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 249480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org in=BIO_new(BIO_s_file()); 250c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org out=BIO_new(BIO_s_file()); 251480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if ((in == NULL) || (out == NULL)) 252c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 253c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_print_errors(bio_err); 254c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto end; 255c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 256c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 257480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (infile == NULL) 258480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org BIO_set_fp(in,stdin,BIO_NOCLOSE); 259480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org else 260480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 261480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (BIO_read_filename(in,infile) <= 0) 262480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 263480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org perror(infile); 264480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org goto end; 265480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 266480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 267480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 268c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err,"read DSA key\n"); 269480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 270480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 271c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org EVP_PKEY *pkey; 272480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 273c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (pubin) 274c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org pkey = load_pubkey(bio_err, infile, informat, 1, 275c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org passin, e, "Public Key"); 276c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 277c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org pkey = load_key(bio_err, infile, informat, 1, 278c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org passin, e, "Private Key"); 279c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 280480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (pkey) 281480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 282480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org dsa = EVP_PKEY_get1_DSA(pkey); 283480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org EVP_PKEY_free(pkey); 284480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 285480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 286c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (dsa == NULL) 287c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 288c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err,"unable to load Key\n"); 289c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_print_errors(bio_err); 290c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto end; 291c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 292c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 293c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (outfile == NULL) 294c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 295c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_set_fp(out,stdout,BIO_NOCLOSE); 296c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef OPENSSL_SYS_VMS 297c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 298c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO *tmpbio = BIO_new(BIO_f_linebuffer()); 299c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org out = BIO_push(tmpbio, out); 300c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 301c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 302c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 303c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 304c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 305c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (BIO_write_filename(out,outfile) <= 0) 306c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 307c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org perror(outfile); 308c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto end; 309c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 310c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 311c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 312c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (text) 313c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!DSA_print(out,dsa,0)) 314c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 315c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org perror(outfile); 316c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_print_errors(bio_err); 317c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto end; 318c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 319c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 320c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (modulus) 321c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 322c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org fprintf(stdout,"Public Key="); 323c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BN_print(out,dsa->pub_key); 324c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org fprintf(stdout,"\n"); 325c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 326c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 327c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (noout) goto end; 328c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err,"writing DSA key\n"); 329c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (outformat == FORMAT_ASN1) { 330c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(pubin || pubout) i=i2d_DSA_PUBKEY_bio(out,dsa); 331c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else i=i2d_DSAPrivateKey_bio(out,dsa); 332c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } else if (outformat == FORMAT_PEM) { 333c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(pubin || pubout) 334c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org i=PEM_write_bio_DSA_PUBKEY(out,dsa); 335c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else i=PEM_write_bio_DSAPrivateKey(out,dsa,enc, 336c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org NULL,0,NULL, passout); 337480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_RC4) 338480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } else if (outformat == FORMAT_MSBLOB || outformat == FORMAT_PVK) { 339480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org EVP_PKEY *pk; 340480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org pk = EVP_PKEY_new(); 341480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org EVP_PKEY_set1_DSA(pk, dsa); 342480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (outformat == FORMAT_PVK) 343480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org i = i2b_PVK_bio(out, pk, pvk_encr, 0, passout); 344480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org else if (pubin || pubout) 345480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org i = i2b_PublicKey_bio(out, pk); 346480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org else 347480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org i = i2b_PrivateKey_bio(out, pk); 348480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org EVP_PKEY_free(pk); 349480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#endif 350c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } else { 351c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err,"bad output format specified for outfile\n"); 352c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto end; 353c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 354480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (i <= 0) 355c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 356c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org BIO_printf(bio_err,"unable to write private key\n"); 357c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ERR_print_errors(bio_err); 358c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 359c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 360c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=0; 361c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgend: 362c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(in != NULL) BIO_free(in); 363c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(out != NULL) BIO_free_all(out); 364c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(dsa != NULL) DSA_free(dsa); 365c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(passin) OPENSSL_free(passin); 366c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(passout) OPENSSL_free(passout); 367c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org apps_shutdown(); 368c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org OPENSSL_EXIT(ret); 369c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 370480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#else /* !OPENSSL_NO_DSA */ 371480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 372480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org# if PEDANTIC 373480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgstatic void *dummy=&dummy; 374480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org# endif 375480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 376c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 377