1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* apps/engine.c -*- mode: C; c-file-style: "eay" -*- */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Written by Richard Levitte <richard@levitte.org> for the OpenSSL
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * project 2000.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ====================================================================
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 2000 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 *    licensing@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
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h>
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h>
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_NO_STDIO
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define APPS_WIN16
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "apps.h"
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h>
68e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_ENGINE
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/engine.h>
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/ssl.h>
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef PROG
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define PROG	engine_main
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const char *engine_usage[]={
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"usage: engine opts [engine ...]\n",
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project" -v[v[v[v]]] - verbose mode, for each engine, list its 'control commands'\n",
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"               -vv will additionally display each command's description\n",
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"               -vvv will also add the input flags for each command\n",
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"               -vvvv will also show internal input flags\n",
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project" -c          - for each engine, also list the capabilities\n",
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project" -t[t]       - for each engine, check that they are really available\n",
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"               -tt will display error trace for unavailable engines\n",
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project" -pre <cmd>  - runs command 'cmd' against the ENGINE before any attempts\n",
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"               to load it (if -t is used)\n",
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project" -post <cmd> - runs command 'cmd' against the ENGINE after loading it\n",
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project"               (only used if -t is also provided)\n",
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project" NB: -pre and -post will be applied to all ENGINEs supplied on the command\n",
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project" line, or all supported ENGINEs if none are specified.\n",
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project" Eg. '-pre \"SO_PATH:/lib/libdriver.so\"' calls command \"SO_PATH\" with\n",
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project" argument \"/lib/libdriver.so\".\n",
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectNULL
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
95221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void identity(char *ptr)
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return;
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int append_buf(char **buf, const char *s, int *size, int step)
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int l = strlen(s);
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (*buf == NULL)
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*size = step;
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*buf = OPENSSL_malloc(*size);
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (*buf == NULL)
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		**buf = '\0';
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (**buf != '\0')
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		l += 2;		/* ", " */
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (strlen(*buf) + strlen(s) >= (unsigned int)*size)
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*size += step;
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*buf = OPENSSL_realloc(*buf, *size);
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (*buf == NULL)
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (**buf != '\0')
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BUF_strlcat(*buf, ", ", *size);
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BUF_strlcat(*buf, s, *size);
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int util_flags(BIO *bio_out, unsigned int flags, const char *indent)
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int started = 0, err = 0;
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Indent before displaying input flags */
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_out, "%s%s(input flags): ", indent, indent);
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(flags == 0)
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_out, "<no flags>\n");
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /* If the object is internal, mark it in a way that shows instead of
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project         * having it part of all the other flags, even if it really is. */
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(flags & ENGINE_CMD_FLAG_INTERNAL)
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_out, "[Internal] ");
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(flags & ENGINE_CMD_FLAG_NUMERIC)
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_out, "NUMERIC");
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		started = 1;
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Now we check that no combinations of the mutually exclusive NUMERIC,
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * STRING, and NO_INPUT flags have been used. Future flags that can be
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * OR'd together with these would need to added after these to preserve
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * the testing logic. */
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(flags & ENGINE_CMD_FLAG_STRING)
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(started)
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_out, "|");
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			err = 1;
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_out, "STRING");
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		started = 1;
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(flags & ENGINE_CMD_FLAG_NO_INPUT)
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(started)
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_out, "|");
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			err = 1;
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_out, "NO_INPUT");
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		started = 1;
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Check for unknown flags */
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	flags = flags & ~ENGINE_CMD_FLAG_NUMERIC &
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			~ENGINE_CMD_FLAG_STRING &
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			~ENGINE_CMD_FLAG_NO_INPUT &
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			~ENGINE_CMD_FLAG_INTERNAL;
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(flags)
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(started) BIO_printf(bio_out, "|");
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_out, "<0x%04X>", flags);
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(err)
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_out, "  <illegal flags!>");
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_out, "\n");
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int util_verbose(ENGINE *e, int verbose, BIO *bio_out, const char *indent)
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const int line_wrap = 78;
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int num;
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret = 0;
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *name = NULL;
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *desc = NULL;
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int flags;
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int xpos = 0;
203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	STACK_OF(OPENSSL_STRING) *cmds = NULL;
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!ENGINE_ctrl(e, ENGINE_CTRL_HAS_CTRL_FUNCTION, 0, NULL, NULL) ||
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			((num = ENGINE_ctrl(e, ENGINE_CTRL_GET_FIRST_CMD_TYPE,
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					0, NULL, NULL)) <= 0))
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_out, "%s<no control commands>\n", indent);
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmds = sk_OPENSSL_STRING_new_null();
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!cmds)
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	do {
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int len;
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Get the command input flags */
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if((flags = ENGINE_ctrl(e, ENGINE_CTRL_GET_CMD_FLAGS, num,
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					NULL, NULL)) < 0)
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                if (!(flags & ENGINE_CMD_FLAG_INTERNAL) || verbose >= 4)
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        {
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        /* Get the command name */
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        if((len = ENGINE_ctrl(e, ENGINE_CTRL_GET_NAME_LEN_FROM_CMD, num,
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                NULL, NULL)) <= 0)
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                goto err;
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        if((name = OPENSSL_malloc(len + 1)) == NULL)
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                goto err;
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        if(ENGINE_ctrl(e, ENGINE_CTRL_GET_NAME_FROM_CMD, num, name,
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                NULL) <= 0)
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                goto err;
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        /* Get the command description */
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        if((len = ENGINE_ctrl(e, ENGINE_CTRL_GET_DESC_LEN_FROM_CMD, num,
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                NULL, NULL)) < 0)
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                goto err;
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        if(len > 0)
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                {
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                if((desc = OPENSSL_malloc(len + 1)) == NULL)
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                        goto err;
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                if(ENGINE_ctrl(e, ENGINE_CTRL_GET_DESC_FROM_CMD, num, desc,
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                        NULL) <= 0)
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                        goto err;
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                }
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        /* Now decide on the output */
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        if(xpos == 0)
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                /* Do an indent */
250e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu                                xpos = BIO_puts(bio_out, indent);
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        else
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                /* Otherwise prepend a ", " */
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                xpos += BIO_printf(bio_out, ", ");
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        if(verbose == 1)
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                {
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                /* We're just listing names, comma-delimited */
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                if((xpos > (int)strlen(indent)) &&
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					(xpos + (int)strlen(name) > line_wrap))
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                        {
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                        BIO_printf(bio_out, "\n");
261e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu                                        xpos = BIO_puts(bio_out, indent);
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                        }
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                xpos += BIO_printf(bio_out, "%s", name);
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                }
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        else
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                {
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                /* We're listing names plus descriptions */
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                BIO_printf(bio_out, "%s: %s\n", name,
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                        (desc == NULL) ? "<no description>" : desc);
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                /* ... and sometimes input flags */
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                if((verbose >= 3) && !util_flags(bio_out, flags,
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                        indent))
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                        goto err;
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                xpos = 0;
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                }
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        }
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(name); name = NULL;
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(desc) { OPENSSL_free(desc); desc = NULL; }
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Move to the next command */
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		num = ENGINE_ctrl(e, ENGINE_CTRL_GET_NEXT_CMD_TYPE,
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					num, NULL, NULL);
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		} while(num > 0);
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(xpos > 0)
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_out, "\n");
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = 1;
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
287221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(cmds) sk_OPENSSL_STRING_pop_free(cmds, identity);
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(name) OPENSSL_free(name);
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(desc) OPENSSL_free(desc);
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
293221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void util_do_cmds(ENGINE *e, STACK_OF(OPENSSL_STRING) *cmds,
294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			BIO *bio_out, const char *indent)
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
296221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int loop, res, num = sk_OPENSSL_STRING_num(cmds);
297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(num < 0)
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_out, "[Error]: internal stack error\n");
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return;
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(loop = 0; loop < num; loop++)
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		char buf[256];
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		const char *cmd, *arg;
307221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		cmd = sk_OPENSSL_STRING_value(cmds, loop);
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		res = 1; /* assume success */
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Check if this command has no ":arg" */
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if((arg = strstr(cmd, ":")) == NULL)
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(!ENGINE_ctrl_cmd_string(e, cmd, NULL, 0))
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				res = 0;
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if((int)(arg - cmd) > 254)
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_out,"[Error]: command name too long\n");
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return;
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy(buf, cmd, (int)(arg - cmd));
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			buf[arg-cmd] = '\0';
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			arg++; /* Move past the ":" */
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* Call the command with the argument */
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(!ENGINE_ctrl_cmd_string(e, buf, arg, 0))
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				res = 0;
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(res)
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_out, "[Success]: %s\n", cmd);
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_out, "[Failure]: %s\n", cmd);
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_print_errors(bio_out);
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int, char **);
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int argc, char **argv)
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret=1,i;
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const char **pp;
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int verbose=0, list_cap=0, test_avail=0, test_avail_noise = 0;
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ENGINE *e;
347221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	STACK_OF(OPENSSL_STRING) *engines = sk_OPENSSL_STRING_new_null();
348221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	STACK_OF(OPENSSL_STRING) *pre_cmds = sk_OPENSSL_STRING_new_null();
349221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	STACK_OF(OPENSSL_STRING) *post_cmds = sk_OPENSSL_STRING_new_null();
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int badops=1;
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO *bio_out=NULL;
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const char *indent = "     ";
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	apps_startup();
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_load_error_strings();
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bio_err == NULL)
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!load_config(bio_err, NULL))
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bio_out=BIO_new_fp(stdout,BIO_NOCLOSE);
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO *tmpbio = BIO_new(BIO_f_linebuffer());
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bio_out = BIO_push(tmpbio, bio_out);
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	argc--;
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	argv++;
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while (argc >= 1)
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (strncmp(*argv,"-v",2) == 0)
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(strspn(*argv + 1, "v") < strlen(*argv + 1))
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto skip_arg_loop;
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if((verbose=strlen(*argv + 1)) > 4)
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto skip_arg_loop;
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-c") == 0)
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			list_cap=1;
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strncmp(*argv,"-t",2) == 0)
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			test_avail=1;
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(strspn(*argv + 1, "t") < strlen(*argv + 1))
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto skip_arg_loop;
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if((test_avail_noise = strlen(*argv + 1) - 1) > 1)
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto skip_arg_loop;
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-pre") == 0)
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			argc--; argv++;
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (argc == 0)
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto skip_arg_loop;
396221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			sk_OPENSSL_STRING_push(pre_cmds,*argv);
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-post") == 0)
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			argc--; argv++;
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (argc == 0)
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto skip_arg_loop;
403221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			sk_OPENSSL_STRING_push(post_cmds,*argv);
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if ((strncmp(*argv,"-h",2) == 0) ||
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(strcmp(*argv,"-?") == 0))
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto skip_arg_loop;
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
409221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			sk_OPENSSL_STRING_push(engines,*argv);
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		argc--;
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		argv++;
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Looks like everything went OK */
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	badops = 0;
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectskip_arg_loop:
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (badops)
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (pp=engine_usage; (*pp != NULL); pp++)
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"%s",*pp);
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
424221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (sk_OPENSSL_STRING_num(engines) == 0)
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for(e = ENGINE_get_first(); e != NULL; e = ENGINE_get_next(e))
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
428221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			sk_OPENSSL_STRING_push(engines,(char *)ENGINE_get_id(e));
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
432221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	for (i=0; i<sk_OPENSSL_STRING_num(engines); i++)
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		const char *id = sk_OPENSSL_STRING_value(engines,i);
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((e = ENGINE_by_id(id)) != NULL)
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			const char *name = ENGINE_get_name(e);
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* Do "id" first, then "name". Easier to auto-parse. */
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_out, "(%s) %s\n", id, name);
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			util_do_cmds(e, pre_cmds, bio_out, indent);
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (strcmp(ENGINE_get_id(e), id) != 0)
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_out, "Loaded: (%s) %s\n",
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					ENGINE_get_id(e), ENGINE_get_name(e));
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (list_cap)
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				int cap_size = 256;
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				char *cap_buf = NULL;
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				int k,n;
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				const int *nids;
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ENGINE_CIPHERS_PTR fn_c;
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ENGINE_DIGESTS_PTR fn_d;
454221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				ENGINE_PKEY_METHS_PTR fn_pk;
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (ENGINE_get_RSA(e) != NULL
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					&& !append_buf(&cap_buf, "RSA",
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						&cap_size, 256))
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto end;
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (ENGINE_get_DSA(e) != NULL
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					&& !append_buf(&cap_buf, "DSA",
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						&cap_size, 256))
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto end;
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (ENGINE_get_DH(e) != NULL
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					&& !append_buf(&cap_buf, "DH",
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						&cap_size, 256))
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto end;
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (ENGINE_get_RAND(e) != NULL
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					&& !append_buf(&cap_buf, "RAND",
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						&cap_size, 256))
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto end;
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				fn_c = ENGINE_get_ciphers(e);
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if(!fn_c) goto skip_ciphers;
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				n = fn_c(e, NULL, &nids, 0);
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				for(k=0 ; k < n ; ++k)
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if(!append_buf(&cap_buf,
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						       OBJ_nid2sn(nids[k]),
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						       &cap_size, 256))
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						goto end;
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectskip_ciphers:
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				fn_d = ENGINE_get_digests(e);
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if(!fn_d) goto skip_digests;
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				n = fn_d(e, NULL, &nids, 0);
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				for(k=0 ; k < n ; ++k)
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if(!append_buf(&cap_buf,
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						       OBJ_nid2sn(nids[k]),
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						       &cap_size, 256))
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						goto end;
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectskip_digests:
493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				fn_pk = ENGINE_get_pkey_meths(e);
494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				if(!fn_pk) goto skip_pmeths;
495221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				n = fn_pk(e, NULL, &nids, 0);
496221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				for(k=0 ; k < n ; ++k)
497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom					if(!append_buf(&cap_buf,
498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom						       OBJ_nid2sn(nids[k]),
499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom						       &cap_size, 256))
500221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom						goto end;
501221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromskip_pmeths:
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (cap_buf && (*cap_buf != '\0'))
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_printf(bio_out, " [%s]\n", cap_buf);
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				OPENSSL_free(cap_buf);
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(test_avail)
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_out, "%s", indent);
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (ENGINE_init(e))
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_printf(bio_out, "[ available ]\n");
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					util_do_cmds(e, post_cmds, bio_out, indent);
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					ENGINE_finish(e);
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_printf(bio_out, "[ unavailable ]\n");
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if(test_avail_noise)
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						ERR_print_errors_fp(stdout);
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					ERR_clear_error();
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if((verbose > 0) && !util_verbose(e, verbose, bio_out, indent))
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto end;
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ENGINE_free(e);
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_print_errors(bio_err);
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=0;
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend:
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ERR_print_errors(bio_err);
536221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sk_OPENSSL_STRING_pop_free(engines, identity);
537221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sk_OPENSSL_STRING_pop_free(pre_cmds, identity);
538221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sk_OPENSSL_STRING_pop_free(post_cmds, identity);
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bio_out != NULL) BIO_free_all(bio_out);
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	apps_shutdown();
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_EXIT(ret);
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# if PEDANTIC
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void *dummy=&dummy;
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
550