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