apps.h 15.3 KB
Newer Older
1
/* apps/apps.h */
2
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 4 5 6 7
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
8
 *
9 10 11 12 13 14
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15
 *
16 17 18 19 20 21
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
22
 *
23 24 25 26 27 28 29 30 31 32 33 34 35 36
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
37
 * 4. If you include any Windows specific code (or a derivative thereof) from
38 39
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40
 *
41 42 43 44 45 46 47 48 49 50 51
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
52
 *
53 54 55 56 57
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */
58 59 60 61 62 63 64 65
/* ====================================================================
 * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
66
 *    notice, this list of conditions and the following disclaimer.
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */
111 112

#ifndef HEADER_APPS_H
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
# define HEADER_APPS_H

# include "e_os.h"

# include <openssl/bio.h>
# include <openssl/x509.h>
# include <openssl/lhash.h>
# include <openssl/conf.h>
# include <openssl/txt_db.h>
# ifndef OPENSSL_NO_ENGINE
#  include <openssl/engine.h>
# endif
# ifndef OPENSSL_NO_OCSP
#  include <openssl/ocsp.h>
# endif
# include <openssl/ossl_typ.h>
129

130 131
int app_RAND_load_file(const char *file, BIO *bio_e, int dont_warn);
int app_RAND_write_file(const char *file, BIO *bio_e);
132 133 134
/*
 * When `file' is NULL, use defaults. `bio_e' is for error messages.
 */
135 136 137 138 139 140
void app_RAND_allow_write_file(void);
long app_RAND_load_files(char *file); /* `file' is a list of files to read,
                                       * separated by LIST_SEPARATOR_CHAR
                                       * (see e_os.h).  The string is
                                       * destroyed! */

141
# ifndef MONOLITH
142

143
#  define MAIN(a,v)       main(a,v)
144

145 146 147 148
#  ifndef NON_MAIN
CONF *config = NULL;
BIO *bio_err = NULL;
#  else
149
extern CONF *config;
150
extern BIO *bio_err;
151
#  endif
152

153
# else
154

155
#  define MAIN(a,v)       PROG(a,v)
D
 
Dr. Stephen Henson 已提交
156
extern CONF *config;
157 158 159
extern char *default_config_file;
extern BIO *bio_err;

160
# endif
161

162 163 164
# ifndef OPENSSL_SYS_NETWARE
#  include <signal.h>
# endif
165

166 167 168 169 170
# ifdef SIGPIPE
#  define do_pipe_sig()   signal(SIGPIPE,SIG_IGN)
# else
#  define do_pipe_sig()
# endif
171

172 173 174 175 176
# ifdef OPENSSL_NO_COMP
#  define zlib_cleanup()
# else
#  define zlib_cleanup() COMP_zlib_cleanup()
# endif
D
Dr. Stephen Henson 已提交
177

178
# if defined(MONOLITH) && !defined(OPENSSL_C)
179
#  define apps_startup() \
180
                do_pipe_sig()
181
#  define apps_shutdown()
182
# else
183
#  ifndef OPENSSL_NO_ENGINE
184 185 186 187 188 189 190 191 192 193
#   define apps_startup() \
                        do { do_pipe_sig(); CRYPTO_malloc_init(); \
                        ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); \
                        ENGINE_load_builtin_engines(); setup_ui_method(); } while(0)
#   define apps_shutdown() \
                        do { CONF_modules_unload(1); destroy_ui_method(); \
                        OBJ_cleanup(); EVP_cleanup(); ENGINE_cleanup(); \
                        CRYPTO_cleanup_all_ex_data(); ERR_remove_thread_state(NULL); \
                        RAND_cleanup(); \
                        ERR_free_strings(); zlib_cleanup();} while(0)
194
#  else
195 196 197 198 199 200 201 202 203 204
#   define apps_startup() \
                        do { do_pipe_sig(); CRYPTO_malloc_init(); \
                        ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); \
                        setup_ui_method(); } while(0)
#   define apps_shutdown() \
                        do { CONF_modules_unload(1); destroy_ui_method(); \
                        OBJ_cleanup(); EVP_cleanup(); \
                        CRYPTO_cleanup_all_ex_data(); ERR_remove_thread_state(NULL); \
                        RAND_cleanup(); \
                        ERR_free_strings(); zlib_cleanup(); } while(0)
205
#  endif
206
# endif
207

208
# if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WINCE)
209
#  define openssl_fdset(a,b) FD_SET((unsigned int)a, b)
210
# else
211
#  define openssl_fdset(a,b) FD_SET(a, b)
212
# endif
213

214 215 216 217
typedef struct args_st {
    char **data;
    int count;
} ARGS;
218

219 220 221 222 223
# define PW_MIN_LENGTH 4
typedef struct pw_cb_data {
    const void *password;
    const char *prompt_info;
} PW_CB_DATA;
224

225
int password_callback(char *buf, int bufsiz, int verify, PW_CB_DATA *cb_data);
226

L
Lutz Jänicke 已提交
227 228
int setup_ui_method(void);
void destroy_ui_method(void);
229

230 231 232
int should_retry(int i);
int args_from_file(char *file, int *argc, char **argv[]);
int str2fmt(char *s);
233 234 235
void program_name(char *in, char *out, int size);
int chopup_args(ARGS *arg, char *buf, int *argc, char **argv[]);
# ifdef HEADER_X509_H
D
 
Dr. Stephen Henson 已提交
236
int dump_cert_text(BIO *out, X509 *x);
237 238 239
void print_name(BIO *out, const char *title, X509_NAME *nm,
                unsigned long lflags);
# endif
240
int set_cert_ex(unsigned long *flags, const char *arg);
D
 
Dr. Stephen Henson 已提交
241
int set_name_ex(unsigned long *flags, const char *arg);
242 243
int set_ext_copy(int *copy_type, const char *arg);
int copy_extensions(X509 *x, X509_REQ *req, int copy_type);
D
Dr. Stephen Henson 已提交
244
int app_passwd(BIO *err, char *arg1, char *arg2, char **pass1, char **pass2);
D
 
Dr. Stephen Henson 已提交
245
int add_oid_section(BIO *err, CONF *conf);
246
X509 *load_cert(BIO *err, const char *file, int format,
247
                const char *pass, ENGINE *e, const char *cert_descrip);
248
X509_CRL *load_crl(const char *infile, int format);
249
int load_cert_crl_http(const char *url, BIO *err,
250
                       X509 **pcert, X509_CRL **pcrl);
251
EVP_PKEY *load_key(BIO *err, const char *file, int format, int maybe_stdin,
252
                   const char *pass, ENGINE *e, const char *key_descrip);
253
EVP_PKEY *load_pubkey(BIO *err, const char *file, int format, int maybe_stdin,
254
                      const char *pass, ENGINE *e, const char *key_descrip);
255
STACK_OF(X509) *load_certs(BIO *err, const char *file, int format,
256 257
                           const char *pass, ENGINE *e,
                           const char *cert_descrip);
258
STACK_OF(X509_CRL) *load_crls(BIO *err, const char *file, int format,
259 260
                              const char *pass, ENGINE *e,
                              const char *cert_descrip);
D
 
Dr. Stephen Henson 已提交
261
X509_STORE *setup_verify(BIO *bp, char *CAfile, char *CApath);
262
# ifndef OPENSSL_NO_ENGINE
263
ENGINE *setup_engine(BIO *err, const char *engine, int debug);
264
# endif
265

266
# ifndef OPENSSL_NO_OCSP
267
OCSP_RESPONSE *process_responder(BIO *err, OCSP_REQUEST *req,
268 269 270 271 272
                                 const char *host, const char *path,
                                 const char *port, int use_ssl,
                                 const STACK_OF(CONF_VALUE) *headers,
                                 int req_timeout);
# endif
273

D
Dr. Stephen Henson 已提交
274
int load_config(BIO *err, CONF *cnf);
275
char *make_config_name(void);
D
Dr. Stephen Henson 已提交
276

D
 
Dr. Stephen Henson 已提交
277 278
/* Functions defined in ca.c and also used in ocsp.c */
int unpack_revinfo(ASN1_TIME **prevtm, int *preason, ASN1_OBJECT **phold,
279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300
                   ASN1_GENERALIZEDTIME **pinvtm, const char *str);

# define DB_type         0
# define DB_exp_date     1
# define DB_rev_date     2
# define DB_serial       3      /* index - unique */
# define DB_file         4
# define DB_name         5      /* index - unique when active and not
                                 * disabled */
# define DB_NUMBER       6

# define DB_TYPE_REV     'R'
# define DB_TYPE_EXP     'E'
# define DB_TYPE_VAL     'V'

typedef struct db_attr_st {
    int unique_subject;
} DB_ATTR;
typedef struct ca_db_st {
    DB_ATTR attributes;
    TXT_DB *db;
} CA_DB;
301 302

BIGNUM *load_serial(char *serialfile, int create, ASN1_INTEGER **retai);
303 304
int save_serial(char *serialfile, char *suffix, BIGNUM *serial,
                ASN1_INTEGER **retai);
305
int rotate_serial(char *serialfile, char *new_suffix, char *old_suffix);
306
int rand_serial(BIGNUM *b, ASN1_INTEGER *ai);
307 308
CA_DB *load_index(char *dbfile, DB_ATTR *dbattr);
int index_index(CA_DB *db);
N
Nils Larsch 已提交
309
int save_index(const char *dbfile, const char *suffix, CA_DB *db);
310 311
int rotate_index(const char *dbfile, const char *new_suffix,
                 const char *old_suffix);
312
void free_index(CA_DB *db);
313 314 315
# define index_name_cmp_noconst(a, b) \
        index_name_cmp((const OPENSSL_CSTRING *)CHECKED_PTR_OF(OPENSSL_STRING, a), \
        (const OPENSSL_CSTRING *)CHECKED_PTR_OF(OPENSSL_STRING, b))
D
Dr. Stephen Henson 已提交
316
int index_name_cmp(const OPENSSL_CSTRING *a, const OPENSSL_CSTRING *b);
N
Nils Larsch 已提交
317
int parse_yesno(const char *str, int def);
D
 
Dr. Stephen Henson 已提交
318

319
X509_NAME *parse_name(char *str, long chtype, int multirdn);
D
Dr. Stephen Henson 已提交
320
int args_verify(char ***pargs, int *pargc,
321
                int *badarg, BIO *err, X509_VERIFY_PARAM **pm);
D
Dr. Stephen Henson 已提交
322
void policies_print(BIO *out, X509_STORE_CTX *ctx);
323
int bio_to_mem(unsigned char **out, int maxlen, BIO *in);
324
int pkey_ctrl_string(EVP_PKEY_CTX *ctx, char *value);
325
int init_gen_str(BIO *err, EVP_PKEY_CTX **pctx,
326
                 const char *algname, ENGINE *e, int do_param);
327
int do_X509_sign(BIO *err, X509 *x, EVP_PKEY *pkey, const EVP_MD *md,
328
                 STACK_OF(OPENSSL_STRING) *sigopts);
329
int do_X509_REQ_sign(BIO *err, X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md,
330
                     STACK_OF(OPENSSL_STRING) *sigopts);
331
int do_X509_CRL_sign(BIO *err, X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md,
332 333
                     STACK_OF(OPENSSL_STRING) *sigopts);
# ifndef OPENSSL_NO_PSK
334
extern char *psk_key;
335 336
# endif
# ifndef OPENSSL_NO_JPAKE
B
Ben Laurie 已提交
337 338
void jpake_client_auth(BIO *out, BIO *conn, const char *secret);
void jpake_server_auth(BIO *out, BIO *conn, const char *secret);
339
# endif
D
 
Dr. Stephen Henson 已提交
340

341
# ifndef OPENSSL_NO_TLSEXT
342
unsigned char *next_protos_parse(unsigned short *outlen, const char *in);
343
# endif                         /* ndef OPENSSL_NO_TLSEXT */
344

345
void print_cert_checks(BIO *bio, X509 *x,
346 347
                       const char *checkhost,
                       const char *checkemail, const char *checkip);
348

349 350
void store_setup_crl_download(X509_STORE *st);

351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376
# define FORMAT_UNDEF    0
# define FORMAT_ASN1     1
# define FORMAT_TEXT     2
# define FORMAT_PEM      3
# define FORMAT_NETSCAPE 4
# define FORMAT_PKCS12   5
# define FORMAT_SMIME    6
# define FORMAT_ENGINE   7
# define FORMAT_IISSGC   8      /* XXX this stupid macro helps us to avoid
                                 * adding yet another param to load_*key() */
# define FORMAT_PEMRSA   9      /* PEM RSAPubicKey format */
# define FORMAT_ASN1RSA  10     /* DER RSAPubicKey format */
# define FORMAT_MSBLOB   11     /* MS Key blob format */
# define FORMAT_PVK      12     /* MS PVK file format */
# define FORMAT_HTTP     13     /* Download using HTTP */
# define FORMAT_NSS      14     /* NSS keylog format */

# define EXT_COPY_NONE   0
# define EXT_COPY_ADD    1
# define EXT_COPY_ALL    2

# define NETSCAPE_CERT_HDR       "certificate"

# define APP_PASS_LEN    1024

# define SERIAL_RAND_BITS        64
377

378
int app_isdir(const char *);
379 380
int raw_read_stdin(void *, int);
int raw_write_stdout(const void *, int);
381

382 383 384
# define TM_START        0
# define TM_STOP         1
double app_tminterval(int stop, int usertime);
B
Ben Laurie 已提交
385 386

#endif