xref: /dragonfly/crypto/libressl/apps/openssl/pkey.c (revision 65cc0652)
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