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