1 /* apps/pkeyparam.c */ 2 /* Written by Dr Stephen N Henson (steve (at) 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 (at) 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 (at) cryptsoft.com). This product includes software written by Tim 55 * Hudson (tjh (at) cryptsoft.com). 56 * 57 */ 58 #include <stdio.h> 59 #include <string.h> 60 #include "apps.h" 61 #include <openssl/pem.h> 62 #include <openssl/err.h> 63 #include <openssl/evp.h> 64 65 #define PROG pkeyparam_main 66 67 int MAIN(int, char **); 68 69 int MAIN(int argc, char **argv) 70 { 71 char **args, *infile = NULL, *outfile = NULL; 72 BIO *in = NULL, *out = NULL; 73 int text = 0, noout = 0; 74 EVP_PKEY *pkey=NULL; 75 int badarg = 0; 76 #ifndef OPENSSL_NO_ENGINE 77 ENGINE *e = NULL; 78 char *engine=NULL; 79 #endif 80 int ret = 1; 81 82 if (bio_err == NULL) 83 bio_err = BIO_new_fp (stderr, BIO_NOCLOSE); 84 85 if (!load_config(bio_err, NULL)) 86 goto end; 87 88 ERR_load_crypto_strings(); 89 OpenSSL_add_all_algorithms(); 90 args = argv + 1; 91 while (!badarg && *args && *args[0] == '-') 92 { 93 if (!strcmp (*args, "-in")) 94 { 95 if (args[1]) 96 { 97 args++; 98 infile = *args; 99 } 100 else badarg = 1; 101 } 102 else if (!strcmp (*args, "-out")) 103 { 104 if (args[1]) 105 { 106 args++; 107 outfile = *args; 108 } 109 else badarg = 1; 110 } 111 #ifndef OPENSSL_NO_ENGINE 112 else if (strcmp(*args,"-engine") == 0) 113 { 114 if (!args[1]) goto bad; 115 engine= *(++args); 116 } 117 #endif 118 119 else if (strcmp(*args,"-text") == 0) 120 text=1; 121 else if (strcmp(*args,"-noout") == 0) 122 noout=1; 123 args++; 124 } 125 126 if (badarg) 127 { 128 #ifndef OPENSSL_NO_ENGINE 129 bad: 130 #endif 131 BIO_printf(bio_err, "Usage pkeyparam [options]\n"); 132 BIO_printf(bio_err, "where options are\n"); 133 BIO_printf(bio_err, "-in file input file\n"); 134 BIO_printf(bio_err, "-out file output file\n"); 135 BIO_printf(bio_err, "-text print parameters as text\n"); 136 BIO_printf(bio_err, "-noout don't output encoded parameters\n"); 137 #ifndef OPENSSL_NO_ENGINE 138 BIO_printf(bio_err, "-engine e use engine e, possibly a hardware device.\n"); 139 #endif 140 return 1; 141 } 142 143 #ifndef OPENSSL_NO_ENGINE 144 e = setup_engine(bio_err, engine, 0); 145 #endif 146 147 if (infile) 148 { 149 if (!(in = BIO_new_file (infile, "r"))) 150 { 151 BIO_printf(bio_err, 152 "Can't open input file %s\n", infile); 153 goto end; 154 } 155 } 156 else 157 in = BIO_new_fp (stdin, BIO_NOCLOSE); 158 159 if (outfile) 160 { 161 if (!(out = BIO_new_file (outfile, "w"))) 162 { 163 BIO_printf(bio_err, 164 "Can't open output file %s\n", outfile); 165 goto end; 166 } 167 } 168 else 169 { 170 out = BIO_new_fp (stdout, BIO_NOCLOSE); 171 #ifdef OPENSSL_SYS_VMS 172 { 173 BIO *tmpbio = BIO_new(BIO_f_linebuffer()); 174 out = BIO_push(tmpbio, out); 175 } 176 #endif 177 } 178 179 pkey = PEM_read_bio_Parameters(in, NULL); 180 if (!pkey) 181 { 182 BIO_printf(bio_err, "Error reading parameters\n"); 183 ERR_print_errors(bio_err); 184 goto end; 185 } 186 187 if (!noout) 188 PEM_write_bio_Parameters(out,pkey); 189 190 if (text) 191 EVP_PKEY_print_params(out, pkey, 0, NULL); 192 193 ret = 0; 194 195 end: 196 EVP_PKEY_free(pkey); 197 BIO_free_all(out); 198 BIO_free(in); 199 200 return ret; 201 } 202