OpenSSL  1.0.1c
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros
pkeyparam.c
Go to the documentation of this file.
1 /* apps/pkeyparam.c */
2 /* Written by Dr Stephen N Henson ([email protected]) 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
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  * ([email protected]). This product includes software written by Tim
55  * Hudson ([email protected]).
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  char *engine=NULL;
78 #endif
79  int ret = 1;
80 
81  if (bio_err == NULL)
82  bio_err = BIO_new_fp (stderr, BIO_NOCLOSE);
83 
84  if (!load_config(bio_err, NULL))
85  goto end;
86 
89  args = argv + 1;
90  while (!badarg && *args && *args[0] == '-')
91  {
92  if (!strcmp (*args, "-in"))
93  {
94  if (args[1])
95  {
96  args++;
97  infile = *args;
98  }
99  else badarg = 1;
100  }
101  else if (!strcmp (*args, "-out"))
102  {
103  if (args[1])
104  {
105  args++;
106  outfile = *args;
107  }
108  else badarg = 1;
109  }
110 #ifndef OPENSSL_NO_ENGINE
111  else if (strcmp(*args,"-engine") == 0)
112  {
113  if (!args[1]) goto bad;
114  engine= *(++args);
115  }
116 #endif
117 
118  else if (strcmp(*args,"-text") == 0)
119  text=1;
120  else if (strcmp(*args,"-noout") == 0)
121  noout=1;
122  args++;
123  }
124 
125  if (badarg)
126  {
127 #ifndef OPENSSL_NO_ENGINE
128  bad:
129 #endif
130  BIO_printf(bio_err, "Usage pkeyparam [options]\n");
131  BIO_printf(bio_err, "where options are\n");
132  BIO_printf(bio_err, "-in file input file\n");
133  BIO_printf(bio_err, "-out file output file\n");
134  BIO_printf(bio_err, "-text print parameters as text\n");
135  BIO_printf(bio_err, "-noout don't output encoded parameters\n");
136 #ifndef OPENSSL_NO_ENGINE
137  BIO_printf(bio_err, "-engine e use engine e, possibly a hardware device.\n");
138 #endif
139  return 1;
140  }
141 
142 #ifndef OPENSSL_NO_ENGINE
143  setup_engine(bio_err, engine, 0);
144 #endif
145 
146  if (infile)
147  {
148  if (!(in = BIO_new_file (infile, "r")))
149  {
151  "Can't open input file %s\n", infile);
152  goto end;
153  }
154  }
155  else
156  in = BIO_new_fp (stdin, BIO_NOCLOSE);
157 
158  if (outfile)
159  {
160  if (!(out = BIO_new_file (outfile, "w")))
161  {
163  "Can't open output file %s\n", outfile);
164  goto end;
165  }
166  }
167  else
168  {
169  out = BIO_new_fp (stdout, BIO_NOCLOSE);
170 #ifdef OPENSSL_SYS_VMS
171  {
172  BIO *tmpbio = BIO_new(BIO_f_linebuffer());
173  out = BIO_push(tmpbio, out);
174  }
175 #endif
176  }
177 
178  pkey = PEM_read_bio_Parameters(in, NULL);
179  if (!pkey)
180  {
181  BIO_printf(bio_err, "Error reading parameters\n");
183  goto end;
184  }
185 
186  if (!noout)
187  PEM_write_bio_Parameters(out,pkey);
188 
189  if (text)
190  EVP_PKEY_print_params(out, pkey, 0, NULL);
191 
192  ret = 0;
193 
194  end:
195  EVP_PKEY_free(pkey);
196  BIO_free_all(out);
197  BIO_free(in);
198 
199  return ret;
200  }