xref: /freebsd/crypto/openssl/apps/ec.c (revision 6f9291cea8b06d251243fd47a7234018541832a3)
13b4e3dcbSSimon L. B. Nielsen /* apps/ec.c */
23b4e3dcbSSimon L. B. Nielsen /*
33b4e3dcbSSimon L. B. Nielsen  * Written by Nils Larsch for the OpenSSL project.
43b4e3dcbSSimon L. B. Nielsen  */
53b4e3dcbSSimon L. B. Nielsen /* ====================================================================
63b4e3dcbSSimon L. B. Nielsen  * Copyright (c) 1998-2005 The OpenSSL Project.  All rights reserved.
73b4e3dcbSSimon L. B. Nielsen  *
83b4e3dcbSSimon L. B. Nielsen  * Redistribution and use in source and binary forms, with or without
93b4e3dcbSSimon L. B. Nielsen  * modification, are permitted provided that the following conditions
103b4e3dcbSSimon L. B. Nielsen  * are met:
113b4e3dcbSSimon L. B. Nielsen  *
123b4e3dcbSSimon L. B. Nielsen  * 1. Redistributions of source code must retain the above copyright
133b4e3dcbSSimon L. B. Nielsen  *    notice, this list of conditions and the following disclaimer.
143b4e3dcbSSimon L. B. Nielsen  *
153b4e3dcbSSimon L. B. Nielsen  * 2. Redistributions in binary form must reproduce the above copyright
163b4e3dcbSSimon L. B. Nielsen  *    notice, this list of conditions and the following disclaimer in
173b4e3dcbSSimon L. B. Nielsen  *    the documentation and/or other materials provided with the
183b4e3dcbSSimon L. B. Nielsen  *    distribution.
193b4e3dcbSSimon L. B. Nielsen  *
203b4e3dcbSSimon L. B. Nielsen  * 3. All advertising materials mentioning features or use of this
213b4e3dcbSSimon L. B. Nielsen  *    software must display the following acknowledgment:
223b4e3dcbSSimon L. B. Nielsen  *    "This product includes software developed by the OpenSSL Project
233b4e3dcbSSimon L. B. Nielsen  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
243b4e3dcbSSimon L. B. Nielsen  *
253b4e3dcbSSimon L. B. Nielsen  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
263b4e3dcbSSimon L. B. Nielsen  *    endorse or promote products derived from this software without
273b4e3dcbSSimon L. B. Nielsen  *    prior written permission. For written permission, please contact
283b4e3dcbSSimon L. B. Nielsen  *    openssl-core@openssl.org.
293b4e3dcbSSimon L. B. Nielsen  *
303b4e3dcbSSimon L. B. Nielsen  * 5. Products derived from this software may not be called "OpenSSL"
313b4e3dcbSSimon L. B. Nielsen  *    nor may "OpenSSL" appear in their names without prior written
323b4e3dcbSSimon L. B. Nielsen  *    permission of the OpenSSL Project.
333b4e3dcbSSimon L. B. Nielsen  *
343b4e3dcbSSimon L. B. Nielsen  * 6. Redistributions of any form whatsoever must retain the following
353b4e3dcbSSimon L. B. Nielsen  *    acknowledgment:
363b4e3dcbSSimon L. B. Nielsen  *    "This product includes software developed by the OpenSSL Project
373b4e3dcbSSimon L. B. Nielsen  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
383b4e3dcbSSimon L. B. Nielsen  *
393b4e3dcbSSimon L. B. Nielsen  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
403b4e3dcbSSimon L. B. Nielsen  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
413b4e3dcbSSimon L. B. Nielsen  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
423b4e3dcbSSimon L. B. Nielsen  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
433b4e3dcbSSimon L. B. Nielsen  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
443b4e3dcbSSimon L. B. Nielsen  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
453b4e3dcbSSimon L. B. Nielsen  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
463b4e3dcbSSimon L. B. Nielsen  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
473b4e3dcbSSimon L. B. Nielsen  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
483b4e3dcbSSimon L. B. Nielsen  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
493b4e3dcbSSimon L. B. Nielsen  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
503b4e3dcbSSimon L. B. Nielsen  * OF THE POSSIBILITY OF SUCH DAMAGE.
513b4e3dcbSSimon L. B. Nielsen  * ====================================================================
523b4e3dcbSSimon L. B. Nielsen  *
533b4e3dcbSSimon L. B. Nielsen  * This product includes cryptographic software written by Eric Young
543b4e3dcbSSimon L. B. Nielsen  * (eay@cryptsoft.com).  This product includes software written by Tim
553b4e3dcbSSimon L. B. Nielsen  * Hudson (tjh@cryptsoft.com).
563b4e3dcbSSimon L. B. Nielsen  *
573b4e3dcbSSimon L. B. Nielsen  */
583b4e3dcbSSimon L. B. Nielsen 
593b4e3dcbSSimon L. B. Nielsen #include <openssl/opensslconf.h>
603b4e3dcbSSimon L. B. Nielsen #ifndef OPENSSL_NO_EC
613b4e3dcbSSimon L. B. Nielsen # include <stdio.h>
623b4e3dcbSSimon L. B. Nielsen # include <stdlib.h>
633b4e3dcbSSimon L. B. Nielsen # include <string.h>
643b4e3dcbSSimon L. B. Nielsen # include "apps.h"
653b4e3dcbSSimon L. B. Nielsen # include <openssl/bio.h>
663b4e3dcbSSimon L. B. Nielsen # include <openssl/err.h>
673b4e3dcbSSimon L. B. Nielsen # include <openssl/evp.h>
683b4e3dcbSSimon L. B. Nielsen # include <openssl/pem.h>
693b4e3dcbSSimon L. B. Nielsen 
703b4e3dcbSSimon L. B. Nielsen # undef PROG
713b4e3dcbSSimon L. B. Nielsen # define PROG    ec_main
723b4e3dcbSSimon L. B. Nielsen 
73*6f9291ceSJung-uk Kim /*-
74*6f9291ceSJung-uk Kim  * -inform arg    - input format - default PEM (one of DER, NET or PEM)
753b4e3dcbSSimon L. B. Nielsen  * -outform arg   - output format - default PEM
763b4e3dcbSSimon L. B. Nielsen  * -in arg        - input file - default stdin
773b4e3dcbSSimon L. B. Nielsen  * -out arg       - output file - default stdout
783b4e3dcbSSimon L. B. Nielsen  * -des           - encrypt output if PEM format with DES in cbc mode
793b4e3dcbSSimon L. B. Nielsen  * -text          - print a text version
803b4e3dcbSSimon L. B. Nielsen  * -param_out     - print the elliptic curve parameters
813b4e3dcbSSimon L. B. Nielsen  * -conv_form arg - specifies the point encoding form
823b4e3dcbSSimon L. B. Nielsen  * -param_enc arg - specifies the parameter encoding
833b4e3dcbSSimon L. B. Nielsen  */
843b4e3dcbSSimon L. B. Nielsen 
853b4e3dcbSSimon L. B. Nielsen int MAIN(int, char **);
863b4e3dcbSSimon L. B. Nielsen 
873b4e3dcbSSimon L. B. Nielsen int MAIN(int argc, char **argv)
883b4e3dcbSSimon L. B. Nielsen {
893b4e3dcbSSimon L. B. Nielsen     int ret = 1;
903b4e3dcbSSimon L. B. Nielsen     EC_KEY *eckey = NULL;
913b4e3dcbSSimon L. B. Nielsen     const EC_GROUP *group;
923b4e3dcbSSimon L. B. Nielsen     int i, badops = 0;
933b4e3dcbSSimon L. B. Nielsen     const EVP_CIPHER *enc = NULL;
943b4e3dcbSSimon L. B. Nielsen     BIO *in = NULL, *out = NULL;
953b4e3dcbSSimon L. B. Nielsen     int informat, outformat, text = 0, noout = 0;
963b4e3dcbSSimon L. B. Nielsen     int pubin = 0, pubout = 0, param_out = 0;
973b4e3dcbSSimon L. B. Nielsen     char *infile, *outfile, *prog, *engine;
983b4e3dcbSSimon L. B. Nielsen     char *passargin = NULL, *passargout = NULL;
993b4e3dcbSSimon L. B. Nielsen     char *passin = NULL, *passout = NULL;
1003b4e3dcbSSimon L. B. Nielsen     point_conversion_form_t form = POINT_CONVERSION_UNCOMPRESSED;
1013b4e3dcbSSimon L. B. Nielsen     int new_form = 0;
1023b4e3dcbSSimon L. B. Nielsen     int asn1_flag = OPENSSL_EC_NAMED_CURVE;
1033b4e3dcbSSimon L. B. Nielsen     int new_asn1_flag = 0;
1043b4e3dcbSSimon L. B. Nielsen 
1053b4e3dcbSSimon L. B. Nielsen     apps_startup();
1063b4e3dcbSSimon L. B. Nielsen 
1073b4e3dcbSSimon L. B. Nielsen     if (bio_err == NULL)
1083b4e3dcbSSimon L. B. Nielsen         if ((bio_err = BIO_new(BIO_s_file())) != NULL)
1093b4e3dcbSSimon L. B. Nielsen             BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT);
1103b4e3dcbSSimon L. B. Nielsen 
1113b4e3dcbSSimon L. B. Nielsen     if (!load_config(bio_err, NULL))
1123b4e3dcbSSimon L. B. Nielsen         goto end;
1133b4e3dcbSSimon L. B. Nielsen 
1143b4e3dcbSSimon L. B. Nielsen     engine = NULL;
1153b4e3dcbSSimon L. B. Nielsen     infile = NULL;
1163b4e3dcbSSimon L. B. Nielsen     outfile = NULL;
1173b4e3dcbSSimon L. B. Nielsen     informat = FORMAT_PEM;
1183b4e3dcbSSimon L. B. Nielsen     outformat = FORMAT_PEM;
1193b4e3dcbSSimon L. B. Nielsen 
1203b4e3dcbSSimon L. B. Nielsen     prog = argv[0];
1213b4e3dcbSSimon L. B. Nielsen     argc--;
1223b4e3dcbSSimon L. B. Nielsen     argv++;
123*6f9291ceSJung-uk Kim     while (argc >= 1) {
124*6f9291ceSJung-uk Kim         if (strcmp(*argv, "-inform") == 0) {
125*6f9291ceSJung-uk Kim             if (--argc < 1)
126*6f9291ceSJung-uk Kim                 goto bad;
1273b4e3dcbSSimon L. B. Nielsen             informat = str2fmt(*(++argv));
128*6f9291ceSJung-uk Kim         } else if (strcmp(*argv, "-outform") == 0) {
129*6f9291ceSJung-uk Kim             if (--argc < 1)
130*6f9291ceSJung-uk Kim                 goto bad;
1313b4e3dcbSSimon L. B. Nielsen             outformat = str2fmt(*(++argv));
132*6f9291ceSJung-uk Kim         } else if (strcmp(*argv, "-in") == 0) {
133*6f9291ceSJung-uk Kim             if (--argc < 1)
134*6f9291ceSJung-uk Kim                 goto bad;
1353b4e3dcbSSimon L. B. Nielsen             infile = *(++argv);
136*6f9291ceSJung-uk Kim         } else if (strcmp(*argv, "-out") == 0) {
137*6f9291ceSJung-uk Kim             if (--argc < 1)
138*6f9291ceSJung-uk Kim                 goto bad;
1393b4e3dcbSSimon L. B. Nielsen             outfile = *(++argv);
140*6f9291ceSJung-uk Kim         } else if (strcmp(*argv, "-passin") == 0) {
141*6f9291ceSJung-uk Kim             if (--argc < 1)
142*6f9291ceSJung-uk Kim                 goto bad;
1433b4e3dcbSSimon L. B. Nielsen             passargin = *(++argv);
144*6f9291ceSJung-uk Kim         } else if (strcmp(*argv, "-passout") == 0) {
145*6f9291ceSJung-uk Kim             if (--argc < 1)
146*6f9291ceSJung-uk Kim                 goto bad;
1473b4e3dcbSSimon L. B. Nielsen             passargout = *(++argv);
148*6f9291ceSJung-uk Kim         } else if (strcmp(*argv, "-engine") == 0) {
149*6f9291ceSJung-uk Kim             if (--argc < 1)
150*6f9291ceSJung-uk Kim                 goto bad;
1513b4e3dcbSSimon L. B. Nielsen             engine = *(++argv);
152*6f9291ceSJung-uk Kim         } else if (strcmp(*argv, "-noout") == 0)
1533b4e3dcbSSimon L. B. Nielsen             noout = 1;
1543b4e3dcbSSimon L. B. Nielsen         else if (strcmp(*argv, "-text") == 0)
1553b4e3dcbSSimon L. B. Nielsen             text = 1;
156*6f9291ceSJung-uk Kim         else if (strcmp(*argv, "-conv_form") == 0) {
1573b4e3dcbSSimon L. B. Nielsen             if (--argc < 1)
1583b4e3dcbSSimon L. B. Nielsen                 goto bad;
1593b4e3dcbSSimon L. B. Nielsen             ++argv;
1603b4e3dcbSSimon L. B. Nielsen             new_form = 1;
1613b4e3dcbSSimon L. B. Nielsen             if (strcmp(*argv, "compressed") == 0)
1623b4e3dcbSSimon L. B. Nielsen                 form = POINT_CONVERSION_COMPRESSED;
1633b4e3dcbSSimon L. B. Nielsen             else if (strcmp(*argv, "uncompressed") == 0)
1643b4e3dcbSSimon L. B. Nielsen                 form = POINT_CONVERSION_UNCOMPRESSED;
1653b4e3dcbSSimon L. B. Nielsen             else if (strcmp(*argv, "hybrid") == 0)
1663b4e3dcbSSimon L. B. Nielsen                 form = POINT_CONVERSION_HYBRID;
1673b4e3dcbSSimon L. B. Nielsen             else
1683b4e3dcbSSimon L. B. Nielsen                 goto bad;
169*6f9291ceSJung-uk Kim         } else if (strcmp(*argv, "-param_enc") == 0) {
1703b4e3dcbSSimon L. B. Nielsen             if (--argc < 1)
1713b4e3dcbSSimon L. B. Nielsen                 goto bad;
1723b4e3dcbSSimon L. B. Nielsen             ++argv;
1733b4e3dcbSSimon L. B. Nielsen             new_asn1_flag = 1;
1743b4e3dcbSSimon L. B. Nielsen             if (strcmp(*argv, "named_curve") == 0)
1753b4e3dcbSSimon L. B. Nielsen                 asn1_flag = OPENSSL_EC_NAMED_CURVE;
1763b4e3dcbSSimon L. B. Nielsen             else if (strcmp(*argv, "explicit") == 0)
1773b4e3dcbSSimon L. B. Nielsen                 asn1_flag = 0;
1783b4e3dcbSSimon L. B. Nielsen             else
1793b4e3dcbSSimon L. B. Nielsen                 goto bad;
180*6f9291ceSJung-uk Kim         } else if (strcmp(*argv, "-param_out") == 0)
1813b4e3dcbSSimon L. B. Nielsen             param_out = 1;
1823b4e3dcbSSimon L. B. Nielsen         else if (strcmp(*argv, "-pubin") == 0)
1833b4e3dcbSSimon L. B. Nielsen             pubin = 1;
1843b4e3dcbSSimon L. B. Nielsen         else if (strcmp(*argv, "-pubout") == 0)
1853b4e3dcbSSimon L. B. Nielsen             pubout = 1;
186*6f9291ceSJung-uk Kim         else if ((enc = EVP_get_cipherbyname(&(argv[0][1]))) == NULL) {
1873b4e3dcbSSimon L. B. Nielsen             BIO_printf(bio_err, "unknown option %s\n", *argv);
1883b4e3dcbSSimon L. B. Nielsen             badops = 1;
1893b4e3dcbSSimon L. B. Nielsen             break;
1903b4e3dcbSSimon L. B. Nielsen         }
1913b4e3dcbSSimon L. B. Nielsen         argc--;
1923b4e3dcbSSimon L. B. Nielsen         argv++;
1933b4e3dcbSSimon L. B. Nielsen     }
1943b4e3dcbSSimon L. B. Nielsen 
195*6f9291ceSJung-uk Kim     if (badops) {
1963b4e3dcbSSimon L. B. Nielsen  bad:
1973b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, "%s [options] <infile >outfile\n", prog);
1983b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, "where options are\n");
1993b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, " -inform arg     input format - "
2003b4e3dcbSSimon L. B. Nielsen                    "DER or PEM\n");
2013b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, " -outform arg    output format - "
2023b4e3dcbSSimon L. B. Nielsen                    "DER or PEM\n");
2033b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, " -in arg         input file\n");
2043b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, " -passin arg     input file pass "
2053b4e3dcbSSimon L. B. Nielsen                    "phrase source\n");
2063b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, " -out arg        output file\n");
2073b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, " -passout arg    output file pass "
2083b4e3dcbSSimon L. B. Nielsen                    "phrase source\n");
2093b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, " -engine e       use engine e, "
2103b4e3dcbSSimon L. B. Nielsen                    "possibly a hardware device.\n");
2113b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, " -des            encrypt PEM output, "
2123b4e3dcbSSimon L. B. Nielsen                    "instead of 'des' every other \n"
2133b4e3dcbSSimon L. B. Nielsen                    "                 cipher "
2143b4e3dcbSSimon L. B. Nielsen                    "supported by OpenSSL can be used\n");
2153b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, " -text           print the key\n");
2163b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, " -noout          don't print key out\n");
2173b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, " -param_out      print the elliptic "
2183b4e3dcbSSimon L. B. Nielsen                    "curve parameters\n");
2193b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, " -conv_form arg  specifies the "
2203b4e3dcbSSimon L. B. Nielsen                    "point conversion form \n");
2213b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, "                 possible values:"
2223b4e3dcbSSimon L. B. Nielsen                    " compressed\n");
2233b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, "                                 "
2243b4e3dcbSSimon L. B. Nielsen                    " uncompressed (default)\n");
225*6f9291ceSJung-uk Kim         BIO_printf(bio_err, "                                  " " hybrid\n");
2263b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, " -param_enc arg  specifies the way"
2273b4e3dcbSSimon L. B. Nielsen                    " the ec parameters are encoded\n");
228*6f9291ceSJung-uk Kim         BIO_printf(bio_err, "                 in the asn1 der " "encoding\n");
229db522d3aSSimon L. B. Nielsen         BIO_printf(bio_err, "                 possible values:"
2303b4e3dcbSSimon L. B. Nielsen                    " named_curve (default)\n");
2313b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, "                                  "
2323b4e3dcbSSimon L. B. Nielsen                    "explicit\n");
2333b4e3dcbSSimon L. B. Nielsen         goto end;
2343b4e3dcbSSimon L. B. Nielsen     }
2353b4e3dcbSSimon L. B. Nielsen 
2363b4e3dcbSSimon L. B. Nielsen     ERR_load_crypto_strings();
2373b4e3dcbSSimon L. B. Nielsen 
2383b4e3dcbSSimon L. B. Nielsen # ifndef OPENSSL_NO_ENGINE
239a3ddd25aSSimon L. B. Nielsen     setup_engine(bio_err, engine, 0);
2403b4e3dcbSSimon L. B. Nielsen # endif
2413b4e3dcbSSimon L. B. Nielsen 
242*6f9291ceSJung-uk Kim     if (!app_passwd(bio_err, passargin, passargout, &passin, &passout)) {
2433b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, "Error getting passwords\n");
2443b4e3dcbSSimon L. B. Nielsen         goto end;
2453b4e3dcbSSimon L. B. Nielsen     }
2463b4e3dcbSSimon L. B. Nielsen 
2473b4e3dcbSSimon L. B. Nielsen     in = BIO_new(BIO_s_file());
2483b4e3dcbSSimon L. B. Nielsen     out = BIO_new(BIO_s_file());
249*6f9291ceSJung-uk Kim     if ((in == NULL) || (out == NULL)) {
2503b4e3dcbSSimon L. B. Nielsen         ERR_print_errors(bio_err);
2513b4e3dcbSSimon L. B. Nielsen         goto end;
2523b4e3dcbSSimon L. B. Nielsen     }
2533b4e3dcbSSimon L. B. Nielsen 
2543b4e3dcbSSimon L. B. Nielsen     if (infile == NULL)
2553b4e3dcbSSimon L. B. Nielsen         BIO_set_fp(in, stdin, BIO_NOCLOSE);
256*6f9291ceSJung-uk Kim     else {
257*6f9291ceSJung-uk Kim         if (BIO_read_filename(in, infile) <= 0) {
2583b4e3dcbSSimon L. B. Nielsen             perror(infile);
2593b4e3dcbSSimon L. B. Nielsen             goto end;
2603b4e3dcbSSimon L. B. Nielsen         }
2613b4e3dcbSSimon L. B. Nielsen     }
2623b4e3dcbSSimon L. B. Nielsen 
2633b4e3dcbSSimon L. B. Nielsen     BIO_printf(bio_err, "read EC key\n");
264*6f9291ceSJung-uk Kim     if (informat == FORMAT_ASN1) {
2653b4e3dcbSSimon L. B. Nielsen         if (pubin)
2663b4e3dcbSSimon L. B. Nielsen             eckey = d2i_EC_PUBKEY_bio(in, NULL);
2673b4e3dcbSSimon L. B. Nielsen         else
2683b4e3dcbSSimon L. B. Nielsen             eckey = d2i_ECPrivateKey_bio(in, NULL);
269*6f9291ceSJung-uk Kim     } else if (informat == FORMAT_PEM) {
2703b4e3dcbSSimon L. B. Nielsen         if (pubin)
271*6f9291ceSJung-uk Kim             eckey = PEM_read_bio_EC_PUBKEY(in, NULL, NULL, NULL);
2723b4e3dcbSSimon L. B. Nielsen         else
273*6f9291ceSJung-uk Kim             eckey = PEM_read_bio_ECPrivateKey(in, NULL, NULL, passin);
274*6f9291ceSJung-uk Kim     } else {
2753b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, "bad input format specified for key\n");
2763b4e3dcbSSimon L. B. Nielsen         goto end;
2773b4e3dcbSSimon L. B. Nielsen     }
278*6f9291ceSJung-uk Kim     if (eckey == NULL) {
2793b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, "unable to load Key\n");
2803b4e3dcbSSimon L. B. Nielsen         ERR_print_errors(bio_err);
2813b4e3dcbSSimon L. B. Nielsen         goto end;
2823b4e3dcbSSimon L. B. Nielsen     }
2833b4e3dcbSSimon L. B. Nielsen 
284*6f9291ceSJung-uk Kim     if (outfile == NULL) {
2853b4e3dcbSSimon L. B. Nielsen         BIO_set_fp(out, stdout, BIO_NOCLOSE);
2863b4e3dcbSSimon L. B. Nielsen # ifdef OPENSSL_SYS_VMS
2873b4e3dcbSSimon L. B. Nielsen         {
2883b4e3dcbSSimon L. B. Nielsen             BIO *tmpbio = BIO_new(BIO_f_linebuffer());
2893b4e3dcbSSimon L. B. Nielsen             out = BIO_push(tmpbio, out);
2903b4e3dcbSSimon L. B. Nielsen         }
2913b4e3dcbSSimon L. B. Nielsen # endif
292*6f9291ceSJung-uk Kim     } else {
293*6f9291ceSJung-uk Kim         if (BIO_write_filename(out, outfile) <= 0) {
2943b4e3dcbSSimon L. B. Nielsen             perror(outfile);
2953b4e3dcbSSimon L. B. Nielsen             goto end;
2963b4e3dcbSSimon L. B. Nielsen         }
2973b4e3dcbSSimon L. B. Nielsen     }
2983b4e3dcbSSimon L. B. Nielsen 
2993b4e3dcbSSimon L. B. Nielsen     group = EC_KEY_get0_group(eckey);
3003b4e3dcbSSimon L. B. Nielsen 
3013b4e3dcbSSimon L. B. Nielsen     if (new_form)
3023b4e3dcbSSimon L. B. Nielsen         EC_KEY_set_conv_form(eckey, form);
3033b4e3dcbSSimon L. B. Nielsen 
3043b4e3dcbSSimon L. B. Nielsen     if (new_asn1_flag)
3053b4e3dcbSSimon L. B. Nielsen         EC_KEY_set_asn1_flag(eckey, asn1_flag);
3063b4e3dcbSSimon L. B. Nielsen 
3073b4e3dcbSSimon L. B. Nielsen     if (text)
308*6f9291ceSJung-uk Kim         if (!EC_KEY_print(out, eckey, 0)) {
3093b4e3dcbSSimon L. B. Nielsen             perror(outfile);
3103b4e3dcbSSimon L. B. Nielsen             ERR_print_errors(bio_err);
3113b4e3dcbSSimon L. B. Nielsen             goto end;
3123b4e3dcbSSimon L. B. Nielsen         }
3133b4e3dcbSSimon L. B. Nielsen 
314*6f9291ceSJung-uk Kim     if (noout) {
3155471f83eSSimon L. B. Nielsen         ret = 0;
3163b4e3dcbSSimon L. B. Nielsen         goto end;
3175471f83eSSimon L. B. Nielsen     }
3183b4e3dcbSSimon L. B. Nielsen 
3193b4e3dcbSSimon L. B. Nielsen     BIO_printf(bio_err, "writing EC key\n");
320*6f9291ceSJung-uk Kim     if (outformat == FORMAT_ASN1) {
3213b4e3dcbSSimon L. B. Nielsen         if (param_out)
3223b4e3dcbSSimon L. B. Nielsen             i = i2d_ECPKParameters_bio(out, group);
3233b4e3dcbSSimon L. B. Nielsen         else if (pubin || pubout)
3243b4e3dcbSSimon L. B. Nielsen             i = i2d_EC_PUBKEY_bio(out, eckey);
3253b4e3dcbSSimon L. B. Nielsen         else
3263b4e3dcbSSimon L. B. Nielsen             i = i2d_ECPrivateKey_bio(out, eckey);
327*6f9291ceSJung-uk Kim     } else if (outformat == FORMAT_PEM) {
3283b4e3dcbSSimon L. B. Nielsen         if (param_out)
3293b4e3dcbSSimon L. B. Nielsen             i = PEM_write_bio_ECPKParameters(out, group);
3303b4e3dcbSSimon L. B. Nielsen         else if (pubin || pubout)
3313b4e3dcbSSimon L. B. Nielsen             i = PEM_write_bio_EC_PUBKEY(out, eckey);
3323b4e3dcbSSimon L. B. Nielsen         else
3333b4e3dcbSSimon L. B. Nielsen             i = PEM_write_bio_ECPrivateKey(out, eckey, enc,
3343b4e3dcbSSimon L. B. Nielsen                                            NULL, 0, NULL, passout);
335*6f9291ceSJung-uk Kim     } else {
336*6f9291ceSJung-uk Kim         BIO_printf(bio_err, "bad output format specified for " "outfile\n");
3373b4e3dcbSSimon L. B. Nielsen         goto end;
3383b4e3dcbSSimon L. B. Nielsen     }
3393b4e3dcbSSimon L. B. Nielsen 
340*6f9291ceSJung-uk Kim     if (!i) {
3413b4e3dcbSSimon L. B. Nielsen         BIO_printf(bio_err, "unable to write private key\n");
3423b4e3dcbSSimon L. B. Nielsen         ERR_print_errors(bio_err);
343*6f9291ceSJung-uk Kim     } else
3443b4e3dcbSSimon L. B. Nielsen         ret = 0;
3453b4e3dcbSSimon L. B. Nielsen  end:
3463b4e3dcbSSimon L. B. Nielsen     if (in)
3473b4e3dcbSSimon L. B. Nielsen         BIO_free(in);
3483b4e3dcbSSimon L. B. Nielsen     if (out)
3493b4e3dcbSSimon L. B. Nielsen         BIO_free_all(out);
3503b4e3dcbSSimon L. B. Nielsen     if (eckey)
3513b4e3dcbSSimon L. B. Nielsen         EC_KEY_free(eckey);
3523b4e3dcbSSimon L. B. Nielsen     if (passin)
3533b4e3dcbSSimon L. B. Nielsen         OPENSSL_free(passin);
3543b4e3dcbSSimon L. B. Nielsen     if (passout)
3553b4e3dcbSSimon L. B. Nielsen         OPENSSL_free(passout);
3563b4e3dcbSSimon L. B. Nielsen     apps_shutdown();
3573b4e3dcbSSimon L. B. Nielsen     OPENSSL_EXIT(ret);
3583b4e3dcbSSimon L. B. Nielsen }
3591f13597dSJung-uk Kim #else                           /* !OPENSSL_NO_EC */
3601f13597dSJung-uk Kim 
3611f13597dSJung-uk Kim # if PEDANTIC
3621f13597dSJung-uk Kim static void *dummy = &dummy;
3631f13597dSJung-uk Kim # endif
3641f13597dSJung-uk Kim 
3653b4e3dcbSSimon L. B. Nielsen #endif
366