1 /* $OpenBSD: pkey.c,v 1.7 2015/10/17 07:51:10 semarie Exp $ */ 2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 3 * project 2006 4 */ 5 /* ==================================================================== 6 * Copyright (c) 2006 The OpenSSL Project. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in 17 * the documentation and/or other materials provided with the 18 * distribution. 19 * 20 * 3. All advertising materials mentioning features or use of this 21 * software must display the following acknowledgment: 22 * "This product includes software developed by the OpenSSL Project 23 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 24 * 25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 26 * endorse or promote products derived from this software without 27 * prior written permission. For written permission, please contact 28 * licensing@OpenSSL.org. 29 * 30 * 5. Products derived from this software may not be called "OpenSSL" 31 * nor may "OpenSSL" appear in their names without prior written 32 * permission of the OpenSSL Project. 33 * 34 * 6. Redistributions of any form whatsoever must retain the following 35 * acknowledgment: 36 * "This product includes software developed by the OpenSSL Project 37 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 38 * 39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 42 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50 * OF THE POSSIBILITY OF SUCH DAMAGE. 51 * ==================================================================== 52 * 53 * This product includes cryptographic software written by Eric Young 54 * (eay@cryptsoft.com). This product includes software written by Tim 55 * Hudson (tjh@cryptsoft.com). 56 * 57 */ 58 59 #include <stdio.h> 60 #include <string.h> 61 62 #include "apps.h" 63 64 #include <openssl/err.h> 65 #include <openssl/evp.h> 66 #include <openssl/pem.h> 67 68 int 69 pkey_main(int argc, char **argv) 70 { 71 char **args, *infile = NULL, *outfile = NULL; 72 char *passargin = NULL, *passargout = NULL; 73 BIO *in = NULL, *out = NULL; 74 const EVP_CIPHER *cipher = NULL; 75 int informat, outformat; 76 int pubin = 0, pubout = 0, pubtext = 0, text = 0, noout = 0; 77 EVP_PKEY *pkey = NULL; 78 char *passin = NULL, *passout = NULL; 79 int badarg = 0; 80 int ret = 1; 81 82 if (single_execution) { 83 if (pledge("stdio rpath wpath cpath tty", NULL) == -1) { 84 perror("pledge"); 85 exit(1); 86 } 87 } 88 89 informat = FORMAT_PEM; 90 outformat = FORMAT_PEM; 91 92 args = argv + 1; 93 while (!badarg && *args && *args[0] == '-') { 94 if (!strcmp(*args, "-inform")) { 95 if (args[1]) { 96 args++; 97 informat = str2fmt(*args); 98 } else 99 badarg = 1; 100 } else if (!strcmp(*args, "-outform")) { 101 if (args[1]) { 102 args++; 103 outformat = str2fmt(*args); 104 } else 105 badarg = 1; 106 } else if (!strcmp(*args, "-passin")) { 107 if (!args[1]) 108 goto bad; 109 passargin = *(++args); 110 } else if (!strcmp(*args, "-passout")) { 111 if (!args[1]) 112 goto bad; 113 passargout = *(++args); 114 } 115 else if (!strcmp(*args, "-in")) { 116 if (args[1]) { 117 args++; 118 infile = *args; 119 } else 120 badarg = 1; 121 } else if (!strcmp(*args, "-out")) { 122 if (args[1]) { 123 args++; 124 outfile = *args; 125 } else 126 badarg = 1; 127 } else if (strcmp(*args, "-pubin") == 0) { 128 pubin = 1; 129 pubout = 1; 130 pubtext = 1; 131 } else if (strcmp(*args, "-pubout") == 0) 132 pubout = 1; 133 else if (strcmp(*args, "-text_pub") == 0) { 134 pubtext = 1; 135 text = 1; 136 } else if (strcmp(*args, "-text") == 0) 137 text = 1; 138 else if (strcmp(*args, "-noout") == 0) 139 noout = 1; 140 else { 141 cipher = EVP_get_cipherbyname(*args + 1); 142 if (!cipher) { 143 BIO_printf(bio_err, "Unknown cipher %s\n", 144 *args + 1); 145 badarg = 1; 146 } 147 } 148 args++; 149 } 150 151 if (badarg) { 152 bad: 153 BIO_printf(bio_err, "Usage pkey [options]\n"); 154 BIO_printf(bio_err, "where options are\n"); 155 BIO_printf(bio_err, "-in file input file\n"); 156 BIO_printf(bio_err, "-inform X input format (DER or PEM)\n"); 157 BIO_printf(bio_err, "-passin arg input file pass phrase source\n"); 158 BIO_printf(bio_err, "-outform X output format (DER or PEM)\n"); 159 BIO_printf(bio_err, "-out file output file\n"); 160 BIO_printf(bio_err, "-passout arg output file pass phrase source\n"); 161 return 1; 162 } 163 164 if (!app_passwd(bio_err, passargin, passargout, &passin, &passout)) { 165 BIO_printf(bio_err, "Error getting passwords\n"); 166 goto end; 167 } 168 if (outfile) { 169 if (!(out = BIO_new_file(outfile, "wb"))) { 170 BIO_printf(bio_err, 171 "Can't open output file %s\n", outfile); 172 goto end; 173 } 174 } else { 175 out = BIO_new_fp(stdout, BIO_NOCLOSE); 176 } 177 178 if (pubin) 179 pkey = load_pubkey(bio_err, infile, informat, 1, 180 passin, "Public Key"); 181 else 182 pkey = load_key(bio_err, infile, informat, 1, passin, "key"); 183 if (!pkey) 184 goto end; 185 186 if (!noout) { 187 if (outformat == FORMAT_PEM) { 188 if (pubout) 189 PEM_write_bio_PUBKEY(out, pkey); 190 else 191 PEM_write_bio_PrivateKey(out, pkey, cipher, 192 NULL, 0, NULL, passout); 193 } else if (outformat == FORMAT_ASN1) { 194 if (pubout) 195 i2d_PUBKEY_bio(out, pkey); 196 else 197 i2d_PrivateKey_bio(out, pkey); 198 } else { 199 BIO_printf(bio_err, "Bad format specified for key\n"); 200 goto end; 201 } 202 203 } 204 if (text) { 205 if (pubtext) 206 EVP_PKEY_print_public(out, pkey, 0, NULL); 207 else 208 EVP_PKEY_print_private(out, pkey, 0, NULL); 209 } 210 ret = 0; 211 212 end: 213 EVP_PKEY_free(pkey); 214 BIO_free_all(out); 215 BIO_free(in); 216 free(passin); 217 free(passout); 218 219 return ret; 220 } 221