15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* openssl/engine.h */
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * project 2000.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ====================================================================
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 1999-2004 The OpenSSL Project.  All rights reserved.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modification, are permitted provided that the following conditions
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are met:
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    notice, this list of conditions and the following disclaimer in
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    the documentation and/or other materials provided with the
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    distribution.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3. All advertising materials mentioning features or use of this
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    software must display the following acknowledgment:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    "This product includes software developed by the OpenSSL Project
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    endorse or promote products derived from this software without
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    prior written permission. For written permission, please contact
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    licensing@OpenSSL.org.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5. Products derived from this software may not be called "OpenSSL"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    nor may "OpenSSL" appear in their names without prior written
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    permission of the OpenSSL Project.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6. Redistributions of any form whatsoever must retain the following
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    acknowledgment:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    "This product includes software developed by the OpenSSL Project
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OF THE POSSIBILITY OF SUCH DAMAGE.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ====================================================================
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This product includes cryptographic software written by Eric Young
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (eay@cryptsoft.com).  This product includes software written by Tim
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Hudson (tjh@cryptsoft.com).
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ====================================================================
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ECDH support in OpenSSL originally developed by
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef HEADER_ENGINE_H
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HEADER_ENGINE_H
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <openssl/opensslconf.h>
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef OPENSSL_NO_ENGINE
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#error ENGINE is disabled.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef OPENSSL_NO_DEPRECATED
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <openssl/bn.h>
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef OPENSSL_NO_RSA
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <openssl/rsa.h>
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef OPENSSL_NO_DSA
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <openssl/dsa.h>
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef OPENSSL_NO_DH
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <openssl/dh.h>
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef OPENSSL_NO_ECDH
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <openssl/ecdh.h>
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef OPENSSL_NO_ECDSA
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <openssl/ecdsa.h>
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <openssl/rand.h>
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <openssl/ui.h>
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <openssl/err.h>
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <openssl/ossl_typ.h>
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <openssl/symhacks.h>
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <openssl/x509.h>
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef  __cplusplus
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These flags are used to control combinations of algorithm (methods)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * by bitwise "OR"ing. */
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_METHOD_RSA		(unsigned int)0x0001
10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define ENGINE_METHOD_DSA		(unsigned int)0x0002
10823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define ENGINE_METHOD_DH		(unsigned int)0x0004
10923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define ENGINE_METHOD_RAND		(unsigned int)0x0008
11023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define ENGINE_METHOD_ECDH		(unsigned int)0x0010
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_METHOD_ECDSA		(unsigned int)0x0020
112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define ENGINE_METHOD_CIPHERS		(unsigned int)0x0040
113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define ENGINE_METHOD_DIGESTS		(unsigned int)0x0080
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_METHOD_STORE		(unsigned int)0x0100
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_METHOD_PKEY_METHS	(unsigned int)0x0200
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_METHOD_PKEY_ASN1_METHS	(unsigned int)0x0400
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* Obvious all-or-nothing cases. */
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ENGINE_METHOD_ALL		(unsigned int)0xFFFF
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ENGINE_METHOD_NONE		(unsigned int)0x0000
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* This(ese) flag(s) controls behaviour of the ENGINE_TABLE mechanism used
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * internally to control registration of ENGINE implementations, and can be set
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * by ENGINE_set_table_flags(). The "NOINIT" flag prevents attempts to
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * initialise registered ENGINEs if they are not already initialised. */
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ENGINE_TABLE_FLAG_NOINIT	(unsigned int)0x0001
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* ENGINE flags that can be set by ENGINE_set_flags(). */
12823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)/* #define ENGINE_FLAGS_MALLOCED	0x0001 */ /* Not used */
12923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
13023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)/* This flag is for ENGINEs that wish to handle the various 'CMD'-related
13123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * control commands on their own. Without this flag, ENGINE_ctrl() handles these
13223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * control commands on behalf of the ENGINE using their "cmd_defns" data. */
13323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define ENGINE_FLAGS_MANUAL_CMD_CTRL	(int)0x0002
13423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
13523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)/* This flag is for ENGINEs who return new duplicate structures when found via
13623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * "ENGINE_by_id()". When an ENGINE must store state (eg. if ENGINE_ctrl()
13723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * commands are called in sequence as part of some stateful process like
13823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * key-generation setup and execution), it can set this flag - then each attempt
13923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * to obtain the ENGINE will result in it being copied into a new structure.
14023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * Normally, ENGINEs don't declare this flag so ENGINE_by_id() just increments
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the existing ENGINE's structural reference count. */
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_FLAGS_BY_ID_COPY		(int)0x0004
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This flag if for an ENGINE that does not want its methods registered as
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * part of ENGINE_register_all_complete() for example if the methods are
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * not usable as default methods.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_FLAGS_NO_REGISTER_ALL	(int)0x0008
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ENGINEs can support their own command types, and these flags are used in
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ENGINE_CTRL_GET_CMD_FLAGS to indicate to the caller what kind of input each
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * command expects. Currently only numeric and string input is supported. If a
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * control command supports none of the _NUMERIC, _STRING, or _NO_INPUT options,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * then it is regarded as an "internal" control command - and not for use in
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * config setting situations. As such, they're not available to the
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ENGINE_ctrl_cmd_string() function, only raw ENGINE_ctrl() access. Changes to
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this list of 'command types' should be reflected carefully in
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ENGINE_cmd_is_executable() and ENGINE_ctrl_cmd_string(). */
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* accepts a 'long' input value (3rd parameter to ENGINE_ctrl) */
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CMD_FLAG_NUMERIC		(unsigned int)0x0001
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* accepts string input (cast from 'void*' to 'const char *', 4th parameter to
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ENGINE_ctrl) */
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CMD_FLAG_STRING		(unsigned int)0x0002
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Indicates that the control command takes *no* input. Ie. the control command
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is unparameterised. */
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CMD_FLAG_NO_INPUT	(unsigned int)0x0004
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Indicates that the control command is internal. This control command won't
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be shown in any output, and is only usable through the ENGINE_ctrl_cmd()
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function. */
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CMD_FLAG_INTERNAL	(unsigned int)0x0008
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* NB: These 3 control commands are deprecated and should not be used. ENGINEs
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * relying on these commands should compile conditional support for
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * compatibility (eg. if these symbols are defined) but should also migrate the
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * same functionality to their own ENGINE-specific control functions that can be
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "discovered" by calling applications. The fact these control commands
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * wouldn't be "executable" (ie. usable by text-based config) doesn't change the
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * fact that application code can find and use them without requiring per-ENGINE
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * hacking. */
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These flags are used to tell the ctrl function what should be done.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All command numbers are shared between all engines, even if some don't
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * make sense to some engines.  In such a case, they do nothing but return
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. */
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_SET_LOGSTREAM		1
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_SET_PASSWORD_CALLBACK	2
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_HUP				3 /* Close and reinitialise any
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						     handles/connections etc. */
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_SET_USER_INTERFACE          4 /* Alternative to callback */
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_SET_CALLBACK_DATA           5 /* User-specific data, used
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						     when calling the password
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						     callback and the user
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						     interface */
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_LOAD_CONFIGURATION		6 /* Load a configuration, given
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						     a string that represents a
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						     file name or so */
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_LOAD_SECTION		7 /* Load data from a given
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						     section in the already loaded
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						     configuration */
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These control commands allow an application to deal with an arbitrary engine
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in a dynamic way. Warn: Negative return values indicate errors FOR THESE
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * COMMANDS because zero is used to indicate 'end-of-list'. Other commands,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * including ENGINE-specific command types, return zero for an error.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * An ENGINE can choose to implement these ctrl functions, and can internally
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * manage things however it chooses - it does so by setting the
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ENGINE_FLAGS_MANUAL_CMD_CTRL flag (using ENGINE_set_flags()). Otherwise the
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ENGINE_ctrl() code handles this on the ENGINE's behalf using the cmd_defns
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * data (set using ENGINE_set_cmd_defns()). This means an ENGINE's ctrl()
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * handler need only implement its own commands - the above "meta" commands will
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be taken care of. */
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Returns non-zero if the supplied ENGINE has a ctrl() handler. If "not", then
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * all the remaining control commands will return failure, so it is worth
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * checking this first if the caller is trying to "discover" the engine's
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * capabilities and doesn't want errors generated unnecessarily. */
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_HAS_CTRL_FUNCTION		10
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Returns a positive command number for the first command supported by the
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * engine. Returns zero if no ctrl commands are supported. */
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_GET_FIRST_CMD_TYPE		11
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The 'long' argument specifies a command implemented by the engine, and the
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * return value is the next command supported, or zero if there are no more. */
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_GET_NEXT_CMD_TYPE		12
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The 'void*' argument is a command name (cast from 'const char *'), and the
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * return value is the command that corresponds to it. */
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_GET_CMD_FROM_NAME		13
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The next two allow a command to be converted into its corresponding string
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * form. In each case, the 'long' argument supplies the command. In the NAME_LEN
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * case, the return value is the length of the command name (not counting a
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trailing EOL). In the NAME case, the 'void*' argument must be a string buffer
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * large enough, and it will be populated with the name of the command (WITH a
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trailing EOL). */
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_GET_NAME_LEN_FROM_CMD	14
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_GET_NAME_FROM_CMD		15
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The next two are similar but give a "short description" of a command. */
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_GET_DESC_LEN_FROM_CMD	16
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_GET_DESC_FROM_CMD		17
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* With this command, the return value is the OR'd combination of
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ENGINE_CMD_FLAG_*** values that indicate what kind of input a given
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * engine-specific ctrl command expects. */
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_GET_CMD_FLAGS		18
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ENGINE implementations should start the numbering of their own control
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * commands from this value. (ie. ENGINE_CMD_BASE, ENGINE_CMD_BASE + 1, etc). */
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CMD_BASE				200
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* NB: These 2 nCipher "chil" control commands are deprecated, and their
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * functionality is now available through ENGINE-specific control commands
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (exposed through the above-mentioned 'CMD'-handling). Code using these 2
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * commands should be migrated to the more general command handling before these
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are removed. */
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* Flags specific to the nCipher "chil" engine */
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENGINE_CTRL_CHIL_SET_FORKCHECK		100
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Depending on the value of the (long)i argument, this sets or
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 * unsets the SimpleForkCheck flag in the CHIL API to enable or
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 * disable checking and workarounds for applications that fork().
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 */
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ENGINE_CTRL_CHIL_NO_LOCKING		101
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	/* This prevents the initialisation function from providing mutex
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 * callbacks to the nCipher library. */
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* If an ENGINE supports its own specific control commands and wishes the
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * framework to handle the above 'ENGINE_CMD_***'-manipulation commands on its
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * behalf, it should supply a null-terminated array of ENGINE_CMD_DEFN entries
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * to ENGINE_set_cmd_defns(). It should also implement a ctrl() handler that
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * supports the stated commands (ie. the "cmd_num" entries as described by the
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * array). NB: The array must be ordered in increasing order of cmd_num.
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * "null-terminated" means that the last ENGINE_CMD_DEFN element has cmd_num set
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * to zero and/or cmd_name set to NULL. */
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef struct ENGINE_CMD_DEFN_st
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	{
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	unsigned int cmd_num; /* The command number */
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	const char *cmd_name; /* The command name itself */
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	const char *cmd_desc; /* A short description of the command */
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	unsigned int cmd_flags; /* The input the command expects */
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} ENGINE_CMD_DEFN;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Generic function pointer */
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*ENGINE_GEN_FUNC_PTR)(void);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Generic function pointer taking no arguments */
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*ENGINE_GEN_INT_FUNC_PTR)(ENGINE *);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Specific control function pointer */
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*ENGINE_CTRL_FUNC_PTR)(ENGINE *, int, long, void *, void (*f)(void));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Generic load_key function pointer */
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef EVP_PKEY * (*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	UI_METHOD *ui_method, void *callback_data);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*ENGINE_SSL_CLIENT_CERT_PTR)(ENGINE *, SSL *ssl,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	STACK_OF(X509_NAME) *ca_dn, X509 **pcert, EVP_PKEY **pkey,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	STACK_OF(X509) **pother, UI_METHOD *ui_method, void *callback_data);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These callback types are for an ENGINE's handler for cipher and digest logic.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * These handlers have these prototypes;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   int foo(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   int foo(ENGINE *e, const EVP_MD **digest, const int **nids, int nid);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Looking at how to implement these handlers in the case of cipher support, if
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the framework wants the EVP_CIPHER for 'nid', it will call;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   foo(e, &p_evp_cipher, NULL, nid);    (return zero for failure)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the framework wants a list of supported 'nid's, it will call;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   foo(e, NULL, &p_nids, 0); (returns number of 'nids' or -1 for error)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Returns to a pointer to the array of supported cipher 'nid's. If the second
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parameter is non-NULL it is set to the size of the returned array. */
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*ENGINE_CIPHERS_PTR)(ENGINE *, const EVP_CIPHER **, const int **, int);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*ENGINE_DIGESTS_PTR)(ENGINE *, const EVP_MD **, const int **, int);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*ENGINE_PKEY_METHS_PTR)(ENGINE *, EVP_PKEY_METHOD **, const int **, int);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*ENGINE_PKEY_ASN1_METHS_PTR)(ENGINE *, EVP_PKEY_ASN1_METHOD **, const int **, int);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* STRUCTURE functions ... all of these functions deal with pointers to ENGINE
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * structures where the pointers have a "structural reference". This means that
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * their reference is to allowed access to the structure but it does not imply
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that the structure is functional. To simply increment or decrement the
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * structural reference count, use ENGINE_by_id and ENGINE_free. NB: This is not
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * required when iterating using ENGINE_get_next as it will automatically
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * decrement the structural reference count of the "current" ENGINE and
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * increment the structural reference count of the ENGINE it returns (unless it
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is NULL). */
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Get the first/last "ENGINE" type available. */
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE *ENGINE_get_first(void);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE *ENGINE_get_last(void);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Iterate to the next/previous "ENGINE" type (NULL = end of the list). */
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE *ENGINE_get_next(ENGINE *e);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE *ENGINE_get_prev(ENGINE *e);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Add another "ENGINE" type into the array. */
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_add(ENGINE *e);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Remove an existing "ENGINE" type from the array. */
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ENGINE_remove(ENGINE *e);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Retrieve an engine from the list by its unique "id" value. */
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE *ENGINE_by_id(const char *id);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Add all the built-in engines. */
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_openssl(void);
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ENGINE_load_dynamic(void);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef OPENSSL_NO_STATIC_ENGINE
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_4758cca(void);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_aep(void);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_atalla(void);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_chil(void);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_cswift(void);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_nuron(void);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_sureware(void);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_ubsec(void);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_padlock(void);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_capi(void);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef OPENSSL_NO_GMP
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_gmp(void);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef OPENSSL_NO_GOST
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_gost(void);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_cryptodev(void);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_rsax(void);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_rdrand(void);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_load_builtin_engines(void);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Get and set global flags (ENGINE_TABLE_FLAG_***) for the implementation
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "registry" handling. */
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciunsigned int ENGINE_get_table_flags(void);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_set_table_flags(unsigned int flags);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Manage registration of ENGINEs per "table". For each type, there are 3
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * functions;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   ENGINE_register_***(e) - registers the implementation from 'e' (if it has one)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   ENGINE_unregister_***(e) - unregister the implementation from 'e'
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   ENGINE_register_all_***() - call ENGINE_register_***() for each 'e' in the list
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup is automatically registered from each table when required, so
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ENGINE_cleanup() will reverse any "register" operations. */
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_register_RSA(ENGINE *e);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_unregister_RSA(ENGINE *e);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_register_all_RSA(void);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_register_DSA(ENGINE *e);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_unregister_DSA(ENGINE *e);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_register_all_DSA(void);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_register_ECDH(ENGINE *e);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_unregister_ECDH(ENGINE *e);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_register_all_ECDH(void);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_register_ECDSA(ENGINE *e);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_unregister_ECDSA(ENGINE *e);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_register_all_ECDSA(void);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochint ENGINE_register_DH(ENGINE *e);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_unregister_DH(ENGINE *e);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_register_all_DH(void);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_register_RAND(ENGINE *e);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_unregister_RAND(ENGINE *e);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_register_all_RAND(void);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_register_STORE(ENGINE *e);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_unregister_STORE(ENGINE *e);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_register_all_STORE(void);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_register_ciphers(ENGINE *e);
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ENGINE_unregister_ciphers(ENGINE *e);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_register_all_ciphers(void);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_register_digests(ENGINE *e);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_unregister_digests(ENGINE *e);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_register_all_digests(void);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_register_pkey_meths(ENGINE *e);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_unregister_pkey_meths(ENGINE *e);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_register_all_pkey_meths(void);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_register_pkey_asn1_meths(ENGINE *e);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_unregister_pkey_asn1_meths(ENGINE *e);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_register_all_pkey_asn1_meths(void);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These functions register all support from the above categories. Note, use of
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * these functions can result in static linkage of code your application may not
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * need. If you only need a subset of functionality, consider using more
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * selective initialisation. */
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_register_complete(ENGINE *e);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_register_all_complete(void);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Send parametrised control commands to the engine. The possibilities to send
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * down an integer, a pointer to data or a function pointer are provided. Any of
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the parameters may or may not be NULL, depending on the command number. In
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * actuality, this function only requires a structural (rather than functional)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * reference to an engine, but many control commands may require the engine be
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * functional. The caller should be aware of trying commands that require an
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * operational ENGINE, and only use functional references in such situations. */
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function tests if an ENGINE-specific command is usable as a "setting".
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Eg. in an application's config file that gets processed through
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ENGINE_ctrl_cmd_string(). If this returns zero, it is not available to
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * ENGINE_ctrl_cmd_string(), only ENGINE_ctrl(). */
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_cmd_is_executable(ENGINE *e, int cmd);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function works like ENGINE_ctrl() with the exception of taking a
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * command name instead of a command number, and can handle optional commands.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See the comment on ENGINE_ctrl_cmd_string() for an explanation on how to
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * use the cmd_name and cmd_optional. */
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_ctrl_cmd(ENGINE *e, const char *cmd_name,
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        long i, void *p, void (*f)(void), int cmd_optional);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function passes a command-name and argument to an ENGINE. The cmd_name
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is converted to a command number and the control command is called using
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 'arg' as an argument (unless the ENGINE doesn't support such a command, in
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * which case no control command is called). The command is checked for input
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * flags, and if necessary the argument will be converted to a numeric value. If
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * cmd_optional is non-zero, then if the ENGINE doesn't support the given
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * cmd_name the return value will be success anyway. This function is intended
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for applications to use so that users (or config files) can supply
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * engine-specific config data to the ENGINE at run-time to control behaviour of
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * specific engines. As such, it shouldn't be used for calling ENGINE_ctrl()
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * functions that return data, deal with binary data, or that are otherwise
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * supposed to be used directly through ENGINE_ctrl() in application code. Any
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "return" data from an ENGINE_ctrl() operation in this function will be lost -
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * the return value is interpreted as failure if the return value is zero,
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * success otherwise, and this function returns a boolean value as a result. In
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * other words, vendors of 'ENGINE'-enabled devices should write ENGINE
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * implementations with parameterisations that work in this scheme, so that
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * compliant ENGINE-based applications can work consistently with the same
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * configuration for the same ENGINE-enabled devices, across applications. */
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_ctrl_cmd_string(ENGINE *e, const char *cmd_name, const char *arg,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				int cmd_optional);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These functions are useful for manufacturing new ENGINE structures. They
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * don't address reference counting at all - one uses them to populate an ENGINE
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * structure with personalised implementations of things prior to using it
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * directly or adding it to the builtin ENGINE list in OpenSSL. These are also
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * here so that the ENGINE structure doesn't have to be exposed and break binary
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * compatibility! */
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE *ENGINE_new(void);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_free(ENGINE *e);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_up_ref(ENGINE *e);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_id(ENGINE *e, const char *id);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_name(ENGINE *e, const char *name);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_RSA(ENGINE *e, const RSA_METHOD *rsa_meth);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_DSA(ENGINE *e, const DSA_METHOD *dsa_meth);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_ECDH(ENGINE *e, const ECDH_METHOD *ecdh_meth);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_ECDSA(ENGINE *e, const ECDSA_METHOD *ecdsa_meth);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_DH(ENGINE *e, const DH_METHOD *dh_meth);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth);
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ENGINE_set_STORE(ENGINE *e, const STORE_METHOD *store_meth);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_load_privkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpriv_f);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_load_ssl_client_cert_function(ENGINE *e,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				ENGINE_SSL_CLIENT_CERT_PTR loadssl_f);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_pkey_meths(ENGINE *e, ENGINE_PKEY_METHS_PTR f);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_pkey_asn1_meths(ENGINE *e, ENGINE_PKEY_ASN1_METHS_PTR f);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_flags(ENGINE *e, int flags);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_cmd_defns(ENGINE *e, const ENGINE_CMD_DEFN *defns);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These functions allow control over any per-structure ENGINE data. */
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_ex_data(ENGINE *e, int idx, void *arg);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *ENGINE_get_ex_data(const ENGINE *e, int idx);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function cleans up anything that needs it. Eg. the ENGINE_add() function
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * automatically ensures the list cleanup function is registered to be called
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from ENGINE_cleanup(). Similarly, all ENGINE_register_*** functions ensure
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ENGINE_cleanup() will clean up after them. */
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_cleanup(void);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These return values from within the ENGINE structure. These can be useful
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * with functional references as well as structural references - it depends
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * which you obtained. Using the result for functional purposes if you only
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * obtained a structural reference may be problematic! */
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *ENGINE_get_id(const ENGINE *e);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *ENGINE_get_name(const ENGINE *e);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const RSA_METHOD *ENGINE_get_RSA(const ENGINE *e);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const DSA_METHOD *ENGINE_get_DSA(const ENGINE *e);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ECDH_METHOD *ENGINE_get_ECDH(const ENGINE *e);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ECDSA_METHOD *ENGINE_get_ECDSA(const ENGINE *e);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const DH_METHOD *ENGINE_get_DH(const ENGINE *e);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const RAND_METHOD *ENGINE_get_RAND(const ENGINE *e);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const STORE_METHOD *ENGINE_get_STORE(const ENGINE *e);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE_GEN_INT_FUNC_PTR ENGINE_get_destroy_function(const ENGINE *e);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(const ENGINE *e);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(const ENGINE *e);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const ENGINE *e);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e);
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const ENGINE *e);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE_CIPHERS_PTR ENGINE_get_ciphers(const ENGINE *e);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE_DIGESTS_PTR ENGINE_get_digests(const ENGINE *e);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE_PKEY_METHS_PTR ENGINE_get_pkey_meths(const ENGINE *e);
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciENGINE_PKEY_ASN1_METHS_PTR ENGINE_get_pkey_asn1_meths(const ENGINE *e);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const EVP_CIPHER *ENGINE_get_cipher(ENGINE *e, int nid);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const EVP_MD *ENGINE_get_digest(ENGINE *e, int nid);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const EVP_PKEY_METHOD *ENGINE_get_pkey_meth(ENGINE *e, int nid);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth(ENGINE *e, int nid);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth_str(ENGINE *e,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					const char *str, int len);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const EVP_PKEY_ASN1_METHOD *ENGINE_pkey_asn1_find_str(ENGINE **pe,
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					const char *str, int len);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ENGINE_CMD_DEFN *ENGINE_get_cmd_defns(const ENGINE *e);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_get_flags(const ENGINE *e);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* FUNCTIONAL functions. These functions deal with ENGINE structures
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that have (or will) be initialised for use. Broadly speaking, the
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * structural functions are useful for iterating the list of available
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * engine types, creating new engine types, and other "list" operations.
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * These functions actually deal with ENGINEs that are to be used. As
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * such these functions can fail (if applicable) when particular
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * engines are unavailable - eg. if a hardware accelerator is not
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * attached or not functioning correctly. Each ENGINE has 2 reference
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * counts; structural and functional. Every time a functional reference
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is obtained or released, a corresponding structural reference is
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * automatically obtained or released too. */
55623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
55723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)/* Initialise a engine type for use (or up its reference count if it's
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * already in use). This will fail if the engine is not currently
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * operational and cannot initialise. */
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_init(ENGINE *e);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Free a functional reference to a engine type. This does not require
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a corresponding call to ENGINE_free as it also releases a structural
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * reference. */
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_finish(ENGINE *e);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The following functions handle keys that are stored in some secondary
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * location, handled by the engine.  The storage may be on a card or
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * whatever. */
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id,
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	UI_METHOD *ui_method, void *callback_data);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id,
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	UI_METHOD *ui_method, void *callback_data);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	STACK_OF(X509_NAME) *ca_dn, X509 **pcert, EVP_PKEY **ppkey,
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	STACK_OF(X509) **pother,
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	UI_METHOD *ui_method, void *callback_data);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This returns a pointer for the current ENGINE structure that
5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * is (by default) performing any RSA operations. The value returned
5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * is an incremented reference, so it should be free'd (ENGINE_finish)
5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * before it is discarded. */
5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciENGINE *ENGINE_get_default_RSA(void);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Same for the other "methods" */
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE *ENGINE_get_default_DSA(void);
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE *ENGINE_get_default_ECDH(void);
5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ENGINE *ENGINE_get_default_ECDSA(void);
5875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ENGINE *ENGINE_get_default_DH(void);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE *ENGINE_get_default_RAND(void);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These functions can be used to get a functional reference to perform
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ciphering or digesting corresponding to "nid". */
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE *ENGINE_get_cipher_engine(int nid);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE *ENGINE_get_digest_engine(int nid);
5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciENGINE *ENGINE_get_pkey_meth_engine(int nid);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ENGINE *ENGINE_get_pkey_asn1_meth_engine(int nid);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/* This sets a new default ENGINE structure for performing RSA
5975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * operations. If the result is non-zero (success) then the ENGINE
5985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * structure will have had its reference count up'd so the caller
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * should still free their own reference 'e'. */
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_default_RSA(ENGINE *e);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_default_string(ENGINE *e, const char *def_list);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Same for the other "methods" */
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_default_DSA(ENGINE *e);
6045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int ENGINE_set_default_ECDH(ENGINE *e);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_default_ECDSA(ENGINE *e);
6065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int ENGINE_set_default_DH(ENGINE *e);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_default_RAND(ENGINE *e);
6085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int ENGINE_set_default_ciphers(ENGINE *e);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_default_digests(ENGINE *e);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_default_pkey_meths(ENGINE *e);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_default_pkey_asn1_meths(ENGINE *e);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The combination "set" - the flags are bitwise "OR"d from the
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ENGINE_METHOD_*** defines above. As with the "ENGINE_register_complete()"
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function, this function can result in unnecessary static linkage. If your
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * application requires only specific functionality, consider using more
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * selective functions. */
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ENGINE_set_default(ENGINE *e, unsigned int flags);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ENGINE_add_conf_module(void);
6215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Deprecated functions ... */
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* int ENGINE_clear_defaults(void); */
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**************************/
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* DYNAMIC ENGINE SUPPORT */
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**************************/
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Binary/behaviour compatibility levels */
630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define OSSL_DYNAMIC_VERSION		(unsigned long)0x00020000
631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/* Binary versions older than this are too old for us (whether we're a loader or
632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * a loadee) */
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define OSSL_DYNAMIC_OLDEST		(unsigned long)0x00020000
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* When compiling an ENGINE entirely as an external shared library, loadable by
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the "dynamic" ENGINE, these types are needed. The 'dynamic_fns' structure
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * type provides the calling application's (or library's) error functionality
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and memory management function pointers to the loaded library. These should
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be used/set in the loaded library code so that the loading application's
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 'state' will be used/changed in all operations. The 'static_state' pointer
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * allows the loaded library to know if it shares the same static data as the
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * calling application (or library), and thus whether these callbacks need to be
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * set or not. */
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef void *(*dyn_MEM_malloc_cb)(size_t);
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef void *(*dyn_MEM_realloc_cb)(void *, size_t);
64623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)typedef void (*dyn_MEM_free_cb)(void *);
64723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)typedef struct st_dynamic_MEM_fns {
64823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)	dyn_MEM_malloc_cb			malloc_cb;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dyn_MEM_realloc_cb			realloc_cb;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dyn_MEM_free_cb				free_cb;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} dynamic_MEM_fns;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* FIXME: Perhaps the memory and locking code (crypto.h) should declare and use
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * these types so we (and any other dependant code) can simplify a bit?? */
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*dyn_lock_locking_cb)(int,int,const char *,int);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*dyn_lock_add_lock_cb)(int*,int,int,const char *,int);
6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef struct CRYPTO_dynlock_value *(*dyn_dynlock_create_cb)(
6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci						const char *,int);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*dyn_dynlock_lock_cb)(int,struct CRYPTO_dynlock_value *,
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						const char *,int);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*dyn_dynlock_destroy_cb)(struct CRYPTO_dynlock_value *,
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						const char *,int);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct st_dynamic_LOCK_fns {
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dyn_lock_locking_cb			lock_locking_cb;
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dyn_lock_add_lock_cb			lock_add_lock_cb;
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dyn_dynlock_create_cb			dynlock_create_cb;
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dyn_dynlock_lock_cb			dynlock_lock_cb;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dyn_dynlock_destroy_cb			dynlock_destroy_cb;
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} dynamic_LOCK_fns;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The top-level structure */
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct st_dynamic_fns {
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	void 					*static_state;
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const ERR_FNS				*err_fns;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const CRYPTO_EX_DATA_IMPL		*ex_data_fns;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dynamic_MEM_fns				mem_fns;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dynamic_LOCK_fns			lock_fns;
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} dynamic_fns;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The version checking function should be of this prototype. NB: The
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ossl_version value passed in is the OSSL_DYNAMIC_VERSION of the loading code.
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If this function returns zero, it indicates a (potential) version
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * incompatibility and the loaded library doesn't believe it can proceed.
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Otherwise, the returned value is the (latest) version supported by the
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * loading library. The loader may still decide that the loaded code's version
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is unsatisfactory and could veto the load. The function is expected to
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be implemented with the symbol name "v_check", and a default implementation
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * can be fully instantiated with IMPLEMENT_DYNAMIC_CHECK_FN(). */
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned long (*dynamic_v_check_fn)(unsigned long ossl_version);
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IMPLEMENT_DYNAMIC_CHECK_FN() \
689	OPENSSL_EXPORT unsigned long v_check(unsigned long v); \
690	OPENSSL_EXPORT unsigned long v_check(unsigned long v) { \
691		if(v >= OSSL_DYNAMIC_OLDEST) return OSSL_DYNAMIC_VERSION; \
692		return 0; }
693
694/* This function is passed the ENGINE structure to initialise with its own
695 * function and command settings. It should not adjust the structural or
696 * functional reference counts. If this function returns zero, (a) the load will
697 * be aborted, (b) the previous ENGINE state will be memcpy'd back onto the
698 * structure, and (c) the shared library will be unloaded. So implementations
699 * should do their own internal cleanup in failure circumstances otherwise they
700 * could leak. The 'id' parameter, if non-NULL, represents the ENGINE id that
701 * the loader is looking for. If this is NULL, the shared library can choose to
702 * return failure or to initialise a 'default' ENGINE. If non-NULL, the shared
703 * library must initialise only an ENGINE matching the passed 'id'. The function
704 * is expected to be implemented with the symbol name "bind_engine". A standard
705 * implementation can be instantiated with IMPLEMENT_DYNAMIC_BIND_FN(fn) where
706 * the parameter 'fn' is a callback function that populates the ENGINE structure
707 * and returns an int value (zero for failure). 'fn' should have prototype;
708 *    [static] int fn(ENGINE *e, const char *id); */
709typedef int (*dynamic_bind_engine)(ENGINE *e, const char *id,
710				const dynamic_fns *fns);
711#define IMPLEMENT_DYNAMIC_BIND_FN(fn) \
712	OPENSSL_EXPORT \
713	int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns); \
714	OPENSSL_EXPORT \
715	int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns) { \
716		if(ENGINE_get_static_state() == fns->static_state) goto skip_cbs; \
717		if(!CRYPTO_set_mem_functions(fns->mem_fns.malloc_cb, \
718			fns->mem_fns.realloc_cb, fns->mem_fns.free_cb)) \
719			return 0; \
720		CRYPTO_set_locking_callback(fns->lock_fns.lock_locking_cb); \
721		CRYPTO_set_add_lock_callback(fns->lock_fns.lock_add_lock_cb); \
722		CRYPTO_set_dynlock_create_callback(fns->lock_fns.dynlock_create_cb); \
723		CRYPTO_set_dynlock_lock_callback(fns->lock_fns.dynlock_lock_cb); \
724		CRYPTO_set_dynlock_destroy_callback(fns->lock_fns.dynlock_destroy_cb); \
725		if(!CRYPTO_set_ex_data_implementation(fns->ex_data_fns)) \
726			return 0; \
727		if(!ERR_set_implementation(fns->err_fns)) return 0; \
728	skip_cbs: \
729		if(!fn(e,id)) return 0; \
730		return 1; }
731
732/* If the loading application (or library) and the loaded ENGINE library share
733 * the same static data (eg. they're both dynamically linked to the same
734 * libcrypto.so) we need a way to avoid trying to set system callbacks - this
735 * would fail, and for the same reason that it's unnecessary to try. If the
736 * loaded ENGINE has (or gets from through the loader) its own copy of the
737 * libcrypto static data, we will need to set the callbacks. The easiest way to
738 * detect this is to have a function that returns a pointer to some static data
739 * and let the loading application and loaded ENGINE compare their respective
740 * values. */
741void *ENGINE_get_static_state(void);
742
743#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV)
744void ENGINE_setup_bsd_cryptodev(void);
745#endif
746
747/* BEGIN ERROR CODES */
748/* The following lines are auto generated by the script mkerr.pl. Any changes
749 * made after this point may be overwritten when the script is next run.
750 */
751void ERR_load_ENGINE_strings(void);
752
753/* Error codes for the ENGINE functions. */
754
755/* Function codes. */
756#define ENGINE_F_DYNAMIC_CTRL				 180
757#define ENGINE_F_DYNAMIC_GET_DATA_CTX			 181
758#define ENGINE_F_DYNAMIC_LOAD				 182
759#define ENGINE_F_DYNAMIC_SET_DATA_CTX			 183
760#define ENGINE_F_ENGINE_ADD				 105
761#define ENGINE_F_ENGINE_BY_ID				 106
762#define ENGINE_F_ENGINE_CMD_IS_EXECUTABLE		 170
763#define ENGINE_F_ENGINE_CTRL				 142
764#define ENGINE_F_ENGINE_CTRL_CMD			 178
765#define ENGINE_F_ENGINE_CTRL_CMD_STRING			 171
766#define ENGINE_F_ENGINE_FINISH				 107
767#define ENGINE_F_ENGINE_FREE_UTIL			 108
768#define ENGINE_F_ENGINE_GET_CIPHER			 185
769#define ENGINE_F_ENGINE_GET_DEFAULT_TYPE		 177
770#define ENGINE_F_ENGINE_GET_DIGEST			 186
771#define ENGINE_F_ENGINE_GET_NEXT			 115
772#define ENGINE_F_ENGINE_GET_PKEY_ASN1_METH		 193
773#define ENGINE_F_ENGINE_GET_PKEY_METH			 192
774#define ENGINE_F_ENGINE_GET_PREV			 116
775#define ENGINE_F_ENGINE_INIT				 119
776#define ENGINE_F_ENGINE_LIST_ADD			 120
777#define ENGINE_F_ENGINE_LIST_REMOVE			 121
778#define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY		 150
779#define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY			 151
780#define ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT		 194
781#define ENGINE_F_ENGINE_NEW				 122
782#define ENGINE_F_ENGINE_REMOVE				 123
783#define ENGINE_F_ENGINE_SET_DEFAULT_STRING		 189
784#define ENGINE_F_ENGINE_SET_DEFAULT_TYPE		 126
785#define ENGINE_F_ENGINE_SET_ID				 129
786#define ENGINE_F_ENGINE_SET_NAME			 130
787#define ENGINE_F_ENGINE_TABLE_REGISTER			 184
788#define ENGINE_F_ENGINE_UNLOAD_KEY			 152
789#define ENGINE_F_ENGINE_UNLOCKED_FINISH			 191
790#define ENGINE_F_ENGINE_UP_REF				 190
791#define ENGINE_F_INT_CTRL_HELPER			 172
792#define ENGINE_F_INT_ENGINE_CONFIGURE			 188
793#define ENGINE_F_INT_ENGINE_MODULE_INIT			 187
794#define ENGINE_F_LOG_MESSAGE				 141
795
796/* Reason codes. */
797#define ENGINE_R_ALREADY_LOADED				 100
798#define ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER		 133
799#define ENGINE_R_CMD_NOT_EXECUTABLE			 134
800#define ENGINE_R_COMMAND_TAKES_INPUT			 135
801#define ENGINE_R_COMMAND_TAKES_NO_INPUT			 136
802#define ENGINE_R_CONFLICTING_ENGINE_ID			 103
803#define ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED		 119
804#define ENGINE_R_DH_NOT_IMPLEMENTED			 139
805#define ENGINE_R_DSA_NOT_IMPLEMENTED			 140
806#define ENGINE_R_DSO_FAILURE				 104
807#define ENGINE_R_DSO_NOT_FOUND				 132
808#define ENGINE_R_ENGINES_SECTION_ERROR			 148
809#define ENGINE_R_ENGINE_CONFIGURATION_ERROR		 102
810#define ENGINE_R_ENGINE_IS_NOT_IN_LIST			 105
811#define ENGINE_R_ENGINE_SECTION_ERROR			 149
812#define ENGINE_R_FAILED_LOADING_PRIVATE_KEY		 128
813#define ENGINE_R_FAILED_LOADING_PUBLIC_KEY		 129
814#define ENGINE_R_FINISH_FAILED				 106
815#define ENGINE_R_GET_HANDLE_FAILED			 107
816#define ENGINE_R_ID_OR_NAME_MISSING			 108
817#define ENGINE_R_INIT_FAILED				 109
818#define ENGINE_R_INTERNAL_LIST_ERROR			 110
819#define ENGINE_R_INVALID_ARGUMENT			 143
820#define ENGINE_R_INVALID_CMD_NAME			 137
821#define ENGINE_R_INVALID_CMD_NUMBER			 138
822#define ENGINE_R_INVALID_INIT_VALUE			 151
823#define ENGINE_R_INVALID_STRING				 150
824#define ENGINE_R_NOT_INITIALISED			 117
825#define ENGINE_R_NOT_LOADED				 112
826#define ENGINE_R_NO_CONTROL_FUNCTION			 120
827#define ENGINE_R_NO_INDEX				 144
828#define ENGINE_R_NO_LOAD_FUNCTION			 125
829#define ENGINE_R_NO_REFERENCE				 130
830#define ENGINE_R_NO_SUCH_ENGINE				 116
831#define ENGINE_R_NO_UNLOAD_FUNCTION			 126
832#define ENGINE_R_PROVIDE_PARAMETERS			 113
833#define ENGINE_R_RSA_NOT_IMPLEMENTED			 141
834#define ENGINE_R_UNIMPLEMENTED_CIPHER			 146
835#define ENGINE_R_UNIMPLEMENTED_DIGEST			 147
836#define ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD	 101
837#define ENGINE_R_VERSION_INCOMPATIBILITY		 145
838
839#ifdef  __cplusplus
840}
841#endif
842#endif
843