1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* apps/ec.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Written by Nils Larsch for the OpenSSL project. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ==================================================================== 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved. 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the documentation and/or other materials provided with the 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * distribution. 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * software must display the following acknowledgment: 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * endorse or promote products derived from this software without 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * prior written permission. For written permission, please contact 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * openssl-core@openssl.org. 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL" 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * nor may "OpenSSL" appear in their names without prior written 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * permission of the OpenSSL Project. 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * acknowledgment: 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE. 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ==================================================================== 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com). This product includes software written by Tim 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com). 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/opensslconf.h> 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_EC 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h> 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h> 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "apps.h" 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bio.h> 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h> 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/evp.h> 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/pem.h> 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef PROG 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define PROG ec_main 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* -inform arg - input format - default PEM (one of DER, NET or PEM) 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -outform arg - output format - default PEM 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -in arg - input file - default stdin 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -out arg - output file - default stdout 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -des - encrypt output if PEM format with DES in cbc mode 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -text - print a text version 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -param_out - print the elliptic curve parameters 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -conv_form arg - specifies the point encoding form 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * -param_enc arg - specifies the parameter encoding 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int, char **); 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int argc, char **argv) 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret = 1; 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_KEY *eckey = NULL; 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const EC_GROUP *group; 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i, badops = 0; 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const EVP_CIPHER *enc = NULL; 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *in = NULL, *out = NULL; 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int informat, outformat, text=0, noout=0; 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int pubin = 0, pubout = 0, param_out = 0; 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *infile, *outfile, *prog, *engine; 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *passargin = NULL, *passargout = NULL; 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *passin = NULL, *passout = NULL; 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project point_conversion_form_t form = POINT_CONVERSION_UNCOMPRESSED; 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int new_form = 0; 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int asn1_flag = OPENSSL_EC_NAMED_CURVE; 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int new_asn1_flag = 0; 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project apps_startup(); 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bio_err == NULL) 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((bio_err=BIO_new(BIO_s_file())) != NULL) 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_fp(bio_err, stderr, BIO_NOCLOSE|BIO_FP_TEXT); 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!load_config(bio_err, NULL)) 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project engine = NULL; 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project infile = NULL; 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outfile = NULL; 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project informat = FORMAT_PEM; 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outformat = FORMAT_PEM; 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project prog = argv[0]; 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argc--; 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argv++; 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (argc >= 1) 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strcmp(*argv,"-inform") == 0) 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project informat=str2fmt(*(++argv)); 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-outform") == 0) 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outformat=str2fmt(*(++argv)); 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-in") == 0) 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project infile= *(++argv); 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-out") == 0) 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outfile= *(++argv); 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-passin") == 0) 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project passargin= *(++argv); 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-passout") == 0) 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project passargout= *(++argv); 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv, "-engine") == 0) 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project engine= *(++argv); 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv, "-noout") == 0) 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project noout = 1; 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv, "-text") == 0) 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project text = 1; 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv, "-conv_form") == 0) 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto bad; 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ++argv; 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project new_form = 1; 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strcmp(*argv, "compressed") == 0) 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project form = POINT_CONVERSION_COMPRESSED; 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv, "uncompressed") == 0) 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project form = POINT_CONVERSION_UNCOMPRESSED; 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv, "hybrid") == 0) 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project form = POINT_CONVERSION_HYBRID; 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto bad; 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv, "-param_enc") == 0) 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto bad; 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ++argv; 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project new_asn1_flag = 1; 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strcmp(*argv, "named_curve") == 0) 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project asn1_flag = OPENSSL_EC_NAMED_CURVE; 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv, "explicit") == 0) 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project asn1_flag = 0; 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto bad; 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv, "-param_out") == 0) 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project param_out = 1; 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv, "-pubin") == 0) 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pubin=1; 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv, "-pubout") == 0) 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pubout=1; 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if ((enc=EVP_get_cipherbyname(&(argv[0][1]))) == NULL) 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "unknown option %s\n", *argv); 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badops=1; 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argc--; 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argv++; 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (badops) 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectbad: 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "%s [options] <infile >outfile\n", prog); 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "where options are\n"); 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " -inform arg input format - " 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "DER or PEM\n"); 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " -outform arg output format - " 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "DER or PEM\n"); 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " -in arg input file\n"); 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " -passin arg input file pass " 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "phrase source\n"); 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " -out arg output file\n"); 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " -passout arg output file pass " 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "phrase source\n"); 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " -engine e use engine e, " 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "possibly a hardware device.\n"); 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " -des encrypt PEM output, " 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "instead of 'des' every other \n" 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project " cipher " 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "supported by OpenSSL can be used\n"); 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " -text print the key\n"); 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " -noout don't print key out\n"); 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " -param_out print the elliptic " 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "curve parameters\n"); 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " -conv_form arg specifies the " 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "point conversion form \n"); 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " possible values:" 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project " compressed\n"); 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " " 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project " uncompressed (default)\n"); 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " " 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project " hybrid\n"); 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " -param_enc arg specifies the way" 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project " the ec parameters are encoded\n"); 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " in the asn1 der " 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "encoding\n"); 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " possible values:" 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project " named_curve (default)\n"); 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," " 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "explicit\n"); 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_load_crypto_strings(); 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 25443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom setup_engine(bio_err, engine, 0); 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!app_passwd(bio_err, passargin, passargout, &passin, &passout)) 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error getting passwords\n"); 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project in = BIO_new(BIO_s_file()); 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out = BIO_new(BIO_s_file()); 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((in == NULL) || (out == NULL)) 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (infile == NULL) 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_fp(in, stdin, BIO_NOCLOSE); 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (BIO_read_filename(in, infile) <= 0) 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project perror(infile); 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "read EC key\n"); 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (informat == FORMAT_ASN1) 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (pubin) 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project eckey = d2i_EC_PUBKEY_bio(in, NULL); 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project eckey = d2i_ECPrivateKey_bio(in, NULL); 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (informat == FORMAT_PEM) 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (pubin) 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project eckey = PEM_read_bio_EC_PUBKEY(in, NULL, NULL, 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NULL); 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project eckey = PEM_read_bio_ECPrivateKey(in, NULL, NULL, 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project passin); 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "bad input format specified for key\n"); 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (eckey == NULL) 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"unable to load Key\n"); 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (outfile == NULL) 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_fp(out, stdout, BIO_NOCLOSE); 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *tmpbio = BIO_new(BIO_f_linebuffer()); 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out = BIO_push(tmpbio, out); 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (BIO_write_filename(out, outfile) <= 0) 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project perror(outfile); 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project group = EC_KEY_get0_group(eckey); 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (new_form) 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_KEY_set_conv_form(eckey, form); 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (new_asn1_flag) 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_KEY_set_asn1_flag(eckey, asn1_flag); 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (text) 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!EC_KEY_print(out, eckey, 0)) 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project perror(outfile); 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (noout) 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 0; 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "writing EC key\n"); 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (outformat == FORMAT_ASN1) 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (param_out) 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i = i2d_ECPKParameters_bio(out, group); 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (pubin || pubout) 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i = i2d_EC_PUBKEY_bio(out, eckey); 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i = i2d_ECPrivateKey_bio(out, eckey); 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (outformat == FORMAT_PEM) 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (param_out) 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i = PEM_write_bio_ECPKParameters(out, group); 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (pubin || pubout) 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i = PEM_write_bio_EC_PUBKEY(out, eckey); 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i = PEM_write_bio_ECPrivateKey(out, eckey, enc, 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NULL, 0, NULL, passout); 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "bad output format specified for " 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "outfile\n"); 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!i) 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "unable to write private key\n"); 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=0; 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend: 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (in) 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(in); 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (out) 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free_all(out); 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (eckey) 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EC_KEY_free(eckey); 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (passin) 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(passin); 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (passout) 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(passout); 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project apps_shutdown(); 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_EXIT(ret); 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 400221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#else /* !OPENSSL_NO_EC */ 401221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 402221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# if PEDANTIC 403221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void *dummy=&dummy; 404221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# endif 405221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 407